led驱动编写-使用驱动框架

用python提取PDF中各类文本内容的方法 阅读详情

前言

驱动开发框架由内核开发人员提供,SOC开发人员根据内核提供的驱动框架编写适合的硬件驱动,开发板厂商负责移植驱动到自己生产的开发板上,三者分工不同。

1 框架源码

文件路径: x210_kernel\drivers\leds
在这里插入图片描述
上面两个C源码文件由内核开发人员提供,简化了驱动开发的过程,例如:mknod /dev/名字 c 200 0

创建设备绑定主次设备号,这个步骤已经被包含在了框架里面,不需要自己在命令行中手动绑定。

框架中还提供了更加简便的字符设备注册函数,对注册的步骤进行了封装。

使用框架可以快速的进行驱动开发,和不使用框架开发实现的功能是相同的。

2 驱动源码

源码位置: kernel/drivers/leds/leds-s5pv210.c
平台总线式驱动注册

#include <linux/module.h>               // module_init  module_exit
#include <linux/init.h>                 // __init   __exit
#include <linux/fs.h>
#include <linux/leds.h>
#include <mach/regs-gpio.h>
#include <mach/gpio-bank.h>
#include <linux/io.h>
#include <linux/ioport.h>
#include <mach/gpio.h>
#include <linux/platform_device.h>

#define GPIO_LED1       S5PV210_GPJ0(3)  //虚拟地址


#define X210_LED_OFF    1                       // X210中LED是正极接电源,负极节GPIO
#define X210_LED_ON             0                       // 所以1是灭,0是亮

//框架中的函数,在两个.C文件的其中之一中
static struct led_classdev mydev1;                      // 定义结构体变量




// 这个函数就是要去完成具体的硬件读写任务的
static void s5pv210_led1_set(struct led_classdev *led_cdev,
                            enum led_brightness value)
{
        printk(KERN_INFO "s5pv210_led1_set\n");

        //writel(0x11111111, GPJ0CON);

        // 在这里根据用户设置的值来操作硬件
        // 用户设置的值就是value
        //框架中使用枚举对0和255和非0且非255进行了枚举类型转换
        if (value == LED_OFF) //对应0
        {
                // 用户给了个0,希望LED灭
                //writel(0x11111111, GPJ0CON);
                // 读改写三部曲
                //writel((readl(GPJ0DAT) | (1<<3)), GPJ0DAT);
                //使用gpio库进行io寄存器设置
                gpio_set_value(GPIO_LED1, X210_LED_OFF);
        }
        else
        {
                // 用户给的是非0,希望LED亮
                //writel(0x11111111, GPJ0CON);
                //writel((readl(GPJ0DAT) & ~(1<<3)), GPJ0DAT);
                gpio_set_value(GPIO_LED1, X210_LED_ON);
        }
}


static int s5pv210_led_probe(struct platform_device *dev)
{
        // 用户insmod安装驱动模块时会调用该函数
        // 该函数的主要任务就是去使用led驱动框架提供的设备注册函数来注册一个设备
        int ret = -1;

        // 在这里去申请驱动用到的各种资源,当前驱动中就是GPIO资源
        if (gpio_request(GPIO_LED1, "led1_gpj0.3"))
        {
        	printk(KERN_ERR "gpio_request failed\n");
        }
        else
        {
                // 设置为输出模式,并且默认输出1让LED灯灭
                gpio_direction_output(GPIO_LED1, 1);
        }
        // led1
        mydev1.name = "led1"; 
        mydev1.brightness = 0;
        mydev1.brightness_set = s5pv210_led1_set;
			
		//框架封装的注册函数
        ret = led_classdev_register(NULL, &mydev1);
        if (ret < 0) {
                printk(KERN_ERR "led_classdev_register failed\n");
                return ret;
        }
        return 0;
}

static int s5pv210_led_remove(struct platform_device *dev)
{
        led_classdev_unregister(&mydev1);
        gpio_free(GPIO_LED1);
        return  0;
}
static struct platform_driver s5pv210_led_driver = {
        .probe          = s5pv210_led_probe,
        .remove         = s5pv210_led_remove,
        .driver         = {
        		//这个名字要和注册的device名字形同
                .name           = "s5pv210_led",
                .owner          = THIS_MODULE,
        },
};
static int __init s5pv210_led_init(void)
{
		/*使用平台总线的形式进行驱动注册,当前内核中注册了平台总线
		设备才能成功的注册平台总线驱动,两者注册的顺序没有现后之分,					
		两者注册的时候,都会寻找对方进行匹配*/
        return platform_driver_register(&s5pv210_led_driver);
}

static void __exit s5pv210_led_exit(void)
{
        platform_driver_unregister(&s5pv210_led_driver);
}


module_init(s5pv210_led_init);
module_exit(s5pv210_led_exit);

// MODULE_xxx这种宏作用是用来添加模块描述信息

这个驱动中使用了gpio_request这个IO口申请函数,且九鼎自己实现的led驱动,也使用了这个函数,所以需要使用menuconfig取消对leds-x210.c这个文件的编译。一个IO口只能被申请一次,内核会进行记录。
在这里插入图片描述
上述驱动源码注册的设备地址:/sys/class/leds/led/led1,led1就是注册时候的名字。可以使用echo进行写入操作,控制LED的亮灭。
在这里插入图片描述

大数据平台符合信创(CDH国产化代替)详细方案(企业内部不外传方案) 信创旨在实现信息技术产业的自主可控,减少对外部技术的依赖,从而提升国家信息安全和经济发展的自主性。在此背景下,中国对信创提出了更高的要求,以期在激烈的市场竞争中占据有利地位。信创不仅关乎技术层面的创新,更涉及到产业链条的整合与优化。它要求从基础硬件、操作系统、数据库、中间件等各个层面实现国产替代,构建完整的信息技术生态体系。尤其是在做国企项目时,就有硬性要求使用符合信创(国产代替)。在信创背景下,符合要求的产品必须具备自主可控、安全可靠以及性能卓越等核心特点。 阅读详情

相关推荐

Unity学习笔记之【IK反向动力学操作】

反向动力学,简称IK。相较于正向动力学,反向动力学旨在子级对父级产生的影响。使用IK,可以实现根据目标位置或方向来计算并调整角色的关节(骨骼)链,以使角色的末端(如手臂、腿部等)达到预期的位置或取向。通过使用 Unity 的 IK 功能,你可以实现各种复杂的角色动画效果,如角色抓取、足部对齐、手臂跟随等。 2. 将所视的目标物体拖拽绑定 4. 实现效果如下 :移动角色时注释立方体 实现效果如下

m0_47351846的博客 2954

基于led框架及gpiolib管理的驱动编写

leds-xxxx.c,这个文件是LED驱动框架的第2部分,是由不同厂商的驱动工程师编写添加的,厂商驱动工程师结合自己公司的硬件的不同情况来对LED进行操作,使用第一部分提供的接口来和驱动框架进行交互,最终实现驱动的功能。又譬如中断号也是一种资源,驱动在使用前也必须去申请。这也是驱动框架的组成部分。1、内核中驱动部分维护者针对每个种类的驱动设计一套成熟的、标准的、典型的驱动实现,然后把不同厂家的同类硬件驱动中相同的部分抽出来自己实现好,再把不同部分留出接口给具体的驱动开发工程师来实现,这就叫驱动框架。

2301_77136686的博客 559

burpsuite抓取ios数据包

1:首先在burpsuite中设置 添加proxy listeners 2:电脑开热点,手机连接,把代理设为电脑的ip和代理的端口 3:在Safari浏览器中打开网址http://burp下载证书 4:打开设置->通用->描述文件与设备管理 5:设置->通用->关于本机->证书信任设置 之后就可以正常抓包了 ...

weixin_45682070的博客 2065

通过platform总线驱动框架编写LED灯的驱动

通过platform总线驱动框架编写LED灯的驱动,编写应用程序测试。在设备树文件中添加设备树节点信息。

qq_57071955的博客 606

数据结构——滑动窗口

入:下标为 i 的元素进入窗口,更新相关统计量。如果 i < k−1 则重复第一步更新:更新答案。一般是更新最大值 / 最小值出:下标为 i−k+1 的元素离开窗口,更新相关统计量✔1. 定长子串中元音的最大数目✔2. 找到一个数字的 K 美丽值✔4. 子数组的最大平均数 |方法一:前缀和方法二:滑动窗口7. 得到 K 个黑块的最少涂色次数8. 爱生气的书店老板9. 几乎唯一子数组的最大和10. 长度为 K 子数组中的最大和11. 可获得的最大点数12. 最少交换次数来组合所有的1 ||

qq_68915288的博客 762

AxMath行间公式转化为office公式求和符号以及编号显示问题

AxMath行间公式转化为office公式求和符号以及编号显示问题问题描述解决方法 问题描述 首先打出axmath公式,如下: 转换后的OfficeMath公式: 字体先不说,word公式字体默认cambria math且无法编辑。比较难受的一点是求和符号与后面的 ai+bi2a_i+b_i^2ai​+bi2​比例不匹配啊!正常的比例应该是: (虽然也不太正常,将就下) 解决方法 点击变换后的office公式右侧,选择更改为"显示" 可以看到,多了一些软回车符号(⬇),如果你想删除它,不要直接选中

weixin_43543177的博客 4647

linux驱动开发扩展--使用LED驱动框架编写LED驱动示例

#include <linux/module.h> // module_init module_exit #include <linux/init.h> // __init __exit #include <linux/fs.h> #include <linux/string.h> #include "linux/leds.h" #include <mach/regs-gpio.h> #include <mach/gpio-ba.

linux驱动开发大纲 232

UG NX二次开发(C#)-读取PMI对象的名称

摘要:本文介绍了在UG NX中通过NXOpen获取PMI对象名称的方法。首先说明PMI对象初始无名称,可通过重命名或属性设置名称。然后提供C#代码示例,展示如何遍历PMI集合获取对象名称,并显示名称和类型信息。适用于需要操作PMI对象的开发人员,欢迎加入技术交流QQ群749492565。(99字)

GimiGimmy 590

基于platform驱动框架编写LED灯的驱动

基于platform驱动框架编写LED灯的驱动

weixin_56863787的博客 177

基于STM32、HAL库的ZMOD4510AI4R气体传感器驱动程序设计

ZMOD4510AI4R是Renesas公司推出的一款数字空气质量传感器,主要用于检测臭氧(O₃)和总挥发性有机化合物(TVOC)浓度。(status & 0x80)) // 检查数据就绪位。// 等待测量完成 (实际应用中应该使用非阻塞方式)// 转换为ppb (简化转换,实际应根据传感器文档校准)* @param hzmod: ZMOD4510句柄。* @param tvoc: TVOC浓度(ppb)* @param ozone: 臭氧浓度(ppb)* @param hi2c: I2C句柄。

corlin6688的博客 311

黑猫带你学eMMC协议第29篇:eMMC设备锁详解(CMD42)

通过cmd42命令,可以给emmc设置密码,并且锁定emmc。这时候就不能对emmc的user分区进行读写数据访问了。设备锁在V4.3版本后的emmc里面,就只能保护user area分区,因此,被锁定的emmc,依旧可以正常访问BOOT\RPMB\GPP分区。emmc内部有128 bit PWD寄存器,用来存放密码,以及有8bit PWD_LEN寄存器,用来密码长度。这两个寄存器非易失性,掉电也不会丢失。

黑猫奥利奥的博客 3236

led驱动编写——不使用驱动框架

声明 dev_t结构体变量,用来存储主次设备号。声明cdev结构体变量,用来绑定file_operations test_fops这个驱动,test_cdev.ops = test_fops。分配设备号,主设备号:200,次设备号:从0开始出始化cdev类声明的对象test_cdev中的ops成员变量,把第二个形参赋值给test_cdev.ops。第一个参数:表示被注册的设备的file ops等,第二个:主次设备号,第三:注册数量,数量在 MKDEV(x, y);y的基础上递增。

forecasts的博客 273

接口电路设计的关键要点

接口电路设计是嵌入式硬件开发的核心环节,本文系统阐述了五大关键设计要点:1)电平匹配技术,详细分析了3.3V/5V系统互连方案及转换电路计算;2)阻抗匹配原理,包括高速信号反射机制及差分信号处理;3)滤波与去耦设计,提出多级电容配置和"先电容后过孔"布局原则;4)接地设计规范,重点说明模拟/数字地分离及高速信号回流路径;5)防护电路设计,涵盖防反接、过流保护及ESD防护方案。文章通过具体计算公式、器件选型指南和布局技巧,为接口电路设计提供了系统化的解决方案,并附有设计检查清单和典型问题分

weiyvyy的博客 453

字符驱动开发之韦东山视频学习2——LED驱动框架的编写

1、普通驱动编写,一般实际操作简单的就可以直接填空,操作的最关键的地方就是init和read write ioctrl。 比如字符驱动我如果需要读取外部数据或者写入直接修改自己定义的read write,这是你自己修改的最关键的地方,在init里ioremap然后操作虚拟地址读写。 在你入口init函数里面通过register_chardev()和设备号注册,把fileoperation告诉内核,fileoperation里面是实例化的你自己写的read write ioctrl等,虽然很关键,但实际写

小吕的博客 525

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

基于platform驱动框架编写LED灯的驱动,编写应用程序测试

【代码】基于platform驱动框架编写LED灯的驱动,编写应用程序测试。

m0_48361679的博客 307

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

通过platform总线驱动框架编写LED灯的驱动,编写应用程序测试

【代码】通过platform总线驱动框架编写LED灯的驱动,编写应用程序测试。

2301_79915752的博客 641

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

通过platform总线驱动框架编写LED灯的驱动,编写应用程序驱动

【代码】通过platform总线驱动框架编写LED灯的驱动,编写应用程序驱动。

m0_61791148的博客 559

基于platform驱动框架编写LED灯的驱动,编写应用程序测试 上传优快云

【代码】基于platform驱动框架编写LED灯的驱动,编写应用程序测试 上传优快云。

designesb的博客 313

驱动框架之LED

一、什么是驱动框架? 1、驱动是谁写的? (1)驱动开发工程师; (2)内核维护者; 2、驱动编程协作要求 (1)接口标准化; (2)内核开发者应该尽量降低驱动开发者难度; 3、到底什么是驱动框架? (1)驱动框架 内核中驱动部分维护者,针对每个种类(比如LED、LCD、蜂鸣器等等)的设备,都设计有一套成熟的、标准的、典型的驱动实现; 它是把不同厂家的同类硬件驱动中相同的部分抽...

lushoumin的博客 606
上一篇: led驱动编写——不使用驱动框架
下一篇: misc类驱动编写
金银588
博客等级 码龄7年 1210粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值