Linux驅(qū)動開發(fā)_搭建嵌入式開發(fā)環(huán)境
這篇介紹linux驅(qū)動開發(fā)相關(guān)環(huán)境搭建、驅(qū)動框架介紹、驅(qū)動調(diào)用流程,虛擬機環(huán)境配置、開發(fā)板內(nèi)核編譯、uboot編譯燒寫、配置NFS服務(wù)器、掛載根文件系統(tǒng)等等。
任務(wù)1: 框架復(fù)習(xí)
應(yīng)用編程和底層編程==系統(tǒng)編程和驅(qū)動編程。---Linux框架
Cortex-M3: 底層編程。 FATFS---->M4或者其他系列單片機。
f_write(“1234”); --------函數(shù)調(diào)用-----(SD寫扇區(qū))
跑Linux操作系統(tǒng): 很耗資源(RAM)。(M3/M4) UCGUI或者STemwin
一般CPU內(nèi)置的ROM和RAM很小。 M級別。
SRAM (靜態(tài)內(nèi)存)內(nèi)存條: 1MB -----空間比較小(成本比較高)、電路簡單
DRAM (動態(tài)內(nèi)存)內(nèi)存條: 1GB -----
64KB和512KB
從CPU上電開始到Linux操作系統(tǒng)正常的運行經(jīng)歷的步驟:
1. ?由CPU內(nèi)嵌的程序?qū)D卡上指定位置的uboot代碼讀取到CPU內(nèi)置的RAM里運行。
2. ?當UBOOT代碼正常運行之后,再初始化DDR內(nèi)存條,再將SD卡指定位置的內(nèi)核映像讀取到DDR內(nèi)存條運行。
3. ?當內(nèi)核正常啟動之后,就會掛載根文件系統(tǒng),當根文件系統(tǒng)掛載成功之后,就可以正常的編程了。
任務(wù)2: 搭建開發(fā)環(huán)境
第一個步驟: 清除前面的學(xué)習(xí)記錄。 #rm /work -rf
準備工作: 在根目錄下重新創(chuàng)建一個/work/tiny4412文件夾。
1.1 ?安裝交叉編譯器
編譯器的位置: \友善之臂_Tiny4412\光盤資料\Linux\ arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz
1. ?在/work/創(chuàng)建一個arm-linux-gcc的文件夾。
2. ?將arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz拷貝過去解壓
3. ?解壓: [root@wbyq arm-linux-gcc]# tar xvf arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz
4. ?獲取編譯器的絕對路徑:
[root@wbyq bin]# pwd
/work/arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/bin
5. ?加入環(huán)境變量 PATH
[root@wbyq bin]# gedit /etc/profile
6. 生效環(huán)境變量: [root@wbyq bin]# source /etc/profile
1. ?為什么將環(huán)境變量代碼加到/etc/profile文件中? root用戶登錄之后,會自動執(zhí)行/etc/profile文件中的代碼。
2. ?source命令功能: 讓操作系統(tǒng)立即解析指定的文件。 用法: source <文件名稱>
3. ?PATH是什么? 系統(tǒng)的環(huán)境變量(系統(tǒng)的全局變量),功能是保存整個系統(tǒng)的可執(zhí)行文件路徑。
比如在命令行上面寫一個命令: abc 按下回車。
如果想要知道當前的PATH有哪些值? 在命令行上輸出: echo $PATH
4. ?export關(guān)鍵字: 導(dǎo)出---聲明全局變量。
想要讓arm-linux-gcc在任何終端使用: 注銷用戶,再重新登錄。
1.2 編譯UBOOT
源碼位置: \Linux驅(qū)動課程相關(guān)資料\Tiny4412_UBOOT\uboot_tiny4412-sdk1506.tar
1. ?在/work/tiny4412創(chuàng)建一個uboot文件夾。
2. ?將壓縮包拷貝過去,拷貝可以通過虛擬機的共享路徑。
[root@wbyq uboot]# mv /mnt/hgfs/linux-share-dir/uboot_tiny4412-sdk1506.tar ./
3. ?解壓:
[root@wbyq uboot]# tar xvf uboot_tiny4412-sdk1506.tar
4. ?配置uboot進行編譯
[root@wbyq uboot_tiny4412-sdk1506]# make distclean //清除所有的配置文件
[root@wbyq uboot_tiny4412-sdk1506]# make clean //清除緩存和鏈接文件
[root@wbyq uboot_tiny4412-sdk1506]# make tiny4412_config //根據(jù)開發(fā)板配置uboot
[root@wbyq uboot_tiny4412-sdk1506]# make //編譯uboot
編譯成功的在目錄下會生成一個uboot.bin文件。
5. ?燒寫UBOOT
路徑: [root@wbyq tiny4412]# pwd
/work/tiny4412/uboot/uboot_tiny4412-sdk1506/sd_fuse/tiny4412
[root@wbyq tiny4412]# ./sd_fusing.sh /dev/sdb 說明: /dev/sdb是SD卡的設(shè)備節(jié)點。
將uboot燒寫到SD卡上之后,開發(fā)板選擇從SD卡啟動,以下是串口軟件提示的信息:
U-Boot 2010.12 (Nov 26 2018 - 15:35:21) for TINY4412
CPU: S5PC220 [Samsung SOC on SMP Platform Base on ARM CortexA9]
APLL = 1400MHz, MPLL = 800MHz
Board: TINY4412
DRAM: 1023 MiB
vdd_arm: 1.2
vdd_int: 1.0
vdd_mif: 1.1
BL1 version: N/A (TrustZone Enabled BSP)
Checking Boot Mode ... SDMMC
REVISION: 1.1
MMC Device 0: 7386 MB
MMC Device 1: 7456 MB
MMC Device 2: N/A
*** Warning - using default environment
Net: No ethernet found.
Hit any key to stop autoboot: 0
reading kernel..device 0 Start 1057, Count 12288
MMC read: dev # 0, block # 1057, count 12288 ... 12288 blocks read: OK
completed
reading RFS..device 0 Count 13345, Start 8192
MMC read: dev # 0, block # 13345, count 8192 ... 8192 blocks read: OK
completed
Wrong Image Format for bootm command
ERROR: can't get kernel image!
得到信息: 內(nèi)核映像要放在SD卡的第1057個塊。
1.3 編譯內(nèi)核
源碼位置: \光盤資料\Linux\ linux-3.5-20170221.tgz
1. ?在/work/tiny4412/創(chuàng)建一個Linux文件夾
2. ?將源碼包拷貝過去解壓: tar xvf linux-3.5-20170221.tgz
3. ?配置內(nèi)核: [root@wbyq linux-3.5]# cp tiny4412_linux_defconfig .config
4. ?配置源碼: [root@wbyq linux-3.5]# make menuconfig
System Type --->
[ ] Support TrustZone-enabled Trusted Execution Environment (按下空格去掉*號)
再保存退出。
5. ?編譯內(nèi)核: [root@wbyq linux-3.5]# make
6. ?編譯成功之后,內(nèi)核映像放在: arch/arm/boot/zImage
7. ?燒寫內(nèi)核到SD卡: [root@wbyq boot]# dd if=zImage of=/dev/sdb seek=1057
最好在燒寫完畢之后再執(zhí)行一個sync命令。
1.4 制作根文件系統(tǒng)
1. 在/work目錄下創(chuàng)建一個busybox目錄。
2. 將busybox-1.23.2.tar.bz2拷貝到該目錄下解壓。[root@wbyq busybox]# tar xvf busybox-1.23.2.tar.bz2
3. 配置源碼: [root@wbyq busybox-1.23.2]# make menuconfig
(1) 設(shè)置編譯器
Busybox Settings --->
Build Options --->
() Cross Compiler prefix (NEW) 修改之后--- (arm-linux-) Cross Compiler prefix
(2) 設(shè)置編譯之后文件安裝的路徑
Busybox Settings --->
Installation Options ("make install" behavior) --->
(./install) BusyBox installation prefix 修改之后 (/work/rootfs) BusyBox installation prefix
修改之后保存退出。
4. 編譯源碼并將文件拷貝到指定的目錄下
[root@wbyq busybox-1.23.2]# make && make install
成功之后再/work目錄下會生成/rootfs目錄。
1.5 完善根文件系統(tǒng)
在work/rootfs目錄下操作。
1. 完善目錄
[root@wbyq rootfs]# mkdir etc home lib mnt tmp var sys dev proc code work
etc: 存放linux操作系統(tǒng)的配置文件。
lib: 存放linux操作系統(tǒng)的共享庫。
dev: 存放linux操作系統(tǒng)的設(shè)備節(jié)點。
proc: 存放linux操作系統(tǒng)的調(diào)試接口。
2. 完善etc下的配置文件
(1) 將/etc下的fstab文件拷貝到/work/rootfs/etc目錄下
[root@wbyq rootfs]# cp /etc/fstab etc/
(2) 將/etc下的密碼文件和分組文件拷貝到/work/rootfs/etc目錄下
[root@wbyq rootfs]# cp /etc/group etc/
[root@wbyq rootfs]# cp /etc/passwd etc/
拷貝之后,將passwd文件里的/bin/bash全部改成/bin/sh
(3) 拷貝初始化配置文件
將inittab profile rcS 3個文件拷貝到/work/rootfs/etc目錄下。
[root@wbyq etc]# mkdir init.d 再在etc目錄下創(chuàng)建一個目錄。
[root@wbyq etc]# mv rcS init.d/ 將rcS文件移動到該目錄下。
3. 拷貝需要使用的動態(tài)庫
(1) 拷貝必要的動態(tài)庫
[root@wbyq lib]# pwd
/work/arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib
[root@wbyq lib]# cp *.so* /work/rootfs/lib/ -fd //將交叉編譯器的共享庫拷貝到根文件系統(tǒng)lib目錄下
(2) 拷貝擴展的動態(tài)庫
[root@wbyq lib]# pwd
/work/arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/sys-root/usr/lib
[root@wbyq lib]# cp *.so* /work/rootfs/lib/ -fd
1.6 掛載根文件系統(tǒng)
1. 掛載根文件系統(tǒng)的方式介紹: (1) NFS網(wǎng)絡(luò)掛載 (2) 本地掛載
2. NFS如何掛載? NFS是網(wǎng)絡(luò)文件系統(tǒng)。分為NFS服務(wù)器、NFS客戶端。
3. 設(shè)置PC機(紅帽子系統(tǒng)),開啟NFS服務(wù)器。
在紅帽子系統(tǒng)根目錄下創(chuàng)建一個腳本文件xxx.sh
(創(chuàng)建腳本文件: touch xxx.sh),寫入以下代碼: (腳本必須修改權(quán)限 chmod 777 xx.sh )
#!/bin/sh
service nfs restart
service iptables stop
ifconfig eth0 192.168.10.11
4. 永久性關(guān)閉防火墻
[root@wbyq /]# setup
5. 設(shè)置NFS服務(wù)器需要共享出去的目錄
[root@wbyq /]# gedit /etc/exports //打開配置文件,填寫將要共享的目錄
6. 測試共享目錄是否生效
[root@wbyq /]# exportfs -r
[root@wbyq /]# exportfs -v
/work/rootfs
7. 設(shè)置系統(tǒng)的IP地址
8. ?設(shè)置虛擬機的網(wǎng)絡(luò)橋接方式
額外的說明: <查看電腦上網(wǎng)卡的名稱>
9. ?重啟NFS服務(wù)器
運行剛才寫的腳本。
[root@wbyq /]# ./NfsServerStartConfig.sh
關(guān)閉 NFS 守護進程: [確定]
關(guān)閉 NFS mountd: [確定]
關(guān)閉 NFS quotas: [確定]
關(guān)閉 NFS 服務(wù): [確定]
啟動 NFS 服務(wù): [確定]
關(guān)掉 NFS 配額: [確定]
啟動 NFS mountd: [確定]
正在啟動 RPC idmapd: [確定]
正在啟動 RPC idmapd: [確定]
啟動 NFS 守護進程: [確定]
10. ?將開發(fā)板和電腦使用網(wǎng)線連接。
11. ?重啟開發(fā)板,進入到uboot命令行(321的倒計時之前按下回車鍵)。
12. ?軟件的基本配置
13. ?打印開發(fā)板默認的環(huán)境變量
TINY4412 # printenv
baudrate=115200
bootargs=noinitrd root=/dev/nfs nfsroot=192.168.10.106:/root/work/root_nfs ip=192.168.10.123:192.168.10.106:192.168.10.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0 lcd=S702
bootcmd=movi read kernel 0 40008000;movi read rootfs 0 41000000 400000;bootm 40008000 41000000
bootdelay=3
ethaddr=00:40:5c:26:0a:5b
gatewayip=192.168.0.1
ipaddr=192.168.0.20
netmask=255.255.255.0
serverip=192.168.0.10
Environment size: 438/16380 bytes
設(shè)置環(huán)境變量:
TINY4412 # setenv bootargs root=/dev/nfs nfsroot=192.168.10.11:/work/rootfs ip=192.168.10.123:192.168.10.11:192.168.10.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0 lcd=S702
TINY4412 # saveenv //再保存環(huán)境變量
Saving Environment to SMDK bootable device...
Done
TINY4412 # reset //重啟開發(fā)板
掛載成功的效果:
Linux 嵌入式
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應(yīng)法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。