ADC generic_buffer.c issues || Accessing ADC from own kernel module

Hoping you guys can help me out on this:

Goal: High sample rate of one ADC line via a kernel module and a corresponding user space app

Now I know the PRU would be great for this- and I plan on also writing a pru version to bench mark the diff but I’m currently trying to get it done with a kernel module and its turned into one of those annoying obsessions that should work and damn it-- I am going to make it work

So the goal is almost identical to the generic_buffer.c application referenced on this wiki [ http://processors.wiki.ti.com/index.php/AM335x_ADC_Driver’s_Guide]

but I’ve been fight it for awhile with no results.

Current version: Linux beaglebone 3.8.13-bone70
1: pulled there git repo
2: applied the patch to get rid of the trigger stuff found here
3: compiled:
gcc --static generic_buffer.c -o generic_buffer
4: Issues happen now because sysfs seem to be so different, I’m not sure contionous mode can be turned on?

./generic_buffer -n tiadc -l 256 -c 1
iio device number being used is 0
Problem reading scan element information
diag /sys/bus/iio/devices/iio:device0

5: This error leads down the rabbit hole to this semi unhelpful blog post: https://e2e.ti.com/support/arm/sitara_arm/f/791/t/365886 yielding an errata about Continuous capture mode is not supported in the 3.12 kernel; great we are still rocking a 3.8.13 kernel thus should be fine?

It shouldn't matter, but if you are willing to upgrade the kernel (ubuntu 14.04, Linux kernel 4.1.4-ti-r9),
you could follow the updated version instead:

http://processors.wiki.ti.com/index.php/Linux_Core_ADC_User’s_Guide

I just used Robert Nelson kernel (linux-image-4.1.4-ti-r9) and updated/added the required entry
to the device tree:

                tscadc@44e0d000 {
                        compatible = "ti,am3359-tscadc";
                        reg = <0x44e0d000 0x1000>;
                        interrupt-parent = <0x1>;
                        interrupts = <0x10>;
                        ti,hwmods = "adc_tsc";
                        status = "okay";
                        linux,phandle = <0xc5>;
                        phandle = <0xc5>;

                        tsc {
                                compatible = "ti,am3359-tsc";
                        };

                        adc {
                                #io-channel-cells = <0x1>;
                                compatible = "ti,am3359-adc";
                                linux,phandle = <0xc6>;
                                phandle = <0xc6>;
                                ti,adc-channels = <0 1 2 3 4 5 6 7>;
                        };
                };

I didn't try with the .c application with this version yet, but I can read the raw values directly:

(AN4 connected to the board analog ground)

~$ cat /sys/bus/iio/devices/iio\:device0/in_voltage4_raw
12

(AN4 connected to the board 1.8V )

~$ cat /sys/bus/iio/devices/iio\:device0/in_voltage4_raw
4083

cheers,
Nuno

For the linux-image-4.1.4-ti-r9 RN kernel image- Did you just compile from source from https://github.com/beagleboard/linux/tree/4.1

Hi!

Why don’t you use libpruio for maximum sampling rate?

BR

Does it support v4.1.x?

Regards,

Hi!

Why don’t you use libpruio for maximum sampling rate?

Does it support v4.1.x?

Regards,


Robert Nelson
https://rcn-ee.com/

Never tried!

BTW: is any v4.1.x stabile now?

Maro wrote:

Current version: Linux beaglebone 3.8.13-bone70

BR

Pretty much, we have a workaround in place for the random reboot..

The "pru" is probably the biggest blocker for most people "libpru" etc
all need to be ported. :wink:

Regards,

I will also experiment with the pru but don’t like giving up on a solution just because I haven’t got it working. I’d still like to know how to get it from a kernel module

Have you used libpruio much? I was going to access the htimers to get high precision accuracy between the ADC output. Is there a nice way to do that? or does the 5uS pru assembly give me the ability to determinately know the time between each sampled value

Hi!

To answer a question asked: the generic_buffer.c works fine with 4.1.5-ti-r10. The only thing I found is that the scale is not implemented (it’s 1.0) so where you should be getting a value in Volts, you still get the 12 bit value from ADC (0 - 4095). Otherwise it pretty much works out of the box.

Robert,

did you manage to make the PRU working ?

micka,

Nuno I Tried the file generic_buffer ( found it on the kernel 4.0 : http://lxr.free-electrons.com/source/drivers/staging/iio/Documentation/generic_buffer.c?v=4.0 )

But I got :

root@beaglebone:/# ./generic_buffer -n TI-am335x-adc -t sysfstrig1 -l 128
iio device number being used is 0
Failed to find the trigger sysfstrig1

Maybe I’m not using it correctly

cat /dev/iio:device0