wince相关,骗观众眼球

[复制链接]
3558|9
 楼主| high 发表于 2008-3-11 13:33 | 显示全部楼层 |阅读模式
wince相关的小文,骗观众眼球<br />
 楼主| high 发表于 2008-3-11 13:33 | 显示全部楼层

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

<br />在使用pb的时候,我们增加一个feather,事实上只是增加了这个feather对应的sysgen变量而已,如此简单.&nbsp;Sysgen变量本质是一个环境变量,它怎么可以影响代码,影响镜像的生成,影响注册表等所有相关的东西?比如,我增加一个usb鼠标功能,对应的是sysgen_usb_hid_mouse.你可以在pb的图形界面下从catalog窗口中add&nbsp;to&nbsp;os&nbsp;designed,也可以在环境变量中直接增加.&nbsp;这背后是怎么回事?&nbsp;<br /><br />回忆我对linux浅薄了解.linux下面事实上也是有这样一个神奇的东西.大概叫什么config的东西,用户可以在文本或者图形界面menuconfig下配置.然后就可以影响代码了.我当时的了解是,这事情是有幕后黑手make工具来实现的,它得到这些配置后,强行在源代码前插入一个大概叫config.h这样的头文件,从而环境变量变成了c和c++能够识别的宏变量了!&nbsp;<br /><br />对于wince呢?其实也是类似的.这个幕后黑手是winceos.bat等这些批处理文件,他们根据环境变量设定,最后产生了一个叫做ceconfig.h的头文件.然后CeFilter.exe根据环境变量和宏变量去过滤代码,注册表,bib文件等等.于是我们可以看到大量的开关,类似这样&nbsp;<br /><br />如果是宏,大概呈现为这样形式:@CESYSGEN&nbsp;IF&nbsp;CE_MODULES_NK&nbsp;<br /><br />如果是环境变量,呈现为这样形式:IF&nbsp;IMGPROFILER&nbsp;!&nbsp;<br /><br />有了上面的了解后,阅读bib,reg等等文件就不会再困惑了.<br />
 楼主| high 发表于 2008-3-11 13:34 | 显示全部楼层

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

<br />驱动肯定要大量访问芯片的寄存器地址和内存.在没有MMU的时候是很惬意的事情.但在wince物理地址’消失’了,所有地址都被映射成为虚拟地址,wince的内核使用一张地址映射表转换物理地址到虚拟地址.在bsp下面可以找到这张表.比如对于arm,一般是在bsp的kernelhalarmmap.a.或者wince5的会放在srcincoemaddrtbl_cfg.inc中.&nbsp;<br /><br />g_oalAddressTable&nbsp;<br /><br />&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DCD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x80000000,&nbsp;0x02000000,&nbsp;30&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DCD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x82000000,&nbsp;0x08000000,&nbsp;32&nbsp;<br /><br />…省略…&nbsp;<br /><br />END&nbsp;<br /><br />因此,内核访问物理地址时候,需要访问上面的表转换后的虚拟地址.(这很容易手工算出来,因为是线性表.)遗憾的是,这是内核才享有的便利.驱动在正常情况下是不可以这样访问的.驱动如何访问物理地址.对,就是使用VirtualAlloc和VirtualCopy这2个api组合得到指向指定的物理地址对应的虚拟地址.(如果dma需要一片物理连续的内存,使用HalAllocateCommonBuffer来获得.)记得当时,我和网友讨论的是驱动能不能不用VirtualCopy这样的api,而直接象内核那样直接访问虚拟地址.其实是可以的!&nbsp;<br /><br />我们知道,驱动是工作在用户态的,正常情况下,是无法做到的.但是可以使用SetKMode&nbsp;,&nbsp;SetProcPermissions这样的方法进入内核态.或者,在选择build时候,选择full&nbsp;kernel&nbsp;mode.—好像现在dopoda等wm产品都是这样,据说目的是提高性能.<br />
 楼主| high 发表于 2008-3-11 13:34 | 显示全部楼层

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

<br />Samsung的cpu,nand启动.想在eboot中使用中断,进而使用usb下载功能.怎么办?&nbsp;<br /><br />1.Eboot是工作在mmu开启的虚拟地址模式下.&nbsp;<br /><br />2.arm在发生中断时候会跳动地址0x18.但eboot不在0地址运行.地址0是4k的nboot程序.&nbsp;<br /><br />方法.eboot直接修改地址0x18的中断跳转指令,将它指向新的地址,指向自己的中断服务程序.&nbsp;<br /><br />#define&nbsp;pISR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*(unsigned&nbsp;*)(0x00000000+0x18))&nbsp;<br /><br />pISR&nbsp;=(unsigned)(0xEA000000)+(((unsigned)IsrHandler-(0x8c000000+0x18+0x8)&nbsp;)&gt&gt2);&nbsp;<br /><br />上面第二条是构造一个跳转指令,相当于b&nbsp;IsrHandler这样的指令.&nbsp;0xEA000000是b,后面的是计算相对偏移地址.具体是0x8c000000还是0x80000000要看你的MMU的映射表来决定.另外因为arm流水线特殊性,中断调用和普通调用不同,主要是返回地址的区别,所以IsrHandler需要处理中断返回地址和寄存器保护等工作,然后跳动用户isr.&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;LEAF_ENTRY&nbsp;IsrHandler&nbsp;<br /><br />sub&nbsp;lr,&nbsp;lr,&nbsp;#4&nbsp;<br /><br />stmfd&nbsp;&nbsp;&nbsp;sp!,&nbsp;{r0-r12,lr}&nbsp;<br /><br />mov&nbsp;r0,&nbsp;lr&nbsp;<br /><br />bl&nbsp;&nbsp;&nbsp;&nbsp;IsrUsbd&nbsp;<br /><br />ldmfd&nbsp;&nbsp;&nbsp;sp!,&nbsp;{r0-r12,lr}&nbsp;<br /><br />movs&nbsp;pc,&nbsp;lr&nbsp;<br /><br />ENDP&nbsp;<br /><br />如上面,在中断发生时候就会自动跳转到IsrUsbd这个中断服务函数里面了.这个函数是普通的函数.最后需要注意的是,初始化时候,你要允许中断发生,中断使能.特别是相关的io配置.<br />
 楼主| high 发表于 2008-3-11 13:39 | 显示全部楼层

期待交流

  <br /> 相关链接:<a href='http://chenyq2008.spaces.live.com/'>http://chenyq2008.spaces.live.com/</a>
老狼 发表于 2008-3-11 13:54 | 显示全部楼层

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

才现身?
 楼主| high 发表于 2008-3-11 13:59 | 显示全部楼层

狼兄

<br />俺在忙啊.<br /><br />问俺忙啥?<br /><br />其实俺就忙2个字<br /><br />哪2个字?<br /><br />死,活!...<br /><br />呵呵,忙死忙活啊!
阿南 发表于 2008-3-11 19:17 | 显示全部楼层

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

  
LPcfANS 发表于 2008-3-12 09:58 | 显示全部楼层

hao...

  
graby 发表于 2008-3-12 14:58 | 显示全部楼层

74HC4052问题

请问74HC4052用3.3V供电时,开关效果怎么样,有用过的,请指导小弟一下好吗。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

1078

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部