一、驱动程序结构

1、platform_device

文件:/arch/arm/mach-omap2/device.c

  1. static struct omap2_mcspi_platform_config omap2_mcspi1_config = {
  2. .num_cs = ,
  3. };
  4.  
  5. static struct resource omap2_mcspi1_resources[] = {
  6. {
  7. .start = OMAP2_MCSPI1_BASE,
  8. .end = OMAP2_MCSPI1_BASE + 0xff,
  9. .flags = IORESOURCE_MEM,
  10. },
  11. };
  12.  
  13. static struct platform_device omap2_mcspi1 = {
  14. .name = "omap2_mcspi",
  15. .id = , /* 用于platform_driver probe函数中识别不同的设备 */
  16. .num_resources = ARRAY_SIZE(omap2_mcspi1_resources),
  17. .resource = omap2_mcspi1_resources,
  18. .dev = {
  19.   .platform_data = &omap2_mcspi1_config,
  20. },
  21. };
  22. static inline void ti81xx_mcspi_fixup(void)
  23. {
  24.   omap2_mcspi1_resources[].start = TI81XX_MCSPI1_BASE;
  25.   omap2_mcspi1_resources[].end = TI81XX_MCSPI1_BASE + 0xff;
  26.  
  27. }
  28.  
  29. static void omap_init_mcspi(void)
  30. {
  31.   if (cpu_is_ti81xx())
  32.     ti81xx_mcspi_fixup()
  33. platform_device_register(&omap2_mcspi1);
  34. }

2、dev_devices

文件:/arch/arm/mach-omap2/board-ti8148ipnc.c

  1. static struct spi_board_info dm8127_spi1_board[] = {
  2. [] = {
  3. .modalias = "spidev",
  4. .bus_num = ,
  5. .chip_select = ,
  6. .irq = -,
  7. .max_speed_hz = **,
  8. .mode = SPI_MODE_0,
  9. },
  10. };
  11.  
  12. void __init ti8148_spi_init(void)
  13. {
  14.  
  15. spi_register_board_info(dm8127_spi1_board,
  16. ARRAY_SIZE(dm8127_spi1_board));
  17.  
  18. }
  19.  
  20. int __init spi_register_board_info(struct spi_board_info const *info, unsigned n)
  21. {
  22. struct boardinfo *bi;
  23. int i;
  24.  
  25. bi = kzalloc(n * sizeof(*bi), GFP_KERNEL);
  26. if (!bi)
  27. return -ENOMEM;
  28.  
  29. for (i = ; i < n; i++, bi++, info++) {
  30. struct spi_master *master;
  31.  
  32. memcpy(&bi->board_info, info, sizeof(*info));
  33. mutex_lock(&board_lock);
  34. list_add_tail(&bi->list, &board_list); /*加入board_list全局链表*/  
  35.      list_for_each_entry(master, &spi_master_list, list)
  36. spi_match_master_to_boardinfo(master, &bi->board_info);
  37. mutex_unlock(&board_lock);
  38. }
  39.  
  40. return ;
  41. }

1、platform_driver

文件:/driver/spi/omap2_mcspi.c

  1. static const struct dev_pm_ops omap2_mcspi_pm_ops = {
  2. .resume = omap2_mcspi_resume,
  3. };
  4.  
  5. static struct platform_driver omap2_mcspi_driver = {
  6. .driver = {
  7. .name = "omap2_mcspi",
  8. .owner = THIS_MODULE,
  9. .pm = &omap2_mcspi_pm_ops
  10. },
  11. .remove = __exit_p(omap2_mcspi_remove),
  12. };
  13.  
  14. static int __init omap2_mcspi_init(void)
  15. {
  16. omap2_mcspi_wq = create_singlethread_workqueue( /* 创建工作队列 */
  17. omap2_mcspi_driver.driver.name);
  18. if (omap2_mcspi_wq == NULL)
  19. return -;
  20. return platform_driver_probe(&omap2_mcspi_driver, omap2_mcspi_probe);
  21. }

1、dev_driver

文件:/driver/spi/spidev.c

  1. static struct spi_driver spidev_spi_driver = {
  2. .driver = {
  3. .name = "spidev",
  4. .owner = THIS_MODULE,
  5. },
  6. .probe = spidev_probe,
  7. .remove = __devexit_p(spidev_remove),
  8.  
  9. };

SPI驱动框架-1(DM8127 Linux2.6.37为例)的更多相关文章

  1. linux驱动基础系列--linux spi驱动框架分析

    前言 主要是想对Linux 下spi驱动框架有一个整体的把控,因此会忽略某些细节,同时里面涉及到的一些驱动基础,比如平台驱动.设备模型等也不进行详细说明原理.如果有任何错误地方,请指出,谢谢! spi ...

  2. SPI 驱动框架

    SPI 驱动框架 1. 枚举过程 drivers/spi/spi.c: spi_register_board_info /* 对于每一个spi_master,调用spi_match_master_to ...

  3. linux驱动基础系列--linux spi驱动框架分析(续)

    前言 这篇文章是对linux驱动基础系列--linux spi驱动框架分析的补充,主要是添加了最新的linux内核里设备树相关内容. spi设备树相关信息 如之前的文章里所述,控制器的device和s ...

  4. spi驱动框架全面分析,从master驱动到设备驱动

    内核版本:linux2.6.32.2  硬件资源:s3c2440 参考:  韦东山SPI视频教程 内容概括:     1.I2C 驱动框架回顾     2.SPI 框架简单介绍     3.maste ...

  5. Linux驱动修炼之道-SPI驱动框架源码分析(上)【转】

    转自:http://blog.csdn.net/lanmanck/article/details/6895318 SPI驱动架构,以前用过,不过没这个详细,跟各位一起分享: 来自:http://blo ...

  6. S3C2440 SPI驱动框架

    S3C2440 SPI驱动代码详细解读: https://www.linuxidc.com/Linux/2012-08/68402p4.htm 一.platform device and board_ ...

  7. Linux驱动:SPI驱动编写要点

    题外话:面对成功和失败,一个人有没有“冠军之心”,直接影响他的表现. 几周前剖析了Linux SPI 驱动框架,算是明白个所以然,对于这么一个庞大的框架,并不是每一行代码都要自己去敲,因为前人已经把这 ...

  8. RT Thread的SPI设备驱动框架的使用以及内部机制分析

    注释:这是19年初的博客,写得很一般,理解不到位也不全面.19年末得空时又重新看了RTThread的SPI和GPIO,这次理解得比较深刻.有时间时再整理上传. -------------------- ...

  9. 基于TQ2440的SPI驱动学习(OLED)

    平台简介 开发板:TQ2440 (NandFlash:256M  内存:64M) u-boot版本:u-boot-2015.04 内核版本:Linux-3.14 作者:彭东林 邮箱:pengdongl ...

随机推荐

  1. Redux API之bindActionCreators

    bindActionCreators(actionCreators,dispatch) 把 action creators 转成拥有同名 keys 的对象,但使用 dispatch 把每个 actio ...

  2. iOS_数据存取(一)

    目录: 一.沙盒机制 二.用户偏好设置 三.归档 一.沙盒机制 每个iOS应⽤都有⾃己的应用沙盒(应⽤沙盒就是⽂件系统⽬录),与其他文件系统隔离.应⽤必须待在⾃己的沙盒⾥,其他应用不能访问该应用沙盒的 ...

  3. tree 命令【转】

    本文转载自:http://www.jb51.net/LINUXjishu/283874.html linux下怎么用tree命令以树形结构显示文件目录结构?tree命令可以以树形结构显示文件目录结构, ...

  4. 时间插件之My97DatePickerBeta

    My97DatePickerBeta使用很简单 1.在jsp页面中 引入JS 下载地址:链接: https://pan.baidu.com/s/1bp5uzuv 密码: ya9a <script ...

  5. 如何隐藏tomcat命令窗口

    有两种方法: 一.修改tomcat中的文件参数,达到隐藏目的: 引用:TOMCAT_HOME\bin\setclasspath.bat 在文件的底部找到以下内容: set _RUNJAVA=" ...

  6. setfacl设置特定目录的权限

    现有一目录是虚拟机和linux共享的,但是每次程序调用新建的文件都发现没有权限. 于是指定特定目录及其子目录下新建的文件或目录对于用户qhfz都有读写执行的权限 -R表示递归 -m表示设置文件acl规 ...

  7. 基于canvas与原生JS的H5动画引擎

    前一段时间项目组里有一些H5动画的需求,由于没有专业的前端人员,便交由我这个做后台的研究相关的H5动画技术. 通过初步调研,H5动画的实现大概有以下几种方式: 1.基于css实现 这种方式比较简单易学 ...

  8. 经典的MapReduce1解析

    MapReduce1任务图解 最顶层包含4个独立的实体客户端,提交MapReduce作业jobtracker,协调作业的运行.Jobtracker是一个Java应用程序,它的主类是JobTracker ...

  9. WIN7 X64 PASSUAC 源码

    // Passuac.cpp : Defines the entry point for the console application. // #include "stdafx.h&quo ...

  10. hdu 5147 Sequence II 树状数组

    Sequence II Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Prob ...