全志V3S嵌入式驱动开发(开发环境再升级)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
前面我们陆陆续续开发了差不多有10个驱动,涉及到网口、串口、音频和视频等几个方面。但是整个开发的效率还是比较低的。每次开发调试的时候都很麻烦,譬如说,如果是驱动代码的问题,就需要把sd卡拆下来,重新烧入;再比如说,uboot和linux之间不能连续运行,需要手动做一些配置之后,再启动linux kernel;还比如说,使用480*272的dtb文件之后,之前的网卡功能都丢失了,很不方便。所以针对这些问题,我们想办法集中处理一下,这样有利于后期的复杂驱动调试、以及上层软件开发。
目前已经升级的开发环境主要有这7个方面,
a)解决uboot不能正常启动linux kernel的问题;
b)解决开机后需要输入root用户名的问题;
c)添加开机启动脚本的问题;
d)添加网卡;
e)安装ftp服务器软件;
f)安装telnet服务器软件;
g)自由升级zImage和dtb文件。
注1: 实际使用的时候,不要删除ftp账户。假设root账户无法登录,这个时候之前创建的ftp账户还可以派上用场,可以先用ftp登录,然后su到root上面去。
注2:另外一个建议,就是大家上传可执行文件的时候,一定要先压缩再解压,这样基本肯定不会出问题。
1、解决uboot不能正常启动linux kernel的问题
要解决这个问题,关键在于增加CONFIG_BOOTCOMMAND和CONFIG_BOOTARGS这两个宏。因为我们使用的是v3s这颗芯片,所以在uboot上面,可以把上述两个宏添加到include/configs/sun8i.h这个文件下面,
#include <configs/sunxi-common.h>#ifdef CONFIG_BOOTCOMMAND
#undef CONFIG_BOOTCOMMAND
#endif#define CONFIG_BOOTCOMMAND "setenv bootm_boot_mode sec; "\"load mmc 0:1 0x41000000 zImage;" \"load mmc 0:1 0x41800000 sun8i-v3s-licheepi-zero-with-480x272-lcd.dtb;" \"bootz 0x41000000 - 0x41800000;"#ifdef CONFIG_BOOTARGS
#undef CONFIG_BOOTARGS
#endif#define CONFIG_BOOTARGS "console=ttyS0,115200 panic=5 rootwait root=/dev/mmcblk0p2 earlyprintk rw vt.global_cursor_default=0"
注意两个宏的设置都放在include头文件之后。当然因为这个文件发生了修改,那么整个uboot就需要重新编译一下,
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
等编译结束,生成了我们需要的bin文件之后,就可以pc上插入读卡器,准备bin文件烧入了,
feixiaoxing@feixiaoxing-VirtualBox:~/Desktop/u-boot-3s-current$ sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8
[sudo] password for feixiaoxing:
389+1 records in
389+1 records out
398367 bytes (398 kB, 389 KiB) copied, 1.71158 s, 233 kB/s
烧入的工具是利用ubuntu虚拟机里面的dd命令来完成的。为了保证烧入ok,可以继续输入一个sync命令。结束后,退出sd卡,重新把micro sd卡插入到开发板上,不出意外的话,就可以看到uboot、kernel连续启动的过程了,
如果你已经可以看到这样的内容,代表当前uboot可以持续启动linux kernel了。
2、解决开机后需要输入root用户名的问题
如果当前还处于开发阶段,每次都需要输入root用户名,其实是很令人反感的一个事情。虽然是免密登录,但是还是想着可以更方便一点。这个时候,完全可以通过文件配置的方法来解决这一问题。
# Put a getty on the serial port
#console::respawn:/sbin/getty -L console 0 vt100# GENERIC_SERIAL
ttyS0::once:/bin/login root
在原来/etc/inittab里面注释掉getty的内容,添加login这一行,那么我们每次开机的时候就不需要手动输入root这个用户了。并且,开机之后,自动切换到/root这个目录下面。
3、添加开机启动脚本的问题
有一些程序或者配置,我们其实是希望系统启动后可以默认执行的,比如这个时候就希望linux可以自动帮我们执行一些脚本,例如auto.sh。要实现这个目标,这个时候,可以这么做,分成三步。
第一步,在/etc/init.d/rcS最后一行添加这么一句,
/etc/rc.local
第二步,创建/etc/rc.local文件,填充下面这些内容,同时chmod +x /etc/rc.local,
#!/bin/sh
/root/auto.sh &
第三步,创建/root/auto.sh文件,添加一点测试内容,比如
echo "hello, world"
同样auto.sh需要chmod +x auto.sh设置一下,让它变成可执行文件。为了测试我们的配置有没有效果,可以按下板子上的复位键,如果看到这些输出,大体可以认为我们的设计是ok的。
仔细找一下,还是发现了hello, world的身影。这说明我们的配置是正确的。
4、添加网卡
观察发现,sun8i-v3s-licheepi-zero-with-480x272-lcd.dts和sun8i-v3s-licheepi-zero-with-lcd.dtsi这两个文件中,都没有关于以太网的配置。而之前sun8i-v3s-licheepi-zero-dock.dts中则包含了相关的内容,这个时候我们要做的,就是把dsun8i-v3s-licheepi-zero-dock.dts中关于网卡的配置挪到sun8i-v3s-licheepi-zero-with-lcd.dtsi当中去就可以了,
aliases {ethernet0 = &emac;};
首先是ethernet0指向了emac,
&emac {status = "okay";
};
其实是emac中的status设置为okay。别看这两步很简单,但是如果不做的话,网卡就是启动不起来。当然有了这两点还是不够的,我们需要在/etc/network/interfaces中增加一点配置,
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.0.230
netmask 255.255.255.0
gateway 192.168.0.1
dns-nameservers 8.8.8.8
从脚本上看,系统启动后除了配置loopback之外,还需要添加eth0,并且需要进一步设置ip、netmask和gateway。这一顿操作之后,如果pc电脑还在同一网段,基本就可以和电脑之间实现ping的正常通讯了。
# ifconfig
eth0 Link encap:Ethernet HWaddr 02:00:A4:52:F3:CC inet addr:192.168.0.230 Bcast:0.0.0.0 Mask:255.255.255.0UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:384 errors:0 dropped:0 overruns:0 frame:0TX packets:162 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:33241 (32.4 KiB) TX bytes:7140 (6.9 KiB)Interrupt:36 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0UP LOOPBACK RUNNING MTU:65536 Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)# ping 192.168.0.100
PING 192.168.0.100 (192.168.0.100): 56 data bytes
64 bytes from 192.168.0.100: seq=0 ttl=128 time=92.529 ms
64 bytes from 192.168.0.100: seq=1 ttl=128 time=12.744 ms
64 bytes from 192.168.0.100: seq=2 ttl=128 time=38.267 ms
64 bytes from 192.168.0.100: seq=3 ttl=128 time=60.146 ms
64 bytes from 192.168.0.100: seq=4 ttl=128 time=84.125 ms
64 bytes from 192.168.0.100: seq=5 ttl=128 time=80.020 ms
^C
--- 192.168.0.100 ping statistics ---
6 packets transmitted, 6 packets received, 0% packet loss
round-trip min/avg/max = 12.744/61.305/92.529 ms
5、安装ftp软件
嵌入式ftp,一般都会使用vsftpd这个软件。大家可以通过buildroot来进行编译,
选中了vsftpd之后,就可以开始make编译。实际处理中,如果发现buildroot下载vsftpd下载比较困难,可以帮助它下载一下,然后拷贝到./dl目录下,再编译也是可以的。
编译结束后,所有的根文件都在./output/target目录下,这里有两个文件需要拷贝。一个是usr/sbin下面的vsftpd,另外一个是etc/下面的vsftpd.conf。我们也需要把它拷贝到sd卡对应的根文件目录下。
这个vsftpd.conf需要按照下面这些内容重新配置下,如果嫌麻烦,可以直接拷贝下面这些内容,粘贴上去,
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
ftpd_banner=Welcome to blah FTP service.
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
listen=YES
allow_writeable_chroot=YES
除此之外,还需要几个操作步骤,
touch /etc/vsftpd.chroot_list
mkdir /usr/share/emptyuseradd ftp #增加新用户ftp,密码是ftpmkdir /home/ftp
chown ftp:ftp /home/ftp
chmod 755 /home/ftp
有了这些做铺垫,直接shell输入/usr/sbin/vsftpd &之后,服务器就起来了。为了验证是不是真的有效,可以用Filezilla客户端做一个测试,即输入192.168.0.230,用户名和密码都是ftp,端口21,连接看看是否成功,如果成功,进一步验证下文件上传、下载是否成功。
当然,现在有个小问题就是,每一次传输的时候,好像都会有一个vsftpd进程起来,这导致ps aux的时候看到好多vsftpd进程。确实有点奇怪,只是暂时还没有影响使用。实在受不了的话,只能killall vsftpd删除一下。
当然,比较优雅一点的办法,就是在vsftpd.conf里面添加一条max_per_ip=1,这也能达到我们的目的。
6、设置telnetd
之前我们和板子之间通信的时候都是走的串口ttyS0,这没问题。但是如果能够使能telnet访问到开发板,这样就显得更方便了。好在telnetd的引用也不复杂,只需要在busybox开放telnetd即可。首先cd到buildroot目录下,输入make busybox-menuconfig,进而在Networking Utilities中选择telnetd即可,
选择好之后,直接make。这样buildroot会生成新的busybox。我们都知道,根文件的很多命令都来自于这个busybox。所以,下一步就是利用压缩的方法,把新的busybox通过ftp上传到开发板上面。启动方式也很直接,就是./busybox telnetd -l /bin/sh &。此时需要验证一下telnet的23号端口有没有打开,输入netstat -an即可看到,
# netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN
netstat: /proc/net/tcp6: No such file or directory
netstat: /proc/net/udp6: No such file or directory
netstat: /proc/net/raw6: No such file or directory
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
unix 4 [ ] DGRAM 1444 /dev/log
unix 2 [ ] DGRAM 1949
unix 2 [ ] DGRAM 1448
有了telnet之后,测试就可以脱离串口,pc电脑也可以离开开发板,感觉人一下子解放出来,建议大家多试试telnet调试。
7、快速升级zImage和dtb文件
之前重新编译zImage和dtb文件的时候,都是需要独立烧入sd卡,使用十分不方便。现在有了网络之后,升级过程只需要两部就可以完成,
第一,将升级前的文件用ftp拷贝到开发板,注意压缩;
第二,mount /dev/mmcblk0p1 /mnt,将原来的文件删除,替换成新传上来的解压文件;
第三,重启电脑,确认功能是否ok即可。
相关文章:

全志V3S嵌入式驱动开发(开发环境再升级)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面我们陆陆续续开发了差不多有10个驱动,涉及到网口、串口、音频和视频等几个方面。但是整个开发的效率还是比较低的。每次开发调试的…...
ChatGPT:人工智能助手的新时代
ChatGPT:人工智能助手的新时代 文章目录 ChatGPT:人工智能助手的新时代引言ChatGPT的原理GPT-3.5架构概述预训练和微调过程生成式对话生成技术 ChatGPT的应用场景智能助理客服机器人虚拟角色教育辅助创意生成个性化推荐 ChatGPT的优势ChatGPT的使用技巧与…...
【面试】二、Java补充知识
JVM中的存储 JVM的五块存储区: 方法区(线程共享) 方法区用来存储类的各种信息(类名、方法信息等)、静态变量、常量和编译后的代码也存储在方法区中 方法区中也存在运行时常量池 常量池中会存放程序运行时生成的各种…...
LISTENER、TNSNAMES和SQLNET配置文件
LISTENER、TNSNAMES和SQLNET配置文件 用户连接验证listener.ora文件配置监听日志local_listener参数 tnsnames.ora文件配置 sqlnet.ora文件配置 用户连接验证 Oracle数据库中用户有三种常见的登录验证方式: 通过操作系统用户验证:必须是在数据库服务器…...

【Leetcode -225.用队列实现栈 -232.用栈实现队列】
Leetcode Leetcode -225.用队列实现栈Leetcode -232.用栈实现队列 Leetcode -225.用队列实现栈 题目:仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。 …...

悟道3.0全面开源!LeCun VS Max 智源大会最新演讲
夕小瑶科技说 原创 作者 | 小戏 2023 年智源大会如期召开! 这场汇集了 Geoffery Hinton、Yann LeCun、姚期智、Joseph Sifakis、Sam Altman、Russell 等一众几乎是 AI 领域学界业界“半壁江山”的大佬们的学术盛会,聚焦 AI 领域的前沿问题,…...

2023蓝桥杯大学A组C++决赛游记+个人题解
Day0 发烧了一晚上没睡着,感觉鼻子被打火机烧烤一样难受,心情烦躁 早上6点起来吃了个早饭,思考能力完全丧失了,开始看此花亭奇谭 看了六集,准备复习数据结构考试,然后秒睡 一睁眼就是下午2点了 挂了个…...

wkhtmltopdf踩坑记录
1. 不支持writing-mode。 需求是文字纵向排列,内容从左到右,本来用的是writing-mode: tb-rl;,插件转pdf后发现失效。 解决方法: 让每一列文字单独用一个div容器包裹,对它的宽度进行限制,控制每一行只能出现…...
贪心算法part2 | ● 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II
文章目录 122.买卖股票的最佳时机II思路思路代码官方题解困难 55. 跳跃游戏思路思路代码官方题解代码困难 45.跳跃游戏II思路思路代码困难 今日收获 122.买卖股票的最佳时机II 122.买卖股票的最佳时机II 思路 局部最优:将当天价格和前一天比较,价格涨…...

[C++]异常笔记
我不怕练过一万种腿法的对手,就怕将一种腿法 练一万次的对手。 什么是C的异常 在C中,异常处理通常使用try-catch块来实现。try块用于包含可能会抛出异常的代码,而catch块用于捕获并处理异常。当异常被抛出时,程序会跳过try块中未执行…...

浅谈一级机电管道设计中的压力与介质温度
管道设计是工程设计中的一个非常重要的部分,管道的设计需要考虑到许多因素,其中就包括管道设计压力分类和介质温度分类。这两个因素是在设计管道时必须非常严格考虑的, 首先是管道设计压力分类。在管道设计中,根据工作要求和要传输…...
Docker网络模型(八)使用 macvlan 网络
使用 macvlan 网络 一些应用程序,特别是传统的应用程序或监控网络流量的应用程序,期望直接连接到物理网络。在这种情况下,你可以使用 macvlan 网络驱动为每个容器的虚拟网络接口分配一个MAC地址,使其看起来像一个直接连接到物理网…...

控制视图内容的位置
文本域中的提示内容在默认情况下是垂直居中的,要改变文本在文本域中的位置,可以使用android:gravity来实现。 利用android:gravity可以指定如何在视图中放置视图内容,例如,如何在文本域中放置文本。 如果希望视图文本显示在上方&a…...

【分布式系统与一致性协议】
分布式系统与一致性协议 CAP原理APCPCA总结BASE理论 一致性拜占庭将军问题 分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。 分布式系统的设计目标一般包含如下: 可用性:可用性是分…...
音视频领域的未来发展方向展望
文章目录 音视频领域的未来发展方向全景音视频技术虚拟现实和增强现实的区别 人工智能技术可视化智能分析智能语音交互图像识别和视频分析技术 语音处理智能推荐技术远程实时通信 流媒体技术未来方向 音视频领域的未来发展方向 全景音视频技术:全景音视频技术是近年…...

时间同步/集群时间同步/在线/离线
目录 一、能够连接外网 二、集群不能连接外网--同步其它服务器时间 一、能够连接外网 1.介绍ntp时间协议 NTP(Network Time Protocol)网络时间协议,是用来使计算机时间同步的一种协议,它可以使计算机对其服务器或时钟源做同步…...

基于BP神经网络对MNIST数据集检测识别(numpy版本)
基于BP神经网络对MNIST数据集检测识别 1.作者介绍2.BP神经网络介绍2.1 BP神经网络 3.BP神经网络对MNIST数据集检测实验3.1 读取数据集3.2 前向传播3.3 损失函数3.4 构建神经网络3.5 训练3.6 模型推理 4.完整代码 1.作者…...

HTML5-创建HTML文档
HTML5中的一个主要变化是:将元素的语义与元素对其内容呈现结果的影响分开。从原理上讲这合乎情理。HTML元素负责文档内容的结构和含义,内容的呈现则由应用于元素上的CSS样式控制。下面介绍最基础的HTML元素:文档元素和元数据元素。 一、构建…...
Vue中Axios的封装和API接口的管理
一、axios的封装 在vue项目中,和后台交互获取数据这块,我们通常使用的是axios库,它是基于promise的http库,可运行在浏览器端和node.js中。他有很多优秀的特性,例如拦截请求和响应、取消请求、转换json、客户端防御XSR…...
MLIR面试题
1、请简要解释MLIR的概念和用途,并说明MLIR在编译器领域中的重要性。 MLIR(Multi-Level Intermediate Representation)是一种多级中间表示语言,提供灵活、可扩展和可优化的编译器基础设施。MLIR的主要目标是为不同的编程语言、领域专用语言(DSL)和编译器…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...

tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...

【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...

Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...
Python常用模块:time、os、shutil与flask初探
一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...

基于单片机的宠物屋智能系统设计与实现(论文+源码)
本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢,连接红外测温传感器,可实时精准捕捉宠物体温变化,以便及时发现健康异常;水位检测传感器时刻监测饮用水余量,防止宠物…...