用优酷电视盒子做一个派

优酷盒子闲置挺久了,近来突发奇想:能不能废物利用一下,比如,刷个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