一、PCB原理图分析
1、AM335主控板SPI接口分析
总共有四路spi,我使用了spi0这一组。
2、原理图分析
二、spi驱动移植
1、 spi设备驱动移植(去I2C增spi)
开发板上电以后通过查看/dev目录,底下没有生成对应的spi设备,推测spi驱动未被加载到内核中,
原因一:可能是根文件系统没有mdev或者udev服务,不会直接创建设备节点。
原因二:没有spi驱动代码,需要修改内核源码,增加spi设备驱动
排查一:通过修改查看i2c驱动,发现i2c设备驱动能够自动创建设备节点,排除这个可能
排查二:增加spi驱动,因为开发板已经给出了spi驱动代码,通过make menuconfig选配增加spi驱动
2、 保存配置再次编译
通过编译打印信息显示spidev设备驱动编译进了内核,在驱动入口函数spidev_init增加打印代码,在启动过程中并没有打印这个信息。但是在启动过程中没有打印,代表spi设备驱动并没有加载,怀疑和原先看到的资料中spi和i2c复用有关
排查三:去掉i2c驱动
由/driver/i2c/*.o可以知道编译进镜像的驱动是i2c-dev.c,通过查Makefile中的i2c-dev.o找到菜单选项是
再通过Kconfig找到make menuconfig选项是 I2C device interface,
直接选配掉这个驱动,重新编译烧写:
烧写启动开发板后还是没有打印spi设备驱动中的打印语句,同时也没有创建出对应的节点
三、spi驱动核心层代码修改
修改arch/arm/mach-omap2/board-com335x.c
1、通过查看内核板级文件,发现board-com335x.c这个文件中没有对spi的设备驱动端注册相关代码(spi_board_info),只有spi0(将要操作的一路spi)的引脚相关代码
2、在这段代码之后增加spi_board_info以及COM335_spi0_init代码(需要额外添加到文件中)
3、最后将COM335_spi0_init函数在所有的驱动初始化函数com335x_init函数中调用
同时在com335x_init中注释掉I2C1相关的注册函数(主要是自己担心复用功能会有影响,反正整个系统设计中不会用I2C1)
4、重新编译uImage,再次烧写,完美解决:通过ls /dev/*可以看到spidev2.0这个设备已经出现。