Fork me on GitHub

嵌入式底层驱动笔记1-uboot

uboot操作

探寻嵌入式系统移植的世界

一、驱动:

什么叫驱动?驱动就是计算机程序访问硬件的一个接口,这个接口是由操作系统提供。因为在操作系统涉及到安全管理机制,应用层程序不能够直接访问硬件,需要通过驱动函数接口来访问硬件。

二、启动过程

mermaid
graph TD
上电 –> uboot –> 加载linux内核 –> 挂载根文件系统 –> 执行应用程序

三、uboot

1.什么是uboot

uboot其实就是一个通用的引导程序——bootloader。

boot,完成硬件的初始化,启动硬件平台
loader,初始化硬件后,加载操作系统。

支持各种硬件,例如支持ARM、MIPS、X86、AVR32架构....
支持各种操作系统,例如支持WinCE、Linux内核、安卓操作系统....

2.uboot的作用

1)第一阶段初始化,CPU的初始化,用汇编语言来编写,初始化cache、MMU、时钟、看门狗、DDR3、eMMC…
2)第二阶段初始化,板级的初始化,一般来说用C语言来编写,初始化串口、网卡、usb、lcd
3)提供了很多工具,进入uboot命令行,使用uboot的命令
4)加载操作系统

3.uboot的输出信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
u-Boot 2014.07 (Nov 19 2017 - 09:52:45)
PLL : [0] = 800000000, [1] = 800000000, [2] = 780000000, [3] = 800000000
(0) PLL1: CPU FCLK = 800000000, HCLK = 200000000 (G0)
(7) PLL1: CPU FCLK = 800000000, HCLK = 200000000 (G1)
(2) PLL3: MEM FCLK = 800000000, DCLK = 800000000, BCLK = 400000000, PCLK = 200000000
(1) PLL0: BUS BCLK = 400000000, PCLK = 200000000
(8) PLL0: CCI4 BCLK = 400000000, PCLK = 200000000
(3) PLL0: G3D BCLK = 400000000
(4) PLL0: CODA BCLK = 400000000, PCLK = 200000000
(5) PLL0: DISP BCLK = 400000000, PCLK = 200000000
(6) PLL0: HDMI PCLK = 133333333
I2C: ready
DRAM: 1 GiB
Heap = 0x44000000~0x46000000
Code = 0x43c00000~0x43c83e48
GLD = 0x43bffeb8
GLBD = 0x43bffe68
SP = 0x43bffe68,0x43bffe48(CURR)
PC = 0x43c066f0
TAGS = 0x40000100
PAGE = 0x43c90000~0x43c9c000
MACH = [4330]
VER = 0
BOARD= [GEC6818]
MMC: NXP DWMMC: 0, NXP DWMMC: 1, NXP DWMMC: 2
In: serial
Out: serial
Err: serial
## DCDC_MODE(0x80): DCDC1[PFM], DCDC2[PFM], DCDC3[PFM], DCDC4[PWM], DCDC5[PWM]
## STATUS(0x00) : 0xe4 0x10
## IRQ(0x48) : 0x00 0x00 0x00 0x00 0x00
## CHG_TYPE : ADP
## BAT_VOL : 0mV
## BAT_CAP : 100%
DONE: Logo bmp 300 by 300 (3bpp), len=270056
DRAW: 0x47000000 -> 0x46000000
DONE: Logo bmp 300 by 300 (3bpp), len=270056
DRAW: 0x47000000 -> 0x46000000
RGB: display.0
MIPI: display.0
DSIM_ESCMODE 1 : 0xc0
DSIM_STATUS : 0x10010f
MIPI clk: 420MHz
DSIM_ESCMODE 2 : 0x0
DSIM_STATUS : 0x10010f
## Skip BAT Animation.
## IRQ(0x48) : 0x00 0x00 0x00 0x00 0x00
## chg_type : ADP
## battery_vol : 0mV
## battery_cap : 100%
## Booting
Card did not respond to voltage select!
Net: GEC6818 mac init...
dwmac.c0060000
Hit any key to stop autoboot: 0
GEC6818#

1)开发板信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
GEC6818# bdinfo
arch_number = 0x000010EA //uboot针对具体硬件平台的ID,若跟linux内核ID不一致,不能启动内核<br>
boot_params = 0x40000100 //uboot传递给内存启动参数的地址
DRAM bank = 0x00000000 //内存通道0
-> start = 0x40000000 //内存的地址地址
-> size = 0x40000000 //内存的大小为1GB
eth0name = dwmac.c0060000 //网卡的名字
ethaddr = 00:e2:1c:ba:e8:60 //网卡的MAC地址信息
current eth = dwmac.c0060000 //当前所使用的网卡
ip_addr = 192.168.114.5 //网卡的IP地址
baudrate = 115200 bps //串口波特率
TLB addr = 0x7FFF0000
relocaddr = 0x46000000 //linux内核执行的地址
reloc off = 0x00000000
irq_sp = 0x7DF6BF00
sp start = 0x43BFFE68

2)查看uboot的环境变量,只要是环境变量,都可以进行自定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
GEC6818# printenv
baudrate=115200
bootargs=lcd=at070tn92 tp=gslx680-linux root=/dev/mmcblk0p2 rw rootfstype=ext4
bootcmd=ext4load mmc 2:1 0x48000000 uImage;bootm 0x48000000
bootdelay=5
bootfile=uImage
ethact=dwmac.c0060000
ethaddr=00:e2:1c:ba:e8:60
ethprime=RTL8211
fastboot=flash=mmc,2:GECuboot:2nd:0x200,0x78000;flash=mmc,2:2ndboot:2nd:0x200,0x4000;flash=mmc,2:bootloader:boot:0x8000,0x70000;flash=mmc,2:boot:ext4:0x00100000,0x04000000;flash=mmc,2:system:ext4:0x04100000,0x2F200000;flash=mmc,2:cache:ext4:0x33300000,0x1AC00000;flash=mmc,2:misc:emmc:0x4E000000,0x00800000;flash=mmc,2:recovery:emmc:0x4E900000,0x01600000;flash=mmc,2:userdata:ext4:0x50000000,0x0;
filesize=41ee8
gatewayip=192.168.114.1
ipaddr=192.168.114.5
netmask=255.255.255.0
qtcrc=-314709120
serverip=192.168.114.2
stderr=serial
stdin=serial
stdout=serial

关键的内容:

1)bootargs,启动参数
1
bootargs=lcd=at070tn92 tp=gslx680-linux root=/dev/mmcblk0p2 rw rootfstype=ext4

lcd=at070tn92, //液晶屏的型号,7英寸的800*480的屏幕
tp=gslx680-linux, //触摸屏的型号
root=/dev/mmcblk0p2, //根文件系统在哪里,告诉内核去哪里挂载根文件系统。
mmcblk0p2
.mmcblk0,emmc //电子硬盘0
.p2,partion2,emmc //电子硬盘0的分区2

rw,该文件系统可以读,又可以写。
rootfstype=ext4,该文件系统类型为ext4。(ext2/ext3,fat32,ntfs)。

2)启动命令
1
bootcmd=ext4load mmc 2:1 0x48000000 uImage;bootm 0x48000000

以ext4文件系统去emmc第一个分区加载uImage linux内核镜像,加载到内存地址0x48000000;然后在该地址0x48000000启动linux内核。

这条命令告诉uboot启动完之后,要干什么动作,通过bootcmd命令进行了解。

3)修改启动延时时间

setenv bootdelay 3
saveenv

1
2
Saving Environment to MMC...
Writing to MMC(2)... done
4)打印已经存在的环境变量

#printenv(pri)

5)复位开发板

reset

6)修改本地IP地址

setenv ipaddr 192.168.11.6 //修改IP地址
setenv gatewayip 192.168.11.1 //修改网关
setenv netmask 255.255.255.0 //修改子网掩码
saveenv

注意:在后面的课程设计网络下载裸机程序,网络必须要配置好,因为当前的uboot不支持串口下载文件。

7)验证网络的通畅

ping 电脑IP地址

注意:开发板必须通过网线连接到电脑;电脑必须关闭防火墙;电脑不能主动ping开发板,因为uboot默认状态下是关闭了网卡。

ping成功:

1
2
3
4
GEC6818# ping 192.168.11.3
Speed: 100, full duplex
Using dwmac.c0060000 device
host 192.168.11.3 is alive

ping失败:

1
2
GEC6818# ping 192.168.11.3
ping failed; host 192.168.11.3 is not alive
8)修改服务器IP地址

#setenv serverip 192.168.11.3
#saveenv

9)删除对应的环境变量,例如删除sap变量

#setenv sap
#saveenv

10)通过tftp下载文件到内存

#tftp 文件名 内存地址
#tftp led.bin 0x40000000

1
2
3
4
5
6
7
8
9
10
GEC6818# tftp 0x40000000 led.bin
Speed: 100, full duplex
Using dwmac.c0060000 device
TFTP from server 192.168.11.3; our IP address is 192.168.11.6
Filename 'led.bin'.
Load address: 0x40000000
Loading: #
261.7 KiB/s
done
Bytes transferred = 4572 (11dc hex)
11)执行某地址存在的二进制文件

#go 内存地址

1
2
#go 0x40000000
## Starting application at 0x40000000 ...
点击查看
0%