Linux嵌入式驱动开发01——第一个驱动Hello World(附源码)
文章目录
- 全系列传送门
- 引言
- 驱动介绍
- Hello World
- 1. 包含头文件
- 2. 驱动模块的入口和出口
- 3. 声明信息
- 4. 功能实现
- 完整代码
- 编译
- 第一种方法
- 第二种方法
- 编译成模块
- 第一步:Makefile
- 第二步:编译驱动
- 准备
- 配置环境变量
- 编译
- 加载驱动模块
- 发送到板子
- 卸载模块
- 编译驱动实践(usb转串口驱动)
- 任务需求
- 分析
全系列传送门
Linux嵌入式驱动开发01——第一个驱动Hello World(附源码)
Linux嵌入式驱动开发02——驱动编译到内核
Linux嵌入式驱动开发03——杂项设备驱动(附源码)
Linux嵌入式驱动开发04——应用层和内核层数据传输
Linux嵌入式驱动开发05——物理地址到虚拟地址映射
Linux嵌入式驱动开发06——第一个相对完整的驱动实践编写
Linux嵌入式驱动开发07——GPIO驱动过程记录(飞凌开发板)
Linux嵌入式驱动开发08——字符设备(步步为营)
Linux嵌入式驱动开发09——平台总线详解及实战
Linux嵌入式驱动开发10——设备树开发详解
Linux嵌入式驱动开发11——平台总线模型修改为设备树实例
Linux嵌入式驱动开发12——pinctl和gpio子系统实践操作
Linux嵌入式驱动开发13——ioctl接口(gpio控制使用)
Linux嵌入式驱动开发14——中断的原理以及按键中断的实现(tasklet中断下文)
Linux嵌入式驱动开发15——等待队列和工作队列
Linux嵌入式驱动开发16——按键消抖实验(内核定时器)
Linux嵌入式驱动开发17——输入子系统
Linux嵌入式驱动开发18——I2C通信
引言
之前也算是一直在学习嵌入式Linux的开发,裸机开发,uboot配置,系统编译,驱动开发,Qt开发, 这一套一知半解的看下来对于怎么开发Linux,还是一头雾水 ,没有一个明确的认知,所以对于这方面的知识打算从头重新建立一个完整的学习框架,这次更加去注重理论的理解和相通性。
驱动介绍
驱动分为四个部分
- 头文件
- 驱动模块的入口和出口
- 声明信息
- 功能实现
Hello World
1. 包含头文件
#include <linux/init.h>
#include <linux/module.h>
#include <linux/init.h>包含宏定义的头文件
#include <linux/module.h>包含初始化加载模块的头文件
2. 驱动模块的入口和出口
module_init(XXXX_init);
module_exit(XXXX_exit);
3. 声明信息
MODULE_LICENSE("GPL"); //声明模块拥有开源许可
4. 功能实现
static int hello_init(void)
{printk("hello world\n"); // 在内核中无法使用c语言库,所以不用printfreturn 0;
}static void hello_exit(void)
{printk("bye\n");
}
完整代码
Linux嵌入式驱动模块modules_helloworld
#include <linux/init.h>
#include <linux/module.h>static int hello_init(void)
{printk("hello world\n"); // 在内核中无法使用c语言库,所以不用printfreturn 0;
}static void hello_exit(void)
{printk("bye\n");
}module_init(hello_init);
module_exit(hello_exit);MODULE_LICENSE("GPL"); //声明模块拥有开源许可
因为我使用的是vscode进行编辑,对于一些库,不知道自己有没有选择正确怎么办?
因为是编写 Linux驱动,因此会用到 Linux源码中的函数。我们需要在 VSCode中添加 Linux源码中的头文件路径。打开 VSCode,按下 Crtl+Shift+P”打开 VSCode的控制台,然后输入
C/C++: Edit configurations(JSON)
打开 C/C++编辑配置文件,如图 所示:
打开以后会自动在 .vscode目录下生成一个名为 c_cpp_properties.json的文件,此文件默认内容如下所示:
{"configurations": [{"name": "Linux","includePath": ["${workspaceFolder}/**",],"defines": [],"compilerPath": "/usr/bin/gcc","cStandard": "gnu17","cppStandard": "gnu++14","intelliSenseMode": "gcc-x64"}],"version": 4
}
第 5行的 includePath表示头文件路径,需要将 Linux源码里面的头文件路径添加进来,也就是我们前面移植的 Linux源码中的头文件路径。添加头文件路径以后的 c_cpp_properties.json的文件内容如下所示:
{"configurations": [{"name": "Linux","includePath": ["${workspaceFolder}/**","/work/linux-4.1.15/include","/work/linux-4.1.15/arch/arm/include","/work/linux-4.1.15/arch/arm/include/generated"],"defines": [],"compilerPath": "/usr/bin/gcc","cStandard": "gnu17","cppStandard": "gnu++14","intelliSenseMode": "gcc-x64"}],"version": 4
}
第 7~9行就是添加好的 Linux头文件路径。分别是开发板所使用的 Linux源码下的 include、arch/arm/include和 arch/arm/include/generated这三个目录的路径,注意,这里使用了绝对路径。
编译
第一种方法
把驱动编译成模块,然后使用命令把驱动加载到内核里
第二种方法
直接把驱动编译到内核
编译成模块
我们用的第一种方法,编译成模块,然后加载
所以我们需要写一个Makefile
第一步:Makefile
# 开发板Linux内核的实际路径
# KDIR变量
KDIR:=/work/linux-4.1.15# 获取当前目录
PWD:=$(shell pwd)# obj-m表示将 chrdevbase.c这个文件 编译为 chrdevbase.ko模块。
obj-m += helloworld.o# 编译成模块
all:make -C $(KDIR) M=$(PWD) modulesclean:make -C $(KDIR) M=$(PWD) clean
第二步:编译驱动
编译驱动之前需要注意的问题:
- 内核源码一定要先编译通过
- 我们编译驱动模块用的内核源码要和板子上的Linux内核源码是同一套
- 看一下我们ubuntu的环境是不是arm
准备
使用命令
make menuconfig
可以打开这个可视化的配置界面
如果上方的红圈位置显示x86,那么输入
export ARCH=arm
修改成arm才可以
配置环境变量
在使用make指令前,要先进行环境变量的配置
. /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa9hf-neon-poky-linux-gnueabi
编译
使用指令
make
生成了ko文件,这就是我们的驱动模块
加载驱动模块
发送到板子
使用指令进行网络发送文件
scp helloworld.ko root@192.168.0.232:/lib/modules/4.1.15-dirty/
然后在我们的板子上的/lib/modules/4.1.15-dirty/目录下就可以看到文件了,加载驱动
insmod helloworld.ko
可以看到执行了我们之前写的printk(“hello world\n”);指令,进一步查看加载过的模块
lsmod
卸载模块
使用指令
rmmod hellworld
注意:这里没有ko后缀
再次查看列表,可以看到已经没有了helloword驱动模块
编译驱动实践(usb转串口驱动)
任务需求
开发板上自带的串口不够使用的情况下,我们需要对串口进行扩展,其中一个方法就是使用usb转串口来进行实现,扩展我们的串口,但是我们的开发板是没有这个驱动来支持这个工作,所以,我们要进行驱动的加载。
分析
- 先去内核源码里去搜索,如果有的话,我们可以直接选择这个驱动,然后使用。
- 假设没有这个驱动,我们需要自己编译一个驱动,然后加载到内核中运行
USB转串口用到的芯片都比较成熟,比如CH340,CH340支持的驱动非常的全面,我们去官网下载就可以了
http://www.wch.cn/download/CH341SER_LINUX_ZIP.html
打开压缩包,我们只需要里面的c源文件就可以
然后复制到wsl中,把上面helloworld的makefile也复制过来
修改makefile的文件名,就可以了
然后就是配置环境变量,编译
生成了ko文件,发送到板子指定目录
ssh登录开发板,然后就可以看到了,insmod安装
这样,我们从网上找到源码然后移植加载,就成功了。
因为大部分的开发板都会继承这个常见的驱动模块,所以,我i们只需要熟悉这个过程就好了。
后面我们继续研究怎么把我们的驱动编译到内核中
Linux嵌入式驱动开发01——第一个驱动Hello World(附源码)相关推荐
- Python开发实战案例之网络爬虫(附源码)-张子良-专题视频课程
Python开发实战案例之网络爬虫(附源码)-35人已学习 课程介绍 课程特色: 特色1:案例驱动-围绕两大完整的Python网络爬虫实战开发案例:IT电子书下载网络爬虫和股票交易数据 ...
- java计算机毕业设计vue开发一个简单音乐播放器(附源码、数据库)
java计算机毕业设计vue开发一个简单音乐播放器(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Ec ...
- 流行的Spring Boot + Vue架构整合开发的网易云+QQ音乐(附源码)
前言 虽然 B/S 是目前开发的主流,但是 C/S 仍然有很大的市场需求.受限于浏览器的沙盒限制,网页应用无法满足某些场景下的使用需求,而桌面应用可以读写本地文件.调用更多系统资源,再加上 Web 开 ...
- leaflet-webpack 入门开发系列三地图分屏对比(附源码下载)
前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载 webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 ...
- 安卓篇-我自己的第一个安卓程序(附源码链接)
在上一期的教程中我们已经成功把安卓工作室(以下简称AS)安装到了我们的电脑上啦~那么这一期我们就要来创建属于我们自己的第一个安卓程序,并且运行到模拟器上. 上期内容传送门~~~ 如何安装Android ...
- linux俄罗斯方块源程序,《俄罗斯方块游戏》项目实作【附源码】
此游戏的界面分为3种,即游戏前界面.游戏时界面和游戏后界面 1.游戏前界面:即在游戏开始之前为用户呈现的界面,其中包括1张背景图和3个按钮,3个按钮分别为"开始"."设置 ...
- cesium 入门开发系列矢量瓦片加载展示(附源码下载)
前言 cesium 入门开发系列环境知识点了解: cesium api文档介绍,详细介绍 cesium 每个类的函数以及属性等等 cesium 在线例子 内容概览 cesium 实现矢量瓦片加载效果 ...
- 基于 SpringBoot 开发的在线短链生成系统(附源码)
前言 分享一个基于 SpringBoot 开发的在线短链生成系统,在线短链接生成器. 完整项目源码在文章结尾处,大家自行下载即可~ 一.实现功能 1.将长链接转换成短链接,访问短链接时, 302重定向 ...
- Python+Flask+MySQL开发的在线外卖订餐系统(附源码)
文章目录 一.项目模块及功能介绍 1.登录模块 2.注册模块 3.商家用户模块 4.买家用户模块 5.系统管理员模块 源码 二.项目结构 三.环境依赖 四.运行方法 五.系统部分界面展示 1.首页 2 ...
最新文章
- 【关于封装的那些事】 缺失封装 【关于封装的那些事】 泄露的封装 【关于封装的那些事】 不充分的封装 【图解数据结构】二叉查找树 【图解数据结构】 二叉树遍历...
- offset client scroll
- mysql+%3c%3e+cdata,bbed 使用实现 drop index 操作
- Linux wc命令用于计算字数。
- C ++ 数组 | 寻找最大、最小值,数组(Array)_1
- 【信息系统项目管理师】第2章-信息系统项目管理基础 知识点详细整理
- 【原】创建 WPF 不规则窗口
- Atitit webshell java 实现 命令行输出读取问题总结 1.1. 读取组赛 或者读取了一部分。。使用cmd /c 模式,强制关闭刷新缓冲区	1 1.2. 乱码解决	1 1.3. /h
- html扫雷源码js,js实现扫雷源代码.pdf
- 线性混合效应模型Linear Mixed-Effects Models的部分折叠Gibbs采样
- QQ交谈代码一键加好友开网页聊天代码
- Unity竖排文字的实现(2019以上新版本可用)
- react中动态渲染背景图片
- 云重磅 | 阿里巴巴平均每天纳税超1.4亿;谷歌、Face book与AWS将共建美欧新海底电缆;阿里发布谣言粉碎机:1秒辨真伪...
- Halcon面阵相机采像
- 若泽大数据-剑指数仓培训笔记1
- Qt编写可视化大屏电子看板系统7-窗体浮动
- 数据结构第二版(朱昌杰版)习题四答案
- 180页PPT为你全解AI技术与产业发展 | 清华孙富春教授
- GNSS原理与应用(四)——卫星运动基本知识
热门文章
- 必知必会的设计原则——单一职责原则
- 理解Python中的元类(metaclass)
- 向量的点积和叉积 计算示例及几何意义
- webpack 打包(plugin、loader 工作原理)
- js,jq获取 滚动条高度 及 浏览器宽高
- Python openjudge练习:015:计算邮资
- R语言使用rnorm函数生成正太分布数据、使用plot函数可视化散点图、使用ylim参数自定义Y轴取值范围
- 微信视频号怎么运营,该如何打造爆款视频丨国仁网络资讯
- Q宠猪猪伴侣 V2.50 多宠版 Beta4 ~~ 天空原创软件
- 模型部署到移动端_模型压缩+编译器优化,使AI算法在移动端性能超越专用硬件...