文章目录
一、环境准备
1.1下载安装 ubuntu20.04根文件系统
1.2解压根文件系统
1.3配置根文件系统
1.4挂载根文件系统
二、构建根文件系统
2.1安装依赖软件
#跟新软件源
apt update
#跟新
apt upgrade
#安装必要软件
apt install vim bash-completion net-tools iputils-ping ifupdown ethtool ssh rsync udev htop rsyslog curl openssh-server apt-utils dialog nfs-common psmisc language-pack-en-base sudo kmod apt-transport-https network-manager -y
2.2设置主机名和主机解析
#主机名
echo "PX30" > etc/hostname
#主机IP
echo "127.0.0.1 localhost" >> /etc/hosts
echo "127.0.0.1 PX30" >> /etc/hosts
echo "127.0.0.1 localhost PX30" >> /etc/hosts
2.3配置网卡
Network-Manager 服务会自动配置网卡,但其默认配置文件将 ethernet 加入了黑名单,为此需要将它加入白名单当中
#打开文件
vim /usr/lib/NetworkManager/conf.d/10-globally-managed-devices.conf
#修改为
[keyfile]
unmanaged-devices=*,except:type:ethernet,except:type:wifi,except:type:gsm,except:type:cdma
将网卡默认配置为自动DHCP获取
#打开文件
vim /etc/network/interfaces
#修改为
auto eth0
iface eth0 inet dhcp
source-directory /etc/network/interfaces.d
在实际测试中网口必须接入网线系统才能正常启动,在不联网的情况下每次开机都要等待5分钟
#修改文件
vim /lib/systemd/system/networking.service
#修改为
TimeoutStartSec=5sec
实际测试,使用ssh 登陆,会出现密码正确无法登陆的情况,需修改以下文件
#打开文件
vim /etc/ssh/sshd_config
#将 #PermitRootLogin prohibit-password 修改为
PermitRootLogin yes
2.4串口调试设置root登陆
#打开文件
vim /lib/systemd/system/networking.service
#修改
ExecStart=-/sbin/agetty --autologin root --noclear %I $TERM
2.5修改root用户密码
passwd root
2.6禁用系统休眠
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
systemctl status sleep.target
2.7修改系统重启默认等待时间
#打开文件
vim etc/systemd/system.conf
#修改
DefaultTimeoutStartSec=90s
DefaultTimeoutStopSec=1s
#DefaultTimeoutAbortSec=
DefaultRestartSec=100ms
2.8扩充emmc分区
首先创建一个脚本 vim etc/init.d/firstboot.sh ,并且添加可执行权限 chmod +x firstboot.sh
!/bin/bash -e // !/bin/sh
# first boot configure
# resize filesystem mmcblk0p6
if [ ! -e "/usr/local/first_boot_flag" ] ;
then
echo "Resizing /dev/mmcblk0p8..."
resize2fs /dev/mmcblk0p8
touch /usr/local/first_boot_flag
fi
其次创建一个服务去实现脚本 vim /lib/systemd/system/firstboot.service
然后再启动该脚本 systemctl enble firstboot.service
#start
[Unit]
Description=Setup rockchip platform environment
Before=lightdm.service
After=resize-helper.service
[Service]
Type=simple
ExecStart=/etc/init.d/firstboot.sh
[Install]
WantedBy=multi-user.target
#end
最后,增加该分区的可执行权限
#打开文件
vim /etc/fstab
#修改为
/dev/mmcblk0p8 / ext4 rw,relatime,data=ordered 0 1
三、对文件系统增加对adbd的支持
3.1创建脚本文件 vim /etc/init.d/adbd.sh
adbd.sh
#!/bin/bash -e
### BEGIN INIT INFO
# Provides: adbd
# Required-Start:
# Required-Stop:
# Default-Start: S
# Default-Stop: 6
# Short-Description:
# Description: Linux ADB
### END INIT INFO
# setup configfs for adbd, usb mass storage and MTP....
UMS_EN=off
ADB_EN=off
MTP_EN=off
NTB_EN=off
ACM_EN=off
UAC1_EN=off
UAC2_EN=off
UVC_EN=off
RNDIS_EN=off
USB_ATTRIBUTE=0x409
USB_GROUP=rockchip
USB_SKELETON=b.1
CONFIGFS_DIR=/sys/kernel/config
USB_CONFIGFS_DIR=${CONFIGFS_DIR}/usb_gadget/${USB_GROUP}
USB_STRINGS_DIR=${USB_CONFIGFS_DIR}/strings/${USB_ATTRIBUTE}
USB_FUNCTIONS_DIR=${USB_CONFIGFS_DIR}/functions
USB_CONFIGS_DIR=${USB_CONFIGFS_DIR}/configs/${USB_SKELETON}
make_config_string()
{
tmp=$CONFIG_STRING
if [ -n "$CONFIG_STRING" ]; then
CONFIG_STRING=${tmp}_${1}
else
CONFIG_STRING=$1
fi
}
parameter_init()
{
while read line
do
case "$line" in
usb_mtp_en)
MTP_EN=on
make_config_string mtp
;;
usb_adb_en)
ADB_EN=on
make_config_string adb
;;
usb_ums_en)
UMS_EN=on
make_config_string ums
;;
usb_ntb_en)
NTB_EN=on
make_config_string ntb
;;
usb_acm_en)
ACM_EN=on
make_config_string acm
;;
usb_uac1_en)
UAC1_EN=on
make_config_string uac1
;;
usb_uac2_en)
UAC2_EN=on
make_config_string uac2
;;
usb_uvc_en)
UVC_EN=on
make_config_string uvc
;;
usb_rndis_en)
RNDIS_EN=on
make_config_string rndis
;;
esac
done < $DIR/.usb_config
case "$CONFIG_STRING" in
ums)
PID=0x0000
;;
mtp)
PID=0x0001
;;
adb)
PID=0x0006
;;
mtp_adb | adb_mtp)
PID=0x0011
;;
ums_adb | adb_ums)
PID=0x0018
;;
acm)
PID=0x1005
;;
*)
PID=0x0019
esac
}
configfs_init()
{
mkdir -p ${USB_CONFIGFS_DIR} -m 0770
echo 0x2207 > ${USB_CONFIGFS_DIR}/idVendor
echo $PID > ${USB_CONFIGFS_DIR}/idProduct
mkdir -p ${USB_STRINGS_DIR} -m 0770
SERIAL=`cat /proc/cpuinfo | grep Serial | awk '{print $3}'`
if [ -z $SERIAL ];then
SERIAL=0123456789ABCDEF
fi
echo $SERIAL > ${USB_STRINGS_DIR}/serialnumber
echo "rockchip" > ${USB_STRINGS_DIR}/manufacturer
echo "rk3xxx" > ${USB_STRINGS_DIR}/product
mkdir -p ${USB_CONFIGS_DIR} -m 0770
mkdir -p ${USB_CONFIGS_DIR}/strings/${USB_ATTRIBUTE} -m 0770
echo 500 > ${USB_CONFIGS_DIR}/MaxPower
echo ${CONFIG_STRING} > ${USB_CONFIGS_DIR}/strings/${USB_ATTRIBUTE}/configuration
}
configure_uvc_resolution()
{
mkdir ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/mjpeg/m/$UVC_DISPLAY_H
echo $UVC_DISPLAY_W > ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/mjpeg/m/$UVC_DISPLAY_H/wWidth
echo $UVC_DISPLAY_H > ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/mjpeg/m/$UVC_DISPLAY_H/wHeight
echo 666666 > ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/mjpeg/m/$UVC_DISPLAY_H/dwDefaultFrameInterval
echo $((UVC_DISPLAY_W*UVC_DISPLAY_H*80)) > ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/mjpeg/m/$UVC_DISPLAY_H/dwMinBitRate
echo $((UVC_DISPLAY_W*UVC_DISPLAY_H*160)) > ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/mjpeg/m/$UVC_DISPLAY_H/dwMaxBitRate
echo $((UVC_DISPLAY_W*UVC_DISPLAY_H*2)) > ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/mjpeg/m/$UVC_DISPLAY_H/dwMaxVideoFrameBufferSize
echo -e "666666\n1000000\n2000000" > ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/mjpeg/m/$UVC_DISPLAY_H/dwFrameInterval
}
function_init()
{
# UAC must be first setup when multi function composite.
if [ $UAC1_EN = on ];then
if [ ! -e "${USB_FUNCTIONS_DIR}/uac1.gs0" ] ;
then
mkdir ${USB_FUNCTIONS_DIR}/uac1.gs0
ln -s ${USB_FUNCTIONS_DIR}/uac1.gs0 ${USB_CONFIGS_DIR}/uac1.gs0
fi
fi
if [ $UAC2_EN = on ];then
if [ ! -e "${USB_FUNCTIONS_DIR}/uac2.gs0" ] ;
then
mkdir ${USB_FUNCTIONS_DIR}/uac2.gs0
ln -s ${USB_FUNCTIONS_DIR}/uac2.gs0 ${USB_CONFIGS_DIR}/uac2.gs0
fi
fi
if [ $UMS_EN = on ];then
if [ ! -e "${USB_FUNCTIONS_DIR}/mass_storage.0" ] ;
then
mkdir -p ${USB_FUNCTIONS_DIR}/mass_storage.0
echo /dev/disk/by-partlabel/userdata > ${USB_FUNCTIONS_DIR}/mass_storage.0/lun.0/file
ln -s ${USB_FUNCTIONS_DIR}/mass_storage.0 ${USB_CONFIGS_DIR}/mass_storage.0
fi
fi
if [ $ADB_EN = on ];then
if [ ! -e "${USB_FUNCTIONS_DIR}/ffs.adb" ] ;
then
mkdir -p ${USB_FUNCTIONS_DIR}/ffs.adb
ln -s ${USB_FUNCTIONS_DIR}/ffs.adb ${USB_CONFIGS_DIR}/ffs.adb
fi
fi
if [ $MTP_EN = on ];then
if [ ! -e "mkdir -p ${USB_FUNCTIONS_DIR}/ffs.mtp" ] ;
then
mkdir -p ${USB_FUNCTIONS_DIR}/ffs.mtp
ln -s ${USB_FUNCTIONS_DIR}/ffs.mtp ${USB_CONFIGS_DIR}/ffs.mtp
fi
fi
if [ $NTB_EN = on ];then
if [ ! -e "mkdir -p ${USB_FUNCTIONS_DIR}/ffs.ntb" ] ;
then
mkdir -p ${USB_FUNCTIONS_DIR}/ffs.ntb
ln -s ${USB_FUNCTIONS_DIR}/ffs.ntb ${USB_CONFIGS_DIR}/ffs.ntb
fi
fi
if [ $ACM_EN = on ];then
if [ ! -e "mkdir -p ${USB_FUNCTIONS_DIR}/acm.gs6" ] ;
then
mkdir -p ${USB_FUNCTIONS_DIR}/acm.gs6
ln -s ${USB_FUNCTIONS_DIR}/acm.gs6 ${USB_CONFIGS_DIR}/acm.gs6
fi
fi
if [ $UVC_EN = on ];then
mkdir ${USB_FUNCTIONS_DIR}/uvc.gs6
cat ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming_maxpacket
echo 1 > /sys/kernel/config/usb_gadget/rockchip/functions/uvc.gs6/streaming_bulk
mkdir ${USB_FUNCTIONS_DIR}/uvc.gs6/control/header/h
ln -s ${USB_FUNCTIONS_DIR}/uvc.gs6/control/header/h ${USB_FUNCTIONS_DIR}/uvc.gs6/control/class/fs/h
ln -s ${USB_FUNCTIONS_DIR}/uvc.gs6/control/header/h ${USB_FUNCTIONS_DIR}/uvc.gs6/control/class/ss/h
mkdir ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/mjpeg/m
UVC_DISPLAY_W=640
UVC_DISPLAY_H=480
configure_uvc_resolution
UVC_DISPLAY_W=1280
UVC_DISPLAY_H=720
configure_uvc_resolution
UVC_DISPLAY_W=1920
UVC_DISPLAY_H=1080
configure_uvc_resolution
UVC_DISPLAY_W=2560
UVC_DISPLAY_H=1440
configure_uvc_resolution
mkdir ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/header/h
ln -s ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/uncompressed/u ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/header/h/u
ln -s ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/mjpeg/m ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/header/h/m
ln -s ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/header/h ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/class/fs/h
ln -s ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/header/h ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/class/hs/h
ln -s ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/header/h ${USB_FUNCTIONS_DIR}/uvc.gs6/streaming/class/ss/h
ln -s ${USB_FUNCTIONS_DIR}/uvc.gs6 ${USB_CONFIGS_DIR}/uvc.gs6
fi
if [ $RNDIS_EN = on ];then
if [ ! -e "${USB_FUNCTIONS_DIR}/rndis.gs0" ] ;
then
mkdir -p ${USB_FUNCTIONS_DIR}/rndis.gs0
ln -s ${USB_FUNCTIONS_DIR}/rndis.gs0 ${USB_CONFIGS_DIR}/rndis.gs0
fi
fi
}
case "$1" in
start)
DIR=$(cd `dirname $0`; pwd)
if [ ! -e "$DIR/.usb_config" ]; then
echo "$0: Cannot find .usb_config"
exit 0
fi
parameter_init
if [ -z $CONFIG_STRING ]; then
echo "$0: no function be selected"
exit 0
fi
configfs_init
function_init
if [ $ADB_EN = on ];then
if [ ! -e "/dev/usb-ffs/adb" ] ;
then
mkdir -p /dev/usb-ffs/adb
mount -o uid=2000,gid=2000 -t functionfs adb /dev/usb-ffs/adb
fi
export service_adb_tcp_port=5555
start-stop-daemon --start --oknodo --pidfile /var/run/adbd.pid --startas /usr/local/bin/adbd --background
sleep 1
fi
if [ $MTP_EN = on ];then
if [ ! -e "/dev/usb-ffs/mtp" ] ;
then
mkdir -p /dev/usb-ffs/mtp
mount -o uid=2000,gid=2000 -t functionfs mtp /dev/usb-ffs/mtp
fi
start-stop-daemon --start --oknodo --pidfile /var/run/mtp.pid --startas /usr/local/bin/umtprd --background
sleep 1
fi
if [ $NTB_EN = on ];then
if [ ! -e "/dev/usb-ffs/ntb" ] ;
then
mkdir -p /dev/usb-ffs/ntb
mount -o uid=2000,gid=2000 -t functionfs ntb /dev/usb-ffs/ntb
fi
fi
UDC=`ls /sys/class/udc/| awk '{print $1}'`
echo $UDC > ${USB_CONFIGFS_DIR}/UDC
;;
stop)
echo "none" > ${USB_CONFIGFS_DIR}/UDC
if [ $ADB_EN = on ];then
start-stop-daemon --stop --oknodo --pidfile /var/run/adbd.pid --retry 5
fi
;;
restart|reload)
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit 0
usb_adb_en
3.2 设置开机自启动脚本
#打开文件
vim /lib/systemd/system/rc-local.service
#在文件末尾增加
[Install]
WantedBy=multi-user.target
Alias=rc-local.service
创建 rc.local文件
#创建文件
vim /etc/rc.local
#文件内容
#!/bin/bash
mount -rw -o remount /
echo 56 > sys/class/gpio/export
echo out > sys/class/gpio/gpio56/direction
echo 1 > sys/class/gpio/gpio56/value
sh /etc/init.d/adbd.sh start &
exit 0
#增加权限
chmod 755 etc/rc.local
#创建软链接
ln -s /lib/systemd/system/rc-local.service /etc/systemd/system
浙公网安备 33010602011771号