树莓派内核驱动框架

  • 驱动层框架编写
    • 驱动程序: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框架相关推荐

  1. 树莓派Linux内核编译、文件系统、Linux内核驱动基础框架、驱动测试步骤、总线地址

    树莓派高阶开发课程 1. ubuntu18.04版本安装          让程序猿搭建环境太搞笑了,轻松easy! ========================================= ...

  2. 树莓派学习笔记(十六)编写内核驱动操控IO口代码原理分析

    驱动源码.测试源码可查看博文:内核驱动操控IO口源码(pin4引脚) 寄存器地址.引脚对应的位数等原理可查看博文:BCM2835芯片手册导读 1.驱动代码编写 框架查看博文:基于框架编写驱动 1.1 ...

  3. 驱动框架2——内核驱动框架中LED的基本情况、初步分析

    以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除. 一.内核驱动框架中LED的基本情况 1.相关文件 (1)drivers/leds目录 驱动框架规定的LED这种硬件的驱动应该待的地方. (2 ...

  4. 内核驱动中常见的miscdevice、platform_device、platform_driver

    最近在看驱动模型,是越看越糊涂,以前接触比较多的都是一些字符驱动,对字符驱动的框架有一定的了解.后来因为想在驱动中实现设备文件的创建,又了解了一下,sysfs文件系统和udev设备文件系统,必然就涉及 ...

  5. 视频驱动V4L2子系统驱动架构-框架

    V4L2驱动框架 v4l2驱动架构如图所示,v4l2也就是video for linux two,那么也就是说还有One了,v4l2前面还有v4l 图中芯片模块对应Soc的各个子模块,video_de ...

  6. 树莓派基于Linux内核驱动开发

    一.驱动认知 1.1 为什么要学习写驱动 树莓派开发简单是因为有厂家提供的wiringPi库,实现超声波,实现继电器操作,做灯的点亮-都非常简单. 但未来做开发时,不一定都是用树莓派,则没有wirin ...

  7. 第三阶段:43-47.树莓派基于Linux内核驱动开发

    目录 一.驱动认知 1.1 为什么要学习写驱动 1.2 文件名与设备号 1.3 open函数打通上层到底层硬件的详细过程 二.基于框架编写驱动代码 2.1 编写上层应用代码 2.2 修改内核驱动框架代 ...

  8. 韦东山的led硬件和驱动分类框架

    韦东山的led硬件和驱动分类框架 Makefile led_opr.h抽象出了led的操作 board_demo.c单板资源文件提供了实现 demo的具体实现 leddrv.c设备驱动文件 ledte ...

  9. Linux io模型及函数调用,Linux 网络编程的5种IO模型:信号驱动IO模型

    Linux 网络编程的5种IO模型:信号驱动IO模型 背景 这一讲我们来看 信号驱动IO 模型. 介绍 情景引入: 在信号驱动IO模型中,当用户线程发起一个IO请求操作,会给对应的socket注册一个 ...

最新文章

  1. 基于py36的glob模块总结
  2. GNU make manual 翻译(八十七)
  3. ConcurrentHashMap源码剖析(1.8版本)
  4. MATLAB转化彩色图片为灰度图片命令行窗口代码:
  5. ubuntu 20.04双系统安装_win10上跑Ubuntu不用虚拟机不用双系统!
  6. 【UVA514】+【HDOJ1022]:出栈序列的可能性问题
  7. 如何理解“安全的本质是信任问题”
  8. app开发预算究竟多少?看你多花了多少冤枉钱
  9. SQL2005到2008数据库升级
  10. 微信将迎来重大更新:绑定银行卡的用户请注意
  11. Fluentd (td-agent) 日志处理
  12. Voters in Appalachia Struggling to Identify With Presidential Candidates
  13. 大数据的关键技术(一)
  14. 第一次开发EOS区块链的经验总结
  15. 微信公众平台教程--素材编辑
  16. 安装torchvision:ImportError:DLL load failed:找不到指定的模块
  17. Oracle——删除用户以及用户下数据
  18. 平均股价的时间序列图形_每年的平均股价怎么算
  19. uploadify多图上传php,Uploadify多上传图片插件
  20. euclidea教程_euclidea 3.0 全三星 攻略

热门文章

  1. 钢铁平面焊接缺陷检测,有方案、有代码
  2. React history.push 传递参数
  3. Could not initialize class org.apache.http.impl.conn.ManagedHttpClientConnectionFactory
  4. base64 解码
  5. CentOS 7.8下安装PyRosetta4
  6. 批量从apk文件中提取出so文件
  7. Android中对Handler用法的总结
  8. 安装batocera-linux教程_利用Grub2Win安装Batocera+Windows7双系统甚至多系统实战教程
  9. 惠普打印机节能环保认证证书_爱普生和惠普家用打印机哪款好 爱普生和惠普家用打印机对比【区别】...
  10. 单词不用背,学完自然会!”这个方法,你知道越早越好!