A40i使用笔记:编译驱动到内核中调用(ubuntu和A40i平台)
一、前言
最近因个人需求和工作需求,准备入坑linux驱动篇,学习了几节课程,简单了解了linux驱动流程,本章前期现介绍开发linux驱动必备的工具,否则后续学习很困难
二、环境
notepadqq
source insight 4
window
Ubuntu16
三、正文
一个良好的开发工具,决定了开发者的心情,使用方便就很容易避免很多问题,这里我推荐使用source insight进行文件编辑,因为他能自动索引文件,到这里就需要介绍一下配置了,下载安装我就不介绍了,破解文件在这里https://download.csdn.net/download/qq_37603131/32673573https://download.csdn.net/download/qq_37603131/32673573
破解完毕之后,需要添加索引资源,资源就是linux内核源码中的include函数,ubuntu下在/usr/include,在A40i的环境中,在/root/workspace/allwinner/A40i/bsp/lichee/linux-3.10中,把里面的include和fs文件夹拷贝出来放在一个文件夹中,这个文件夹任意放在一个位置,在source insight中去引用为所有工程,参照此贴介绍https://blog.csdn.net/zhuzitop/article/details/80310246?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.no_search_link&spm=1001.2101.3001.4242https://blog.csdn.net/zhuzitop/article/details/80310246?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.no_search_link&spm=1001.2101.3001.4242
到这里环境就搭建成了
之后就是驱动了,驱动是连接内核与设备的桥梁
驱动主要分为字符设备,块设备,网络设备,对应就是三种类型的驱动,开发难度也是由简变难。
模块编写具备三要素:
1.入口module_init(入口函数)
2.出口module_exit(出口函数)
3.GPL协议申明 MODULE_LICENSE("GPL")
下面就放置一个简单的驱动demo,申请设备号,初始化dev结构体,注册字符设备,释放
linux_test.c
#include <linux/init.h> /* For init/exit macros */
#include <linux/module.h> /* For MODULE_ marcros */
#include <linux/cdev.h>
#include <linux/fs.h>dev_t devno;
struct cdev *cdevp=NULL;int demo_open(struct inode *inode, struct file *filp)
{printk(KERN_ALERT "demo_opennnnnnnnnnnn\n");return 0;
}int demo_release(struct inode *inode, struct file *filp)
{printk(KERN_ALERT "demo_releaseeeeeeeeee\n");return 0;}struct file_operations fops = {.owner = THIS_MODULE,.open = demo_open,.release = demo_release,
};static int __init hx711_init(void)
{int ret =0;ret = alloc_chrdev_region(&devno,0,3,"demo");if(ret<0){printk(KERN_ERR "alloc_chrdev_region err\n");goto err1;}printk(KERN_INFO "start major = %d\n",MAJOR(devno));cdevp = cdev_alloc();if(cdevp == NULL){printk(KERN_ERR "cdev_alloc err\n");ret = -ENOMEM;goto err2; }cdev_init(cdevp,&fops);ret = cdev_add(cdevp,devno,3);if(ret<0){printk(KERN_ERR "cdev_add err\n");goto err2;}printk(KERN_ALERT "Hello, worldkkkkkkkbbbbbbbbbqqqqqqqq\n");return ret;err2:unregister_chrdev_region(devno, 3);err1:return ret;}static void __exit hx711_exit(void)
{cdev_del(cdevp);unregister_chrdev_region(devno, 3);printk(KERN_ALERT "Goodbye, cruel worldkkkkkkbbbbbbbqqqqqqq\n");
}
module_init(hx711_init);//三要素 必须有
module_exit(hx711_exit);//三要素 必须有
MODULE_LICENSE("GPL");//三要素 必须有
MODULE_AUTHOR("kbq-1950361006@qq.com");//模块作者的声明
MODULE_DESCRIPTION("HX711 Driver");//当前模块的功能描述
Makefile
ifneq ($(KERNELRELEASE),)obj-m := linux_test.oelsePWD := $(shell pwd)KVER := $(shell uname -r)KDIR := /lib/modules/$(KVER)/build/all: $(MAKE) -C $(KDIR) M=$(PWD) modules clean: rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions endif
makefile的编写一定要注意格式,有些语句一定要以TAB按键开头
之后执行make,就编译驱动啦,生成ko文件
编写好测试驱动后就是用函数测试
- modinfo linux_test.ko查看内核模块信息
- lsmod查看当前已经加载的内核模块
- insmod linux_test.ko加载内核模块到内核中
- rmmod linux_test.ko卸载内核模块
- dmesg查看日志信息
- dmesg -c清除日志信息
以上的方式编译的驱动是利用Ubuntu的内核源码编译的,无法在a40i设备上加载
具体在Ubuntu中编译能在a40i中加载的驱动目前未实现使用makefile单独编译,可以随着全局编译附带这编译,也算是解决燃眉之急的一种方法,方法如下:
针对于A40i,其他平台没用过不知道
1.在/root/workspace/allwinner/A40i/bsp/lichee/linux-3.10/drivers路径下创建一个文件夹,放置自己写的驱动文件,我起的名字为0myself_driver,排在第一个寻找方便,管理不乱
2.修改同级文件makefile,打开makefile,在最后一行加入obj-m += 0myself_driver/**/**.o ,这里用的是obj-m,意思是单独编译模块,生成ko文件,而不是obj-y编译进入内核,生成o文件,**指的是自己写的某一个驱动文件夹,**.o指的是自己写的某一个驱动**.c
3.到/root/workspace/allwinner/A40i/bsp/lichee路径下打开控制台,执行全局编译./build.sh,不用等待到编译完毕,发现自己的驱动ko文件即生成完毕,拿去用就可以了
四、结语
本篇文章实际和全志a40i没有多大的关系,算是我在全志a40i平台上开始使用驱动开发的开篇吧
A40i使用笔记:编译驱动到内核中调用(ubuntu和A40i平台)相关推荐
- imx8系列-迅为i.MX8M Mini开发板Android9如何编译驱动到内核
迅为I.MX8MM 开发平台是基于恩智浦的 NXP i.MX 8M Mini 处理器设计开发的一款产品.NXP i.MX 8M Mini 处理器致力于提供出色的视频和音频体验,将媒体的特定功能与针对低 ...
- linux内核 mpls,将MPLS编译进linux内核中
系统环境:linux kernel 2.6.35.(此环境是上一篇文章中将ubuntu内核替换后的环境) 编译过程如下: 1)首先需要下载patch文件:linux-kernel-v2.6.35-mp ...
- linux3.10内核支持mpls,将MPLS编译进linux内核中
系统环境:linux kernel 2.6.35.(此环境是上一篇文章中将ubuntu内核替换后的环境) 编译过程如下: 1)首先需要下载patch文件:linux-kernel-v2.6.35-mp ...
- X64驱动:内核中的文件回调
无论在用户层还是内核层,操作文件的流程基本一致,除了在API函数上的区别(用户层调用用户层API,内核层调用内核API)以外其他基本一致,先讲解一下文件系统执行的流程. 以NTFS文件系统为例:假设我 ...
- vert.x笔记:4.vert.x中调用spring服务
evenbus事件总线介绍: 在介绍怎么在vert.x中集成spring服务前,我们要先简单介绍一下什么是vert.x的事件总线. eventbus是vert.x的神经总线,每个vert.x实例维护了 ...
- linux下静态编译mupdf,在Qt中调用Mupdf库进行pdf显示
2018.5.10 更新内存对齐说明 感谢知乎网友@孤独子狮指出QImage处需要考虑内存对齐的问题.因为本人缺乏跨平台.图形库开发经验,所以在调试成功后就没有深入探究. 主要修改了QImage的构造 ...
- Python学习笔记之六:在VS中调用Python
1,安装配置好Python本身的运行环境,以能在命令行下运行py脚本为准 2,将Python的根目录下的include文件夹,添加到VS的项目属性->配置属性->C/C++->&qu ...
- Linux驱动(8)--内核编译与配置
内核编译与配置 1. Menuconfig 2. Kconfig 3. Makefile 4. 内核配置与编译的流程 5. 注意 1. Menuconfig Linux编译器是通过.config文件确 ...
- Linux内核配置网口驱动,linux内核编译,配置本机驱动
1.前言 编译linux内核失败的原因很多时候就是驱动选错,适合自己本机的驱动没编译进去.面对特殊平台(或者有些洁癖者,我就是^_^),要编译精简内核,只要本机驱动,其他都不需要.面对内核里面这么多驱 ...
最新文章
- 12、Kubernetes核心技术Ingress
- C#(WINFORM)学习
- C#中HttpClient使用注意:预热与长连接
- 实现多线程的方式之实现Callable接口
- 简单的libevent例子
- hb-550s计算机电源,XFX TS 550金牌电源拆解及电路分析
- java数组的声明学号姓名线性结构_20172302 《Java软件结构与数据结构》实验一:线性结构实验报告...
- java ipmitool_ipmitool使用手册
- python3安装教程win10_在win10和linux上分别安装Python虚拟环境|python3教程|python入门|python教程...
- RS485通信原理图及程序实例详解
- RFID的现状与今后动向 - 2.1 周波数的动向
- JAVA-CPU飙高问题排查
- 分析注释 sequence_input_layer.py
- raptor流程图赋值语句_用raptor软件画出以下程序的流程图,将结果的截图复制到答题框中...
- 从腾讯企业邮箱转到网易企业邮箱的正确姿势
- 【MATLAB】Linux下的matlab的安装
- vrep教程(十一)通过rosInterface控制vrep中的机械臂
- 数字信号处理|Matlab设计巴特沃斯低通滤波器(冲激响应不变法和双线性变换法)
- 图书馆管理系统--stage2核心代码实现
- 【思维导图软件哪个好】万彩脑图大师教程 | 编辑思维导图背景
热门文章
- 苹果7防水吗_苹果新品 iPhoneSE 文案,戏精附体
- 【科研工具】审稿人第一眼只看配图?
- 实体店店铺管理软件应该怎么挑?有这几个功能的错不了!
- 在excel表中如何实现手动换行
- 摄影吴师自通 构图01 五分钟掌握构图技巧
- vue发送Http请求之XMLHttpRequest
- RuoYiApplication: Failed to retrieve application JMX service URL解决方法
- SqlServer数据库SQL语句(超详细)
- 简单实用-且免费使用的内网穿透软件
- “当迷茫时就回到原点,或者退一步再思考” | 技术人金句系列