一. 平台环境与源码编译
1. 平台环境
- 开发板 X1000_HALLEY2_BASEBOARD_V4.1
- 源码版本 ingenic-linux-kernel3.10.14-x1000-v8.2-20181116
2. 源码编译:
参照《v1000_v8.2版本编译_20181116》,可整体进行编译(即同时编译生成x.bin,kernel镜像文件,文件系统镜像文件),也可单独对每个工程进行编译;
二. X1000内核SPI配置
需要注意的是,该开发板中由于 SFC 模块被用于 spi nor flash,已被占用,所以改用 SSI0 接口复用为标准 SPI 接口。
1. 配置 spi_board_info 和 spi_info
涉及源码文件为:arch/mips/xburst/soc-x1000/chip-x1000/halley2/common/spi_bus.c
//注:如果有多个SPI接口可以对该数组进行扩展
struct spi_board_info jz_spi0_board_info[] = {
[0] = {
.modalias = "spidev", //设备名称,与驱动名称相匹配
.platform_data = NULL, //device private data
.max_speed_hz = 50000000, //设置总线最大支持频率
.bus_num = 0, //bus num
.chip_select = 0, //chip select
.mode = 0,
}
};
int jz_spi0_devs_size = ARRAY_SIZE(jz_spi0_board_info);
#endif
#ifdef CONFIG_JZ_SPI0
struct jz_spi_info spi0_info_cfg = {
.chnl = 0,
.bus_num = 0,
.max_clk = 54000000,//SPI支持的最大时钟
.num_chipselect = 1,//支持的芯片片选数,根据需要配置
.allow_cs_same = 1,
.chipselect = {GPIO_PD(1),GPIO_PD(1)},//片选引脚定义,这里是有PD1管脚
};
#endif
找到以上的函数配置接口,按照上述的参数进行配置即可。
2. SPI设备驱动配置
SPI驱动相关的源码文件如下:
kernel/drivers/spi/
├── jz_spi.c
├── jz_spi.h
├── spi-bitbang.c
├── spi.c
├── spidev.c
SPI设备驱动配置
进入内核源码目录,即终端输入如下命令:
cd ingenic-linux-kernel3.10.14-x1000-v8.2-20181116
如下对内核进行配置(这里配置操作需要 root 管理员权限):
sudo make menuconfig
出现内核界面选项。进入 Device Drivers->SPI support选项,这里SPI support 选择保证是选中打开的模式。如下所示:
选中如下选项:
和如下选项:
按照上述的配置,选中相关的配置之后,一定要选中下面的 < save >选项进行配置的保存!!!
最后对内核进行编译,重新生成内核镜像,烧录设备中。
网上有网友提到:“另外测试发现 SSI0_DR 管脚被摄像头占用,需要屏蔽掉摄像头相关驱动。”
即进入菜单 Device Drivers -> Multimedia support -> Sensors used on soc_camera driver
我自己这里因为会用到摄像头采图功能,所以,去掉摄像头驱动,编译成的X1000内核 uImage文件,烧录开发板导致系统一直重启,所以,我没有屏蔽掉摄像头驱动。
经过上面一轮内核配置,通过调试串口查看,/dev下的 SPI 设备结点还是存在问题。
4. 硬件原理图排查
查看了一下硬件IO口使用情况,如下核心板SPI电路图:
与如下底板的电路图进行对比,数据手册的IO说明 SPI 的硬件IO口存在复用问题:
结合上述电路图与 X1000数据手册,可知 SPI 与 IIC 口公用,都连接 EEPROM。即开发板提供了一个两种接口方式(SPI与IIC通信方式的)EEPROM存储器。因此,考虑内核关闭 IIC 通信方式的EEPROM。
解决办法:内核关闭 IIC 通信的EEPROM 功能。
如下所示:配置内核,即终端输入 sudo make menuconfig 命令。
进入内核选项 Device Drivers->Misc devices->EEPROM support 选项。
取消掉上图箭头所指的 I2C EEPROMs 选项,并选中下面 < Save > 进行保存。
最后对内核进行编译,重新生成内核镜像,烧录设备中。
4. 测试 SPI 接口
SPI接口测试如下:
首先,通过调试串口,可查看开发板文件系统/dev目录下,是否有spi设备节点存在;
然后可写 SPI 应用程序,对SPI通信进行测试;
经过测试,SPI 通信正常。
总结:
在内核代码中关于SPI 驱动代码部分,例如设备注册等操作函数还需要编译进内核中,这样在/dev目录下才会生成 SPI 设备结点,以供应用程序使用。
关于SPI 驱动代码注册进内核的部分,以后文章进行详细的说明。