一、前言

最近因个人需求和工作需求,准备入坑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平台)相关推荐

  1. imx8系列-迅为i.MX8M Mini开发板Android9如何编译驱动到内核

    迅为I.MX8MM 开发平台是基于恩智浦的 NXP i.MX 8M Mini 处理器设计开发的一款产品.NXP i.MX 8M Mini 处理器致力于提供出色的视频和音频体验,将媒体的特定功能与针对低 ...

  2. linux内核 mpls,将MPLS编译进linux内核中

    系统环境:linux kernel 2.6.35.(此环境是上一篇文章中将ubuntu内核替换后的环境) 编译过程如下: 1)首先需要下载patch文件:linux-kernel-v2.6.35-mp ...

  3. linux3.10内核支持mpls,将MPLS编译进linux内核中

    系统环境:linux kernel 2.6.35.(此环境是上一篇文章中将ubuntu内核替换后的环境) 编译过程如下: 1)首先需要下载patch文件:linux-kernel-v2.6.35-mp ...

  4. X64驱动:内核中的文件回调

    无论在用户层还是内核层,操作文件的流程基本一致,除了在API函数上的区别(用户层调用用户层API,内核层调用内核API)以外其他基本一致,先讲解一下文件系统执行的流程. 以NTFS文件系统为例:假设我 ...

  5. vert.x笔记:4.vert.x中调用spring服务

    evenbus事件总线介绍: 在介绍怎么在vert.x中集成spring服务前,我们要先简单介绍一下什么是vert.x的事件总线. eventbus是vert.x的神经总线,每个vert.x实例维护了 ...

  6. linux下静态编译mupdf,在Qt中调用Mupdf库进行pdf显示

    2018.5.10 更新内存对齐说明 感谢知乎网友@孤独子狮指出QImage处需要考虑内存对齐的问题.因为本人缺乏跨平台.图形库开发经验,所以在调试成功后就没有深入探究. 主要修改了QImage的构造 ...

  7. Python学习笔记之六:在VS中调用Python

    1,安装配置好Python本身的运行环境,以能在命令行下运行py脚本为准 2,将Python的根目录下的include文件夹,添加到VS的项目属性->配置属性->C/C++->&qu ...

  8. Linux驱动(8)--内核编译与配置

    内核编译与配置 1. Menuconfig 2. Kconfig 3. Makefile 4. 内核配置与编译的流程 5. 注意 1. Menuconfig Linux编译器是通过.config文件确 ...

  9. Linux内核配置网口驱动,linux内核编译,配置本机驱动

    1.前言 编译linux内核失败的原因很多时候就是驱动选错,适合自己本机的驱动没编译进去.面对特殊平台(或者有些洁癖者,我就是^_^),要编译精简内核,只要本机驱动,其他都不需要.面对内核里面这么多驱 ...

最新文章

  1. 12、Kubernetes核心技术Ingress
  2. C#(WINFORM)学习
  3. C#中HttpClient使用注意:预热与长连接
  4. 实现多线程的方式之实现Callable接口
  5. 简单的libevent例子
  6. hb-550s计算机电源,XFX TS 550金牌电源拆解及电路分析
  7. java数组的声明学号姓名线性结构_20172302 《Java软件结构与数据结构》实验一:线性结构实验报告...
  8. java ipmitool_ipmitool使用手册
  9. python3安装教程win10_在win10和linux上分别安装Python虚拟环境|python3教程|python入门|python教程...
  10. RS485通信原理图及程序实例详解
  11. RFID的现状与今后动向 - 2.1 周波数的动向
  12. JAVA-CPU飙高问题排查
  13. 分析注释 sequence_input_layer.py
  14. raptor流程图赋值语句_用raptor软件画出以下程序的流程图,将结果的截图复制到答题框中...
  15. 从腾讯企业邮箱转到网易企业邮箱的正确姿势
  16. 【MATLAB】Linux下的matlab的安装
  17. vrep教程(十一)通过rosInterface控制vrep中的机械臂
  18. 数字信号处理|Matlab设计巴特沃斯低通滤波器(冲激响应不变法和双线性变换法)
  19. 图书馆管理系统--stage2核心代码实现
  20. 【思维导图软件哪个好】万彩脑图大师教程 | 编辑思维导图背景

热门文章

  1. 苹果7防水吗_苹果新品 iPhoneSE 文案,戏精附体
  2. 【科研工具】审稿人第一眼只看配图?
  3. 实体店店铺管理软件应该怎么挑?有这几个功能的错不了!
  4. 在excel表中如何实现手动换行
  5. 摄影吴师自通 构图01 五分钟掌握构图技巧
  6. vue发送Http请求之XMLHttpRequest
  7. RuoYiApplication: Failed to retrieve application JMX service URL解决方法
  8. SqlServer数据库SQL语句(超详细)
  9. 简单实用-且免费使用的内网穿透软件
  10. “当迷茫时就回到原点,或者退一步再思考” | 技术人金句系列