前言

  基于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. 【转帖】text-davinci-003和ChatGPT之间的不同点

    https://zhuanlan.zhihu.com/p/603709081 先看下GPT的发展时间线 InstructGPT(2022 年 1 月)是一系列 GPT-3 模型(包括 text-dav ...

  2. [转帖]A17再次证明苹果才是王者,组装芯片的安卓手机给它提鞋都不配

    http://news.sohu.com/a/653472711_121124371 在挤了两代牙膏之后,苹果终于拿出了性能大幅提升的A17处理器,外媒传出A17处理器的性能提升幅度至少超过四成,相比 ...

  3. [转帖] Linux命令拾遗-软件资源观测

    https://www.cnblogs.com/codelogs/p/16060443.html 原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# 这是Linux ...

  4. Spring缓存是如何实现的?如何扩展使其支持过期删除功能?

    前言:在我们的应用中,有一些数据是通过rpc获取的远端数据,该数据不会经常变化,允许客户端在本地缓存一定时间. 该场景逻辑简单,缓存数据较小,不需要持久化,所以不希望引入其他第三方缓存工具加重应用负担 ...

  5. 自动化部署实例(donetcore GitLab CICD )

    主要简单的介绍了一下 GitLab CI 的持续集成以及持续部署,这篇将通过 GitLab CI 发布一个 .net core 项目,来带小伙伴们感受一下自动化的魅力,从此告别手动发布. 准备工作 创 ...

  6. zap自定义日志级别

    简介 zap是有uber开发的一款日志库. zap提供了三个快速创建Logger方法: NewProduction: 以JSON格式记录Info级别及以上的标准错误日志 NewDevelopment: ...

  7. 6张图表 + 1个案例 带你入门tcpdump的使用和原理

    一.tcpdump简介 tcpdump是什么? 来看看 tcpdump官网怎么说:This is the home web site of tcpdump, a powerful command-li ...

  8. @RequestBody中使用@DateTimeFormat报错:JSON parse error: Expected array or string.; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException

    原因分析 根据异常提示:不匹配输入异常,指输入的参数错误,说是只支持String类型和Array数组类型的. @PostMapping("/test") public Dto ge ...

  9. 8.2 C++ 引用与取别名

    C/C++语言是一种通用的编程语言,具有高效.灵活和可移植等特点.C语言主要用于系统编程,如操作系统.编译器.数据库等:C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统.图形用户界面 ...

  10. 性能暴增70%!AMD线程撕裂者RPO 7000将于10月19日发布: 96核心Zen 4史无前例

    据wccftech最新报道,AMD的下一代Ryzen Threadripper(线程撕裂者)PRO 7000"Storm Peak"CPU将于10月19日作为终极工作站解决方案亮相 ...