首页 > 系统相关 >NanoPi-NEO 全志H3移植Ubuntu 22.04 LTS、u-boot、Linux内核/内核树、mt7601u USB-Wi-Fi支持、配置CLion用于Linux驱动开发

NanoPi-NEO 全志H3移植Ubuntu 22.04 LTS、u-boot、Linux内核/内核树、mt7601u USB-Wi-Fi支持、配置CLion用于Linux驱动开发

时间:2024-04-21 12:44:35浏览次数:31  
标签:LTS mount sudo boot dev apt 内核 Linux

前言

想在NanoPi-NEO上开发屏幕驱动,但是看了下文件目录发现没有内核树,导致最基础的file_operations结构体都无法使用,于是寻找内核树安装方法。但官方提供的内核为4.14太旧了apt找不到对应的linux-source版本(其实后面发现不需要用apt,可以在kernel.org上下载,但反正都装了那就当学习一下怎么移植了),于是选择自己重新构建了整个系统。

1. 准备工作

  1. x86_64 Linux 机器或者虚拟机。

如果是Apple Silicon Mac最好用UTM安装一个x86_64 Ubuntu server,因为本文使用的安装rootfs的工具仅x86_64系统可用。
当然也有buildrootdebootstrap方法。debootstrap感觉一般;buildroot或许会比本文方法更好用,但我没用,想使用这种方法可以考虑去参考这篇文章

  1. 一张sd卡。
  2. 创建一个文件夹存放移植所需各种文件,如 ~/nanopi-neo

2. 准备SD卡

  1. 可以选择直接从 NanoPi-NEO 官网烧录一个镜像到SD卡,他会自动帮你分好区(不过也需要修改),也可以手动操作。
  2. 使用fdisk进行分区操作(假设这里SD卡是/dev/sdb,且已经烧录官方镜像)[1]
sudo fdisk /dev/sdb

# 输入m查看各种命令
m
# 输入p打印分区情况
p

  1. 如图,sdb1boot分区,sdb2rootfs分区

  2. 官方镜像可能会多一个sdb3存放userdata,需要删除后两个分区并格式化,下面展示将末尾分区删除。

  3. 使用如下所示命令创建分区。

  4. 其中sector部分延续sdb1131071,第二个直接留空

  5. 运行下面的命令将rootfs分区格式化

sudo mkfs.ext4 -L rootfs /dev/sdb2

你也可以选择从头创建SD启动卡,关于这部分可以查看该教程,这里不做展开

3. 移植u-boot

  1. Github 上下载最新 u-boot.tar.gz,这里以2024.04为例[2]

  2. Arm GNU 官网按图寻找下载正确的交叉编译链。

  3. 解压

cd nanopi-neo/
tar -vxzf u-boot-2024.04.tar.gz
tar -vxf arm-gnu-toolchain-13.2.rel1-x86_64-arm-none-linux-gnueabihf.tar.xz
  1. 安装交叉编译链
# 修改交叉编译链文件名方便操作
mv arm-gnu-toolchain-13.2.rel1-x86_64-arm-none-linux-gnueabihf arm-none-linux-gnueabihf

# 移动文件夹
sudo mkdir -p /usr/local/toolchains
sudo mv arm-none-linux-gnueabihf /usr/local/toolchains/

# 添加环境变量
vim .bashrc
# 添加以下三行
export PATH=/usr/local/toolchains/arm-none-linux-gnueabihf/bin/:$PATH
export ARCH=arm
export CROSS_COMPILE=arm-none-linux-gnueabihf-
  1. 编译 u-boot
cd u-boot-2024.04/
# 生成配置文件
make nanopi_neo_defconfig
# 生成烧录文件 u-boot-sunxi-with-spl.bin
make -j8
# 烧录到SD卡
sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8 oflag=direct

出现错误一般是有模块没有安装,可以自行搜索怎么安装

4. 移植kernel

  1. Kernel Archives 上下载最新的stable版本 Linux 内核,这里以6.8.7为例[2:1]
  2. 编译配置文件
# 解压
cd ~/nanopi-neo/
tar -vxf linux-6.8.7.tar.xz

# 安装一些工具(可能不全,如果编译遇到缺工具就安装一下)
sudo apt-get install libncurses-dev gawk flex bison openssl libssl-dev dkms libelf-dev libudev-dev libpci-dev libiberty-dev autoconf dwarves bc

cd linux-6.8.7/
# 生成配置文件.config
make sunxi_defconfig
  1. 增加usb-wifi支持(本文以mt7601u为例)[3]
make menuconfig

按下/搜索mt7601u,按enter进行搜索它所需的依赖项

截个屏或者拍个照,找到所有[=n]的对应内容按下y将它加入内核编译中

如果按y出现弹框,并且关闭弹框后发现是M不是*的话,记得用/寻找对应内容并一一加入内核编译。
如图是未配置进内核而是配置为module,需要寻找其他依赖项一一加入内核编译

一直按esc直到出现该界面,按enter选择保存配置

  1. 编译zImagesun8i-h3-nanopi-neo.dtb
# 编译时间大概1-2小时
make -j8
  1. 安装到SD卡中
sudo mount /dev/sdb1 /mnt
sudo cp arch/arm/boot/zImage /mnt/zImage
sudo cp arch/arm/boot/dts/allwinner/sun8i-h3-nanopi-neo.dtb /mnt/sun8i-h3-nanopi-neo.dtb
sync
sudo umount /mnt
  1. 将SD卡插入开发板中,进入u-boot命令行拉取内核启动[4]
setenv bootcmd 'fatload mmc 0 0x46000000 zImage; fatload mmc 0 0x48000000 sun8i-h3-nanopi-neo.dtb; bootz 0x46000000 - 0x48000000'
setenv bootargs "console=ttyS0,115200 earlyprintk root=/dev/mmcblk0p2 rootfstype=ext4 rw rootwait"
saveenv
boot

5. 移植rootfs

  1. Ubuntu cdimage 下载镜像[5],本文使用Ubuntu 22.04 LTS,则进入jammy/daily/current/目录下载jammy-base-armhf.tar.gz
  2. 创建文件夹并解压
cd ~/nanopi-neo/
mkdir temp
sudo tar -xpf jammy-base-armhf.tar.gz.tar.gz -C temp
  1. 安装qemu-user-static(就是这东西只支持x86_64,害我好几天配置不好)
sudo apt-get install qemu-user-static
  1. 准备工作
# 网络文件
sudo cp -b /etc/resolv.conf temp/etc/resolv.conf
# qemu文件
sudo cp /usr/bin/qemu-arm-static temp/usr/bin/

# 创建mount.sh文件
touch mount.sh
sudo vim mount.sh
  1. mount.sh文件内容如下
#!/bin/bash
mnt() {
	echo "MOUNTING"
	sudo mount -t proc /proc ${2}proc
	sudo mount -t sysfs /sys ${2}sys
	sudo mount -o bind /dev ${2}dev
	sudo mount -o bind /dev/pts ${2}dev/pts
}
umnt() {
	echo "UNMOUNTING"
	sudo umount ${2}proc
	sudo umount ${2}sys
	sudo umount ${2}dev/pts
	sudo umount ${2}dev
}

if [ "$1" == "-m" ] && [ -n "$2" ] ;
then
	mnt $1 $2
elif [ "$1" == "-u" ] && [ -n "$2" ];
then
	umnt $1 $2
fi

很多教程这里会让你换国内源,但是我每次换源后apt很多东西装不上,因此请自行选择是否换apt源
关于换源方法见:清华 Ubuntu Ports 软件仓库

  1. 使用chroot进入根目录
# 修改文件权限
chmod 777 mount.sh
# 运行.sh文件
./mount.sh -m temp/
# 切换root
sudo chroot temp
  1. 运行必要命令
# apt更新
apt update
apt upgrade
apt-get update

# 安装必要工具
apt install -y systemd
apt install vim sudo openssh-server net-tools network-manager
apt install ifupdown htop iputils-ping kmod rsync

# 添加用户
useradd -s '/bin/bash' -m -G adm,sudo username
# 添加用户密码
passwd username
# 添加root密码
passwd root

# 退出
exit
./mount.sh -u temp/
  1. 把内核源码复制到rootfs
sudo cp -r linux-6.8.7/ temp/usr/src/
  1. 安装rootfs到SD卡
sudo mount /dev/sdb2 /mnt
sudo rm -rf /mnt/*
sudo cp -rp temp/* /mnt/
sudo umount /mnt/
  1. 插入SD卡,开机,首先连接网络
nmcli n
# 如果是disabled运行下面这行命令
nmcli n on
# 查看网络设备
nmcli dev

wifi一般是正常的,eth0如果是unmanaged则运行该命令[6]

sudo nmcli dev set eth0 managed yes

我这样成功了,但不保证一定可以。如果仍然不行可以看注脚的网址,那篇回答同时介绍了另一种方法

连接wifi

# 打开Wi-Fi
nmcli r wifi on
# 扫描附近Wi-Fi热点
nmcli dev wifi
# 连接Wi-Fi,替换SSID为Wi-Fi名,PASSWORD为Wi-Fi密码
nmcli dev wifi connect "SSID" password "PASSWORD" ifname wlx70f11c658d80

配置静态ip

# 获取当前ip(假设获取到ip为192.168.31.102)
ifconfig
# 将当前ip设为静态ip
sudo nmcli con mod wlx70f11c658d80 ipv4.method manual ipv4.addr 192.168.31.102/24 ipv4.gateway 192.168.31.1 ipv4.dns 192.168.31.1
sudo reboot
  1. 解决中文乱码[7]
locale -a


正常情况下这里应该只有CC.utf8POSIX,输入下面的命令

sudo dpkg-reconfigure locales

按3下enter直到出现如图所示内容

输入下面这些数字并回车

# en_US, zh_CN, zh_SG
160 492 497


选择自己想作为的系统主语言,回车,等待配置完成后重启即可。

  1. 修改hostname
#修改文件第一行为自己想要的名字即可
sudo vim /etc/hostname

6. 移植内核树

理论上只需要这样就可以了[8]

cd /usr/src/linux-6.8.7/
# 因为之前移植kernel编译过了,应该不用再make一遍了吧?
# 反正不行就再make一次(被打)
sudo make modules
sudo make modules_install

题外话(配置Clion用于Linux驱动开发)

这篇文章起因是Clion无法找到file_operations结构体,但这样移植之后还是找不到。配置Clion远程开发的教程很多,比如这篇,这里不做赘述,仅提出我这个问题的解决办法:

  1. CMakeLists.txt中加入这样一段
include_directories("/usr/src/linux-6.8.7/include/")
  1. File -> Reload CMake Project
  2. Tool -> Resync with Remote Hosts


  1. ubuntu制作SD启动卡 ↩︎

  2. 全志H3 | 移植主线最新uboot 2023.04和kernel 6.1.11到Nanopi NEO开发板 ↩︎ ↩︎

  3. usbwifi网卡mt7601u驱动配置 ↩︎

  4. Uboot命令 ↩︎

  5. Ubuntu rootfs customization ↩︎

  6. Ethernet device not managed ↩︎

  7. 解决ubuntu系统中文乱码问题 ↩︎

  8. 【Linux内核树】五步构建 ↩︎

标签:LTS,mount,sudo,boot,dev,apt,内核,Linux
From: https://www.cnblogs.com/erbws/p/18148793

相关文章

  • FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库
    ​《FFmpeg开发实战:从零基础到短视频上线》一书的例程主要测试本地的音视频文件,当然为了安全起见,很多网络视频都采用了https地址。FFmpeg若要访问https视频,就必须集成第三方的openssl库,但编译FFmpeg时却默认关闭了openssl。为了让App能够播放采用https的在线视频,需要编译安装并启......
  • 如何在linux中创建特定的脚本注释信息
    如何在linux中创建特定的脚本注释信息当然,以下是详细步骤在CentOS7系统中创建一个新的shell脚本模板并在Vim编辑器中配置自动加载模板的完整过程:步骤1:创建shell脚本模板首先,打开终端并创建一个模板文件,我们将其命名为.bash_script_template并放置在用户的家目录下:e......
  • Linux共享库、静态库、动态库详解
    1.介绍       使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级。 ......
  • 性能测试——性能测试-linux监控工具-Centos7.x安装Grafana
    2个参考:小菠萝:https://www.cnblogs.com/poloyy/p/12219145.html  Centos7安装GrafanaGrafana官网下载路径:https://grafana.com/grafana/download1、直接执行以下命令进行安装:wgethttps://dl.grafana.com/oss/release/grafana-6.5.2-1.x86_64.rpmsudoyumlocalinstall......
  • linux passwd文件
    passwd结构体structpasswd{char*pw_name;/*用户名*/char*pw_passwd;/*加密后的密码*/uid_tpw_uid;/*用户ID*/gid_tpw_gid;/*组ID*/char*pw_gecos;/*用户全名或注释字段*/......
  • Linux概述
    1.初始Linux1.linux操作系统支持多用户、多任务、多线程以及多CPU2.Liunx的起源和发展Debian:Debian项目是一个独立、分散的组织,由来自全世界各地自愿者组成,利用互联网进行协作开发。Ubuntu:是一个以桌面为主的Liunx发行版本,基于Debian发展而来,其目的是让Linux系统和非专业人员......
  • 在Linux中,如何实现虚拟机和容器之间的互操作性?
    在Linux中,实现虚拟机和容器之间的互操作性是一个涉及多个步骤的过程。以下是一些关键的步骤和考虑因素:选择适合的虚拟化技术和容器技术:虚拟化技术:常见的虚拟化技术有VMware、VirtualBox等。它们允许你在一个物理机上创建和运行多个虚拟机,每个虚拟机都有自己的操作系统和应用程......
  • 在Linux中,如何优化虚拟机和容器的性能和资源使用?
    在Linux中优化虚拟机(VM)和容器的性能和资源使用涉及多个层面,以下是一些关键的优化策略:1.虚拟机性能优化:合理配置CPU资源:根据虚拟机的实际需求分配合适的vCPU数量,避免过度分配导致资源争抢。启用CPU亲和性设置,保证虚拟机在物理CPU核心上的稳定调度。使用NUMA(Non-UniformMe......
  • 在Linux中,如何进行虚拟机和容器的备份和迁移?
    在Linux环境中,虚拟机和容器(如Docker容器)的备份和迁移过程有所不同,下面分别详细说明:1.虚拟机的备份与迁移虚拟机备份使用虚拟化平台工具:对于VMware环境,可以通过以下步骤进行备份:关闭或暂停虚拟机以确保数据一致性。右键单击虚拟机,在管理菜单中选择“克隆”,根据需要选择......
  • 在Linux中,如何使用Jenkins和Ansible进行虚拟化环境的自动化和持续集成/持续部署(CI/CD)?
    在Linux中,使用Jenkins和Ansible进行虚拟化环境的自动化和持续集成/持续部署(CI/CD)是一个强大的组合,可以大大提高开发和部署的效率。下面将详细阐述如何配置和使用这两个工具来实现这一目标。1.Jenkins配置安装Jenkins你可以从Jenkins官网下载最新的安装包,或者使用包管理器(如a......