This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM335X的ADC驱动问题



我加载adc驱动的时候,怎么不能注册呢?3.14的内核,

按照这个配置的processors.wiki.ti.com/.../Linux_Core_ADC_User's_Guide

把adc配成模块,手动安装,无法进入到probe函数(没有打印)。


static int tiadc_probe(struct platform_device *pdev)
{
printk("------>probe\n");

...

...

}


root@am335x-evm:/lib/modules/3.14.43-g875c69b/kernel/drivers/iio/adc# lsmod
Module Size Used by
kfifo_buf 2417 0
industrialio 46890 1 kfifo_buf
bufferclass_ti 5396 0
omaplfb 12042 0
snd_soc_evm 5589 0
pvrsrvkm 177007 2 bufferclass_ti,omaplfb
cryptodev 32483 0
snd_soc_davinci_mcasp 15606 2
lis3lv02d_i2c 3153 0
lis3lv02d 14936 1 lis3lv02d_i2c
snd_soc_tlv320aic3x 40349 1
input_polldev 3345 1 lis3lv02d


root@am335x-evm:/lib/modules/3.14.43-g875c69b/kernel/drivers/iio/adc# ls
ti_am335x_adc.ko
am335x_adc.ko m:/lib/modules/3.14.43-g875c69b/kernel/drivers/iio/adc# insmod ti_a
root@am335x-evm:/lib/modules/3.14.43-g875c69b/kernel/drivers/iio/adc#
root@am335x-evm:/lib/modules/3.14.43-g875c69b/kernel/drivers/iio/adc#
root@am335x-evm:/lib/modules/3.14.43-g875c69b/kernel/drivers/iio/adc#
root@am335x-evm:/lib/modules/3.14.43-g875c69b/kernel/drivers/iio/adc# lsmod
Module Size Used by
ti_am335x_adc 4562 0
kfifo_buf 2417 1 ti_am335x_adc
industrialio 46890 2 ti_am335x_adc,kfifo_buf
bufferclass_ti 5396 0
omaplfb 12042 0
snd_soc_evm 5589 0
pvrsrvkm 177007 2 bufferclass_ti,omaplfb
cryptodev 32483 0
snd_soc_davinci_mcasp 15606 2
lis3lv02d_i2c 3153 0
lis3lv02d 14936 1 lis3lv02d_i2c
snd_soc_tlv320aic3x 40349 1
input_polldev 3345 1 lis3lv02d

root@am335x-evm:~# ls -al /sys/bus/iio/devices/iio\:device0/
ls: /sys/bus/iio/devices/iio:device0/: No such file or directory
root@am335x-evm:~# ls -al /sys/bus/iio/devices/
drwxr-xr-x 2 root root 0 Jul 6 22:15 .
drwxr-xr-x 4 root root 0 Jul 6 22:15 ..
root@am335x-evm:~#

下面是dts:

。。

&tscadc {

        adc {

            ti,adc-channels = <4 5 6 7>;
         };
};

。。



  • 是不是printk()这个函数没有打开啊

  • 打开了,测试过了printk可以正常打印信息。

    insmod后还是没有反应,还找不到对应的文件,

    root@am335x-evm:~# ls -al /sys/bus/iio/devices/iio\:device0

    ls: /sys/bus/iio/devices/iio:device0: No such file or directory

    这个文件下是空的:/sys/bus/iio/devices/

    另外这个驱动ti_am335x_adc.ko是怎么跟dts匹配的?dts已经按照文档修改了。

    如果要读取adc的值有几种操作方法?

  • wiki上面已经写的很详细了,如果你没有设备,先确认adc是否已经被配置,初始化成功。

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

    http://processors.wiki.ti.com/index.php/Processor_SDK_Linux_ADC

  • 都按照文档做了,该配置的也都配置好了,还是无法生成设备文件,/sys/bus/iio/devices/这个目录还是空的,我的理解是adc驱动在加载的时候会去匹配.DTS里面相对应内容,如果有相同的name,寄存器也是正确的话,驱动程序就会进入到probe函数中执行,不知道我理解对不对。dts还有dtsi对应的内容如下:

    am-335x-evmsk.dts:

    &tscadc {
    status = "okay";
    tsc {
    ti,wires = <4>;
    ti,x-plate-resistance = <200>;
    ti,coordinate-readouts = <5>;
    ti,wire-config = <0x00 0x11 0x22 0x33>;
    ti,charge-delay = <0xb000>;
    };
    //下面三行是加上去的。
    adc {
    ti,adc-channels = <4 5 6 7>;
    };
    };

    ----------------------------------------------------------------------------

    am33xx.dtsi:

    tscadc: tscadc@44e0d000 {
    compatible = "ti,am3359-tscadc";
    reg = <0x44e0d000 0x1000>;
    interrupt-parent = <&intc>;
    interrupts = <16>;
    ti,hwmods = "adc_tsc";
    status = "disabled";

    tsc {
    compatible = "ti,am3359-tsc";
    };
    am335x_adc: adc {
    #io-channel-cells = <1>;
    compatible = "ti,am3359-adc";
    };
    };

    -------------------------------

    ti_am335x_adc.c:

    .....

    static const struct of_device_id ti_adc_dt_ids[] = {
    { .compatible = "ti,am3359-adc", },
    { }
    };
    MODULE_DEVICE_TABLE(of, ti_adc_dt_ids);

    static struct platform_driver tiadc_driver = {
    .driver = {
    .name = "TI-am335x-adc",
    .owner = THIS_MODULE,
    .pm = TIADC_PM_OPS,
    .of_match_table = ti_adc_dt_ids,
    },
    .probe = tiadc_probe,
    .remove = tiadc_remove,
    };
    module_platform_driver(tiadc_driver);

    MODULE_DESCRIPTION("TI ADC controller driver");
    MODULE_AUTHOR("Rachna Patil <rachna@ti.com>");
    MODULE_LICENSE("GPL");

    我不知道怎么回事,应该可以执行probe函数的。不知道我哪里出来问题,

    另外我明明选中把adc driver编译进内核,但是启动后还是要手动加载,是不是这里导致的问题?

    急等。。。

  • 你好,请问你的tiadc无法创建的问题解决了吗?

    我现在也碰到了类似的问题,查代码发现是在devices.c里am33xx_register_mfd_tscadc这个函数导致的,他在查找之后会直接创建ti_tscadc  这个设备,这个设备是否直接进行读取就可以的了还是说需要其他的操作才能读取到数据?

  • 查看一下你的.dts文件。找到 ADC的

    我的时这样的:(参考来改)

    &tscadc {

    status = "okay";
    compatible = "ti am3359-adc";
    am335x_adc:adc{
    status = "okay";                 ///////////////////这里很重要,默认是disable的,改成okay应该就可以了
    compatible = "ti,am3359-adc";
    ti,adc-channels = < 4 5 6 7>;
    }
    }