pcDuino的linux移植五GPIO驱动开发

与世无争的帅哥 提交于 2019-11-30 23:13:06

为首的亮,灭。同时如果你GPIO4,GPIO5接个LED,也会跟着亮,灭。

开发环境:
系统:Ubuntu的

一,硬件介绍

仔细看pcDuino上的原理图和pcDuino的手册,发现二者不是完全对应的,还是以原理图为准。根据原理图知道TX_LED是接到PH15上,可以当做普通IO口用,不需要连跳线

03

二,编写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的#

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!