Linux-3.5-Exynos4412驱动分层分离
linux-3.5/Documentation/driver-model/bus.txt
先写一个简单的例子,是为了给学习platform做准备。
dev.h
#ifndef JASON_DEV_H_
#define JASON_DEV_H_ #include <linux/device.h> struct pridevice {
struct device device;
char *name;
}; #endif
#include <linux/module.h>
#include <linux/init.h>
#include <linux/syscalls.h>
#include <linux/io.h>
#include <linux/uaccess.h> #include "dev.h" static int mara_match(struct device *dev, struct device_driver *drv)
{
struct pridevice *pdev = container_of(dev, struct pridevice, device); printk("match: %s device try match %s driver...\n", pdev->name, drv->name); return !strcmp(pdev->name, drv->name );
//返回值为1代表匹配成功,为0则失败
} static struct bus_type demobus = {
.name = "marathon",
.match = mara_match,
};
EXPORT_SYMBOL_GPL(demobus); module_driver(demobus, bus_register, bus_unregister); MODULE_LICENSE("GPL"); MODULE_AUTHOR("no name");
MODULE_VERSION("J-15");
MODULE_DESCRIPTION("a simple demo for driver module");
bus.c
#include <linux/module.h>
#include <linux/init.h>
#include <linux/syscalls.h>
#include <linux/io.h>
#include <linux/uaccess.h> #include "dev.h" extern struct bus_type demobus; static void demo_release(struct device *dev)
{
struct pridevice *pdev = container_of(dev, struct pridevice, device); printk("%s device is released....\n", pdev->name);
} static struct pridevice demodev1 = {
.device = {
.init_name = "spring_1",
.bus = &demobus,
.release = demo_release,
},
.name = "spring",
}; static int demo_init1(void)
{
return device_register(&demodev1.device);
} /*此宏用于指定驱动的入口函数, 内核启动或插入模块到内核时被调用*/
module_init(demo_init1); static void demo_exit1(void)
{
device_unregister(&demodev1.device);
} /*此宏用于指定驱动模块输出函数*/
module_exit(demo_exit1); MODULE_LICENSE("GPL"); MODULE_AUTHOR("no name");
MODULE_VERSION("J-15");
MODULE_DESCRIPTION("a simple demo for driver module");
dev.c
#include <linux/module.h>
#include <linux/init.h>
#include <linux/syscalls.h>
#include <linux/io.h>
#include <linux/uaccess.h> #include "dev.h" extern struct bus_type demobus; static int demo_probe (struct device *dev)
{
/*
当总线的match函数返回1时,则由内核调用驱动对象的probe指针指向的
函数
*/ struct pridevice *pdev = container_of(dev, struct pridevice, device);
struct device_driver *pdrv = dev->driver; printk("probe: %s driver do %s device...\n",
pdrv->name, pdev->name); return ;
} static int demo_remove (struct device *dev)
{
struct pridevice *pdev = container_of(dev, struct pridevice, device);
struct device_driver *pdrv = dev->driver; printk("remove: %s driver remove %s device...\n",
pdrv->name, pdev->name); return ;
} static struct device_driver demodrv1 = {
.name = "spring",
.bus = &demobus,
.probe = demo_probe,
.remove = demo_remove,
}; module_driver(demodrv1, driver_register, driver_unregister); MODULE_LICENSE("GPL"); MODULE_AUTHOR("no name");
MODULE_VERSION("J-15");
MODULE_DESCRIPTION("a simple demo for driver module");
drv.c
查看总线:

insmod bus.ko 查看总线:

生成的:marathon
目前还没有加载dev drv
加载驱动后:

platform 总线是内核自身已经注册好的一种总线,我们无须再注册,直接根据总线的匹配规则
来管理设备对象和驱动对象。那么设备对象和驱动对象的类型如下:
参考手册:linux-3.5/Documentation/driver-model/platform.txt


匹配规则:

看完理解之后,常用第二种和第三种匹配规则:
第二种匹配规则:

Linux-3.5-Exynos4412驱动分层分离的更多相关文章
- linux驱动分层分离思想
转:https://blog.csdn.net/zqixiao_09/article/details/51088887 前面我们学习I2C.USB.SD驱动时,有没有发现一个共性,就是在驱动开发时,每 ...
- 【linux】驱动-5-驱动框架分层分离&实战
目录 前言 5. 分离分层 5.1 回顾-设备驱动实现 5.2 分离分层 5.3 设备 5.4 驱动 5.5 系统,模块 5.6 Makefile 参考: 前言 5. 分离分层 本章节记录实现LED驱 ...
- 基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九-2)
作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...
- 14.LINUX-platform机制实现驱动层分离(详解)
版权声明:本文为博主原创文章,未经博主允许不得转载. 本节目标: 学习platform机制,如何实现驱动层分离 1.先来看看我们之前分析输入子系统的分层概念,如下图所示: 如上图所示,分 ...
- Linux下 USB设备驱动分析(原创)
之前做过STM32的usb HID复合设备,闲来看看linux下USB设备驱动是怎么一回事, 参考资料基于韦东山JZ2440开发板,以下,有错误欢迎指出. 1.准备知识 1.1USB相关概念: USB ...
- linux设备驱动程序--串行通信驱动框架分析
linux 串行通信接口驱动框架 在学习linux内核驱动时,不论是看linux相关的书籍,又或者是直接看linux的源码,总是能在linux中看到各种各样的框架,linux内核极其庞杂,linux各 ...
- Linux 下的两种分层存储方案
背景介绍 随着固态存储技术 (SSD),SAS 技术的不断进步和普及,存储介质的种类更加多样,采用不同存储介质和接口的存储设备的性能出现了很大差异.SSD 相较于传统的机械硬盘,由于没有磁盘的机械转动 ...
- TODO:Linux安装PHP MongoDB驱动
TODO:Linux安装PHP MongoDB驱动 PHP利于学习,使用广泛,主要适用于Web开发领域. MongoDB的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)以及传统的RDBMS系统 ...
- linux下的声卡驱动架构
1.linux下的声卡驱动架构主要分为OSS架构和ALSA架构. 2.OSS架构 OSS全称是Open Sound System,叫做开放式音频系统,这种早期的音频系统这种基于文件系统的访问方式,这意 ...
随机推荐
- Access 64-bit HKLM\Software Registry by 32-bit C#.NET Application
http://www.codeproject.com/Articles/1003177/Access-bit-HKLM-Software-Registry-by-bit-Csharp-NE While ...
- [转] 你应该知道的应用UI动态设计规则
转自 CocoaChina http://www.cocoachina.com/macdev/uiue/2014/0505/8315.html 你应该知道的应用UI动态设计规则 这篇文章中,我主要阐述 ...
- Beyond Compare 4的试用期过了怎么办
修改配置文件(C:\Users\gaojs\AppData\Roaming\BCompare\BCompare.ini)中的时间戳. 时间戳在线转换:https://tool.lu/timestamp ...
- Python学习---重点模块之logging
日志级别 日志级别 critical > error > warning > info > debug, 默认是从warning开始打印 import logging # 日 ...
- IE浏览器兼容问题(下)——IE6的常见问题
IE6常见兼容性问题 1.盒模型问题 (1)DTD问题 DTD:文档定义类型,规定了要遵循的书写规范. 如果不写DTD,高级浏览器还是可以正常加载,IE6会以怪异模式进行加载. 盒模型:正常应该是外扩 ...
- php解决高并发设想
1.我突然想到一个解决系统并发的一个方法, 当然不算太友好, 就是并发时候,首先加载系统负载量文件, 如果到达一个值,比如60%,就跳到404页面,或者输出稍后之类的这样 2.静态文件和图片存到cdn ...
- Struts2学习-json
Struts2 实现JSON输出有2种办法1.把Action变成Servlet,使用传统做法2.使用Struts 内置功能完成 二. 1.导入配置,pom.xml,要去struts2的官网下载mvnr ...
- awrsqrpt.sql简介
ORACLE_HOME/RDBMS/admin/awrsqrpt.sql 这个脚本可以很方便地取出某个sql在某两个快照间隔内,消耗cpu时间,执行次数,逻辑读,物理读,sql的执行计划以及sql的 ...
- [EffectiveC++]item36:绝不重新定义继承而来的non-virtual函数
- web 应用程序转化为多租户 SaaS 解决方案
web 应用程序转化为多租户 SaaS 解决方案 https://www.ibm.com/developerworks/cn/cloud/library/cl-multitenantsaas/inde ...