spi/i2c调用框架

原创 2016年08月31日 14:26:31

1.板级信息中通过 spi_register_board_info来添加设备

drivers/spi/spi.c:

    spi_register_board_info
        /* 对于每一个spi_master,调用spi_match_master_to_boardinfo */
        list_for_each_entry(master, &spi_master_list, list)
            spi_match_master_to_boardinfo
            /* board_info里含有bus_num, 如果某个spi_master的bus_num跟它一样
             * 则创建一个新的spi_device
             */
                    if (master->bus_num == bi->busnum)
                        spi_new_device
                            spi_alloc_device
                            /* 记录bi信息, 比如片选,MODE,MAX HZ */    
                            spi_add_device /* 根据名字找到spi_driver, 调用它的probe函数 */
                                spi_setup(spi);

                                device_add  /* 会绑定到一个spi_driver */




2:控制器驱动:如:spi_s3c2440.c或i2c_s3c24xx.c中的调用关系

1.module_platform_driver(s3c24xx_spi_driver);  

2.platform_driver_register  (drivers/base/platform.c   470行)

3.driver_register(&drv->driver);  //进入此函数进行platfrom_device和platform_driver的匹配  (drivers/base/driver.c)

./*
*调用此函数来判断内核中是否注册名字相同的驱动,
*  若注册了则返回return -EBUSY;
* 若没有注册则执行 bus_add_driver(drv)函数,把驱动添加到总线
*/

4.driver_find(drv->name, drv->bus);    (drivers/base/driver.c)

5.bus_add_driver(drv);//驱动添加到总线后悔调用driver_attach函数去试图绑定设备和驱动  (drivers/base/bus.c)

6.driver_attach(drv);   //对总线上的驱动和每一个设备进行匹配,会调用__driver_attach函数    (drivers/base/Dd.c)

6.1  bus_for_each_dev(drv->bus, NULL, drv, __driver_attach);  //进入__driver_attach函数    (drivers/base/Dd.c)

6.2  if (!driver_match_device(drv, dev))  判断驱动和设备是否匹配,如果匹配成功则会调用driver_probe_device函数,

6.3  driver_probe_device(drv, dev);   此函数又会调用really_probe(dev, drv);函数来调用驱动提供的probe函数

6.4  really_probe(dev, drv);   //进入此函数

6.5  if (dev->bus->probe) {   //总线提供的probe函数
ret = dev->bus->probe(dev);
if (ret)
goto probe_failed;
} else if (drv->probe) {  //驱动提供的probe函数
ret = drv->probe(dev);  //进入s3c24xx_i2c_probe 成功后返回return 0
if (ret)
goto probe_failed;
}

7.static int __devinit s3c24xx_spi_probe(struct platform_device *pdev)  //进入spi控制器驱动的probe函数

8.spi_bitbang_start(&hw->bitbang);   //进入此函数,此函数会调用spi_register_master

9.spi_register_master  //注册spi主机控制器并添加到spi_bus_type总线上  (driver/spi/spi_bitbang.c)

9.1device_add(&master->dev);      //添加设备到spi_bus_type总线

9.2/*
         //遍历总线上的所以master,通过bus_num与spi_board_info中的bus_num进行匹配
*/
list_for_each_entry(bi, &board_list, list)
spi_match_master_to_boardinfo(master, &bi->board_info);

10.spi_match_master_to_boardinfo  ->  spi_new_device(master, bi);  //创建新的spi设备

11.spi_add_device(proxy);

12.bus_add_device(dev);   //添加设备到总线,并把设备挂载到链表上,便于驱动进去设备匹配  

12.1klist_add_tail(&dev->p->knode_bus, &bus->p->klist_devices);  //把设备挂接到链表上

13.bus_probe_device(dev);   //进入,总线上枚举这个设备

13.1device_attach(dev);// 进入:  遍历所以的驱动,找到与新创建的设备匹配的函数 ->bus_for_each_drv(dev->bus, NULL, dev, __device_attach);  //进入:调用总线上的每一个driverr调用 __device_attach来判断是否匹配

13.2__device_attach  - >  driver_probe_device(drv, dev); //如果匹配则调用总线上的probe函数 ->really_probe(dev, drv);   //进入此函数则会调用响应的驱动probe函数


3 数据收发过程
    spi_write
        spi_message_init(&m);
        初始化一个spi_message  /* 一个不可打断的SPI传输过程: cs=0,传数据,cs=1 */
                               /* 一个spi_message由多个spi_transfer组成 */
        spi_message_add_tail(&t, &m);  /* spi_transfe是SPI上传输的单方向1个或多个字节 */
        spi_sync(spi, &m);  /* 启动传输并等待完成 */
    
4.spi_driver如何调用spi_controller
    spi_sync
        __spi_sync(spi, message, 0);
            spi_async_locked
                __spi_async
                    master->transfer(spi, message);  //调用transfer函数发送或接受数据
            wait_for_completion





相关文章推荐

I2C/SPI外设驱动基于regmap框架的那点用法

基于内核regmap模型的SPI/I2C驱动的那点用法。
  • wp_neu
  • wp_neu
  • 2017年05月17日 09:58
  • 761

i2c和spi协议

  • 2015年08月12日 14:46
  • 862KB
  • 下载

关于高通8053平台i2c和spi配置的学习总结

这次完成的任务是要使能高通8053平台的i2c和spi,主要做的工作就是在设备树文件中添加节点信息。主要的工作在于对设备树文件的修改,主要修改了msm8953-pinctrl.dtsi和msm8953...

二、关于I2C和SPI总线协议

关于I2C和SPI总线协议 转载请注明出处:http://blog.csdn.net/ce123 IICvs SPI          现今,在低端数字通信应用领域,我们随处可见IIC (...

SPI、I2C、UART的区别和联系

SPI、IIC、UART区别 第一个区别当然是名字:      SPI(Serial Peripheral Interface:串行外设接口);      I2C(INTER IC BUS)    ...
  • dgj8300
  • dgj8300
  • 2016年04月21日 20:47
  • 1272

I2C、SPI、USRT、USRAT通信方式对比

在产品开发中经常会遇到一些通信问题,平常经常会用到的I2C、SPI、USRT、USRAT通信方式进行对比。一般通信的速录,距离、接线的问题,会对通信方式的选择有所影响。了解不同通信模式的特点,便于开发...

关于高通8053平台i2c和spi配置的学习总结

这次完成的任务是要使能高通8053平台的i2c和spi,主要做的工作就是在设备树文件中添加节点信息。主要的工作在于对设备树文件的修改,主要修改了msm8953-pinctrl.dtsi和msm8953...

关于I2C和SPI总线协议

关于I2C和SPI总线协议 IICvs SPI          现今,在低端数字通信应用领域,我们随处可见IIC (Inter-Integrated Circuit) 和 SPI (Serial...
  • ce123
  • ce123
  • 2011年10月16日 23:24
  • 36774

uart,spi,i2c总线的区别

uart,spi,i2c总线的区别  I2C的数据输入输出用的是一根线,SPI则分为dataIN和 dataOUT。由于这个原因,采用I2C时CPU的端口占用少,SPI多一根。但是由于I2C的数...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:spi/i2c调用框架
举报原因:
原因补充:

(最多只允许输入30个字)