为首的亮,灭。同时如果你GPIO4,GPIO5接个LED,也会跟着亮,灭。
开发环境:
系统:Ubuntu的
一,硬件介绍
仔细看pcDuino上的原理图和pcDuino的手册,发现二者不是完全对应的,还是以原理图为准。根据原理图知道TX_LED是接到PH15上,可以当做普通IO口用,不需要连跳线
二,编写GPIO驱动代码
主要包括2部分,驱动代码first_drv.c和应用测试程序firstdrvtest.c以及Makefile文件。
驱动代码first_drv.c
[平原]查看plaincopy
#包括 # # # # #
#
#
#
#
#
静态结构类* 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移植一、二、三、四搭建的驱动开发平台,上电进入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的#
来源:oschina
链接:https://my.oschina.net/u/1174645/blog/142267