驱动就是计算机程序访问硬件的一个接口(API),这个接口是操作系统提供,作为操作系统涉及到安全管理机制,应用层不能够直接访问硬件,需要通过驱动函数接口来访问硬件
系统启动过程
上电--》uboot--》加载内核(kernel)--》挂载根文件系统(FS)--》执行应用程序
什么是uboot(Universal Boot Loader)
U-Boot 是一个主要用于嵌入式系统的引导加载程序,可以支持多种不同的计算机系统结构,包括PPC、ARM、AVR32、MIPS、x86、68k、Nios与MicroBlaze。这也是一套在GNU通用公共许可证之下发布的自由软件。
特点:
① 开放源码;
② 支持多种嵌入式操作系统内核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS, android;
③ 支持多个处理器系列,如PowerPC、ARM、x86、MIPS;
④ 较高的可靠性和稳定性;
⑤ 高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等;
⑥ 丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等;
⑦ 较为丰富的开发调试文档与强大的网络技术支持;
通用uboot下载网址:Index of /pub/u-boot/
Uboot作用
1.第一阶段初始化,CPU的初始化,用汇编来编写,初始化cache(缓存)、MMU(内存管理单元)、时钟、看门狗、DDR3(主存(第三代))、eMMC(内部存储)
2.第二阶段初始化,板极的初始化,一般来用C语言来编写,初始化串口、网卡、USB LCD等
3.提供很多工具,进入uboot命令行,使用uboot命令
4.加载内核与挂载根文件系统
#缓存是指可以进行高速数据交换的存储器,它先于内存与CPU交换数据,因此速率很快。
#内存管理单元通常应用在桌面型计算机或者服务器,通过虚拟存储器使得计算机可以使用比实际的物理内存更多的存储空间。同时,内存管理单元还对实际的物理内存进行分割和保护,使得每个软件任务只能访问其分配到的内存空间。
#DDR3是一种计算机内存规格。它属于SDRAM家族的内存产品
#eMMC (Embedded Multi Media Card)是MMC协会订立的内嵌式存储器标准规格。eMMC在封装中集成了一个控制器,提供标准接口并管理闪存。
开发板uboot学习
1.使用Source CRT连接开发板,启动上电后按ENTER键,进入uboot页面
2.uboot信息分析
U-Boot 2014.07 (Jun 08 2018 - 17:30:22) //uboot版本
//总线时钟频率 PLL(总线/类似32的AHB/APB)
PLL : [0] = 600000000, [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 = 300000000, PCLK = 150000000
(8) PLL0: CCI4 BCLK = 300000000, PCLK = 150000000
(3) PLL0: G3D BCLK = 300000000
(4) PLL0: CODA BCLK = 300000000, PCLK = 150000000
(5) PLL0: DISP BCLK = 300000000, PCLK = 150000000
(6) PLL0: HDMI PCLK = 100000000
I2C: ready
DRAM: 2 GiB //内存
Heap = 0x44000000~0x46000000
Code = 0x43c00000~0x43c8762c
GLD = 0x43bffeb8
GLBD = 0x43bffe68
SP = 0x43bffe68,0x43bffe48(CURR)
PC = 0x43c06764
TAGS = 0x40000100
PAGE = 0x43c90000~0x43c9c000
MACH = [4330]
VER = 0
BOARD= [fs6818]
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=270054
DRAW: 0x47000000 -> 0x46000000
DONE: Logo bmp 300 by 300 (3bpp), len=270054
DRAW: 0x47000000 -> 0x46000000
RGB: display.0
MIPI: display.0
DSIM_ESCMODE 1 : 0xc0
DSIM_STATUS : 0x10040f
MIPI clk: 420MHz
DSIM_ESCMODE 2 : 0x0
DSIM_STATUS : 0x10040f
## 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: x6818 eth init...
x6818 mac init...
dwmac.c0060000
Hit any key to stop autoboot: 0
Uboot命令(常用)
bdinfo:查看板子信息
arch_number = 0x000010EA //uboot针对具体硬件平台ID,若跟内核ID不一致,不能启动内核
boot_params = 0x40000100 //uboot传递给内存启动参数的地址
DRAM bank = 0x00000000 //内存通道0
-> start = 0x40000000 //内存地址(起始)
-> size = 0x80000000 //内存大小 2GB
eth0name = dwmac.c0060000 //网卡名字
ethaddr = 00:e2:1c:ba:e8:60 //网卡MAC地址
current eth = dwmac.c0060000 //当前所使用的网卡
ip_addr = 192.168.62.4 //IP地址
baudrate = 115200 bps //波特率
TLB addr = 0x7FFF0000
relocaddr = 0x46000000 //Linux内核执行地址
reloc off = 0x00000000
irq_sp = 0x7DF6BF00
sp start = 0x43BFFE68
printenv:查看uboot环境变量
FS6818# printenv
baudrate=115200
bootargs=lcd=at070tn92 tp=gslx680-linux root=/dev/mmcblk0p2 rw rootfstype=ext4
//lcd=at070tn92 (液晶屏的型号,7英寸的800*480的屏幕)
//tp=gslx680-linux (触摸屏的型号)
//root=/dev/mmcblk0p2 (根文件系统在哪里,告诉内核去哪里挂载根文件系统)
//mmcblk0 (电子硬盘0/内部存储)
//p2 (电子硬盘0 分区2)
//rw (根文件系统可读可写)
//rootfstype=ext4 (根文件系统类型为ext4。(ext2/ext3 , fats, ntfs))
bootcmd=ext4load mmc 2:1 0x48000000 uImage;bootm 0x48000000
/*以ext4文件系统去emmc第一个分区加载uImage Linux内核镜像,加载到内存地址0x48000000;然后在该地址0x48000000启动内核*/
bootdelay=3
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=41ee6
gatewayip=192.168.31.1
ipaddr=169.254.57.100
netmask=255.255.255.0
qtcrc=-1489582083
serverip=169.254.57.6
stderr=serial
stdin=serial
stdout=serial
Environment size: 845/32764 bytes
FS6818#
help:可打印uboot所有命令(直译(参考))
FS6818# help
0 - do nothing, unsuccessfully //什么也不做,但没有成功
1 - do nothing, successfully //什么也不做,成功
? - alias for 'help' //别名“帮助”
base - print or set address offset //打印或设置地址偏移量
bdinfo - print Board Info structure //打印开发板信息
boot - boot default, i.e., run 'bootcmd' //启动默认设置,即运行‘bootcmd’
bootd - boot default, i.e., run 'bootcmd' //启动默认设置,即运行‘bootcmd’
bootm - boot application image from memory //从内存启动应用程序映像
bootp - boot image via network using BOOTP/TFTP protocol
//使用BOOTP/TFTP协议通过网络启动镜像
clear - clear the uart com screan //清除uart com界面
cmd - cmd [command] options... //cmd[命令]选项...
cmp - memory compare //内存比较
cp - memory copy //内存拷贝
crc32 - checksum calculation //校验和计算
dhcp - boot image via network using DHCP/TFTP protocol
//使用DHCP/TFTP协议通过网络启动镜像
drawbmp - darw bmpfile on address 'addr' to framebuffer
//将地址' addr '上的BMP文件写入帧缓冲区
env - environment handling commands //环境处理命令
exit - exit script //退出脚本
ext4load- load binary file from a Ext4 filesystem //从Ext4文件系统加载二进制文件
ext4ls - list files in a directory (default /) //列出目录中的文件(默认/)
ext4write- create a file in the root directory //在根目录下创建一个文件
fastboot- fastboot- use USB Fastboot protocol //快速引导-使用USB fastboot协议
fatinfo - print information about filesystem //打印关于文件系统的信息
fatload - load binary file from a dos filesystem //从DoS文件系统加载二进制文件
fatls - list files in a directory (default /) //列出目录中的文件(默认/)
fatwrite- write file into a dos filesystem //将文件写入DoS文件系统
fdisk - mmc list or create ms-dos partition tables (MAX TABLE 7)
//MMC列出或创建MS-DOS分区表(最大表7)
go - start application at address 'addr' //在地址'addr'处启动应用程序
goimage - start Image at address 'addr' //在地址'addr'处开始映像
help - print command description/usage //打印命令描述/用法
i2c - I2C sub-system //I2C子系统
i2cmod - set I2C mode //设置I2C模式
iminfo - print header information for application image
//打印应用程序图像的头信息
loadb - load binary file over serial line (kermit mode)
//通过串行线加载二进制文件(kermit模式)
loadbmp - load bmpfile with command or 'bootlog' environment
loadx - load binary file over serial line (xmodem mode)
//通过串行线加载二进制文件(xmodem模式)
loady - load binary file over serial line (ymodem mode)
//通过串行线加载二进制文件(ydem模式)
loop - infinite loop on address range //地址范围上的无限循环
md - memory display //内存显示
mdio - MDIO utility commands //MDIO实用程序命令
mii - MII utility commands //MII实用程序命令
mm - memory modify (auto-incrementing address) //存储器修改(自动递增地址)
mmc - MMC sub system //MMC子系统
mmcinfo - display MMC info //显示MMC信息
mtest - simple RAM read/write test //简单的RAM读写测试
mw - memory write (fill) //内存写入(填充)
nm - memory modify (constant address) //存储器修改(常量地址)
ping - send ICMP ECHO_REQUEST to network host //向网络主机发送ICMP回应请求
pmic - PMIC //PMIC
printenv- print environment variables //打印环境变量
reset - Perform RESET of the CPU //执行CPU的重置(重启)
run - run commands in an environment variable //在环境变量中运行命令
saveenv - save environment variables to persistent storage //将环境变量保存到永久存储中
sdfuse - sdfuse - read images from FAT partition of SD card and write them to booting device. //SDfuse -从sd卡的FAT分区读取镜像并写入引导设备。
setenv - set environment variables //设置环境变量
showvar - print local hushshell variables //打印本地hushshell变量
source - run script from memory //从内存中运行脚本
test - minimal test like /bin/sh //像/bin/sh这样的最小测试
tftpboot- boot image via network using TFTP protocol //使用TFTP协议通过网络启动镜像
udown - Download USB //USB下载
update_mmc- update mmc data //更新MMC数据
version - print monitor, compiler and linker version //打印监视器,编译器和链接器版本
FS6818#
修改启动时间
setenv bootdelay 5 //Uboot延时5S进入内核
saveenv //保存参数到电子硬盘
FS6818# setenv bootdelay 5 //设置Uboot延时5S进入内核
FS6818# saveenv //保存参数到电子硬盘
Saving Environment to MMC...
Writing to MMC(2)... done
FS6818#
打印已经存在的环境变量
FS6818# printenv
开发板复位(uboot下重启)
FS6818# reset