• «
  • 1
  • 2
  • »
  • Pages: 1/2     Go
主题 : 关于设备IO地址的映射(原贴: s3c2410_gpio_cfgpin中基地址的获得) 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 10162
精华: 0
发帖: 47
金钱: 365 两
威望: 151 点
综合积分: 94 分
注册时间: 2009-10-26
最后登录: 2013-09-07
楼主  发表于: 2009-11-01 17:03

 关于设备IO地址的映射(原贴: s3c2410_gpio_cfgpin中基地址的获得)

s3c2410_gpio_cfgpin中获得基地址语句如下:

void __iomem *base = S3C24XX_GPIO_BASE(pin);

__iomem 不太明白什么用处,直接去掉,编译调试同样没有问题。

通过打印得到
[root@FriendlyARM /mnt]# insmod debug.ko
S3C24XX_GPIO_BASE(0[0x0])=0xfb000000
S3C24XX_GPIO_BASE(32[0x20])=0xfb000010
S3C24XX_GPIO_BASE(64[0x40])=0xfb000020
S3C24XX_GPIO_BASE(96[0x60])=0xfb000030
S3C24XX_GPIO_BASE(128[0x80])=0xfb000040
S3C24XX_GPIO_BASE(160[0xa0])=0xfb000050
S3C24XX_GPIO_BASE(192[0xc0])=0xfb000060

也就是a b c d e f g端口基地址通过宏S3C24XX_GPIO_BASE直接计算得到 0xfb0 00000 -0xfb0 00060,然后通过base +0或8 可以操作con或pull。
我的疑问是,没发觉这玩意怎么保护硬件的呀?  也没有用到什么内存映射嘛,请教高人点拨!
[ 此帖被kasim在2009-11-01 21:01重新编辑 ]
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
1楼  发表于: 2009-11-01 18:06
关于__iomem, 可以看看这个http://haoyeren.blog.sohu.com/115430836.html
对于地址的问题,我不清楚你希望怎么保护硬件,fb0000XX的地址不就是映射出来的虚拟地址吗?
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 10162
精华: 0
发帖: 47
金钱: 365 两
威望: 151 点
综合积分: 94 分
注册时间: 2009-10-26
最后登录: 2013-09-07
2楼  发表于: 2009-11-01 19:11
老大,谢谢你的关注!
我的意思是S3C24XX_GPIO_BASE(pin)这个是一个宏,展开还是一堆宏,说白了就是一堆数字加加减减,如果pin=192(32*6=S3C2410_GPG0),S3C24XX_GPIO_BASE(pin)就计算得到0xfb000060。也就是等式右边就是0xfb000060。
void __iomem *base = S3C24XX_GPIO_BASE(pin);                  (1)
void *base = S3C24XX_GPIO_BASE(pin);                                     (2)
我本来想在调试程序里如果用2,不能控制,用1能控制则说明1是确实映射到io端口,而2则没有映射。

但是现在问题更绝,用的是(1),先加载button驱动,会自动把配置改为中断模式,然后调用debug.ko把相应的con设置为输出(或输入),则按键应该无效了。奇怪的是按键还是能工作!!!!!!!
级别: 新手上路
UID: 10162
精华: 0
发帖: 47
金钱: 365 两
威望: 151 点
综合积分: 94 分
注册时间: 2009-10-26
最后登录: 2013-09-07
3楼  发表于: 2009-11-01 19:29
附上调试代码,其中按键驱动是照着宋老师书写的,不要取笑哦,大家帮忙理解理解。
附件: 调试代码.rar (59 K) 下载次数:31
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
4楼  发表于: 2009-11-01 19:37
我的意思是S3C24XX_GPIO_BASE(pin)这个是一个宏,展开还是一堆宏,说白了就是一堆数字加加减减,如果

映射本来就是一个基地址加偏移量的东西

pin=192(32*6=S3C2410_GPG0),S3C24XX_GPIO_BASE(pin)就计算得到0xfb000060。也就是等式右边就是0xfb000060。
void __iomem *base = S3C24XX_GPIO_BASE(pin);                  (1)
void *base = S3C24XX_GPIO_BASE(pin);                                     (2)
我本来想在调试程序里如果用2,不能控制,用1能控制则说明1是确实映射到io端口,而2则没有映射。

如果你看过我上面给出的链接,应该知道对于CPU来说,(1)和(2)是一样的,__iomem的意义只是针对编译器而言。

但是现在问题更绝,用的是(1),先加载button驱动,会自动把配置改为中断模式,然后调用debug.ko把相应的con设置为输出(或输入),则按键应该无效了。奇怪的是按键还是能工作!!!!!!!

那要看你的程序才知道了
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 10162
精华: 0
发帖: 47
金钱: 365 两
威望: 151 点
综合积分: 94 分
注册时间: 2009-10-26
最后登录: 2013-09-07
5楼  发表于: 2009-11-01 19:52
老大,那个还在看,首先__attribute__就不太理解,内核内部知识还欠缺太多。


“映射本来就是一个基地址加偏移量的东西”

这个可不可以这么理解,端口已经由其他初始化程序映射(规定)好了(当然规则和 S3C24XX_GPIO_BASE的规则一样,其实就是一家人),pin=192就是映射到0xfb000060。
void __iomem *base = S3C24XX_GPIO_BASE(pin);    拿到内核区间的地址,直接操作base+偏移地址就是对端口寄存器首地址+偏移地址操作了。
[ 此帖被azfa在2009-11-01 20:08重新编辑 ]
级别: 新手上路
UID: 10162
精华: 0
发帖: 47
金钱: 365 两
威望: 151 点
综合积分: 94 分
注册时间: 2009-10-26
最后登录: 2013-09-07
6楼  发表于: 2009-11-01 20:06
老大,我大概知道# define __iomem    __attribute__((noderef, address_space(2)))
主要是告诉编译器检查后面的是不是硬件设备的寄存器在内核里所映射的地址空间,如果不是则报错,像我那样不加只不过是不检查,(当然从安全性角度考虑不可取),如果正确的话用起来是一样的。
级别: 新手上路
UID: 10162
精华: 0
发帖: 47
金钱: 365 两
威望: 151 点
综合积分: 94 分
注册时间: 2009-10-26
最后登录: 2013-09-07
7楼  发表于: 2009-11-01 20:28
老大,我知道为什么了,崩溃了,那个button不是在注册的时候注册中断的,是在打开设备的时候注册中断的,那时候还是会把配置改为中断模式的。

先. /shell_button .退出测试程序,再后台运行,这时按键有效,加载debug.ko之后按键就没用了。


再次感谢老大的无私指导,让我对映射又有了一定的深入了解!
[ 此帖被azfa在2009-11-01 20:48重新编辑 ]
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
8楼  发表于: 2009-11-01 20:53

 回 7楼(azfa) 的帖子

我其实没做什么,这些都是你自己看源代码找出的答案,非常不错。
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
9楼  发表于: 2009-11-01 21:00

 回 5楼(azfa) 的帖子

这个可不可以这么理解,端口已经由其他初始化程序映射(规定)好了(当然规则和 S3C24XX_GPIO_BASE的规则一样,其实就是一家人),pin=192就是映射到0xfb000060。
void __iomem *base = S3C24XX_GPIO_BASE(pin);    拿到内核区间的地址,直接操作base+偏移地址就是对端口寄存器首地址+偏移地址操作了。

事实上,像GPIO部分寄存器的IO地址映射是在就内核启动时完成的(2.6.29的内核在s3c24xx_init_io()函数里完成的,arch/arm/plat-s3c24xx/cpu.c), 映射的虚拟地址的基地址和范围也是事先定义好的(S3C24XX_VA_GPIO, S3C24XX_SZ_GPIO)。映射完成后,就像你说的,任何内核中的驱动都可以通过这个虚拟地址加上范围内的偏移量访问IO设备了。
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
  • «
  • 1
  • 2
  • »
  • Pages: 1/2     Go