Windows CE外部设备虚拟地址映射问题

graduated 2008-12-02 10:24:56
开发平台:ARM + S3C2440
外设驱动:SM501 图形显示芯片(带二维图形加速功能,暂时没用到)
遇到的问题:通过KITL调试,返回的信息提示DATA ABORT。以为是显示缓存设的太小,在注册表中更改缓存的大小为8M,并在config.bib中添加此部分声明。仍然提示上述错误。

着手驱动程序(添加驱动程序的时候根本没有看源代码,只是将生成的dll文件添加进去,汗!!!)
发现里面虚拟地址和实际的物理地址对应有问题。

原因是这样的:比如501的MMIO_BASE+60寄存器为Device ID,高4位为设备ID号,这个ID号在我调试硬件的时候已经确定了,是正确的,和手册上一样为0x501。

而程序中得到的结果不对。

源程序如下:
pss->m_pREG = (unsigned char *)VirtualAddress(pss->m_nREGPhysical, pss->RegMemorySize());
RETAILMSG(1, (TEXT("m_pREG = 0x%08X 0x%08X\r\n"), pss->m_pREG, *(volatile unsigned long *)(pss->m_pREG + 0x60)));

其中pss->m_nREGPhysical为寄存器段物理起始地址,由注册表获得。

输出的结果为:
m_pREG = 0x44300000 0x23E00FF2
...全文
202 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
gengwu 2009-01-12
  • 打赏
  • 举报
回复
看不懂,才刚刚入门,以后请大家多多指教……
abu_pku 2009-01-11
  • 打赏
  • 举报
回复
请问你说的OAL层初始化问题具体是怎样的问题啊?

谢谢!很想知道具体原因是什么!
gooogleman 2008-12-05
  • 打赏
  • 举报
回复
这样看不出来,KITL信息只有这么多?

如果文件系统已经起来,已经能加载驱动,那么估计已经起来了。


楼主,估计已经起来了吧。因为起不来,在debug模式下的KITL会在死掉的地方弹出对话框的。

debug也不是很好,输出的信息太多了,烦人。

你仔细看看你的液晶有没有隐约的画面,看看时间是不是在走,如果有,那么就是起来了。只是不知道什么原因,那个背光驱动没有运行,建议楼主一直让液晶背光开着。

我上次搞的好郁闷,由于液晶背光没有了,我以为没有起来,狂编译了几天啊。哈哈
graduated 2008-12-05
  • 打赏
  • 举报
回复
这个问题已经解决,是由于oal层的初始化程序有问题,改过后好了。可以读取设备id了,但是显示屏上什么也没有,而且WinCE也没有起来,目前不知道问题出在那里

下面是kitl传回的debug信息,高手参考一下:
2253 PID:8de66902 TID:8df9a8be SMIVGX - FrameBuffer Base = 0x20000000.
2260 PID:8de66902 TID:8df9a8be SMIVGX - Register Base = 0x23E00000.
2267 PID:8de66902 TID:8df9a8be SMIVGX - SDRAM Base = 0x88000000.
2274 PID:8de66902 TID:8df9a8be SMIVGX - VGXDMA buffer Base = 0x88800000.
2281 PID:8de66902 TID:8df9a8be SMIVGX - VGXDMA buffer size = 0x00200000.
2288 PID:8de66902 TID:8df9a8be Detect Card
2294 PID:8de66902 TID:8df9a8be m_pLAW = 0x46000000
2300 PID:8de66902 TID:8df9a8be m_pREG = 0x44300000 0x050100A0
2307 PID:8de66902 TID:8df9a8be jkjkjkjkjkjkjkj
2312 PID:8de66902 TID:8df9a8be SMIVGX - MONITOR #0
2318 PID:8de66902 TID:8df9a8be m_nChipID = 0x00000501
2324 PID:8de66902 TID:8df9a8be m_nLAWPhysical = 0x20000000
2329 PID:8de66902 TID:8df9a8be m_pLAW = 0x46000000
2335 PID:8de66902 TID:8df9a8be m_nREGPhysical = 0x23E00000
2341 PID:8de66902 TID:8df9a8be m_pREG = 0x44300000
2347 PID:8de66902 TID:8df9a8be m_pREG = 0x00000002
2352 PID:8de66902 TID:8df9a8be cccccccccccccccc
2359 PID:8de66902 TID:8df9a8be jkjkjkj----SMIVGX - Video Memory Size = 9109504.
2805 PID:8de66902 TID:8df9a8be OEMIoControl: Unsupported Code 0x10100fc - device 0x0101 func 63
2883 PID:8de66902 TID:8df9a8be XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXaaa=0x0008000C 80000000
2995 PID:8de66902 TID:8df9a8be XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXaaa=0x00080204 80180000
3003 PID:8de66902 TID:8df9a8be XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXaaa=0x00013305 00010000
3011 PID:8de66902 TID:8df9a8be XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXaaa=0x00010901 00010B05
3116 PID:8de66902 TID:8df9a8be XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXaaa=0x0008000C 80000000
graduated 2008-12-04
  • 打赏
  • 举报
回复
VirtualAddress使用的是MmMapIoSpace()函数进行地址分配的


源码如下:
PUCHAR VirtualAddress(ULONG StartAddress, ULONG Length)
{
#ifndef HOST_ENABLE
ULONG inIoSpace;
#endif
PHYSICAL_ADDRESS ioPhysicalBase;
PUCHAR pjAddress;

#if 0 // Enable this section of the code for certain platforms, as necessary

// Some platform may not need this part...

#else
// Do translate to System address
#ifndef HOST_ENABLE
inIoSpace = 0;
#endif
ioPhysicalBase.HighPart = 0;
ioPhysicalBase.LowPart = StartAddress;
#ifndef HOST_ENABLE
if (!HalTranslateBusAddress(PCIBus, 0, ioPhysicalBase,
&inIoSpace,&ioPhysicalBase)
)
{
return(NULL);
}
#endif
#endif

#if 0//defined(XSCALE) // Enable this section of the code for certain platforms, as necessary

// Allocate a pointer that holds the virtual address.
pjAddress = (PUCHAR) VirtualAlloc(0, Length, MEM_RESERVE, PAGE_NOACCESS);
if (pjAddress == NULL)
return(NULL);

// (ioPhysicalBase.LowPart >> 8) because of PAGE_PHYSICAL flag
if (!VirtualCopy((PVOID) pjAddress, (PVOID) (ioPhysicalBase.LowPart >> 8), Length,
PAGE_READWRITE | PAGE_NOCACHE | PAGE_PHYSICAL))
{
VirtualFree((PVOID)pjAddress, 0, MEM_RELEASE);
return(NULL);
}

#else

pjAddress = (UCHAR*) MmMapIoSpace(ioPhysicalBase, Length, FALSE);

#endif

return(pjAddress);
}
lmlmlmnew 2008-12-03
  • 打赏
  • 举报
回复
虚拟地址映射物理地址用的API是
VirtualAlloc和VirtualCopy

VirtualAddress应该是封装了这两个API吧,先去看看这个API有没有啥问题,VirtualCopy如果用的是物理地址,首先应该对物理地址 >>8位 然后再放入VirtualCopy中。

按你的说法0x23E00FF2 应该有501这个ID
没有的话可能就是注册表的 寄存器段物理起始地址 是错误的了~~
这个驱动先前用的机型和现在放的机型是不一样的吧?
你可以在Debug下看看这个物理地址里面的数据到底是什么?如果不是501 就说明物理地址有问题了~~
gooogleman 2008-12-02
  • 打赏
  • 举报
回复
如果使用KITL应该可以找出异常的地方的

异常有可能是访问了野指针等原因。你仔细看看了。
hzdysymbol 2008-12-02
  • 打赏
  • 举报
回复
0x44300000这地址也不能直接访问吧?
*(volatile unsigned long *)(pss->m_pREG + 0x60)这是指这个地址加上0x60后得到的地址的值的大小吧,不知道我有没有看花眼?
VirtualAddress()干什么用的?

19,504

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧