2019独角兽企业重金招聘Python工程师标准>>>

为首的亮,灭。同时如果你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的#

转载于:https://my.oschina.net/pcduino/blog/142267

pcDuino的linux移植五GPIO驱动开发相关推荐

  1. STC8H开发(十五): GPIO驱动Ci24R1无线模块

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  2. Linux下LED设备驱动开发(LED灯实现闪烁)

    文章目录 一.配置连接说明 二.更新设备树 (1)将led灯引脚添加到pinctrl子系统 (2)设备树中添加LDE灯的设备树节点 (3)编译更新设备树 三.驱动开发与测试 (1)编写设备驱动代码 ( ...

  3. 嵌入式linux ASoC架构声卡驱动开发

    嵌入式linux ASoC架构声卡驱动开发 文章目录 嵌入式linux ASoC架构声卡驱动开发 需求分析 ASoC架构下声卡驱动代码结构 codec驱动 snd_soc_register_codec ...

  4. openharmony GPIO 驱动开发

    openharmony GPIO 驱动开发 GPIO 基础知识 GPIO 基础知识--概念 GPIO 基础知识--IO 复用 GPIO 基础知识--GPIO 分组和编号 GPIO 基础知识--用户态测 ...

  5. Linux下按键设备驱动开发以及对中断的上半部分和下半部分详细介绍

    文章目录 一.编写并且加载设备树插件 (1)检测管脚是否占用 (2)添加设备树插件 (3)加载设备树插件 二.中断相关函数 (1)request_irq中断注册函数 (2)free_irq中断注销函数 ...

  6. at91sam9260ek开发板linux移植文档,AT91SAM9260EK开发板 Linux 移植 移植 文档

    AT91SAM9260EK开发板 Linux 移植 移植 文档 AT91SAM9260EKAT91SAM9260EKAT91SAM9260EKAT91SAM9260EK 开发板开发板开发板开发板 Li ...

  7. linux open函数_Linux驱动开发 / 字符设备驱动内幕 (1)

    哈喽,我是老吴,继续记录我的学习心得. 一.保持专注的几个技巧 将最重要的事放在早上做. 待在无干扰环境下,比如图书馆. 意识到刚坐下开始投入工作前,有点负面小情绪是特别正常的现象. 让"开 ...

  8. Linux DSA Net Switch驱动开发

    参考 Atheros QCA8337交换芯片驱动开发 Linux虚拟网络设备之bridge(桥) phy 驱动与 switch 驱动 ALinux网桥的实现分析与使用 DSA switch confi ...

  9. 实时linux下的PCI驱动开发(上)

    第一篇博客,忆苦思甜下先,当然,我尽量长话短说,但说来话长倒也无妨......这是我研究生阶段写的第一个Linux驱动,一入Linux深似海,从此Windows是路人.那是2009年冬天的第一场雪,王 ...

最新文章

  1. 运维杂记(二):打印机print spooler服务自动关闭
  2. 3.3 matlab用switch语句实现选择结构
  3. 二叉树的前、中、后、层序遍历整理(Java版本)
  4. 苏州中学2021届高考成绩查询,苏州中学排名前十名,2021年苏州中学排名一览表
  5. 独立线性度 最佳直线
  6. java中sort的cmp_快速排序(cmp函数详解)
  7. 使用arguments对象模拟函数重载
  8. java怎么编译_java怎么编译运行?java有哪些编译方法?
  9. 等保三级密码技术应用要求 GM/T 0054-2018
  10. Java注解中produces啥意思_SpringBoot常用注解
  11. 爬取京东收件地址下得所有数据
  12. 元数据编码和传输标准(METS)
  13. 比情商智商重要的是财商——财商!
  14. 多余文字隐藏用省略号代替
  15. 【开源】蓝奏云直链解析
  16. 【融职培训】Web前端学习 第7章 Vue基础教程4 组件传值
  17. Oracle等待事件(三)—— buffer busy waits 常见原因及对应解决方法
  18. 读写配置文件模块configparser—参考杨永明博客
  19. turf生成缓冲区--maptalks缓冲区分析
  20. golang 小trick

热门文章

  1. 在线正则表达式可视化工具
  2. Hbase常用数据库操作类
  3. 数据库MySQL--常见基础命令
  4. 一键部署ETCD集群脚本
  5. Vant - 高效的 Vue 组件库,再造一个有赞移动商城也不在话下
  6. 0505.Net基础班第二十天(基础加强总复习)
  7. jQuery二维码插件 jquery.qrcode.js
  8. 使用数据库镜像保障高可用的数据库应用(下)
  9. 财务一体化项目,进度与计划31
  10. 面试题51. 数组中的逆序对