前言

  基于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编写以及驱动编译基本流程的更多相关文章

  1. Contiki源码+原理+功能+编程+移植+驱动+网络(转)

    源:Contiki源码+原理+功能+编程+移植+驱动+网络 请链接:http://www.rimelink.com/nd.jsp? id=31&_np=105_315 假设您对于用Contik ...

  2. 《iOS开发指南》正式出版-源码-样章-目录,欢迎大家提出宝贵意见

    智捷iOS课堂-关东升老师最新作品:<iOS开发指南-从0基础到AppStore上线>正式出版了 iOS架构设计.iOS性能优化.iOS测试驱动.iOS调试.iOS团队协作版本控制.... ...

  3. 【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)

                 分类: Android 系统开发(5)                                              作者同类文章X 版权声明:本文为博主原创文章 ...

  4. 微信小程序版博客——开发汇总总结(附源码)

    花了点时间陆陆续续,拼拼凑凑将我的小程序版博客搭建完了,这里做个简单的分享和总结. 整体效果 对于博客来说功能页面不是很多,且有些限制于后端服务(基于ghost博客提供的服务),相关样式可以参考截图或 ...

  5. 50个Android开发人员必备UI效果源码[转载]

    50个Android开发人员必备UI效果源码[转载] http://blog.csdn.net/qq1059458376/article/details/8145497 Android 仿微信之主页面 ...

  6. [笔记] Ubuntu 18.04源码安装caffe流程

    虽然Ubuntu 18.04可以通过apt安装caffe,但是为了使用最新的代码,还是值得从源码安装一遍的. 安装环境 OS: Ubuntu 18.04 64 bit 显卡: NVidia GTX 1 ...

  7. 【转】python:让源码更安全之将py编译成so

    python:让源码更安全之将py编译成so 应用场景 Python是一种面向对象的解释型计算机程序设计语言,具有丰富和强大的库,使用其开发产品快速高效. python的解释特性是将py编译为独有的二 ...

  8. Openfire4源码部署到eclipse中并编译

    Openfire4源码部署到eclipse中并编译 概述 Openfire是众所周知的基于xmpp协议的IM开源服务,所有操作,配置,监控,调试等以B/S方式进行展示,非常的方便管理员进行管理.它的强 ...

  9. android源码环境下用mmm/mm编译模块,输出编译log到文件的方法

    android源码环境下用mmm/mm编译模块,输出编译log到文件的方法 1,在android目录下直接用mmm命令编译, log信息保存在android目录下 mmm packages/apps/ ...

  10. Android7.0 Phone应用源码分析(三) phone拒接流程分析

    本文主要分析Android拒接电话的流程,下面先来看一下拒接电话流程时序图 步骤1:滑动按钮到拒接图标,会调用到AnswerFragment的onDecline方法 com.android.incal ...

随机推荐

  1. [转帖]shell脚本使用expect自动化交互登录远程主机进行批量关机

    前文 1.目标主机登录用户都为root,且密码一致 2.目标主机开放启动了SSH服务且22号端口可访问(防火墙未进行拦截) 软件介绍 expect Expect是一个用来实现自动和交互式任务进行通信的 ...

  2. [转帖]auto_explain

    https://help.kingbase.com.cn/v8/development/sql-plsql/ref-extended-plug-in/auto_explain.html 6.1. 插件 ...

  3. 拼多多的U盘都是垃圾

    春节期间陪孩子玩拼多多的果园, 然后发现推送的U盘很便宜就买了下 结果发现.. U盘都是扩容盘,非常垃圾 如下图: 警告: 只有 255933 MB可测试,总容量 255935 MB. 媒体很可能已损 ...

  4. uni-app快速导入自己需要的插件

    在uni-app中快速导入自己需要的插件 在uni-app的官网上;找到自己需要的插件: 然后点击右侧顶部的[使用HX导入]这一步的前提是你必须要用自己的账好登录: 然后选择你要导入哪一个项目 然后就 ...

  5. 【JS逆向百例】某音乐网分离式 webpack 非 IIFE 改写实战

    关注微信公众号:K哥爬虫,QQ交流群:808574309,持续分享爬虫进阶.JS/安卓逆向等技术干货! 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途 ...

  6. MongoDB 选型介绍

    什么是 MongoDB 前言 MongoDB 的主要特性 MongoDB 对比关系型数据库 MySQL 什么时候考虑 MongoDB 参考 什么是 MongoDB 前言 MongoDB 是一个开源.高 ...

  7. k8s 中的网络

    k8s 中的网络模型 CNI 网络插件 CNI 的设计思想 k8s 中的三层网络 Flannel 的 host-gw Calico 参考 k8s 中的网络模型 CNI 网络插件 docker 容器的网 ...

  8. 设计模式学习-使用go实现命令模式

    命令模式 定义 优点 缺点 适用范围 代码实现 命令模式对比策略模式 参考 命令模式 定义 命令模式(Command):将一个请求封装成一个对象,从而是你可用不同的的请求对客户进行参数化:对请求排队或 ...

  9. Milvus 2.3.功能全面升级,核心组件再升级,超低延迟、高准确度、MMap一触开启数据处理量翻倍、支持GPU使用!

    Milvus 2.3.功能全面升级,核心组件再升级,超低延迟.高准确度.MMap一触开启数据处理量翻倍.支持GPU使用! 1.Milvus 2.3版本全部升级简介 Milvus 2.3.0 不仅包含大 ...

  10. 知识图谱项目实战(一):瑞金医院MMC人工智能辅助构建知识图谱--初赛实体识别【1】

    1.技术背景&赛题介绍: A Labeled Chinese Dataset for Diabetes中文糖尿病标注数据集详情请见. 数据集链接:瑞金医院MMC人工智能辅助构建知识数据源:知识 ...