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. 在 IDEA 中 配置 Maven

    1.从 Maven官网下载 最新版的 Maven  2.设置Java相关环境变量 JAVA_HOME       AVA_HOME=C:\jdk1.5.0_06 PATH                ...

  2. 求n的元素的最大最小值

    public static int[] maxMin(int a[]) { int[] res = new int[2]; int len = a.length; if (len <= 0) { ...

  3. skype for business server 2015 报错“不可用:试图检查架构状态时发生故障,请确保能够访问Active Direcotry”

    报错“不可用:试图检查架构状态时发生故障,请确保能够访问Active Direcotry” 遇到错误后就上网查询了下,有的人说用下面方法解决了 用域的administrator 登入就可以了(之前是用 ...

  4. shell命令详解

    sed命令 将文本input.txt中含有”姓名”字符串的行中的谢朝辉替换成扎巴依 sed -e '/姓名/s/谢朝辉/扎巴依/g' input.txt 将input.txt中第n(5)行替换成”ji ...

  5. SIMATIC 1500 PLC 同步轴,状态字StatusWord信号描述

    轴名. StatusWord.X21 (Synchronizing) 正在建立同步 轴名. StatusWord.X22 (Synchronous) 已经建立同步

  6. JsonPath教程

    1. 介绍 类似于XPath在xml文档中的定位,JsonPath表达式通常是用来路径检索或设置Json的.其表达式可以接受“dot–notation”和“bracket–notation”格式,例如 ...

  7. 150行JavaScript代码实现增强现实

    增强现实技术(Augmented Reality,简称 AR),是一种实时地计算摄影机影像的位置及角度并加上相应图像.视频.3D模型的技术,这种技术的目标是在屏幕上把虚拟世界套在现实世界并进行互动.这 ...

  8. 通过渲染器Shader实现图像变换效果

    在上一篇文章中,一起学习了通过设定画笔风格来实现图形变换,没读过的朋友可以点击下面链接: http://www.cnblogs.com/fuly550871915/p/4886455.html 是不是 ...

  9. c3p0整合mysql报错问题

    启动报错: [com.mchange.v2.c3p0.DriverManagerDataSource] - Could not load driverClass com.mysql.cj.jdbc.D ...

  10. PHP代码的多继承 -》 PHP代码复用新的姿势 trait

    本文参考:  http://php.net/language.oop5.traits 一.什么是trait 从PHP 5.4.0 开始 PHP 实现了一种新的代码复用方式 trait. 二.trait ...