前言

  基于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. [转帖]Centos 7 查看磁盘io ,找出占用io读写很高的进程

    1,先用iostat查看磁盘io 是否读写负载很高 用iostat -x 1 10 如果 iostat 没有,要 yum install sysstat安装这个包,第一眼看下图红色圈圈的那个如果%ut ...

  2. [转帖]CPU的制造和概念

    https://plantegg.github.io/2021/06/01/CPU%E7%9A%84%E5%88%B6%E9%80%A0%E5%92%8C%E6%A6%82%E5%BF%B5/ 为了让 ...

  3. 【小测试】rust中的数组越界——好吧,这下证明rust不是零成本抽象了吧

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 1.编译期发现的数组越界 在数组下标是常量的情况下,编译期 ...

  4. 【K哥爬虫普法】一个人、一年半、挣了2000万!

    我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K 哥特设了"K哥爬虫普法"专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识, ...

  5. js设计模式(下)

    引用:(23条消息) <Javascript设计模式与开发实践>关于设计模式典型代码的整理(下):模板方法模式.享元模式.职责链模式.中介者模式.装饰模式.状态模式.适配器模式_QQsil ...

  6. chrome谷歌浏览器多开(独立环境 独立cookie)

    复制下面代码(路径) "C:\Program Files\Google\Chrome\Application\chrome.exe" --user-data-dir="D ...

  7. # github突破7k star 即时通讯(IM)开源项目OpenIM每周迭代版本发布

    v2.0已经重构完毕,架构更清晰,代码更规范,邀请各位参与OpenIM社区建设有兴趣的同学可以加我私聊. 目前侧正在业务开发,已提供更多功能,包括群管理,阅后即焚,朋友圈,标签下发等. web端体验: ...

  8. 飞桨paddle遇到bug调试修正【迁移工具、版本兼容性】

    PaddlePaddlle强化学习及PARL框架{飞桨} [一]-环境配置+python入门教学 [二]-Parl基础命令 [三]-Notebook.&pdb.ipdb 调试 [四]-强化学习 ...

  9. C/C++ 感染标志与空字节感染

    C/C++ 通过搜索PE结构中的空隙部分,对指定文件写入感染标志,作用是,如果程序被感染过则不再继续感染,而搜索空字节,则是要将恶意代码动态的填充到可执行文件中,并劫持执行流,以下代码就是这两种代码的 ...

  10. FileReader读取文件(文本和图片)

    1.读取文本 let file = input_file.files[0] let fr = new FileReader(); fr.readAsText(file,'gb2312'); //设置文 ...