Linux驅(qū)動開發(fā)_搭建嵌入式開發(fā)環(huán)境

      網(wǎng)友投稿 852 2022-05-29

      這篇介紹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 (rw,wdelay,no_root_squash,no_subtree_check)

      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: [確定]

      Linux驅(qū)動開發(fā)_搭建嵌入式開發(fā)環(huán)境

      正在啟動 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)容。

      上一篇:性能分析之性能建模簡述
      下一篇:螞蟻搬家式遷移mysql數(shù)據(jù)庫
      相關(guān)文章
      亚洲午夜久久久影院伊人| 国产亚洲欧美在线观看| 小说专区亚洲春色校园| 亚洲色无码国产精品网站可下载| 亚洲AV无码乱码在线观看代蜜桃| 18gay台湾男同亚洲男同| 亚洲成在人天堂在线| 亚洲色四在线视频观看| 亚洲av无码片在线播放| 久久亚洲AV午夜福利精品一区 | 久久亚洲国产成人影院| 亚洲永久在线观看| 中文字幕亚洲精品无码| 亚洲欧美日韩一区二区三区在线| 亚洲а∨天堂久久精品9966| 久久精品国产亚洲av麻豆小说| 亚洲成a人片在线观看中文动漫| 亚洲久本草在线中文字幕| 亚洲免费视频在线观看| 亚洲美女视频一区| 激情亚洲一区国产精品| 亚洲人成电影在线天堂| 亚洲国产美国国产综合一区二区 | 欧洲亚洲综合一区二区三区| 色偷偷尼玛图亚洲综合| 亚洲精品动漫人成3d在线| 亚洲色图综合在线| 国产亚洲免费的视频看| 亚洲丝袜美腿视频| 亚洲喷奶水中文字幕电影| 在线a亚洲老鸭窝天堂av高清| 亚洲国产成人综合精品| 亚洲av无码成人精品区| 国产精品亚洲综合一区| 亚洲AV无码国产精品麻豆天美 | 国产成人+综合亚洲+天堂| 中文字幕亚洲图片| 亚洲天堂视频在线观看| 亚洲制服丝袜在线播放| 性色av极品无码专区亚洲| 亚洲线精品一区二区三区影音先锋|