驱动框架6——linux内核的gpiolib学习
以下内容源于朱有鹏《物联网大讲堂》课程的学习整理,如有侵权,请告知删除。
八、linux内核的gpiolib学习1
1、gpiolib学习重点(主线)
(1)主线一:gpiolib的建立过程;
- 体系是如何建立的?
(2)主线二:gpiolib的使用方法:申请、使用、释放
(3)主线三:gpiolib的架构:涉及哪些目录的哪些文件
2、gpiolib的学习方法
(1)以一条主线进去,坚持主线;
(2)中途遇到杂碎知识,彻底搞定之,然后继续主线;
(3)随时做笔记以加深理解和记忆;
(4)学习途中注意架构思想,提升自己大脑的空间复杂度;
3、主线1:gpiolib的建立
找到目标函数
- smdkc110_map_io这个函数在静态映射中曾经经过。
- s5pv210_gpiolib_init函数,是gpiolib初始化的函数。
九、linux内核的gpiolib学习2
1、struct s3c_gpio_chip
(1)在文件gpio-core.h文件中
- 此结构体是一个GPIO端口的抽象,这个结构体的一个变量就可以完全的描述一个IO端口。
(2)端口和IO口是两个概念
- S5PV210有很多个IO口(160个左右),这些IO口首先被分成N个端口(port group),然后每个端口中又包含了M个IO口。
- 譬如GPA0是一个端口,里面包含了8个IO口,我们一般记作:GPA0_0(或GPA0.0)、GPA0_1……
(3)内核中为每个GPIO分配了一个编号,编号是一个数字(譬如一共有160个IO时编号就可以从1到160连续分布),编号可以让程序很方便的去识别每一个GPIO。
2、s5pv210_gpio_4bit[ ]数组
- 一个结构体数组,数组中包含了很多个struct s3c_gpio_chip类型的变量
- 填充了结构体中chip这个元素,这个元素是struct gpio_chip类型的,因此进一步细化为填充struct gpio_chip类型中的元素。其他元素好像没有太深入。
十、linux内核的gpiolib学习3
1、S5PV210_GPA0宏
这个宏的返回值是GPA0端口的某一个IO口的基础编号值,传参是这个IO口在GPA0端口中的局部编号。
2、samsung_gpiolib_add_4bit_chips函数
- 进行gpiolib的注册;
- 接收的参数是当前文件中定义好的结构体数组s5pv210_gpio_4bit(2个参数分别是数组名和数组元素个数);
- 此结构体数组,包含了当前系统中所有的IO端口的信息。
- 包含:端口的名字、端口中所有GPIO的编号、端口操作寄存器组的虚拟地址基地址、端口中IO口的数量、端口上下拉等模式的配置函数、端口中的IO口换算其对应的中断号的函数(此时不用再查看原理图)。
十一、linux内核的gpiolib学习4
1、几个问题
(1)哪个目录的哪个文件?
(2)函数名中为什么有个4bit?
- 三星的CPU中2440的CON寄存器是2bit对应一个IO口,而6410和210以及之后的系列中CON寄存器是4bit对应1个IO口。
- 所以gpiolib在操作2440和210的CON寄存器时是不同的。
2、函数调用关系
- samsung_gpiolib_add_4bit_chips
- samsung_gpiolib_add_4bit
- s3c_gpiolib_add
- samsung_gpiolib_add_4bit内部没有做gpiolib的注册工作,而是在做填充,填充的是每一个GPIO被设置成输入模式/输出模式的操作方法。
十二、linux内核的gpiolib学习5_6
1、s3c_gpiolib_add
(1)首先检测并完善chip的direction_input/direction_ouput/set/get这4个方法;
(2)然后调用gpiochip_add方法进行真正的注册操作。
- 这个注册就是将(我们的封装了一个GPIO端口的所有信息的)chip结构体变量,挂接到内核(gpiolib模块定义的一个)gpio_desc数组中的某一个格子中。
2、从驱动框架角度再来分析一下gpiolib
(1)截至目前(gpiochip_add方法)已经搞清楚了gpiolib的建立工程,即主线一。
- 但是这只是整个gpiolib建立的一部分,是厂商驱动工程师负责的那一部分;
- 还有另一部分是内核开发者提供的驱动框架的那一部分,即第2条主线。(第一条起始见八3)
(2)drivers/gpio/gpiolib.c这个文件中所有的函数构成了第2部分,也就是内核开发者写的gpiolib框架部分。
- gpiochip_add:是框架开出来的接口,给厂商驱动工程师用(针对某个开发板GPIO的情况,对内核进行一定的修改,注册),用于向内核注册gpiolib。(标记有多少组端口,属性细节等,让内核知道具体的GPIO信息。)
- gpio_request:是框架开出来的接口,给使用gpiolib来编写自己的驱动的驱动工程师用的,驱动中要想使用某一个gpio,就必须先调用gpio_request接口来向内核的gpiolib部分申请,得到允许后才可以去使用这个gpio。
- gpio_free:对应gpio_request,用来释放申请后用完了的gpio。
- gpio_request_one/gpio_request_array:这两个是gpio_request的变种。
- gpiochip_is_requested:接口用来判断某一个gpio是否已经被申请了
- gpio_direction_input/gpio_direction_output:接口用来设置GPIO为输入/输出模式,注意该函数内部实际并没有对硬件进行操作,只是通过chip结构体变量的函数指针,调用了(将来SoC厂商的驱动工程师写的)真正地操作硬件、实现gpio设置成输出模式的那个函数。
- 以上的接口属于一类,是给写其他驱动并且用到了gpiolib的人使用的,剩下的函数是gpiolib内部自己的一些功能实现的代码。
十三、linux内核的gpiolib学习7
1、gpiolib的attribute部分
(1)CONFIG_GPIO_SYSFS
- 在内核中很多实现方式,都是通过宏来配置的;
- 在.config文件有,则必然在menuconfig中有。
(2)GPIO的attribute演示
- 一般能cat,不能写。
2、能够cat的相关代码分析
(1)gpiolib_sysfs_init:在/sys/class里定义了gpio这个类
(2)gpiochip_export
(3)sysfs_create_group用来创建许多attribute
驱动框架6——linux内核的gpiolib学习相关推荐
- Android 底层驱动开发步骤——linux内核层、HAL层、JNI层
1.Linux驱动实现 2.Linux内核驱动测试 3.Android HAL层实现 4.Aidl实现 5.Service java实现 6.Service jni 实现 7.注册service和jn ...
- 驱动框架3——在内核中添加或去除某个驱动
以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除. 1.去除九鼎移植的LED驱动 (1)九鼎移植的驱动(在应用层的接口)在/sys/devices/platform/x210-led/目录下, ...
- Ubuntu\linux,加载mcp2515的驱动,链接mcp2515,mcp2515的这个驱动默认在linux内核中。jetson nao、香橙派、树莓派
加载mcp2515的驱动,这个驱动默认在linux内核中. linux内核源码 1.树莓派+MCP2515+总线工具完成can报文收发 sudo modprobe mcp251x 2.树莓派CAN通讯 ...
- Linux内核0.11学习
Linux内核0.11学习 文章目录 Linux内核0.11学习 一.计算机开机的过程 1.启动BIOS 2.BIOS 在内存中加载中断向量表和中断服务程序 Linux内核最新已经版本已经到5.18了 ...
- linux内核网络驱动框架(linux驱动开发篇)
网络驱动的核心: 1.就是初始化 net_device 结构体中的各个成员变量, 2.然后将初始化完成以后的 net_device 注册到 Linux 内核中 1.网络设备(用net_device结构 ...
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】Linux内核抢占实现机制分析
Linux内核抢占实现机制分析 Sailor_forever sailing_9806@163.com 转载请注明 http://blog.csdn.net/sailor_8318/archive/ ...
- 八千字硬核长文梳理Linux内核概念及学习路线
点击上方"大鱼机器人",选择"置顶/星标公众号" 福利干货,第一时间送达! 来源 :头条号@Linux学习教程,冰凌块儿 整理:公众号:嵌入式Linux,发哥 ...
- linux内核的gpiolib
gpiolib引入 (1)一个事实:很多硬件都要用到GPIO.GPIO会复用 (2)如果同一个GPIO被2个驱动同时控制了,就会出现bug (3)内核提供gpiolib来统一管理系统中所有GPIO ( ...
- Linux 内核安全模块学习总结
Linux安全模块(LSM) LSM是Linux Secrity Module的简称,即linux安全模块.其是一种轻量级通用访 问控制框架,适合于多种访问控制模型在它上面以内核可加载模块的形实现.用 ...
最新文章
- Bad owner or permissions on xx/.ssh/config
- 安装envi出现cannot find lincese_Ubuntu 16.04 安装 CUDA10.1 (解决循环登陆的问题)
- 罗斯蒙特电磁流量计8723说明书_罗斯蒙特8732EM电磁流量计变送器如何接线!
- Calling handler.OnEndpointsUpdate报错原因
- 高性能Cordova App开发学习笔记
- [JLOI2011]不重复数字
- Python 十七章 Web开发
- list index out of bounds_python3基础03列表(list)和元组(tuple)
- html轮播视频插件上加文字,可加入视频、图片的轮播swiper插件(可以拖动、视频存在加载条)...
- linux 中 timeval结构体
- c语言第一周作业答案,C语言程序设计下mooc答案.pdf
- [转载]名字长的麻烦
- 2019支持c99吗_德国LYNX携手北京十方融科科技有限公司成功中标2019年中国联通北京市分公司4K超高清视频信号传输设备购置项目...
- Problem 71:Ordered fractions
- python google earth_如何用python编程控制GoogleEarth
- 解决UmengSDK社会化分享过程中微信,QQ,新浪微博分享不成功的问题
- 迭代法求根c语言程序对数方程,【实验一】方程求根:牛顿迭代法
- Vue Resource
- 作为面试官的一点心得
- 我对于创业公司的看法