IIO가 버퍼를 다시 채울 수 없습니다. iio_readdev를 실행할 때 연결 시간 초과(110) 오류가 발생했습니다.

IIO가 버퍼를 다시 채울 수 없습니다. iio_readdev를 실행할 때 연결 시간 초과(110) 오류가 발생했습니다.

나는 Yocto를 사용하여 사용자 정의 Linux 이미지를 만들었습니다.CN0540및 DE10-나노. CN0540(아날로그 장치) 제조업체는 다음을 제공합니다.이미지 평가마더보드의 경우 잘 작동하지만 동일한 커널 분기(ADI 리눅스 브랜치), 내가 아는 한 동일한 defconfig(socfga_adi_defconfig) 및 동일한 장치 트리(CN0540 dts), 동일한 HDL이 FPGA에도 로드됩니다(CN0540 고밀도지단백질) CN0540(AD7768-1)에서는 ADC의 버퍼를 사용할 수 없습니다. libiio의 iio_info명령을 사용하거나 장치 파일을 사용하여 ADC에서 단일 값을 읽을 수 있지만 sys/bus/iio/devices/iio:device0/in_voltage0_raw장치 버퍼에서 예를 들어 iio_readdev ad7768-1return 을 읽 Unable to refill buffer: Connection timed out (110)거나 실행할 수는 없습니다.

> echo 1 > scan_elements/in_voltage0_en
> echo 1 > buffer/enable
> cat /dev/iio:device0 | hexdump

버퍼의 길이를 1로 설정하지 않으면 장치가 충돌하여 echo 1 > buffer/length장치에서 출력이 발생합니다.

[  441.310599] rcu: INFO: rcu_sched self-detected stall on CPU
[  441.316258] rcu:     0-....: (2099 ticks this GP) idle=10f/1/0x40000002 softirq=2509/2509 fqs=1033
[  441.325163]  (t=2100 jiffies g=497 q=7)
[  441.329057] NMI backtrace for cpu 0
[  441.332592] CPU: 0 PID: 163 Comm: cat Not tainted 5.15.0-yocto-standard-adi #1
[  441.339927] Hardware name: Altera SOCFPGA
[  441.343988] Backtrace:
[  441.346453] [<c0d914b0>] (dump_backtrace) from [<c0d916fc>] (show_stack+0x20/0x24)
[  441.354073]  r7:c010edfc r6:00000000 r5:60070193 r4:c143b218
[  441.359801] [<c0d916dc>] (show_stack) from [<c0d94ecc>] (dump_stack_lvl+0x48/0x54)
[  441.367360] [<c0d94e84>] (dump_stack_lvl) from [<c0d94ef0>] (dump_stack+0x18/0x1c)
[  441.374907]  r5:00000000 r4:20070193
[  441.378525] [<c0d94ed8>] (dump_stack) from [<c05850fc>] (nmi_cpu_backtrace+0xe0/0x114)
[  441.386424] [<c058501c>] (nmi_cpu_backtrace) from [<c0585218>] (nmi_trigger_cpumask_backtrace+0xe8/0x134)
[  441.395965]  r7:c010edfc r6:c0e01ee4 r5:c170469c r4:00000000
[  441.401597] [<c0585130>] (nmi_trigger_cpumask_backtrace) from [<c010fd68>] (arch_trigger_cpumask_backtrace+0x20/0x24)
[  441.412180]  r9:c1703f10 r8:c0e01ee0 r7:c1835438 r6:00000000 r5:c1703fa4 r4:c171e840
[  441.419886] [<c010fd48>] (arch_trigger_cpumask_backtrace) from [<c0d9340c>] (rcu_dump_cpu_stacks+0x144/0x174)
[  441.429922] [<c0d932c8>] (rcu_dump_cpu_stacks) from [<c0198490>] (rcu_sched_clock_irq+0x6a8/0xa58)
[  441.438860]  r10:2e138000 r9:c1702d00 r8:c1693f40 r7:c18361a0 r6:00000000 r5:ef7cbf40
[  441.446784]  r4:c171e840
[  441.449304] [<c0197de8>] (rcu_sched_clock_irq) from [<c01a354c>] (update_process_times+0x98/0xc4)
[  441.458174]  r10:c1702d80 r9:c1702d40 r8:c184fd40 r7:2e138000 r6:c1702d00 r5:00000000
[  441.465969]  r4:ef7c5540
[  441.468524] [<c01a34b4>] (update_process_times) from [<c01b74e0>] (tick_sched_timer+0x88/0x2d8)
[  441.477198]  r7:c1ea9dc0 r6:00000066 r5:bf87a4da r4:ef7c6128
[  441.482830] [<c01b7458>] (tick_sched_timer) from [<c01a4260>] (__hrtimer_run_queues+0x1fc/0x36c)
[  441.491730]  r10:ef7c5e14 r9:ef7c6128 r8:20070193 r7:00000000 r6:c01b7458 r5:ef7c5dc0
[  441.499645]  r4:ef7c5e00
[  441.502183] [<c01a4064>] (__hrtimer_run_queues) from [<c01a5158>] (hrtimer_interrupt+0x13c/0x2c8)
[  441.511041]  r10:ef7c5e98 r9:ef7c5e70 r8:ef7c5e48 r7:ef7c5dcc r6:00000003 r5:20070193
[  441.518836]  r4:ef7c5dc0
[  441.521357] [<c01a501c>] (hrtimer_interrupt) from [<c0110744>] (twd_handler+0x44/0x4c)
[  441.529394]  r10:c1ea8000 r9:c1ea9dc0 r8:f080210c r7:c1d08240 r6:00000018 r5:c17046b4
[  441.537301]  r4:00000001
[  441.539821] [<c0110700>] (twd_handler) from [<c01838c8>] (handle_percpu_devid_irq+0x9c/0x200)
[  441.548321]  r5:c17046b4 r4:c1d09000
[  441.551888] [<c018382c>] (handle_percpu_devid_irq) from [<c017ced4>] (handle_domain_irq+0x6c/0x88)
[  441.560961]  r7:0000001d r6:00000000 r5:00000000 r4:c1692a14
[  441.566593] [<c017ce68>] (handle_domain_irq) from [<c0101300>] (gic_handle_irq+0x88/0x9c)
[  441.574767]  r7:c1692a20 r6:f0802100 r5:c177a344 r4:c17046b4
[  441.580494] [<c0101278>] (gic_handle_irq) from [<c0100afc>] (__irq_svc+0x5c/0x78)
[  441.587952] Exception stack(0xc1ea9dc0 to 0xc1ea9e08)
[  441.593047] 9dc0: c28b3700 00000000 00000000 00000003 00001000 c28b3700 c2b47f40 befe9c04
[  441.601193] 9de0: c28b3774 befe9c04 c1ea8000 c1ea9e24 c1ea9e28 c1ea9e10 c0a95530 c0a949ac
[  441.609342] 9e00: 20070013 ffffffff
[  441.612863]  r9:c1ea8000 r8:c28b3774 r7:c1ea9df4 r6:ffffffff r5:20070013 r4:c0a949ac
[  441.620699] [<c0a949a0>] (iio_dma_buffer_dequeue) from [<c0a95530>] (iio_dma_buffer_read+0x148/0x19c)
[  441.629894]  r5:c28b3700 r4:00001000
[  441.633452] [<c0a953e8>] (iio_dma_buffer_read) from [<c0952618>] (iio_buffer_read+0x178/0x228)
[  441.642168]  r10:c1ea8000 r9:befe9c04 r8:00001000 r7:00000400 r6:00000002 r5:c1e43000
[  441.649962]  r4:c28b3700
[  441.652483] [<c09524a0>] (iio_buffer_read) from [<c0954b24>] (iio_buffer_read_wrapper+0x2c/0x38)
[  441.661248]  r10:00000003 r9:c0954af8 r8:00001000 r7:00000001 r6:c1ea8000 r5:c1ea9f60
[  441.669050]  r4:c2b28540
[  441.671571] [<c0954af8>] (iio_buffer_read_wrapper) from [<c02b2da8>] (vfs_read+0xc4/0x320)
[  441.679817] [<c02b2ce4>] (vfs_read) from [<c02b348c>] (ksys_read+0x74/0xec)
[  441.686766]  r10:00000003 r9:00000000 r8:00000000 r7:befe9c04 r6:c1ea8000 r5:c2b28540
[  441.694560]  r4:c2b28540
[  441.697081] [<c02b3418>] (ksys_read) from [<c02b351c>] (sys_read+0x18/0x1c)
[  441.704027]  r9:c1ea8000 r8:c0100244 r7:00000003 r6:b6f681a0 r5:befe9c04 r4:00001000
[  441.711733] [<c02b3504>] (sys_read) from [<c0100060>] (ret_fast_syscall+0x0/0x48)
[  441.719310] Exception stack(0xc1ea9fa8 to 0xc1ea9ff0)
[  441.724344] 9fa0:                   00001000 befe9c04 00000003 befe9c04 00001000 00000000
[  441.732488] 9fc0: 00001000 befe9c04 b6f681a0 00000003 00000000 01000000 00000003 befe9c04
[  441.740769] 9fe0: 00000003 befe9bb8 b6e6070f b6de1ae6

이 출력은 약 20초마다 반복됩니다.

장치는 버퍼가 준비되면 OS에 인터럽트를 보내도록 되어 있으므로 MCU로 장치의 DRDY 핀(인터럽트 핀)을 조사했는데 핀이 하이로 올라가지 않았습니다.

저도 사용하던 libiio 버전을 평가판 이미지와 같은 버전인 0.23에서 0.21로 바꿔봤는데 실행시 오류가 에서 0.23으로 iio_readdev ad7768-1바뀌더군요 .Unable to refill buffer: Connection timed out (110)

Unable to refill buffer: Connection timed out
ERROR: Error during buffer disable: No such file or directory

기능적으로는 동일한 버그라고 확신하므로 libiio 버전을 다시 0.23으로 변경했습니다.

문제를 찾기 위해 장치 드라이버와 libiio를 패치했고 iio_readdev ad7768-1libiio를 호출하는 문제 라인이 다음과 같은 것을 발견했습니다.이것 ret = poll(pollfd, 2, timeout_rel);, 장치 드라이버의 문제 기능은 다음과 같습니다.이것 hw_submit_block.

시간 초과 오류의 원인은 무엇입니까?

답변1

마침내 해결책을 찾았습니다.

U-boot는 일부 스위칭 파일을 생성해야 합니다.

$ python ./arch/arm/mach-socfpga/cv_bsp_generator/cv_bsp_generator.py \
          -i <path_to_qpds_handoff>/hps_isw_handoff/soc_system_hps_0 \
          -o board/altera/cyclone5-socdk/qts/

이에 대한 문서는 다음 위치에 있습니다./doc/README.soccpga문서.

관련 정보