嵌入式linux驱动开发--设备资源描述
本章在以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驱动开发--设备资源描述相关推荐
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之设备树模型
文章目录 前言 1.设备树的作用 2.设备树的语法 2.1.设备树的逻辑图和dts文件.dtb文件 2.1.1.1Devicetree格式 1DTS文件的格式 node的格式 properties的格 ...
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之LED模板驱动程序的改造:设备树
文章目录 前言 1.驱动的三种编写方法 2.怎么使用设备树写驱动程序 2.1.设备树节点要与platform_driver能匹配 2.2.修改platform_driver的源码 3.实验和调试技巧 ...
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之总线设备驱动模型
文章目录 前言 1.驱动编写的三种方法 1.1.传统写法 1.2.总线驱动模型 1.3.设备树驱动模型 2.Linux实现分离:Bus/Dev/Drv模型 2.1.Bus/Dev/Drv模型 2.2. ...
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之Pinctrl子系统和GPIO子系统的使用
文章目录 前言 1.Pinctrl子系统 1.1.为什么有Pinctrl子系统 1.2.重要的概念 1.3.代码中怎么引用pinctrl 2.GPIO子系统 2.1.为什么有GPIO子系统 2.2.在 ...
- 嵌入式 Linux 驱动开发你想知道的都在这
最近看到公众号上写的一篇文章,关于嵌入式 Linux 驱动开发的方方面面,感觉提供不错,此处特意贴出来供大家参考借鉴. 1.嵌入式驱动开发到底学什么 嵌入式大体分为以下四个方向: 嵌入式硬件开发:熟悉 ...
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之驱动设计的思想:面向对象/分层/分离
文章目录 前言 1.分离设计 驱动程序分析---程序分层 通用驱动程序---面向对象 个性化驱动程序---分离 APP 程序分析 前言 韦东山嵌入式Linux驱动开发基础知识学习笔记 文章中大多内容来 ...
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之LED驱动框架--面向对象、分层设计思想
文章目录 前言 1.LED驱动程序框架 1.1.对于LED驱动,我们想要什么样的接口? 1.2.LED驱动要怎么写,才能支持多个板子?分层写 1.3.程序分析 驱动程序 应用程序 Makefile 1 ...
- 华清远见嵌入式Linux驱动开发培训班
课程背景 开放的 Linux 受到广泛的欢迎,得到越来越多公司的支持,但是阻碍 Linux 在各个领域广泛应用的主要因素就是内核/驱动高端人才极度缺乏,Linux源代码中85%是设备驱动,嵌入式系统中 ...
- 嵌入式Linux驱动开发【学习小结】
文章目录 前言 一.嵌入式Linux驱动程序和单片机裸奔有啥区别? 二.为什么需要嵌入式Linux驱动开发 三.驱动程序框架大致演变过程 总结 前言 随着去嵌入式设备资源不断丰富,主频不断升高,搭载操 ...
最新文章
- matplotlib色彩填充之fill、fill_between
- S8会成为三星移动的转折点吗?
- Python中遍历整个列表及注意点(参考书籍Python编程从入门到实践)
- windows下mysql命令_windows下的mysql命令使用
- boost::callable_traits的return_type_t的测试程序
- rust腐蚀几人组队_直播圈近几年爆火的求生游戏,人渣基本已经凉凉,rust没挂不敢玩...
- [Java网络编程基础]TCP发送和接收数据
- 解决6410 WINCE6 应用层调用SetSystemPowerState api关机无效的问题
- c语言spi测试代码,spi_test.c的spi跟踪(spi 数据传送流程)
- html文件怎么导出stl文件,3D建模软件导出STL文件的小技巧(一)
- Tomcat几种启动报错及解决办法
- Python-进程相关概念
- idea 查看jsp是否被引用_IDEA集成Java性能分析神器JProfiler
- centos yum源_Linux入门珍藏课件系列第一讲:YUM源(图文)
- 【数据结构】顺序线性表的几种常用方法
- 车路云一体化融合控制系统白皮书
- SCI与EI检索是什么意思,包括哪些专业?
- 我的前端学习历程,你认同吗
- 北京各城区二手房数据分析+可视化
- ros spin spinone 详细解释