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. NS Simulation: Scheduling Events (examples inside)

    NS Simulation: Scheduling Events Simulation time A similation system (such as NS) must have a built- ...

  2. FQDN说明

    以下摘自百度百科: FQDN:(Fully Qualified Domain Name)完全合格域名/全称域名,是指主机名加上全路径,全路径中列出了序列中所有域成员.全域名可以从逻辑上准确地表示出主机 ...

  3. xtrabackup在线迁移mysql并搭建为主主同步

    一.背景 工作中有需求数据库需要迁移,但是不能停服,不能锁库锁表影响业务的正常运行,所以使用XtraBackup 二.环境: 操作系统:CentOS Linux release 7.4.1708 (C ...

  4. asp.net c# 断点续传 下载 Accept-Ranges

    转自:http://www.cnblogs.com/90nice/p/3489287.html 1.因为要下载大文件 需要断点续传,使用多线程 分段下载 效率比较高,节省资源. 发点牢骚:下载可以用多 ...

  5. API 网关

    使用 API 网关   链接:https://github.com/oopsguy/microservices-from-design-to-deployment-chinese译者:Oopsguy ...

  6. 初识java——Java程序的历史、开发和运行

    上了一节Java试听课,整理出如下笔记.     Java最新版本下载 http://www.oracle.com/technetwork/java/javase/downloads/index.ht ...

  7. note05-计算机网络

    5.网络安全 被动攻击(UDP报文被截获 被 进行流量分析) 主动攻击 1.篡改(更改报文流 伪报文) 2.恶意程序(病毒.木马.蠕虫.炸弹) 3.拒绝服务Dos 密码体制 1.对称密钥密码体制(DE ...

  8. Ajax向Controller发送请求并接受数据需要注意的一个细节

    想用Ajax想向Controller发送请求和接收返回的字符等等.Controller中要使用@ResponseBody注解. <script type="text/javascrip ...

  9. yaml 配置文件

    https://www.cnblogs.com/xinjing-jingxin/p/9128293.html ---文件开始 - 列表 key: val 字典 注意:字典里面可以嵌套字典,列表等.(举 ...

  10. 9.spring:事务管理(下):声明式事务管理

    声明式事务管理 sprin的声明式事务是管理AOP技术实现的事务管理,其本质是是对方法前后进行拦截,然后 在目标方法开始之前创建或者加入一个事务,在执行完成目标方法之后根据执行情况提交或者回滚事务. ...