1.Linux主机驱动和外设驱动分离思想(I2C驱动里有)

SPI驱动总线架构:SPI核心层(x),SPI控制器驱动层(x),SPI设备驱动层(√)。前面两个设备驱动搞明白了可以去看

 

2.教程中介绍:SPI函数接口(API):

简单介绍SPI协议,硬件原理(4412datasheet)

 

3.教程中介绍:SPI函数接口(API):

简单介绍SPI协议,硬件原理(4412datasheet)

  • SDI(数据输入),SDO(数据输出),SCLK(时钟),CS(片选)
  • SPI(rfid模块)的硬件基础知识(增加reset)
  • SPI CLK管脚复用:Android4.0(wifi不能用)

 

  • rfid的驱动配置:
    • Device Drivers
    • →SPI support
    • →SPI_RC522
  • can的驱动配置:
  • Networking support
    • →CAN bus subsystem support
    • →CAN Device Drivers
  • Platform CAN drivers with Netlink support(默认配置,不用动)
  • CAN_MCP251X

 

设备注册:spi_board_info,spi_register_board_info

驱动注册函数和结构体:spi_register_driver/spi_unregister_driver,spi_driver

读写函数和结构体:spi_transfer和spi_message结构体,spi_async

 

1.驱动“设备注册,驱动注册,probe,数据下传,数据上传”的小结

4412 SPI驱动

虚拟平台:

①因为LED,蜂鸣器等等,因为这些驱动本身不是总线。所以都注册在虚拟平台总线上(platform_device)。

②然后platfrom_driver_register就是在驱动程序中使用了,注册时的platfrom_driver结构体中有name成员对应platform_device的名字。此结构当然还有probe,remove,suspend,resume等配套的功能接口。

③然后对LED来说,GPIO的操作基本是在probe中初始化。

④然后应用层如果需要调用,那么在probe里就需要注册杂项设备、字符设备等。

I2C:

①I2C的设备注册和平台注册类似,都是在arc/arm/mach-exynos/mach-itop4412.c中完成的

②和平台设备类似,I2C使用的函数不一样罢了,而且结构体也是i2c_driver了

③I2C对硬件的传输,使用i2c_transfer结合i2c_msg

④然后应用层如果需要调用,那么需要注册杂项设备,和虚拟平台类似。

SPI:

  基本和I2C类似不同的是操作硬件的函数,spi_transfer要配置一下,然后传输用spi_sync。SPI让应用层调用使用字符设备。

 

2.设备-SPI设备注册一级设备注册之后的查询方法

配置SPI的内核之后可以用,查询到

[root@iTOP-4412]# cat sys/bus/spi/devices/spi2.0/modalias                              
rc522

SPI_board_info参数

spi_board_info参数
    .modalias = "rc522",    //初始化设备的名称
    .platform_data = NULL,    
    .max_speed_hz = 10*1000*1000,    //初始化传输速率
    .bus_num = 2,        //控制器编号
    .chip_select = 0,    //控制器片选的编号
    .mode = SPI_MODE_0,    //spi的模式
    .controller_data = &spi2_csi[0],    //片选IO的信息

spi2_board_info设备描述结构体,设备注册函数spi_register_board_info

 

增加一个spi设备my_rc522,然后去掉rfid和can驱动

/* add by cym 20141222 for RC522 RFID */
#ifdef CONFIG_SPI_RC522
        {
                .modalias = "rc522",
                .platform_data = NULL,
                .max_speed_hz = 10*1000*1000,
                .bus_num = 2,
                .chip_select = 0,
                .mode = SPI_MODE_0,
                .controller_data = &spi2_csi[0],
        }
#endif
/* end add */
/* add by ct 2018825 */
        {
                .modalias = "my_rc522",
                .platform_data = NULL,
                .max_speed_hz = 10*1000*1000,
                .bus_num = 2,
                .chip_select = 0,
                .mode = SPI_MODE_0,
                .controller_data = &spi2_csi[0],
        }
/* end add */
mach-itop4412.c

相关文章: