本章在以NUC972为平台的Linux3.10.1中添加设备驱动。
platform总线是linux中一种虚拟、抽象出来的总线,它将设备和驱动绑定。platform工作体系都定义在drivers/base/platform.c中,其有两个结构体:platform_device和platform_driver

platform_driver:

struct platform_driver {int (*probe)(struct platform_device *);   //探测函数,在注册平台设备时被调用int (*remove)(struct platform_device *);   //删除函数,在注销平台设备时被调用void (*shutdown)(struct platform_device *); int (*suspend)(struct platform_device *, pm_message_t state); //挂起函数,在关机被调用int (*suspend_late)(struct platform_device *, pm_message_t state);int (*resume_early)(struct platform_device *);int (*resume)(struct platform_device *);//恢复函数,在开机时被调用struct device_driver driver;//设备驱动结构
};struct device_driver {const char      * name;struct bus_type     * bus;struct kobject      kobj;struct klist        klist_devices;struct klist_node   knode_bus;struct module       * owner;const char      * mod_name; /* used for built-in modules */struct module_kobject   * mkobj;int (*probe)    (struct device * dev);int (*remove)   (struct device * dev);void    (*shutdown) (struct device * dev);int (*suspend)  (struct device * dev, pm_message_t state);int (*resume)   (struct device * dev);
};

platform_device

struct platform_device {const char  * name;//设备名称u32     id;//取-1struct device   dev;//设备结构      u32     num_resources;// resource结构个数   struct resource * resource;//设备资源
};

了解了上面两个结构体,然后开始修改dev.c文件,这里是基于nuc972平台,在目录linux-3.10.x/arch/arm/mach-nuc970下,这里以KSZ8851芯片为例:
首先这里定义KSZ8851的EBI总线的nCS4基地址(KSZ8851_16MLL_BASE_ADDR),[0] 和[1] 分别是读写数据和地址访问的访问地址,这里(.start = KSZ8851_16MLL_BASE_ADDR+4)为什么加4?因为ksz8851的CMD线接到了EBI总线的ADDR2上,当CMD为高为写命令,CMD为低为写数据,然后对总线写地址时候保证bit2(EBI的ADDR2地址线)为1,那么ADDR2地址线为高,此时写的是命令,bit2为0则ADDR2地址线为为低电平,此时写的是数据,因此bit2对应0x4。

每一个resource都有.start,.end和.flags ,用于表示该资源的起始地址,末地址和类型,struct platform_device中name用于和driver进行匹配,name需要和驱动层中name相同,当匹配后将执行probe函数。

#ifdef CONFIG_KS8851_MLL#define KSZ8851_16MLL_BASE_ADDR          0x20100000      //512K cs4  adrress--data_accessstatic struct resource nuc970_ksz8851_resource[] = {[0] = {.start = KSZ8851_16MLL_BASE_ADDR,     //data_access.end   = KSZ8851_16MLL_BASE_ADDR+3,.flags = IORESOURCE_MEM,},[1] = {.start = KSZ8851_16MLL_BASE_ADDR+4,      //address_access.end   = KSZ8851_16MLL_BASE_ADDR+7,.flags = IORESOURCE_MEM,},[2] = {.start = IRQ_EXT7_H7,      //PH7-INT7.end   = IRQ_EXT7_H7,.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,},
};struct platform_device nuc970_device_ksz8851 = {.name           = "ks8851_mll",.id             = -1,.num_resources  = ARRAY_SIZE(nuc970_ksz8851_resource),.resource       = nuc970_ksz8851_resource,
};
#endif

最后在static struct platform_device *nuc970_public_dev[] __initdata中注册设备

#ifdef CONFIG_KS8851_MLL&nuc970_device_ksz8851,
#endif

void __init nuc970_platform_init(struct platform_device **device, int size)函数会调用platform_add_devices(nuc970_public_dev, ARRAY_SIZE(nuc970_public_dev));来进行设备注册

嵌入式linux驱动开发--设备资源描述相关推荐

  1. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之设备树模型

    文章目录 前言 1.设备树的作用 2.设备树的语法 2.1.设备树的逻辑图和dts文件.dtb文件 2.1.1.1Devicetree格式 1DTS文件的格式 node的格式 properties的格 ...

  2. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之LED模板驱动程序的改造:设备树

    文章目录 前言 1.驱动的三种编写方法 2.怎么使用设备树写驱动程序 2.1.设备树节点要与platform_driver能匹配 2.2.修改platform_driver的源码 3.实验和调试技巧 ...

  3. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之总线设备驱动模型

    文章目录 前言 1.驱动编写的三种方法 1.1.传统写法 1.2.总线驱动模型 1.3.设备树驱动模型 2.Linux实现分离:Bus/Dev/Drv模型 2.1.Bus/Dev/Drv模型 2.2. ...

  4. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之Pinctrl子系统和GPIO子系统的使用

    文章目录 前言 1.Pinctrl子系统 1.1.为什么有Pinctrl子系统 1.2.重要的概念 1.3.代码中怎么引用pinctrl 2.GPIO子系统 2.1.为什么有GPIO子系统 2.2.在 ...

  5. 嵌入式 Linux 驱动开发你想知道的都在这

    最近看到公众号上写的一篇文章,关于嵌入式 Linux 驱动开发的方方面面,感觉提供不错,此处特意贴出来供大家参考借鉴. 1.嵌入式驱动开发到底学什么 嵌入式大体分为以下四个方向: 嵌入式硬件开发:熟悉 ...

  6. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之驱动设计的思想:面向对象/分层/分离

    文章目录 前言 1.分离设计 驱动程序分析---程序分层 通用驱动程序---面向对象 个性化驱动程序---分离 APP 程序分析 前言 韦东山嵌入式Linux驱动开发基础知识学习笔记 文章中大多内容来 ...

  7. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之LED驱动框架--面向对象、分层设计思想

    文章目录 前言 1.LED驱动程序框架 1.1.对于LED驱动,我们想要什么样的接口? 1.2.LED驱动要怎么写,才能支持多个板子?分层写 1.3.程序分析 驱动程序 应用程序 Makefile 1 ...

  8. 华清远见嵌入式Linux驱动开发培训班

    课程背景 开放的 Linux 受到广泛的欢迎,得到越来越多公司的支持,但是阻碍 Linux 在各个领域广泛应用的主要因素就是内核/驱动高端人才极度缺乏,Linux源代码中85%是设备驱动,嵌入式系统中 ...

  9. 嵌入式Linux驱动开发【学习小结】

    文章目录 前言 一.嵌入式Linux驱动程序和单片机裸奔有啥区别? 二.为什么需要嵌入式Linux驱动开发 三.驱动程序框架大致演变过程 总结 前言 随着去嵌入式设备资源不断丰富,主频不断升高,搭载操 ...

最新文章

  1. matplotlib色彩填充之fill、fill_between
  2. S8会成为三星移动的转折点吗?
  3. Python中遍历整个列表及注意点(参考书籍Python编程从入门到实践)
  4. windows下mysql命令_windows下的mysql命令使用
  5. boost::callable_traits的return_type_t的测试程序
  6. rust腐蚀几人组队_直播圈近几年爆火的求生游戏,人渣基本已经凉凉,rust没挂不敢玩...
  7. [Java网络编程基础]TCP发送和接收数据
  8. 解决6410 WINCE6 应用层调用SetSystemPowerState api关机无效的问题
  9. c语言spi测试代码,spi_test.c的spi跟踪(spi 数据传送流程)
  10. html文件怎么导出stl文件,3D建模软件导出STL文件的小技巧(一)
  11. Tomcat几种启动报错及解决办法
  12. Python-进程相关概念
  13. idea 查看jsp是否被引用_IDEA集成Java性能分析神器JProfiler
  14. centos yum源_Linux入门珍藏课件系列第一讲:YUM源(图文)
  15. 【数据结构】顺序线性表的几种常用方法
  16. 车路云一体化融合控制系统白皮书
  17. SCI与EI检索是什么意思,包括哪些专业?
  18. 我的前端学习历程,你认同吗
  19. 北京各城区二手房数据分析+可视化
  20. ros spin spinone 详细解释

热门文章

  1. 【学术篇】不知道该起啥标题了怎么办OvO
  2. 新版导航条stacknavigator
  3. Linux 之鸟哥的私房菜
  4. 解决pycharm sql语句 No data sources are configured to run this SQL and provide advanced的问题
  5. 手机写python爬虫_可以写爬虫的那么多,为什么只有python火了?
  6. 疫情影响下我们需要什么样的房子
  7. 运维系统常用健康度模型浅析
  8. 期望DP——珂学送分
  9. 人工智能学习(九):贝叶斯网路——墨大版
  10. 蓝桥杯 BASIC-21 基础练习 Sine之舞