第一章 linux设备驱动开发之环境搭建(基于exynos4412)

目录

  • 第一章 linux设备驱动开发之环境搭建(基于exynos4412)
    • 1、搭建开发板运行环境
      • 1.1、交叉开发模式
        • 安装交叉编译工具链
      • 1.2、启动运行开发板
        • 启动流程
        • 通过网络启动内核
          • a. 在虚拟机搭建tftp服务
          • b.在开发板中设置uboot参数
          • c.通过nfs去挂载rootfs
    • 2. 配置驱动模块编译环境
      • 2.1、保证有能正常编译的linux内核源码
      • 2.2、修改内核源码中Makefile中的体系架构以及交叉编译工具链
      • 2.3、选择芯片配置(这里选用参考基于arm架构的处理器exynos系列)
      • 2.4、编译生成专用uImage
      • 2.5、编写编译模块的Makefile(在nfs挂载目录下创建)
      • 2.6、编写“helloworld”模块(在nfs挂载目录下创建)
      • 2.7 编译模块并在开发板上运行测试

1、搭建开发板运行环境

1.1、交叉开发模式

在主机平台(如Ubuntu)用交叉编译器编译出可在其他平台(如ARM)运行的代码的过程。

安装交叉编译工具链

第一步:如果ubuntu版本太高,是64bit系统,在安装交叉编译工具之前需要先安装 32 位的兼容库
sudo apt-get install lib32ncurses5 lib32z1

第二步:拷贝gcc-4.6.4.tar.xz到linux中家目录下并解压
tar -xvf gcc-4.6.4.tar.xz

第三步:配置环境变量
sudo vim /etc/bash.bashrc

/* 添加交叉编译工具链的路径到系统脚本在末尾添加注意路径要根据gcc-4.6.4的实际路径修改         */export PATH=/home/hqyj/gcc-4.6.4/bin:$PATH

第四步:使配置文件生效(更新脚本)
source /etc/bash.bashrc
第五步:验证交叉编译工具是否配置成功
arm-n //然后按Tab键补全, 如果能补全为arm-none-linux-gnueabi- 表示安装交叉编译工具成功了

1.2、启动运行开发板

启动流程

上电->运行BootLoader(启动加载程序)->加载kernel(内核程序)->linux3.0以上加载dtb文件(设备树)->挂载 rootfs(根文件系统)

通过网络启动内核

a. 在虚拟机搭建tftp服务

sudo apt install tftpd-hpa tftp-hpa //安装

sudo vim /etc/default/tftpd-hpa //配置

修改成如下:

TFTP_USERNAME="tftp"                TFTP_DIRECTORY="/home/hqyj/tftpboot"   #共享文件的路径TFTP_ADDRESS="0.0.0.0:69"                TFTP_OPTIONS="-l -c -s"          #权限设置

创建共享文件

mkdir /home/hqyj/tftpboot

修改共享文件夹及文件的权限

sudo chmod 0777 /home/hqyj/tftpboot

//启动服务

sudo service tftpd-hpa restart

将uImage和dtb文件放入/home/hqyj/tftpboot文件夹下,并修改权限

sudo chmod 0777 /home/hqyj/tftpboot/*

b.在开发板中设置uboot参数

pri //输出当前环境信息

set bootcmd tftp 0x41000000 uImage \; tftp 0x42000000 exynos4412-fs4412.dtb \; bootm 0x41000000 - 0x42000000 //设置uboot启动命令:下载uImage到0x41000000;下载dtb到0x42000000;启动内核,中间"-"为预留 ramdisk(虚拟内存盘),(ps: exynos4412初始内存地址为0x40000000)。

set ipaddr 192.168.9.9 //设置【开发板】的ip地址

set serverip 192.168.9.99 //设置【虚拟机】的ip地址(跟虚拟机一致)

set gatewayip 192.168.9.1 //设置网关

set netmask 255.255.255.0 //设置子网掩码

save //保存环境变量

注意:

​ 保证虚拟机和开发板在同一个网段;

​ 设置的serverip要与虚拟机的ip地址保持一致;

​ 设置完成需要对数据进行保存,否则断电数据丢失;

确认是否建立好网络通信:

在开发板上通过ping命令检测

​ ping 192.168.9.99

出现的结果:

host 192.168.9.99 is alive

​ 说明网络连通;

​ ping failed; host 192.168.9.99 is not alive

​ 说明网络未连通;

分析错误原因:

  • ​ 检测网线是否连通;

  • ​ 检测参数是否都正确;

  • ​ 检测serverip是否和虚拟机的ip一致;

  • ​ 检测虚拟机桥接的网卡是否正确(桥接模式,网卡一致);

c.通过nfs去挂载rootfs
  1. 需要一个根文件系统-rootfs.tar.xz,解压到Ubuntu

    sudo tar -xvf rootfs.tar.xz -C /opt/4412/

  2. 配置nfs服务器,让/opt/4412/rootfs可以被挂载

    sudo apt install nfs-kernel-server //搭建nfs服务器

    sudo vim /etc/exports //添加nfs配置文件

    最后一行加入以下内容

    /opt/4412/rootfs *(rw,sync,no_subtree_check,no_root_squash) //文件路径 *(读写权限,保证数据的一致性,不检查父目录权限,不映射root用户)

    sudo service nfs-kernel-server restart //重启nfs服务器

    sudo mount -t nfs localhost:/opt/4412/rootfs/ /test //挂载测试

    ls /test //有显示rootfs文件目录则挂载成功

    sudo umount /test //取消挂载

  3. 在开发板中指定内核挂载 /opt/4412/rootfs

    set bootargs clk_ignore_unused root=/dev/nfs nfsroot=192.168.9.99:/opt/4412/rootfs,v3 rw console=ttySAC2,115200init=/linuxrc ip=192.168.9.9

    save

    ​ 注释:

    ​ bootargs : 是uboot传递给内核的启动参数,是一个字符串

    ​ console = ttySAC2 告诉内核启动时调试信息从串口2输出

    ​ init = /linuxrc 告诉内核linux的第一个用户进程是/linuxrc

    ​ root=/dev/nfs 表示根文件系统在网络上

    ​ nfsroot=192.168.9.99:/opt/4412/rootfs 挂载文件服务器IP及路径

    ​ ip=192.168.9.9 告诉内核开机时内核的ip地址(静态分配IP)

    4.开机重启,能显示目录则完成nfs挂载


2. 配置驱动模块编译环境

2.1、保证有能正常编译的linux内核源码

​ linux内核官网下载链接
​ 这里选择3.14版本 https://mirrors.edge.kernel.org/pub/linux/kernel/v3.x/linux-3.14.tar.xz

​ 在开发主机(虚拟机)上解压(建议解压在非网络挂载目录下)

tar -xvf linux-3.14.tar.xz

2.2、修改内核源码中Makefile中的体系架构以及交叉编译工具链

~/linux-3.14$ vim Makefile //内核源码路径

 ARCH ?= arm        #处理器架构CROSS_COMPILE ?= arm-linux-  #配置交叉编译工具
2.3、选择芯片配置(这里选用参考基于arm架构的处理器exynos系列)

~/linux-3.14$ make exynos_defconfig

2.4、编译生成专用uImage

~/linux-3.14$ make uImage


2.5、编写编译模块的Makefile(在nfs挂载目录下创建)

/opt/4412/rootfs/dri_modules/hello_module$ vi Makefile

​ 创建Makefile并添加以下代码

# If KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
OBJ = hello
ifneq ($(KERNELRELEASE),)obj-m := $(OBJ)_module.o
# Otherwise we were called directly from the command
# line; invoke the kernel build system.
elseKERNELDIR ?= ~/linux-3.14PWD := $(shell pwd)
default:$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:rm *.symvers  *.order *.ko *.mod.c  *.o
endif
2.6、编写“helloworld”模块(在nfs挂载目录下创建)
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");       //许可证说明static int hello_init(void)          //模块“构造函数”初始化函数
{printk(KERN_ALERT "Hello, world\n");return 0;
}
static void hello_exit(void)        //模块“析构函数”卸载函数
{printk(KERN_ALERT "Goodbye, cruel world\n");
}module_init(hello_init);   //申明模块的“构造函数”是hello_init, 当插入此模块的时候会被内核激活的函数
module_exit(hello_exit);    申明模块的“析构函数”是hello_exit, 当从内核移除模块的时候会被调用
2.7 编译模块并在开发板上运行测试

make //使用make命令编译,生成下面文件则编译成功

​ 在开发板上测试模块

insmod hello_module.ko //模块加载,成功则打印Hello, world

​ rmmod hello_module //模块卸载,成功则打印Goodbye, cruel world

​ 卸载模块出现以下提示,按提示创建目录文件即可

​ rmmod: can’t change directory to ‘/lib/modules’: No such file or directory


​ 至此完成简单的linux设备驱动开发环境搭建。

linux设备驱动开发之环境搭建(基于exynos4412)相关推荐

  1. 《Linux设备驱动开发详解(第3版)》(即《Linux设备驱动开发详解:基于最新的Linux 4.0内核》)网购链接

    <Linux设备驱动开发详解:基于最新的Linux 4.0内核> china-pub   天猫     dangdang   京东 China-pub 8月新书销售榜 推荐序一 技术日新月 ...

  2. 《Linux设备驱动开发详解(第3版)》(即《Linux设备驱动开发详解:基于最新的Linux 4.0内核》)进展同步更新

    本博实时更新<Linux设备驱动开发详解(第3版)>的最新进展. 目前已经完成稿件. 2015年8月9日,china-pub开始上线预售: http://product.china-pub ...

  3. Linux设备驱动开发详解 第3版 (即 Linux设备驱动开发详解 基于最新的Linux 4 0内核 )前言

    Linux从未停歇脚步.Linus Torvalds,世界上最伟大的程序员之一,Linux内核的创始人,Git的缔造者,仍然在没日没夜的合并补丁,升级内核.做技术,从来没有终南捷径,拼的就是坐冷板凳的 ...

  4. 2020-02-06-Linux设备驱动开发0-环境搭建

    layout title subtitle date author header-img catalog tags post Linux设备驱动开发0-环境搭建 学习Linux驱动开发,当然得有一个自 ...

  5. Linux设备驱动开发基础

    1.驱动概述和开发环境搭建 1.1驱动设备的作用 对设备驱动最通俗的解释就是"驱动硬件设备行动".驱动与底层硬件直接打交道,按照硬件设备的具体工作方式,读写设备的寄存器,完成设备的 ...

  6. 《Linux设备驱动开发详解(第2版)》隆重出版

    Linux设备驱动开发详解(第2版)(前一版狂销3万册,畅销书最新升级) [新品] 点击看大图     基本信息 * 作者: 宋宝华       * 出版社:人民邮电出版社     * ISBN:97 ...

  7. NXP LS1046A及飞腾新四核 FT2004 PCIE EP端LINUX设备驱动开发

    文章目录 前言 一.PCIE 硬件简介 二.PCIE EP地址映射原理介绍 1. PCI总线的各种域(存储器域.PCI总线域) 2. 开发EP设备驱动要做的事 三.NXP LS1046A PCIE E ...

  8. linux设备驱动开发详解孔夫子,Linux设备驱动开发详解

    [内容简介] <Linux设备驱动开发详解(第2版)>是一本介绍linux设备驱动开发理论.框架与实例的书,<Linux设备驱动开发详解(第2版)>基于ldd6410开发板,以 ...

  9. 《Linux设备驱动开发详解 A》一一2.3 接口与总线

    本节书摘来华章计算机出版社<Linux设备驱动开发详解 A>一书中的第2章,第2.3节,作者:宋宝华 更多章节内容可以访问云栖社区"华章计算机"公众号查看.1 2.3 ...

最新文章

  1. 【Flutter】Flutter 调试 ( 调试回退功能 | Debug 调试中查看变量的方式 | 控制台信息 )
  2. class ts 扩展方法_ts类型声明文件的正确使用姿势
  3. python编程小案例_用Python3编程写第一个小案例!-Go语言中文社区
  4. deinstall oracle 11g on linux
  5. HDU-2036 改革春风吹满地 (多边形面积求解)
  6. 【故障诊断分析】滚动轴承故障诊断系统含Matlab源码
  7. 【千锋Python2205班10.8笔记-day11-函数基础(一阶段)】
  8. python sasl_python用sasl的方式连接ldap提示
  9. Python——绑定与方法调用
  10. MATLAB函数bsxfun
  11. Theano的安装及GPU的配置
  12. 软件工程的顶会和顶刊
  13. HDU - 3594 Cactus (强连通缩点+STL)
  14. c语言中1120是什么错误,C++编译常见问题汇总(二)fatal error LNK1120 错误
  15. 开源 免费 java CMS - FreeCMS1.4-统计分析
  16. 国内终端安全防护市场报告发布 360网神排行第一
  17. markdown文件的常用编写语法(图文并茂)
  18. 2021年全球与中国研磨片行业市场规模及发展前景分析
  19. STC单片机驱动TM1640
  20. 在Android开发中不要再用new Thread的方式开启线程啦

热门文章

  1. python足球数据可视化_NBA数据分析_python可视化数据分析_可视化数据分析工具_可视化分析工具-帆软...
  2. 计算机一级考试题库操作题手机版,全国计算机一级操作考试题库示范
  3. kvm-qemu使用kgdb、出现Guest has not initialized the display和代码覆盖率
  4. linux查询redis过期得到-2,Redis数据过期策略探究
  5. 图片、音视频消息上传优化
  6. 太空测试第一名至联云t01248告诉你,质押率怎么算?
  7. kubeadm 部署kubernetes 1.26.1集群 Calico BGP ToR配置
  8. SQL Server 2008的外围应用配置器到哪里去了
  9. SQL Server 2008的外围应用配置工具在哪里?
  10. STM32 |显示:API is not found, corresponding pack is missing or not selected