linux设备驱动开发之环境搭建(基于exynos4412)
第一章 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
需要一个根文件系统-rootfs.tar.xz,解压到Ubuntu
sudo tar -xvf rootfs.tar.xz -C /opt/4412/
配置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
//取消挂载在开发板中指定内核挂载 /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)相关推荐
- 《Linux设备驱动开发详解(第3版)》(即《Linux设备驱动开发详解:基于最新的Linux 4.0内核》)网购链接
<Linux设备驱动开发详解:基于最新的Linux 4.0内核> china-pub 天猫 dangdang 京东 China-pub 8月新书销售榜 推荐序一 技术日新月 ...
- 《Linux设备驱动开发详解(第3版)》(即《Linux设备驱动开发详解:基于最新的Linux 4.0内核》)进展同步更新
本博实时更新<Linux设备驱动开发详解(第3版)>的最新进展. 目前已经完成稿件. 2015年8月9日,china-pub开始上线预售: http://product.china-pub ...
- Linux设备驱动开发详解 第3版 (即 Linux设备驱动开发详解 基于最新的Linux 4 0内核 )前言
Linux从未停歇脚步.Linus Torvalds,世界上最伟大的程序员之一,Linux内核的创始人,Git的缔造者,仍然在没日没夜的合并补丁,升级内核.做技术,从来没有终南捷径,拼的就是坐冷板凳的 ...
- 2020-02-06-Linux设备驱动开发0-环境搭建
layout title subtitle date author header-img catalog tags post Linux设备驱动开发0-环境搭建 学习Linux驱动开发,当然得有一个自 ...
- Linux设备驱动开发基础
1.驱动概述和开发环境搭建 1.1驱动设备的作用 对设备驱动最通俗的解释就是"驱动硬件设备行动".驱动与底层硬件直接打交道,按照硬件设备的具体工作方式,读写设备的寄存器,完成设备的 ...
- 《Linux设备驱动开发详解(第2版)》隆重出版
Linux设备驱动开发详解(第2版)(前一版狂销3万册,畅销书最新升级) [新品] 点击看大图 基本信息 * 作者: 宋宝华 * 出版社:人民邮电出版社 * ISBN:97 ...
- NXP LS1046A及飞腾新四核 FT2004 PCIE EP端LINUX设备驱动开发
文章目录 前言 一.PCIE 硬件简介 二.PCIE EP地址映射原理介绍 1. PCI总线的各种域(存储器域.PCI总线域) 2. 开发EP设备驱动要做的事 三.NXP LS1046A PCIE E ...
- linux设备驱动开发详解孔夫子,Linux设备驱动开发详解
[内容简介] <Linux设备驱动开发详解(第2版)>是一本介绍linux设备驱动开发理论.框架与实例的书,<Linux设备驱动开发详解(第2版)>基于ldd6410开发板,以 ...
- 《Linux设备驱动开发详解 A》一一2.3 接口与总线
本节书摘来华章计算机出版社<Linux设备驱动开发详解 A>一书中的第2章,第2.3节,作者:宋宝华 更多章节内容可以访问云栖社区"华章计算机"公众号查看.1 2.3 ...
最新文章
- 【Flutter】Flutter 调试 ( 调试回退功能 | Debug 调试中查看变量的方式 | 控制台信息 )
- class ts 扩展方法_ts类型声明文件的正确使用姿势
- python编程小案例_用Python3编程写第一个小案例!-Go语言中文社区
- deinstall oracle 11g on linux
- HDU-2036 改革春风吹满地 (多边形面积求解)
- 【故障诊断分析】滚动轴承故障诊断系统含Matlab源码
- 【千锋Python2205班10.8笔记-day11-函数基础(一阶段)】
- python sasl_python用sasl的方式连接ldap提示
- Python——绑定与方法调用
- MATLAB函数bsxfun
- Theano的安装及GPU的配置
- 软件工程的顶会和顶刊
- HDU - 3594 Cactus (强连通缩点+STL)
- c语言中1120是什么错误,C++编译常见问题汇总(二)fatal error LNK1120 错误
- 开源 免费 java CMS - FreeCMS1.4-统计分析
- 国内终端安全防护市场报告发布 360网神排行第一
- markdown文件的常用编写语法(图文并茂)
- 2021年全球与中国研磨片行业市场规模及发展前景分析
- STC单片机驱动TM1640
- 在Android开发中不要再用new Thread的方式开启线程啦
热门文章
- python足球数据可视化_NBA数据分析_python可视化数据分析_可视化数据分析工具_可视化分析工具-帆软...
- 计算机一级考试题库操作题手机版,全国计算机一级操作考试题库示范
- kvm-qemu使用kgdb、出现Guest has not initialized the display和代码覆盖率
- linux查询redis过期得到-2,Redis数据过期策略探究
- 图片、音视频消息上传优化
- 太空测试第一名至联云t01248告诉你,质押率怎么算?
- kubeadm 部署kubernetes 1.26.1集群 Calico BGP ToR配置
- SQL Server 2008的外围应用配置器到哪里去了
- SQL Server 2008的外围应用配置工具在哪里?
- STM32 |显示:API is not found, corresponding pack is missing or not selected