您现在的位置是:主页 > news > 自媒体网站建设要求/网站域名购买
自媒体网站建设要求/网站域名购买
admin2025/4/27 14:13:47【news】
简介自媒体网站建设要求,网站域名购买,建筑工程总承包合同范本,网站建设流程域名注册自己写驱动实现IO口高低电平1.准备工作1.统一版本2.安装交叉编译工具2.编写代码1.驱动代码2.测试代码3.测试代码1.进入自己安装的系统版本文件夹下2.配置Makefile3.模块编译1.模块编译2.测试代码编译4.树莓派下操作1.加入驱动2.将设备打开权限设置为都可打开3.测试并调试1.准备…
自媒体网站建设要求,网站域名购买,建筑工程总承包合同范本,网站建设流程域名注册自己写驱动实现IO口高低电平1.准备工作1.统一版本2.安装交叉编译工具2.编写代码1.驱动代码2.测试代码3.测试代码1.进入自己安装的系统版本文件夹下2.配置Makefile3.模块编译1.模块编译2.测试代码编译4.树莓派下操作1.加入驱动2.将设备打开权限设置为都可打开3.测试并调试1.准备…
自己写驱动实现IO口高低电平
- 1.准备工作
- 1.统一版本
- 2.安装交叉编译工具
- 2.编写代码
- 1.驱动代码
- 2.测试代码
- 3.测试代码
- 1.进入自己安装的系统版本文件夹下
- 2.配置Makefile
- 3.模块编译
- 1.模块编译
- 2.测试代码编译
- 4.树莓派下操作
- 1.加入驱动
- 2.将设备打开权限设置为都可打开
- 3.测试并调试
1.准备工作
1.统一版本
我是用虚拟机乌班图,编写的驱动是否可以写进内核,取决于乌班图Linux版本和树莓派的是否兼容,若不兼容,请参考内核编译
进行内核编译,再实现此代码
2.安装交叉编译工具
此外还需要安装交叉编译工具交叉编译
2.编写代码
1.驱动代码
代码基于驱动代码的框架之下
#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 devise声明
#include <linux/uaccess.h> //copy_from_user 的头文件
#include <linux/types.h> //设备号 dev_t 类型声明
#include <asm/io.h> //ioremap iounmap的头文件static struct class *pin4_class;
static struct device *pin4_class_dev;static dev_t devno; //设备号
static int major =231; //主设备号
static int minor =0; //次设备号
static char *module_name="pin4"; //模块名volatile unsigned int* GPFSEL0 = NULL;
volatile unsigned int* GPSET0 = NULL;
volatile unsigned int* GPCLR0 = NULL;//led_open函数
static int pin4_open(struct inode *inode,struct file *file)
{printk("pin4_open\n"); //内核的打印函数和printf类似*GPFSEL0 &= ~(0x6 << 12);//将12-14设置为001*GPFSEL0 |= (0x1 << 12);return 0;
}//led_read函数
static ssize_t pin4_read(struct file *file1,const char __user *buf,size_t count, loff_t *ppos)
{printk("pin4_read\n");return 0;
}
//led_write函数
static ssize_t pin4_write(struct file *file1,const char __user *buf,size_t count, loff_t *ppos)
{int Cmd;printk("pin4_write\n");copy_from_user(&Cmd,buf,count);//将应用层数据放到Cmd中if(Cmd == 1){*GPSET0 |= 0x1 << 4;//将4引脚设置为1}else if(Cmd == 0){*GPCLR0 |= 0x1 << 4;//将4引脚设置为0}else{printk("error\n");}printk("%d\n",Cmd);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); //创建设备号printk("drive init succeed\n");ret = register_chrdev(major, module_name,&pin4_fops); //注册驱动 告诉内核,把这个驱动加入到内核驱动的链表中pin4_class=class_create(THIS_MODULE,"myfirstdemo");pin4_class_dev =device_create(pin4_class,NULL,devno,NULL,module_name); //创建设备文件GPFSEL0 = (volatile unsigned int *)ioremap(0x3f200000,4);GPSET0 = (volatile unsigned int *)ioremap(0x3f20001C,4);GPCLR0 = (volatile unsigned int *)ioremap(0x3f200028,4);return 0;
}void __exit pin4_drv_exit(void)
{iounmap(GPFSEL0);iounmap(GPSET0);iounmap (GPCLR0);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");
2.测试代码
#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int main()
{int fd;int cmd;fd = open("/dev/pin4",O_RDWR);if(fd == -1){printf("打开失败\n");}scanf("%d",&cmd);if(cmd == 1){printf("cmd:%d\n",cmd);}if(cmd == 0){printf("cmd:%d\n",cmd);}write(fd,&cmd,4);return 0;}
代码编写完,现在开始与硬件结合测试
3.测试代码
打开乌班图
1.进入自己安装的系统版本文件夹下
2.配置Makefile
将驱动代码文件放到drive/char文件夹下
在此文件夹下vi打开Makefile,插入如下字段
obj-m += mydrive.o
mydrive.c是我的驱动文件名
3.模块编译
为了方便,再开一个窗口进入系统版本文件夹下,将测试代码放到这里
开始模块编译
1.模块编译
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make modules
出现错误,或警告和普通代码处理方法一样,进入另一窗口,修改错误
,若出现其他错误,请检查步骤
2.测试代码编译
arm-linux-gnueabihf-gcc mydrivedemo.c -o drive
分别通过scp命令发送到树莓派下(记得乌班图和树莓派在同一网络下哦)
测试代码编译文件发送
scp drive pi@172.20.xx.xx:/home/pi
驱动代码编译文件发送
scp mydrive.ko pi@172.20.xx.xx:/home/pi
4.树莓派下操作
1.加入驱动
sudo insmod mydrive.ko
查看所有驱动 lsmod
2.将设备打开权限设置为都可打开
sudo chmod 666 /dev/pin4
查看此设备 ls /dev/pin4
3.测试并调试
./drive
输入1或0
运行成功
无界面
因为此为上层界面,查看内核层界面
使用此命令
dmesg
显示如下
查看引脚
gpio readAll
4引脚电平是否改变
一场正常,则成功实现,有问题可以问一下
能力一般,水平有限,简单总结一下驱动方面的知识
希望能够帮到您
师承上官可编程,陈立臣