热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

驱动代码编译和测试

目录一、交叉编译测试文件及驱动发送至树莓派1、驱动编译与发送2、测试文件交叉编译与发送二、测试驱动1、加载内核驱动2、更改权限3、运行测试文件调用驱动一、交叉编译测试文件及驱动发送

目录

  • 一、交叉编译测试文件及驱动发送至树莓派
    • 1、驱动编译与发送
    • 2、测试文件交叉编译与发送
  • 二、测试驱动
    • 1、加载内核驱动
    • 2、更改权限
    • 3、运行测试文件调用驱动


一、交叉编译测试文件及驱动发送至树莓派

1、驱动编译与发送

驱动框架程序:

#include <linux/fs.h> //file_operations声明
#include <linux/module.h> //module_init module_exit声明
#include <linux/init.h> //__init __exit 宏定义声明
#include <linux/device.h> //class devise声明
#include <linux/uaccess.h> //copy_from_user 的头文件
#include <linux/types.h> //设备号 dev_t 类型声明
#include <asm/io.h> //ioremap iounmap的头文件static struct class *pin4_class;
static struct device *pin4_class_dev;static dev_t devno; //设备号
static int major &#61;231; //主设备号
static int minor &#61;0; //次设备号
static char *module_name&#61;"pin4"; //模块名//led_open函数
static int pin4_open(struct inode *inode,struct file *file)
{printk("pin4_open\n"); //内核的打印函数和printf类似return 0;
}//led_write函数
static ssize_t pin4_write(struct file *file,const char __user *buf,size_t count, loff_t *ppos)
{return 0;
}static struct file_operations pin4_fops &#61; {.owner &#61; THIS_MODULE,.open &#61; pin4_open,.write &#61; pin4_write,
};int __init pin4_drv_init(void)
{int ret;devno &#61; MKDEV(major,minor); //创建设备号ret &#61; register_chrdev(major, module_name,&pin4_fops); //注册驱动 告诉内核&#xff0c;把这个驱动加入到内核驱动的链表中pin4_class&#61;class_create(THIS_MODULE,"myfirstdemo");pin4_class_dev &#61;device_create(pin4_class,NULL,devno,NULL,module_name); //创建设备文件return 0;
}void __exit pin4_drv_exit(void)
{device_destroy(pin4_class,devno);class_destroy(pin4_class);unregister_chrdev(major, module_name); //卸载驱动}module_init(pin4_drv_init); //入口
module_exit(pin4_drv_exit);
MODULE_LICENSE("GPL v2");

进入如下路径&#xff0c;打开Makefile文件
在这里插入图片描述
Makefile文件里加入如图代码&#xff0c;-m为模块化方式&#xff0c;pin4deiver2为文件名
在这里插入图片描述
输入如下编译&#xff1a;modules模块化方式

ARCH&#61;arm CROSS_COMPILE&#61;arm-linux-gnueabihf- KERNEL&#61;kernel7 make modules

可以看到生成了pin4driver2.ko
在这里插入图片描述
通过scp指令将该ko文件发送到树莓派上 文件路径和ip需要更改

scp drivers/char/pin4driver2.ko pi&#64;192.168.137.6:/home/pi

2、测试文件交叉编译与发送

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main()
{int fd;int a&#61;&#39;1&#39;;fd&#61;open("/dev/pin4",O_RDWR);if(fd<0){printf("open failed\n");perror("reason:");}else{printf("open success\n");}fd&#61;write(fd,&a,1);}

对该.c文件进行交叉编译

arm-linux-gnueabihf-gcc pin4test.c -o pin4test

用scp指令将pin4test文件发送到树莓派上

scp pin4test pi&#64;192.168.137.6:/home/pi

二、测试驱动

1、加载内核驱动

树莓派上输入如下命令

sudo insmod pin4driver2.ko

在这里插入图片描述
在这里插入图片描述
可以看到设备号和程序写的一致

2、更改权限

666所有用户均可读写

sudo chmod 666 /dev/pin4

在这里插入图片描述

3、运行测试文件调用驱动

./pin4test可以看到运行成功&#xff0c;dmesg可以看到内核调用函数成功
在这里插入图片描述


推荐阅读
  • linux 字符串数组初始化,C++字符数组初始化方法的分析
    发现了一个字符数组初始化的误区,而这个往往能导致比较严重的性能问题,分析介绍如下:往往我们在初始化一个字符数组,大概有如下几 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 原文地址http://balau82.wordpress.com/2010/02/28/hello-world-for-bare-metal-arm-using-qemu/最开始时 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • Mono为何能跨平台
    概念JIT编译(JITcompilation),运行时需要代码时,将Microsoft中间语言(MSIL)转换为机器码的编译。CLR(CommonLa ... [详细]
  • 第四讲ApacheLAMP服务器基本配置Apache的编译安装从Apache的官方网站下载源码包:http:httpd.apache.orgdownload.cgi今 ... [详细]
  • C#设计模式之八装饰模式(Decorator Pattern)【结构型】
    一、引言今天我们要讲【结构型】设计模式的第三个模式,该模式是【装饰模式】,英文名称:DecoratorPattern。我第一次看到这个名称想到的是另外一个词语“装修”,我就说说我对“装修”的理 ... [详细]
  • 【技术分享】一个 ELF 蠕虫分析
    【技术分享】一个 ELF 蠕虫分析 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • 本文介绍了在Ubuntu 11.10 x64环境下安装Android开发环境的步骤,并提供了解决常见问题的方法。其中包括安装Eclipse的ADT插件、解决缺少GEF插件的问题以及解决无法找到'userdata.img'文件的问题。此外,还提供了相关插件和系统镜像的下载链接。 ... [详细]
  • 三、查看Linux版本查看系统版本信息的命令:lsb_release-a[root@localhost~]#lsb_release-aLSBVersion::co ... [详细]
  • linux下编译安装lnmp
    2019独角兽企业重金招聘Python工程师标准#######################安装依赖#####################安装必要的包:y ... [详细]
author-avatar
mobiledu2502884677
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有