第一章:linux驱动的概述与uboot指令

一、驱动

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

第一章:linux驱动的概述与uboot指令_第1张图片

 

二、启动过程(与pc端启动过程类似)

1、GEC6818开发板(A53)

上电 -> uboot ->加载Linux内核 ->挂载根文件系统 ->执行应用程序

2、PC个人电脑

上电 -> bios ->加载winnt内核 ->挂载文件系统 ->执行应用程序

 

三、uboot

  1. 什么是uboot

       uboot其实就是一个通用的引导程序,uboot,全称 Universal Boot Loader,是遵循GPL条款的开放源码项目。uboot的作用是系统引导。

       Boot,完成硬件的初始化,启动硬件平台。

       Loader,初始化硬件后,加载操作系统。

uboot相关官网:

http://www.denx.de/wiki/uboot/

uboot源码下载:
ftp://ftp.denx.de/pub/uboot/

2、选择uboot的理由:

① 开放源码;

② 支持多种嵌入式操作系统内核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS, android;

③ 支持多个处理器系列,如PowerPC、ARM、x86、MIPS;

④ 较高的可靠性和稳定性;

⑤ 高度灵活的功能设置,适合uboot调试、操作系统不同引导要求、产品发布等;

⑥ 丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等;

⑦ 较为丰富的开发调试文档与强大的网络技术支持;

3、uboot它是一个非常复杂的裸机程序,而不是一个操作系统,当使用go命令执行某二进制程序,需要按下复位按键来重启开发板。

重启命令:reboot

进入uboot命令:uboot

查询所有指令:help        //在uboot下输入help,可以查询所有的当前uboot指令

(1)uboot界面下截取的输出信息

uboot 2014.07 (Nov 19 2017 - 09:52:45)          //uboot的版本号与编译生成时间

PLL : [0] =  800000000, [1] =  800000000, [2] =  780000000, [3] =  800000000

(0) PLL1: CPU  FCLK =  800000000, HCLK = 200000000 (G0)      //最大时钟频率为800M

(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                    //内存大小为1G

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=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 : 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#                                         //命令行

(2)在uboot界面下输入bdinfo命令查看开发板信息

GEC6818# bdinfo

arch_number = 0x000010EA           //uboot针对具体硬件平台的ID,若跟linux内核的ID不一致,不能启动内核

boot_params = 0x40000100           //uboot传递给内存启动参数的地址

DRAM bank   = 0x00000000          //内存通道0

-> start    = 0x40000000                   //起始地址

-> size     = 0x40000000                  //内存的大小,1GiB

eth0name    = dwmac.c0060000    //网卡的名字

ethaddr     = 00:e2:1c:ba:e8:60      //网卡的MAC地址信息

current eth = dwmac.c0060000     //当前使用的网卡

ip_addr     = 192.168.28.3            //网卡的IP地址

baudrate    = 115200 bps              //串口波特率

relocaddr   = 0x46000000            //linux内核执行的地址

(3)在uboot界面下输入printenv命令查看环境变量

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=41ee6

gatewayip=192.168.28.1

ipaddr=192.168.28.3

netmask=255.255.255.0

qtcrc=-314709120

serverip=192.168.28.2

stderr=serial

stdin=serial

stdout=serial

以上关键的内容:

1)bootargs <启动参数>

bootargs=lcd=at070tn92 tp=gslx680-linux root=/dev/mmcblk0p2 rw rootfstype=ext4

  //  lcd=at070tn92,液晶屏的型号,7英寸的800*480的屏幕

  //  tp=gslx680-linux,触摸屏的型号

  //  root=/dev/mmcblk0p2,根文件系统是在哪里,告诉内核去哪里挂载根文件系统

                     -------> // .mmcblk0,emmc电子硬盘0

                     -------> // .p2,partion2,emmc电子硬盘0的分区2

  // rw,该文件系统即可以读,又可以写

  // rootfstype=ext4,该文件系统类型为ext4(有些文件系统ext2/ext3、yaffs.....)

 

2)bootcmd <启动命令>

bootcmd=ext4load mmc 2:1 0x48000000 uImage;bootm 0x48000000

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

 

3)启动时间

bootdelay = 5       //uboot启动5秒后,就执行boot命令(bootcmd内容是什么,就执行什么)。

    GEC6818# setenv bootdelay 3      //通过setenv指令修改启动时间,为3秒后启动

    GEC6818# saveenv                        //通过命令saveenv指令保存修改后的值

    /*保存成功*/

    Saving Environment to MMC...

    Writing to MMC(2)... done

(4)复位命令

    GEC6818# reset

(5)打印已经存在的环境变量

    GEC6818# printenv

(6)修改本地IP地址

   GEC6818# setenv gatewayip 192.168.6.1            //修改网关地址

   GEC6818# setenv ipaddr 192.168.6.5                   //修改开发板(主机)ip地址

   GEC6818# saveenv                                                  //保存操作

   1)修改服务器(电脑)IP地址

       GEC6818# setenv serverip 192.168.6.2        //修改服务器(电脑)ip地址

       GEC6818# saveenv                                        

       Saving Environment to MMC...

       Writing to MMC(2)... done

  2) 删除环境变量

       GEC6818# setenv  sererip  空格        //修改服务器(电脑)ip地址

        (有时候修改错了,导致环境变量多出了一个错误的变量时, 可以这么删除掉,不建议随便删除环境变量。)

       GEC6818# saveenv

   3)验证网络是否通畅(前提,要连接好网线)

     GEC6818#ping  电脑IP地址  

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

   网络通畅时:

   GEC6818# ping 192.168.6.2

   Speed: 1000, full duplex

   Using dwmac.c0060000 device

   host 192.168.6.2 is alive

   网络不通畅时:

   GEC6818# ping 192.168.6.2

   .........

   host 192.168.6.2 is not alive

(7)通过tftp来下载文件  

    1)GEC6818#tftp 内存地址 文件名        //tftp的下载命令

GEC6818# tftp 0x40000000 project.bin

Speed: 1000, full duplex

Using dwmac.c0060000 device

TFTP from server 192.168.6.2; our IP address is 192.168.6.5

Filename 'project.bin'.

Load address: 0x40000000

Loading: #

         72.3 KiB/s

done

Bytes transferred = 4085 (ff5 hex)

   2)执行bin文件

  GEC6818# go 0x40000000

谢谢!

你可能感兴趣的:(基于A53的内核驱动学习分享)