Linux下arch/arm/mach-s3c2410/include/mach/gpio-nrs.h的理解_weixin_30672295的博客-程序员宅基地

技术标签: 操作系统  嵌入式  

  刚刚开始学习Linux下设备驱动程序,可能很多新手现在和毛毛一样对这个文件(arch/arm/mach-s3c2410/include/mach/gpio-nrs.h)有很多的不理解,在理解这个文件的同时,毛毛建议和linux/arch/arm/plat-s3c24xx/gpio.c这个文件一起理解。好吧,下面就和毛毛一起来学习吧!

1:首先毛毛将gpio-nrs.h的源码贴出来。

/* arch/arm/mach-s3c2410/include/mach/gpio-nrs.h
 *
 * Copyright (c) 2008 Simtec Electronics
 * http://armlinux.simtec.co.uk/
 * Ben Dooks <[email protected]>
 *
 * S3C2410 - GPIO bank numbering
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
*/

#ifndef __MACH_GPIONRS_H
#define __MACH_GPIONRS_H

#define S3C2410_GPIONO(bank,offset) ((bank) + (offset))

#define S3C2410_GPIO_BANKA   (32*0)
#define S3C2410_GPIO_BANKB   (32*1)
#define S3C2410_GPIO_BANKC   (32*2)
#define S3C2410_GPIO_BANKD   (32*3)
#define S3C2410_GPIO_BANKE   (32*4)
#define S3C2410_GPIO_BANKF   (32*5)
#define S3C2410_GPIO_BANKG   (32*6)
#define S3C2410_GPIO_BANKH   (32*7)

/* GPIO bank sizes */
#define S3C2410_GPIO_A_NR (32)
#define S3C2410_GPIO_B_NR (32)
#define S3C2410_GPIO_C_NR (32)
#define S3C2410_GPIO_D_NR (32)
#define S3C2410_GPIO_E_NR (32)
#define S3C2410_GPIO_F_NR (32)
#define S3C2410_GPIO_G_NR (32)
#define S3C2410_GPIO_H_NR (32)

#if CONFIG_S3C_GPIO_SPACE != 0
#error CONFIG_S3C_GPIO_SPACE cannot be zero at the moment
#endif

#define S3C2410_GPIO_NEXT(__gpio) \
 ((__gpio##_START) + (__gpio##_NR) + CONFIG_S3C_GPIO_SPACE + 0)

#ifndef __ASSEMBLY__

enum s3c_gpio_number {
 S3C2410_GPIO_A_START = 0,
 S3C2410_GPIO_B_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_A),
 S3C2410_GPIO_C_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_B),
 S3C2410_GPIO_D_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_C),
 S3C2410_GPIO_E_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_D),
 S3C2410_GPIO_F_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_E),
 S3C2410_GPIO_G_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_F),
 S3C2410_GPIO_H_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_G),
};

#endif /* __ASSEMBLY__ */

/* S3C2410 GPIO number definitions. */

#define S3C2410_GPA(_nr) (S3C2410_GPIO_A_START + (_nr))
#define S3C2410_GPB(_nr) (S3C2410_GPIO_B_START + (_nr))
#define S3C2410_GPC(_nr) (S3C2410_GPIO_C_START + (_nr))
#define S3C2410_GPD(_nr) (S3C2410_GPIO_D_START + (_nr))
#define S3C2410_GPE(_nr) (S3C2410_GPIO_E_START + (_nr))
#define S3C2410_GPF(_nr) (S3C2410_GPIO_F_START + (_nr))
#define S3C2410_GPG(_nr) (S3C2410_GPIO_G_START + (_nr))
#define S3C2410_GPH(_nr) (S3C2410_GPIO_H_START + (_nr))

/* compatibility until drivers can be modified */

#define S3C2410_GPA0 S3C2410_GPA(0)
#define S3C2410_GPA1 S3C2410_GPA(1)
#define S3C2410_GPA3 S3C2410_GPA(3)
#define S3C2410_GPA7 S3C2410_GPA(7)

#define S3C2410_GPE0 S3C2410_GPE(0)
#define S3C2410_GPE1 S3C2410_GPE(1)
#define S3C2410_GPE2 S3C2410_GPE(2)
#define S3C2410_GPE3 S3C2410_GPE(3)
#define S3C2410_GPE4 S3C2410_GPE(4)
#define S3C2410_GPE5 S3C2410_GPE(5)
#define S3C2410_GPE6 S3C2410_GPE(6)
#define S3C2410_GPE7 S3C2410_GPE(7)
#define S3C2410_GPE8 S3C2410_GPE(8)
#define S3C2410_GPE9 S3C2410_GPE(9)
#define S3C2410_GPE10 S3C2410_GPE(10)

#define S3C2410_GPH10 S3C2410_GPH(10)

#endif /* __MACH_GPIONRS_H */

2:我们开始来解析这个源程序。

毛毛发现这个源程序基本上全部是宏定义,其中有一个宏定义毛毛不太明白

#define S3C2410_GPIO_NEXT(__gpio) \
 ((__gpio##_START) + (__gpio##_NR) + CONFIG_S3C_GPIO_SPACE + 0)

#ifndef __ASSEMBLY__

毛毛是个努力的小孩,通过查阅资料毛毛发现这段宏定义中的##表示把前后程序连接起来,

也就是这样的:S3C2410_GPIO_NEXT(S3C2410_GPIO_B)就等同于

((S3C2410_GPIO_B_START)+(S3C2410_GPIO_B_NR)+CONFIG_S3C_GPIO_SPACE + 0)

在阅读程序的过程中毛毛还发现,S3C2410_GPx(_nr)这个宏是一个很重要的宏,在接下来的IO控制程序中都有应用。

毛毛是比较乖的,他尝试把这个宏展开是什么样子的,最后展开得到是:

S3C2410_GPx(_nr)=(S3C2410_GPIO_x_START + (_nr))

S3C2410_GPx(_nr)=(S3C2410_GPIO_NEXT(S3C2410_GPIO_x) + (_nr))

 S3C2410_GPx(_nr)=(((S3C2410_GPIO_(x-1)_START)+(S3C2410_GPIO_x_NR)+CONFIG_S3C_GPIO_SPACE + 0) + (_nr))

说明:(x-1)是毛毛个人的意思。即D-1=C,C-1=B,B-1=A;大家懂意思即可。

这个就是最后展开的宏:S3C2410_GPB(5)=0+32+0+0+5=37

最后我们最最想问的问题是Linux这样做是为了什么呢?

毛毛他说,在他的下一篇文章“Linux下arch/arm/mach-s3c2410/include/mach/gpio-nrs.h的理解”里面会讲到的。

细心的毛毛还发现,程序里面也这么一句

#define S3C2410_GPIONO(bank,offset) ((bank) + (offset))

我们按相同的方法将宏拆开S3C2410_GPIONO(S3C2410_GPIO_BANKA ,offset)=((S3C2410_GPIO_BANKA)+(offset))

S3C2410_GPB(5)=37,在上面我们已经得到啦。

S3C2410_GPIONO(S3C2410_GPIO_BANKB ,5)=S3C2410_GPIO_BANKB+5=32*1+5=37

在这里我们可以发现,S3C2410_GPx(_nr)和S3C2410_GPIONO(S3C2410_GPIO_BANKx ,_nr)是一样的作用。

毛毛个人估计是Linux系统在升级的过程中为了向下兼容才这样实现的

转载于:https://www.cnblogs.com/taomaomao/archive/2011/12/31/2308562.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30672295/article/details/99589347

智能推荐

OWIN实现MVC5 的系统登录_weixin_33675507的博客-程序员宅基地

2019独角兽企业重金招聘Python工程师标准&gt;&gt;&gt; ...

CLion(或其他基于intellij idea开发的集成环境)的激活方法_intellij clion_yzpyzp的博客-程序员宅基地

 步骤:1. 将 0.0.0.0 account.jetbrains.com 添加到系统hosts文件中2. 打开网站:http://idea.lanyus.com/  点击 &quot;获得注册码&quot;按钮,即可获取到注册码,复制3. 将复制的注册码粘贴到CLion的注册码输入框进行激活。我激活CLion的时候步骤1没做,即没有配置hosts,也激活成功了,所以看个人实际情况选择。 ...

vue使用canvas完成二维码与图片的合成与下载(两张图片同理)_Silenchen11的博客-程序员宅基地

&lt;el-dialog :title="title" :visible.sync="shopCodeShow" :append-to-body="true" width="20%" height="480"&gt; &lt;div class="bg-purple-light-down limit-button"&gt; &lt;el-button type="primary" ...

python 音频分割_法毅的博客的博客-程序员宅基地

"""把原音频,按csv中的标注结果分割成几个音频,如text是无,忽略。否则从sDate到eDate 进行分割。"""import osimport pandas as pdimport jsonfrom pydub import AudioSegmentcsv_url = "D:\csv\\"wav_url = "D:\标注音频与示例\\"save_wav = "D:\wav\\new_wav\\"for path in os.listdir(csv_url): dat.

C++小游戏数字炸弹_Mark_GXc的博客-程序员宅基地

c++数字炸弹一.前言二.代码一.前言这个小游戏代码是我学了半年编程打出开的第一个小游戏代码,游戏内无void以及goto.适合给新手当一个模板。二.代码#include&lt;iostream&gt;#include&lt;ctime&gt;#include&lt;windows.h&gt;using namespace std;int main(){int a=0,c,d=100,x=1,jb=100,n;long long tsy=1,czzd=1,fh=1;int b;c

图像中常见的几种噪声及产生原因_图像噪声产生的原因_Frederic_Bala的博客-程序员宅基地

转载地址:https://blog.csdn.net/weixin_40446557/article/details/81451651一、什么是图像噪声?噪声在图像上常表现为一引起较强视觉效果的孤立像素点或像素块。一般,噪声信号与要研究的对象不相关,它以无用的信息形式出现,扰乱图像的可观测信息。通俗的说就是噪声让图像不清楚。二、噪声来源—两个方面(1)图像获取过程中两种常用类型...

随便推点

主题模型聚类匹配2018TKDE阅读笔记(Topic Models for Unsupervised Cluster Matching)_HFUT_qianyang的博客-程序员宅基地

论文来源 Iwata T, Hirao T, Ueda N. Topic Models for Unsupervised Cluster Matching[J]. IEEE Transactions on Knowledge and Data Engineering, 2018, 30(4): 786-795.作者是日本人Iwata T,也是个机器学习大牛,每年都有一系列的文章出来,还是很厉害的。

Pytorch中的Conv2d的认识_费马定理的博客-程序员宅基地

转载自:https://www.aiuai.cn/aifarm618.html &nbsp;首页 正文&nbsp;&nbsp; 分享到: ...

全栈云一体机:为什么大家都想到了,却让他捷足先登?_weixin_34034670的博客-程序员宅基地

全栈云一体机,从字面解读,“全栈云”是内容,“一体机”是形式,而“全栈云一体机”就是内容与形式的完美统一。一键上云、开箱即云,这是云计算厂商给企业用户描绘的美好蓝图。那么,这一蓝图如何顺利落地呢?八仙过海,各显其能。不过,从实践来看,很多厂商、用户都争相挤过一体机这座“独木桥”。最早的一体机是为了解决软硬件集成、一体化快捷交付的问题...

H.266/VVC相关技术学习笔记9:JVET——O次会议关于色度预测模式编码的一些修改_wD丶路人的博客-程序员宅基地

在这次的O次会议中,关于色度预测模式的熵编码部分的修改就有好几家提案,其中这几家的修改方案都是重合的。总共有以下四家单位:海康威视(Hikvision )、索尼(Sony)、大疆(DJI)、北京大学(Peking)。其中大疆和北京大学联合提案O0416,他们认为在使用CCLM预测时,色度预测模式的解析过程存在依赖性,导致硬件设计延迟。为了消除色度CCLM预测分析过程的这种依赖关系,他们针对目前V...

Linux常用软件安装_ChengZi~的博客-程序员宅基地

Linux常用软件安装1 JDK安装1.1 上传JDk安装包到服务器1.2 解压缩文件1.3 配置环境变量1.4 配置文件生效1.5 检查2 Tomcat安装2.1 Tomca下载2.2 上传安装包2.3 解压缩2.4 启动关闭Tomcat3 Mysql安装3.1 下载Mysql3.2 检查系统是否安装了mariadb数据库3.3 卸载mariadb3.4 解压3.5 修改解压后的文件名3.6 创...

BZOJ 4373 算术天才⑨与等差数列_Apel_dey的博客-程序员宅基地

算术天才⑨非常喜欢和等差数列玩耍。有一天,他给了你一个长度为n的序列,其中第i个数为a[i]。他想考考你,每次他会给出询问l,r,k,问区间[l,r]内的数从小到大排序后能否形成公差为k的等差数列。当然,他还会不断修改其中的某一项。为了不被他鄙视,你必须要快速并正确地回答完所有问题。注意:只有一个数的数列也是等差数列。Input第一行包含两个正整数n,m(1&lt;=n,m&lt;...

推荐文章

热门文章

相关标签