Day36 - IIO Triggered Buffer (User-Space Controlled Data Flow)¶
Overview¶
This day introduces the IIO triggered buffer model, transforming the driver from:
into:
The key concept:
👉 User space controls data flow, not the driver
Architecture¶
Previous (Day34–35)¶
Day36 (Triggered Buffer)¶
Sensor → DRDY IRQ
↓
IRQ handler
↓
iio_trigger_poll()
↓
pollfunc (driver)
↓
iio_push_to_buffers()
↓
/dev/iio:deviceX
↓
User space
Key Components¶
1. Trigger¶
- Represents data-ready event source
-
Can be:
-
GPIO interrupt
- timer
- external trigger
Example:
2. Buffer¶
- Kernel-side FIFO (kfifo)
- Stores sample frames
- Exposed via:
3. Scan Elements¶
Define:
- which channels are included
- ordering in buffer frame
Example:
Important Design Principle¶
⚠️ User-space owns configuration¶
| Component | Controlled by |
|---|---|
| scan elements | user space |
| trigger binding | user space |
| buffer enable | user space |
| data read | user space |
👉 Driver must NOT enforce policy
Why driver cannot auto-enable buffer¶
Because:
- multiple devices may share trigger
- user decides sampling strategy
- kernel separates mechanism vs policy
User-Space Control Flow¶
Step 1 - Enable scan elements¶
echo 1 > scan_elements/in_voltage0_en
echo 1 > scan_elements/in_voltage1_en
echo 1 > scan_elements/in_voltage2_en
Step 2 - Bind trigger¶
Step 3 - Configure buffer¶
Step 4 - Enable buffer¶
Step 5 - Read data¶
Step 6 - Cleanup (IMPORTANT)¶
Sample Frame Layout¶
For this driver:
Total:
Data Format Example¶
Decoded:
| Channel | Value |
|---|---|
| ch0 | 0x02F0 (752) |
| ch1 | 0x0354 (852) |
| ch2 | 0x03B8 (952) |
Driver Responsibilities¶
Driver MUST:¶
- define channels
- implement read_raw()
- implement trigger handler
- push data into buffer
Driver MUST NOT:¶
- enable buffer
- bind trigger
- decide sampling policy
Trigger Handler Flow¶
Common Pitfalls¶
1. Missing scan_index¶
2. Buffer still enabled¶
Fix:
3. Trigger not detached¶
Fix:
4. IRQ works but no data¶
Check:
- trigger binding
- buffer enable
- scan elements
Comparison with Previous Days¶
| Feature | Day34 | Day35 | Day36 |
|---|---|---|---|
| sysfs read | ✔ | ✔ | ✔ |
| IRQ | ✖ | ✔ | ✔ |
| buffer | ✖ | ✖ | ✔ |
| streaming | ✖ | ✖ | ✔ |
| user control | low | medium | high |
Key Learning¶
1. Separation of concerns¶
- driver = data provider
- user space = data controller
2. Trigger decoupling¶
- sensor event ≠ data read
- trigger connects them
3. Buffer = streaming interface¶
- replaces repeated sysfs reads
- supports high-rate sampling
Next Step¶
Day37:
- timestamp channel
- variable scan mask support
- userspace parsing tool
- performance tuning