Re: IIO advise + help

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Mar 12, 2021 at 6:55 PM Michel Arruat <michel.arruat@xxxxxxx> wrote:
>
> Dear IIO Maintainers,
>
> I'm starting studying IIO framework in order to migrate our acquisition
> systems, based on fast ADC, to this framework.
> So far we are using our framework named ZIO which was developed more
> than 10 years ago, when IIO was not mature enough to handle high speed
> constraints, large DMA transfer(>256MB) and zero copy.
> Out of curiosity https://ohwr.org/project/zio
>
> The idea is to get rid of our local framework and move to IIO to benefit
> from the large Users community.
> For now, most of our drivers are running on x86_64 architecture, even if
> future applications will run on SoC (Zynq UltraScale+).
> I made a first prototype, widely inspired from your "ad_adc.c" driver

The ad_adc.c driver looks like it was pulled from the Analog Devices
Linux repo here:
https://github.com/analogdevicesinc/linux/blob/master/drivers/iio/adc/ad_adc.c

That driver [particularly] was not upstreamed.
But that driver is a [simplified] duplicate of the same FPGA ADC that ADI does:
https://github.com/analogdevicesinc/linux/blob/master/drivers/iio/adc/cf_axi_adc_core.c

An upstreamed variant was upstreamed in 5.7:
https://github.com/torvalds/linux/blob/master/drivers/iio/adc/adi-axi-adc.c
It should not be too difficult to backport it on a 4.18 kernel.

This driver however doesn't work standalone yet, though there was a
plan to make it standalone at some point.
It is meant to be a wrapper driver for this high-speed ADC:
https://github.com/torvalds/linux/blob/master/drivers/iio/adc/ad9467.c

This works reasonably well, but there is still some work required to
finish upstreaming some high-speed DMA stuff that are only present in
the ADI repo.
The upstream version will not be compatible with the one in the ADI
repo [unfortunately], though it may be similar.

So, I'd start with the adi-axi-adc.c driver, and maybe make a
standalone variant.
It mostly involves removing the adi_axi_adc_attach_client() and
putting registers where needed, extending read_raw/write_raw hooks and
other stuff.

> found on your git repo, with a 4.18 kernel. I am facing some issues
> including kernel Oops while unloading the module.
> Could you please let me know which minimal kernel version is required to
> use the "IIO DMA engine buffer" features. In addition, I would really

The oops looks like is happening on the remove() hook of the driver.
Looks like you are trying a rmmod that is failing.

Not to bash anyone [this is more of a fact], but a lot of non-upstream
drivers don't handle the remove/unload part of the driver too well.
Mostly because a driver gets loaded at boot time, and then the system
reboots completely.
But kmods can be a hassle during development.

So, maybe try the adi-axi-adc.c variant, or you could cleanup the
remove hook of the ad_adc.c driver.
Or if you want, you could also open a question here for ad_adc.c:
https://ez.analog.com/linux-software-drivers/f/q-a

> appreciate if you could point me to some reference IIO ADC driver
> implementation that handles similar DMA transfer size with good
> performances.

I don't know about good performances. Or how comparable it would be to ZIO.
But the ADI kernel repo has some high-speed/mmap IIO interface.
We're in the process of getting it upstreamed [somehow].
The ADI kernel implementation also has a userspace library that can be
used to interface with the kernel part:
https://github.com/analogdevicesinc/libiio
https://github.com/analogdevicesinc/libiio/blob/master/local.c#L51

>
> Thanks in advance for your answer.
> Best regards,
> Michel Arruat.
>
> Oops:
> [ 1110.718286] Oops: 0000 [#1] SMP PTI
> [ 1110.759964] CPU: 5 PID: 155923 Comm: rmmod Kdump: loaded Tainted: P
>       W  OE    --------- -  - 4.18.0-193.28.1.el8_2.x86_64 #1
> [ 1110.900606] Hardware name: National Instruments NI PXIe-8861/NI
> PXIe-8861, BIOS 1.2.4f2 01/09/2020
> [ 1111.007906] RIP: 0010:kernfs_find_ns+0x17/0xc0
> [ 1111.061042] Code: c0 79 04 31 ff eb f4 89 c2 eb e3 0f 1f 84 00 00 00
> 00 00 0f 1f 44 00 00 41 55 48 85 d2 49 89 f5 41 54 0f 95 c1 55 48 89 d5
> 53 <0f> b7 47 70 66 83 e0 20 0f 95 c2 38 d1 75 52 48 8b 5f 48 48 89 ee
> [ 1111.286038] RSP: 0018:ffffa5b406e67d08 EFLAGS: 00010246
> [ 1111.348548] RAX: 0000000000000000 RBX: 0000000000000000 RCX:
> 0000000000000000
> [ 1111.433971] RDX: 0000000000000000 RSI: ffffffffb5ab1588 RDI:
> 0000000000000000
> [ 1111.519394] RBP: 0000000000000000 R08: ffffa5b406e67e18 R09:
> 0000000000000004
> [ 1111.604828] R10: 0000000000000000 R11: 0000000000000001 R12:
> 0000000000000000
> [ 1111.690250] R13: ffffffffb5ab1588 R14: ffff99f3c8c82ae0 R15:
> ffff99f435506390
> [ 1111.775673] FS:  00007f5690560740(0000) GS:ffff99f435b40000(0000)
> knlGS:0000000000000000
> [ 1111.872553] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> [ 1111.941310] CR2: 0000000000000070 CR3: 0000000248d1a002 CR4:
> 00000000003606e0
> [ 1112.026732] DR0: 0000000000000000 DR1: 0000000000000000 DR2:
> 0000000000000000
> [ 1112.112156] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7:
> 0000000000000400
> [ 1112.197596] Call Trace:
> [ 1112.226778]  kernfs_find_and_get_ns+0x2c/0x50
> [ 1112.278872]  sysfs_unmerge_group+0x18/0x60
> [ 1112.327843]  dpm_sysfs_remove+0x27/0x60
> [ 1112.373688]  device_del+0x85/0x380
> [ 1112.414323]  cdev_device_del+0x15/0x30
> [ 1112.459143]  iio_device_unregister+0x29/0x70 [industrialio]
> [ 1112.525821]  release_nodes+0x21d/0x270
> [ 1112.570626]  device_release_driver_internal+0xf4/0x1d0
> [ 1112.632094]  driver_detach+0x54/0x88
> [ 1112.674814]  bus_remove_driver+0x77/0xc9
> [ 1112.721704]  pci_unregister_driver+0x2d/0xb0
> [ 1112.772758]  __x64_sys_delete_module+0x139/0x280
> [ 1112.827977]  do_syscall_64+0x5b/0x1a0
>
>
>
>
>



[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Input]     [Linux Kernel]     [Linux SCSI]     [X.org]

  Powered by Linux