嵌入式系统开发之驱动篇002——完整的linux驱动 + 应用测试demo(神文)

2024-02-05 09:08

本文主要是介绍嵌入式系统开发之驱动篇002——完整的linux驱动 + 应用测试demo(神文),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://blog.csdn.net/u010164190/article/details/52965530


驱动代码

driverdemo.c

[cpp]  view plain copy
  1. #include <linux/module.h>  
  2. #include <linux/init.h>  
  3. #include <linux/types.h>  
  4. #include <linux/fs.h>  
  5. #include <linux/mm.h>  
  6. #include <linux/cdev.h>  
  7. #include <linux/errno.h>  
  8. #include <linux/sched.h>  
  9. #include <asm/io.h>  
  10. #include <asm/system.h>  
  11. #include <asm/uaccess.h>  
  12. #define simple_MAJOR 200  
  13. static unsigned char simple_inc=0;  
  14. static char demoBuffer[256];  
  15. int simple_open(struct inode *inode,struct file *filp){  
  16.     if(simple_inc>0) return -ERESTARTSYS;  
  17.     simple_inc++;  
  18.     return 0;  
  19. }  
  20. int simple_release(struct inode *inode,struct file *filp){  
  21.     simple_inc--;  
  22.     return 0;  
  23. }  
  24. ssize_t simple_read(struct file *filp,char __user *buf,size_t count,loff_t *f_pos){  
  25.     if(copy_to_user(buf,demoBuffer,count)){  
  26.         count=-EFAULT;  
  27.     }  
  28.     return count;  
  29. }  
  30.   
  31. size_t simple_write(struct file *file,const char __user *buf,size_t count,loff_t *f_pos){  
  32.     if (copy_from_user(demoBuffer + *f_pos,buf,count)){  
  33.         count = -EFAULT;  
  34.     }  
  35.     return count;  
  36. }  
  37.   
  38. void simple_cleanup_module(void){  
  39.     unregister_chrdev(simple_MAJOR,"simple");  
  40.     printk("simple_cleanup_module!\n");  
  41.   
  42. }  
  43.   
  44. static const struct file_operations simple_fops={  
  45.     .owner=THIS_MODULE,  
  46.     .open=simple_open,  
  47.     .release=simple_release,  
  48.     .read=simple_read,  
  49.     .write=simple_write,      
  50. };  
  51.   
  52. int simple_init_module(void){  
  53.     int ret;  
  54.     ret=register_chrdev(simple_MAJOR,"simple",&simple_fops);  
  55.     if(ret<0){  
  56.         printk("Unable to register character device %d!/n",simple_MAJOR);  
  57.         return ret;  
  58.     }  
  59.     return 0;  
  60. }  
  61.   
  62. module_init(simple_init_module);  
  63. module_exit(simple_cleanup_module);  
  64.   
  65. MODULE_LICENSE("Dual BSD/GPL");  

Makefile 文件 
[plain]  view plain copy
  1. ifeq ($(KERNELRELEASE),)  
  2.     KERNELDIR ?=/usr/src/linux-2.6.29.4  
  3.     INCLUDE ?=./  
  4.     PWD :=$(shell pwd)  
  5. modules:  
  6.     $(MAKE) -C $(KERNELDIR) -I $(INCLUDE) M=$(PWD) modules  
  7. modules_install:  
  8.     $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install  
  9. clean:  
  10.     rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions   
  11. else  
  12.     obj-m :=driverdemo.o  
  13. endif  

生成安装驱动
[plain]  view plain copy
  1. make //会生成driverdemo.ko文件   
  2. insmod driverdemo.ko //安装到系统内 需要在root 下运行  

创建设备文件
[cpp]  view plain copy
  1. mknod /dev/fgj c 200 0  
这里我们只要关心200是什么, 200为设备号,也需要在root 下运行

我们在前面代码里

[cpp]  view plain copy
  1. #define simple_MAJOR 200  
这就是设备号


应用程序code

test.c

[cpp]  view plain copy
  1. #include <stdio.h>  
  2. #include <fcntl.h>  
  3. int main(void){  
  4.     int fd;  
  5.     int i;  
  6.     char data[256];  
  7.     int retval;  
  8.     fd=open("/dev/fgj",O_RDWR);  
  9.     if(fd==-1){  
  10.         perror("error open\n");  
  11.         exit(-1);  
  12.     }  
  13.     printf("open /dev/fgj successfully\n");  
  14.     //writing data  
  15.     retval=write(fd,"http://blog.csdn.net/ssihc0",26);  
  16.     if(retval==-1){  
  17.         perror("write error \n");  
  18.         exit(-1);  
  19.     }  
  20.       
  21.     retval=read(fd,data,26);  
  22.     if(retval==-1){  
  23.         perror("read error\n");  
  24.         exit(-1);  
  25.     }  
  26.     data[retval]=0;  
  27.     printf("read successfully:%s\n",data);  
  28.     close(fd);  
  29.     return 0;  
  30.   
  31. }  

生成
[plain]  view plain copy
  1. gcc test.c  

运行./a.out

open /dev/fgj successfully
read successfully:http://blog.csdn.NET/ssihc0

下面是一些我们在驱动开发过程经常要用到的COMMAND

[cpp]  view plain copy
  1. history  
  2. cat /var/log/messages | tail  //看一下我们的调试消息  
  3.   
  4. mknod /dev/fgj c 200 0    //建设备文件   
  5.   
  6. cat /proc/modules | grep d* //查看我们的驱动MODULE  
  7.   
  8. insmod driverdemo.ko   //安装 设备  
  9. rmmod 1-2module.ko   //删除设备  
  10.   
  11. ismod //查看设备信息  
  12.   
  13. dmesg  | tail  //看一下我们的调试消息  
  14.   
  15. insmod test.ko a=3 b=2 AddOrSub=2 //带参数加载驱动  


这篇关于嵌入式系统开发之驱动篇002——完整的linux驱动 + 应用测试demo(神文)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/680421

相关文章

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法

《ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法》本文介绍了Elasticsearch的基本概念,包括文档和字段、索引和映射,还详细描述了如何通过Docker... 目录1、ElasticSearch概念2、ElasticSearch、Kibana和IK分词器部署

Linux流媒体服务器部署流程

《Linux流媒体服务器部署流程》文章详细介绍了流媒体服务器的部署步骤,包括更新系统、安装依赖组件、编译安装Nginx和RTMP模块、配置Nginx和FFmpeg,以及测试流媒体服务器的搭建... 目录流媒体服务器部署部署安装1.更新系统2.安装依赖组件3.解压4.编译安装(添加RTMP和openssl模块

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

PyCharm 接入 DeepSeek最新完整教程

《PyCharm接入DeepSeek最新完整教程》文章介绍了DeepSeek-V3模型的性能提升以及如何在PyCharm中接入和使用DeepSeek进行代码开发,本文通过图文并茂的形式给大家介绍的... 目录DeepSeek-V3效果演示创建API Key在PyCharm中下载Continue插件配置Con

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

CentOS系统Maven安装教程分享

《CentOS系统Maven安装教程分享》本文介绍了如何在CentOS系统中安装Maven,并提供了一个简单的实际应用案例,安装Maven需要先安装Java和设置环境变量,Maven可以自动管理项目的... 目录准备工作下载并安装Maven常见问题及解决方法实际应用案例总结Maven是一个流行的项目管理工具