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,叫做开放式音频系统,这种早期的音频系统这种基于文件系统的访问方式,这意 ...
随机推荐
- 微软Azure虚拟机备份服务在中国发布
近期,Azure虚拟机备份服务在微软智能云上发布. 相关功能阐述: Azure IaaS虚拟机备份服务针对Windows操作系统,提供了应用一致性的备份技术:同时针对Linux操作系统,提供了文件系统 ...
- HDFS元数据管理机制
元数据管理概述 HDFS元数据,按类型分,主要包括以下几个部分: 1.文件.目录自身的属性信息,例如文件名,目录名,修改信息等. 2.文件记录的信息的存储相关的信息,例如存储块信息,分块情况,副本个数 ...
- win10系统 WMI Provider Host cpu 占用过高
今天上班,发现系统有点卡,QQ总是没响应. 打开任务管理器,发现有一个程序- WMI Provider Host 占用cpu竟然高达80% 然后通过事件查看器发现是一个pid为9832的程序造成的 然 ...
- 记一次JVM调优之旅(斗争full gc)
俗话说技多不压身,当年苦读<深入理解JVM>还专门整理了笔记,现在就用上了- 笔记 http://www.cnblogs.com/syjkfind/p/3901774.html [症状] ...
- memcached php-memcache 扩展
1.安装 libevent wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz tar ...
- Ubuntu Tweak (linux下的优化大师)
Ubuntu Tweak 是中国人开发的一款专门为Ubuntu准备的配置.调整工具,它类似与compiz,但是界面更友好. 下面是安装命令: 第一步:添加tweak源 sudo add-apt-rep ...
- ApiServer_YiChat apache项目布置过程
1.复制文件到 /var/www/ 文件夹下 2.配置项目目录 3.修改/var/www/api/public 文件夹下的隐藏文件 .htaccess 增加‘?’号 4.打开/etc/ ...
- (转)C++ 自由存储区是否等价于堆?
“free store” VS “heap” 当我问你C++的内存布局时,你大概会回答: “在C++中,内存区分为5个区,分别是堆.栈.自由存储区.全局/静态存储区.常量存储区”. 如果我接着问你 ...
- JAVA中日期 yyyy-MM-dd HH:mm:ss和yyyy-MM-dd hh:mm:ss的区别
JAVA中日期 yyyy-MM-dd HH:mm:ss和yyyy-MM-dd hh:mm:ss的区别 : HH:24小时制 hh:12小时制 package time; import java.tex ...
- MyBatis(2)增删改查
本次全部学习内容:MyBatisLearning 查: 根据id查询用户信息,得到一个用户信息 在User.xml文件中添加代码: <mapper namespace="tes ...