嵌入式系统开发之驱动篇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 -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

创建Java keystore文件的完整指南及详细步骤

《创建Javakeystore文件的完整指南及详细步骤》本文详解Java中keystore的创建与配置,涵盖私钥管理、自签名与CA证书生成、SSL/TLS应用,强调安全存储及验证机制,确保通信加密和... 目录1. 秘密键(私钥)的理解与管理私钥的定义与重要性私钥的管理策略私钥的生成与存储2. 证书的创建与

linux解压缩 xxx.jar文件进行内部操作过程

《linux解压缩xxx.jar文件进行内部操作过程》:本文主要介绍linux解压缩xxx.jar文件进行内部操作,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、解压文件二、压缩文件总结一、解压文件1、把 xxx.jar 文件放在服务器上,并进入当前目录#

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys