導航:首頁 > 編程系統 > armlinux掛載sd卡

armlinux掛載sd卡

發布時間:2021-10-25 16:40:25

A. linux的BusyBox嵌入式系統終端設備,SD卡(32G)無法掛載問題

你可以考慮把它格式化試試,按提示的意思是不識別fat這種文件你可以考慮把它格式化試試,按提示的意思是不識別fat這種文件格式
格式

B. 嵌入式linux編程問題求助!編譯一種程序,能把SD卡上的內容復制到mini2440開發板中

掛載sd卡
然後拷貝

C. uboot201407如何查看從哪啟動SD卡還是EMMC

Arm板系統文件一般有三個——bootloader(uboot)、kernel(uImage)及根文件系統(rootfs)。在arm板上電後,按uboot->kernel->rootfs的順序依次啟動。由於開發板上有多種存儲介質,三個文件可以放在任何可以存儲的介質上,因此也就導致文件的多種啟動方式。本文就來討論,以上三個文件對應不通存放位置的不同啟動配置。
一般開發板上會有flash(Nor or NAND),mmc,emmc,sd卡等。系統文件可以燒寫在其中的任意一種上,因此也就對應不通的啟動。在開發過程中,有時經常需要改動內核,或者修改應用程序,如果每次都修改後都重新燒寫到板上的存儲介質,會比較麻煩。因此,為方便調試,uImage和rootfs還可以從網路啟動,即nfs啟動。但uboot只能從板上介質啟動。
啟動過程其實是先將要啟動的文件從存儲位置拷貝到內存空間,再在內存中運行。因此所謂不同位置啟動,也就是從不同位置拷貝而已。
下面我們以開發板啟動為例,分別介紹三個文件從不同位置啟動的過程方法。我使用的開發板上有emmc和兩個sd卡。我們按照啟動順序,依次介紹。
首先是uboot啟動。Uboot是三個系統文件中第一個啟動的,對它的拷貝工作由cpu中的固件決定。固件中支持從幾個位置拷貝uboot,它就能存放在幾個位置上。至於每次啟動具體從其中的哪裡開始,硬體撥碼開關決定,對應撥碼在開發板手冊上能查到。啟動之前,先將uboot的二進制文件拷貝到對應介質。有兩種不同方法燒寫,如下:
1. uboot二進制文件拷貝到emmc,是通過晶元供應商的下載工具軟體燒寫完成;
2. 拷貝到sd卡是在linux下,通過dd命令完成的。
燒寫完成後,將啟動撥碼撥到對應位置即可啟動uboot。
然後介紹kernel文件(uImange)和rootfs的啟動。如上所述,uImage和rootfs可以從emmc、sd卡或nfs拷貝到內核啟動。具體的啟動位置由uboot中的參數傳遞的內容決定。這些參數的內容在uboot中有寫死的值,也可以在uboot啟動階段進入到命令輸入界面,修改這些參數的值,來改變啟動位置。(作者:圍補)
進入uboot命令界面後,輸入如下一段命令,修改啟動參數,並重啟。
setenv loadaddr 0x10800000

setenv bootargs_base 'setenv bootargsconsole=ttymxc0,115200'

setenv bootargs_mmc 'setenv bootargs${bootargs} root=/dev/mmcblk0p1 rootwait rw video=mxcfb1:dev=ldb,LDB-XGA,if=RGB666video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24 ip=dhcp'

setenv bootcmd_mmc 'run bootargs_basebootargs_mmc;mmc dev 1;mmc read ${loadaddr} 0x800 0x2000;bootm'

setenv bootcmd 'run bootcmd_mmc'

saveenv

run bootcmd
命令輸入完後,重啟開發板,即可按照上述命令中設置的參數來啟動系統。
下面我們來分析一下uboot階段輸入的啟動參數的意義,以便讀者自己修改相關內容,讓板子從自己需要的位置啟動。
首先介紹幾個命令。是在上面看到最多的setenv命令,該命令使用來設置或刪除某個環境變數的。當setenv後面只帶一個參數,該參數必須為已有的變數名,輸入命令回車後該變數即被刪除;當setenv後面有多個參數,將把其後第一個參數作為環境變數,後面其他參數作為該變數的值或內容。
第二個要解釋的命令mmc。在uboot命令界面中敲入mmc,回車,能夠看到其多個用法:
Usage:
mmc read addr blk# cnt
mmc write addr blk# cnt
mmc erase blk# cnt
mmc rescan
mmc part - lists available partition on currentmmc device
mmc dev [dev] [part] - show or set current mmcdevice [partition]
mmc bootpart [dev] [part] - show or set bootpartition
mmc list - lists available devices
解釋一下其中幾個用法:
mmc read addr blk# cnt 用來將硬碟(emmc/sd)中的內容讀取到內存中。其中addr指內存中的目標位置起始地址,blk#指被拷貝內容起始存儲塊的塊號,cnt指要被拷貝的塊數。一般每個塊的大小為512byte。
mmc dev [dev] [part] - show or set current mmc device [partition] 顯示或設置當前設備。命令mmc dev即為顯示當前是哪個device;mmc dev #意為設置「#」為當前設備。
第三個命令saveenv是保存環境變數的意思。環境變數設置後,使用該指令保存,下次重啟時會按照上次保存的設置啟動,就不用再次設置了。
最後,run命令比較明顯,「運行」的意思。一般加在某內容為可執行命令的變數前。
再來說明一下變數。在上述參數設置命令中,參數bootargs和bootcmd是uboot的參數,其功能和名稱不能被改變,其他都是用戶自定義的變數,可以改變其名稱。其中bootargs代表由uboot傳給內核的參數;bootcmd是uboot啟動時,系統自動載入的命令序列。如果設置了啟動參數後,想讓系統下次自動按照本次設置的方式啟動,則一定要把拷貝和啟動內核的語句設置為bootcmd的值,否則下次啟動無法自動載入並啟動內核。(作者圍補)
介紹完重要的命令及uboot環境變數後,我們再來看上面的啟動參數設置命令行:
setenv loadaddr 0x10800000

setenv bootargs_base 'setenv bootargsconsole=ttymxc0,115200'

setenv bootargs_mmc 'setenv bootargs${bootargs} root=/dev/mmcblk0p1 rootwait rwvideo=mxcfb1:dev=ldb,LDB-XGA,if=RGB666video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24 ip=dhcp'

setenv bootcmd_mmc 'run bootargs_basebootargs_mmc;mmc dev 1;mmc read ${loadaddr} 0x800 0x2000;bootm'

setenv bootcmd 'run bootcmd_mmc'

saveenv

run bootcmd
按照上面對命令和參數的講解,做一些變數的替換之後,可以看到,此處只做了兩件事,一是設置環境變數bootargs的值,二是設置bootcmd的值,並保存。其中bootargs的值傳遞給內核,用來初始化一些設備和啟動rootfs;bootcmd的值用來啟動內核,即自動載入的命令序列。(最後一句run bootcmd是啟動,不再是設置命令了。)
對上述命令中,採用如此多自定義變數的原因是,有些調試工具命令行輸入不能過長,因此用中間自定義變數縮短一次性輸入的命令行長度。我們將不必要的自定義變數做替換掉,然後來分析其內容。
setenv bootargs console=ttymxc0,115200root=/dev/mmcblk0p1 rootwait rw video=mxcfb1:dev=ldb,LDB-XGA,if=RGB666 video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24ip=dhcp

setenv bootcmd 'mmc dev 1;mmc read0x10800000 0x800 0x2000;bootm'

saveenv

run bootcmd
將自定義變數替代掉後,能看到,參數設置其實就是做了對兩個系統環境變數賦值的工作。下面具體分析各變數值得內容。
對bootargs的賦值,對要是跟rootfs啟動相關。內容是一個很大的字元串,不同項之間由空格隔開,也可以把由空格隔開的多項看做是多個參數。
第一項是console=ttymxc0,115200是選擇操作台,並設置波特率。
中間幾項root=/dev/mmcblk0p1 rootwait rw,是對rootfs啟動位置設置root=/dev/mmcblk0p1是指從設備mmcblk0的p1分區掛載rootfs。那麼mmcblk0到底是哪個設備呢?由於文件系統的掛載是在kernel啟動後進行的,而內核啟動後會安裝linux的分配方式給現有設備分配名稱,因此可對應區分設備。我使用的開發板上,emmc即為mmcblk0設備,sd安裝掛載順序依次後排。如果多個卡槽在系統啟動前都插上了sd卡,系統會安裝sd卡槽所在介面號依次分配設備名稱號。比如,兩個sd卡槽,slot2和slot3(對應匯流排號),只插一個sd開始,無論在哪個槽都是mmcblk1;但兩個都插上sd時,在slot2中的是mmcblk1,slot3中的則是mmcblk2。Ok,至此,從哪個設備掛載rootfs已經很清楚了。後面兩個參數,rw是聲明啟動許可權,即以讀寫方式啟動;rootwait是指等待設備/dev/mmcblk0p1設備就緒後才嘗試掛載rootfs。如果沒有此參數,linux內核啟動時可能會在存儲設備尚未就緒是就嘗試掛載rootfs,此時肯定掛載失敗,那麼啟動也就失敗了。
最後的幾個參數,video=mxcfb1:dev=ldb,LDB-XGA,if=RGB666video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24 ip=dhcp,是做一些設備初始化的,主要是對視頻設備和網路,對不需要視頻設備的嵌入式系統可以不設置此項,ip也可以單獨設置。
然後是第二個環境變數bootcmd的設置,主要跟kernel啟動相關。
setenv bootcmd 'mmc dev 1;mmc read0x10800000 0x800 0x2000;bootm'
設置bootcmd內容為命令序列,用用單引號包圍,命令間由分號分隔。
按照上面對mmc命令的講解,第一個命令mmc dev 1,意思是將dev 1設置為當前設備。這里就是uImage啟動(拷貝)的位置。在我使用的開發板上,dev 1指放在卡槽slot2中的sd卡。此處由於linux內核沒有啟動,設備名稱不能按照linux分配方式確定。在我使用的開發板上,dev 2是放在卡槽slot3中的sd卡,dev3是emmc。對此句做相應修改,即可更改內核啟動位置。
mmc read 0x10800000 0x800 0x2000這句大家也應該可以明白意思了,即將存儲設備上從塊號0x800開始的0x2000個存儲塊的東西拷貝到內存0x10800000開始的空間內。
bootm也是uboot命令,用於載入uboot能辨認的操作系統映像。

D. 關於嵌入式Linux 插入SD卡的問題

貌似以前我也有遇到過SD卡不能掛載的問題,不過我是換了個SD卡就解決了,我的開發版弄不了我的SD卡,我的SD卡反而能在朋友的開發板上掛載讀取。迷亂了!

E. 如何在ARM Linux上使用FDT和initrd

這文章算是最近工作的備忘。
FDT是ARM
Linux最新的設備驅動程序信息表,使用FDT的內核,就不用像過去的內核那樣,一個板子加一個mach的C文件,所有的設備信息可以記錄在一個樹狀信息文件裡面。

目前這方面資料比較少,我以AM335x處理器為例概括一下FDT的使用:

FDT僅僅是一個信息的目錄和參數表,要使用某個功能內核中還必須有相應的驅動程序代碼
FDT的源文件位置在:arch/arm/boot/dts,例如,TI的Beagle bone black,源文件是arch/arm/boot/dts/am335x_boneblack.dts
FDT在make ARCH=arm的時候就會自動生成,也可用make ARCH=arm
dtbs來生成,例如TI的Beagle bone black生成的文件是arch/arm/boot/dts/am335x_boneblack.dtb,這是一個二進制文件
要想新增你自定義的FDT,請修改arch/arm/boot/dts/Makefile,並在相應的Kconfig中增加config選項,例如,TI的Beagle
bone black,Kconfig的位置在arch/arm/mach-omap2/Kconfig
FDT的dtb文件由u-boot傳遞給內核,u-boot必須把這個文件拷貝到內核解壓地址之後的某個位置,確保內核解壓的時候不會覆蓋,然後使用「bootm
[內核地址] - [dtb地址]」來啟動內核
如果dtb文件不正確,對於3.10以上的內核,可能什麼顯示都沒有,3.8內核,可能就顯示到Uncompressing kernel......done
FDT的編寫規則說明在Documentation/devicetree/bindings,不同的設備有相應的txt文件說明,其中的「compatible」可以作為關鍵字搜索驅動程序的源文件,例如,AM335x的GPIO,用「ti,omap4-gpio」為關鍵字,可以找到其代碼位於drivers/gpio/gpio-omap.c
FDT可以包含子文件,比如am335x_boneblack.dts就包含了am33xx.dtsi,am335x-bone-common.dtsi

以一個例子來說明編寫規則,我的板子上,I2C0上掛了一個音頻CODEC,其地址是0x18,型號是TLV320AIC3104IRHBT。

先找到i2c0節點的位置,這在arch/arm/boot/dts/am33xx.dtsi中:
i2c0: i2c@44e0b000
{
compatible =
"ti,omap4-i2c";
#address-cells =
<1>;
#size-cells =
<0>;
ti,hwmods =
"i2c1";
reg = <0x44e0b000
0x1000>;
interrupts =
<70>;
status =
"disabled";
};

要在這個節點上掛東西,可以直接在am33xx.dtsi中掛,可以寫成這樣:

i2c0: i2c@44e0b000
{
compatible =
"ti,omap4-i2c";
#address-cells =
<1>;
#size-cells =
<0>;
ti,hwmods =
"i2c1";
reg = <0x44e0b000
0x1000>;
interrupts =
<70>;
status =
"okay";

tlv320aic3x: tlv320aic3x@18 {

compatible = "ti,tlv320aic3x";

reg = <0x18>;

status = "okay";

AVDD-supply = <&ldo4_reg>;

IOVDD-supply = <&ldo4_reg>;

DRVDD-supply = <&ldo4_reg>;

DVDD-supply = <&ldo4_reg>;

};
};

其中compatible字串「ti,tlv320aic3x」是在Documentation/devicetree/bindings裡面全文搜索「tlv320aic」獲得的,「tlv320aic3x:
tlv320aic3x@18」遵循的是「標識符:名稱@地址」的格式,前面的「i2c0:
i2c@44e0b000」也是這個格式。這里的標識符可以在包含這個文件的文件或這個文件的其他位置引用,因此,可以使用arch/arm/boot/dts/am335x-boneblack.dts包含arch/arm/boot/dts/am33xx.dtsi,然後在am335x-boneblack.dts里寫:

&i2c0 {

status = "okay";

tlv320aic3x: tlv320aic3x@18 {

compatible = "ti,tlv320aic3x";

reg = <0x18>;

status = "okay";

AVDD-supply = <&ldo4_reg>;

IOVDD-supply = <&ldo4_reg>;

DRVDD-supply = <&ldo4_reg>;

DVDD-supply = <&ldo4_reg>;

};

};

&i2c0表示引用了i2c0這個標識符,然後把括弧里的內容掛載到標識符下,如果屬性的名字相同,例如status出現兩次,前面是「disabled」後面是「okay」,以後面的為准,引用標識符的次數不受限制。

也許一開始會覺得FDT的工作過程很神秘,但你只要用compatible的字串去全文搜索一下C文件,然後仔細閱讀一下,就會發現很簡單,沒過幾分鍾你就可以自定義FDT節點的屬性了。反倒是這些操作過程我沒找到什麼文檔說,比較頭痛,所以我把這些寫出來,希望能給大家幫助。

下面說說initrd,initrd的用處是給內核一個初始的基本文件系統,用來載入內核模塊之類的東西。很多人覺得嵌入式系統不需要initrd,也可以把initrd作為最終的根文件系統。我用initrd是用來校驗真正的根文件系統,因為在嵌入式設備上,無法預測用戶到底什麼時候關機,可能會造成文件系統問題。

initrd可以用buildroot,像製作正常文件系統一樣做,最後把根下的linuxrc換成一個例如下面這樣的文件:

#!/bin/sh

/bin/echo Now Check SD Card

/sbin/fsck.ext4 /dev/mmcblk0p5

雖然Documentation/initrd.txt裡面說,內核會執行initrd裡面的/sbin/init,但在我用的linux-3.8.13上,init/do_mounts_initrd.c裡面,執行的是/linuxrc,不知道是不是文檔沒有更新過來。具體的調用順序是,kernel_init(init/main.c)
> kernel_init_freeable(init/main.c)
> prepare_namespace(init/do_mounts.c)
> initrd_load(init/do_mounts_initrd.c) > handle_initrd
(init/do_mounts_initrd.c)。

在使用initrd的時候有幾點需要注意的:

不建議在initrd上掛載別的東西,會引起未知的問題,貌似看到個文章說這個,找不到了
因為上面的這條,而且在initrd的時候,內核還沒有掛載devtmpfs,因此建議使用靜態設備節點,以AM335x為例(內核參數console=/dev/ttyO0,115200n8),必須的節點有:

/dev/null

/dev/console

/dev/ttyO0

這些節點可以用fakeroot之後mknod在buildroot的output/target/dev里創建,除了/dev/console,buildroot會自己創建,其他也可以寫到buildroot的system/device_table.txt裡面讓buildroot自動創建:

#

/dev/null
c 666 0 0
1 3
-
-
-

/dev/ttyO0 c 600
0 0 250
0
-
-
-

如果你用的是Atmel的處理器,上面的ttyO0可能是ttyS0,如果是三星的,可能是ttySAC0,而且major和minor也會不一樣,請自行解決。如果你像我一樣要檢驗SD卡,那就還必須加上SD卡的分區對應的節點。

/linuxrc可以是個程序也可以是個腳本,腳本的話,命令寫絕對路徑,而且記得把/linuxrc的mode改為755

使用initrd只需要用u-boot把buildroot製作的文件系統映像拷貝到內存里,然後傳遞initrd=[地址],[容量]這樣的參數給內核,例如initrd=0x81300000,8M,最終的root參數可以不變,例如root=/dev/mmcblk0p5,這表示最終的root是SD卡上擴展分區中的第一個邏輯分區。給兩個內核參數的例子:

console=ttyO0,115200n8 root=/dev/mmcblk0p5 initrd=0x81300000,8M vram=16M
consoleblank=0
console=ttyO0,115200n8 initrd=0x81300000,8M root=/dev/nfs rw
nfsroot=192.168.5.226:/home/c/nfsroot
ip=192.168.5.222:192.168.5.226:192.168.5.1:255.255.255.0:core335x:eth0:off
vram=16M consoleblank=0

第一個不解釋了,第二個表示使用initrd,同時使用nfsroot。

最後啰嗦一句,使用initrd需要在內核配置里打開支持,這個網上的資料太多了,我就不說在哪裡了。

F. Linux dd指令燒錄U-boot到SD卡但沒有成功

通過dd命令製作鏡像, 是看不到寫入的鏡像文件的。
能夠看到的,是鏡像文件裡麵包含的內容。

G. 做ARM嵌入式開發在Linux環境下怎麼建立開發環境 另: 最常用的開發軟體有哪些最好附上下載地址! 謝謝

串口線,網線,ok!當然還有其它方法,首先將u-boot燒寫到nandflash,或sd卡中,讓uboot啟動起回來,起來之後就好辦了答,就可以通過網線與開發板建立連接,用tftp可以上傳文件和程序,而且可以使用nfs服務掛載電腦上的文件系統,通過串口控制開發版,並且返回信息。

H. arm linux, init=/init 出問題 是 kernel 還是文件系統

init 其實是個程序。當然 bash shell 腳本可以運行也算程序。
程序都是存儲為文件,文件必然存在於文件系統。

你這個問題我覺得還是內核的問題,驅動導致沒有正確掛在 rootfs 。
是不是這個原因要看前面的錯誤信息。

I. 如何在一張SD卡上構建一個嵌入式Linux系統,有最基本功能即可。

貌似以前我也有遇到過sd卡不能掛載的問題,不過我是換了個sd卡就解決了,我的開發版弄不了我的sd卡,我的sd卡反而能在朋友的開發板上掛載讀取。迷亂了!

J. ARM開發板上,如果SD卡可以掛載上,是不是就代表驅動寫好了。

linux提示掛載成功,那就是證明已經載入了正確的驅動了!

閱讀全文

與armlinux掛載sd卡相關的資料

熱點內容
聯想g450主板升級 瀏覽:52
閣樓偷窺像他母親的女人電影 瀏覽:315
伊麗莎白德比茨基露點電影 瀏覽:374
點淘app廣告美女叫什麼 瀏覽:173
大學物理教程下冊 瀏覽:164
linux與uclinux 瀏覽:627
楊凌的美妻嬌綠帽篇 瀏覽:825
韓國日本電影在線 瀏覽:496
海綿寶寶劇場版有幾部 瀏覽:821
電影前度2 瀏覽:121
免費高清看電視的網站 瀏覽:906
html5開發工具有那些 瀏覽:27
(中文字幕)NSFS-411 露 瀏覽:165
蒙氏學五子棋視頻教程 瀏覽:293
你想看的電影網 瀏覽:350
編程貓作品播放出現問題怎麼辦 瀏覽:617
法國啄木鳥在哪裡可以看 瀏覽:146
最狂野的夢想電影英語觀後感120字 瀏覽:452
征途文件里哪個是背包文件 瀏覽:545
補習女老師電影韓國 瀏覽:495

友情鏈接