一、 说明:
a) 内核版本号:3.4.2
b) 没有说自己创建的,内核里面有
c) 基于韦东山spi视频,加自己整合
二、 第一个文件:(描述开发板的文件)构造注册spi_board_info
在内核路径下: drivers/spi/spi_info_jz2440.c(这个文件是自己创建的)
1、 module_init(spi_info_jz2440_init);
2、 MODULE_LICENSE(“GPL”);
3、 spi_info_jz2440_init()调用 spi_register_board_info(spi_info_jz2440,ARRAY_SIZE(spi_info_jz2440)) //这个函数向系统注册
4、 在spi_board_info spi_info_jz2440[] {}这个结构体中对开发板的相关信息进行说明
三、 第二个文件(spi_master)
1、 driver/spi/spi_s3c24xx.c 它注册了名为“s3c2410-spi”的platform_driver
2、 需要有同名的platform_device
a) (在arch/arm/mach-s3c24xx/mach-smdk2440.c文件中154(搜索,platform_device &s3c_device_usb))
b) 如果使用mini2440的内核,要在arch/arm/mach-s3c24xx/mach-mini2440.c中 514行(搜索platform_device,下面添加&s3c_device_spi0,&s3c_device_spi1,(这是自己之前定义的))修改arch/arm/mach-s3c24xx/mach-smdk2440.c
smdk2440 devices[] = {};
c) 在(arch/arm/plat-samsung/devs.c)475和506
Devices/spi/spi.c中 spi_add_device
d) 给platform_dev添加platform_date
e) 配置内核使用主控驱动 spi-s3c24xx.c 配置文件(driver/spi/Makefile 25行)make uImage, insmod
四、 具体函数调用流程分析
在arch/arm/plat-samsung/devs.c中添加s3c2410_spi_info结构的两个成员spi1_info 和spi0_info,里面包括.bus_num 为1和0,这是下面匹配要用到的
在 platform_device 结构体中 .dev = {
.conherent_dma_mask =
//添加
.platform_data = &spi0_info
}
加入后,下面等待调用就可以了
||
\/
arch/arm/mach-s3c24xx/mach-smdk2440.c
在platform_device *smdk2440_devices[] 添加的 &spi_device_spi0和 &spi_device_spi1 这个结构体在
Smdk2440_machine_init中调用platform_add_devices放入系统中
||
\/
在drivers/spi/spi-s3c24xx.c中注册s3c2410_spi_driver
在这里进行spi_master相关操作,这里需要一个platform_device结构体将spi_master需要的相关信息传过来,将bus_num放在系统中,用于下面的比较
||
\/
Spi_register_board_info(); (drivers/spi/spi_info/spi_info_jz2440.c)
自己写的函数
||
\/
Spi_register_board_info();(drivers/spi/spi.c)
为一个制定的板子(平台)注册一个SPI_devices
||
\/
调用函数
List_add_tail(); list_for_each_entry(); (include/linux/list.h)
Spi_match_master_to_boardinfo(); //drivers/spi/spi.c
||
\/
在Spi_match_master_to_boardinfo();函数中
Master->bus_num 与 bi->bus_num进行比较,查看系统中是否有相应的spi总线,如果有
调用spi_new_device创建新的设备节点
五、 spi_nrf24l01_drv.c按照裸板的程序模拟I/O口操作就可以了,实际上,没有使用spi_master(即系统自带的spi控制器)
(暂时不懂怎么不能使用)
使用ioremap和readb,writeb操作
六、 部分文件截屏
1、 arch/arm/plat-samsung/devs.c
2、 arch/arm/mach-s3c24xx/mach-smdk2440.c
3、 drivers/spi/spi-s3c24xx.c
4、 drivers/spi/spi_info/spi_info_jz2440.c自己写的函数