用优酷电视盒子做一个派
优酷盒子闲置挺久了,近来突发奇想:能不能废物利用一下,比如,刷个Linux?
网上搜索了一下,发现有很多电视盒子的刷机教程,但是找了很久没有找到优酷盒子的,看来只好自己动手了。
把盒子拆开看了看,发现主芯片是RK3288,这个芯片在网上有很多开源浆,看来刷机有望。
刷机之前,先看下我们的硬件配置,把优酷盒子拆开,正反面图片分别如下:
摸索了一下,有了一点发现:
正面右上角的三个孔就是串行接口,从左到分别是GND、Tx、Rx;
反面右下解嘲的按钮是进入烧录模式的按钮,按住这个按钮的时候,上电,等待几秒钟即可进入烧录模式。
好了,首先列一下硬件,
一、准备工作:
硬件配置:
主芯片 :RK3288
电源管理:ACT8846
以太网:RTL8201F
RAM:Nanya 1GB
EMMC:Sandisk 8GB
WIFI+蓝牙:AP6210
RK3288官方配套的电源管理芯片有不同的型号,这个会影响后续编译选择。
接下来,准备好串口线、USB延长线。
软件资源:
Rockchip官方有开源资料,参考这个网站:
另外,针对SDK开发,在网上找到了 Rockchip RK3288 Linux SDK发布说明 ,可以先下载下来。
编译环境:
另外,为了编译相应资源,建议先准备好Linux环境,这里有几个选择:
- Ubuntu 16.04
- WSL
但是这里有几个坑,得注意一下:
Ubuntu建议用64位版本,32位版本的在打包uboot的时候会出错,因为有部分工具是64位的;
WSL在编译根文件系统的时候,无法进入虚拟系统。
不过呢,因为不想重装系统,我只好在WSL和Ubuntu之间切来切去,多花了不少时间。
废话不多说,开始干活。
二、下载SDK
根据官网教程,SDK在这里可以下载:
git clone https://github.com/rockchip-linux/repo
mkdir linux
cd linux
../repo/repo init --repo-url=https://github.com/rockchip-linux/repo -u https://github.com/rockchip-linux/manifests -b master -m rk3288_linux_release.xml
../repo/repo sync
不过呢,github很慢,所以还有个办法,是去把仓库移到gitee上,再同步下来,但是gitee对仓库的大小有限制,所以拖几个主要的库就好了,实在拖不下来的,还是从github上拖。
或者,可以去firefly的网站下载。
找到 Linux-SDK 源码包 ,去百度上直接拖下来。
然后,执行以下动作:
mkdir linux
cd linux
git clone https://github.com/FireflyTeam/repo.git
# 把压缩包放在上一步下载repo工具的目录下
7z x linux-sdk-3288.7z
# 更新代码
repo sync -c
三,烧录工具:
官方支持好几种,
linux下用rkdeveloptool,这个在tools文件夹可以找到;
windows下用AndroidTool。这个在firefly的 固件升级工具 可以下载。
建议用在windows下烧录,这个工具的界面长这样:
根据上图,有几个东西我们必须要编译出来:
loader:编译uboot时得到,名称为rk3288_loader_vxxx.bin
parameter:这个手动编写,可以从下载了修改,后面再讲
uboot:编译uboot得到,名称为uboot.img
trust:编译uboot得到,名称为trust.img
boot:编译kernel得到,名称为zboot.img(当然不止这一种)
rootfs:编译根文件系统得到,这个名称不固定了。
四、编译:
4.1,准备所需要的软件包:
Ubuntu 16.04 系统编译所需的软件包
sudo apt-get install git gcc-arm-linux-gnueabihf u-boot-tools device-tree-compiler mtools parted libudev-dev libusb-1.0-0-dev python-linaro-image-tools linaro-image-tools libssl-dev autotools-dev libsigsegv2 m4 libdrm-dev curl sed make binutils build-essential gcc g++ bash patch gzip bzip2 perl tar cpio python unzip rsync file wget libncurses5 libglib2.0-dev openssh-client
上面这些,有一些不是必须的,有时间就全装了吧,也没有一个一个去试。
4.2,编译uboot:
这里推荐使用开发说明里的firefly-rk3288进行配置编译,不要使用evb-rk3288这个配置,不要问我怎么知道的。。。
当然,对于熟悉uboot修改的人来说,这些都不是问题,自己随便改吧。
编译很简单:
进入SDK目录
cd u-boot
./make.sh firefly-rk3288
当然,可能会碰到一些问题,根据出错提示再来修改吧,不一一展开。
编译后,会得到以下文件:
rk3288_loader_v1.08.258.bin
trust.img
uboot.img
4.3,编译kernel:
- 配置显示接口:
在编译之前, 需要在dts里配置HDMI输出,这样就可以接显示器了。
找到kernel\arch\arm\boot\dts\rk3288-firefly.dtsi,在里面添加以下内容
/*set hdmi */
&hdmi {
status = "okay";
};
&route_hdmi {
status = "okay";
};
同时,打开kernel\arch\arm\configs\rockchip_linux_defconfig,
确保编译配置里有HDMI相关配置,
CONFIG_DRM=y #必须
CONFIG_DRM_ROCKCHIP=y #必须
CONFIG_ROCKCHIP_DW_HDMI=y #必须
CONFIG_ROCKCHIP_INNO_HDMI=y
CONFIG_DRM_PANEL_SIMPLE=y #必须
CONFIG_DRM_DW_HDMI_I2S_AUDIO=y
CONFIG_DRM_DW_HDMI_CEC=y
- 配置以太网接口:
优酷盒子用的RTL8201,是个百兆PHY,而默认DTS是千兆的,要修改一下。
找到kernel\arch\arm\boot\dts\rk3288-firefly.dts,在里面添加以下内容
&gmac {
phy-supply = <&vcc_lan>;
phy-mode = "rmii";
clock_in_out = "input";
snps,reset-gpio = <&gpio4 7 0>;
snps,reset-active-low;
assigned-clocks = <&cru SCLK_MAC>;
assigned-clock-parents = <&ext_gmac>;
pinctrl-names = "default";
pinctrl-0 = <&rmii_pins>;
tx_delay = <0x30>;
rx_delay = <0x10>;
max-speed = <100>;
status = "okay";
};
&ext_gmac {
compatible = "fixed-clock";
#clock-cells = <0>;
clock-frequency = <50000000>;
clock-output-names = "ext_gmac";
};
- 配置USB HID:
这个是为了接无线键鼠,优酷盒子只有一个USB接口,所以外接键盘鼠标要用一体无线键鼠,我用的是联想的这款4X30M,一个USB接口就可以同时接键盘和鼠标。
(以为我是要打广告?不不不,强烈建议大家不要买这款,手感太硬了,不好用!!)
先打开kernel\arch\arm\configs\rockchip_linux_defconfig,确保编译配置里有USB相关配置,我把能选的都选上了。
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
CONFIG_USB_DEFAULT_PERSIST=y
CONFIG_USB_OTG=y
CONFIG_USB_MON=y
CONFIG_USB_STORAGE=y
CONFIG_USB_SUPPORT=y
CONFIG_USB_COMMON=y
CONFIG_USB_ARCH_HAS_HCD=y
CONFIG_USB=y
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_EHCI_ROOT_HUB_TT=y
CONFIG_USB_EHCI_TT_NEWSCHED=y
CONFIG_USB_EHCI_HCD_PLATFORM=y
CONFIG_USB_HID=y
CONFIG_USB_HIDDEV=y
CONFIG_USB_SUPPORT=y
CONFIG_USB_COMMON=y
CONFIG_USB_ARCH_HAS_HCD=y
CONFIG_USB_OHCI_LITTLE_ENDIAN=y
CONFIG_USB_OHCI_HCD=y
CONFIG_USB_OHCI_HCD_PLATFORM=y
CONFIG_USB_DWC2=y
CONFIG_USB_DWC2_HOST=y
CONFIG_PHY_ROCKCHIP_USB=y
CONFIG_PHY_ROCKCHIP_INNO_USB2=y
然后kernel\arch\arm\boot\dts\rk3288.dtsi,
修改如下:
usbphy: usbphy {
compatible = "rockchip,rk3288-usb-phy";
#address-cells = <1>;
#size-cells = <0>;
status = "disabled";
usbphy0: usb-phy@320 {
#phy-cells = <0>;
reg = <0x320>;
clocks = <&cru SCLK_OTGPHY0>;
clock-names = "phyclk";
/*#clock-cells = <0>;*/
/*resets = <&cru SRST_USBOTG_PHY>;*/
/*reset-names = "phy-reset";*/
/*usb hid ok*/
还有otg配置
usb_otg: usb@ff580000 {
compatible = "rockchip,rk3288-usb", "rockchip,rk3066-usb",
"snps,dwc2";
reg = <0x0 0xff580000 0x0 0x40000>;
interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru HCLK_OTG0>;
clock-names = "otg";
dr_mode = "otg";
/*如果hid不行,就把这个也注释点
g-np-tx-fifo-size = <16>;
g-rx-fifo-size = <280>;
g-tx-fifo-size = <256 128 128 64 32 16>;
然后找到:kernel\arch\arm\boot\dts\rk3288-firefly.dts,添加以下内容:
&usbphy {
status = "okay";
&usb_otg {
vbus-supply = <&vcc_otg_5v>;
status = "okay";
};
- 编译kernel:
进入SDK目录
cd kernel
make ARCH=arm rockchip_linux_defconfig
make ARCH=arm rk3288-firefly.img -j12
编译后得到很多文件,重要的是这个:
zboot.img
boot.img
4.4,编译rootfs:
这一步我是根据github上的说明编译debian,
#先编译出一个基础debian版本:
RELEASE=stretch TARGET=desktop ARCH=armhf ./mk-base-debian.sh