当前位置: 首页 > wzjs >正文

闸北网站建设公司邹城市网站建设

闸北网站建设公司,邹城市网站建设,黄冈论坛百度贴吧,怎么做百度里面自己的网站Linux驱动开发-字符设备驱动开发 一,Linux驱动开发二,字符设备驱动开发1.具体实现2.1.1驱动模块具体函数实现2.1.2 应用调试模块具体函数实现2.1.3 Makefile2.1.4 进行测试2.1.4.1创建节点2.1.4.2 加载和卸载驱动模块2.1.4.3 测试 2.字符设备驱动应用程序…

Linux驱动开发-字符设备驱动开发

  • 一,Linux驱动开发
  • 二,字符设备驱动开发
    • 1.具体实现
      • 2.1.1驱动模块具体函数实现
      • 2.1.2 应用调试模块具体函数实现
      • 2.1.3 Makefile
      • 2.1.4 进行测试
        • 2.1.4.1创建节点
        • 2.1.4.2 加载和卸载驱动模块
        • 2.1.4.3 测试
    • 2.字符设备驱动应用程序(linux应用)调用驱动程序(linux驱动)
  • 三,其他小问题
    • 1.内核中的加载函数为什么前面有__init
    • 2.设备树干什么用
    • 3.内核空间和用户空间

一,Linux驱动开发

  Linux 驱动是内核的一部分,负责管理硬件设备并与用户空间程序交互,使操作系统能够控制硬件设备(如网卡、显卡、传感器等)。
  驱动类型:①字符设备驱动:以字节流方式访问设备,包括,IIC,SPI,按键,键盘,鼠标,串口和LED。②块设备驱动:以块为单位访问,包括硬盘,SSD和SD卡。③网络设备驱动:管理网络接口,处理数据包的发送和接收。

二,字符设备驱动开发

  驱动有两种方式:①将驱动编写到内核中,内核启动时就会自动运行驱动程序。②将驱动编译成模块(.ko),内核启动后使用命令加载驱动模块。下面的选择第二种。
在这里插入图片描述

1.具体实现

2.1.1驱动模块具体函数实现

#include <linux/module.h>
#include<linux/kernel.h>
#include<linux/init.h>
#include<linux/fs.h>
#include <linux/string.h>
#include <linux/slab.h>
#include <linux/uaccess.h>
#include <linux/io.h>
#include <linux/types.h>#define CHRDEVBASE_MAJOR 200 //设备号
#define CHRDEVBASE_NAME "chrdevbase" //设备名
static char readbuf[100],writebuf[100];
static char kernel_date[100]={"kernel date 88888"};static int chrdevbase_open(struct inode *inode,struct file *filp)
{//printk("OPEN FILE!!!\r\n");return 0;//为0时,证明打开了,其他值说明出现错误
}
static int chrdevbase_release(struct inode *inode,struct file *filp)
{//printk("CLOSE FILE!!!\r\n");return 0;//为0时,证明打开了,其他值说明出现错误
}
static ssize_t chrdevbase_read(struct file *filp,__user char *buf,size_t count,loff_t *ppos)
{//printk("READ FILE!!!\r\n");int ret = 0;memcpy(readbuf,kernel_date,sizeof(kernel_date));ret = copy_to_user(buf,readbuf, count);if(ret == 0){printk("read_kernel_success\r\n");}else printk("read_kernel_error\r\n");return 0;
}
static ssize_t chrdevbase_write(struct file *filp,const char __user *buf,size_t count,loff_t *ppos)
{//printk("WRITE FILE!!!\r\n");int ret = 0;ret = copy_from_user(writebuf, buf,count);if(ret == 0){printk("write_kernel_success,write date=%s\r\n",writebuf);}else printk("write_kernel_error\r\n");return 0;
}
static struct  file_operations chrdevbase_fops={.owner = THIS_MODULE,.open = chrdevbase_open,.release = chrdevbase_release,.read = chrdevbase_read,.write = chrdevbase_write,
};
static int __init chrdevbase_init(void)//加载函数
{int ret = 0;printk("INIT\r\n");/*注册字符设备*/ret = register_chrdev(CHRDEVBASE_MAJOR, CHRDEVBASE_NAME,&chrdevbase_fops);if(ret<0){printk("INIT ERROR\r\n");}return 0;
}
static void __exit chrdevbase_exit(void)//卸载函数
{printk("EXIT\r\n");/*注消字符设备*/unregister_chrdev(CHRDEVBASE_MAJOR, CHRDEVBASE_NAME);
}module_init(chrdevbase_init);//入口
module_exit(chrdevbase_exit);//出口MODULE_LICENSE("GPL");
MODULE_AUTHOR("wyt");

2.1.2 应用调试模块具体函数实现

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>/*具体在串口输入比如读:./chrdevAPP /dev/chrdevbase 1       1表示读,如果是写操作 后面换成2*/
int main(int argc,char *argv[])
//argc:应用程序串口输入的参数个数 ,argc[]:具体参数内容,字符串格式,这个就是串口输入,比如argv[0]就是./chrdevAPP
{int ret = 0;int fd =0;char read_buf[100],write_buf[100];char *filename;filename = argv[1];char write_date[100]={"CCCCCC  NNNNNN CCCCCC"};if(argc!=3)//判断输入是不是三个变量{printf("input error!");return -1;}/*open*/fd = open(filename, O_RDWR);//打开文件函数,打开为0,不然为-1// if(fd<0)// {//     //printf("cannot open file(APP)\r\n");//     return -1;// }if(atoi(argv[2]) == 1)//atoi函数将字符串转化为int型{/*read*/ret = read(fd, read_buf,30);if(ret==0){printf("kernel date =%s\r\n",read_buf);return 0;}}if(atoi(argv[2]) == 2){/*write*/memcpy(write_buf,write_date,sizeof(write_date));ret = write(fd,write_buf,30);if(ret<0){//printf("cannot write file(APP)\r\n");return -1;}}/*close*/ret =close(fd);if(ret<0){printf("cannot close file(APP)\r\n");return -1;}   return 0;
}

2.1.3 Makefile

KERNELDIR :=/home/wyt/linux/linux-imx-rel_imx_4.1.15_2.1.0_alientek 
//指定内核源码路径CURRENT_PATH := $(shell pwd) //获取当前路径obj-m := chrdevbase.o //obj-m会将.c编译为.ko文件build: kernel_modules //定义构建目标build,依赖于kernel_moduleskernel_modules:$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules
//$(MAKE) 即make命令   -C $(KERNELDIR):切换到内核源码目录执行编译  
//指定模块源码所在目录,最终实现 在内核源码目录下,使用当前目录中的原码编译出内核模块
clean:$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean//在内核源码目录下,清理当前目录编译生成的文件

2.1.4 进行测试

2.1.4.1创建节点

  驱动加载需要在/dev/下创建一个与之对应的字符设备节点,应用程序通过操作这个节点文件从而对具体设备完成具体操作。c代表字符型设备,200是主设备号,0次设备号。
在这里插入图片描述

2.1.4.2 加载和卸载驱动模块

  创建/lib/modules/4.1.15目录,利用modprobe命令加载驱动模块(若出现cant open modules.dep,使用depmod命令即可)。

在这里插入图片描述查看当前系统中是否有chrdevbase这个设备:
请添加图片描述
卸载驱动模块:
在这里插入图片描述

2.1.4.3 测试

读(1)和写(2)操作:
在这里插入图片描述

2.字符设备驱动应用程序(linux应用)调用驱动程序(linux驱动)

在这里插入图片描述
在这里插入图片描述

  C库中函数通过到系统调用到内核的过程:C库函数内部会调用系统调用,将请求传递给内核,每个系统调用都有一个唯一的系统调用号,系统调用参数通过寄存器传递给内核,通过软中断触发从用户空间到内核空间的切换,内核会根据系统调用号找到对应的处理函数,执行具体操作,然后将结果返回给用户空间。

三,其他小问题

1.内核中的加载函数为什么前面有__init

  static int __init chrdevbase_init(void)加上__init:__init 是一个宏,用于标记初始化函数,作用是告诉编译器这个函数放在内核的初始化段中,从而在函数执行完后释放其占用的内存。同理__exit:用于标记模块的退出函数,表示该函数在模块卸载时执行。

2.设备树干什么用

  简单来说就是让不同的板子能够使用一个内核+不同的设备树,从而不用频繁更改内核了。设备树是一种硬件信息的数据结构,使得内核支持多种硬件平台。在传统方式中,硬件信息直接硬编码在内核源码中,导致内核难以支持多种硬件平台,使用设备树后,硬件信息独立于内核源码,内核通过解析设备树文件获取硬件信息。硬件信息包括:CPU架构,内存布局,外设信息,中断控制和时钟配置。

3.内核空间和用户空间

 &emsp①内核空间:操作系统运行的区域,只有内核代码能访问,特点有:最高权限,内核空间内存有保护,用户空间程序无法直接访问,稳定性高。主要管理CPU,内存和网络等;提供系统调用接口;实现进程调度,内存管理和文件系统等核心功能。
 &emsp②用户空间:用户程序运行的空间,包括应用程序和库函数,通过系统调用访问内核空间,特点:运行在较低级别,只能访问自己的内存区域,稳定性较低。


文章转载自:

http://Zjqjq02N.phcqk.cn
http://hVA781Vw.phcqk.cn
http://COvjNcUP.phcqk.cn
http://LvqrDJgh.phcqk.cn
http://RjOXmlYE.phcqk.cn
http://kzJJcF33.phcqk.cn
http://ZHtqYX6k.phcqk.cn
http://YNtnYIXL.phcqk.cn
http://8A1xlz8M.phcqk.cn
http://ma4pRJyQ.phcqk.cn
http://aqT5YyTi.phcqk.cn
http://XMw0Lfsy.phcqk.cn
http://QhZsRBDx.phcqk.cn
http://u6rgwdE5.phcqk.cn
http://CaixHEwV.phcqk.cn
http://oyS2M7hw.phcqk.cn
http://mFs8bHGp.phcqk.cn
http://FiJ760IE.phcqk.cn
http://71N8Obuh.phcqk.cn
http://msqtFE4v.phcqk.cn
http://Rd03A2wo.phcqk.cn
http://uFBmTUy2.phcqk.cn
http://SjjH4IOt.phcqk.cn
http://J75ras06.phcqk.cn
http://27BhrXOm.phcqk.cn
http://xWbYJD0j.phcqk.cn
http://uLj2jG7w.phcqk.cn
http://5mueu3kz.phcqk.cn
http://Z5gNwKvq.phcqk.cn
http://GKAi6YA0.phcqk.cn
http://www.dtcms.com/wzjs/678977.html

相关文章:

  • 做网站要多长时间暑假旅游最适合的城市
  • 网站被备案能建设个人网站 备案备注
  • 网站建设征求意见大型机械网站建设公司
  • 百度网站风格网站开发毕业设计源码
  • 做网站一个月30ipwordpress中英文版如何
  • 自定义网站建站公司西樵网站设计制作
  • 做网站 智域大连广西工程建设质量安全管理协会网站
  • 电子商务网站开发技术论文建筑人才网证书查询
  • 网站脑图怎么做wap网站空间
  • tiktok国际版网页入口企业网站seo平台
  • 西安网站设计哪家公司好微信seo是什么意思
  • 站长网seo综合查询工具google 网站打不开
  • 惠州模板网站商会网站建设
  • 国外购买域名的网站朝阳住房和城乡建设官方网站
  • 横翻网站模版自己做免费网站难吗
  • 怎样创建企业网站wordpress手机验证注册
  • 滨州网站建设腾度三网一体网站建设
  • 做中东服装有什么网站知名的网络公司
  • 企业网站制作托管minify wordpress
  • 动漫网站设计源代码wordpress 首页调用文章
  • 在vs2010里怎么做网站模仿别人网站
  • 把网站提交给百度大侠seo外链自动群发工具
  • 个人网站能不能做论坛网站的推广和宣传工作如何做
  • 免费做外贸网站狮山网站制作
  • 安徽省建设厅官方网站进不去巩义网站建设联系电话
  • 网站建设工作落实情况我的网站模板下载 迅雷下载 迅雷下载
  • 内蒙包头网站开发网站设计制作电话多少
  • 广东省建设工程金匠奖公布网站服务器安全配置
  • 织梦响应式网站wordpress 中文 图片
  • 网站建设软硬件要求苏州建筑业网