linux架构下platform总线详解——神文,值得一看

2024-02-05 08:58

本文主要是介绍linux架构下platform总线详解——神文,值得一看,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://blog.csdn.net/qq_21792169/article/details/48750667

http://blog.csdn.net/qq_21792169/article/details/48750667


linux架构下platform总线详解

原创 2015年09月26日 12:16:41

      学习驱动一定要掌握驱动的模型,platform总线在内核中用的非常频繁,还有一个是Input输入子系统,platform总线的好处是,inux从2.6起就加入了一套新的驱动管理和注册的机制platform平台总线,是一条虚拟的总线,设备用platform_device表示,驱动用platform_driver进行注册。于传统的bus/device/driver机制相比,platform由内核进行统一管理,在驱动中使用资源,提高了代码的安全性和可移植性。当硬件部分的时序变了或者芯片替换了,我们只需要修改硬件部分的代码,还有一部分代码是属于内核的稳定部分是不用修改的,这就是一种通用的接口。


从Linux2.6内核起,引入一套新的驱动管理和注册机制:platform_device 和 platform_driver 。Linux 中大部分的设备驱动,都可以使用这套机制,设备用 platform_device 表示;驱动用platform_driver 进行注册。
platform_device 结构定义如下:


platform_driver 定义如下:


系统为platform总线定义一个bus_type的实例platform_bus_type,通过其成员函数match(),确定device和driver如何匹配。 
  匹配platform_device和platform_driver主要看二者的name字段是否相同。(name必须要相同才能匹配) 
  用platform_device_register()函数注册单个的平台设备。platform_driver_register()函数注册驱动文件


硬件结构资源放在struct resource 这个结构中:


我们通常关心start、end 和flags 这3 个字段,分别标明资源的开始值、结束值和类型,flags 可以为IORESOURCE_IO、IORESOURCE_MEM、IORESOURCE_IRQ、IORESOURCE_DMA 等

在device文件中定义这些资源,我们在driver文件中去获取资源,可以用如下函数:




其中struct platform_device *pdev是probe函数传入的参数,type是resource结构体flags变量的类型,num是拥有flags类型资源的个数。

bus_dev_drv模型

dev:(属于不稳定的部分)
platform_device_register(&led_dev);
static struct resource led_resource[] = {
platform_device_unregister(&led_dev);


static struct resource led_resource[] = {

    [0] = {
        .start = 0x56000010,           //gpio_con gpio_dat两个寄存器占八个字节
        .end   = 0x56000010 + 8 - 1,//所以需要映射长八个字节
        .flags = IORESOURCE_MEM,
    },
    [1] = {
        .start  = 8,
        .end   = 8,
        .flags = IORESOURCE_IRQ,
    }
};

static void led_release(struct device * dev)
{
}

static struct platform_device led_dev = {
.name         = "myled",
.id       = -1,
.num_resources    = ARRAY_SIZE(led_resource),
.resource     = led_resource,
.dev = { 
.release = led_release, 
},
};


drv:(稳定的部分)
struct platform_driver led_drv = {
.probe = led_probe,
.remove = led_remove,
.driver = {
.name = "myled",
}
};


platform_driver_register(&led_drv);
platform_driver_unregister(&led_drv);
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);//这两个函数用开获取资源

tips:在这里这个结构体里面的name必须和dev里面的name一致,只有相同的时候才会调用led_probe
其他的跟写普通的字符设备驱动是不变的



这里建讲解一个小的技巧,当映射多个连续的地址时候,我们定义成结构体,映射成结构体的地址
struct s3c_ts_regs {
unsigned long adccon;
unsigned long adctsc;
unsigned long adcdly;
unsigned long adcdat0;
unsigned long adcdat1;
unsigned long adcupdn;
};


 struct s3c_ts_regs    *s3c_ts_regs;   /* 定义结构体指针,结构体成员必须是4字节对齐 */
  s3c_ts_regs = ioremap(0x58000000, sizeof(struct s3c_ts_regs));





这篇关于linux架构下platform总线详解——神文,值得一看的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/680393

相关文章

Oracle的to_date()函数详解

《Oracle的to_date()函数详解》Oracle的to_date()函数用于日期格式转换,需要注意Oracle中不区分大小写的MM和mm格式代码,应使用mi代替分钟,此外,Oracle还支持毫... 目录oracle的to_date()函数一.在使用Oracle的to_date函数来做日期转换二.日

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

Linux磁盘分区、格式化和挂载方式

《Linux磁盘分区、格式化和挂载方式》本文详细介绍了Linux系统中磁盘分区、格式化和挂载的基本操作步骤和命令,包括MBR和GPT分区表的区别、fdisk和gdisk命令的使用、常见的文件系统格式以... 目录一、磁盘分区表分类二、fdisk命令创建分区1、交互式的命令2、分区主分区3、创建扩展分区,然后

Linux中chmod权限设置方式

《Linux中chmod权限设置方式》本文介绍了Linux系统中文件和目录权限的设置方法,包括chmod、chown和chgrp命令的使用,以及权限模式和符号模式的详细说明,通过这些命令,用户可以灵活... 目录设置基本权限命令:chmod1、权限介绍2、chmod命令常见用法和示例3、文件权限详解4、ch

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

Linux内核之内核裁剪详解

《Linux内核之内核裁剪详解》Linux内核裁剪是通过移除不必要的功能和模块,调整配置参数来优化内核,以满足特定需求,裁剪的方法包括使用配置选项、模块化设计和优化配置参数,图形裁剪工具如makeme... 目录简介一、 裁剪的原因二、裁剪的方法三、图形裁剪工具四、操作说明五、make menuconfig

Linux使用nohup命令在后台运行脚本

《Linux使用nohup命令在后台运行脚本》在Linux或类Unix系统中,后台运行脚本是一项非常实用的技能,尤其适用于需要长时间运行的任务或服务,本文我们来看看如何使用nohup命令在后台... 目录nohup 命令简介基本用法输出重定向& 符号的作用后台进程的特点注意事项实际应用场景长时间运行的任务服

详解Java中的敏感信息处理

《详解Java中的敏感信息处理》平时开发中常常会遇到像用户的手机号、姓名、身份证等敏感信息需要处理,这篇文章主要为大家整理了一些常用的方法,希望对大家有所帮助... 目录前后端传输AES 对称加密RSA 非对称加密混合加密数据库加密MD5 + Salt/SHA + SaltAES 加密平时开发中遇到像用户的

什么是cron? Linux系统下Cron定时任务使用指南

《什么是cron?Linux系统下Cron定时任务使用指南》在日常的Linux系统管理和维护中,定时执行任务是非常常见的需求,你可能需要每天执行备份任务、清理系统日志或运行特定的脚本,而不想每天... 在管理 linux 服务器的过程中,总有一些任务需要我们定期或重复执行。就比如备份任务,通常会选在服务器资