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驱动分层分离的更多相关文章

  1. linux驱动分层分离思想

    转:https://blog.csdn.net/zqixiao_09/article/details/51088887 前面我们学习I2C.USB.SD驱动时,有没有发现一个共性,就是在驱动开发时,每 ...

  2. 【linux】驱动-5-驱动框架分层分离&实战

    目录 前言 5. 分离分层 5.1 回顾-设备驱动实现 5.2 分离分层 5.3 设备 5.4 驱动 5.5 系统,模块 5.6 Makefile 参考: 前言 5. 分离分层 本章节记录实现LED驱 ...

  3. 基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九-2)

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

  4. 14.LINUX-platform机制实现驱动层分离(详解)

    版权声明:本文为博主原创文章,未经博主允许不得转载. 本节目标:        学习platform机制,如何实现驱动层分离 1.先来看看我们之前分析输入子系统的分层概念,如下图所示: 如上图所示,分 ...

  5. Linux下 USB设备驱动分析(原创)

    之前做过STM32的usb HID复合设备,闲来看看linux下USB设备驱动是怎么一回事, 参考资料基于韦东山JZ2440开发板,以下,有错误欢迎指出. 1.准备知识 1.1USB相关概念: USB ...

  6. linux设备驱动程序--串行通信驱动框架分析

    linux 串行通信接口驱动框架 在学习linux内核驱动时,不论是看linux相关的书籍,又或者是直接看linux的源码,总是能在linux中看到各种各样的框架,linux内核极其庞杂,linux各 ...

  7. Linux 下的两种分层存储方案

    背景介绍 随着固态存储技术 (SSD),SAS 技术的不断进步和普及,存储介质的种类更加多样,采用不同存储介质和接口的存储设备的性能出现了很大差异.SSD 相较于传统的机械硬盘,由于没有磁盘的机械转动 ...

  8. TODO:Linux安装PHP MongoDB驱动

    TODO:Linux安装PHP MongoDB驱动 PHP利于学习,使用广泛,主要适用于Web开发领域. MongoDB的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)以及传统的RDBMS系统 ...

  9. linux下的声卡驱动架构

    1.linux下的声卡驱动架构主要分为OSS架构和ALSA架构. 2.OSS架构 OSS全称是Open Sound System,叫做开放式音频系统,这种早期的音频系统这种基于文件系统的访问方式,这意 ...

随机推荐

  1. 微软Azure虚拟机备份服务在中国发布

    近期,Azure虚拟机备份服务在微软智能云上发布. 相关功能阐述: Azure IaaS虚拟机备份服务针对Windows操作系统,提供了应用一致性的备份技术:同时针对Linux操作系统,提供了文件系统 ...

  2. HDFS元数据管理机制

    元数据管理概述 HDFS元数据,按类型分,主要包括以下几个部分: 1.文件.目录自身的属性信息,例如文件名,目录名,修改信息等. 2.文件记录的信息的存储相关的信息,例如存储块信息,分块情况,副本个数 ...

  3. win10系统 WMI Provider Host cpu 占用过高

    今天上班,发现系统有点卡,QQ总是没响应. 打开任务管理器,发现有一个程序- WMI Provider Host 占用cpu竟然高达80% 然后通过事件查看器发现是一个pid为9832的程序造成的 然 ...

  4. 记一次JVM调优之旅(斗争full gc)

    俗话说技多不压身,当年苦读<深入理解JVM>还专门整理了笔记,现在就用上了- 笔记 http://www.cnblogs.com/syjkfind/p/3901774.html [症状]  ...

  5. memcached php-memcache 扩展

    1.安装 libevent wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz tar ...

  6. Ubuntu Tweak (linux下的优化大师)

    Ubuntu Tweak 是中国人开发的一款专门为Ubuntu准备的配置.调整工具,它类似与compiz,但是界面更友好. 下面是安装命令: 第一步:添加tweak源 sudo add-apt-rep ...

  7. ApiServer_YiChat apache项目布置过程

    1.复制文件到   /var/www/  文件夹下 2.配置项目目录 3.修改/var/www/api/public 文件夹下的隐藏文件  .htaccess     增加‘?’号 4.打开/etc/ ...

  8. (转)C++ 自由存储区是否等价于堆?

      “free store” VS “heap” 当我问你C++的内存布局时,你大概会回答: “在C++中,内存区分为5个区,分别是堆.栈.自由存储区.全局/静态存储区.常量存储区”. 如果我接着问你 ...

  9. 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 ...

  10. MyBatis(2)增删改查

    本次全部学习内容:MyBatisLearning   查: 根据id查询用户信息,得到一个用户信息   在User.xml文件中添加代码: <mapper namespace="tes ...