本帖最后由 Aot_Alone 于 2016-6-27 15:41 编辑
5. Uboot常用命令Uboot在硬件初始化完成之后,会进入一个无限循环,等待用户输入命令。U-boot发展到现在,它的命令行模式已经非常接近Linux下的shell了。 如下图所示,在控制台使用命令help可以查看所有默认支持的命令。 在iTOP-4412开发板中,命令如下表所示。 6. 裸机程序安装DNW驱动DNW驱动在网盘“iTOP-4412开发板视频教程及其相关”→“06-裸机程序实验文档以及工具文件”→”tools/USB驱动/dnw_driver“目录下面,我们提供了xp系统、win7-32位、win7-64位三种系统下面的驱动。下面我们以win7 64位系统的驱动为例来讲解一下DNW驱动的安装。 首先使用串口线连接iTOP-4412开发板的调试串口到PC机,使用USB连接线连接iTOP-4412开发板的USB OTG接口到PC机的USB口。 打开“tools”目录下的dnw.exe软件。 选择“Serial Port->Connect",连接到iTOP-4412开发板的串口,启动开发板,可以看到dnw软件会输出启动信息,在Uboot进入”倒数秒“的时候,按键盘的任意按键,将进入Uboot命令行。在Uboot的命令行输入“dnw”, 如下图所示。 在PC上右键点击“计算机”,选择“管理”, 打开”计算机管理“,然后鼠标点击上图左侧一栏里面的“设备管理器”,将会列出设备列表。 在中间一栏的“其他设备”里,可以看到“SEC S3C6400X Test B/D”这个未知设备,需要为这个设备安装DNW驱动,鼠标右键点击“SEC S3C6400X Test B/D”选择“更新驱动程序软件(P)...”,如下图所示。 打开“更新驱动程序软件”对话框,然后选择“浏览计算机以查找驱动程序软件(R)”,将会显示弹出如下图所示对话框。 点击上图的”浏览“,找到驱动,将会出现“windows安全”的对话框,然后点击的“始终安装此驱动程序软件”,开始安装驱动。 安装完成后,点击“关闭”按钮,关闭对话框。 在设备管理器里面看到DNW的设备了,如下图所示: 通过上面的操作,DNW的驱动已经安装完成了,现在可以使用DNW下载裸机程序到开发板。 下载裸机程序到开发板上重新启动我们的开发板,进入到Uboot命令行下面,然后输入“dnw 40008000”(这句的意思是启动DNW,设置程序下载到0x40008000地址), 如下图所示: 然后选择“USB Port->Transmit->Transmit”,如下图所示: 弹出传输文件对话框之后,选择裸机程序,这里选择的是”led.bin“程序。led.bin文件在在网盘“iTOP-4412开发板视频教程及其相关”→“06-裸机程序实验文档以及工具文件”→”tools/例程/led“目录下面。 然后点击“打开”按钮,这时我们在打开“USB Port->Transmit”,可以看到刚才选择的led.bin,如下图所示。 然后选择上图红色方框内的led.bin,下载到内存,下载完成后,串口输出如下图所示: 从上图我们可以看到led.bin下载到了内存0x40008000的地址,接下来在dnw软件上输入“go 40008000”使cpu从0x40008000地址开始运行,如下图所示。 运行上面的命令后,就可以看到iTOP-4412开发板上的两个led开始交替闪烁了。 裸机led的程序实现裸机led的程序实现需要启动文件start.S、代码文件led.c和编译文件Makefile。 start.S文件: .global _start _start: //disable watch dog ldr r0, =0x10060000 mov r1, #0 str r1, [r0] //turn on icache mrc p15, 0, r0, c1, c0, 0 //bic r0, r0, #0x00002300 /* clear bits 13, 9:8 (--V- --RS) */ //bic r0, r0, #0x00000087 /* clear bits 7, 2:0 (B--- -CAM) */ //orr r0, r0, #0x00000002 /* set bit 2 (A) Align */ //orr r0, r0, #0x00001000 /* set bit 12 (I) I-Cache */ #ifdef CONFIG_SYS_ICACHE_OFF // clear bit 12 (I) I-cache bic r0, r0, #0x00001000 #else // set bit 12 (I) I-cache orr r0, r0, #0x00001000 #endif mcr p15, 0, r0, c1, c0, 0 //mcr p15, 0, r0, c7, c5, 0 @ invalidate icache //set stack ldr sp, =0x02050000 bl led_blink halt: b halt led.c文件: #define GPL2CON (*(volatile unsigned long *) 0x11000100) #define GPL2DAT (*(volatile unsigned long *) 0x11000104) #define GPK1CON (*(volatile unsigned long *) 0x11000060) #define GPK1DAT (*(volatile unsigned long *) 0x11000064) //GPL2_0, GPK1_1 void delay(int r0) { volatile int count = r0; while (count--) ; } void led_blink() { GPL2CON = 0x00000001; GPK1CON = 0x00000010; while(1) { GPL2DAT = 1; GPK1DAT = 0; delay(0x80000); GPL2DAT = 0; GPK1DAT = 0x2; delay(0x80000); } } Makefile文件: led.bin: start.o led.o arm-none-linux-gnueabi-ld -Ttext 0x0 -o led.elf $^ arm-none-linux-gnueabi-objcopy -O binary led.elf led.bin arm-none-linux-gnueabi-objdump -D led.elf > led_elf.dis %.o : %.S arm-none-linux-gnueabi-gcc -o $@ $< -c -nostdlib %.o : %.c arm-none-linux-gnueabi-gcc -o $@ $< -c -nostdlib clean: rm *.o *.elf *.bin *.dis -f |