1. 程式人生 > >U-boot簡介及常用命令說明

U-boot簡介及常用命令說明

1. 疑問

使用u-boot開發一些專案有一段時間了,對u-boot也更加熟悉了。以前經常想u-boot存在的意義到底是啥呢?百科上說U-Boot的作用是系統引導。恩?引導系統?具體什麼含義?u-boot在實際開發中還有什麼具體作用?好吧,如果你對這些問題感興趣,是吧。………………

2. u-boot在實際專案中的作用

以我的專案經歷,我覺著u-boot有如下3種功能:
一,驗證硬體是否正常工作。
二,提供簡單的韌體開發、除錯方法。
三,引導OS。

下面一個一個說說:
一,驗證硬體是否正常工作。新設計的硬體原理,PCB製版和焊接完成。高高興興地從車間拿來,先搞電、復位、時鐘。這些都是一些電氣訊號,好不好可以通過示波器測量。然後吶,你很想驗證自己設計的這套原理的正確性,板子上的各個部件都能正常工作嗎?比如說CPU能執行程式嗎?記憶體好用嗎?串列埠好用嗎?網口好用嗎?PCIE好用嗎?等等好多部件你都很想讓其本本分分地工作,為人類服務。這個時候就得“軟體”上了。板子上最核心的部件是CPU,這個玩意可以執行所謂的指令,也就是說你可以命令它幫你幹活。好傢伙,這個聽起來我好喜歡,不過就是命令這個傢伙有點費勁。因為他聽不懂普通話,連English也完全不懂。它懂ASM、C、C++、Java、Php、Python、Perl等等語言。哦,有點扯遠了,我的主要意思是這貨既然可以按照你的意願去幹活,那我們就可以利用它來驗證我們板子上的各個部件好不好用。驗證串列埠好不好用,很簡單,利用CPU讓串列埠這貨輸出個字串“hello world”。我們普通的筆記本上也有串列埠這個介面(一般是USB轉串列埠),如果筆記本上能收到正確的字串,說明串列埠這貨能正常工作,從而說明你設計的硬體原理OK。哦,你好像明白了,我理想的情況是:這個板卡有輸入、輸出系統。這樣我就可以通過輸入不同的命令來驗證、除錯不同的部件了。對,我們可以使用UART來作為板子的IO系統,因為UART協議簡單,很適合作為開發除錯時的IO系統來使用。這樣來看,你可以參考CPU手冊自己編寫程式,把CPU搞起來,然後編寫程式驗證板子上的各種外設,當然還有基本的IO系統。哦,工作量還不小嘞。噓,告訴你個好訊息:u-boot有你需要的上述所有功能,完全滿足你的需求,而且這個u-boot還是個open source的軟體(一般人我不告訴他)。你可以根據u-boot的文件說明,進行簡單的編譯工作,就可以讓它在你的板子上執行,並且u-boot包含了絕大部分裝置驅動程式,用於幫助你驗證你板子上的各個部件是否能正常工作,還有u-boot提供了一套很好的IO系統,你可以輸入很多命令(命令格式和English差不多哦,很好理解),u-boot可以接收你的命令幫你幹活。
二,提供簡單的韌體開發、除錯方法。在開發階段,你會經常更改程式碼,編譯,然後下載到目標板子上執行,然後檢視結果。比如說,通過網路把程式下載到目標板,把程式下載到boot flash中等等。u-boot提供這些方法來幫助你開發。有了它感覺就想有了一個尚方寶劍一樣。
三,引導OS。這個也許就是u-boot的最終使命吧,一旦引導OS,u-boot的生命就結束了,把硬體所有的控制權都交給OS,就沒u-boot啥事了。u-boot可以引導很多OS,Linux,NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS, android。

3. u-boot引導系統的常見形式

 系統啟動,kernel和Rootfs是獨立分開的。kernel像是演算法,rootfs像是資料結構。軟體世界=演算法+資料結構。
 常見的rootfs格式有:ext2、jffs2 、yffs/yffs2、RamDisk。
 常見的啟動方式有:norflash、NandFlash、Dcard、U盤啟動、TFTP啟動、利用NFS啟動。
系統啟動時rootfs的形式及解釋

一,Ramdisk Deployment from TFTP
Roorfs的格式是RamDisk,使用TFTP的方式下載kernel、dtb和rootfs,然後啟動linux kernel。
setenv bootargs ‘root=/dev/ram rw console=ttyS0,115200


saveenv

=>tftp 1000000 <uImage_name>
=>tftp 5000000 rootfs_name
=>tftp 2000000 <platform_dtb_name>
=>bootm 1000000 5000000 2000000

二, Ramdisk Deployment from Flash(Norflash)
setenv bootargs ‘root=/dev/ram rw console=ttyS0,115200
saveenv
我們首先將linux kernel、dtb、rootfs下載到Norflash中指定的地址。
然後直接執行 bootm


bootm <kernel_start_addr> <ramdisk_start_addr> <dtb_start_addr>
這種方式下使用的kernel、rootfs的格式為記憶體RamDisk。bootm 命令啟動時會將Norflash中的kernel、dtb、rootfs Copy到Ram中,然後啟動。
三,NFS Deployment
使用tftp載入kernel、dtb,使用nfs方式載入rootfs。
setenv bootargs root=/dev/nfs rw nfsroot=<tftp_serverip>:<nfs_root_path>
ip=<board_ipaddr>:<tftp_serverip>:
<your_gatewayip>:<your_netmask>:<board_name>:eth0:off console=ttyS0,115200

tftp 1000000 <uImage name>
tftp c00000 <platform dtb name>
bootm 1000000 - c00000

四,SD卡啟動
SD卡設定成ext2檔案系統格式,將kernel、dtb放到SD卡中,將rootfs(ext2格式)檔案copy到SD卡根目錄。
啟動前設定好bootargs引數 ,u-boot中設定啟動時從SD卡中讀取kernel、dtb到記憶體中,然後啟動,rootfs在SD卡中,型別為ext2格式的檔案系統。
具體過程略。
五,Hard Disk啟動
這種啟動方式和SD卡啟動類似,略。

4. u-boot常見命令的解釋及使用方法

1.bootarg的含義

u-boot使用bootargs這個環境變數向OS(linux)傳遞啟動引數。在u-boot下使用
pri bootargs 命令,輸出如下:
bootargs=root=/dev/ram rw console=ttyS0,115200
主要設定了rootfs的位置和型別、console口的輸出裝置和波特率。像我這個平臺上使用的是根檔案系統啟動位置為/dev/ramdisk,根檔案系統可讀寫。串列埠使用/dev/ttyS0(硬體平臺的第一個串列埠裝置),波特率115200.
啟動系統之後,使用 mount 命令檢視rootfs型別。輸出如下:

 /dev/ram on / type ext2 (rw,relatime,errors=continue)
devtmpfs on /dev type devtmpfs (rw,relatime,size=1965784k,nr_inodes=491446,mode=755)
proc on /proc type proc (rw,relatime)
sysfs on /sys type sysfs (rw,relatime)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
tmpfs on /run type tmpfs (rw,nosuid,nodev,mode=755)
tmpfs on /var/volatile type tmpfs (rw,relatime)
/dev/sda1 on /run/media/sda1 type ext2 (rw,relatime,errors=continue)
devpts on /dev/pts type devpts (rw,relatime,gid=5,mode=620)

2.設定u-boot環境變數和命令

所謂環境變數,就是u-boot使用的一些配置資訊(Name:Value),比如Board IP、Board baudrate等。變數嘛,首先得有個好記憶的名字,且這個名字代表的Value還可以修改。兩個好處:1,可以給變數起一個有實際含義的名稱 2,代表的內容可變化。
使用pri 命令可以輸出當前u-boot設定的所有環境變數。在我的u-boot下輸出的部分內容如下:

baudrate=115200
bdev=sda3
bootargs=root=/dev/ram rw console=ttyS0,115200
bootcmd=run boot_with_ethernet
bootdelay=10
bootfile=uImage
consoledev=ttyS0

我們可以使用 setenv 命令設定一個新的環境變數。Eg:setenv TEST "this is test"
檢視設定的環境變數名和內容pri TEST 輸出如下:
TEST=this is test
引用這個變數 使用$TEST,Eg:echo $TEST,會將這個TEST的值打印出來。
this is test
怎麼將這個變數刪除吶?客官彆著急,當然有辦法了。setenv TEST 就可以將這個變數刪除了。就是你使用setenv 命令時只給個變數名稱,Value留空就可以了。
設定這種變數有啥好處吶?
u-boot只要的功能是執行一些Command。我們可以一條一條輸入命令,也可以將多個指令定義成一個變數,然後使用這個變數來表示一大串的命令。Eg:我想使用SD卡啟動我的系統,我需要1,從SD卡上讀出kernel、rootfs。2,使用bootm 命令啟動系統。
setenv sd_load=mmc read 1000000 60000 26FF;mmc read 2000000 70000 7E;mmc read 5000000 80000 F480;
setenv boot_with_SD=run sd_load; bootm 1000000 5000000 2000000;
這樣,我想使用SD卡啟動OS的時候,就直接run boot_with_SD ,你看是不是方便了很多。
打個 ? 看下命令幫助,下面是u-boot中關於命令run 的解釋。
run - run commands in an environment variable
有什麼命令不會用,打下? 這個對於所有的命令列程式都有用哦。

3.I2C的操作

直接輸入i2c 得到命令的使用幫助。

i2c bus [muxtype:muxaddr:muxchannel] - show I2C bus info
crc32 chip address[.0, .1, .2] count - compute CRC32 checksum
i2c dev [dev] - show or set current I2C bus
i2c loop chip address[.0, .1, .2] [# of objects] - looping read of device
i2c md chip address[.0, .1, .2] [# of objects] - read from I2C device
i2c mm chip address[.0, .1, .2] - write to I2C device (auto-incrementing)
i2c mw chip address[.0, .1, .2] value [count] - write to I2C device (fill)
i2c nm chip address[.0, .1, .2] - write to I2C device (constant address)
i2c probe [address] - test for and show device(s) on the I2C bus
i2c read chip address[.0, .1, .2] length memaddress - read to memory
i2c write memaddress chip address[.0, .1, .2] length [-s] - write memory
          to I2C; the -s option selects bulk write in a single transaction
i2c reset - re-init the I2C Controller
i2c speed [speed] - show or set I2C bus speed

挑兩個舉個例子:
讀slave ID為0x50的IC 的前112個byte內容並顯示。
i2c md 0x50 0 0x70 在我的u-boot下輸出:

0000: aa 55 aa 55 01 0e 01 00 16 07 00 19 18 10 19 16 
0010: 00 00 00 00 00 00 00 00 6c 6e 08 48 00 44 8c 00 
0020: 0c 02 00 00 f5 00 00 00 00 00 00 00 ee 00 00 ee   
0030: 00 00 00 00 00 02 87 fc 00 00 00 00 50 00 00 00  
0040: 00 00 00 00 00 00 00 28 09 12 41 c0 f0 3f 3f 3f   
0050: 09 12 41 c4 ff 00 3f 3f 09 12 40 10 00 00 01 01    
0060: 09 12 41 30 00 00 00 0c 08 13 80 40 4a 43 27 59 

另一種方式是將內容讀到memory當中,然後使用md 命令顯示記憶體內容。
i2c read 0x50 0 0x70 1000000
md 1000000

咦,如果我不知道我能操作哪些i2c bus?哪些i2c裝置咋辦呢?
沒關係,可以使用i2c bus 看下你係統中有幾個i2c匯流排。
我的硬體平臺上有兩個i2c bus。

Bus 0:  fsl_0
Bus 1:  fsl_1

使用i2c dev 可以檢視現在操作的是哪個bus。
Current bus is 0
使用i2c dev 1 可以將當前bus切換為bus 1.
使用i2c probe 可以檢測出當前bus上有多少個裝置,且slaveID是多少?

Valid chip addresses: 08 1A 1E 2F 32 36 4B 4F 50 52 56 60 61 68 6D 70 71

向slaveID為0x50的裝置的00–02地址寫入00 01 02。

i2c mw 0x50 0 0
i2c mw 0x50 1 1
i2c mw 0x50 2 2
這種方式每次只能寫一個值,或者使用同一個值填充不同偏移量的地址。
i2c mw 0x6d 0 8 8
i2c md 0x6d 0 10
輸出內容:
0000: 08 08 08 08 08 08 08 08 00 00 28 00 dc 00 00 00
可以看到我們00-07的8個值都被寫成了0x08。
我們還有另一種方法:先把需要寫的值弄到記憶體裡,然後使用i2c write 命令寫多個位元組。
mw.b 1000000 00
mw.b 1000001 01
mw.b 1000002 02
md 1000000
01000000: 000102ef deadbeef deadbeef deadbeef
01000010: deadbeef deadbeef deadbeef deadbeef
在記憶體地址中我們準備好了要寫的3個數據。
使用i2c write 1000000 0x50 0 3 一次性將3個數值寫入i2c裝置。
這樣,我們可以使用tftp Xmodem等方式來將你要寫的內容下載到記憶體中,然後一次性寫入i2c裝置。
總結下:i2c 裝置的寫有兩種方式,一種是單個位元組內容位元組的寫,一種是多個位元組的寫。前者適合改寫單個位元組內容,後者適合改寫多個位元組。
另外,u-boot中有關於address[.0, .1, .2] 的詳細說明,一般來說i2c裝置的address有這樣3中情況:
1,裝置總的offiset 小於255,單個byte的address就足夠了,預設就是這種情況,也就是i2c mw 0x50 0.1 0
2,裝置的offset需要2個byte,裝置的address要兩個byte才能訪問到所有的offiset,也就是 i2c mw 0x50 287.2 0
3,有些不需要address這個引數,也就是i2c mw 0x50 0.0 0
詳細的見下面的解釋。
“/*
* I2C Functions similar to the standard memory functions.
* There are several parameters in many of the commands that bear further
* explanations:
* {i2c_chip} is the I2C chip address (the first byte sent on the bus).
* Each I2C chip on the bus has a unique address. On the I2C data bus,
* the address is the upper seven bits and the LSB is the “read/write”
* bit. Note that the {i2c_chip} address specified on the command
* line is not shifted up: e.g. a typical EEPROM memory chip may have
* an I2C address of 0x50, but the data put on the bus will be 0xA0
* for write and 0xA1 for read. This “non shifted” address notation
* matches at least half of the data sheets :-/.
* {addr} is the address (or offset) within the chip. Small memory
* chips have 8 bit addresses. Large memory chips have 16 bit
* addresses. Other memory chips have 9, 10, or 11 bit addresses.
* Many non-memory chips have multiple registers and {addr} is used
* as the register index. Some non-memory chips have only one register
* and therefore don’t need any {addr} parameter.
* The default {addr} parameter is one byte (.1) which works well for
* memories and registers with 8 bits of address space.
* You can specify the length of the {addr} field with the optional .0,
* .1, or .2 modifier (similar to the .b, .w, .l modifier). If you are
* manipulating a single register device which doesn’t use an address
* field, use “0.0” for the address and the “.0” length field will
* suppress the address in the I2C data stream. This also works for
* successive reads using the I2C auto-incrementing memory pointer.
* If you are manipulating a large memory with 2-byte addresses, use
* the .2 address modifier, e.g. 210.2 addresses location 528 (decimal).
“`

4.讀寫記憶體、暫存器

RISC指令集的計算機,地址是統一編址的,我們可以使用md mw 等命令來讀寫暫存器、記憶體、nor flash等。
md - memory display
Usage:
md [.b, .w, .l] address [# of objects]
mw - memory write (fill)
Usage:
mw [.b, .w, .l] address value [count]
按位元組讀取記憶體內容
md.b 1000000 5
輸出:
01000000: 00 01 02 ef de
按word讀取記憶體內容
md.w 1000000 5
輸出:
01000000: 0001 02ef dead beef dead
按double word讀取記憶體內容
md.l 1000000 5
輸出:
01000000: 000102ef deadbeef deadbeef deadbeef
01000010: deadbeef

寫記憶體或者暫存器同樣的操作:
mw.w 1000000 8 10
md.w 1000000 10
輸出:
01000000: 0008 0008 0008 0008 0008 0008 0008 0008
01000010: 0008 0008 0008 0008 0008 0008 0008 0008

5.網路命令 ping tftp

ping命令是用來檢測在u-boot下網路是否正常的。tftp是用來通過網路下載檔案的。
u-boot有兩個和網路有關係的環境變數:ipaddr、serverip,用來表示本機的IP地址和tftp server IP地址。
pri ipaddr
ipaddr=192.168.56.222
pri serverip
serverip=192.168.56.163
設定好這兩個環境變數後,連線上網線。使用ping 命令檢測網路是否正常工作。
ping 192.168.56.163
若輸出:
host 192.168.56.163 is alive
網路正常。
使用tftp命令下載檔案。
設定好tftp server伺服器後,
tftp 1000000 uImage.bin
Using [email protected] device
TFTP from server 192.168.56.163; our IP address is 192.168.56.222
Filename ‘uImage.bin’.
Load address: 0x1000000
Loading: ##################################################
469.7 KiB/s
done
Bytes transferred = 4820574 (498e5e hex)

6.網路PHY晶片操作MDIO/MII

除錯、操作PHY的命令主要有MDIO 和MII。這兩個命令的區別是:MII可以訪問不同MII總線上裝置的Reg,MDIO命令只能訪問當前MII匯流排的PHY Reg。
mii
mii help
mdio
mido help
使用mii device 可以檢視該系統有幾個MDIO匯流排。
我的平臺上輸出:
MII devices: 'FSL_MDIO0' 'FM_TGEC_MDIO'
Current device: 'FSL_MDIO0'
說明我的平臺上有兩個MDIO匯流排,現在使用的是FSL_MDIO0
只要涉及到匯流排,就意味著有多個裝置都接到這個BUS上,那就要區分這些個裝置,怎麼區分吶?給掛載到這個BUS上的裝置分配一個唯一的ID,在MII匯流排裡叫phyID。
我怎麼知道我的硬體平臺有哪些phy可以操作,這些phy的phyID是多少?
u-boot中可以使用mdio list 檢視下,
mdio list print
若沒有輸出,可以參考原理圖,原理設計時會通過硬體設定好各個phy的phyID。
PHY的各個控制、管理暫存器有一個統一的offset和規範,見IEEE802.3 clause 22(千兆PHY)和IEEE802.3 clause 45(萬兆PHY)。該規範還定義了MII匯流排的通訊協議、時序等內容。
假設我們想知道PHY的link status,我們可以
mii read 0 1 (訪問的phyID為0的PHY的offset為1的暫存器的值)
規範定義PHY暫存器offset為1的表示PHY status
phy register offset
PHY status暫存器的定義見下圖:
phy status register
phy status register
返回值:
79ED
我們可以將上述返回值,轉換成二進位制數,對照規範定義來翻譯含義。當然,這有點枯燥。
我們可以使用mii dump 0 1
mido dump print
mdio 的操作和mii 的操作差不多。主要是理解phyID和reg引數和ieee802.3 clause22和clause45規範。

7.NADN Flash 操作

Nand Flash作為塊裝置使用,不支援隨機讀寫。且Nand Flash晶片每一位(bit)只能從1變為0,而不能從0變為1,所以在對其進行寫入操作之前要一定將相應塊擦除(擦除即是將相應塊得位全部變為1).
.讀資料(將nandflash中的資料讀取到記憶體中):
nand read - addr off|partition size
nand read 1000000 0 10
主要的引數包括:讀取到的資料存放地址(mem addr)、offset(page-aligned)、size(data size)。
nand read 1000000 1000 10
offset要求為page-aligned,我使用的這款Nand Flash的page size為4k。
寫資料(將記憶體中的資料寫入nand flash):
.擦除
nand erase 0 10
.寫資料
nand write 1000000 0 10

8.Nor Flash操作

norflash支援隨機讀,在ASIC指令集的CPU上norflash地址一般對映到統一編址地址上,因此可以使用md 命令讀取資料。需要檢視硬體設計原理圖和CPU的datasheet來確定表示norflash 的地址範圍。
md e8000000 10
這裡寫圖片描述
在我的硬體平臺上0xe8000000-0xEFFFFFFF是norflash的地址範圍。
norflash的寫操作需要特定的時序,且需要先擦除再寫入。因此需要專門的驅動程式,這個驅動程式可以是軟體實現也可以是CPU硬體支援。

9.SPI Flash操作

檢測系統中存在哪些spi 裝置
sf probe
我係統的輸出:
SF: Detected W25Q256FV with page size 64 KiB, total 32 MiB

SPI flash也是一種flash儲存器,當然寫之前也要擦除操作。
讀資料:
sf read 1000000 0 10
寫資料:
.擦除
sf erase 0 10
.寫入
sf write 1000000 0 10

10.USB 儲存裝置操作

USB 是一個標準的塊裝置,讀寫都要按照block為最基本的單位。
掃描USB 裝置
usb start
我自己平臺上的輸出:
starting USB...
USB0: USB EHCI 1.00
scanning bus 0 for devices... 2 USB Device(s) found
USB1: USB EHCI 1.00
scanning bus 1 for devices... 1 USB Device(s) found
scanning usb for storage devices... 1 Storage Device(s) found

可以看到,我的硬體平臺上有兩個USB Host controller,其中USB1 bus上插了一個U盤,被識別為USB儲存裝置。
U盤的讀寫可以按照無檔案系統形式進行裸讀寫。
讀(到記憶體):
usb read 1000000 0 10
寫(從記憶體到U盤):
usb write 1000000 0 10

一般地,使用U盤主要是從普通PC機上Copy檔案到目標單板。一般u-boot下支援FAT格式的檔案系統。
使用以下命令讀取一個FAT檔案系統下的檔案。
fatload usb 0 1000000 test.bin
fatload 的usage:
fatload <interface> [<dev[:part]> [<addr> [<filename> [bytes [pos]]]]]
- Load binary file 'filename' from 'dev' on 'interface'
to address 'addr' from dos filesystem.
'pos' gives the file position to start loading from.
If 'pos' is omitted, 0 is used. 'pos' requires 'bytes'.
'bytes' gives the size to load. If 'bytes' is 0 or omitted,
the load stops on end of file.
If either 'pos' or 'bytes' are not aligned to
ARCH_DMA_MINALIGN then a misaligned buffer warning will
be printed and performance will suffer for the load.

其中dev[:part]表示那個USB裝置,可以通過usb dev 來檢視。
我的平臺輸出:
USB device 0: Vendor: Rev: 1.00 Prod:
Type: Removable Hard Disk
Capacity: 7424.0 MB = 7.2 GB (15204352 x 512)

可見我的U盤的USB裝置號是0。

11.硬碟操作

檢視系統中的SATA盤
sata info
SATA device 0: Model: RTBMB256VBM8EWEY Firm: T1064 Ser#: FN0215122450000198
Type: Hard Disk
Capacity: 244198.3 MB = 238.4 GB (500118192 x 512)
SATA device 1: Model: Firm: Ser#:
Type: Hard Disk
Capacity: not available

可見,系統中有兩個SATA介面,其中有一個238.4G的sata硬碟。
裸讀寫操作:
讀(到記憶體):
sata read 1000000 0 10
寫(從記憶體到SATA盤):
sata write 1000000 0 10

我們使用SATA盤,不會直接裸操作,一般會在檔案系統層面進行檔案操作。
在linux下常用的檔案系統有:ext2、ext3、ext4。
我們這裡使用ext2檔案系統,將SATA盤格式化成ext2檔案系統格式,在linux主機上Copy檔案到SATA盤,然後連線到目標平臺。
讀檔案:
ext2load sata 0:1 1000000 /boot/uImage

12. SD卡操作

塊裝置,也是一種Flash,寫之前也需要Erase。
檢視系統中的SD卡資訊,
mmc info
我的系統輸出:
Device: FSL_SDHC
Manufacturer ID: 1d
OEM: 4144
Name: SD
Tran Speed: 50000000
Rd Block Len: 512
SD version 3.0
High Capacity: Yes
Capacity: 3.8 GiB
Bus Width: 4-bit
Erase Group Size: 512 Bytes

讀:
mmc read 1000000 0 10
寫:
1.擦除
2.寫入
mmc erase 0 10
mmc write 1000000 0 10
當然,如果SD卡里有檔案系統,FAT、ext2等。我們可以使用fatload、ext2load來載入檔案系統裡的檔案。具體指令這裡略。

13.PCIE操作

PCIE 裝置很常見,傳輸速度高,支援熱拔插。
檢視系統中的PCIE裝置。
pci 1
我的平臺輸出:
`Scanning PCI devices on bus 1
BusDevFun VendorId DeviceId Device Class Sub-Class

01.00.00 0x8086 0x1583 Network controller 0x00
01.00.01 0x8086 0x1583 Network controller 0x00
我的系統pcie bus 1上插入了一個pcie網絡卡裝置。
pci header 01.00.00
可以列出bus 1的00號裝置00號功能,這一個具體device的pcie配置資訊。
我的平臺輸出如下:
vendor ID = 0x8086
device ID = 0x1583
command register ID = 0x0006
status register = 0x0010
revision ID = 0x02
class code = 0x02 (Network controller)
sub class code = 0x00
programming interface = 0x00
cache line = 0x08
latency time = 0x00
header type = 0x80
BIST = 0x00
base address 0 = 0xe100000c
base address 1 = 0x00000000
base address 2 = 0x00000000
base address 3 = 0xe180000c
base address 4 = 0x00000000
base address 5 = 0x00000000
cardBus CIS pointer = 0x00000000
sub system vendor ID = 0x8086
sub system ID = 0x0001
expansion ROM base address = 0xe1880000
interrupt line = 0x00
interrupt pin = 0x01
min Grant = 0x00
max Latency = 0x00
還可以通過
pci modifypci write` 等命令修改PCIE的CFG暫存器,用於配置pcie裝置。
當然,關於PCIE裝置的除錯,已經超出了本文的範圍。感興趣的可以參考PCIE3.0 Spec

14.通過串列埠收發檔案Xmodem

有些時候,硬體剛出爐,可能像網口、USB bus都還沒除錯通過。這個時候可能只有串列埠是好用的,那我能用串列埠傳輸檔案嗎?當然可以,基於串列埠的檔案傳輸協議:Xmodem。
loadx 1000000
u-boot會等待使用者傳輸檔案。
## Ready for binary (xmodem) download to 0x01000000 at 115200 bps...
CCC

我使用的串列埠除錯工具是SecureCRT,傳送Xmodem協議格式的檔案方法:
SecureCRT 傳送Xmodem
就是傳輸速度慢了點,平均4K/S(115200buard情況下)。

15.使用u-boot執行script檔案

u-boot的CLI即有interactive和noninteractive,說的直白點。就是即可以人工輸入不同的命令來實現你的目的,也可以執行u-boot指令碼。
比如:
echo ===== DMA Desc 1 =====
mw.l 100000 0 1000 #Init to zero
mw.l 100000 babeface 1000 #Write "babeface"
將上述內容儲存為一個檔案,通過tftp/Xmodem方式下載到記憶體裡,然後執行此指令碼。
loadx 1000000
傳送檔案
source 0x1000000`
然後u-boot就會順序執行你的指令碼檔案裡的內容。是不是挺好玩的。
………………結束……………………

相關推薦

U-boot簡介常用命令說明

1. 疑問 使用u-boot開發一些專案有一段時間了,對u-boot也更加熟悉了。以前經常想u-boot存在的意義到底是啥呢?百科上說U-Boot的作用是系統引導。恩?引導系統?具體什麼含義?u-boot在實際開發中還有什麼具體作用?好吧,如果你對這些問題感興

【安全牛學習筆記】tcpdump簡介常用命令實例

信息安全 tcpdump security+ tcpdump簡介 tcpdump 是一個運行在命令行下的嗅探工具。它允許用戶攔截和顯示發送或收到過網絡連接到該 計算機的TCP/IP和其他數據包。tcpdump 是一個在BSD許可證下發布的自由軟件。

yum簡介常用命令

服務器 ogr 重新安裝 默認 處理依賴關系 move justify yum 文件路徑 yum的簡介Yum是一個shell前端軟件包管理器,基於RPM包管理,能夠從指定的服務器自動下載RPM包並安裝,可以自動處理依賴關系,並且一次安裝所有依賴的軟件包,從而實現統一管理yu

Git簡介常用命令

Git:分散式版本控制系統,沒有“中央伺服器”,每個人的電腦上都是一個完整的版本庫。 SVN:集中式版本控制系統,版本庫是集中存放在中央伺服器的,大家都是圍繞中央伺服器展開工作的。 git安裝 Linux上安裝Git:sudo apt-get in

Kubernetes之kubectl命令列工具簡介、安裝配置常用命令

kubectl概述 kubectl是Kubernetes叢集的命令列工具,通過kubectl能夠對叢集本身進行管理,並能夠在叢集上進行容器化應用的安裝部署。執行kubectl命令的語法如下所示: $ kubectl [command] [TYPE] [NAME] [flags] coma

redis3.2.8安裝和配置,常用命令簡介

什麼redis? redis是一個key-value儲存系統。和Memcached類似,它支援儲存的value型別相對更多,包括string(字串)、list(連結串列)、set(集合)、zset(sorted set –有序集合)和hash(雜湊型別)。這些

Git使用:安裝,使用常用命令整理

reset short 配置文件 res 命名 nbsp class 名詞 如果 對於程序猿而言,git是最常接觸的工具之一,因此需要熟練快速掌握其技巧。 git安裝: windwos: 【原創】Windows平臺下Git的安裝與配置 Ubuntu:git與github在

DAY-8 Linux基礎常用命令(4)

打開 ip地址 grep 軟件包 linux基礎 tro mks 官網 vim 一、制作swap分區(命令) swapon –s 查看當前激活狀態的swap分區 free –m 以m為單位查看分區 swapoff關閉分區 swapon打開分區 添加swap分區——mks

DAY-9 Linux基礎常用命令(5)

mod conf 自己的路 linux操作 解包 二進制安裝 netstat iptables usr 一、Samba(類似共享網盤) 1、功能:Linux操作系統給win用戶共享文件用 2、如何部署 》》準備環境:iptables –F(清除防火墻)、systemctl

Day47:HTML(簡介常用標簽)

back tar one cli 搜索 meta標簽 ges 總結 images 一、HTML簡介 html是什麽? 超文本標記語言(Hypertext Markup Language,HTML)通過標簽語言來標記要顯示的網頁中的各個部分。一套規則,瀏覽器認識的規則。 瀏

ES6(簡介常用)-下

所有 對象的引用 上下 組合 代碼 ext 回收 .html 布爾值 八、Iterator 和 for of 值遍歷(谷歌瀏覽器無) 1、Iterator(遍歷器)的概念 JavaScript 原有的表示“集合”的數據結構,主要是數組(Array)和對象(Obje

ES6(簡介常用)-上

我們 gree 要求 同名 並且 undefined extends err rgs 一、類的支持 1、簡介 ES6中添加了對類的支持,引入了class關鍵字。JS本身就是面向對象的,ES6中提供的類實際上只是JS原型模式的包裝。現在提供原生的class支持後,對象的創

Docker使用技巧常用命令

span server 登錄用戶 serve java 本地 oot ps 命令 用戶 安裝docker 檢查curl包是否安裝? which curl 如果curl沒有安裝的話,則先更新apt源,並安裝curl,如下: apt-get updateapt-get

redis配置文件全解常用命令

redisredis配置文件全解及常用命令1.基本配置daemonize no 是否以後臺進程啟動databases 16 創建database的數量(默認選中的是database 0)save 900 1 #刷新快照到硬盤中,必須滿足兩者要求才會觸發,即900秒之後至少1個關鍵字發生變化。save 3

Linux操作系統常用命令

命令1. 常用命令:1.1 ls命令:1.2 cd 命令: 1.3 cal命令 cal是calendar的意思1.4 echo 命令echo -necho -e "The year is 2018. \nToday is 8. "2. 命令類型:3. date:時間管理:Linux:

MySQL導入SQL文件常用命令

執行sql 密碼 導出導入 describe 改密 table 地址 from 多條 在MySQL Qurey Brower中直接導入*.sql腳本,是不能一次執行多條sql命令的,在mysql中執行sql文件的命令: mysql> source d:/myp

戴爾 iDRAC 命令行工具常用命令

iDRAC 遠程命令工具 戴爾iDRAC遠程命令工具 OM LRAU iDRAC創建用戶 iDRAC的IP修改 1、RHEL 系統環境iDRAC 命令工具包: Dell EMC OpenManage Linux Remote Access Utilities :http://www.de

Maven環境搭建常用命令、生命周期

ngs 打包 efault info inf com clean setting 常用 一、下載maven包,解壓 二、配置環境變量,MAVEN_PATH=解壓路徑 添加到path中 三、測試 mvn -v 查看maven版本 四、設置本地倉庫的路徑 在co

第二課:第一講Linux操作系統常用命令

d第二課:第一講Linux操作系統及常用命令1.liunx中“X”表示圖像顯示協議X-window有三種:Gnome,KDE,Xface2.windows->.dll(dynamic link library)liunx->.so (shared object)3.認證:authenticatio

第二講:第二課Linux操作系統常用命令

排版 普通用戶 命令格式 配置文件 see 電池 硬件 -h comm 第二講:第二課Linux操作系統及常用命令1.date-顯示系統時間修改時間2.liunx記時模式:晶體振蕩器,高級的每萬年誤差一秒。主機上就是晶體振蕩器紀時的。晶體振蕩器要供電才行,主板上有紐扣電池。