tiny4412--linux驱动学习(2)

在ubuntu下编写验证字符设备驱动

并移植到arm开发板上

1,准备工作

  1.   uname -r  查看电脑版本信息
  2.        apt-get  install  linux-source  安装相应版本的linux内核

 

2,编写驱动程序

    Global CharDev.c

/* GlobalCharDev.c */
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>#include <asm/uaccess.h>#define DEV_NAME "GlobalChar"static ssize_t GlobalRead(struct file *, char *, size_t, loff_t *);
static ssize_t GlobalWrite(struct file *, const char *, size_t,loff_t *);static int char_major = 0;
static int GlobalData = 0; /* "GlobalChar"设备的全局变量 *//* 初始化字符设备驱动的 file_operations 结构体 */
struct file_operations globalchar_fops = 
{.read = GlobalRead,.write = GlobalWrite
};/* 模块初始化 */
static int __init GlobalChar_init(void)
{int ret;ret = register_chrdev(char_major, DEV_NAME, &globalchar_fops);/* 注册设备驱动,_driver_char_misc.c 第290行参考  */if(ret < 0 )printk(KERN_ALERT "GlobalChar Reg Fail\n");else{printk(KERN_ALERT "GlobalChar Reg Success\n");char_major = ret;printk(KERN_ALERT "Major = %d\n", char_major);}return ret;
}/* 模块卸载函数 */
static void __exit GlobalChar_exit(void)
{unregister_chrdev(char_major, DEV_NAME); /* 注销设备驱动 */return;
}/* 模块驱动读函数 */
static ssize_t GlobalRead(struct file *file, char *buf, size_t len, loff_t *off)
{if (copy_to_user(buf, &GlobalData ,sizeof(int)))  {/* 从内核复制 GlobalData 到用户空间*/return -EFAULT;}return sizeof(int);
}
/* 模块驱动写函数 */ static ssize_t GlobalWrite(struct file *file, const char *buf, size_t len, loff_t *off) {if (copy_from_user(&GlobalData, buf, sizeof(int))){/* 从用户复制 GlobalData 到内核 */return -EFAULT;}return sizeof(int); }module_init(GlobalChar_init); module_exit(GlobalChar_exit);MODULE_LICENSE("GPL"); MODULE_AUTHOR("dongjin");

 

  Makefile

ifneq ($(KERNELRELEASE),)    obj-m := GlobalCharDev.o
else# KERNELDIR ?= /lib/modules/$(shell uname -r)/buildKERNELDIR ?= /usr/src/linux-headers-$(shell uname -r)       //这两个都可以PWD := $(shell pwd)default:$(MAKE) -C $(KERNELDIR) M=$(PWD) modulesclean:rm -rf rm -rf *.ko *.mod* *.o* *.sy*
endif

   理解:

      pwd-->  驱动文件目录

      kerneldir -->  内核源码目录

      default -->  表示到内核源码目录中去编译pwd下的驱动文件

——————————————————————————————————————————————————————

          make 编译

root@ubuntu:/home/arm/data/char_driver# make
make -C /usr/src/linux-headers-4.4.0-31-generic M=/home/arm/data/char_driver modules
make[1]: 正在进入目录 `/usr/src/linux-headers-4.4.0-31-generic'
  CC [M]  /home/arm/data/char_driver/GlobalCharDev.oBuilding modules, stage 2.MODPOST 1 modulesLD [M]  /home/arm/data/char_driver/GlobalCharDev.ko
make[1]:正在离开目录 `/usr/src/linux-headers-4.4.0-31-generic'

 

出现Global CharDev.ko文件

2,insmod Global CharDev.ko  将模块加入内核

3,cat  /proc/devices  查看驱动设备

 

 

4,mknod  /dev/GlobalChar   c  247  0      根据相应的设备号,建立设备节点。

5,测试文件

/* GlobaiCharText.c 测试文件*/#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>#define DEV_NAME "/dev/GlobalChar"int main()
{int fd, num;/* 打开设备文件 */fd = open(DEV_NAME, O_RDWR, S_IRUSR | S_IWUSR);if(fd < 0){printf("Open Device Fail!\n");return -1;}/* 读取当前设备数值 */read(fd, &num, sizeof(int));printf("The GlobalChar is %d\n", num);printf("Please input a numble written to GlobalChar: ");scanf("%d", &num);/* 写入新的数值 */write(fd, &num, sizeof(int));/* 重新读取数值 */read(fd, &num, sizeof(int));printf("The GlobalChar is %d\n", num);close(fd);return 0;}

 

   gcc -o  GlobalCharText  GlobalCharText.c      编译出可执行文件

   执行:

root@ubuntu:/home/arm/data/char_driver# ./a.out 
The GlobalChar is 0
Please input a numble written to GlobalChar: 111
The GlobalChar is 111

 

——————————————————————————————————————————————————————————————————————

通过NFS我们可以建立共享目录,将编写好的驱动加载到arm板,当然也需要配置环境变量。

1,驱动文件:需要将Make file中KERNLDIR 改成 自己下载内核的地址,如:

    KERNELDIR ?= /home/arm/linux-4.4

 

 

 

2,测试文件:理所当然我们需要使用交叉编译去编译出可执行文件。

注意:首先我们要知道自己制作的做小系统是采用静态编译还是动态编译,我的采用静态编译

  1,静态:

  2,动态:

需要在制作最小系统时,在  /lib  下加入所需的动态交叉编译库(所选交叉编译工具目录下的链接库),但是我在制作randisk的过程中,提示内存不足,暂没查找其原因。

 

如果在静态根文件系统内使用动态编译链所编译的elf,会提示:-sh:./test:no found  (这里 not found 指的是 链接库)

 

测试:

 

卸载:

1,删除  /dev  下的设备节点

  rm /dev/GlobalChar

2,卸载驱动

  rmmod  GlopbalCharDev.ko 

出现问题:

 

 

——————————————————————————————————————————————————————

参考:

http://tieba.baidu.com/p/3645403366

https://blog.csdn.net/Ultraman_hs/article/details/53239455

解决移植到arm上不兼容的问题

 

https://blog.csdn.net/zqj6893/article/details/48439711

解决驱动卸载问题

转载于:https://www.cnblogs.com/chu-yi/p/10671865.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264274.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL操作全集

SQL操作全集 SQL操作全集 下列语句部分是Mssql语句&#xff0c;不可以在access中使用。 SQL分类&#xff1a; DDL—数据定义语言(CREATE&#xff0c;ALTER&#xff0c;DROP&#xff0c;DECLARE) DML—数据操纵语言(SELECT&#xff0c;DELETE&#xff0c;UPDATE&#xff0c;INSE…

osx doc to html,macos – 在OSX上安装Git HTML帮助

从中更改克隆命令地址$sudo git clone git://git.kernel.org/pub/scm/git/git.git git-doc --branch html至$sudo git clone git://git.kernel.org/pub/scm/git/git-htmldocs.git git-doc希望很快就会在Github教程中进行更改.更新&#xff1a;如果您是认为使用Xcode 4提供Apple…

select poll使用

select poll使用 2.1. 怎样管理多个连接&#xff1f;“我想同一时候监控一个以上的文件描写叙述符(fd)/连接(connection)/流(stream)&#xff0c;应该怎么办&#xff1f;” 使用 select() 或 poll() 函数。 注 意&#xff1a;select() 在BSD中被引入&#xff0c;而poll()是Sy…

如何用distinct消除重复记录的同时又能选取多个字段值?

如何用distinct消除重复记录的同时又能选取多个字段值&#xff1f; 需求是&#xff1a;我要消除name字段值重复的记录&#xff0c;同时又要得到id字段的值&#xff0c;其中id是自增字段。 select distinct name from t1 能消除重复记录&#xff0c;但只能取一个字段&#xf…

学计算机需要多少内存,电脑内存多大才够用

现在内存的价钱越来越便宜&#xff0c;很多新装机的朋友都已经在使用1GB的内存&#xff0c;而还有很多人也在给老电脑的内存升级。在升级了物理内存之后&#xff0c;如何有效设置虚拟内存才能获得最大限度的性能提升?网上流传的一些优化虚拟内存的方法真的有效吗?下面学习啦小…

2019十二省联考游记

这次省选真的经历了很多&#xff0c;虽然最后一波三折进了省队&#xff0c;但还是留下了许多遗憾。 DAY1 进考场先看T1&#xff0c;区间线性基&#xff1f;想了想大概像超级钢琴那样做&#xff1f;但trie树上怎么查区间第k大&#xff1f;一时间没想出来。咦&#xff01;暴力60分…

Android开发学习笔记-自定义对话框

系统默认的对话框只能显示简单的标题内容以及按钮&#xff0c;而如果想要多现实其他内容则就需要自定义对话框&#xff0c;下面是自定义对话框的方法。 1、先定义对话框的模版 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:andro…

TreeView控件二(递归算法)

扩展了一下。每个控件都有其独特的写法和用法&#xff0c;treeview就是这样的一个控件。做个类似资源管理器的页面。如果逐层遍历&#xff0c;代码会不断重复&#xff0c;所以这时需要用递归算法 Codepublic static void TreeBindMethod(TreeView tvFile,string target) …

计算机中桌面中不显示U盘图标,电脑不显示u盘怎么回事 电脑不显示u盘的解决办法...

在平时的工作中&#xff0c;我们会经常使用到U盘来拷贝资料&#xff0c;U盘便于携带并且储存量大&#xff0c;所以很受大家的欢迎。但是平时我们在拷贝资料将U盘插入电脑中&#xff0c;会发现U盘在电脑中不显示&#xff0c;即使在桌面上仔细寻找也无济于事。这种情况小编也有遇…

js中的cookie使用和vue-cookie的使用

在HTTP协议的定义中&#xff0c;采用了一种机制来记录客户端和服务器端交互的信息&#xff0c;这种机制被称为cookie&#xff0c;cookie规范定义了服务器和客户端交互信息的格式、生存期、使用范围、安全性。 在JavaScript中可以通过 document.cookie 来读取或设置这些信息。由…

asp上传错误:此键已与该集合的一个元素关联

在做一个图片上传的时候&#xff0c;提示“此键已与该集合的一个元素关联”&#xff0c;错误是出现在无组件上传的文件里。 查了一下原来是由于提交数据的页面中出现了页面控件重名的问题&#xff0c;可能是页面中用到的多选项同名引起的&#xff0c;虽然报错&#xff0c;但不影…

spring-在配置文件中配置DAO时直接引用DataSource

一、创建spring项目 项目名称&#xff1a;spring101306二、在项目上添加jar包 1.在项目中创建lib目录 /lib 2.在lib目录下添加spring支持 commons-logging.jar junit-4.10.jar log4j.jar mysql-connector-java-5.1.18-bin.jar …

计算机基础知识总结及自学,计算机基础知识的简单总结

我说明一下&#xff0c;本文只是基于作者的个人理解所作出的总结&#xff0c;如果有什么不对的地方&#xff0c;希望大家给我指正&#xff0c;我会尽快更正的。我也想通过51cto这个大平台&#xff0c;能够与大家一同学习&#xff0c;一同交流&#xff0c;一同进步。1.计算机的组…

【转载】网络流和最小费用流

这段时间复习了下网络流模型&#xff0c;感觉比以前的理解有了长足进展&#xff0c;虽然我知道这东西难就难在建模上&#xff0c;而它的算法本身其实难度不大&#xff0c;但我还是决定说一些我的理解&#xff0c;毕竟理解了本质的东西运用起来才会更灵活。最大流的求解一般有两…

实验1.1

转载于:https://www.cnblogs.com/P201821430028/p/10689308.html

札记__ADT:URL,Lua:strlen方法

2019独角兽企业重金招聘Python工程师标准>>> 01&#xff0c;Android ADT 在线更新的URL&#xff1a; https://dl-ssl.google.com/android/eclipse/ 02&#xff0c;Lua中字符串长度的判断可以使用 # local str "abcabc" print(#str) --6 print(#"a…

vue路由添加.html,怎么使用VueRouter的addRoutes方法实现动态添加用户的权限路由

怎么使用VueRouter的addRoutes方法实现动态添加用户的权限路由发布时间&#xff1a;2021-04-26 13:34:44来源&#xff1a;亿速云阅读&#xff1a;76作者&#xff1a;小新小编给大家分享一下怎么使用VueRouter的addRoutes方法实现动态添加用户的权限路由&#xff0c;希望大家阅读…

vue中的适配:px2rem

这应该是vue项目在适配移动端时候&#xff0c;最简单的方法之一下面是基本步骤&#xff08;使用cnpm&#xff09;1.下载并引入lib-flexible cnpm install --save lib-flexible 在main.js中 &#xff1a;import ‘lib-flexible/flexible’2.引入px2rem-loader cnpm install --sa…

SQL Server 2005参考:Apply运算符

SQL Server 2005参考&#xff1a;Apply运算符 使用 APPLY 运算符可以为实现查询操作的外部表表达式返回的每个行调用表值函数。表值函数作为右输入&#xff0c;外部表表达式作为左输入。通过对右输入求值来获得左输入每一行的计算结果&#xff0c;生成的行被组合起来作为最终输…

Java高级篇 -- List选择及优化

为什么80%的码农都做不了架构师&#xff1f;>>> 在java编程中&#xff0c;我们常常使用到java自带的集合类List 以下为几点简单的优化建议&#xff1a; 1.Vector还是ArrayList Vector有其特有有点&#xff0c;其每个方法都为同步方法【synchronized】&#xff0c…