BIOS原理是这样的,打印一些串口信息,并且从PC发送一些命令过来执行一些动作。
BIOS的关键代码如下
- Uart_Printf("/r/nPlease select function : /r/n");
- //菜单打印
- for(i=0; CmdTip[i].fun!=0; i++)
- printf("%d : %s/n", i, CmdTip[i].tip);
- Uart_Printf("/n");
- Uart_Printf("==============================================");
- Uart_Printf("/n");
- //-----------changed for autorun wince by wogo at 08-11-08
- //if(autorun_trig)
- // NandLoadRun(); //run it in svc mode
- //等待按键
- idx = Uart_Getch();//如果没有发送数据过来会造成无限等待
- //if(autorun_trig)
- //NandLoadRun(); //run it in svc mode
- //Uart_Printf("============Test run where?====================");
- if(idx!=0)
- {
- autorun_ds =1;//如果有按键按下,就禁止wince自动运行。
- idx -= '0'; //ASCII码转换为数字
- if(idx<i)
- {
- //执行操作
- (*CmdTip[idx].fun)();
- }
- }
- autorun_ds = 1;//---------这个貌似很关键---
这里最要注意的是串口了,串口放在死循环里面,如果没有发送数据过来。就会造成无限等待。这是我后来最难解决的地方了。
刚开始我把启动wince函数放在定时器中断函数里面,相当郁闷,当拷贝完NK以后,就不动了。后来分析原来拷贝完刚好跳出定时器中断,返回中断入口——即是串口等待处,而此时内存的东西已经改变,即是输入东西,串口也没有反映,这样就造成程序死了,——机器也死了。
后来我把串口函数改成如下——在串口等待处做文章,终于可以启动起来了。
- //=====================================================================
- char Uart_Getch(void)
- {
- Uart_Printf("RunFlag=%d/n", RunFlag);
- //----下个if不起作用
- if(RunFlag)
- {
- Uart_Printf("RunFlag=%d/n", RunFlag);
- NandLoadRun();
- }
- if(whichUart==0)
- {
- while(!(rUTRSTAT0 & 0x1)); //Receive data ready
- return RdURXH0();
- }
- else if(whichUart==1)
- {
- //while(!(rUTRSTAT1 & 0x1));//Receive data ready
- while(!(rUTRSTAT1 & 0x1))
- {
- if(RunFlag)//关键所在,在串口等待处启动wince,非常合适
- {
- Uart_Printf("RunFlag=%d/n", RunFlag);
- NandLoadRun();
- }
- }
- return RdURXH1();
- }
- else if(whichUart==2)
- {
- while(!(rUTRSTAT2 & 0x1)); //Receive data ready
- return RdURXH2();
- }
- #ifdef USE_EXCOM_16652
- else if(whichUart==3)
- {
- return (ser16652_waitchar(EXCOM_A)); //Receive data ready
- }
- else if(whichUart==4)
- {
- return (ser16652_waitchar(EXCOM_B)); //Receive data ready
- }
- #endif
- }
问题解决
后来我想每次都要使用DNW以及串口才能启动wince,这样设计明显不合理的,后来我想了一些办法:就是使用定时器,定时三秒,如果没有发送命令来,就自动启动wince,否则执行相关命令。
哈哈,测试一下怎么上传读片的,以前都不会用CSDN的功能。
https://p-blog.csdn.net/images/p_blog_csdn_net/gooogleman/EntryImages/20081110/触摸屏校正数据.jpg