最新要闻
- 世界播报:空调安装莫任性,城管上门解民忧
- 博主揭秘成都夜市“鬼秤”套路:10家有8家不准!官方已开展调查
- 每日讯息!车企回应试驾翻车后 新款坦克500正常上市:33.50万起买高安全硬派越野
- 索尼PS VR2销量滑铁卢:首周仅有不足30万
- 天天热文:拒绝山寨卡、翻新卡!NVIDIA联合七彩虹等厂商重拳出击
- 因为一篇文章,这国将召见俄大使
- 【时快讯】抖音发布公告:“剧情演绎”类视频需注明 否则最严无限期封禁
- 全球热点评!怀念原版《RE4》艾什莉 玩家们绘制老鼠艾什莉同人图
- 世界简讯:单休女生30小时往返1300公里游6景点:第二天还要上班
- 速讯:上海交大教授李峰:医生没有创造力 非常容易被AI替代
- 澳大利亚多地暴雨洪灾 泳池频现剧毒漏斗蜘蛛:最快15分钟致死
- 当前头条:目标规模超30亿,浙江衢州拟设一支产业基金
- 每日消息!男子伪装外卖小哥偷餐 被店员一眼识破:破绽太多
- 天天微速讯:露营倒闭潮来袭?网友:准备工作繁琐 参加一次就够了
- 国产本田幼兽来了!本田Cross Cub 110上市:只需1.3万
- 【焦点热闻】集吸拖洗一体全能!追觅M13 Beta洗地机图赏
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
使用pinctrl和gpio子系统开发GPIO驱动正点原子IMX6ULL阿尔法板的LED灯
前言
在linux内核中,提供了pinctrl和gpio子系统,用于简化GPIO驱动开发。
pinctrl子系统
作用:根据设备树中的pin信息自动设置pin的复用功能和电气特性
(资料图片)
模板:
/* 在设备树文件(如阿尔法板的imx6ull-alientek-emmc.dts文件)的iomuxc节点的imx6ull-evk子节点下添加一个"pinctrl_test"节点并在该节点下添加fsl,pins属性,完整如下:*/&iomuxc {...imx6ull-evk {...pinctrl_test: testgrp {fsl,pins = ;};};};/* 注意: 1、对于IMX6ULL,pinctrl_test的test表示节点名字,testgrp表示test节点的集合,grp是group的缩写2、对于IMX6ULL,pinctrl子系统是通过fsl,pins来获取pin信息,所以该属性名不能有误3、MX6UL_PAD_GPIO1_IO00__GPIO1_IO00表示将GPIO1 IO0复用为普通IO,定义在imx6ul-pinfunc.h函数中4、config表示设置pin的电气特性,比如上/下拉,速度,驱动能力等*/
gpio子系统
作用:在设备树文件中添加gpio相关信息后,就可以在驱动程序中使用gpio的API函数来操作GPIO
模板:
/* 1、在设备树源文件(.dts后缀)的根节点下创建test设备子节点 *// {...test {/* 2、向test设备子节点中添加pinctrl信息 */pinctrl-name = "default";pinctrl-0 = <&pinctrl-test>;/* 使用保存在pinctrl-test节点的PIN信息 *//* 3、添加GPIO属性信息 */gpio = <&gpio1 0 GPIO_ACTIVE_LOW>;/* gpio表示test设备所使用的GPIO,该GPIO为gpio1的io0,在低电平时有效 */};};
常用的gpio API函数:
/*获取GPIO编号将设备树中类似<&gpio1 0 GPIO_ACTIVE_LOW>的属性转换为对应的GPIO编号*/int of_get_named_gpio(struct device_node *np, const char *propname, int index)参数:np:设备节点propname:包含GPIO信息的属性名index:GPIO索引,如果只有一个GPIO信息,此参数为0返回值:正值:获取到的GPIO编号负值:获取失败
例程
实现效果:点亮IMX6ULL阿尔法开发板的LED1、添加pinctrl节点
/* 在imx6ull-alientek-emmc.dts的iomuxc节点中添加如下内容 */&iomuxc {...imx6ull-evk {...pinctrl_led: ledgrp {fsl,pins = ;};};};
2、添加LED设备节点
/* 在imx6ull-alientek-emmc.dts的根节点中添加如下内容 *// {...gpioled {#address-cells = <1>;#size-cells = <1>;/* compatible = "atkalpha-gpioled"; *//* 该属性现阶段可以不用,文章后面我会提到为什么 */pinctrl-names = "default";pinctrl-0 = <&pinctrl_led>;led-gpio = <&gpio1 3 GPIO_ACTIVE_LOW>;status ="okay";};};
3、编写LED设备的driver文件
/***************************************************************************** * 文件名:gpioled.c * 作者:xxx * 版本:v1.0 * 描述:LED驱动文件 * 其他:无 * 日志:v1.0 23/3/29 xxx创建 * 备注:该驱动使用了pinctrl和gpio子系统 * 要使用pinctrl子系统,需要在设备树中设置PIN的配置信息 */#include #include #include #include #include #include #include #include //注册设备文件#include #include //添加到设备树#include #include //添加gpio子系统API函数#include #include #include #include #defineNEWCHRLED_CNT1/* 设备号个数 */#define NEWCHRLED_NAME"gpioled"/* 名字 */#defineLED_OFF0/* 关灯 */#defineLED_ON1/* 开灯 *//* gpioled 设备结构体 */struct gpioled_dev{dev_t devid;/* 设备号 */struct cdev cdev;/* cdev */struct class *class;/* 类 */struct device *device;/* 设备 */int major;/* 主设备号 */int minor;/* 次设备号 */struct device_node *nd;/* 设备节点 */int led_gpio;/* led所使用的GPIO编号 */};struct gpioled_dev gpioled;/* led设备 *//* * @description : 打开设备 * @param - inode : 传递给驱动的inode * @param - filp : 设备文件,在open时将file结构体的private_data成员变量指向设备结构体 * @return : 0:成功;其他:失败 */static int led_open(struct inode *inode, struct file *filp){filp->private_data = &gpioled;/* 设置私有数据 */return 0;}/* * @description : 从设备读取数据 * @param - filp : 要打开的设备文件(文件描述符) * @param - buf : 返回给用户空间的数据缓冲区 * @param - cnt : 要读取的数据数据长度 * @param - offt : 相对于文件首地址的偏移 * @return : 读取的字节数,若为负,表示读取失败 */static ssize_t led_read(struct file *filp, char __user *buf,size_t cnt, loff_t *offt){return 0;}/* * @description : 向设备写数据 * @param - filp : 设备文件,表示打开的文件描述符 * @param - buf : 要给设备写入的数据 * @param - cnt : 要写入的数据长度 * @param - offt : 写入的字节数,若为负,表示写入失败 */static ssize_t led_write(struct file *filp, const char __user *buf,size_t cnt, loff_t *offt){int retvalue;unsigned char databuf[1];unsigned char ledstat;struct gpioled_dev *dev = filp->private_data;retvalue = copy_from_user(databuf, buf, cnt);if (retvalue < 0){printk("kernel write failed!\r\n");return -EFAULT;}ledstat = databuf[0];/* 获取状态值 */if (ledstat == LED_ON){gpio_set_value(dev->led_gpio, 0);/* 打开LED */} else if (ledstat == LED_OFF){gpio_set_value(dev->led_gpio, 1);/* 关闭LED */}return 0;}/* * @description : 关闭或释放设备 * @param - inode : 设备的inode * @param - filp : 要关闭的设备文件(文件描述符) * @return : 0 成功;其他 失败 */static int led_release(struct inode *inode, struct file *filp){return 0;}/* * 设备操作函数结构体 */static struct file_operations gpioled_fops = {.owner = THIS_MODULE,.open = led_open,.read = led_read,.write = led_write,.release = led_release,};/* * @description : 驱动入口函数 * @param : 无 * @return : 0 成功;其他 失败 */static int __init led_init(void){unsigned int ret = 0;/* 设置LED所使用的GPIO *//* 1、获取设备节点:gpioled */gpioled.nd = of_find_node_by_path("/gpioled");if (gpioled.nd == NULL){printk("gpioled node can not found!\r\n");return -EINVAL;} else {printk("gpioled node has been found!\r\n");}/* 2、获取设备树中的gpio属性,得到LED所使用的LED编号*/gpioled.led_gpio = of_get_named_gpio(gpioled.nd, "led-gpio", 0);if (gpioled.led_gpio < 0){printk("can not get led-gpio!\r\n");return -EINVAL;}printk("led-gpio num = %d\r\n", gpioled.led_gpio);/* 3、设置GPIO1_IO03为输出,并且输出高电平,默认关闭LED灯 */ret = gpio_direction_output(gpioled.led_gpio, 1);if (ret < 0)printk("can not set gpio!\r\n");/* 注册字符设备驱动 *//* 1、创建设备号 */if (gpioled.major){/* 定义了设备号 */gpioled.devid = MKDEV(gpioled.major, 0);register_chrdev_region(gpioled.devid, NEWCHRLED_CNT, NEWCHRLED_NAME);} else {/* 没有定义设备号 */alloc_chrdev_region(&gpioled.devid, 0, NEWCHRLED_CNT, NEWCHRLED_NAME);/* 申请设备号 */gpioled.major = MAJOR(gpioled.devid);/* 获取主设备号 */gpioled.minor = MINOR(gpioled.devid);/* 获取此设备号 */}printk("gpioled major = %d, minor = %d\r\n", gpioled.major, gpioled.minor);/* 2、初始化cdev */gpioled.cdev.owner = THIS_MODULE;cdev_init(&gpioled.cdev, &gpioled_fops);/* 3、添加一个cdev */cdev_add(&gpioled.cdev, gpioled.devid, NEWCHRLED_CNT);/* 4、创建类 */gpioled.class = class_create(THIS_MODULE, NEWCHRLED_NAME);if (IS_ERR(gpioled.class)){return PTR_ERR(gpioled.class);}/* 5、创建设备 */gpioled.device = device_create(gpioled.class, NULL, gpioled.devid, NULL, NEWCHRLED_NAME);if (IS_ERR(gpioled.device)){return PTR_ERR(gpioled.device);}return 0;}/* * @description : 驱动出口函数 * @param : 无 * @return : 无 */static void __exit led_exit(void){/* 注销字符设备驱动 */cdev_del(&gpioled.cdev);/* 删除cdev */unregister_chrdev_region(gpioled.devid, NEWCHRLED_CNT);/*删除设备号*/device_destroy(gpioled.class, gpioled.devid);/*删除设备*/class_destroy(gpioled.class);/*删除类*/}/* * 将上面两个函数指定为驱动的入口和出口函数 */module_init(led_init);module_exit(led_exit);/* * LICENSE和作者信息 */MODULE_LICENSE("GPL v2");MODULE_AUTHOR("xxx");
4、编译设备树文件(编译完后需要把对应的.dtb文件烧录到开发板上)
/* 在内核源码中根目录下,使用如下命令编译所有设备树文件 */make debs
5、编译LED设备模块(.ko后缀文件),并将编译出来的.ko文件复制到根文件系统的/lib/modules/4.1.15/下6、重启开发板7、重启后首次加载模块前,需要开发板的命令行中输入depmode
命令8、加载模块,输入"modprobe xxx.ko"命令,示例如下:
问题
为什么在设备树的gpioled节点,没有使用compatible属性也可以驱动LED模块?1、compatible是Linux用来绑定节点和设备驱动用的,在linux上电后,如果compatible匹配,就会调用对应驱动的probe函数,一般,在probe函数中,通常也包含了init函数。但,对于目前的学习,我们并没有学习到使用probe函数,并且当前采用的方式是手动加载模块。在模块加载时,会调用驱动里的init函数,因此当前阶段,有没有使用compatible都没有关系。2、由于linux初始化时会初始化platform总线上的设备,会根据设备节点compatible属性和驱动中of_match_table对应的值,匹配就加载对应的驱动,所以compatible在使用platform框架的驱动中就比较重要
关键词:
-
Topaz Video AI V3.1.10 视频降噪升画质工具 安装教程(windows/macos版)
TopazVideoAI视频修复工具安装教程Topaz视频增强AI是一款功能强大且易于使用的视频分辨率增强软件。该软...
来源: -
实战SQL优化(以MySQL深分页为例)
1准备表结构CREATETABLE`student`(`id`intNOTNULLAUTO_INCREMENT,`user_no`varchar(50)CHARACTERS
来源: 使用pinctrl和gpio子系统开发GPIO驱动正点原子IMX6ULL阿尔法板的LED灯
Topaz Video AI V3.1.10 视频降噪升画质工具 安装教程(windows/macos版)
热讯:DBSAT脚本快速收集方法
实战SQL优化(以MySQL深分页为例)
世界看热讯:如何限制进程内存:cgroup
时讯:每日机构分析:3月30日
世界播报:空调安装莫任性,城管上门解民忧
博主揭秘成都夜市“鬼秤”套路:10家有8家不准!官方已开展调查
每日讯息!车企回应试驾翻车后 新款坦克500正常上市:33.50万起买高安全硬派越野
索尼PS VR2销量滑铁卢:首周仅有不足30万
天天热文:拒绝山寨卡、翻新卡!NVIDIA联合七彩虹等厂商重拳出击
每日聚焦:CloudQuery 社区版重启 | 我们做了哪些准备?
世界播报:GraphPad Prism 9 V9.5.1 破解版安装教程
世界讯息:python中类成员修饰符
因为一篇文章,这国将召见俄大使
全球最新:改革举措加快推出 “首次”“首单”不断涌现——金融部门努力提升金融服务实体经济能力
【时快讯】抖音发布公告:“剧情演绎”类视频需注明 否则最严无限期封禁
全球热点评!怀念原版《RE4》艾什莉 玩家们绘制老鼠艾什莉同人图
世界简讯:单休女生30小时往返1300公里游6景点:第二天还要上班
速讯:上海交大教授李峰:医生没有创造力 非常容易被AI替代
澳大利亚多地暴雨洪灾 泳池频现剧毒漏斗蜘蛛:最快15分钟致死
当前头条:目标规模超30亿,浙江衢州拟设一支产业基金
天天最资讯丨04735-数据库系统原理知识点
【快播报】【验证码逆向专栏】极验三代、四代点选类验证码逆向分析
Linux 服务器大量的 log 日志,如何正确看日志快速定位错误?你必须学会!
天天最资讯丨APS系统设计经验分享(时间推导 - 2023.03)
每日动态!一个诡异的Python小问题
全球球精选!科创板收盘播报:科创50指数涨0.33% 半导体股延续强势表现
每日消息!男子伪装外卖小哥偷餐 被店员一眼识破:破绽太多
天天微速讯:露营倒闭潮来袭?网友:准备工作繁琐 参加一次就够了
国产本田幼兽来了!本田Cross Cub 110上市:只需1.3万
【焦点热闻】集吸拖洗一体全能!追觅M13 Beta洗地机图赏
汇源生产:哪吒捏爆果汁3.5元/斤大促(商超11元)
当前简讯:遏制“舌尖上的浪费” 餐饮企业应当好“排头兵”
快资讯丨【0基础学爬虫】爬虫基础之网页解析库的使用
世界今日报丨Qt商业级无边框窗口实现源码(windows、msvc)
今日视点:TypeScript 学习笔记 — 类型推断和类型保护(十一)
1个月发了4版驱动 Intel Arc显卡自信起来了:RTX 3060性价比已不能看
当前最新:索尼A7R5更新Ver.2.00固件:四大升级
速读:人工智能大潮下:Meta高管仍坚称元宇宙才是未来
每日快报!库克到访米哈游与大伟哥合影 大赞《原神》及创作团队
全球热讯:马斯克请愿叫停GPT-5!360周鸿祎:不发展才是最大的不安全
前沿资讯!打通为民服务“最后一米”,浦东这个街道积极推进社会治理与公共服务全覆盖
今日热闻!RegEX 备忘清单_开发速查表分享
全球视讯!Python常见面试题014.请说出下面的代码返回结果是什么?
世界今热点:基础篇丨链路追踪(Tracing)其实很简单
天天播报:什么是横向扩展「Scale-out」和纵向扩展「Scale-up」?
焦点信息:易基因: m6A RNA甲基化研究的前期探索性实验思路|干货系列
【环球热闻】全球男性精子量告急:50年来减少62%!2045年人类绝育?
nba2k13怎么空接?nba2k13阵容名单
iu14D2N.tmp是什么意思?iu14D2N.tmp文件详情介绍
华硕f83cr笔记本是哪一年上市的?华硕f83cr笔记本配置
英雄联盟为什么进不去比尔吉沃特?比尔吉沃特服务器在哪个城市?
微信8.0的状态能维持多久?微信8.0更新了什么功能?
支付宝招财宝如何样?招财宝收益高吗?
IM跨平台技术学习(七):得物基于Electron开发客服IM桌面端的技术实践
世界今日讯!min 与 + 运算转换成类似于矩阵乘法的推导过程
【环球时快讯】HDFS Balancer负载均衡器
每日观察!【Visual Leak Detector】配置项 SkipCrtStartupLeaks
世界快消息!掌握这几个算法题.NET初级面试算法不发愁
观热点:《最后生还者》 印象派杰作
焦点快报!vivo X Fold2真机亮相:经典华夏红配色、“天圆地方”设计
全球今头条!女生爬完泰山发现裤子变成偏大码引热议:网友质疑几乎不可能
焦点热议:专家:中国汽车产业进入淘汰赛 将从百家变成十几家
资讯推荐:北京出台新政引导光伏发电高质量发展
天天即时看!火山引擎 DataTester 推出可视化数据集成方案
速读:全网最详细中英文ChatGPT-GPT-4示例文档-个性化角色智能对话从0到1快速入门——官网推荐的48种最佳应用场景(附python/node.js/c
继《孤勇者》之后 小学生开始流行盘手串 网友:这届小朋友不好带了
苹果CEO库克造访米哈游:与《原神》创作团队交谈
【天天热闻】胜为八类网线7.5米到手23.9元:25Gbps高速传输
世界最新:微软建议Office 2016/2019用户升级:10月后将无法访问Microsoft 365
热点评!图灵波浪3.30-白银震荡上行格局不改
全球讯息:全网最详细中英文ChatGPT-GPT-4示例文档-读书书单推荐从0到1快速入门——官网推荐的48种最佳应用场景(附python/node.js/cu
当前热讯:BitMap对象当前正在其他地方使用?加锁也没用?
全球今热点:履约核心引擎低代码化原理与实践
天天快资讯:Linux 修改系统时间的两种方式
快看点丨京东二面:线程池中的线程抛出了异常,该如何处理?大部分人都会答错!
世界观热点:张奔斗:阳光双赛双四强 辛纳状态很“辛辣”
今日讯!男孩向女生水杯里放吸铁石 差点被喝下:医生称严重会胃穿孔
法国法芙娜脆珠+新鲜奶油 上行斋生巧福团狂促:8枚券后不到15元
精选!罗永浩将在淘宝直播间售卖民用卫星:最低200万起步
ChatGPT也要带货?微软开始在新必应插入广告
环球微头条丨长期进食柿子山楂 胃中长出巨大“顽石” 医生巧用无糖可乐辅助尿毒症女子成功碎石
环球百事通!【网络安全软件】上海道宁与Cybereason为您提供未雨绸缪的攻击保护,终结对端点、整个企业以及网络上任何角落的网络攻击
环球速读:1.redis的基本使用
全球简讯:前端设计模式——依赖注入模式
年轻人找工作不看工资看什么?一季度全国平均招聘月薪10101元 学历越高钱越多
世界新消息丨眼科医生自己真的都不做近视手术?
世界观天下!周上险量超5000 理想L系累计交付超10万台:其他新势力难了
热门美剧推动PS5销量大涨
专家提醒:千万不要侧躺玩手机 科普标准姿势
退役军人事务部调研组来洛 常正国带队
天天观热点:Linux的3个文件时间
Cursor,程序员的 AI 代码编辑助手
厚衣服先别收!强冷空气很快就到:今年来最大范围雨雪
“基尼太美” 兰博基尼Revuelto亮相 马力超千匹 2.5秒破百
【独家焦点】Win12 UI设计曝光被苹果用户吐槽:抄袭macOS太明显
2022年房屋的主要卖点是什么
3月份国有大行二级资本债密集发行 专家称大型银行与中小银行发债规模将明显分层
邮储银行450亿元定增落地 中国移动溢价逾40%“通吃”