当前位置: 技术问答>linux和unix
请教静态映射问题若干!
来源: 互联网 发布时间:2016-05-02
本文导语: 1 给arm添加一个编码芯片,他接到arm的gcs5,是否gcs5的起始地址就是他的物理地址啊,跟地址线连接有关吗?我芯片的addr跟arm的addr0到3相连。 2 使用动态映射(ioremap)还是静态映射(如下)好哩? 3 我在内核...
1 给arm添加一个编码芯片,他接到arm的gcs5,是否gcs5的起始地址就是他的物理地址啊,跟地址线连接有关吗?我芯片的addr跟arm的addr0到3相连。
2 使用动态映射(ioremap)还是静态映射(如下)好哩?
3 我在内核源代码INCLUDE下面的map.h看到静态映射的设置,那写虚拟地址是怎么设置的啊,有规律吗
#define S3C2410_ADDR(x) (0xF0000000 + (x))
/* ADC */
#define S3C2410_VA_ADC S3C2410_ADDR(0x01000000)
#define S3C2410_PA_ADC (0x58000000)
#define S3C2410_SZ_ADC SZ_1M
/* SPI */
#define S3C2410_VA_SPI S3C2410_ADDR(0x01100000)
#define S3C2410_PA_SPI (0x59000000)
#define S3C2410_SZ_SPI SZ_1M
/* SDI */
#define S3C2410_VA_SDI S3C2410_ADDR(0x01200000)
#define S3C2410_PA_SDI (0x5A000000)
#define S3C2410_SZ_SDI SZ_1M
/* CS8900 */
#define S3C2410_VA_CS8900 S3C2410_ADDR(0x01800000)
#define S3C2410_PA_CS8900 (0x19000000)
#define S3C2410_SZ_CS8900 SZ_1M
我如果想增加个外设,是否也可以设为
S3C2410_ADDR(0x01300000)?
谢谢回答,在线等!
|
1 给arm添加一个编码芯片,他接到arm的gcs5,是否gcs5的起始地址就是他的物理地址啊,跟地址线连接有关吗?我芯片的addr跟arm的addr0到3相连。
=========================================================================
看一下ARM芯片资料,每个片选的地址范围都在这部分说明的
2 使用动态映射(ioremap)还是静态映射(如下)好哩?
================================================
都可以,静态映射需要重新编内核,而且要考虑你想要的地址段是否被占用的问题,动态映射可以在驱动中完成
3 我在内核源代码INCLUDE下面的map.h看到静态映射的设置,那写虚拟地址是怎么设置的啊,有规律吗
我如果想增加个外设,是否也可以设为
S3C2410_ADDR(0x01300000)?
====================================================
有一定规律,但也不完全是规律,规律就是虚拟地址范围一定要在0xC0000000以上的地址,且不能重复,不规律的地方是只要你满足以上的要求,就可以随意设定,但实际完成地址映射的地方不是头文件,头文件只是一个声明而已,所以不能像你这样子随意声明一下,这个具体映射是在一个C文件完成的,具体什么名字忘了,你可以在内核中搜一下S3C2410_VA_CS8900宏,看在哪些C文件中使用过,然后就可以找出来具体映射的地方了
从你贴出来的头文件来看,你那个内核封装得很好,用了一个S3C2410_ADDR基准虚拟地址,然后再加上一个在括号内的偏移地址,只要你在声明的时候把那个偏移地址设成不与其它片选所占用的虚拟地址范围重叠,然后在具体映射的地方加入类似的代码,就应该可以了
推荐你还是用动态映射吧,这样更简单一点
=========================================================================
看一下ARM芯片资料,每个片选的地址范围都在这部分说明的
2 使用动态映射(ioremap)还是静态映射(如下)好哩?
================================================
都可以,静态映射需要重新编内核,而且要考虑你想要的地址段是否被占用的问题,动态映射可以在驱动中完成
3 我在内核源代码INCLUDE下面的map.h看到静态映射的设置,那写虚拟地址是怎么设置的啊,有规律吗
我如果想增加个外设,是否也可以设为
S3C2410_ADDR(0x01300000)?
====================================================
有一定规律,但也不完全是规律,规律就是虚拟地址范围一定要在0xC0000000以上的地址,且不能重复,不规律的地方是只要你满足以上的要求,就可以随意设定,但实际完成地址映射的地方不是头文件,头文件只是一个声明而已,所以不能像你这样子随意声明一下,这个具体映射是在一个C文件完成的,具体什么名字忘了,你可以在内核中搜一下S3C2410_VA_CS8900宏,看在哪些C文件中使用过,然后就可以找出来具体映射的地方了
从你贴出来的头文件来看,你那个内核封装得很好,用了一个S3C2410_ADDR基准虚拟地址,然后再加上一个在括号内的偏移地址,只要你在声明的时候把那个偏移地址设成不与其它片选所占用的虚拟地址范围重叠,然后在具体映射的地方加入类似的代码,就应该可以了
推荐你还是用动态映射吧,这样更简单一点
|
现在已经推荐用ioremap,可能其中的一个原因也是现在的片内外设越来越多了,
但不是同一时刻都要用,所以用的时候ioreamp,不用的时候再iounremap
但不是同一时刻都要用,所以用的时候ioreamp,不用的时候再iounremap