pcDuino的linux移植五GPIO驅動開發

爲首的亮,滅。同時若是你GPIO4,GPIO5接個LED,也會跟着亮,滅。 node

開發環境:
系統:Ubuntu的
linux

一,硬件介紹 函數

仔細看pcDuino上的原理圖和pcDuino的手冊,發現兩者不是徹底對應的,仍是以原理圖爲準。根據原理圖知道TX_LED是接到PH15上,能夠當作普通IO口用,不須要連跳線 測試

03

二,編寫GPIO驅動代碼 ui

主要包括2部分,驅動代碼first_drv.c和應用測試程序firstdrvtest.c以及Makefile文件。 spa

驅動代碼first_drv.c 指針

[平原]查看plaincopy 
#包括 # # # # # 
# 
# 
# 
# 
blog

靜態結構類* firstdrv_class的; 
靜態struct class_device的* firstdrv_class_dev; 進程

揮發的無符號長* gphcfg1 ;/ / 0×100 PH9 [6:4] 001 
揮發性無符號長* gphdat / / 0x10c 
靜態結構的inode * inode的結構文件*文件first_drv_open()

中printk(「first_drv_open \ N」)
/ *配置GPh9爲輸出引腳GPIO4 * / 
* gphcfg1 | =((0×1 << 4)(0X1 << 8)|(0X1 << 28)); 
返回0; 
} 資源

的靜態ssize_t供first_drv_write(結構文件*文件,常量的char __用戶* buf中,爲size_t計數,參數loff_t * PPOS中)

詮釋值; 
printk的(「first_drv_write \Ń」); 
的copy_from_user(和值,buf中,數); / / copy_to_user的();

若是(VAL == 1)

/ /點燈
* gphdat&=〜((0X1 << 9)|(0X1 << 10)|(1 << 15)); 
} { / /滅燈 * gphdat | = ((0X1 << 10)|(0X1 << 10)|(1 << 15)); } 


返回0; 
}

靜態file_operations結構first_drv_fops = { 
全部者= THIS_MODULE 
。開= first_drv_open,
寫= first_drv_write,
};

詮釋專業; 
靜態詮釋first_drv_init(無效)

主要= register_chrdev的(0,「first_drv」,與first_drv_fops); 
firstdrv_class = class_create(THIS_MODULE,「firstdrv」); 
firstdrv_class_dev = device_create firstdrv_class,NULL,MKDEV(主要,0)(NULL爲「xyz」); 
gphcfg1 =(揮發性無符號長*)ioremap的(0x01c20900,16); 
gphdat =(揮發性無符號長*)ioremap的(16 0x01c2090c);/ / gphcfg1 3; 
返回0; 
}

靜態無效 鑑於plaincopy iounmap(gphdat); } 





宏module_init(first_drv_init);在
module_exit的(first_drv_exit);

MODULE_LICENSE(「GPL」); 
文件的Makefile:

[平原]查看plaincopy 
KERN_DIR = / home/change/Si/A10/pcduino/linux-sunxi-sunxi-3.0號


使C $(KERN_DIR)M =`PWD`模塊

清潔:
使C $(KERN_DIR)M =`PWD`模塊乾淨的
RM-RF modules.order

OBJ-M + = first_drv.o 
應用測試程序firstdrvtest.c:

[平原]查看plaincopy 
#包括
# 
# 

/ * firstdrvtest 
* firstdrvtest關
* / 
INT(INT ARGC的char ** argv的)

FD; 
INT值= 1; 
FD =打開(一個「/ dev / XYZ」,O_RDWR); 
(FD <0)

printf(「請沒法打開\ N」); 

(ARGC = 2)

printf的(「用法:\ N」); 
的printf(「%s的\ N「的argv [0]); 
返回0; 
}

若是(的strcmp(argv的[1],「」)== 0)

值= 1; 

不然

值= 0; 
}

寫(FD,纈氨酸,4); 
返回0; 

三,編譯測試

(1)編譯驅動first_drv.c 
變化@變化:〜/ Si/A10/2_led的CD 
LS 
first_drv.c first_drv.mod.c first_drv.o firstdrvtest.c modules.order 
first_drv.ko first_drv.mod.o firstdrvtest Makefile Module.symvers的
變化變化:〜/ Si/A10/pcduino/linux-sunxi-sunxi-3.0號/司機/程序mydrv的/ led_drv的$使清潔
-C / home/change/Si/A10/pcduino/linux-sunxi-sunxi-3.0,M =`PWD`乾淨模塊
[1]:正在進入目錄`/家庭/變動/ Si/A10/pcduino/linux-sunxi-sunxi-3.0 
LD / home/change/Si/A10/pcduino/linux-sunxi-sunxi-3.0/drivers/mydrv/led_drv/built-in.o的
CC [M]。
在功能 
警告:忽略返回值的copy_from_user,宣佈屬性 
在功能 
警告:賦值兼容的指針類型
/ home/change/Si/A10/pcduino/linux-sunxi-sunxi-3.0/drivers/mydrv/led_drv/first_drv.c的:在函數 
警告:傳遞參數1'device_unregister'不兼容的指針類型
包括/ LINUX / device.h中:692:注:預期的struct device *',但實參類型'struct class_device的「 
建築模塊,第2階段。
MODPOST 1模塊
CC / home/change/Si/A10/pcduino/linux-sunxi-sunxi-3.0/drivers/mydrv/led_drv/first_drv.mod.o的
LD [M] / home/change/Si/A10/pcduino/linux-sunxi- sunxi-3.0/drivers/mydrv/led_drv/first_drv.ko 
CLEAN / home/change/Si/A10/pcduino/linux-sunxi-sunxi-3.0/drivers/mydrv/led_drv/.tmp_versions的
CLEAN / home/change/Si/A10的/ pcduino/linux-sunxi-sunxi-3.0/drivers/mydrv/led_drv/Module.symvers的
[1]:正在離開目錄`/ home/change/Si/A10/pcduino/linux-sunxi-sunxi-3.0 
RM-RF modules.order

改爲@變化:〜/ Si/A10/pcduino/linux-sunxi-sunxi-3.0/drivers/mydrv/led_drv $ 
-C / home/change/Si/A10/pcduino/linux-sunxi-sunxi-3.0 M = `PWD`模塊
[1]:正在進入目錄`/ home/change/Si/A10/pcduino/linux-sunxi-sunxi-3.0 
CC [M]。
在功能 
警告:忽略返回值的copy_from_user,宣佈屬性 
在功能 
警告:賦值兼容的指針類型
/ home/change/Si/A10/pcduino/linux-sunxi-sunxi-3.0/drivers/mydrv/led_drv/first_drv.c的:在函數 
警告:傳遞參數1'device_unregister'不兼容的指針類型
包括/ LINUX / device.h中:692:注:預期的struct device *',但實參類型'struct class_device的「 
建築模塊,第2階段。
MODPOST 1模塊
CC / home/change/Si/A10/pcduino/linux-sunxi-sunxi-3.0/drivers/mydrv/led_drv/first_drv.mod.o的
LD [M] / home/change/Si/A10/pcduino/linux-sunxi- sunxi-3.0/drivers/mydrv/led_drv/first_drv.ko 
[1]:離開目錄`/ home/change/Si/A10/pcduino/linux-sunxi-sunxi-3.0中'

(2)編譯應用測試程序firstdrvtest.c

改爲@變化:〜/ Si/A10/pcduino/linux-sunxi-sunxi-3.0/drivers/mydrv/led_drv元/ home/change/tools/arm-2009q3/bin/arm-none-linux-gnueabi-gcc-O firstdrvtest firstdrvtest.c

其中/home/change/tools/arm-2009q3/bin/arm-none-linux-gnueabi-gcc是個人交叉編譯路徑,根據本身狀況修改。

改爲@變化:〜/ Si/A10/pcduino/linux-sunxi-sunxi-3.0/drivers/mydrv/led_drv $ LS 
first_drv.c first_drv.mod.c first_drv.o firstdrvtest.c modules.order 
first_drv.ko first_drv.mod Øfirstdrvtest Makefile Module.symvers的
變化變化:〜/ $ Si/A10/pcduino/linux-sunxi-sunxi-3.0/drivers/mydrv/led_drv的CP first_drv.ko firstdrvtest

(3)測試

啓動前面pcDuino的linux移植1、2、3、四搭建的驅動開發平臺,上電進入pcDuino啓動控制檯,串口輸出以下

/#ifconfig eth0命令172.16.1.111 
<4> wemac wemac.0:警告:沒有IRQ資源設置標誌
[18.250000] wemac wemac.0:警告:沒有IRQ資源設置標誌。
<6> wemac wemac.0:eth0的:連接高達100Mbps的全雙工,LPA 0x45E1 
[18.400000] wemac.0 wemac:eth0的:銜接起來,100Mbps的全雙工,LPA 0x45E1 
/平172.16.1 <7>爲eth0:沒有IPv6路由器
[28.860000]爲eth0 :目前沒有IPv6路由器

PING 172.16.1(172.16.0.1):56字節的數據
^ C 
- 172.16.1 ping統計- 
0接收的數據包,4包的轉發,100%丟包
/平
PING 172.16.1.137 172.16.1.137 (172.16.1.137): 56個數據字節
64字節172.16.1.137:SEQ = 0 TTL = 64時間= 10.015毫秒
64字節172.16.1.137:SEQ = 1 TTL = 64時間= 1.013毫秒
64字節172.16.1.137:SEQ = 2 TTL = 64時間= 1.735毫秒
64字節172.16.1.137:SEQ = 3 TTL = 64時間= 0.814毫秒
^ C 
- 172.16.1.137 ping統計- 
4傳輸的數據包,4包,0%丟包
往返最小/平均/最大=毫秒0.814/3.394/10.015 
/#LS 
斌等解放MNT運行系統USR 
dev家裏的linuxrc的進程sbin目錄的tmp var 
/#NFS掛載噸鄰中NOLOCK 172.16.1.137 :/主場/變動/工做/ rootfs_dir的/ 
噸fs_mini /分鐘/ 
/#LS到/ mnt / 
BIN等解放MNT根系統USR 
dev家裏的linuxrc的進程sbin目錄的tmp 
/#CD / mnt/home/linux-3.0.62/pcduino / 
/ mnt/home/linux-3.0.62/pcduino#LS 
first_drv.ko firstdrvtest gpio_drv.ko gpiodrvtest 
/#insmod的mnt/home/linux-3.0.62/pcduino的first_drv.ko 
/ mnt/home/linux-3.0.62/pcduino#lsmod的
first_drv 1768 0 -現場0xbf000000 
到/ mnt /家庭/ [] first_drv_open first_drv_write 309.510000 309.510000] first_drv_write / 關閉
first_drv_open linux-3.0.62/pcduino#。/ firstdrvtest的
] first_drv_open 
first_drv_write [303.610000 
303.610000 first_drv_write 
/ mnt/home/linux-3.0.62/pcduino#。/ firstdrvtest 
first_drv_open mnt/home/linux-3.0.62/pcduino#

能夠看到執行。/ firstdrvtest,pcDuino上的TX LED就滅,執行。/ firstdrvtest pcDuino上的TX LED就亮。測試基本正常,卸載剛剛加載的驅動以下;

/ mnt/home/linux-3.0.62/pcduino的:#rmmod的first_drv 
/ mnt/home/linux-3.0.62/pcduino#lsmod的
/ mnt/home/linux-3.0.62/pcduino的#

相關文章
相關標籤/搜索