爲首的亮,滅。同時若是你GPIO4,GPIO5接個LED,也會跟着亮,滅。 node
開發環境:
系統:Ubuntu的
linux
一,硬件介紹 函數
仔細看pcDuino上的原理圖和pcDuino的手冊,發現兩者不是徹底對應的,仍是以原理圖爲準。根據原理圖知道TX_LED是接到PH15上,能夠當作普通IO口用,不須要連跳線 測試
二,編寫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的#