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

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分