打印

wince相关,骗观众眼球

[复制链接]
2802|9
手机看帖
扫描二维码
随时随地手机跟帖
沙发
high|  楼主 | 2008-3-11 13:33 | 只看该作者

sysgen环境变量到底怎么产生作用的?


在使用pb的时候,我们增加一个feather,事实上只是增加了这个feather对应的sysgen变量而已,如此简单. Sysgen变量本质是一个环境变量,它怎么可以影响代码,影响镜像的生成,影响注册表等所有相关的东西?比如,我增加一个usb鼠标功能,对应的是sysgen_usb_hid_mouse.你可以在pb的图形界面下从catalog窗口中add to os designed,也可以在环境变量中直接增加. 这背后是怎么回事? 

回忆我对linux浅薄了解.linux下面事实上也是有这样一个神奇的东西.大概叫什么config的东西,用户可以在文本或者图形界面menuconfig下配置.然后就可以影响代码了.我当时的了解是,这事情是有幕后黑手make工具来实现的,它得到这些配置后,强行在源代码前插入一个大概叫config.h这样的头文件,从而环境变量变成了c和c++能够识别的宏变量了! 

对于wince呢?其实也是类似的.这个幕后黑手是winceos.bat等这些批处理文件,他们根据环境变量设定,最后产生了一个叫做ceconfig.h的头文件.然后CeFilter.exe根据环境变量和宏变量去过滤代码,注册表,bib文件等等.于是我们可以看到大量的开关,类似这样 

如果是宏,大概呈现为这样形式:@CESYSGEN IF CE_MODULES_NK 

如果是环境变量,呈现为这样形式:IF IMGPROFILER ! 

有了上面的了解后,阅读bib,reg等等文件就不会再困惑了.

使用特权

评论回复
板凳
high|  楼主 | 2008-3-11 13:34 | 只看该作者

于full kernel mode和驱动访问寄存器或者内存的方式


驱动肯定要大量访问芯片的寄存器地址和内存.在没有MMU的时候是很惬意的事情.但在wince物理地址’消失’了,所有地址都被映射成为虚拟地址,wince的内核使用一张地址映射表转换物理地址到虚拟地址.在bsp下面可以找到这张表.比如对于arm,一般是在bsp的kernelhalarmmap.a.或者wince5的会放在srcincoemaddrtbl_cfg.inc中. 

g_oalAddressTable 

  

        DCD     0x80000000, 0x02000000, 30      

        DCD     0x82000000, 0x08000000, 32 

…省略… 

END 

因此,内核访问物理地址时候,需要访问上面的表转换后的虚拟地址.(这很容易手工算出来,因为是线性表.)遗憾的是,这是内核才享有的便利.驱动在正常情况下是不可以这样访问的.驱动如何访问物理地址.对,就是使用VirtualAlloc和VirtualCopy这2个api组合得到指向指定的物理地址对应的虚拟地址.(如果dma需要一片物理连续的内存,使用HalAllocateCommonBuffer来获得.)记得当时,我和网友讨论的是驱动能不能不用VirtualCopy这样的api,而直接象内核那样直接访问虚拟地址.其实是可以的! 

我们知道,驱动是工作在用户态的,正常情况下,是无法做到的.但是可以使用SetKMode , SetProcPermissions这样的方法进入内核态.或者,在选择build时候,选择full kernel mode.—好像现在dopoda等wm产品都是这样,据说目的是提高性能.

使用特权

评论回复
地板
high|  楼主 | 2008-3-11 13:34 | 只看该作者

eboot中如何使用中断.(增加usb功能)


Samsung的cpu,nand启动.想在eboot中使用中断,进而使用usb下载功能.怎么办? 

1.Eboot是工作在mmu开启的虚拟地址模式下. 

2.arm在发生中断时候会跳动地址0x18.但eboot不在0地址运行.地址0是4k的nboot程序. 

方法.eboot直接修改地址0x18的中断跳转指令,将它指向新的地址,指向自己的中断服务程序. 

#define pISR        (*(unsigned *)(0x00000000+0x18)) 

pISR =(unsigned)(0xEA000000)+(((unsigned)IsrHandler-(0x8c000000+0x18+0x8) )>>2); 

上面第二条是构造一个跳转指令,相当于b IsrHandler这样的指令. 0xEA000000是b,后面的是计算相对偏移地址.具体是0x8c000000还是0x80000000要看你的MMU的映射表来决定.另外因为arm流水线特殊性,中断调用和普通调用不同,主要是返回地址的区别,所以IsrHandler需要处理中断返回地址和寄存器保护等工作,然后跳动用户isr. 

    LEAF_ENTRY IsrHandler 

sub lr, lr, #4 

stmfd   sp!, {r0-r12,lr} 

mov r0, lr 

bl    IsrUsbd 

ldmfd   sp!, {r0-r12,lr} 

movs pc, lr 

ENDP 

如上面,在中断发生时候就会自动跳转到IsrUsbd这个中断服务函数里面了.这个函数是普通的函数.最后需要注意的是,初始化时候,你要允许中断发生,中断使能.特别是相关的io配置.

使用特权

评论回复
5
high|  楼主 | 2008-3-11 13:39 | 只看该作者

期待交流

使用特权

评论回复
6
老狼| | 2008-3-11 13:54 | 只看该作者

你小子这些日子跑哪去了?

才现身?

使用特权

评论回复
7
high|  楼主 | 2008-3-11 13:59 | 只看该作者

狼兄


俺在忙啊.

问俺忙啥?

其实俺就忙2个字

哪2个字?

死,活!...

呵呵,忙死忙活啊!

使用特权

评论回复
8
阿南| | 2008-3-11 19:17 | 只看该作者

那么辛苦,不给条裤子,似乎有点对不住

使用特权

评论回复
9
LPcfANS| | 2008-3-12 09:58 | 只看该作者

hao...

使用特权

评论回复
10
graby| | 2008-3-12 14:58 | 只看该作者

74HC4052问题

请问74HC4052用3.3V供电时,开关效果怎么样,有用过的,请指导小弟一下好吗。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

1078

帖子

0

粉丝