目录
配置说明:驱动代码的编译需要一个提前编译好的内核,所以需要先编译内核,而编译内核又必须提前完成相关的源码配置;
配置目标:最终生成 .config文件,该文件是指导Makefile去把有用东西的组织成内核。
● 查看树莓派原内核版本号: uname -r

● 树莓派Linux源码下载网址:https://github.com/raspberrypi/

(1)将下载好的工具链文件放入Windows中与Ubuntu的共享文件夹中;
(2)打开Ubuntu,从共享文件夹拷贝到工作目录。输入命令:
cp /mnt/hgfs/share/linux-rpi-4.14.y.zip .//我的共享文件名是share
(3) 解压文件: unzip linux-rpi-4.14.y.zip
● 第一种方法:我们买的开发板厂家一般会自配linux内核的源码,比如买了树莓派,树莓派一般自带linux内核源码。直接使用厂家的.config文件进行配置。
进入源码文件搜索 指令:
find . -name *_defconfig

树莓派1的工程是bcmrpi_defconfig,
树莓派2、3的工程是bcm2709_defconfig。
配置说明:直接把厂家.config拷贝成.config cp 厂家.config .config
下面命令是将工程bcm2709_defconfig配置到 .config里
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig
| ARCH=arm | 指明当前要编译arm,虽然树莓派是64位的,这里仍然选择arm,而不是arm64。 |
| CROSS_COMPILE | 指明交叉工具链名称。 |
| KERNEL | 指明kernel类型,树莓派1设置为kernel,树莓派2、3设置为kernel7。 |

● 第二种方法:make menuconfig 一项项配置,通常是基于厂家的config来配置
安装以下内容:
sudo apt-get install bc
sudo apt-get install libncurses5-dev libncursesw5-dev
sudo apt-get install zlib1g:i386
sudo apt-get install libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5
输入命令:
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make menuconfig
进入下图菜单页面即可进行相关配置

* 编译进内核 zImage包含了驱动
M 模块方式生成驱动文件xxx.ko 系统启动后,通过命令inmosd xxx.ko 加载
● 第三种方法 :完全靠自己来移植
对树莓派内核源码进行配置后,接下来就要进行树莓派Linux内核的编译,需要树莓派交叉编译工具、树莓派内核。
交叉编译工具链的下载和环境配置在我的这篇文章有详细介绍:http://t.csdn.cn/w7wBm
在上面的基础上输入下面指令进行编译:
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs
//编译时长大概20分钟
| j4 | 指定用多少电脑资源进行编译(多少核 4核,根据自己虚拟机配置) |
| zImage | 生成内核镜像 |
| modules | 要生成驱动模块 |
| dtbs | 生成配置文件 |
编译完成后,可以看到源码树目录多了vmlinux这个文件,如果编译失败则没有此文件,成功后,目标zImage镜像在arch/arm/boot目录下(此步ARM架构的芯片都是类似)(vmlinux是未压缩的liunx,zImage是压缩好的liunx)。

检查是否编译成功:若生成zImage文件则编译成功
● 错误提示:
/usr/bin/ld: scripts/dtc/dtc-parser.tab.o:(.bss+0x10): multiple definition of `yylloc'; scripts/dtc/dtc-lexer.lex.o:(.bss+0x0): first defined here
● 解决方案:
修改scripts/dtc目录下的dtc-lexer.lex.c_shipped文件中找到
YYLTYPE yyloc这一行,在640行左右的位置,在之前面加上extern //不加分号;
保存退出,
make 编译
正常编译
① 打包zImage文件。打包zImage成树莓派可用的xxx.img
./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img

② 树莓派断电,拔出树莓派的SD卡,插到读卡器,读卡器插入电脑,映射到虚拟机
🔺插入读卡器会有如下图选项提示,选择虚拟机及名称。如果没有如下提示,一定要自己调试,防止主机读走USB数据。

然后在命令行输入指令:dmesg查看底层的一些硬件数据,这里查看读卡器映射的内容
sudo sysctl kernel.dmesg_restrict=0

连接USB成功:出现sdb1、sdb2则为连接成功,如果只有一个sdb1,则需要重新往SD刷入系统(有可能是sdc1、sdc2或者sdd1、sdd2)。
把树莓派的sd卡插入ubuntu系统电脑,树莓派的sd卡有两个分区:
● 一个fat分区,是boot相关的内容,kernel的img文件就放在这个分区里;
● 一个是ext4分区,也就是系统的根目录分区。

③ 数据拷贝,挂载U盘
回到工作目录,mkdir创建data1和data2两个目录,分别挂载两个分区的内容
dhw@dhw-virtual-machine:~$ mkdir data1
dhw@dhw-virtual-machine:~$ mkdir data2
挂载U盘

● data1是fat分区,是boot相关的内容,kernel的img;
● data2是ext4分区,也就是系统的根目录分区。
④ 安装modules。含有设备驱动文件:比如HDMI,WIFI,USB,IO等
在ext4分区操作,这里的data2分是ext4分区,需要root权限。
sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=/home/dhw/data2 modules_install
⑤ 安装更新 kernel.img 文件,注意镜像名字是kernel7.img
备份kernel7.img,防止存在错误操作:
● cd /home/dhw/data1
● cp kernel7.img kernel7OLD.img

⑥ 把打包的kernel_new.img文件,拷贝到data1分区,起名kernel7.img,覆盖原来的kernel7.img
cp kernel_new.img /home/dhw/data1/kernel7.img

检查拷贝是否有误:md5sum
Linux中,每个文件都有一个编码号,就是md5的值。如果拷贝文件出错,md5的值就会发生变化。
下图中原文件和拷贝后的文件md5的值一样,说明拷贝无误。

⑦ 拷贝其他相关文件
cp arch/arm/boot/dts/.*dtb* /home/dhw/data1
cp arch/arm/boot/dts/overlays/.*dtb* /home/dhw/data1/overlays/
cp arch/arm/boot/dts/overlays/README /home/dhw/data1/overlays/
⑧ 虚拟机弹出USB,让USB被主机识别
进入cmdline.txt文件,添加红框里的部分,目的是稳妥起见,让操作系统能正常运行

⑨ SD卡插入树莓派,用串口登陆,就能看见操作系统运行起来
查看内核版本:uname -r
树莓派Linux更换内核前的版本号:

树莓派Linux更换内核后的版本号:

完成换源 !
我有一个在Linux服务器上运行的ruby脚本。它不使用rails或任何东西。它基本上是一个命令行ruby脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我不知道为什么,但是当我设置这个设置时它无法编译设置:static_cache_control,[:public,:max_age=>300]这是我得到的syntaxerror,unexpectedtASSOC,expecting']'(SyntaxError)set:static_cache_control,[:public,:max_age=>300]^我只想将“过期”header设置为css、javaascript和图像文件。谢谢。 最佳答案 我猜您使用的是Ruby1.8.7。Sinatra文档中显示的语法似乎是在Ruby1.
一、引擎主循环UE版本:4.27一、引擎主循环的位置:Launch.cpp:GuardedMain函数二、、GuardedMain函数执行逻辑:1、EnginePreInit:加载大多数模块int32ErrorLevel=EnginePreInit(CmdLine);PreInit模块加载顺序:模块加载过程:(1)注册模块中定义的UObject,同时为每个类构造一个类默认对象(CDO,记录类的默认状态,作为模板用于子类实例创建)(2)调用模块的StartUpModule方法2、FEngineLoop::Init()1、检查Engine的配置文件找出使用了哪一个GameEngine类(UGame
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m
注意:本文主要掌握DCN自研无线产品的基本配置方法和注意事项,能够进行一般的项目实施、调试与运维AP基本配置命令AP登录用户名和密码均为:adminAP默认IP地址为:192.168.1.10AP默认情况下DHCP开启AP静态地址配置:setmanagementstatic-ip192.168.10.1AP开启/关闭DHCP功能:setmanagementdhcp-statusup/downAP设置默认网关:setstatic-ip-routegeteway192.168.10.254查看AP基本信息:getsystemgetmanagementgetmanaged-apgetrouteAP配
1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
我是ruby的新手,正在配置IRB。我喜欢pretty-print(需要'pp'),但总是输入pp来漂亮地打印它似乎很麻烦。我想做的是默认情况下让它漂亮地打印出来,所以如果我有一个var,比如说,'myvar',然后键入myvar,它会自动调用pretty_inspect而不是常规检查。我从哪里开始?理想情况下,我将能够向我的.irbrc文件添加一个自动调用的方法。有什么想法吗?谢谢! 最佳答案 irb中默认pretty-print对象正是hirb被迫去做。Theseposts解释hirb如何将几乎所有内容转换为ascii表。虽
我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO