注意:在一切工作开始之前,一定要保证PC端使用的是Ubuntu x86 32-bit,14.04版本的操作系统,否则可能会出现各种莫名其妙的问题。
sudo apt-get install build-essential minicom tftpd-hpa git-all subversion openssh-server ncurses-dev libtool texinfo intltool
含义是安装一些必要的软件,比如:
build-essential:和C/C++编译相关的软件包;
minicom:一种串口通信工具,用于与开发板进行串口通信;
tftpd-hpa:一种网络通信工具,可通过tftp服务将Linux内核映像安装到开发板上;
git-all:一种分布式版本控制器,主要用来远程下载一些代码;
subversion:一种集中式版本控制器,用途同上;
openssh-server:一种远程登录和文件传输工具,用于远程登录开发板以及向开发板传输文件;
ncurses-dev:一种和显示界面有关的软件;
libtool:一种通用库支持脚本;
texinfo:Texinfo是一个文档系统,它通过单个源文件同时生成在线信息文档和可打印的输出。;
intltool:intltool是一个集合的工具,可以提取界面的字符串,合并翻译。
从http://www.analog.com/en/design-center/processors-and-dsp/evaluation-and-development-software/LinuxAddin.html上下载Linux版本的CCES,及其对应的Linux插件,并将这2个压缩包上传至PC端Linux系统中。
通过以下命令安装压缩包:
sudo dpkg -i adi-CrossCoreEmbeddedStudio-linux-x86-2.8.3.deb
sudo dpkg -i adi-LinuxAddinForCCES-linux-x86-1.3.1.deb
这两个软件将会安装在主系统的 /opt/analog 目录下。
位置 | 描述 |
---|---|
/opt/analog/cces/2.8.3/ARM/arm-none-eabi | ARM裸机工具链 |
/opt/analog/cces-linux-add-in/1.3.1/ARM/arm-linux-gnueabi | ARM Linux目标工具链 |
/opt/analog/cces-linux-add-in/1.3.1/uboot-sc5xx-1.3.1/bin/init-sc589-ezkit.elf | 初始化ELF文件,用于JTAG加载 |
/opt/analog/cces-linux-add-in/1.3.1/uboot-sc5xx-1.3.1/bin/uboot-sc589-ezkit | U-boot ELF文件,用于JTAG加载 |
/opt/analog/cces-linux-add-in/1.3.1/uboot-sc5xx-1.3.1/bin/uboot-sc589-ezkit.ldr | U-boot LDR文件,用于从SPI Flash中启动 |
/opt/analog/cces-linux-add-in/1.3.1/buildroot-sc5xx-1.3.1/images/sc589-ezkit.dtb | 用于Linux启动的开发板设备树文件 |
/opt/analog/cces-linux-add-in/1.3.1/buildroot-sc5xx-1.3.1/images/uImage-sc589-ezkit | 引导映像文件,包括内核和RAM rootfs |
/opt/analog/cces-linux-add-in/1.3.1/buildroot-sc5xx-1.3.1/images/vmImage-sc589-ezkit | Linux内核文件 |
/opt/analog/cces-linux-add-in/1.3.1/buildroot-sc5xx-1.3.1/images/rootfs.ext3 | 根文件系统镜像 |
以下是SC589的文件加载地址和设备树加载地址:
开发板 | 文件名 | 文件加载地址 | 设备树名 | 设备树加载地址 |
---|---|---|---|---|
ADSP-SC589 EZKIT | uImage-sc589-ezkit | 0xC2000000 | sc589-ezkit.dtb | 0xC4000000 |
以下经常使用U-Boot能够识别的变量比如${loadaddr}来代替对应的文件加载地址。
ADSP-SC589开发板上并没有预先烧写好U-boot和Linux内核,因此我们需要利用TFTP工具,通过网络传输文件到开发板。
sudo mkdir /tftpboot
sudo chmod -R 777 /tftpboot
该条命令的含义是将服务器目录权限改为可读可写可执行。
编辑文件/etc/default/tftpd-hpa,将其内容改为:
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure"
sudo service tftpd-hpa restart
引导Linux内核需要用到两种交叉编译工具链:裸机工具链和Linux目标工具链。其中使用裸机工具链编译出的代码只能运行在没有安装操作系统的开发板上,主要用于编译U-Boot;Linux目标工具链编译出的代码只能运行在开发板Linux系统上,主要用于编译Linux内核。
在执行以下操作前,需要保证已经挂载到包含了两个工具链的bin目录下。
将以下环境变量添加到~/.bashrc文件的末尾:
export PATH=$PATH:/opt/analog/cces-linux-add-in/1.3.1/ARM/arm-linux-gnueabi/bin:/opt/analog/cces/2.8.3/ARM/arm-none-eabi/bin
之后运行文件bashrc,添加环境变量。
source ~/.bashrc
为了将U-boot烧写到Flash中,我们首先要使用ICE1000仿真器在板子上运行U-boot,之后再使用U-boot的update命令将U-boot通过串口烧写到SPI Flash中。当烧写完成后,再次启动板子时开发板会自动启动Flash中的U-boot,无需再使用仿真器运行U-boot。
OpenOCD是一个开源的JTAG上位机程序,支持多种芯片。使用OpenOCD需要至少两个配置文件,一个是仿真器的配置文件,一个是开发板的配置文件。
cd /opt/analog/cces/2.8.3/ARM/openocd/share/openocd/scripts
sudo su
/opt/analog/cces/2.8.3/ARM/openocd/bin/openocd -f interface/ice1000.cfg -f target/adspsc58x.cfg
该段命令的含义是指定OpenOCD的配置文件为ice1000.cfg和adspsc58x.cfg。
Open On-Chip Debugger (Analog Devices CCES 2.8.3 OpenOCD 0.9.0-
g6aca937) 0.9.0
Licensed under GNU GPL v2
Report bugs to <[email protected]>
adapter speed: 1000 kHz
Info : auto-selecting first available session transport "jtag". To
override use 'transport select ' .
halt and restart using CTI
trst_only separate trst_push_pull
Info : ICE-1000 firmware version is 1.0.2
Info : clock speed 1000 kHz
Info : JTAG tap: adspsc58x.adjc tap/device found: 0x228080cb (mfg: 0x
065, part: 0x2808, ver: 0x2)
Info : JTAG tap: adspsc58x.dap enabled
Info : adspsc58x.dap: hardware has 3 breakpoints, 2 watchpoints
Info : adspsc58x.dap: but you can only set 1 watchpoint
注意:如果你在使用虚拟机运行Linux,请确保JTAG已经接到你的虚拟机上!
u-boot的输出信息会通过串口从开发板上的micro USB口传送到你的主机,在主机上通过minicom(一种串口调试软件)这一软件显示。
在使用minicom显示串口信息之前,我们需要对minicom进行一些设置:
1.在终端输入指令:
sudo minicom -s
该条命令的含义是设置minicom参数。
2.在弹出来的设置界面中选择“Serial port setup”选项;
3.设置Serial Device(串口设备)为“/dev/ttyUSB0”;
设置Bps/Par/Bits(波特率)为“57600 8N1”;
设置Hardware Flow Control(硬件流控制)为“No”;
4.关闭串口设置选项,选择“Save setup as dfl”;
5.点击“Exit”。
配置完成后,在终端输入
sudo minicom
输入完成后会打开一个新的minicom窗口,来自u-boot的信息会在其中打印显示。
GDB是一种Linux上的调试软件,可以实现远程调试和打断点之类的功能,在这里我们主要使用它将u-boot加载到SC589的内存中去。
新打开一个终端,输入以下命令
cd /opt/analog/cces-linux-add-in/1.3.1/uboot-sc5xx-1.3.1/bin
arm-none-eabi-gdb u-boot-sc589-ezkit
(gdb) target remote :3333
以上指令的作用是使用GDB调试SC589的U-boot程序;其中(gdb) target remote :3333
的含义是让gdb软件连上调试器所在的3333端口。
接下来,加载init stub程序,这是一个将开发板CPU和内存初始化的应用程序。
(gdb) load init-sc589-ezkit.elf
(gdb) c
<Ctrl + C>
(gdb)
第一行命令的含义是将初始化程序加载到内存;第二行命令的含义是运行该程序;第三行命令的含义是停止运行现在的程序。
接下来,加载并运行U-boot:
(gdb) load u-boot-sc589-ezkit
(gdb) c
现在,U-boot已经运行在开发板的内存中了,我们可以在minicom的显示界面中看到输出。接下来我们需要将U-boot存储进Flash中,这样下次我们运行开发板就不需要像以上操作那样从主机烧写U-boot,开发板上电后会从Flash中自动运行U-boot。
烧写u-boot的过程是:先通过TFTP服务将u-boot文件从主机传入开发板的RAM中去,再从开发板的RAM将u-boot文件存储进SPI Flash中。
首先执行命令:
cd /opt/analog/cces-linux-add-in/1.3.1/uboot-sc5xx-1.3.1/bin
cp u-boot-sc589-ezkit.ldr /tftpboot/u-boot.ldr
命令的含义是将u-boot-sc589-ezkit.ldr文件拷贝到tftpboot目录下,并改名为u-boot.ldr。
确保开发板和主机连接在同一网络下。
在minicom中输入以下指令:
set ipaddr $u_boot_ip
set serverip $your_host_ip
run update
save
其中 u b o o t i p 和 u_boot_ip和 ubootip和your_host_ip分别填写u-boot和虚拟机的ip地址。
现在,我们应该已经将U-Boot成功地烧写到开发板上的Flash芯片中去了。接下来我们需要将Boot模式切换到SPI Flash Boot(BMODE开关设置为位置1)。
从现在开始,除非u-Boot引导失败,我们就不需要使用ICE仿真器了。当重启开发板时,u-Boot应该会启动,在minicom中应该可以看到输出:
U-Boot 2015.01 ADI-1.3.1-00006-g857884c (Nov 07 2017 - 13:31:01)
CPU: ADSP ADSP-SC589-0.1 (Detected Rev: 1.1) (spi flash boot)
VCO: 450 MHz, Cclk0: 450 MHz, Sclk0: 112.500 MHz, Sclk1: 112.500
MHz, DCLK: 450 MHz
OCLK: 150 MHz
I2C: ready
DRAM: 224 MiB
MMC: SC5XX SDH: 0
SF: Detected W25Q128BV with page size 256 Bytes, erase size 4 KiB,
total 16 MiB
In: serial
Out: serial
Err: serial
other init
Net: dwmac.3100c000
Hit any key to stop autoboot: 5
可使用3种方法引导Linux内核:
这种引导方式是将Linux内核和文件系统通过网络复制到开发板内存中运行。这种方法因为其便于修改内核的特性,在开发过程中使用较多。但由于该方法依赖于网络,且开发板上没有稳定存储的文件系统,而较少应用在实际生产中。
首先我们需要将两个文件复制到TFTP目录下,这两个文件分别是Linux内核镜像文件uImage-sc589-ezkit和设备树文件sc589-ezkit.dtb(其作用是包含了芯片的硬件信息)。
cd /opt/analog/cces-linux-add-in/1.3.1/buildroot-sc5xx-1.3.1/images
cp uImage-sc589-ezkit /tftpboot/uImage
cp sc589-ezkit.dtb /tftpboot
重启开发板,并在u-boot 5秒倒计时未结束时在minicom终端中按任意键进入uboot命令界面,输入以下指令:
set ipaddr $u_boot_ip
set serverip $your_host_ip
run ramboot
这样内核就在RAM中被启动了。minicom终端中会显示打印信息。启动内核的过程中需要登陆,登陆帐户名和密码都是“root”。
Speed: 100, full duplex
Using dwmac.3100c000 device
TFTP from server 10.100.4.174; our IP address is 10.100.4.50
Filename 'uImage'.
Load address: 0xc2000000
Loading:
*#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
###
3 MiB/s
done
Bytes transferred = 22931552 (15de860 hex)
Speed: 100, full duplex
Using dwmac.3100c000 device
TFTP from server 10.100.4.174; our IP address is 10.100.4.50
Filename 'sc589-ezkit.dtb'.
Load address: 0xc4000000
Loading: *##
2.2 MiB/s
done
Bytes transferred = 18516 (4854 hex)
## Booting kernel from Legacy Image at c2000000 ...
Image Name: Linux-4.0.0-ADI-1.3.1
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 22931488 Bytes = 21.9 MiB
Load Address: c2008000
Entry Point: c2008000
Verifying Checksum ... OK
## Flattened Device Tree blob at c4000000
Booting using the fdt blob at 0xc4000000
Loading Kernel Image ... OK
Loading Device Tree to cfe5b000, end cfe62853 ... OK
Starting kernel ...
Booting Linux on physical CPU 0x0
Linux version 4.0.0-ADI-1.3.1 (test@linux114-sc589-usbhost) (gcc
version 4.8.3 (Analog Devices Inc. ARM Tools
(6982e14d46b79b4d98b7172964d596c02615742a). Distributed as part of
CrossCore Embedded Studio and associated add-ins. jenkins-
LINUXADDIN1_3_0_arm_linux_gnueabi_toolchain-4 4 edin-verona.spd.
analog.com) ) #4 Wed Nov 8 16:31:44 CST 2017
CPU: ARMv7 Processor [410fc051] revision 1 (ARMv7), cr=10c53c7d
CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction
cache
Machine model: ADI sc589-ezkit
bootconsole [earlycon0] enabled
Memory policy: Data cache writeback
dump init clock rate
CGU0_PLL 450 MHz
CGU0_SYSCLK 225 MHz
CGU0_CCLK 450 MHz
CGU0_SYS0 112 MHz
CGU0_DCLK 450 MHz
CGU0_OCLK 150 MHz
CGU0_SYS0 112 MHz
Built 1 zonelists in Zone order, mobility grouping on. Total
pages: 56896
Kernel command line: root=/dev/mtdblock2 rw rootfstype=jffs2
clkin_hz=(25000000) earlyprintk=serial,uart0,57600 console=ttySC0,576
00 mem=224M ip=10.100.4.50:10.100.4.174:192.168.0.1:255.255.255.0:
sc58x:eth0:off
PID hash table entries: 1024 (order: 0, 4096 bytes)
Dentry cache hash table entries: 32768 (order: 5, 131072 bytes)
Inode-cache hash table entries: 16384 (order: 4, 65536 bytes)
Memory: 204744K/229376K available (3812K kernel code, 122K rwdata,
1436K rodata, 17020K init, 88K bss, 24632K reserved, 0K cmareserved)
Virtual kernel memory layout:
vector : 0xffff0000 - 0xffff1000 ( 4 kB)
fixmap : 0xffc00000 - 0xfff00000 (3072 kB)
vmalloc : 0xce800000 - 0xff000000 ( 776 MB)
lowmem : 0xc0000000 - 0xce000000 ( 224 MB)
modules : 0xbf000000 - 0xc0000000 ( 16 MB)
.text : 0xc0008000 - 0xc0528380 (5249 kB)
.init : 0xc0529000 - 0xc15c8000 (17020 kB)
.data : 0xc15c8000 - 0xc15e6820 ( 123 kB)
.bss : 0xc15e6820 - 0xc15fcbac ( 89 kB)
NR_IRQS:16 nr_irqs:16 16
GIC CPU mask not found - kernel will fail to boot.
GIC CPU mask not found - kernel will fail to boot.
sched_clock: 32 bits at 112MHz, resolution 8ns, wraps every
38177486839ns
Console: colour dummy device 80x30
Calibrating delay loop... 297.98 BogoMIPS (lpj=595968)
pid_max: default: 32768 minimum: 301
Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)
Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)
CPU: Testing write buffer coherency: ok
Setting up static identity map for 0xc23a0ab0 - 0xc23a0ae4
devtmpfs: initialized
do_initcall_level level 0
do_initcall_level level 1
VFP support v0.3: implementor 41 architecture 2 part 30 variant 5
rev 1
pinctrl core: initialized pinctrl subsystem
NET: Registered protocol family 16
do_initcall_level level 2
DMA: preallocated 256 KiB pool for atomic coherent allocations
do_initcall_level level 3
L2C: device tree omits to specify unified cache
L2C-310 dynamic clock gating enabled, standby mode enabled
L2C-310 cache controller enabled, 8 ways, 256 kB
L2C-310: CACHE_ID 0x410000c9, AUX_CTRL 0x06040000
sc58x_init: registering device resources
sec init...
enabled
hw-breakpoint: Failed to enable monitor mode on CPU 0.
ADI DMA2 Controller
do_initcall_level level 4
vgaarb: loaded
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
i2c-bfin-twi 31001400.twi: Blackfin on-chip I2C TWI Contoller,
regs_base@f4001400
i2c-bfin-twi 31001500.twi: Blackfin on-chip I2C TWI Contoller,
regs_base@f4001500
i2c-bfin-twi 31001600.twi: Blackfin on-chip I2C TWI Contoller,
regs_base@f4001600
pps_core: LinuxPPS API ver. 1 registered
pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo
Giometti <[email protected]>
PTP clock support registered
Advanced Linux Sound Architecture Driver Initialized.
do_initcall_level level 5
Switched to clocksource cs_gptimer
NET: Registered protocol family 2
TCP established hash table entries: 2048 (order: 1, 8192 bytes)
TCP bind hash table entries: 2048 (order: 1, 8192 bytes)
TCP: Hash tables configured (established 2048 bind 2048)
TCP: reno registered
UDP hash table entries: 256 (order: 0, 4096 bytes)
UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
NET: Registered protocol family 1
do_initcall_level level 6
hw perfevents: enabled with armv7_cortex_a5 PMU driver, 3 counters
available
futex hash table entries: 256 (order: -1, 3072 bytes)
jffs2: version 2.2. (NAND) © 2001-2006 Red Hat, Inc.
External imprecise Data abort at addr=0xb6f52880, fsr=0x1c06
ignored.
io scheduler noop registered (default)
APP_STAT=0,RSCKPHY_STAT=0,LINK_CTRL_STATUS_REG2=10001
sc58x-pcie 310b8000.pcie: Link training failed
sc58x-pcie 310b8000.pcie: PORT_LINK_DEBUG0 = 8ae100,
PORT_LINK_DEBUG1 = 8200000
sc58x-pcie: probe of 310b8000.pcie failed with error -110
ADI serial driver
adi-uart4.0: ttySC0 at MMIO 0x31003000 (irq = 20, base_baud = 703125
0) is a ADI-UART4
console [ttySC0] enabled
console [ttySC0] enabled
bootconsole [earlycon0] disabled
bootconsole [earlycon0] disabled
adi-uart4.2: ttySC2 at MMIO 0x31003800 (irq = 84, base_baud = 703125
0) is a ADI-UART4
loop: module loaded
adi-spi3 31042000.spi: registered ADI SPI controller spi0
adi-spi3 31043000.spi: registered ADI SPI controller spi1
m25p80 spi2.38: found w25q128, expected w25q32
m25p80 spi2.38: w25q128 (16384 Kbytes)
3 ofpart partitions found on MTD device spi2.38
Creating 3 MTD partitions on "spi2.38":
0x000000000000-0x000000080000 : "uboot (spi)"
0x000000080000-0x000000600000 : "kernel (spi)"
0x000000600000-0x000001000000 : "root file system (spi)"
adi-spi3 31044000.spi: registered ADI SPI controller spi2
libphy: Fixed MDIO Bus: probed
CAN device driver interface
bfin_can 31000200.can: bfin_can device registered
(®_base=f4000200, rx_irq=22, tx_irq=23, err_irq=24, sclk=112500000
)
bfin_can 31000a00.can: bfin_can device registered
(®_base=f4000a00, rx_irq=93, tx_irq=94, err_irq=95, sclk=112500000
)
adi-spi3 31042000.spi: chipselect 44 already in use
bfin_can 31000a00.can: Can't start can phy
Trying to free nonexistent resource <0000000031000a00-
0000000031000ffe>
bfin_can: probe of 31000a00.can failed with error -22
stmmaceth 3100c000.ethernet: no reset control found
stmmac - user ID: 0x10, Synopsys ID: 0x37
Ring mode enabled
DMA HW capability register supported
Enhanced/Alternate descriptors
Enabled extended descriptors
RX Checksum Offload Engine supported (type 2)
TX Checksum insertion supported
Wake-Up On Lan supported
Enable RX Mitigation via HW Watchdog Timer
libphy: stmmac: probed
eth0: PHY ID 20005c7a at 1 IRQ POLL (stmmac-0:01) active
force_sf_dma_mode is ignored if force_thresh_dma_mode is set.
stmmaceth 3100e000.ethernet: no reset control found
stmmac - user ID: 0x11, Synopsys ID: 0x37
Ring mode enabled
DMA HW capability register supported
Enhanced/Alternate descriptors
Enabled extended descriptors
RX Checksum Offload Engine supported (type 2)
Wake-Up On Lan supported
Enable RX Mitigation via HW Watchdog Timer
libphy: stmmac: probed
eth1: PHY ID 20005c90 at 1 IRQ POLL (stmmac-1:01) active
usbcore: registered new interface driver usb-storage
musb-hdrc musb-hdrc.1.auto: MUSB HDRC host driver
musb-hdrc musb-hdrc.1.auto: new USB bus registered, assigned bus
number 1
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 1 port detected
musb-hdrc musb-hdrc.3.auto: MUSB HDRC host driver
musb-hdrc musb-hdrc.3.auto: new USB bus registered, assigned bus
number 2
hub 2-0:1.0: USB hub found
hub 2-0:1.0: 1 port detected
mousedev: PS/2 mouse device common for all mice
rtc (null): invalid alarm value: 1900-1-2 0:0:0
rtc-adi2 310c8000.rtc: rtc core: registered 310c8000.rtc as rtc0
i2c /dev entries driver
adi_wdt: initialized: timeout=20 sec (nowayout=0)
Driver 'mmcblk' needs updating - please use bus_type methods
Synopsys Designware Multimedia Card Interface Driver
dwmmc_adi mmc.0: num-slots property not found, assuming 1 slot is
available
dwmmc_adi mmc.0: IDMAC supports 32-bit address mode.
dwmmc_adi mmc.0: Using internal DMA controller.
dwmmc_adi mmc.0: Version ID is 270a
dwmmc_adi mmc.0: DW MMC controller at irq 102, 32 bit host data
width, 1024 deep fifo
dwmmc_adi mmc.0: No vmmc regulator found
dwmmc_adi mmc.0: No vqmmc regulator found
dwmmc_adi mmc.0: 1 slots initialized
Blackfin hardware CRC crypto driver
bfin-hmac-crc 31001200.crc: initialized
bfin-hmac-crc 31001300.crc: initialized
usbcore: registered new interface driver usbhid
usbhid: USB HID core driver
icc 20080000.icc: initialized
TCP: cubic registered
NET: Registered protocol family 17
can: controller area network core (rev 20120528 abi 9)
NET: Registered protocol family 29
can: raw protocol (rev 20120528)
can: broadcast manager protocol (rev 20120528 t)
can: netlink gateway (rev 20130117) max_hops=1
do_initcall_level level 7
ThumbEE CPU extension supported.
mmc_host mmc0: Bus speed (slot 0) = 50000000Hz (slot req 50000000Hz,
actual 50000000HZ div = 0)
console [netcon0] enabled
netconsole: network logging started
rtc-adi2 310c8000.rtc: setting system clock to 1970-01-01 05:17:10
UTC (19030)
mmc0: new high speed SD card at address b368
mmcblk0: mmc0:b368 SMI 1.85 GiB
mmcblk0: p1
IP-Config: Gateway not on directly connected network
ALSA device list:
No soundcards found.
Freeing unused kernel memory: 17020K (c0529000 - c15c8000)
Starting logging: OK
Starting mdev...
Starting watchdog...
Initializing random number generator... random: dd urandom read with
44 bits of entropy available
done.
Starting system message bus: done
Starting network...
Welcome to Buildroot
buildroot login: stmmaceth 3100c000.ethernet eth0: Link is Up -
100Mbps/Full - flow control rx/tx
root
Password:
_______________________________________
a8888b. / Welcome to the buildroot distribution \
d888888b. / _ _ \
8P"YP"Y88 / | | |_| __ __ (TM) |
8|o||o|88 _____/ | | _ ____ _ _ \ \/ / |
8' .88 \ | | | | _ \| | | | \ / |
8`._.' Y8. \ | |__ | | | | | |_| | / \ |
d/ `8b. \ \____||_|_| |_|\____|/_/\_\ |
dP . Y8b. \ For embedded processors including |
d8:' " `::88b \ the Analog Devices ADSP-SC5xx /
d8" 'Y88b \_____________________________________/
:8P ' :888
8a. : _a88P For further information, check out:
._/"Yaa_: .| 88P|
\ YP" `| 8P `.
/ \.___.d| .' - http://buildroot.org/
`--..__)8888P`._.' jgs/a:f - http://www.analog.com/
Have a lot of fun...
#
当最后出现一个小企鹅界面时,表示Linux引导成功。
问题解决:
当引导内核的过程中出现Bad Data CRC(如下面信息所示)时,通常的原因的内核被设置的过大了。
## Booting kernel from Legacy Image at c2000000 ...
Image Name: Linux-4.0.0-ADI-1.1.0
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 22727136 Bytes = 21.7 MiB
Load Address: c2008000
Entry Point: c2008000
Verifying Checksum ... Bad Data CRC
ERROR: can't get kernel image!
可通过修改U-boot的环境变量dtbaddtb来解决这个问题。在U-boot处于命令状态时输入以下指令:
set dtbaddr 0xc6000000
save
为了将文件系统拷贝进SD卡,我们需要先将它格式化。首先将SD卡接入主机的SD卡插槽中,并确保其接入虚拟机。
由于Ubuntu系统在默认情况下会挂载所有插入的SD卡,因此在对SD卡进行格式化之前需要先卸载SD卡。可以使用mount指令查看现在已经挂载的设备。之后可以使用unmount指令卸载SD卡。例如,如果SD卡包含一个/dev/sdb1分区,该分区挂载在/media/testuser/sd_card目录下,就可以通过以下命令卸载:
sudo umount /media/testuser/sd_card
也可以使用指令fdisk -l
来查看挂载设备的信息。
接下来以设备名/dev/sdb
为例演示格式化SD卡的过程,请各位在实践过程中将/dev/sdb
换为自己所用SD卡的实际设备名。
$ sudo fdisk /dev/sdb
/* 创建一个256M大小的主分区1*/
Command (m for help): n
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-3887103, default 2048): PRESS ENTER
Last sector, +sectors or +size{K,M,G} (2048-3887103, default 3887103)
: PRESS ENTER
/* 保存创建的分区 */
Command (m for help): w
使用fdsik创建新分区后,Ubuntu可能会再次自动挂载SD卡。使用上面提过的方法再次将SD卡卸载。
sudo mkfs.ext3 /dev/sdb1 /*将SD卡分区1格式化为ext3格式,mkfs为格式化命令*/
sudo mount -t ext3 /dev/sdb1 /mnt /*将SD卡指定为ext3格式,并挂载到目录/mnt下*/
sudo mkdir ~/sc5xx_rootfs /*在家目录下创建目录sc5xx_rootfs*/
sudo mount /opt/analog/cces-linux-add-in/1.3.1/buildroot-sc5xx-1.3.1/images/rootfs.ext3 ~/sc5xx_rootfs /*将预先构建好的文件系统挂载到目录sc5xx_rootfs下*/
sudo cp ~/sc5xx_rootfs/* -fr /mnt /*将目录sc5xx_rootfs下所有文件递归复制到SD卡的挂载目录/mnt下*/
sudo umount /mnt /*卸载SD卡*/
现在文件系统已经安装在SD卡中,可以从电脑上拔掉SD卡了。
设备树文件对开发板上的各设备信息进行了描述,它包含了CPU个数、内存基地址等信息。在开始加载设备树文件之前,请保证u-boot已被烧入SPI Flash中,并确保tftp服务器ip serverip已经被正确设置。
在主机中输入指令:
cp /opt/analog/cces-linux-add-in/1.3.1/buildroot-sc5xx-1.3.1/images/sc589-ezkit.dtb /tftpboot/
此命令的含义是将设备树文件复制到/tftpboot目录。
接下来在minicom终端输入以下u-boot指令:
$ sf probe 2:1 /*初始化SPI设备命令,在此是初始化SPI2总线上编号为1的设备,即SPI Flash*/
$ tftp ${loadaddr} sc589-ezkit.dtb /*将设备树文件用tftp传送到指定加载地址*/
$ sf erase 0x100000 0x40000 /*擦除SPI Flash中偏移地址0x100000到0x40000处的数据*/
$ sf write ${loadaddr} 0x100000 ${filesize} /*将加载地址处的数据(即设备树)写入到Flash中偏移地址0x100000处,写入数据长度为${filesize}*/
u-boot命令sf的含义是对SPI设备进行操作,${loadaddr}
和${filesize}
都已经定义在u-boot环境变量中,如使用官方u-boot的话无需修改。
操作同上一小节类似,同样是用tftp将内核加载到加载地址,之后用sf命令烧写到Flash。
在主机中输入指令:
cp /opt/analog/cces-linux-add-in/1.3.1/buildroot-sc5xx-1.3.1/images/vmImage-sc589-ezkit /tftpboot/
接下来在minicom终端输入以下u-boot指令:
$ tftp ${loadaddr} vmImage-sc589-ezkit
$ sf erase 0x800000 0x800000
$ sf write ${loadaddr} 0x800000 ${filesize}
指令含义参考上小节。
在minicom控制台中设置以下环境变量,将u-boot配置为使用SD卡上的文件系统。
$ set sdargs set bootargs root=/dev/mmcblk0p1 rw rootwait rootfstype=ext3 clkin_hz=(25000000) earlyprintk console=ttySC0,57600
$ set sdboot 'run sdargs; sf probe 2:1;sf read ${dtbaddr} 0x100000 0x40000;sf read ${loadaddr} 0x800000 0x800000;bootm ${loadaddr} - ${dtbaddr}'
$ set bootcmd run sdboot
$ save
下面仔细分析一下以上的指令:
(1) 第一条指令可以分成两部分来看。首先是set sdarg set bootargs …该指令的含义是,设置环境变量sdargs,在运行这个环境变量时相当于执行set bootargs …指令;之后是set bootargs …,该指令的含义是将环境变量bootargs中的各参数设置成后面那一长串,后面一串参数的含义如下:
(a) root=/dev/mmcblk0p1:设置根文件系统从设备/dev/mmcblk0p1中启动,该设备就是SD卡;
(b) rw:设置启动权限为以读写方式启动;
(c) root wait:等待设备/dev/mmcblk0p1设备就绪后才尝试挂载rootfs。如果没有此参数,linux内核启动时可能会在存储设备尚未就绪时就尝试挂载rootfs,此时肯定挂载失败,那么启动也就失败了;
(d) rootfstype=ext3:设置根文件系统的文件格式为ext3;
(e) clkin_hz=(25000000):设置系统时钟为25000000Hz;
(f) earlyprintk:启用earlyprintk功能;
(g)console=ttySC0,57600:将控制台设置为串口ttySC0,波特率设置为57600,这样控制台信息就可以通过这个串口传送到主机上。
综上所述,设置完这个环境变量后,调用sdargs时就等同于对bootargs环境变量进行如上所述设置。
(2)第二条指令的含义是对环境变量sdboot进行设置,使调用这个环境变量时相当于执行后面的指令:
run sdargs /*运行环境变量sdargs*/
sf probe 2:1 /*初始化SPI Flash*/
sf read ${dtbaddr} 0x100000 0x40000 /*读取之前保存的设备树文件*/
sf read ${loadaddr} 0x800000 0x800000 /*读取之前保存的Linux内核*/
bootm ${loadaddr} - ${dtbaddr} /*读取Linux内核映像头部的信息,以将映像加载到指定地址*/
(3) 第三条指令的含义是将u-boot的启动环境变量bootcmd设置为调用sdboot,这样当u-boot启动时就会自动调用sdboot变量,执行其中的命令。
如果想将内核启动方式改回网络启动,可以输入以下指令:
set bootcmd run ramboot
save
最后,重启开发板,内核和文件系统即可被成功引导。
最后一种引导方法是将Linux内核安装在SD卡上的文件系统中。
为了将文件系统拷贝进SD卡,我们需要先将它格式化。首先将SD卡接入主机的SD卡插槽中,并确保其接入虚拟机。
由于Ubuntu系统在默认情况下会挂载所有插入的SD卡,因此在对SD卡进行格式化之前需要先卸载SD卡。可以使用mount指令查看现在已经挂载的设备。之后可以使用unmount指令卸载SD卡。例如,如果SD卡包含一个/dev/sdb1分区,该分区挂载在/media/testuser/sd_card目录下,就可以通过以下命令卸载:
sudo umount /media/testuser/sd_card
也可以使用指令fdisk -l
来查看挂载设备的信息。
接下来以设备名/dev/sdb
为例演示格式化SD卡的过程,请各位在实践过程中将/dev/sdb
换为自己所用SD卡的实际设备名。
$ sudo fdisk /dev/sdb
/* 创建一个256M大小的主分区1*/
Command (m for help): n
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-3887103, default 2048): PRESS ENTER
Last sector, +sectors or +size{K,M,G} (2048-3887103, default 3887103)
: PRESS ENTER
/* 保存创建的分区 */
Command (m for help): w
使用fdsik创建新分区后,Ubuntu可能会再次自动挂载SD卡。使用上面提过的方法再次将SD卡卸载。
sudo mkfs.ext3 /dev/sdb1 /*将SD卡分区1格式化为ext3格式,mkfs为格式化命令*/
sudo mount -t ext3 /dev/sdb1 /mnt /*将SD卡指定为ext3格式,并挂载到目录/mnt下*/
sudo mkdir ~/sc5xx_rootfs /*在家目录下创建目录sc5xx_rootfs*/
sudo mount /opt/analog/cces-linux-add-in/1.3.1/buildroot-sc5xx-1.3.1/images/rootfs.ext3 ~/sc5xx_rootfs /*将预先构建好的文件系统挂载到目录sc5xx_rootfs下*/
sudo cp ~/sc5xx_rootfs/* -fr /mnt /*将目录sc5xx_rootfs下所有文件递归复制到SD卡的挂载目录/mnt下*/
sudo cp /opt/analog/cces-linux-add-in/1.3.1/buildroot-sc5xx-1.3.1/images/vmImage-sc589-ezkit /mnt /*将Linux内核复制到SD卡的挂载目录/mnt下*/
sudo umount /mnt /*卸载SD卡*/
现在文件系统和Linux内核已经安装在SD卡中,可以从电脑上拔掉SD卡了。
设备树文件对开发板上的各设备信息进行了描述,它包含了CPU个数、内存基地址等信息。在开始加载设备树文件之前,请保证u-boot已被烧入SPI Flash中,并确保tftp服务器ip serverip已经被正确设置。
在主机中输入指令:
cp /opt/analog/cces-linux-add-in/1.3.1/buildroot-sc5xx-1.3.1/images/sc589-ezkit.dtb /tftpboot/
此命令的含义是将设备树文件复制到/tftpboot目录。
接下来在minicom终端输入以下u-boot指令:
$ tftp ${loadaddr} sc589-ezkit.dtb /*将设备树文件用tftp传送到指定加载地址*/
$ sf probe 2:1 /*初始化SPI设备命令,在此是初始化SPI2总线上编号为1的设备,即SPI Flash*/
$ sf erase 0x100000 0x40000 /*擦除SPI Flash中偏移地址0x100000到0x40000处的数据*/
$ sf write ${loadaddr} 0x100000 ${filesize} /*将加载地址处的数据(即设备树)写入到Flash中偏移地址0x100000处,写入数据长度为${filesize}*/
u-boot命令sf的含义是对SPI设备进行操作,${loadaddr}
和${filesize}
都已经定义在u-boot环境变量中,如使用官方u-boot的话无需修改。
在minicom控制台中设置以下环境变量,将u-boot配置为使用SD卡上的文件系统。
$ set sdargs set bootargs root=/dev/mmcblk0p1 rw rootwait rootfstype=ext3 clkin_hz=(25000000) earlyprintk console=ttySC0,57600
$ set sdboot 'run sdargs; sf probe 2:1;sf read ${dtbaddr} 0x100000 0x40000;ext2load mmc 0:1 ${loadaddr} vmImage-sc589-ezkit;bootm ${loadaddr} - ${dtbaddr}'
$ set bootcmd run sdboot
$ save
各指令含义与方法二中类似,只有一条新指令ext2load mmc 0:1 ${loadaddr} vmImage-sc589-ezkit
,含义是将ext2文件格式的文件加载到内存中去,mmc 0:1的含义是要加载的文件在mmc设备0的第1个分区,${loadaddr}表示要加载到的内存地址,vmImage-sc589-ezkit代表要加载的文件名。
最后,重启开发板,内核和文件系统即可被成功引导。
由于开发板在第一次加载u-boot时可能已经存在一些可引导映像,因此在第一次烧写u-boot时建议将BMODE开关拨至位置0。
在将Flash擦除并将u-boot、设备树文件和内核烧写进SPI Flash时,需要在flash操作命令中通过命令确认文件的实际大小和为它们预留的空间,确保文件不会相互覆盖。同时,在输入每个命令后,要从u-boot控制台的提示信息中仔细检查设备树文件和内核文件是否已成功写入SPI Flash。此外,每次重启开发板只需输入一次sf probe
命令。
故障原因是之前拷贝文件系统时将文件系统镜像挂载到了~/sc5xx_rootfs目录下,导致某些文件系统镜像变为只读。执行卸载命令:
umount ~/sc5xx_rootfs
可解决该问题。