導航:首頁 > 編程系統 > linuxgpioecho

linuxgpioecho

發布時間:2024-10-15 03:09:39

⑴ 求助一個Debian linux 下開機自動啟動腳本無法進入系統的問題,謝謝!

問題一:把它放到init.d目錄里,然後設置為服務就會自啟動。
問題二:用c語言寫一個中斷常式,加入到shell腳本中就可以了。shell是不能有中斷編程的。

⑵ 如何在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需要在內核配置里打開支持,這個網上的資料太多了,我就不說在哪裡了。

⑶ 如何在Linux系統中直接操作GPIO

方法/步驟

1
安裝SD Linux系統

如圖所示,先後將Arino Software 1.5.3 (Arino IDE)和SD-Card Linux Image下載到本機,Arino IDE在後面查找GPIO與Arino IO 之間的映射關系時需要用到。

如圖所示,將SDCard1.0.4.tar.bz2解壓後出現一個「image-full-galileo」的文件夾。

在MicroSD使用前需先將其以Fat32進行格式化,然後將「image-full-galileo」文件夾下地所有文件直接拷貝到microSD卡的根目錄下。

進入Galileo
將MicroSD插到Galileo中,在路由器頁面的已連接設備列表中會看到設備名稱為「clanton」有線連接設備,找到其IP地址,然後中
Terminal(Unix和Linux,Windows可用Putty)中通過ssh進入Galileo,「ssh
[email protected]」。

有意思的是,這個在MicroSD中運行的Linux系統開啟了ssh服務,並且root賬號沒有設置密碼,可以直接進入。如上圖所示,彈出一對話框後輸入 「yes」回車即可進入Galileo,出現下圖中的 「root@clanton」說明這一步成功完成了

到這里,可能會有疑問了,Galileo板載也是有一個操作系統的,microSD卡中也有一個Linux,如何保證現在進入的就是microSD卡中的系
統呢?在Terminal中輸入「cat/proc/version」即可查看Linux系統版本,顯示為「3.8.7-yocto-standard」,這就是前面下載的為Galileo定製的Linux操作系統,Yocto。

找到那個屬於你的GPIO
下面就要開始這篇文章中的核心部分,也是最難的一部。找Linux GPIO 與 Arino IO之間的映射關系!

如右圖所示,在「/sys/class/gpio/」中有多大60多個GPIO,如何找出右側GPIO與左側Arino IDE中對應的IO呢。
首先將0-13IO口全部設為「INPUT」輸入模式
voidsetup(){//putyoursetupcodehere,torunonce:
pinMode(0,INPUT); pinMode(1,INPUT); pinMode(2,INPUT); pinMode(3,INPUT);
pinMode(4,INPUT); pinMode(5,INPUT); pinMode(6,INPUT); pinMode(7,INPUT);
pinMode(8,INPUT); pinMode(9,INPUT); pinMode(10,INPUT);
pinMode(11,INPUT); pinMode(12,INPUT); pinMode(13,INPUT); } voidloop(){
//putyourmaincodehere,torunrepeatedly: }

如圖所示,左側"pinMode(13,OUTPUT)"將13引腳變為輸出模式,右側gpio7變成out模式,因此gpio7對應的就是Arino IO 13(pin13)

按照這種方法依次找出Arino IO與GPIO之間如下的對應關系
GPIODigitalI/Ogpio11pin0
gpio12pin1 gpio13pin2 gpio14pin3 gpio6pin4 gpio0pin5 gpio1pin6
gpio38pin7 gpio40pin8 gpio4pin9 gpio10pin10 gpio5pin11 gpio15pin12
gpio7pin13
下面就需要來對上面找到的gpio對應關系進行驗證了。「echo "out"
>/sys/class/gpio/gpio*/direction」為將gpio變為輸出模式,「echo "1"
>/sys/class/gpio/gpio*/value」為將gpio輸出高電平。然後就有了下面這段python程序,這段程序依次將
pin13,pin12,pin11,pin10四個引腳的LED點亮然後關閉,但由於python程序的執行效率問題,應該所有LED同時點亮有了延時
成為流水燈,如下圖所示效果。這段程序在Linux系統的任意文件夾內均可。
importos,timewhileTrue:os.system('echo"out">/sys/class/gpio/gpio7/direction')
os.system('echo"1">/sys/class/gpio/gpio7/value')
os.system('echo"out">/sys/class/gpio/gpio15/direction')
os.system('echo"1">/sys/class/gpio/gpio15/value')
os.system('echo"out">/sys/class/gpio/gpio5/direction')
os.system('echo"1">/sys/class/gpio/gpio5/value')
os.system('echo"out">/sys/class/gpio/gpio10/direction')
os.system('echo"1">/sys/class/gpio/gpio10/value') time.sleep(0.2)
os.system('echo"0">/sys/class/gpio/gpio5/value')
os.system('echo"0">/sys/class/gpio/gpio15/value')
os.system('echo"0">/sys/class/gpio/gpio7/value')
os.system('echo"0">/sys/class/gpio/gpio10/value') time.sleep(0.2)

閱讀全文

與linuxgpioecho相關的資料

熱點內容
dnf國慶版本2017活動 瀏覽:157
UG中編程完畢後處理選擇哪個 瀏覽:534
bat排除文件夾 瀏覽:81
金屬銻是什麼意思網路用語 瀏覽:887
解密壓縮文件軟體 瀏覽:167
qq空間電影視頻播放器 瀏覽:567
數據預測有哪些演算法 瀏覽:176
qt如何讀取地址數據 瀏覽:383
工業控制網路大體分為哪些層面 瀏覽:688
linuxmake日誌 瀏覽:705
文件覆蓋了怎麼找回 瀏覽:567
創建時間命名的文件 瀏覽:133
tcp設置網路阻塞 瀏覽:165
聚力vip帳號及密碼 瀏覽:703
谷歌是用哪些編程語言寫的 瀏覽:105
誤刪win10文件怎麼恢復 瀏覽:277
質量文件檢查情況共審查多少項 瀏覽:57
qq群里的文件怎麼填寫 瀏覽:598
安卓查看gpu頻率 瀏覽:438
做程序員能致富嗎 瀏覽:28

友情鏈接