Linux驱动开发笔记(一):helloworld驱动源码编写、makefile编写以及驱动编译基本流程
前言
基于linux的驱动开发学习笔记,本篇是描述了一个字符驱动的基础开发流程,以便做嵌入式开发多年的应用或者系统学习驱动开发。
笔者自身情况
笔者拥有硬件基础,单片机软硬基础,linux系统基础等各种,就是没有linux驱动框架基础,未做过linux系统移植和驱动移植开发了。所以补完linux系统移植和驱动开发就基本可以打通嵌入式整套流程了,作为技术leader不一定亲自动手做,但是一定要对产品构架中的每一块业务和技术要基本清楚。
推荐
建议参考xun为的视频教程,教程整个过程非常清晰,直接给拥有很多知识基础的资深研发,可以不陷入某山的固有思维误区,也不用imx6的太过庞从汇报理解大而冗余,它能直接以最终实现目标为目的,不用从什么裸机开始做开发学习,怎么做也告诉你为什么都交代清楚,再结合多年相关从业工作经验,说实在的,一通百通可以融会贯通。从业多年,第一次推荐,因为确实真的是好东西。
驱动
驱动分为四个部分
- 头文件:宏定义等等
- 驱动模块的入口和出口宏:linux驱动框架
- 声明信息:linux内核模块的必要声明
- 功能实现:真正实现驱动的实体代码
第一个驱动源码:Hello world!
步骤一:包含头文件
包含宏定义的头文件init.h,是一些初始化和宏头文件,一些module_init,module_exit等。
#include <linux/init.h>
包含了初始化加载模块的头文件
#include <linux/module.h>
步骤二:写驱动文件的入口和出口
module_init()和module_exit()入口和出口宏。(PS:这里括号内实际上需要填入入口出口函数,后续再填入)
module_init();
module_exit();
步骤三:声明开源信息
告诉内核,本模块驱动有开源许可证。
MODULE_LICENSE(“GPL”);
步骤四:实现基础功能
入口函数
static int hello_init(void)
{
// 在内核里面无法使用基础c库printf,需要使用内核库printk
printk(“Hello, I’m hongPangZi\n”);
return 0;
}
出口函数
static void hello_exit(void)
{
printk(“bye-bye!!!\n”);
}
此时可以修改,步骤二的出口入口宏了
module_init(hello_init);
module_exit(hello_exit);
总结,按部就班四步法,搭建了基础的驱动代码框架。

#include <linux/init.h>
#include <linux/module.h>
static int hello_init(void)
{
// 在内核里面无法使用基础c库printf,需要使用内核库printk
printk(“Hello, I’m hongPangZi\n”);
return 0;
}
static void hello_exit(void)
{
printk(“bye-bye!!!\n”);
}
MODULE_LICENSE(“GPL”);
module_init(hello_init);
module_exit(hello_exit);
Linux驱动编译成模块
把驱动编译城模块,然后加载到内核里面。
把驱动直接编译到内核,运行内核则会直接加载驱动。
步骤一:编写makefle
1 生成中间文件的名称
obj-m += helloworld.o
2 内核的路径
内核在哪,实际路径在哪
KDIR:=
3 当前路径
PWD?=$(shell pwd)
4 总的编译命令
all:
make -C $(KDIR) M=$(PWD) modules
make进去KDIR路径,当前路径编译成模块。

obj-m = helloworld.o
KDIR:=
PWD?=$(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
步骤二:编译驱动
编译驱动之前有几点要注意:
1 内核源码要编译通过
与驱动编译成的目标系统,获取对应的内核且需要编译通过。
2 内核源码版本
开发板或者系统跑的内核版本需要与编译内核驱动的内核源码版本一致。
注意3:编译目标环境要确认是否是需要的构架,在内核目录下:
make menu configure
export ARCH=arm
修改构架后,可使用menu configure查看标题栏的内核构架
3 编译器版本
找到使用的arm编译器(实际为arm-linux-gnueabihf-gcc,取gcc前缀)
export CROSS_COMPILE=arm-linux-gnueabihf-
4 编译
直接输入make,编译驱动,会生成hellowold.ko文件,ko文件就是编译好的驱动模块。
步骤三:加载卸载驱动
1加载驱动
将驱动拷贝到开发板或者目标系统,然后使用加载指令:
insmod helloworld.ko
会打印入口加载的printk输出。
2 查看当前加载的驱动
lsmod
可以查看到加载的驱动模块
3 卸载驱动
rmmod helloworld
可以移除指定驱动模块(PS:卸载驱动不需要.ko后缀),卸载成功会打印之前的printk输出。
总结
学习了驱动的基础框架,那么为了方便很好的测试,让大家都有基础环境,下一篇,将使用ubuntu18.04,编译ubuntu18.04的驱动,然后做好本篇文章的相关实战测试。
Linux驱动开发笔记(一):helloworld驱动源码编写、makefile编写以及驱动编译基本流程的更多相关文章
- Contiki源码+原理+功能+编程+移植+驱动+网络(转)
源:Contiki源码+原理+功能+编程+移植+驱动+网络 请链接:http://www.rimelink.com/nd.jsp? id=31&_np=105_315 假设您对于用Contik ...
- 《iOS开发指南》正式出版-源码-样章-目录,欢迎大家提出宝贵意见
智捷iOS课堂-关东升老师最新作品:<iOS开发指南-从0基础到AppStore上线>正式出版了 iOS架构设计.iOS性能优化.iOS测试驱动.iOS调试.iOS团队协作版本控制.... ...
- 【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)
分类: Android 系统开发(5) 作者同类文章X 版权声明:本文为博主原创文章 ...
- 微信小程序版博客——开发汇总总结(附源码)
花了点时间陆陆续续,拼拼凑凑将我的小程序版博客搭建完了,这里做个简单的分享和总结. 整体效果 对于博客来说功能页面不是很多,且有些限制于后端服务(基于ghost博客提供的服务),相关样式可以参考截图或 ...
- 50个Android开发人员必备UI效果源码[转载]
50个Android开发人员必备UI效果源码[转载] http://blog.csdn.net/qq1059458376/article/details/8145497 Android 仿微信之主页面 ...
- [笔记] Ubuntu 18.04源码安装caffe流程
虽然Ubuntu 18.04可以通过apt安装caffe,但是为了使用最新的代码,还是值得从源码安装一遍的. 安装环境 OS: Ubuntu 18.04 64 bit 显卡: NVidia GTX 1 ...
- 【转】python:让源码更安全之将py编译成so
python:让源码更安全之将py编译成so 应用场景 Python是一种面向对象的解释型计算机程序设计语言,具有丰富和强大的库,使用其开发产品快速高效. python的解释特性是将py编译为独有的二 ...
- Openfire4源码部署到eclipse中并编译
Openfire4源码部署到eclipse中并编译 概述 Openfire是众所周知的基于xmpp协议的IM开源服务,所有操作,配置,监控,调试等以B/S方式进行展示,非常的方便管理员进行管理.它的强 ...
- android源码环境下用mmm/mm编译模块,输出编译log到文件的方法
android源码环境下用mmm/mm编译模块,输出编译log到文件的方法 1,在android目录下直接用mmm命令编译, log信息保存在android目录下 mmm packages/apps/ ...
- Android7.0 Phone应用源码分析(三) phone拒接流程分析
本文主要分析Android拒接电话的流程,下面先来看一下拒接电话流程时序图 步骤1:滑动按钮到拒接图标,会调用到AnswerFragment的onDecline方法 com.android.incal ...
随机推荐
- Jmeter学习之六_进行https证书处理的工作
Jmeter 进行https证书处理的工作 背景 继续学习中,想着能够抓取一下https相关的信息 所以计划些一下处理过程 但是感觉自己这一块比较薄弱. 场景设计这一块应该是专业人去搞, 我这边先只是 ...
- [转帖]Kafka—配置SASL/PLAIN认证客户端及常用操作命令
介绍 SASL/PLAIN 是一种简单的 username/password安全认证机制,本文主要总结服务端开启该认证后,命令行客户端进行配置的操作流程. 配置 增加jaas.properties ...
- SPECJVM2008的简单结果
SPECJVM2008的简单结果 摘要 前面两天学习了SPECJVM2008简单使用. 今天进行一下简单的数据采集. 需要说明一下SPECJVM2008貌似仅兼容JDK1.8 更新的LTS版本都不兼容 ...
- [转帖]读Brendan Gregg - 谈性能分析
https://zhuanlan.zhihu.com/p/206743670 Brendan Gregg何许人 Brendan Gregg在性能分析工业界如雷贯耳, 相信看到这篇文章的人肯定知道他的大 ...
- zabbix监控进程和监控日志
zabbix监控进程和监控日志 文章目录 zabbix监控进程和监控日志 一.自定义监控进程 1.新建脚本存放目录 2.修改zabbix_agentd.conf文件 3.zabbix server端进 ...
- Linux 界面能够出现ip地址提示的方法
cat <<EOF >/etc/profile.d/ip.sh if [[ `tty | grep "pts"` ]]; then export PS1='['& ...
- Redis极简教程
简介 Redis 是用C语言开发完全开源免费的,遵守BSD协议的,一个高性能的,key-value型的,NOSQL数据库. 特点 可以将内存中的数据持久化到硬盘中,重启的时候可以从硬盘中再次加载 拥有 ...
- git push卡住了 git push writing object
解决方案: 执行命令:$ git config --global http.postBuffer 524288000 再次push 会卡在这里:POST git-receive-pack(892384 ...
- AppCan 打包无限次下载解决方案
1.下载AppCan 官网上打包好的文件apk文件 2.将apk文件放在指定的服务器文件内,谇文件发布到IIS,一般都会用已发布发的网站上面随便一个目录就可以了. 3.MIME类型中填写apk的MIM ...
- 来啦!2020 Java开源项目权威排名解读:Spring Boot排名稳定、Shiro未上榜
这篇文章对于我们做技术选型以及技术学习都有极强的指导性作用,建议收藏! 原创不易,若有帮助,欢迎点赞! 推荐: 接近100K star 的Java学习/面试指南 Github 95k+点赞的Java面 ...