資源

  1. 核心代碼 https://github.com/olegk0/rk3x_kernel_3.0.36
  2. 安裝Docker https://docs.docker.com/engine/install/debian/
  3. 韌體檔案 https://github.com/OpenELEC/dvb-firmware/tree/master
  4. 編譯舊版tvheadend教學 https://www.holik.at/index.php?m=06&y=13&entry=entry130627-175237
  5. 關於Android tvheadend編譯的討論 https://tvheadend.org/d/1577-any-developers-working-on-a-android-port-of-tvheadend/10
  6. 頻道表 https://www.townward.com.tw/technical.aspx?getId=A316F553A017C5A7

筆記

前置作業

  1. 按照[安裝Docker https://docs.docker.com/engine/install/debian/](https://bobpan357.notion.site/Docker-https-docs-docker-com-engine-install-debian-3811d56e45ad8095ad92e67183c36fcf) 教學安裝Docker

  2. 建立 Ubuntu 14.04 docker image

    sudo docker run -it --name rk3028-build-env ubuntu:14.04 /bin/bash
    
  3. 安裝必要套件:

    apt update
    apt install -y git git-core build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip bc python
    
  4. 準備檔案

    # 使用 root 資料夾來編譯檔案
    cd /root
    # Clone Repo
    git clone <https://github.com/olegk0/rk3x_kernel_3.0.36.git>
    git clone <https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6>
    # 將 GCC 固定為 Android 4.2 用的版本
    cd arm-eabi-4.6
    git checkout android-4.2_r1
    # 編譯檔案
    # 新版本,直接覆蓋config
    mv .config .config_old
    cp ./arch/arm/configs/rk3028a_86v_defconfig ./.config
    
    # Note: 指定剛剛下載的gcc來當編譯器
    cd /root/rk3x_kernel_3.0.36
    # 執行Menuconfig
    make ARCH=arm menuconfig
    

    選擇正確的處理器型號(這支電視棒是RK3028A)

    image.png

    image.png

    image.png

    退回到最上面

    image.png

    確認這個勾勾

    image.png

    選擇Exit,直到這個選項跳出,選擇Yes

    image.png

    最後檢查

    grep -E "CONFIG_SMP|CONFIG_CPU_V7" .config
    # 要得到
    CONFIG_CPU_V7=y
    CONFIG_SMP=y
    # CONFIG_SMP_ON_UP is not set
    
  5. 產生標頭檔,準備編模組

    make ARCH=arm CROSS_COMPILE=/root/arm-eabi-4.6/bin/arm-eabi- modules_prepare
    

模組編譯作業

  1. 備份原本的檔案

    cd /root/rk3x_kernel_3.0.36/drivers/media/dvb/
    mv smsusb.c smsusb.c.bak
    
  2. 像母教學一樣修改檔案

    image.png

  3. 在Makefile增加強制編譯檔案的宣告 /root/rk3x_kernel_3.0.36/drivers/media/dvb/siano/Makefile

    # Force complie modules I needed
    obj-m += smsmdtv.o smsdvb.o smsusb.o
    
    # 在原始這三行的上面
    obj-$(CONFIG_SMS_SIANO_MDTV) += smsmdtv.o smsdvb.o
    obj-$(CONFIG_SMS_USB_DRV) += smsusb.o
    obj-$(CONFIG_SMS_SDIO_DRV) += smssdio.o
    
  4. 編譯

    cd /root/rk3x_kernel_3.0.36
    make ARCH=arm CROSS_COMPILE=/root/arm-eabi-4.6/bin/arm-eabi- M=drivers/media/dvb/siano/ modules
    
  5. 驗證

    cd /root/rk3x_kernel_3.0.36/
    cd drivers/media/dvb/siano/
    strings smsdvb.ko | grep vermagic
    # 得到的應該會像下面
    vermagic=3.0.36+ SMP preempt mod_unload ARMv7 
    __mod_vermagic5