[OK210開發(fā)板體驗(yàn)]入門篇(4)編程入門(NFS登錄、驅(qū)動入門)
【OK210開發(fā)板體驗(yàn)】的第一篇:開箱驗(yàn)板
【OK210開發(fā)板驗(yàn)】的第二篇:板載資源
【OK210開發(fā)板體驗(yàn)】的第三篇:開發(fā)環(huán)境(軟件安裝,開發(fā)環(huán)境,燒寫系統(tǒng))
今天是【OK210開發(fā)板體驗(yàn)】的第四篇:編程入門的介紹,主要包括以下內(nèi)容:
一 NFS環(huán)境配置及登錄
二 驅(qū)動環(huán)境搭建
三 下階段安排
一 NFS環(huán)境配置及登錄
還記得在第三篇中介紹NFS的搭建嗎?NFS主要用來通過網(wǎng)線來實(shí)現(xiàn)代碼的上傳,無需通過手動的方式將程序燒寫到SD卡中,方便程序的開發(fā)及調(diào)試,這節(jié)簡單回顧一下NFS的搭建過程,然后通過實(shí)際操作來演示NFS的登錄。
(一)NFS搭建:
1 在Ubuntu下的設(shè)置
1)NFS服務(wù)安裝
Ubuntu上默認(rèn)是沒有安裝NFS服務(wù)器的,首先要安裝NFS服務(wù)程序,執(zhí)行如下命令:
sudo apt-get install nfs-kernel-server
ps: (安裝nfs-kernel-server時,apt會自動安裝nfs-common和portmap)
2)NFS服務(wù)配置
在終端執(zhí)行如下命令,打開配置文件
sudo vim /etc/exports
在文件的最下面輸入如下
/home/ok210/nfs *(rw,sync,no_root_squash)
然后保存退出。
ps:
/home/ok210/nfs表示共享目錄,即我們在上節(jié)創(chuàng)建的nfs目錄,用來存放調(diào)試的程序代碼
*:表示主機(jī)(NFS客戶端)的ip地址(本機(jī)終端ifconfig命令就可以獲得本機(jī)的ip地址),在此表示任意的IP的地址
rw:讀/寫權(quán)限,只讀權(quán)限的參數(shù)為ro;
sync:數(shù)據(jù)同步寫入內(nèi)存和硬盤,也可以使用async,此時數(shù)據(jù)會先暫存于內(nèi)存中,而不立即寫入硬盤。
no_root_squash:NFS 服務(wù)器共享目錄用戶的屬性,如果用戶是 root,那么對于這個共享目錄來說就具有root的權(quán)限。
3)重新編譯內(nèi)核
ok210默認(rèn)的Linux內(nèi)核是不支持NFS服務(wù)器的,所以需要重新編譯內(nèi)核,選擇其支持NFS服務(wù),具體見上節(jié)的內(nèi)核燒寫部分。
2 在OK210下的設(shè)置
1)設(shè)置IP地址
使用NFS服務(wù)器,首先是使Ubuntu和OK210內(nèi)核支持NFS服務(wù);其次是使兩設(shè)備相互可以ping通。默認(rèn)一般兩設(shè)備的IP是ping不通的。現(xiàn)假設(shè)Ubuntu的IP(使用ifconfig查看)地址為192.168.1.102,那么需要將OK210的IP地址設(shè)置為同一網(wǎng)段,即可設(shè)置為192.168.1.x(x表示除102,1以外的其他數(shù)值,但要小于255)。
打開串口終端,輸入如下命令進(jìn)行設(shè)置
ifconfig down
ifconfig eth0 192.168.1.113 netmask 255.255.0.0
route add default gw 192.168.1.1
ifconfig up
ps:也可將上述代碼寫到板子/etc/init.d/rcS文件的最下面,這樣就不用每次掛載時執(zhí)行上述代碼,而是OK210在啟動時,自動掛載。
2)掛載NFS
首先使用網(wǎng)線連接OK210和電腦,使Ubuntu和OK210能夠?qū)崿F(xiàn)網(wǎng)絡(luò)互聯(lián),首先檢查是否可以ping通,比如出現(xiàn)如下信息,說明可以ping通.
接著執(zhí)行命令:
mount -n -o nolock 192.168.1.102:/home/ok210/nfs /mnt
3)NFS測試
在串口終端進(jìn)入/mnt目錄,即可以看到在Ubuntu的/home/ok210/nfs下的文件,如下所示,即表示NFS服務(wù)成功設(shè)置.
二
驅(qū)動環(huán)境搭建
Linux驅(qū)動的編寫,大致分為兩個過程,第一個過程為測試階段,即為某一具體的設(shè)備,添加必要的驅(qū)動模塊,為了節(jié)省編譯時間,需要將代碼單獨(dú)放在一處,在編譯時,只需要要調(diào)用內(nèi)核的頭文件即可;第二個過程為布置階段,即為某一具體設(shè)備,添加完整、可靠的驅(qū)動模塊,即該過程將驅(qū)動模塊編譯到內(nèi)核鏡像文件中,它需要將驅(qū)動模塊的代碼,添加到內(nèi)核源碼樹中,下面將逐一介紹。
(一)階段一
1
新建一目錄,并編寫測試代碼
1. cd /home/ok210/nfs/drivers/demo
2. sudo vim demo.c
復(fù)制代碼
1. // /home/ok210/nfs/drivers/demo/demo.c
2. #include "linux/init.h"
3. #include "linux/module.h"
4.
5. static int hello_init(void)
6. {
7. printk(KERN_ALERT"Hello World linux-driver-module\n");//注意,必須是KERN_ALEAT及以上級別,不然不會打印
8. return 0;
9. }
10.
11. static int hello_exit(void)
12. {
13. printk(KERN_ALERT"Goodbye linux-driver-module\n");
14. return 0;
15. }
16.
17. module_init(hello_init);
18. module_exit(hello_init);
19.
20. MODULE_LICENSE("GPL");
21. MODULE_AUTHOR("gjianw217@163.com");
復(fù)制代碼
ps:
(1)mkdir的-p選項(xiàng)允許你一次性創(chuàng)建多層次的目錄,而不是一次只創(chuàng)建單獨(dú)的目錄。
(2)init.h 定義了驅(qū)動的初始化和退出相關(guān)的函數(shù),幾乎每個linux驅(qū)動都有個module_init(與module_exit的定義在Init.h (\include\linux) 中)。
(3)module.h 定義了內(nèi)核模塊相關(guān)的函數(shù)、變量及宏。 如上面的MODULE_LICENSE("GPL")和 MODULE_AUTHOR("gjianw217@163.com")。其MODULE_LICENSE指定許可,必須指定;MODULE_AUTHOR,聲明作者;還有MODULE_DESCRIPTION,對這個模塊作一個簡單的描述,這個描述是"human-readable"的;MODULE_VERSION,模塊的版本;MODULE_ALIAS,模塊的別名;MODULE_DEVICE_TABLE,告訴用戶空間這個模塊支持什么樣的設(shè)備等。
2
添加編譯文件
Makefile
sudo vim Makefile
1. #demo Makefile
2. ARCH=arm
3. CROSS_COMPILE=/home/ok210/arm-2009q3/bin/arm-none-linux-gnueabi-
4. APP_COMPILE=/home/ok210/arm-2009q3/bin/arm-none-linux-gnueabi-
5. #obj-m := app-drv.o
6. obj-m := demo.o
7. #KDIR := /path/to/kernel/linux/
8. KDIR := /home/ok210/android-kernel-samsung-dev/
9. PWD := $(shell pwd)
10. default:
11. make -C $(KDIR) M=$(PWD) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules
12. app:app.c
13. $(APP_COMPILE)gcc -o app app.c
14. clean:
15. $(MAKE) -C $(KDIR) M=$(PWD) clean
復(fù)制代碼
ps:
(1)這個Makefile算是一個通用的模板,其中CROSS_COMPILE和APP_COMPILE=arm-linux-指定交叉編譯器的位置,obj-m指定驅(qū)動模塊的目標(biāo)文件(如將驅(qū)動模塊命令為app-drv.c,則此處應(yīng)該為app-drv.o);KDIR指定內(nèi)核的位置。
(2)當(dāng)執(zhí)行make時,進(jìn)行內(nèi)核模塊的編譯;當(dāng)執(zhí)行make app時,進(jìn)行應(yīng)用測試程序的編譯;當(dāng)執(zhí)行make clean時,刪除編譯的過程文件。
3
編譯并加載到板上
sudo make
4
驅(qū)動模塊的測試
以上
3
步都是在
ubuntu
下執(zhí)行的,接下來在
OK210
完成
。打開串口終端
SecureCRT
,進(jìn)入
NFS
掛載目錄,執(zhí)行如下程序,
1. cd /mnt/drivers/demo/
2. insmod demo.ko
3. lsmod demo.ko
4. rmmod demo.ko
復(fù)制代碼
最后的結(jié)果如下所示,表明成功。
三
下階段安排
這樣驅(qū)動模塊的基本環(huán)境及驅(qū)動開發(fā)的基本流程介紹完畢,階段二的介紹,參考附錄部分。自此【OK210試用體驗(yàn)】入門篇的4篇博文已完成:
【
OK210
試用體驗(yàn)入門篇(
1
):開箱驗(yàn)板
【
OK210
試用體驗(yàn)入門篇(
2
):板載資源
【
OK210
試用體驗(yàn)入門篇(
3
):開發(fā)環(huán)境(軟件安裝,開發(fā)環(huán)境,燒寫系統(tǒng))
【OK210
試用體驗(yàn)】入門篇(
4
):編程入門(
NFS
登錄、驅(qū)動入門)
接下來進(jìn)行第二階段的檢驗(yàn),即【
OK210
試用體驗(yàn)】功能篇,功能篇現(xiàn)打算從驅(qū)動入手,應(yīng)用提現(xiàn)的原則進(jìn)行。結(jié)合項(xiàng)目要求,主要從以下幾個方面進(jìn)行介紹:
(
1
)
LED
顯示
(
2
)
Key
響應(yīng)
(
3
)
ADC
采集
(
4
)
DS18B20
溫度檢測
(
5
)
IRAD
紅外探測
(
6
)
PWM
驅(qū)動
(
7
)串口
通信
附錄:
1 將驅(qū)動代碼按類型放到內(nèi)核源碼樹相應(yīng)目錄下(drivers/demo/demo.c)
1. //driver/demo/demo.c
2. #include "linux/init.h"
3. #include "linux/module.h"
4.
5. static int hello_init(void)
6. {
7. printk(KERN_ALERT"Hello World linux-driver-module\n");
8. return 0;
9. }
10.
11. static int hello_exit(void)
12. {
13. printk(KERN_ALERT"Goodbye linux-driver-module\n");
14. return 0;
15. }
16.
17. module_init(hello_init);
18. module_exit(hello_init);
19.
20. MODULE_LICENSE("GPL");
21. MODULE_AUTHOR("lpj");
復(fù)制代碼
2 在當(dāng)前目錄下,分別添加編譯文件在 driver/demo/Makefile 文件里,
1. #driver module demo
2. obj-$(CONFIG_HELLODRV) += hello.o
復(fù)制代碼
在driver/demo/Kconfig文件里
1. menu USER_DEVICE_DRIVERS//4中可以看到它
2. config HELLODRV
3. tristate "Hello"
4. help
5. This is a demo driver programming.
6. endmenu
復(fù)制代碼
3 修改上層目錄文件,將其添加到內(nèi)核中
在driver/Makefile文件里
obj-$(CONFIG_HELLODRV)+=demo
在文件里driver/Kconfig 里
source drivers/demo/Kconfig
在arch/arm/Kconfig文件里
source "drivers/demo/Kconfig"
4進(jìn)行系統(tǒng)配置并編譯
make menuconfigmake
5加載內(nèi)核鏡像文件到板上,使用命令檢查
lsmod dmesg
相關(guān)產(chǎn)品 >
-
OKMX6UL-C開發(fā)板
飛凌嵌入式專注imx6系列imx6ul開發(fā)板、飛思卡爾imx6ul核心板等ARM嵌入式核心控制系統(tǒng)研發(fā)、設(shè)計(jì)和生產(chǎn),i.mx6UL系列產(chǎn)品現(xiàn)已暢銷全國,作為恩智浦imx6ul,imx6ul開發(fā)板,i.mx6提供者,飛凌嵌入式提供基于iMX6 iMX6UL解決方案定制。
了解詳情 -
OKMX6ULL-C開發(fā)板
40*29mm,雙網(wǎng)雙CAN,8路串口| i.MX6ULL開發(fā)板是基于NXP i.MX6ULL設(shè)計(jì)開發(fā)的的一款Linux開發(fā)板 ,主頻800MHz,體積小,其核心板僅40*29mm,采用板對板連接器,適應(yīng)場景豐富。 了解詳情