树莓内核驱动io框架
树莓派内核驱动框架
- 驱动层框架编写
- 驱动程序:pin4driver2.c
- 上层程序pin4test.c
- 驱动代码编译和测试
- 1.返回内核源码linux文件进行模块编译
- 2.将生成的pin4driver2.ko和pin4test拷贝到树莓派
- 3.在树莓派下加载内核驱动
驱动层框架编写
首先在linux下 创建文件夹pin4并创建pin4driver2.c
驱动程序:pin4driver2.c
#include <linux/fs.h> //file_operations声明
#include <linux/module.h> //module_init.module_exit声明
#include <linux/init.h> //__init.__exit.宏的声明
#include <linux/device.h> //class.device声明
#include <linux/uaccess.h> //copy_from_user的头文件
#include <linux/types.h> //设备号.dev_t.类型声明
#include <asm/io.h> //ioremap iounma的头文件
static struct class *pin4_class; //static限制结构体只在本文件内有用
static struct device *pin4_class_dev;
static dev_t devno; //设备号
static int major=231; //主设备号
static int minor=0; //次设备号
static char *module_name="pin4"; //模块名static int pin4_read(struct file *file,char __user *buf,size_t size,loff_t *ppos)
{printk("pin4_read\n"); //内核的打印函数return 0;
}
static int pin4_open(struct inode *inode,struct file *file)
{printk("pin4_open\n");return 0;
}
static ssize_t pin4_write(struct file *file,const char __user *buf, size_t count,loff_t *ppos)
{printk("pin4_write\n");return 0;
}
static struct file_operations pin4_fops={//对结构体部分变量单独赋值.owner=THIS_MODULE,.open=pin4_open,.write=pin4_write,.read=pin4_read,
};
int __init pin4_drv_init(void) //真实 驱动入口
{int ret;devno =MKDEV(major,minor); //1.创建设备号ret =register_chrdev(major,module_name,&pin4_fops); //2.注册驱动告诉内核 把这个驱动加入到内核的链表中pin4_class=class_create(THIS_MODULE,"myfirstdemo"); //让代码在dev下自动生成设备 (类)pin4_class_dev=device_creat(pin4_class,NULL,devno,NULL,module_name); //创建设备文件(设备)return 0;
}
void __exit pin4_drv_exit(void)
{device_destroy(pin4_class,devno); //先销毁设备class_destroy(pin4_class); //在销毁类unregister_chrdev(major,module_name); //卸载驱动把内核里添加的链表删除
}
module_init(pin4_drv_init); //入口 内核加载驱动的时候,这个宏会被调用
module_exit(pin4_drv_exit);
MODULE_LICENSE("GPL V2");
上层程序pin4test.c
include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int mian()
{int fd;fd=open("/dev/pin4",O_RDWR);if(fd<0){printf("open failed\n"); } else{printf("open success\n");}fd=write(fd,'1',1); //第二个参数是个指针类型
}
驱动代码编译和测试
将pin4driver2.c拷贝到linux/drivers/char文件夹下并修改 Makefile
vi Makefile
添加obj-m +=pin4driver2.o
1.返回内核源码linux文件进行模块编译
在/home/lh/SYSTEM/linux-rpi-4.14.y/中 输入
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make modules
会在 home/lh/SYSTEM/linux-rpi-4.14.y/drivers/char 生成一个pin4drver2.ko的文件
对pin4test.c编译生成pin4test
arm-linux-gnueabihf-gcc pin4test.c -o pin4test
2.将生成的pin4driver2.ko和pin4test拷贝到树莓派
scp drivers/char/pin4driver2.ko pi@192.168.3.16:/home/pi
scp pin4test pi@192.168.3.16:/home/pi
3.在树莓派下加载内核驱动
sudo insmod pin4driver2.ko
查看是否生成
ls /dev/pin4
lsmodc查看驱动
对文件访问权限修改让所有用户均可读写后运行pin4test
使用dmesg检索内核的printk查看是否执行成功
树莓内核驱动io框架相关推荐
- 树莓派Linux内核编译、文件系统、Linux内核驱动基础框架、驱动测试步骤、总线地址
树莓派高阶开发课程 1. ubuntu18.04版本安装 让程序猿搭建环境太搞笑了,轻松easy! ========================================= ...
- 树莓派学习笔记(十六)编写内核驱动操控IO口代码原理分析
驱动源码.测试源码可查看博文:内核驱动操控IO口源码(pin4引脚) 寄存器地址.引脚对应的位数等原理可查看博文:BCM2835芯片手册导读 1.驱动代码编写 框架查看博文:基于框架编写驱动 1.1 ...
- 驱动框架2——内核驱动框架中LED的基本情况、初步分析
以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除. 一.内核驱动框架中LED的基本情况 1.相关文件 (1)drivers/leds目录 驱动框架规定的LED这种硬件的驱动应该待的地方. (2 ...
- 内核驱动中常见的miscdevice、platform_device、platform_driver
最近在看驱动模型,是越看越糊涂,以前接触比较多的都是一些字符驱动,对字符驱动的框架有一定的了解.后来因为想在驱动中实现设备文件的创建,又了解了一下,sysfs文件系统和udev设备文件系统,必然就涉及 ...
- 视频驱动V4L2子系统驱动架构-框架
V4L2驱动框架 v4l2驱动架构如图所示,v4l2也就是video for linux two,那么也就是说还有One了,v4l2前面还有v4l 图中芯片模块对应Soc的各个子模块,video_de ...
- 树莓派基于Linux内核驱动开发
一.驱动认知 1.1 为什么要学习写驱动 树莓派开发简单是因为有厂家提供的wiringPi库,实现超声波,实现继电器操作,做灯的点亮-都非常简单. 但未来做开发时,不一定都是用树莓派,则没有wirin ...
- 第三阶段:43-47.树莓派基于Linux内核驱动开发
目录 一.驱动认知 1.1 为什么要学习写驱动 1.2 文件名与设备号 1.3 open函数打通上层到底层硬件的详细过程 二.基于框架编写驱动代码 2.1 编写上层应用代码 2.2 修改内核驱动框架代 ...
- 韦东山的led硬件和驱动分类框架
韦东山的led硬件和驱动分类框架 Makefile led_opr.h抽象出了led的操作 board_demo.c单板资源文件提供了实现 demo的具体实现 leddrv.c设备驱动文件 ledte ...
- Linux io模型及函数调用,Linux 网络编程的5种IO模型:信号驱动IO模型
Linux 网络编程的5种IO模型:信号驱动IO模型 背景 这一讲我们来看 信号驱动IO 模型. 介绍 情景引入: 在信号驱动IO模型中,当用户线程发起一个IO请求操作,会给对应的socket注册一个 ...
最新文章
- 基于py36的glob模块总结
- GNU make manual 翻译(八十七)
- ConcurrentHashMap源码剖析(1.8版本)
- MATLAB转化彩色图片为灰度图片命令行窗口代码:
- ubuntu 20.04双系统安装_win10上跑Ubuntu不用虚拟机不用双系统!
- 【UVA514】+【HDOJ1022]:出栈序列的可能性问题
- 如何理解“安全的本质是信任问题”
- app开发预算究竟多少?看你多花了多少冤枉钱
- SQL2005到2008数据库升级
- 微信将迎来重大更新:绑定银行卡的用户请注意
- Fluentd (td-agent) 日志处理
- Voters in Appalachia Struggling to Identify With Presidential Candidates
- 大数据的关键技术(一)
- 第一次开发EOS区块链的经验总结
- 微信公众平台教程--素材编辑
- 安装torchvision:ImportError:DLL load failed:找不到指定的模块
- Oracle——删除用户以及用户下数据
- 平均股价的时间序列图形_每年的平均股价怎么算
- uploadify多图上传php,Uploadify多上传图片插件
- euclidea教程_euclidea 3.0 全三星 攻略
热门文章
- 钢铁平面焊接缺陷检测,有方案、有代码
- React history.push 传递参数
- Could not initialize class org.apache.http.impl.conn.ManagedHttpClientConnectionFactory
- base64 解码
- CentOS 7.8下安装PyRosetta4
- 批量从apk文件中提取出so文件
- Android中对Handler用法的总结
- 安装batocera-linux教程_利用Grub2Win安装Batocera+Windows7双系统甚至多系统实战教程
- 惠普打印机节能环保认证证书_爱普生和惠普家用打印机哪款好 爱普生和惠普家用打印机对比【区别】...
- 单词不用背,学完自然会!”这个方法,你知道越早越好!