嵌入式系统开发之驱动篇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

相关文章

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

Spring 中的切面与事务结合使用完整示例

《Spring中的切面与事务结合使用完整示例》本文给大家介绍Spring中的切面与事务结合使用完整示例,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录 一、前置知识:Spring AOP 与 事务的关系 事务本质上就是一个“切面”二、核心组件三、完