您现在的位置是:主页 > news > 自媒体网站建设要求/网站域名购买

自媒体网站建设要求/网站域名购买

admin2025/4/27 14:13:47news

简介自媒体网站建设要求,网站域名购买,建筑工程总承包合同范本,网站建设流程域名注册自己写驱动实现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引脚电平是否改变
一场正常,则成功实现,有问题可以问一下

能力一般,水平有限,简单总结一下驱动方面的知识
希望能够帮到您

师承上官可编程,陈立臣