以下内容源于朱有鹏《物联网大讲堂》课程的学习整理,如有侵权,请告知删除。

八、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学习相关推荐

  1. Android 底层驱动开发步骤——linux内核层、HAL层、JNI层

    1.Linux驱动实现 2.Linux内核驱动测试 3.Android HAL层实现 4.Aidl实现 5.Service java实现 6.Service jni 实现 7.注册service和jn ...

  2. 驱动框架3——在内核中添加或去除某个驱动

    以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除. 1.去除九鼎移植的LED驱动 (1)九鼎移植的驱动(在应用层的接口)在/sys/devices/platform/x210-led/目录下, ...

  3. Ubuntu\linux,加载mcp2515的驱动,链接mcp2515,mcp2515的这个驱动默认在linux内核中。jetson nao、香橙派、树莓派

    加载mcp2515的驱动,这个驱动默认在linux内核中. linux内核源码 1.树莓派+MCP2515+总线工具完成can报文收发 sudo modprobe mcp251x 2.树莓派CAN通讯 ...

  4. Linux内核0.11学习

    Linux内核0.11学习 文章目录 Linux内核0.11学习 一.计算机开机的过程 1.启动BIOS 2.BIOS 在内存中加载中断向量表和中断服务程序 Linux内核最新已经版本已经到5.18了 ...

  5. linux内核网络驱动框架(linux驱动开发篇)

    网络驱动的核心: 1.就是初始化 net_device 结构体中的各个成员变量, 2.然后将初始化完成以后的 net_device 注册到 Linux 内核中 1.网络设备(用net_device结构 ...

  6. 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】Linux内核抢占实现机制分析

    Linux内核抢占实现机制分析 Sailor_forever  sailing_9806@163.com 转载请注明 http://blog.csdn.net/sailor_8318/archive/ ...

  7. 八千字硬核长文梳理Linux内核概念及学习路线

    点击上方"大鱼机器人",选择"置顶/星标公众号" 福利干货,第一时间送达! 来源 :头条号@Linux学习教程,冰凌块儿 整理:公众号:嵌入式Linux,发哥 ...

  8. linux内核的gpiolib

    gpiolib引入 (1)一个事实:很多硬件都要用到GPIO.GPIO会复用 (2)如果同一个GPIO被2个驱动同时控制了,就会出现bug (3)内核提供gpiolib来统一管理系统中所有GPIO ( ...

  9. Linux 内核安全模块学习总结

    Linux安全模块(LSM) LSM是Linux Secrity Module的简称,即linux安全模块.其是一种轻量级通用访 问控制框架,适合于多种访问控制模型在它上面以内核可加载模块的形实现.用 ...

最新文章

  1. Bad owner or permissions on xx/.ssh/config
  2. 安装envi出现cannot find lincese_Ubuntu 16.04 安装 CUDA10.1 (解决循环登陆的问题)
  3. 罗斯蒙特电磁流量计8723说明书_罗斯蒙特8732EM电磁流量计变送器如何接线!
  4. Calling handler.OnEndpointsUpdate报错原因
  5. 高性能Cordova App开发学习笔记
  6. [JLOI2011]不重复数字
  7. Python 十七章 Web开发
  8. list index out of bounds_python3基础03列表(list)和元组(tuple)
  9. html轮播视频插件上加文字,可加入视频、图片的轮播swiper插件(可以拖动、视频存在加载条)...
  10. linux 中 timeval结构体
  11. c语言第一周作业答案,C语言程序设计下mooc答案.pdf
  12. [转载]名字长的麻烦
  13. 2019支持c99吗_德国LYNX携手北京十方融科科技有限公司成功中标2019年中国联通北京市分公司4K超高清视频信号传输设备购置项目...
  14. Problem 71:Ordered fractions
  15. python google earth_如何用python编程控制GoogleEarth
  16. 解决UmengSDK社会化分享过程中微信,QQ,新浪微博分享不成功的问题
  17. 迭代法求根c语言程序对数方程,【实验一】方程求根:牛顿迭代法
  18. Vue Resource
  19. 作为面试官的一点心得
  20. 我对于创业公司的看法

热门文章

  1. 推荐一个接口文档工具
  2. 使用 sitemesh/decorator装饰器装饰jsp页面(原理及详细配置)
  3. Makefile 7——自动生成依赖关系 三颗星
  4. [Oracle]UNIX与Windows 2000上Oracle的差异(I)
  5. 课堂练习之小强大扫荡
  6. iOS开发API常用英语名词
  7. 在单文档中显示我的第一个对话框
  8. 1)C++对象大小计算
  9. Hadoop的改进实验(中文分词词频统计及英文词频统计)(4/4)
  10. python urllib模块学习笔记