nongxiaoming 发表于 2013-5-8 23:46:59

10.1寸白菜平板DIY之使用u-boot进行tftp下载

上一次我们已经写好了启动代码和简单的LED点灯,我们也发现了板子上的u-boot已经帮我们把板子的一些硬件给初始化了,比如系统时钟配置,DDR2内存的初始化等等。经过复位启动板子我发现,u-boot有一秒钟的启动延时。在启动时快速的按下键盘的任意键可跳过u-boot的自动启动,进入到u-boot的命令行,如下图:
attach://110676.jpg
输入"?"或"help"可以看到提供的一些命令,其中就有我们最关心的tftp命令,如下图:

attach://110685.jpg
输入printenv打印出u-boot设置的一些环境变量,我们发现并没有设置serverip和ipaddr,所以直接用tftp是不行的,必须先设置服务ip和板子的ip。
输入"setenv serverip 192.168.0.86"命令设置服务IP,这个为你的TFTP服务器IP,这里设置的是我们电脑的IP,因为我们要在我们的电脑上启动TFTP服务。
再输入"setenv ipaddr 192.168.0.100"设置你板子的IP,192.168.0.100是自己指定的,只要是和你的服务IP在同一个网段即可,根据自己实际情况定。
接下来输入"saveenv"保存设置,但这里可以不用,因为板上的u-boot是保存不了的,应该是移植的bug。
接下来就是要tftp下载我们的程序了。
首先,我们需要一个小工具在我们的PC端建立一个tftp服务。这里我们用“tftpd32.exe”这个小工具来完成。
将tftpd32.exe复制到工程的输出文件夹并点击运行就可以了,运行后就建立了tftp服务,服务目录为我们的输出文件夹,如下图:
attach://110783.jpg
启动服务以后,我们就可以进行tftp下载了。
在终端输入“tftp 40000000 Project.bin”回车即可将bin文件下载到0x40000000地址处,再输入"go 40000000"即可执行刚刚下载的bin文件。
因为u-boot已经把uart3初始化配置好,波特率为115200,所以我们在我们的工程中,加入几个函数即可实现简单的串口信息输出,帮助我们开发调试使用。//串口3发送一个字节
void uart3_send_byte(uint8_t data)
{   
   while((LSR3&(0x01<<5))==0);
               THR3=data;
}
//串口3发送一串字符
void uart3_send_string(constuint8_t *pt)
{
    while(*pt)
        {
    uart3_send_byte(*pt);
        pt++;
        }
}

//类似printf的调试函数
void debug(char* fmt, ...)
{
    char* pArg= (void*)0;//等价于原来的va_list
    char c;
          char buf;
    pArg = (char*) &fmt;//注意不要写成 p=fmt !! 因为这里要对参数取址,而不是取值
    pArg += sizeof(fmt);//等价于原来的va_start      
   
    do
    {
      c =*fmt;
      if (c != '%')
      {
            uart3_send_byte(c);//照原样输出字符
      }
      else
      {
            //按格式字符输出数据
            switch(*++fmt)
            {
                case 'd':
                  sprintf(buf,"%d",*((int*)pArg));
                  pArg += sizeof(int); //等价于原来的va_arg                                                               
                  break;
                case 'x':
                  sprintf(buf,"%x",*((int*)pArg));
                                                                  pArg += sizeof(int); //等价于原来的va_arg
                  break;
                                case 'f':
                                        sprintf(buf,"%f",*((float*)pArg));
                                        pArg += sizeof(float); //等价于原来的va_arg
                default:
                  break;
            }
         uart3_send_string((const uint8_t *)buf);
      }
      ++fmt;
    }while (*fmt != '\0');
    pArg = (void*)0; //等价于va_end
    return;
}
在主函数中测试一下,输入如下代码:int main(void)
{ uint32_t i=0;
        LED_GPIO_Config();
        while (1)
        {        
   debug("hello,I am xiaonong! This is line %d\r\n",++i);
               delay_ms(500);
               LED1(OFF);
               delay_ms(500);
               LED1(ON);
        }
}
按上面是下载方法下载到平板将会在串口输出如下:
attach://110810.jpg
因为板子上面的u-boot不能保存设置的环境变量,每次重新启动都要重新配置IP,比较烦。
还好u-boot支持多条指令输入,直接一次输入"setenv serverip 172.16.58.220;setenv ipaddr 172.16.58.235;tftp 40000000 Project.bin;go 40000000"就可以实现下载并运行。
但是板子复位再上电启动还是比较麻烦,而且每次按键盘慢一点就会启动安卓内核。
我把平板的复位按键直接飞线连接到了home键上,把pwr电源键直接飞线短接,这样就实现了按下home键自动重新启动,比较方便调试。
attach://110848.jpg
每个按键旁边都有一个tp焊盘,飞线很方便。
attach://110849.jpg
电源键飞线。
接好两个飞线以后,把调试的FPC通过触摸笔那个插槽引出,将屏幕安装上,机器装好。
attach://110850.jpg
按下home键会进行复位重启,可以很方便的调试了。

tianheiGE 发表于 2013-5-9 14:40:04

虽然不懂,看着牛B,顶顶更健康

gzhuli 发表于 2013-5-9 15:10:30

我的没GPS,TTL是从天线孔引出的。 {:lol:}

jssd 发表于 2013-5-9 15:56:44

第一次靠近大牛们如此近。顶一个

心飞扬 发表于 2013-5-9 17:07:55

楼主这是要准备移植内核到平板?

badboy.tao 发表于 2013-5-9 17:24:38

我的在吃灰尘。。。。。。。

nongxiaoming 发表于 2013-5-9 18:14:17

哈哈,现在已经搞定时钟配置和LCD了,我现在CPU工作在异步模式,主频1.2G,爽啊~

nongxiaoming 发表于 2013-5-9 18:16:02

gzhuli 发表于 2013-5-9 15:10 static/image/common/back.gif
我的没GPS,TTL是从天线孔引出的。

我的貌似有GPS 呢,板上有个该金属盒子的小模块,看原理图好像就是GPS来的~

苦行僧 发表于 2013-5-9 19:00:21

看着很牛逼的样子,顶一下

ShawnLinson 发表于 2013-5-9 19:14:18

置酷没商量。。。。
页: [1]
查看完整版本: 10.1寸白菜平板DIY之使用u-boot进行tftp下载