博文

diff和patch的使用(2009-02-26 15:00:00)

摘要:1) diff/patch这对工具在数学上来说,diff是对2个集合求差,patch是求和 diff A B > C 生成A和B的diff文件C patch A C 给A打上diff文件得到B patch -R B C B还原为A 2) 内核补丁 生成 diff -uNr linux-2.6.xxx linux-2.6.xxx.1 > diff.patch 升级 cp diff.patch linux-2.6.xxx/. cd linux-2.6.xxx patch -p1 < diff.patch 可以参考$(linux_src)/Documentation/applying_patches.txt 还可以参考这一篇:http://www.hzlitai.com.cn/bbs/dispbbs.asp?boardid=28&id=1215 原文地址:http://www.hzlitai.com.cn/article/ARM9-article/system/1632.html......

阅读全文(1749) | 评论:0

WinCE电源管理的实现(2009-02-26 14:56:00)

摘要:[背景和早期版本] 电源管理的目的是节能,基本的节能方法是使系统适时的进出休眠状态.比如用户按下On/Off按钮,或者监视用户活动的定时器超时,或者应用呼叫api都可以使得系统休眠,用户再次按下On/Off或者其他唤醒中断将使得系统退出休眠.从而可见,电源管理模块和用户活动情况密不可分,电源管理是用户活动所驱动的. WinCE中处理用户与系统交互的部分是GWES,所以早期电源管理工作是由GWES来实现.( GWES:Graphics,Windows and Events Subsystem.图形,窗口和事件子系统.主要负责图形输出和用户交互). 但GWES提供的电源管理模块功能过于粗糙死板:所有子设备只能有On和Suspend状态,应用程序无法得到任何状态转换通知,等等……直到WinCE4.0才引入了电源管理模块用以替代GWES中的电源管理功能.(进一步的,为了方便电源管理模块的集中管理,还需要关闭原来GWES对电源管理功能.方法是注册表HKLM\SYSTEM\CurrentControlSet\Control\Power设置DisableGwesPowerOff=1来禁止GWES插手电源管理.系统是默认禁止的.此外,一些用户活动情况仍旧依赖GWES获得,设置注册表HKLM\system\GWE下的ActivityEvent=PowerManager/ActivityTimer/UserActivity.从而告诉GWES,当鼠标,键盘,触摸屏等输入发生时候,GWES要SetEvent这个全局事件以通知电源管理模块.) 新的电源管理模块提供更完整和灵活的功能,系统电源可以自由灵活设定,子设备电源状态可以单独设定,应用可以获得电源通知等等. [系统电源] OEM可以依据需要任意定义系统电源状态,比如On,ScreenOff,UserIdle,SystemIdle,Suspend等.系统电源状态更多的是代表系统电源的一种配置方案,它是各个子设备电源配置的集合.它设定一种可能出现的情景,并且事先拟定了此情景下电力分配策略(哪些子设备打开,哪些子设备关闭).比如,也许On可以代表常规工作的情景,所有子设备打开的状态; ScreenOff可以代表LCD被用户请求关闭的情景,LCD背灯电源被关闭的状态; UserIdle可以代表用户一段时间没有操作的情景,cpu/soc将......

阅读全文(4724) | 评论:3

wince5.0中断的详细解释(2009-02-26 14:50:00)

摘要:1 WinCE中第一次对中断的处理是在OAL的OEMInit()中,该函数调用OALIntrInit()完成对中断的初始化.


2 OALIntrInit()对中断的初始化做了如下工作:

2.1 通过配置IPR0-IPR33设置中断优先级,优先级定义在g_IntPriorities和g_IntPriorities2中,其中IRQ_OSMR0为最高优先级, IRQ_KEYPAD为最低优先级.


2.2 设置ICCR,在空闲模式时只对有效的,非屏蔽的中断响应.


2.3 BSPIntrInit().该函数对BSP中需要处理的中断进行初始化工作,主要是设置ICMR寄存器使GPIO1(CPLD)和GPIO2为非屏蔽状态,然后通过OALIntrStaticTranslate建立IRQ和sysintr之间的关联.


2.4 对于WinCE来说,中断可以作如下分类:
1> 与BSP无关的Kernel使用的内部中断, 比如IRQ_OSMR0(for
sched),IRQ_RTCALARM;

2> 与BSP有关的CPU内部中断,比如IRQ_USBOHCI, IRQ_OSM
R1, IRQ_KEYPAD, IRQ_FFUART, IRQ_BTUART, IRQ_STUART, IRQ_DMAC, IRQ_USBFN;

3> CPLD所管理的中断,以GPIO1通知CPU中断的产生,在收到G
PIO1产生的中断后可以通过读取地址0x0A00_0010判断具体的中断源,比如IRQ_GPIO1_MMCCD(MMC_IN_INT, MMC_OUT_INT), IRQ_GPIO1_USBCD(USB_IN_INT, USB_OUT_INT), IRQ_GPIO1_PCMCIA_S0_CSC(CF_IN_INT. CF_OUT_INT),还有在代码中没有处理的SIM卡中断(SIM_IN_INT, SIM_OUT_INT).

4> GPIO2_120产生的中断,通过寄存器ICIP的位10-GPIO_x通
知CPU中断的产生,然后查询寄存器GEDR_x可以判断具体的中断源,比如IRQ_GPI......

阅读全文(2721) | 评论:0

中断代码结构比较之WinCE4.2 VS WinCE5.0(2009-02-26 14:45:00)

摘要:现在项目要从wince4.2下port到wince5.0下,今天将sd卡的驱动加到wince5下。用的是现有的也就是wince4.2下的驱动程序,几个dll文件:SDBusDriver.dll;SDCSDCard.dll;SDMemory.dll。这个工作主要就是将相应的中断加上就好了。       下面进入正题。4.2下的中断:InterruptInitialize(具体的驱动中注册中断与事件)->SC_InterruptInitialize(系统的函数,可以根据private\winceos\coreos\nk\kernel\kwin32.c中的const PFNVOID Win32Methods[]数组得知这是一个系统函数。这一步为猜测,该函数在private\winceos\coreos\nk\kernel\intrapi.c中实现。enable中断-通过调用下面的函数,之后将相应的事件放入中断事件队列)->DoInterruptEnable(在private\winceos\coreos\nk\kernel\intrapi.c中实现,先调用pfnOEMTranslateSysIntr映射一下,不过我没有找到这个函数指针的原型。之后才是OEMInterruptEnable)->OEMInterruptEnable(在platform\xxx\kernel\hal\cfw.c中,地球人都知道。在这个文件中有个static void OEMInitInterrupts(void),是在oeminit中被调用的,差点被忽悠了。)这只是enable(也包含初始化),相应的disable和done也在相应的文件中实现。可能用4.2用多了,感觉这些中断的处理一气呵成,很容易理解,就是修改或者增加比较麻烦。要分别处理OEMInterruptXXX中相应的各个中断。       5.0下的中断:感觉上就一个字“乱”,主要是这些代码分别放在不同的地方,或许这样更合理化吧,谁知道MS怎么想的。主要分布在以下几个地方:(A1)platform\common\src\common\intr;(A2)platform\common\src\xxx(type of......

阅读全文(1799) | 评论:0

Windows CE内核启动分析(2009-02-26 14:34:00)

摘要: Windows CE内核启动分析 移植或者创建一个BSP,也许需要先熟悉Windows CE的内核启动过程. 目录 基于ARM的Windows CE内核启动分析1 1.startup.s2 2.KernelStart2 2.1 ARMInit()3 2.1.1 OALIntrInit3 2.1.2 OALTimerInit4 2.1.2.1 Variable Tick Scheduler4 2.2 KernelInit()4 2.3 FirstSchedule5   1.startup.s 内核入口点startup.S,内核从这里启动.因为内核经过bootloader加载,内核运行时候,已经由bootloader完成了硬件的基本初始化(关闭watchdog, pll设置等等)所以,startup.S的任务比较简单,只是将oemaddrtab_cfg.inc里面的g_oalAddressTable数组地址作为参数,传递给KernelStart,这个数组用来描述和实现物理地址到虚拟地址的映射. (. + 8)是流水线处理.KernelStart()位于 PRIVATE\WINCEOS\COREOS\NK\KERNEL\ARM\armtrap.s 2.KernelStart ARMInit()位于本目录的mdram.c文件. KernelInit()位于PRIVATE\WINCEOS\COREOS\NK\KERNEL\kwin32.c中. FirstSchedule()位于armtrap.s的一个label. 主要关注ARMInit()和KernelInit(),前一个进行目标板的初始化,后一个负责内核的初始化.FirstSchdule()开始调度第一个程序. 2.1 ARMInit() 先看看ARMInit()它的几个关键性动作如下: KernelRelocate()是进行重定位.KernelFindMemory()是查找系统可用内存,并分成应用内存和object store两部分.这2个函数都已由MS自己实现.我们需要添加的函数是名字以OEM开头的函数. OEMInitDebugSerial()初始化一个调试口,我们一般使用一个串口来作为调试口,这个函数需要自己实现,在 PLATFORM\SMDK2440......

阅读全文(2806) | 评论:0

如何在WINCE4.2/WINCE5.0中“永久”保存设置(保存注册表的方法)(2009-02-26 14:29:00)

摘要:参考的一篇(原连接无效,换上立宇泰的连接): http://www.hzlitai.com.cn/article/ARM9-article/cphelp/20061013319.html 另一篇好文章在“技术频道”里(WINCE4.2下的修改看它就OK了):  http://www.hzlitai.com.cn/article/ARM9-article/cphelp/200706221551350.html   谢谢大家支持,下面分享一下我在WINCE5。0下做好保存设置的方法(用的ARMSYS2440平台,很简单哦,理论的东西就不多说了,上面两篇文章讲得比较清楚了): 第(1)步,在当前Platform下加入Hive-based Registry的支持; 第(2)步,在注册表platform.reg中查找“; HIVE BOOT SECTION”,有两处,在第二处(原来是:IF BSP_NONANDFS !的地方),将; HIVE BOOT SECTION 和 ; END HIVE BOOT SECTION之间的内容替换成: [HKEY_LOCAL_MACHINE\init\BootVars]
    "SystemHive"="system.hv"
    "Start DevMgr"=dword:1
    "RegistryFlags"=dword:1
[HKEY_LOCAL_MACHINE\init\BootVars]
   "DefaultUser"="default" IF BSP_NONANDFS !
[HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\SMFLASH]
    "DriverPath"="Drivers\\BuiltIn\\SMFLASH"
    ; LoadFlags 0x01 == load synchronously
    "LoadFlags"=dword:1
 ......

阅读全文(3822) | 评论:0

ARMSYS2410系列产品FAQ(常见问题快速回答)(2009-02-26 14:21:00)

摘要:请到立宇泰电子论坛中查看最新的FAQ(常见问题快速回答)! 点击下面的链接>> ARMSYS2410系列产品FAQ 问:ARMSYS2410开发板的功耗有多大?
答:ARMSYS2410在25℃环境温度,单板无外接设备的情况下测试的功耗如下: 答:区别主要在于配套液晶屏不同,支持的图形界面不同。
套餐1配套8英寸L80T64型TFT液晶模块,支持WinCE与Qt图形界面;
套餐2配套7.8英寸L78C64型STN液晶模块,支持WinCE图形界面;
套餐3配套3.5英寸L35T23型TFT液晶模块,支持WinCE与Qt图形界面。   测量项目 峰值电流 平均电流 静态电流 ARMSYS2410-CORE 核心板 1.8V 110mA 45 mA 1.2 mA 3.3V 150 mA 80 mA 20 mA ARMSYS2410-B开发套件(核心板+底板) 5.0V输入 370 mA 230 mA 110 mA   问:ARMSYS2410各款套餐的区别是什么?   问:ARMSYS2410-B型开发板上USB接口情况?如何复用USB口?
答:ARMSYS2410型开发板上有三个USB口,其中两个是USB HOST口,一个是USB DEVICE口; USB DEVICE口和上面一个USB HOST口可以复用。S1拨动开关用来切换这个USB口的功能。拨动至SLAVE端,则USB DEVICE口有效,上面的USB HOST口失效;拨动至HOST端,则上面的USB HOST口有效,USB DEVICE口失效。详情请参考用户手册。 问:我需要配置仿真器吗?
答:一般不需要,仅当您需要调试硬件(ADS测试程序)时才需要使用仿真器。通常MultiICE兼容型仿真器无法支持linux的调试,ARMice可以支持,但必须要在kernel中自行移植好GDBServer的支持。虽然仿真器支持WinCE的调试,但由于系统庞大,速度较慢。 问:Linux下支持USB摄像头吗?
答:支持。详细步骤请点击:http://www.hzlitai.com.c......

阅读全文(1677) | 评论:0