Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试

这篇具有很好参考价值的文章主要介绍了Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/130542981文章来源地址https://www.toymoban.com/news/detail-453900.html

红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…

Linux系统移植和驱动开发专栏

上一篇:《Linux驱动开发笔记(二):ubuntu系统从源码安装gcc7.3.0编译器》
下一篇:《Linux驱动开发笔记(四):设备驱动介绍、熟悉杂项设备驱动和ubuntu开发杂项设备Demo》


前言

  前面学习了驱动的基础框架,上一篇编译了gcc7.3.0,那么为了方便很好的熟悉流程,本篇,将使用ubuntu18.04,直接编译ubuntu18.04的驱动,然后做好本篇文章的相关实战测试。


Ubuntu虚拟机准备

步骤一:安装虚拟机

  本次使用之前rk3568的ubuntu18.04,笔者没有重新弄了,安装虚拟机的过程请自行搜索查找完成。
  Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试

步骤二:获取内核版本号

  获取内核版本号是为了确认内核版本号一致。

sudo cat /proc/version

  Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试

步骤三:校准编译器版本

  前面获取了内核的编译器版本是gcc7.3.0,但是本机是gcc7.5,需要变更版本:
  Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试

步骤四:下载内核源码

sudo cat /proc/version
sudo apt-cache search linux-source
sudo apt-get install linux-source-4.15.0

  查看到本ubuntu的内核版本,然后下载对应的版本:
  Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试
  以上准备好的内核源码和编译器则可以开始编译内核。


内核编译

  注意1:ubuntu的/usr/src下有内核的头文件可编译直接使用。
  注意2:本标题章节所编译的内核然后使用该内核编译的驱动是不可兼容的。
  Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试

步骤一:下载解压

  Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试
  发现其实系统自带了header头文件。(PS:-header- 就是头文件,驱动和某些和内核功能关联的东西都要调用当前内核版本的对应头文件才能正确的编译出来而且可以使用。所以有些发行版就制作了专用的 header 包来让需要的程序调用。这种包只有 header 文件,没有其他无关开发的内容。

cd linux-source-4.18.0/
sudo tar xvf linux-source-4.18.0.tar.bz2

  Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试

步骤二:内核配置

cd linux-source-4.18.0
sudo make menuconfig

  Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试
  进入了配置:
  Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试
  不做任何配置变动,退出。

步骤三:直接编译

make -j8

  Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试
  半小时左右编译完成:
  Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试


驱动编译

  把驱动编译城模块,然后加载到内核里面。

步骤一:使用前面编写的驱动和makefile

  Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试

驱动代码文件

  Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试

#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);

驱动makefile

  Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试
  这里make过不去,发现这里不能是空格,如下图,才可以:
  Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试

obj-m += helloworld.o

KDIR:=/usr/src/linux-source-4.18.0/linux-source-4.18.0

PWD?=$(shell pwd)

all:
    make -C $(KDIR) M=$(PWD) modules

步骤二:编译make

make

  直接在驱动工程目录编译:
  Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试

  这里是makefile的m要大写,修改后可编译:
  Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试

  应该是windows拷贝 过来字符编码啥的变了(双引号),这里更正一下:
  Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试
  Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试
  然后再编译:
  Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试
  编译成功
  Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试

步骤三:加载卸载驱动测试

  将驱动拷贝到开发板或者目标系统,然后使用加载指令:

insmod helloworld.ko

  会打印入口加载的printk输出。
  Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试

  出现问题可能原因一是内核编译使用的编译器和模块使用的编译器版本不一致。
  这里我们核对过是一样的,所以此处暂时也不知道如何,如下图:
  Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试

  那么怀疑问题二:编译模块时选择的Linux头文件目录与当前运行的系统版本不匹配(可能是配置吧,明显大版本和子版本是一致的)
  所以这里我们重新配置一下makefile,直接引用linux-header如下:

  Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试
  编译通过:
  Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试

  继续加载、查看和卸载测试:
  Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试

  发现ubuntu中printk终端无打印的问题,是重定向问题,打入内核日志消息了,可以使用dmesg进行查看:

  Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试

  至此,会发现作为ubuntu来说,自带的/usr/src下的就是内核的头文件编译直接使用就可以了,无需编译内核,但是编译器还是需要的。
  本文章内核编译保留,因为编译内核是一个准备条件。


上一篇:《Linux驱动开发笔记(二):ubuntu系统从源码安装gcc7.3.0编译器》
下一篇:《Linux驱动开发笔记(四):设备驱动介绍、熟悉杂项设备驱动和ubuntu开发杂项设备Demo》


若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/130542981

到了这里,关于Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux驱动开发笔记(四):设备驱动介绍、熟悉杂项设备驱动和ubuntu开发杂项设备Demo

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/134533533 红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中… 上一篇:《Linux驱动开发笔记(三

    2024年02月05日
    浏览(53)
  • i.MX 6ULL 驱动开发 二十九:向 Linux 内核中添加自己编写驱动

    Linux 内核编译流程如下: 1、配置 Linux 内核。 2、编译 Linux 内核。 说明:进入 Linux 内核源码,使用 make help 参看相关配置。 1、 menuconfig 它本身是一个软件,只提供图形界面配置的一些逻辑,并不负责提供内容。 2、 menuconfig 是内核源码树的各目录下的 kconfig 提供的。 3、 m

    2023年04月10日
    浏览(74)
  • 基于ubuntu的驱动开发

      一般的linux驱动开发都是基于交叉编译来进行的,本文尝试着从另一个角度:基于ubuntu的本地驱动开发来学习一下驱动的开发 1.1、编写驱动文件 1.2、查找内核文件位置 1.3、编写makefile文件   其中KERNELDIR 就是前面查找的内核目录 1.4、编译 2.1、加载驱动 2.2、卸载驱动

    2024年02月12日
    浏览(22)
  • 【Linux驱动开发】编译Android12源码

    基于讯为电子rk3568教程 rk_android12.0_sdk_20220720.tar.gz 解压 设置屏幕配置 整体编译 Android 固件 使能编译环境 开始整体编译 rockdev/Image-rk3568_s // 编译成功镜像存放位置 单独编译u-boot (方法一) 编译完成后在 u-boot 目录会生成 rk356x_spl_loader_v1.13.112.bin 文件、uboot.img 文件、 resourc

    2024年02月05日
    浏览(47)
  • linux驱动开发笔记一

    Linux操作系统 1,Linux操作系统基础: 1),基础知识 第一块处理器:intel 4004 Intel 8008 ,i8086,…协处理器(主从机制); 80386,80586,奔腾,酷睿,四核; 1971年IBM发布个人电脑5150; deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse deb-src https://mirrors.tuna

    2023年04月13日
    浏览(42)
  • Linux驱动开发学习笔记

    (Trusted Firmware - Arm) tsv语法 p220 ‘P’:向分区或者设备烧写固件。 ‘E’:空分区或设备,表示对应的分区或设备不更新,相关的 Id项会被跳过。 ‘D’:删除分区或设备。 TF_A的bl33部分是uboot,uboot的功能是引导、启动linux。 U-boot命令 一般环境变量存放在外部flash中,uboo

    2024年02月14日
    浏览(48)
  • 嵌入式Linux驱动开发 04:基于设备树的驱动开发

    前面文章 《嵌入式Linux驱动开发 03:平台(platform)总线驱动模型》 引入了资源和驱动分离的概念,这篇文章将在前面基础上更进一步,引入设备树的概念。 在平台总线驱动模型中资源和驱动已经从逻辑上和代码组织上进行了分离,但每次调整资源还是会涉及到内核,所以现

    2024年02月16日
    浏览(70)
  • 基于ubuntu的STM32嵌入式软件开发(四)——应用软件工程的修改、Makefile及编译脚本的编写

            本文主要介绍基于标准库函数移植的STM32的应用软件工程的修改,主要涉及到文件内容修改、Makefile文件编写、编译脚本编写等内容,其中编译脚本是基于arm-none-eabi-gcc的交叉编译器撰写的。程序亲测可以正常编译,生成.bin和.hex的可烧录镜像文件。 1.首先修改 pr

    2023年04月15日
    浏览(46)
  • <Linux开发>驱动开发 -之-基于pinctrl/gpio子系统的beep驱动

    <Linux开发>驱动开发 -之-基于pinctrl/gpio子系统的beep驱动 交叉编译环境搭建: <Linux开发> linux开发工具-之-交叉编译环境搭建 uboot移植可参考以下: <Linux开发> -之-系统移植 uboot移植过程详细记录(第一部分) <Linux开发> -之-系统移植 uboot移植过程详细记录(第二部分

    2024年02月13日
    浏览(41)
  • Linux设备驱动开发学习笔记(等待队列,锁,字符驱动程序,设备树,i2C...)

    container_of函数可以通过结构体的成员变量检索出整个结构体 函数原型: 内核开发者只实现了循环双链表,因为这个结构能够实现FIFO和LIFO,并且内核开发者要保持最少代码。 为了支持链表,代码中要添加的头文件是linux/list.h。内核中链表实现核心部分的数据结构 是struct li

    2024年01月22日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包