orangepi3 lts动态加载驱动

13 篇文章 0 订阅
8 篇文章 0 订阅

orangepi3 lts驱动编译

源码下载

按照手册指示从github下载或直接从百度网盘下载

git clone https://github.com/orangepi-xunlong/orangepi-build.git
# 百度网盘 https://pan.baidu.com/share/init?surl=vWQmCmSYdH7iCDFyKpJtVw
# 密码     zero
# 里面有几个源码文件
# orangepi-build是旧版本的源码文件
# orangepi-build-h6支持linux4.9,linux5.3,linux5.10三个版本,是相对稳定版本
# orangepi-build-new支持linux5.10,linux5.16是比较新的版本
# orangepi-build-rk3399是rk3399的源码,不是orangepi3 lts源码
# 推荐下载第二个或第三个

源码配置

下载完成后需要配置下,不然会有更新操作,国内的网络连github太费时间了。

# 解压
tar zxvf orangepi-build-h6
cd orangepi-build

# 不更新文件
cd userpatches
vi config-default.conf
# 关闭更新
IGNORE_UPDATES="yes"
# 不配置内核选项
KERNEL_CONFIGURE="no"

cd scripts
vi main.sh
# 搜索到 CTHREADS="-j1",改为-j8。强制使用多核心编译
CTHREADS="-j8"

内核编译

# 编译内核
sudo ./build.sh
# 1. 选Kernel package
# 2. 选主板orangepi3-lts
# 3. 选分支,根据自己情况选择
# 4. 等待编译生产debs文件,生成的dtb文件位置:output/debs
linux-dtb-current-sunxi64_2.1.6_arm64.deb
linux-headers-current-sunxi64_2.1.6_arm64.deb
linux-image-current-sunxi64_2.1.6_arm64.deb
# 这三个文件都传递到开发板,可以用ftp,scp

安装内核到开发板

登陆开发板,找到传递过去的三个deb包。先卸装旧版本的再安装新编译的。

# 卸装原来的
# 根据自己开发板上安装的包卸装
dpkg --list |grep linux-
sudo apt purge -y linux-dtb-current-sunxi64
sudo apt purge -y linux-headers-current-sunxi64
sudo apt purge -y linux-image-current-sunxi64
# 安装新编译的包
sudo dpkg -i linux-*

驱动编写

/*************** file: hello.c  ******************/
#include <linux/module.h>
#include <linux/init.h>


int __init hello_init(void);
void __exit hello_exit(void);

module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");

int __init hello_init(void){
        printk(KERN_INFO"hello init!!!\n");
        return 0;
}

void __exit hello_exit(void){
        printk(KERN_INFO"Hello exit!!!n");
}
/**************** end of hello.c **********************/

/**************** Makefile ****************************/
# 这里编译是直接在开发板上已经运行的系统上编译,所以不用指定ARCH和CROSS_COMPILE>选项
# 防止加载模块时:module verification failed : signature and/or required key missing - tainting kernel
CONFIG_MODULE_SIG=n
# 板子上的headers文件目录
KERNDIR:=/lib/modules/5.10.75-sunxi64/build
PWD:= $(shell pwd)

obj-m:= hello.o

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

clean:
  make -C $(KERNDIR) M=$(PWD) clean
/******************* end of Makefile ******************/

编译驱动模块

其实正常外部编译驱动模块应该有2种方法:

  1. 使用linux相同版本的源码文件指定ARCH和CROSS_COMPILE编译
  2. 就是本文采用的方法,在已经运行的系统上编译,源码指向headers目录

开始我是想使用方法一编译的,其它板子大部份教程也是使用的方法一编译。但在orangepi3 lts上是有问题的,我经过测试发现的问题如下:

  • 内核单独编译只能生成Image格式文件,不能生成uImage和zImage
  • 内核编译要加上特定变量ARCH=arm LOCALVERSION="sun50iw6"。第一个选项没啥说的选
    arm平台,第二个选项我是自己查看它的编译脚本自己提取出来的。
  • 驱动模块编译时也要加入前面两个选项,orangepi-build-new源码下的linux5.16内核编译完成后,编译驱动模块依然会出错误:cc1: error: plugin arm_ssp_per_task_plugin should be specified before ‘-fplugin-arg-arm_ssp_per_task_plugin-offset=1088’ in the command line
  • 同一版本内核编译的驱动模块,依然不能加载`ERROR: could not insert module hello.ko: Operation not permitted`

因此就只能直接在开发板的linux系统上编译,指定源码目录为/lib/modules/5.10.75-sunxi64/build。不用指定ARCH和CROSS_COMPILE变量。
编译好后使用insmod, modinfo,rmmod

最后用dmesg -C先清理一下系统日志,再用insmod加载,查看dmesg可以看到模块正常加>载了。

失败的探索

最开始我是按大多数驱动编写教程的方式,编译驱动模块只加入ARCH,CROSS_COMPILE和内核
目录位置三个参数,无论如何都不能编译通过,后来实在没有办法自己查看build.sh等脚本
文件才完成了单独内核文件编译。过程如下:

# 进入内核文件位置
cd orangepi-build/kernel/orange-pi-5.10
# 复制配置文件
make ARCH=arm sunxi_defconfig
# 编译
make ARCH=ARM -j8 CROSS_COMPILE=源码目录下toolchains/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin/arm-none-linux-gnueabihf- LOCALVERSION="sun50iw6" Image modules

前面的Makefile文件也要加入ARCH,CROSS_COMPILE,KERNEL_SRC目录位置,变成好下形式:

/**************** Makefile ****************************/
# 这里编译是直接在开发板上已经运行的系统上编译,所以不用指定ARCH和`CROSS_COMPILE`选项
# 防止加载模块时:module verification failed : signature and/or required key missing - tainting kernel
CONFIG_MODULE_SIG=n
# 板子上的headers文件目录
KERNDIR:=orangepi-build(所在目录)/kernel/orange-pi-5.10
CROSS_COMPILE=源码目录下toolchains/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin/arm-none-linux-gnueabihf-

obj-m:= hello.o

all:
  make -C $(KERNDIR) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) LOCALVERSION="sun50iw6" M=$(PWD) modules

clean:
  make -C $(KERNDIR) M=$(PWD) clean
/******************* end of Makefile ******************/

然后就是make生成hello.ko,但传递到开发板上后insmod加载就会出现问题。确定源码和开
发板运行的版本是一致的。目前未找到解决方法,希望那个谁能解下惑。

另外用最新的orangepi-build-new最新分支编译的linux-headers-next-sun50iw6_3.0.4_arm64.deb安装时报如下错误:

Selecting previously unselected package linux-headers-next-sun50iw6.
(Reading database ... 66857 files and directories currently installed.)
Preparing to unpack linux-headers-next-sun50iw6_3.0.4_arm64.deb ...
Unpacking linux-headers-next-sun50iw6 (3.0.4) ...
Setting up linux-headers-next-sun50iw6 (3.0.4) ...
Compiling headers - please wait ...
/bin/sh: 1: scripts/basic/fixdep: Exec format error
make[1]: *** [scripts/Makefile.host:112: scripts/kconfig/conf.o] Error 2
make[1]: *** Deleting file 'scripts/kconfig/conf.o'
make: *** [Makefile:621: oldconfig] Error 2
/bin/sh: 1: scripts/basic/fixdep: Exec format error
make[2]: *** [scripts/Makefile.host:112: scripts/kconfig/util.o] Error 2
make[2]: *** Deleting file 'scripts/kconfig/util.o'
make[2]: *** Waiting for unfinished jobs....
/bin/sh: 1: scripts/basic/fixdep: Exec format error
make[2]: *** [scripts/Makefile.host:112: scripts/kconfig/conf.o] Error 2
make[2]: *** Deleting file 'scripts/kconfig/conf.o'
/bin/sh: 1: scripts/basic/fixdep: Exec format error
make[2]: *** [scripts/Makefile.host:112: scripts/kconfig/confdata.o] Error 2
make[2]: *** Deleting file 'scripts/kconfig/confdata.o'
make[1]: *** [Makefile:621: syncconfig] Error 2
make: *** [Makefile:734: include/config/auto.conf.cmd] Error 2
make: *** [include/config/auto.conf.cmd] Deleting file 'include/generated/autoconf.h'

  ERROR: Kernel configuration is invalid.
         include/generated/autoconf.h or include/config/auto.conf are missing.
         Run 'make oldconfig && make prepare' on kernel src to fix it.

make: *** [Makefile:742: include/config/auto.conf] Error 1

因此目前使用最新的linux5.16分支安装header还是不行的,只能使用linux5.10分支编译的内核能完成驱动模块编译和动态安装

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 要升级20.04.1 LTS到20.04.3 LTS,您可以按照以下步骤进行操作。 首先,确保您的系统已经连接到互联网,并且具有管理员权限。您可以通过“系统设置”菜单中的“网络”选项来检查您的网络连接状态。 接下来,打开终端。您可以使用Ctrl+Alt+T组合键来快速打开终端。 在终端中,输入以下命令来更新您现有的软件包列表: sudo apt update 这会从软件源中获取最新的软件包信息。 然后,执行以下命令来进行系统升级: sudo apt upgrade 这将升级您所有已安装的软件包到最新版本。如果有需要,系统会提示您确认升级操作。 接着,输入以下命令来升级到下一个LTS版本: sudo do-release-upgrade 这会启动升级过程,系统会下载并安装20.04.3 LTS版本的所有必要的软件包。 在升级过程中,系统可能会提示您确认一些更改,如配置文件的替换或更新。请仔细阅读和理解提示信息,并按照系统的指示进行操作。 在升级完成后,重新启动您的系统以使更改生效: sudo reboot 请留意,在升级过程中,可能需要一些时间来完成所有操作。另外,强烈建议在升级前备份重要的文件和数据。 完成以上步骤后,您的系统将成功升级到20.04.3 LTS版本,享受新版本所提供的增强功能和修改。 ### 回答2: 20.04.1 LTS是Ubuntu操作系统的一个版本,而20.04.3 LTS则是其后续版本的一个更新。升级到20.04.3 LTS有以下几个步骤。 首先,确保您的计算机已连接到互联网。在升级之前,建议备份重要的文件和数据,以防止意外数据丢失。 然后,打开终端并运行以下命令来更新软件包列表: sudo apt update 接着,运行以下命令升级系统: sudo apt upgrade 系统将提示您输入管理员密码,然后会开始下载并安装可用的软件包更新。这可能需要一些时间,取决于您的互联网连接速度和系统配置。 完成升级后,您可以运行以下命令来检查系统版本: lsb_release -a 这将显示当前安装的Ubuntu版本号,如果显示为20.04.3,则表示成功升级到最新的LTS版本。 升级到20.04.3 LTS可以获得更多新功能和改进,同时还包括各种修复程序和安全更新。建议定期升级操作系统以获取最新的功能和安全性保护。 最后,记得重新启动计算机以应用所有更改。 总结起来,升级到20.04.3 LTS只需运行几个简单的命令并等待系统完成更新。确保备份重要数据,并定期更新操作系统以保持最新和安全的状态。 ### 回答3: 要将Ubuntu 20.04.1 LTS升级到20.04.3 LTS,您可以按照以下步骤操作: 1. 确保您的系统已连接到互联网,并通过更新软件源来获取最新的软件包和安全更新。 2. 打开终端(Ctrl + Alt + T),输入以下命令以更新软件源: ``` sudo apt update sudo apt upgrade ``` 此命令将更新已安装的软件包,但不会进行系统升级。 3. 在终端中,输入以下命令来安装软件更新管理工具“update-manager-core”(如果尚未安装): ``` sudo apt install update-manager-core ``` 4. 在终端中,输入以下命令以升级系统到最新的Ubuntu 20.04.3 LTS版本: ``` sudo do-release-upgrade ``` 执行此命令后,您将看到一系列提示,其中包括有关新版本的信息和升级进度。根据提示,选择“Y”(是)或“N”(否)来继续或取消升级过程。 5. 升级过程可能需要一些时间,具体时间取决于您的系统配置和互联网连接速度。请耐心等待,直到升级完成。 6. 升级完成后,您将被要求重新启动系统。在终端中,输入以下命令以重新启动: ``` sudo reboot ``` 7. 系统重新启动后,您可以验证系统是否成功升级到Ubuntu 20.04.3 LTS。在终端中,输入以下命令以检查版本信息: ``` lsb_release -a ``` 在输出中,您将看到Ubuntu版本号,确保它显示为20.04.3 LTS。 请注意,升级过程中可能会出现一些问题或冲突。为了避免数据丢失或系统损坏,请确保在升级前备份重要文件和设置,并始终遵循系统提示。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值