---恢复内容开始---

1:什么是gpiolib,为什么要有gpiolib?

linux中从2.6.35以后就开始有gpiolib库了,gpiolib的作用是对所有的gpio实行统一管理,因为驱动在工作的时候,会出现好几个驱动共同使用同一个gpio的情况;

这会造成混乱。所以内核提供了一些方法来管理gpio资源;

2:如何学习gpiolib

第一:gpiolib库的建立;

第二:gpiolib库的使用方法:申请、使用、释放;

3:

  我们首先来看一下这个文件:mach-smdkc110.c这个文件:

smdkc110_map_io

    s5pv210_gpiolib_init  这个函数是gpiolib的初始化函数

__init int s5pv210_gpiolib_init(void)
{struct s3c_gpio_chip *chip = s5pv210_gpio_4bit;int nr_chips = ARRAY_SIZE(s5pv210_gpio_4bit);int i = 0;for (i = 0; i < nr_chips; i++, chip++) {if (chip->config == NULL)chip->config = &gpio_cfg;if (chip->base == NULL)chip->base = S5PV210_BANK_BASE(i);}samsung_gpiolib_add_4bit_chips(s5pv210_gpio_4bit, nr_chips);return 0;
}

gpiolib库的初始化实质就是对这个结构体数组进行赋值;

下面看一下这个结构体

struct s3c_gpio_chip {struct gpio_chip    chip;struct s3c_gpio_cfg    *config;struct s3c_gpio_pm    *pm;void __iomem        *base;int            eint_offset;spinlock_t         lock;
#ifdef CONFIG_PMu32            pm_save[7];
#endif
};

chpi结构体:为主要结构体

关键几个元素

label

request    //申请gpio

free      //释放gpio

direction_input    //输入模式

direction_output    //输出模式

get          //读取gpio的值

set          //写入gpio的值

base        //gpio基地址 端口地址

ngpio        //引脚地址

names        //名字

 
struct gpio_chip {const char        *label;struct device        *dev;struct module        *owner;int            (*request)(struct gpio_chip *chip,unsigned offset);void            (*free)(struct gpio_chip *chip,unsigned offset);int            (*direction_input)(struct gpio_chip *chip,unsigned offset);int            (*get)(struct gpio_chip *chip,unsigned offset);int            (*direction_output)(struct gpio_chip *chip,unsigned offset, int value);int            (*set_debounce)(struct gpio_chip *chip,unsigned offset, unsigned debounce);void            (*set)(struct gpio_chip *chip,unsigned offset, int value);int            (*to_irq)(struct gpio_chip *chip,unsigned offset);void            (*dbg_show)(struct seq_file *s,struct gpio_chip *chip);int            base;u16            ngpio;const char        *const *names;unsigned        can_sleep:1;unsigned        exported:1;
};

内核中建立了

static struct s3c_gpio_chip s5pv210_gpio_4bit[] 这个数组,将所有的gpio的.chip结构体中的一些元素初始化

 这个数组的所有元素是与数据手册中的所有gpio是一一对应的;

我们首先来分析一下.chip->base中的值 通过一下几个宏定义我们可以知道gpa0中 chip->.chip->base中的值为 0 gpa1中chip->.chip->base中的值为9 这个数字数对应端口的io口的号码;

#define S5PV210_GPA0(_nr) (S5PV210_GPIO_A0_START + (_nr))
#define S5PV210_GPA1(_nr) (S5PV210_GPIO_A1_START + (_nr))

S5PV210_GPIO_A0_START = 0,
S5PV210_GPIO_A1_START = S5PV210_GPIO_NEXT(S5PV210_GPIO_A0),

#define S5PV210_GPIO_NEXT(__gpio) \
((__gpio##_START) + (__gpio##_NR) + CONFIG_S3C_GPIO_SPACE + 1)

#define S5PV210_GPIO_A0_NR (8)
#define S5PV210_GPIO_A1_NR (4)
#define S5PV210_GPIO_B_NR (8)
#define S5PV210_GPIO_C0_NR (5)

----------------------------------------------------------------------------------------------------------------------------------------------

接下来是对

chip->config = &gpio_cfg;

chip->config结构体赋值;

然后是对chip->base 赋值

chip->base = S5PV210_BANK_BASE(i);

#define S5PV210_BANK_BASE(bank_nr) (S5P_VA_GPIO + ((bank_nr) * 0x20)

可以看出chip->base是把gpio的虚拟地址赋值给chip->base,每个gpio的地址差0x20;

下面看一下

samsung_gpiolib_add_4bit_chips(s5pv210_gpio_4bit, nr_chips); 这个函数

void __init samsung_gpiolib_add_4bit_chips(struct s3c_gpio_chip *chip,int nr_chips)
{for (; nr_chips > 0; nr_chips--, chip++) {samsung_gpiolib_add_4bit(chip);s3c_gpiolib_add(chip);}
}

这个函数中调用了两个函数

samsung_gpiolib_add_4bit_chips

    samsung_gpiolib_add_4bit

    s3c_gpiolib_add

void __init samsung_gpiolib_add_4bit(struct s3c_gpio_chip *chip)
{chip->chip.direction_input = samsung_gpiolib_4bit_input;chip->chip.direction_output = samsung_gpiolib_4bit_output;chip->pm = __gpio_pm(&s3c_gpio_pm_4bit);
}

这个函数的作用是对每个chip->chip的direction_input direction_output两个函数赋值

下面看一下s3c_gpiolib_add函数都做了什么:

    if (!gc->direction_input)gc->direction_input = s3c_gpiolib_input;if (!gc->direction_output)gc->direction_output = s3c_gpiolib_output;if (!gc->set)gc->set = s3c_gpiolib_set;if (!gc->get)gc->get = s3c_gpiolib_get;

继续对chip->中的元素进行赋值,set get赋值,

ret = gpiochip_add(gc);

最后注册这些gpio_chip结构体;

注册的实质是:在linux内核中有一个gpio_desc结构体数组,注册就是把我们封装的gpio的所有信息的结构体放到数组的格子中;

static struct gpio_desc gpio_desc[ARCH_NR_GPIOS];   

gpiolib库是linux内核工程师以及三星芯片厂商工程师共同完成的,内核工程师提供搭建好底层框架,三星工程师

把自己开发板的gpio初始化并注册到内核提供的数组中去;

---------------------------------------------------------------------------------------------------------------

上面讲了gpiolib库的构建,构建的实质是把所有的gpio结构体进行初始化,并且放到内核中gpio_desc这个结构体数组中;

下面看一下我们在开发驱动的时候如何使用gpiolib库

首先要了解一下linux内核工程师给我们开发的接口:
文件:/drivers/gpio/gpiolib.c文件中提供所有的接口

1:gpio_request:向内核申请gpio

int gpio_request(unsigned gpio, const char *label)

2:gpio_free对应gpio_request,是使用完gpio以后把gpio释放掉

void gpio_free(unsigned gpio)

3:gpiochip_add:向内核注册gpio

int gpiochip_add(struct gpio_chip *chip)

4:gpio_request_one  申请gpio

int gpio_request_one(unsigned gpio, unsigned long flags, const char *label)

5:gpio_request_one申请gpio

int gpio_request_one(unsigned gpio, unsigned long flags, const char *label)

6:gpiochip_is_requested:用来看gpio是否已经使用

const char *gpiochip_is_requested(struct gpio_chip *chip, unsigned offset)

7:gpio_direction_input :设置gpio输入

int gpio_direction_input(unsigned gpio)

8:gpio_direction_output:gpio输出

int gpio_direction_output(unsigned gpio, int value)

9:__gpio_get_value :获取寄存器的值    这里注意由于前面加了__是内核用的函数所以我们不能用这个函数

在/arch/arm/mach-s5pv210/include/mach/gpio.h中定义了以下宏;所以我们使用的时候直接包含这个头文件使用gpio_get_value 函数即可

#define gpio_get_value __gpio_get_value
#define gpio_set_value __gpio_set_value
#define gpio_cansleep __gpio_cansleep
#define gpio_to_irq __gpio_to_irq

int __gpio_get_value(unsigned gpio)

10:__gpio_get_value :设置寄存器的值

int __gpio_get_value(unsigned gpio)

http://blog.csdn.net/tongxinv/article/details/54790792

---------------------------------------------------------------------------------------------------------------------------------

代码实战:

转载于:https://www.cnblogs.com/biaohc/p/6652322.html

linux驱动(七)gpiolib库详解相关推荐

  1. Linux驱动开发必看详解神秘内核(完全转载)

    Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html IT168 技术文档]在开始步入Lin ...

  2. 嵌入式Linux驱动笔记(十四)------详解clock时钟(CCF)框架及clk_get函数

    你好!这里是风筝的博客, 欢迎和我一起交流. 我在找资料的时候,发现网上大部分文章都是说: 在s3c244x_init_clocks函数里: void __init s3c244x_init_cloc ...

  3. Linux驱动开发必看详解神秘内核

    I 在开始步入Linux设备驱动程序的神秘世界之前,让我们从驱动程序开发人员的角度看几个内核构成要素,熟悉一些基本的内核概念.我们将学习内核定时器.同步机制以及内存分配方法.不过,我们还是得从头开始这 ...

  4. c语言标准库详解(七):字符串函数string.h

    c语言标准库详解(七):字符串函数<string.h> 头文件<string.h>中定义了两组字符串函数.第一组函数的名字以 str 开头:第二组函数的名字以 mem 开头.除 ...

  5. ROS入门笔记(七):详解ROS文件系统

    ROS入门笔记(七):详解ROS文件系统 文章目录 01 Catkin编译系统 1.1 Catkin特点 1.2 Catkin工作原理 1.3 使用`catkin_make`进行编译 02 Catki ...

  6. ceph存储原理_赠书 | Linux 开源存储全栈详解——从Ceph到容器存储

    // 留言点赞赠书我有书,你有故事么?留言说出你的存储故事留言点赞前两名,免费送此书截止日期12.27号12.30号公布名单 // 内容简介 本书致力于帮助读者形成有关Linux开源存储世界的细致的拓 ...

  7. Linux文件系统的目录结构详解(转)

    Linux文件系统的目录结构详解(转) 原文链接https://www.cnblogs.com/cyjaysun/p/4462325.html 一.前 言 文章对Linux下所有目录一一说明,对比较重 ...

  8. u盘制作大师 linux系统教程,制作用U盘启动的Linux系统的简单步骤详解

    制作用U盘启动的Linux系统的简单步骤详解 最近听朋友说误删除了Linux系统里的文件,于是系统进不了,里面保存着很多重要的数据,这该怎么办?虽然可以把硬盘取出挂载其他Linux系统运行,也可跳过控 ...

  9. C++静态库与动态库详解与使用

    福利 | 百度 AI 开发者大会免费门票领取    CSDN日报20170628--<实习,背后的选择?>    [直播]探究Linux的总线.设备.驱动模型! C++静态库与动态库详解与 ...

最新文章

  1. android 带记忆功能的播放器源码,Android实现阅读进度记忆功能
  2. 解决AI大难题:如何降低AI运行对能源的消耗?
  3. CSS3 Animation(下)
  4. [实战] 用数人云,部署弹性 ELK 集群就五步
  5. vb.net限制datagridview不能选择_家里安装200兆宽带,网速还是很慢怎么办?教你一招解除网速限制...
  6. excel如何做单元格下拉和根据文字自动变色
  7. 关于数据准确性,精益求精,神策数据矢志不渝的坚持
  8. OpenCV形态学变换函数morphologyEx()开运算的使用
  9. java事件大全_Java sctipt常用事件汇总介绍
  10. Flink 架构:三层架构体系、运行时组件
  11. Java EE 6 Web配置文件。 在云上。 简单。
  12. openMVG跑自定义数据出错
  13. Java输出箭头_java基于XSSF 导出带箭头的直线
  14. LeetCode 1111. 有效括号的嵌套深度
  15. 配置网络策略中的 NAP 条件
  16. 页面自适应纯CSS,使用rem单位
  17. MSMQ 消息队列的封装
  18. php导出数组到csv格式demo
  19. ant 卓越幕墙工具箱和 那个好用_卓越幕墙工具箱
  20. 免费图床、mp3外链,音乐上传,QQ空间永久背景音乐,mp3联接

热门文章

  1. 【Qt】2D绘图之双缓冲绘图
  2. 【Tools】Visual Studio 2010下载和安装
  3. 【Qt】Qt5.12版本编译Oracle驱动教程
  4. [Qt教程] 第17篇 2D绘图(七)涂鸦板
  5. html5怎样做纵向导航,HTML5怎么做导航栏
  6. oracle的asmcmd获取归档日志,分析oracle的联机日志和归档日志
  7. 学习opencv 英文版_电子课本:苏教牛津译林 | 高中英语模块2,赶紧收藏学习吧...
  8. c语言键盘连续双击程序,编了个C语言的键盘程序有点问题,请指点下!
  9. LVS(4)——规则相关操作
  10. 回文链表—leetcode234