linux设备驱动开发之环境搭建(基于exynos4412)_[/home/hqyj/arm/linux-3.14/scripts/kconfig/makefil-程序员宅基地

技术标签: ARMv7-A系列  运维  linux  驱动开发  

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

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.
else
 KERNELDIR ?= ~/linux-3.14
 PWD := $(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设备驱动开发环境搭建。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_47140521/article/details/125630094

智能推荐

Android 可折叠式标题栏的实现_android coordinatorlayout floatingactionbutton col-程序员宅基地

文章浏览阅读1.1k次。先看效果图:一、实现步骤:1、布局文件<?xml version="1.0" encoding="utf-8"?><androidx.coordinatorlayout.widget.CoordinatorLayout ="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="_android coordinatorlayout floatingactionbutton collapsingtoolbarlayout

宋仕强论道之华强北科技创新说,“创新”是深圳市和华强北灵魂,创新再加上敢想敢干永不言败,造就了深圳市经济奇迹和华强北财富神话_华强北可以面向市场融到资本-程序员宅基地

文章浏览阅读400次,点赞4次,收藏2次。华强北的主要业务模式,是把电子元器件卖给下游的硬件生产企业。华强北是电子信息产业大IP,福田区有金融、会展优势,结合电子元器件国产化的大势,可以在华强北打造国产集成电路展厅,为国产半导体品牌和公司的宣传推广、技术交流和合作服务,对有前途的公司资金扶持和资源对接,推动行业的良性发展。按照此思路,萨科微(www.slkoric.com)半导体在互联网发力,致力于把萨科微半导体官网打造成为专业性、生态型、包容性的平台,开设了技术交流、名家专栏、资料查询、电子资讯、行业应用、电子小百科等专栏。_华强北可以面向市场融到资本

设计模式六大原则之里氏替换原则_设计模式中的里斯代替原则-程序员宅基地

文章浏览阅读295次。里氏替换原则1. 由来肯定有不少人跟我刚看到这项原则的时候一样,对这个原则的名字充满疑惑。其实原因就是这项原则最早是在1988年,由麻省理工学院的一位姓里的女士(Barbara Liskov)提出来的。If for each object o1 of type S there is an object o2 of type T suchthat for all programs P d..._设计模式中的里斯代替原则

蓝牙基础技术(一)_蓝牙工作在( )ghz的ism频段,蓝牙设备在通信连接状态下,有四种工作模式:激活模-程序员宅基地

文章浏览阅读3.9k次,点赞3次,收藏25次。1、蓝牙简介蓝牙特点:蓝牙是一种短距无线通信的技术规范。蓝牙的特点可归纳为以下几点:(1)全球范围使用:蓝牙工作在2.4GHz的ISM频段全球大多数国家ISM频段的范围是2.4-2.4835GHz,使用该频段无需向各国申请许可。(2)同时可传输语音和数据:蓝牙采用电路交换和分组交换技术,支持异步数据信道、三路语音信道以及异步数据与同步语音同时传输的信道。每个语音信道数据速率为64kbit/s,语音信道编码采用脉冲编码调制(PCM)或连续可变斜率增量调制(CVSD)方法。当采用非对称信道传输数据时,速率_蓝牙工作在( )ghz的ism频段,蓝牙设备在通信连接状态下,有四种工作模式:激活模

Java反射机制概念(运行状态中知道类所有的属性和方法)_10.-java中的class类是反射机制的核心类之一,它可以用来获取类的信息。(2分)-程序员宅基地

文章浏览阅读884次,点赞2次,收藏2次。在Java中的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法;并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。反射的应用场合:首先说一下编译时类型和运行时类型 :在Java程序中许多对象在运行是都会出现两种类型:编译时类型和运行时类型。 编译时的类型由声明对象时实用的类型来决定,运行时的类型由实际赋值给对象的类型决定 。如: Person p=new Student(); 其中编译时类型为Person_10.-java中的class类是反射机制的核心类之一,它可以用来获取类的信息。(2分)

epsonl360打印机连接电脑_EPSONL360打印机怎么安装驱?-程序员宅基地

文章浏览阅读1.7k次。2013-09-15EPSONL301怎么设置成网络一、IP地址设置在完成打印机与网络的硬件连接后,首先要给打印机分配IP地址。网络打印机IP地址的获得主要通过以下三种方式,一是支持DHCP的打印服务器可以在支持DHCP的网络中由服务器自动分配设置;二是由厂商提供网络管理软件,通过服务器或终端分配设置;三是在打印机控制面板上手工配置。 在后两种方式下,需要向网络管理员申请此打印机的IP地址,并得..._epsonl360打印照片设置

随便推点

Failed to download metadata for repo ‘AppStream‘: Cannot download repomd.xml: Cannot download repoda_failed to download metadata for repo 'appstream': -程序员宅基地

文章浏览阅读6.3k次,点赞24次,收藏27次。CentOS在使用yum命令的时候报错:Failed to download metadata for repo ‘AppStream’: Cannot download repomd.xml: Cannot download repodata/repomd.xml: All mirrors were tried原因:2022年1月1日起CentOS官方将不再对CentOS 8提供服务支持,虽然系统可以正常使用,但CentOS 8的yum源已经移除无法使用了,使用yum安装会报错解决方法:按顺序执行一_failed to download metadata for repo 'appstream': cannot download repomd.xml

"Caused by: org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.en_nested exception is org.hibernate.mappingexception-程序员宅基地

文章浏览阅读1.6k次。今天写Hibernate双向多对多Demo时候,出现了这么个东西。"Caused by: org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister"哎哟喂,这个弟弟我还是头一次见,英文通俗易懂,但是看完了还是..._nested exception is org.hibernate.mappingexception: could not get constructo

Python关于%matplotlib inline_如何在python中运行%matplotlib inline-程序员宅基地

文章浏览阅读905次。Python关于%matplotlib inline我在做一个比赛需要使用到LSTM模型对时间序列进行预测,然后在github代码中经常会看到这样的代码:提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录Python关于%matplotlib inline前言一、%matplotlib inline?二、使用步骤1.引入库2.%matplotlib作用总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启_如何在python中运行%matplotlib inline

python图片转化字节流_python字节流怎么转化成图片-程序员宅基地

文章浏览阅读4k次。因为图片在传输的过程中,不太方便,所以使用base64进行转换形式,来传输。首先把图片转为字节流,进行传输,接受到数据后,在把字节转换为图片进行生成(推荐学习:Python视频教程)图片转字节流import base64# 图片转字节def tu_zi_jie():with open('jiu.png','rb') as fp:tu = base64.b64encode(fp.read())# 生..._python图片转化字节流

android 4.03有感-程序员宅基地

文章浏览阅读71次。今天在公司的时候手动刷了android 系统4.03 (也可以等待ota),以一个非专业的角度来看,比2.x漂亮了很多,蓝色,黑色,两种颜色的柔和不会那么突兀,觉得很柔和,每一个角都有着美的味道,运行速度方面比之前的2.36流畅 是不是启动了硬件加速?不得而知 , 看来google也知道了自己的最大的问题 , 希望越来越好,在流畅性上能在做些修改。非专业的非专业评论结束...

SQL Server 2019安装教程(图文)_sql2019安装教程图解-程序员宅基地

文章浏览阅读5.3w次,点赞74次,收藏466次。本章教程,介绍一下SQL Server 2019的安装过程。SQL Server 是Microsoft 公司推出的关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高等优点。Microsoft SQL Server 是一个全面的数据库平台,使用集成的商业智能 (BI)工具提供了企业级的数据管理。Microsoft SQL Server 数据库引擎为关系型数据和结构化数据提供了更安全可靠的存储功能,使您可以构建和管理用于业务的高可用和高性能的数据应用程序。_sql2019安装教程图解