spi驱动(基于linux3.4.2)

来源:互联网 发布:宁波seo教程 编辑:程序博客网 时间:2024/05/23 05:08

一、    说明:

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_num10,这是下面匹配要用到的

在 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自己写的函数

0 0
原创粉丝点击