4483|8

68

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

Windows CE外部设备虚拟地址映射问题 [复制链接]

开发平台: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

最新回复

看不懂,才刚刚入门,以后请大家多多指教……  详情 回复 发表于 2009-1-12 11:26
点赞 关注

回复
举报

75

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
0x44300000这地址也不能直接访问吧?
*(volatile unsigned long *)(pss->m_pREG + 0x60)这是指这个地址加上0x60后得到的地址的值的大小吧,不知道我有没有看花眼?
VirtualAddress()干什么用的?
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
如果使用KITL应该可以找出异常的地方的

异常有可能是访问了野指针等原因。你仔细看看了。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

4
 
虚拟地址映射物理地址用的API是
VirtualAlloc和VirtualCopy

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

按你的说法0x23E00FF2 应该有501这个ID
没有的话可能就是注册表的 寄存器段物理起始地址 是错误的了~~
这个驱动先前用的机型和现在放的机型是不一样的吧?
你可以在Debug下看看这个物理地址里面的数据到底是什么?如果不是501 就说明物理地址有问题了~~
 
 
 

回复

78

帖子

0

TA的资源

五彩晶圆(初级)

5
 
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);
}
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

6
 
这个问题已经解决,是由于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
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

7
 
这样看不出来,KITL信息只有这么多?

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


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

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

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

我上次搞的好郁闷,由于液晶背光没有了,我以为没有起来,狂编译了几天啊。哈哈
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

8
 
请问你说的OAL层初始化问题具体是怎样的问题啊?

谢谢!很想知道具体原因是什么!
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

9
 
看不懂,才刚刚入门,以后请大家多多指教……
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表