在C:\WINCE500\PLATFORM\SMDK2410\Inc\s2410.h 中定义了很多的2410的外部接口结构体,比如IOP,SPI等,SPI寄存器口定义如下:
//
// SPI
//
#define SSP_BASE 0xB1900000 // 0x59000000
typedef struct {
unsigned int rSPCON0; // 00
unsigned int rSPSTA0;
unsigned int rSPPIN0;
unsigned int rSPPRE0;
unsigned int rSPTDAT0; // 10
unsigned int rSPRDAT0;
unsigned int rPAD[2];
unsigned int rSPCON1; // 20
unsigned int rSPSTA1;
unsigned int rSPPIN1;
unsigned int rSPPRE1;
unsigned int rSPTDAT1; // 30
unsigned int rSPRDAT1;
}SSPreg ;
我想问的就是" #define SSP_BASE 0xB1900000 // 0x59000000 "宏中的0x59000000是SPI的物理基地址,那0xB1900000是什么地址呢,又在哪个文件定义的?
另:我在串口驱动的程序中看到了这样的两个函数
PRIVATE PVOID
SER_RegAlloc(PVOID addr, INT sz)
{
PVOID reg;
reg = (PVOID)VirtualAlloc(0, sz, MEM_RESERVE, PAGE_NOACCESS);
if (reg)
{
if (!VirtualCopy(reg, addr, sz, PAGE_READWRITE | PAGE_NOCACHE ))
{
VirtualFree(reg, sz, MEM_RELEASE);
reg = NULL;
}
}
return reg;
}
和
PRIVATE BOOL
SER_VirtualAlloc(VOID)
{
BOOL r = FALSE;
RETAILMSG(DEBUGMODE,(TEXT("::: SER_VirtualAlloc()\r\n")));
do
{
v_pIOPregs = (volatile IOPreg *)SER_RegAlloc((PVOID) IOP_BASE, sizeof(IOPreg));
if (v_pIOPregs == NULL)
{
ERRORMSG(1,(TEXT("For IOPreg: VirtualAlloc failed!\r\n")));
break;
}
.
.
类上
.
} while (0);
if (!r)
{
SER_VirtualFree();
RETAILMSG(DEBUGMODE,(TEXT("::: SER_VirtualAlloc() - Fail\r\n")));
}
else
{
RETAILMSG(DEBUGMODE,(TEXT("::: SER_VirtualAlloc() - Success\r\n")));
}
return r;
}
其中红色的部分的值定义时也是类似最上面的一个宏#define IOP_BASE 0xB1600000 // 0x56000000,同样后面是物理地址,前面地址不知道是什么,在我看来他们是两个用于物理地址和虚拟地址映射并创建IO口的控制寄存器结构的两个函数,但是在SER_RegAlloc()函数中用到的VirtualAlloc()居然用的是addr当物理地址参数,即从Ser_VirtualAlloc()传递过来的IOP_BASE(即0xB1600000),而非IO口的物理基地址0x56000000,这个问题和上面的很类似,我就不知道要用这个地址,而不是物理地址,小弟新人,还请各位前辈指教,多谢.
8 个解决方案
#1
我修改不了题目了...@_@...
#2
0xB1600000是虚拟地址,是经过MMU映射过的地址,访问这个地址就是访问0x56000000地址。
#3
那为什么在VirtualCopy()函数中的第二个函数要用这虚拟地址呢,我看了它的函数原形应该是物理地址才对啊.第一个参数才是虚拟地址呢
有人告诉我说这个值是用这个公式推出来的:虚拟地址=物理>>4位 + 0xac000000,我算了一下,UART,SIP等其它口的基地址都符合这个公式,在s2410.h中有他的宏定义:
" #define DMA_BUFFER_BASE 0xAC000000 "
他怎么和MDA有关了呢,看注释好象和config.bib有关的吧
如果嫌点数不够我可以再加,多谢
有人告诉我说这个值是用这个公式推出来的:虚拟地址=物理>>4位 + 0xac000000,我算了一下,UART,SIP等其它口的基地址都符合这个公式,在s2410.h中有他的宏定义:
" #define DMA_BUFFER_BASE 0xAC000000 "
他怎么和MDA有关了呢,看注释好象和config.bib有关的吧
如果嫌点数不够我可以再加,多谢
#4
问题有所进展,原来那个0xB1900000 是在map.a文件定义的虚拟地址的基础上加上0x20000000之后,对应到了无缓冲的内核空间内的,是内核中的静态虚拟地址映射.
但是,我要是想换板子上的FLASH和SDRAM的话,应该怎么改呢,除了这个文件还要改哪儿呢?
大家给点意见,多谢了
但是,我要是想换板子上的FLASH和SDRAM的话,应该怎么改呢,除了这个文件还要改哪儿呢?
大家给点意见,多谢了
#5
问题有所进展,原来那个0xB1900000 是在map.a文件定义的虚拟地址的基础上加上0x20000000之后,对应到了无缓冲的内核空间内的,是内核中的静态虚拟地址映射.
但是,我要是想换板子上的FLASH和SDRAM的话,应该怎么改呢,除了这个文件还要改哪儿呢?
大家给点意见,多谢了
但是,我要是想换板子上的FLASH和SDRAM的话,应该怎么改呢,除了这个文件还要改哪儿呢?
大家给点意见,多谢了
#6
问题有所进展,原来那个0xB1900000 是在map.a文件定义的虚拟地址的基础上加上0x20000000之后,对应到了无缓冲的内核空间内的,是内核中的静态虚拟地址映射.
但是,我要是想换板子上的FLASH和SDRAM的话,应该怎么改呢,除了这个文件还要改哪儿呢?
大家给点意见,多谢了
但是,我要是想换板子上的FLASH和SDRAM的话,应该怎么改呢,除了这个文件还要改哪儿呢?
大家给点意见,多谢了
#7
问题有所进展,原来那个0xB1900000 是在map.a文件定义的虚拟地址的基础上加上0x20000000之后,对应到了无缓冲的内核空间内的,是内核中的静态虚拟地址映射.
但是,我要是想换板子上的FLASH和SDRAM的话,应该怎么改呢,除了这个文件还要改哪儿呢?
大家给点意见,多谢了
但是,我要是想换板子上的FLASH和SDRAM的话,应该怎么改呢,除了这个文件还要改哪儿呢?
大家给点意见,多谢了
#8
至今还没解决,
无奈到期结贴,
若有好汉帮忙,
小弟先道感谢.
QQ:309881451
现在的问题是:表态地址映射里里的那个表是根据什么来编写的呢,按WIN CE来说是应该从0x80000000开始.这点没错,可是后面的那二十六行是怎么确定的虚拟地址的呢,难道只要给每个外设的寄存器分配够大了就可以了?
……
#1
我修改不了题目了...@_@...
#2
0xB1600000是虚拟地址,是经过MMU映射过的地址,访问这个地址就是访问0x56000000地址。
#3
那为什么在VirtualCopy()函数中的第二个函数要用这虚拟地址呢,我看了它的函数原形应该是物理地址才对啊.第一个参数才是虚拟地址呢
有人告诉我说这个值是用这个公式推出来的:虚拟地址=物理>>4位 + 0xac000000,我算了一下,UART,SIP等其它口的基地址都符合这个公式,在s2410.h中有他的宏定义:
" #define DMA_BUFFER_BASE 0xAC000000 "
他怎么和MDA有关了呢,看注释好象和config.bib有关的吧
如果嫌点数不够我可以再加,多谢
有人告诉我说这个值是用这个公式推出来的:虚拟地址=物理>>4位 + 0xac000000,我算了一下,UART,SIP等其它口的基地址都符合这个公式,在s2410.h中有他的宏定义:
" #define DMA_BUFFER_BASE 0xAC000000 "
他怎么和MDA有关了呢,看注释好象和config.bib有关的吧
如果嫌点数不够我可以再加,多谢
#4
问题有所进展,原来那个0xB1900000 是在map.a文件定义的虚拟地址的基础上加上0x20000000之后,对应到了无缓冲的内核空间内的,是内核中的静态虚拟地址映射.
但是,我要是想换板子上的FLASH和SDRAM的话,应该怎么改呢,除了这个文件还要改哪儿呢?
大家给点意见,多谢了
但是,我要是想换板子上的FLASH和SDRAM的话,应该怎么改呢,除了这个文件还要改哪儿呢?
大家给点意见,多谢了
#5
问题有所进展,原来那个0xB1900000 是在map.a文件定义的虚拟地址的基础上加上0x20000000之后,对应到了无缓冲的内核空间内的,是内核中的静态虚拟地址映射.
但是,我要是想换板子上的FLASH和SDRAM的话,应该怎么改呢,除了这个文件还要改哪儿呢?
大家给点意见,多谢了
但是,我要是想换板子上的FLASH和SDRAM的话,应该怎么改呢,除了这个文件还要改哪儿呢?
大家给点意见,多谢了
#6
问题有所进展,原来那个0xB1900000 是在map.a文件定义的虚拟地址的基础上加上0x20000000之后,对应到了无缓冲的内核空间内的,是内核中的静态虚拟地址映射.
但是,我要是想换板子上的FLASH和SDRAM的话,应该怎么改呢,除了这个文件还要改哪儿呢?
大家给点意见,多谢了
但是,我要是想换板子上的FLASH和SDRAM的话,应该怎么改呢,除了这个文件还要改哪儿呢?
大家给点意见,多谢了
#7
问题有所进展,原来那个0xB1900000 是在map.a文件定义的虚拟地址的基础上加上0x20000000之后,对应到了无缓冲的内核空间内的,是内核中的静态虚拟地址映射.
但是,我要是想换板子上的FLASH和SDRAM的话,应该怎么改呢,除了这个文件还要改哪儿呢?
大家给点意见,多谢了
但是,我要是想换板子上的FLASH和SDRAM的话,应该怎么改呢,除了这个文件还要改哪儿呢?
大家给点意见,多谢了
#8
至今还没解决,
无奈到期结贴,
若有好汉帮忙,
小弟先道感谢.
QQ:309881451
现在的问题是:表态地址映射里里的那个表是根据什么来编写的呢,按WIN CE来说是应该从0x80000000开始.这点没错,可是后面的那二十六行是怎么确定的虚拟地址的呢,难道只要给每个外设的寄存器分配够大了就可以了?
……