❶ 嵌入式開發培訓都有哪些內容
職業專家介紹,目前培養嵌入式人才的主要通過兩種途徑:一種是高校開設嵌入式專業課程,另一種是通過專業的嵌入式培訓機構培養企業所需的人才。本課程是為了適應目前發展迅速的嵌入式linux需求而設計,課程目標是讓學員達到適應嵌入式應用軟體開發、嵌入式系統開發或嵌入式驅動開發的基本素質。課程循序漸進的帶領你進入嵌入式開發的世界,採用了目前應用最廣泛的軟硬體開發平台(Linux和Arm),可以保證你盡量貼近目前企業的需求。 嵌入式培訓課程內容: 第一階段:嵌入式C高級編程 1.嵌入式C語言高級編程 2.嵌入式C語言經典數據結構及演算法編程 3.項目實戰(一)《lrc歌詞解析器》 在嵌入式領域中大部分開發都會用到C語言。C語言簡潔、緊湊、使用方便靈活加上GNU在實際項目開發中所做的擴展,使得C語言在整個嵌入式開發過程中起著至關重要的作用。更重要的是用C語言開發的程序在嵌入式平台下可移植性比較強。一個精通C語言程序設計的程序員,可以很容易地從事Linux、WinCE、Vxworks、μc/os等嵌入式操作系統下的軟體開發工作。本階段學習目標是掌握C語言基本知識、鞏固C編程語法基礎,以及深入C語言高級編程和數據結構與演算法,為將來的程序設計工作打下堅實的基礎。 第二階段:Linux應用及系統編程 1.Linux操作系統應用開發 2.嵌入式Linux高級系統編程 3.嵌入式資料庫--SQLite 4.項目實戰(二)《Mplayer播放器》 5.Linux網路編程 6.項目實戰(三)《基於Linux的信息交換系統》 7.C++及基於QT的GUI開發 8.項目實戰(四)《網路游戲對戰平台》 嵌入式Linux應用開發和系統開發是嵌入式Linux中非常重要的一部分,也是企業人才需求最廣的一部分。本階段學習的主要目標是精通嵌入式Linux下的應用程序設計,熟練掌握嵌入式Linux的開發環境、常用Linux命令,精通Linux系統編程、網路編程、QT GUI編開發,熟練掌握整個嵌入式Linux項目開發流程,提升學員對Linux應用開發的能力。 第三階段:嵌入式Linux平台開發 1.ARM體系結構 原理分析及其移植 2.ARM處理器編程 原理分析及其移植 3.基於ARM裸機驅動開發 原理分析及其移植 4.嵌入式Bootloader 原理分析及其移植 5.自製嵌入式系統啟動代碼 (Bootloader) 6.嵌入式Linux內核工作原理 分析及其移植 7.Linux內核調試技術 8.嵌入式Linux根文件系統 組成分析及其製作 8.嵌入式Linux開源工程 源碼分析及其編程 9.項目實戰(五) 《Web應用開發技術》 本階段將使學員掌握從零開始搭建嵌入式Linux運行環境。首先通過基於ARM Cortex-A8處理器S5pv210了解晶元手冊的基本閱讀技巧,掌握S5pv210系統資源、時鍾控制器、電源管理、異常中斷控制器、nand flash控制器等模塊,為底層平台搭建做好准備。Linux平台包括內核裁減、內核移植、交叉編譯、GNU工具使用、內核調試、Bootloader介紹、製作與原理分析、根文件系統製作以及向內核中添加自己的模塊,並在s5pv210實驗平台上運行自己製作的Linux系統,集成部署Linux系統整個流程。同時了解Android操作系統開發流程。Android系統是基於Linux平台的開源操作系統,該平台由操作系統、中間件、用戶界面和應用軟體組成,是首個為移動終端打造的真正開放和完整的移動軟體,目前它的應用不再局限於移動終端,還包括數據電視、機頂盒、PDA等消費類電子產品。 第四階段:嵌入式微處理器及Linux設備驅動開發 1.ARM硬體介面原理 2.嵌入式Linux設備驅動開發 3.嵌入式Linux高級驅動程序設計 4.項目實戰(六) 《重力感應實戰系統》 驅動程序設計是嵌入式Linux開發工作中重要的一部分,也是比較困難的一部分。本階段課程讓學員熟悉Linux的內核機制、驅動程序與用戶級應用程序的介面,掌握系統對設備的並發操作。熟悉所開發硬體的工作原理,具備ARM硬體介面的基礎知識,熟悉ARM Cortex-A8處理器s5pv210各資源、掌握Linux設備驅動原理框架,熟悉工程中常見Linux高級字元設備、塊設備、網路設備、USB設備等驅動開發,在工作中能獨立勝任底層驅動開發。 相關標簽:嵌入式培訓、嵌入式學習、北京嵌入式培訓
❷ 嵌入式開發要學什麼嵌入式開發要學哪些東西
學習嵌入式開發分兩種,像STM32、飛思卡爾等系列單片機屬於無操作系統的,直接對寄存器或者利用庫函數操作的,這種學習來難度相對小一些,就業前景也不錯。
還有一些像ARM9,或者CortexA8、A9系列的可以運行Linux或者安卓操作系統的嵌入式軟體系統開發,由於需要學習的內容較多,學習時間較長,那麼學習起來就有一定的難度,工資也相對高一些。
課程內容主要包括:
①C,Java核心編程:c語言核心編程,Java核心編程;
②Linux核心操作與演算法:Linux系統使用,Linux-c編程核心技術,精品數據結構,Linux-c編程精髓;
③核心操作與演算法:Linux系統編程,Linux網路編程核心技術,UI編程,Java核心編程,安卓核心技術;
④ARM+Linux底層開發:數字電路,ARM編程核心,Linux系統開發,嵌入式Linux驅動開發;
⑤大型項目實踐:每期安排各類型真實的項目,詳細可以找我要資料。
互聯網行業目前還是最熱門的行業之一,學習IT技能之後足夠優秀是有機會進入騰訊、阿里、網易等互聯網大廠高薪就業的,發展前景非常好,普通人也可以學習。
想要系統學習,你可以考察對比一下開設有相關專業的熱門學校,好的學校擁有根據當下企業需求自主研發課程的能力,能夠在校期間取得大專或本科學歷,中博軟體學院、南京課工場、南京北大青鳥等開設相關專業的學校都是不錯的,建議實地考察對比一下。
祝你學有所成,望採納。
❸ 在linux上怎樣增加一個i2c設備
假設手上有一塊從淘寶上買來的開發板,我要在開發板的I2C匯流排上增加一個從設備(如at24c08),那麼我要怎樣寫這個「I2C設備驅動」,讓
應用程序可以訪問at24c08呢?
先來看一個最簡單的i2c設備驅動:
static struct i2c_board_info at24cxx_info = { //所支持的i2c設備的列表
I2C_BOARD_INFO("at24c08", 0x50), //一項代表一個支持的設備,它的名字叫做「at24c08」,器件地址是0x50
};
static struct i2c_client *at24cxx_client;
static int at24cxx_dev_init(void)
{
struct i2c_adapter *i2c_adap; //分配一個適配器的指針
i2c_adap = i2c_get_adapter(0); //調用core層的函數,獲得一個i2c匯流排。這里我們已經知道新增的器件掛接在編號為0的i2c匯流排上
at24cxx_client = i2c_new_device(i2c_adap, &at24cxx_info); // 把i2c適配器和新增的I2C器件關聯起來,這個用了i2c匯流排0,地址是0x50。這就組成了一個客戶端
at24cxx_client i2c_put_adapter(i2c_adap);
return 0;
}
static void at24cxx_dev_exit(void)
{
i2c_unregister_device(at24cxx_client);
}
mole_init(at24cxx_dev_init);
mole_exit(at24cxx_dev_exit);
從上面的程序可以看到,寫一個i2c設備驅動程序,與寫普通的字元驅動基本一樣。特別之處是它調用了i2c的core層的函數,以獲得對i2c匯流排的控制。因為用的是開發板,板上的與soc晶元(一般來說就是arm的晶元)i2c匯流排驅動一般都做好了,直接調用core層的函數就可以控制soc的i2c模塊了。也就是說,寫i2c設備驅動不需要關注arm內部的i2c模塊的寄存器,我們需要關注的是設備(at24c08)的寄存器以及它的datasheet對時序的要求。
其實,添加i2c設備的方法很靈活。根據Linux的官方文檔《linux-3.4.2\Documentation\i2c\instantiating-devices》,添加i2c設備的方法總結有4種:
1. i2c_register_board_info:根據匯流排編號、設備名字(「at24c08」)、設備地址(0x50)注冊一個字元驅動。這種方法最簡單、最粗暴,最貼近平時在開片機上開發i2c器件的。
2. i2c_new_device:根據i2c匯流排的編號,聲明一個i2c設備:這種方法就是上面例子用的方法。這種方法也簡單,但是需要事先知道器件掛接在哪條匯流排上。對於設備,還實現知道了設備地址0x50,匯流排適配器也支持名字為「at24c08」的設備
3. i2c_new_probed_device:
4.從用戶空間實例化一個器件:這個方法相當智能快速,如下輸入指令,即可增加一個i2c設備,同時增加了對應的設備文件。
# echo eeprom 0x50 > /sys/bus/i2c/devices/i2c-3/new_device
根據英文文檔的標題,添加i2c設備有稱之為「i2c設備的實例化」。
從上述可以知道,在實例化一個i2c設備之前,除了有對應的驅動支持匯流排外(這里是匯流排0),還需要有一個驅動使用了匯流排0發送時序,支持名字為"at24c08"的器件。這個驅動用匯流排驅動的函數,配置了at24c08的寄存器。
❹ 如何在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內核中怎麼修改i2c的通信速率為400KHz
1、先查看I2C設備速率。
sudocat/sys/mole/i2c_bcm2708/parameters/baudrate
默認的I2C速度為100KHz,對於多數I2C設備而言100KHz並不算快。
cd/etc/modprobe.d#進入/etc/modprobe.d目錄
sudonanocustom.conf#在該目錄新建一個名為custom.conf文件,並插入以下內容
#optionsi2c_bcm2708baudrate=400000
sudoreboot#重啟系統