Linux 驱动学习方法 与关键技术 - IT培训|学习...
Transcript of Linux 驱动学习方法 与关键技术 - IT培训|学习...
华清远见 今天的内容
ϖglobalmem/globalfifoϖ总线、设备与驱动
ϖplatform 设备、驱动和总线ϖLinux 设备驱动的分层思想ϖLinux 主机与外设驱动的分离
华清远见 globalmem/globalfifoϖ理解字符设备驱动架构ϖ理解内核并发处理ϖ理解阻塞、非阻塞ϖ理解异步 I / Oϖ理解内核基本 API
华清远见
花卉类
设备
总线
设备、总线与驱动
水果类
华清远见 驱动模型与 sysfs
总线 设备
...
类
驱动 设备 xxx所属类 yyy所属类
xxx设备
yyy驱动 xxx驱动 yyy设备 xxx设备 xxx设备yyy设备
...
yyy设备
2345678910
2345
华清远见
1 struct platform_device {
platform 设备、总线与驱动
2 const char3 u32
* name;/* 设备名 */id;
4 struct device dev;5 u32 num_resources;/* 设备所使用各类资源数量 */6 struct resource * resource;/* 资源 */7 };
1 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 pm_ext_ops *pm;struct device_driver driver;
11};
1 struct bus_type platform_bus_type = {
.name
.dev_attrs
.match
.uevent
= "platform",= platform_dev_attrs,= platform_match,= platform_uevent,
67 };
.pm = PLATFORM_PM_OPS_PTR,
3
56
华清远见 platform 设备与驱动的匹配
1 static int platform_match(struct device *dev, struct device_driver *drv)
2 {struct platform_device *pdev;
4pdev = container_of(dev, struct platform_device, dev);return (strncmp(pdev->name, drv->name, BUS_ID_SIZE) == 0);
7 }
华清远见 globalfifo 作为 platform 驱动
44 static struct platform_driver globalfifo_device_driver = {45 .probe = globalfifo_probe,46 .remove = __devexit_p(globalfifo_remove),47 .driver = {48 .name = "globalfifo",49 .owner = THIS_MODULE,50 }51 };5253 static int __init globalfifo_init(void)54 {55 return platform_driver_register(&globalfifo_device_driver);56 }5758 static void __exit globalfifo_exit(void)59 {60 platform_driver_unregister(&globalfifo_device_driver);61 }
华清远见 板文件中的 globalfifo 设备
1 static struct platform_device globalfifo_device = {2 .name = "globalfifo",3 .id = 1,4 };
static struct platform_device *ldd6410_devices[] __initdata = {+ & globalfifo_device,#ifdef CONFIG_FB_S3C_V2
&s3c_device_fb,#endif
&s3c_device_hsmmc0,...
}
华清远见 platform 资源、数据1 struct resource {2 resource_size_t start;3 resource_size_t end;4 const char *name;5 unsigned long flags;6 struct resource *parent, *sibling, *child;7 };
static struct dm9000_plat_data ldd6410_dm9000_platdata = {.flags = DM9000_PLATF_16BITONLY |
DM9000_PLATF_NO_EEPROM,.dev_addr = { 0x0, 0x16, 0xd4, 0x9f, 0xed, 0xa4 },
};
static struct platform_device ldd6410_dm9000 = {.name = "dm9000",.id = 0,.num_resources = ARRAY_SIZE(ldd6410_dm9000_resource),.resource = ldd6410_dm9000_resource,.dev = {
.platform_data = &ldd6410_dm9000_platdata,}
};
华清远见 platform 的作用1. 使得设备被挂接在一个总线上,因此,符合 Linux2.6 的设备模型。其结果是,配套的 sysfs 结点、设备电源管理都成为可能。
2. 隔离 BSP 和驱动。在 BSP 中定义 platform 设备和设备使用的资源、设备的具体配置信息,而在驱动中,只需要通过通用 API 去获取资源和数据,做到了板相关代码和驱动代码的分离,使得驱动具有更好的可扩展性和跨平台性。
华清远见 Linux 设备驱动的分层
华清远见 Linux input 设备驱动的分层
华清远见 Linux 主机驱动与外设驱动分离
主机控制器 A驱动
外设 a 驱动
主机控制器 B驱动
核心层:主机驱动通用 API
外设 b 驱动
主机控制器 C驱动
外设 c 驱动
华清远见 文档与参考实例
http://21cnbao.blog.51cto.com/109393/333312http://21cnbao.blog.51cto.com/109393/336263http://21cnbao.blog.51cto.com/109393/337609
¬
¬
¬
¬
νννν
ν
华清远见
Linux 设备驱动开发详解第 2 版即将出版ϖ 主要出发点开发 LDD6410 SAMSUNG S3C6410 开发板,所有实例均可在该板上直接运行和学习
全面升级为 Linux 2.6.28.6 内核,对 Linux 内核最新 API 和驱动子系统架构的变化进行介绍
对第一版中部分知识点进行整理和重新讲解
¬ 删除过时内容
新增大量内容:
SPI 主机和设备驱动ALSA SoC 架构驱动USB 设备控制器/ gadget 驱动/ USB OTG 驱动内核移植( BSP 构建与开发)
ν
ν
Android 驱动驱动开发分层、主机与外设分离思想
...
华清远见让我们一起讨论!