/* * The first 5 bytes of data represent IR pulse or space. Each bit, starting * from highest bit in the first byte, represents 250µs of data. It is 1 * for space and 0 for pulse. * * The station sends 10 packets, and the 7th byte will be number 1 to 10, so * when we receive 10 we assume all the data has arrived.
*/ staticvoid imon_ir_data(struct imon *imon)
{ struct ir_raw_event rawir = {};
u64 data = be64_to_cpup(imon->ir_buf);
u8 packet_no = data & 0xff; int offset = 40; int bit;
if (packet_no == 0xff) return;
dev_dbg(imon->dev, "data: %8ph", imon->ir_buf);
/* * Only the first 5 bytes contain IR data. Right shift so we move * the IR bits to the lower 40 bits.
*/
data >>= 24;
do { /* * Find highest set bit which is less or equal to offset * * offset is the bit above (base 0) where we start looking. * * data & (BIT_ULL(offset) - 1) masks off any unwanted bits, * so we have just bits less than offset. * * fls will tell us the highest bit set plus 1 (or 0 if no * bits are set).
*/
rawir.pulse = !rawir.pulse;
bit = fls64(data & (BIT_ULL(offset) - 1)); if (bit < offset) {
dev_dbg(imon->dev, "%s: %d bits",
rawir.pulse ? "pulse" : "space", offset - bit);
rawir.duration = (offset - bit) * BIT_DURATION;
ir_raw_event_store_with_filter(imon->rcdev, &rawir);
switch (urb->status) { case 0:
imon_ir_data(imon); break; case -ECONNRESET: case -ENOENT: case -ESHUTDOWN:
usb_unlink_urb(urb); return; case -EPIPE: default:
dev_dbg(imon->dev, "error: urb status = %d", urb->status); break;
}
ret = usb_submit_urb(urb, GFP_ATOMIC); if (ret && ret != -ENODEV)
dev_warn(imon->dev, "failed to resubmit urb: %d", ret);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.