历经两周终于将设计的AD采集板驱动起来,并且读取电流值成功,唯不是一个突破!
由硬件设计再到驱动,一步步设计改变;到设备树添加驱动并加载,总结主要分为两方面,一个驱动调试和硬件调试。细节如下:
驱动调试步骤:
第一步:添加驱动文件到设备树:
去到spi0底下添加如下代码:
adc7606@2 {
compatible = "adi,ad7606-8"; //厂家编号
reg = <2>; /* CS2 */
spi-max-frequency = <12000000>; /* 12MHZ */
spi-cpol;
interrupt-parent = <&icu>; ------1.
interrupts = <59>; /* used goodix */ --2.
irq-gpios = <&pioA 41 GPIO_ACTIVE_LOW>; /* IRQ 41 */ --3.
adi,conversion-start-gpios = <&pioA 39 GPIO_ACTIVE_HIGH>; /* select mode39 */
reset-gpios = <&pioA 37 GPIO_ACTIVE_HIGH>; /* reset io 37*/
};
注:1-3标注的地方,进行调试多次没成功,具体是因为loongson自身IO中断问题,给出的例子如下:(路径:linux-5.10-2k1000-dp-src/drivers/input/touchscreen/goodix.c)
37,39,41 分别是我的复位脚,启动脚和中断脚
第二步:Goodix.c是触摸屏程序,在申请gpio中断时,添加了GPIOD触发
#ifdef CONFIG_MACH_LOONGSON64
/* gpiod_to_irq用于gpio中断使能,修正龙芯平台的gpio中断 */
gpiod_to_irq(ts->gpiod_int);
#endif
ts->gpiod_int:触摸屏的中断引脚
第三步:文件修改如下:(路径:/linux-5.10-2k1000-dp-src/drivers/iio/adc/ad760.c)
在**static int ad7606_request_gpios(struct ad7606_state *st)**函数中添加中断脚
具体照猫画虎,例子如下:
st->gpio_irq = devm_gpiod_get_optional(dev, "irq",GPIOD_IN);
if (IS_ERR(st->gpio_irq))
return PTR_ERR(st->gpio_irq);//add
#ifdef CONFIG_MACH_LOONGSON64
/* gpiod_to_irq用于gpio中断使能,修正龙芯平台的gpio中断 */
gpiod_to_irq(st->gpio_irq);
#endif
st:是ad7606的IO申请的结构体
第四步:修改AD7606头文件
在state结构体声明gpio_irq 中断引脚即可。
struct gpio_desc *gpio_irq;//add adc
第五步:编译,烧录内核即可
术语解析:
icu :原生GPIO的集合,提供中断
pioA : 在设备树文件里有定义,继承了原生GPIO的中断
以上就是基于龙芯2K1000平台的AD采集移植
硬件调试方面:查看AD7606的官方文件:
AD7606芯片文档
其他平台参照官网即可,链接如下:
ADI芯片官方文档