2012年5月9日 星期三

圓剛三頻電視棒 AVerMedia Hybrid Volar HX amd64 驅動-Kernel 3.2.x

這幾天終於決定安裝 Kubuntu 12.04 LTS amd64 版本,
只是安裝之前不斷地使用 Live CD 測試安裝 Volar HX 驅動,
因為圓剛公司很明確的不升級此款商品的驅動,
所以不斷的實驗並參考了 LinuxTV 才能正常將它編譯出驅動。

首先要安裝一些工具才方便作業:
dialog(這是在 Kernel 2.6.x 安裝時就會要求安裝的)
ghex(只用來編輯名為 osdep_dvb.o_shipped 的檔案)

要被修改的檔案有 6 個:
(鏈結內是已修改完成的)
  1. driver-core
  2. osdep.c
  3. osdep_dvb.c
  4. osdep_th2.c
  5. osdep_v4l2.c
  6. osdep_dvb.o_shipped
外加一個安裝 shell 檔:
前面 6 個檔案是由官方的驅動所解出來的,
可以在 Kernel 2.6.x 的版本使用 expert 模式安裝解壓出來,
若已經使用 Kernel 3 的版本則需要刪除幾行設置才能讓它略過核心版本的檢查再將它解壓出來。

簡單的說,
後者的取得方式比前者稍麻煩些!
(不過這裡也有提供修改後的 壓縮檔 供下載,特別是給懶得動手修改的人使用)


修改檔案與內容
修改 driver-core(共 1 處):
1.在 #include 之後
新增 #include


修改 osdep.c(共 3 處):
1.尋找 #include 並刪除它

2-1.替換 init_MUTEX(tmp)
變成 sema_init(tmp, 1)

2-2.替換 init_MUTEX_LOCKED(tmp)
變成 sema_init(tmp, 0)

3.替換 void SysLockKernel()、void SysUnlockKernel() 及其內容

變成此圖框選處一樣

修改 osdep_dvb.c(共 2 處):
1.尋找 #include 並刪除它

2.替換 init_MUTEX(&p->feedlock)
變成 sema_init(&p->feedlock, 1)


修改 osdep_th2.c(共 4 處):
1.尋找 #include 並刪除它

2.在 #include "osdep_th2.h" 後面加入 #include "osdep.h"

3.尋找 lock_kernel();
變成 SysLockKernel();

4.尋找 unlock_kernel();
變成 SysUnlockKernel();


修改 osdep_v4l2.c(共 2 處):
1.尋找 #include 並刪除它

2.在最上面新增 #define VFL_TYPE_VTX 3

用 GHex 修改 osdep_dvb.o_shipped(共 2 處):
1.尋找 param_array_get(按下右邊的區域輸入文字)

2.尋找 param_array_set(按下右邊的區域輸入文字)

將 param_array_get 及 param_array_set 
全變成 param_array_ops(共有 2 個 param_array_ops 也沒關係)

新增 install.sh 文件:
#!/bin/bash -i
#create soft link from /usr/src/linux-headers-$(uname -r) to /lib/modules/$(uname -r)/source
ln -s /usr/src/linux-headers-$(uname -r) /lib/modules/$(uname -r)/source
#LinuxTV缺少上面這行,使得我執行該檔時被告知少了某個目錄
# get absolute path of this script
BASE=`(cd \`dirname $0\`; pwd)`
TARGET_DIR=/lib/modules/`uname -r`/kernel/drivers/media/dvb/dvb-usb
if [[ "$EUID" != "0" ]]; then
    echo -e "You must be root to run installer.
\nPlease login as root or use 'su' or 'sudo' to obtain root privileges.
\nInstaller will now abort."
    exit
fi
cd "$BASE"
make || { echo "make failed"; exit 1; }
echo -e "\nCopying h826d.ko to $TARGET_DIR/h826d.ko"
cp -r h826d.ko $TARGET_DIR/ || { echo "copy failed"; exit 1; }
echo -e "\nCopying averusbh826d.ko to $TARGET_DIR/averusbh826d.ko"
cp -r averusbh826d.ko $TARGET_DIR/ || { echo "copy failed"; exit 1; }
echo -e "\nRunning depmod -a"
depmod -a || { echo "depmod failed"; exit 1; }
echo -e "\nCleaning"
make clean || { echo "make clean failed"; exit 1; }
echo -e "\nCompleted"
modprobe h826



最後執行這個 install 安裝檔就可以編譯出 h826d.ko 及 averusbh826d.ko。
lancer@lancer-desktop:~/H826D-expert-install$ sudo ./install

[sudo] password for lancer: 
make -C /lib/modules/3.2.0-24-generic/source O=/lib/modules/3.2.0-24-generic/build SUBDIRS=`pwd` 
make[1]: Entering directory `/usr/src/linux-headers-3.2.0-24-generic'
  LD      /home/lancer/H826D-expert-install/built-in.o
  CC [M]  /home/lancer/H826D-expert-install/aver/averusb-mod.o
  CC [M]  /home/lancer/H826D-expert-install/driver-core.o
  SHIPPED /home/lancer/H826D-expert-install/aver/osdep_dvb.o
  CC [M]  /home/lancer/H826D-expert-install/aver/osdep_th2.o
  CC [M]  /home/lancer/H826D-expert-install/aver/osdep_v4l2.o
  CC [M]  /home/lancer/H826D-expert-install/aver/osdep_vbuf.o
  CC [M]  /home/lancer/H826D-expert-install/aver/osdep_alsa.o
  SHIPPED /home/lancer/H826D-expert-install/_prebuild.o
  LD [M]  /home/lancer/H826D-expert-install/h826d.o
  LD [M]  /home/lancer/H826D-expert-install/averusbh826d.o
  Building modules, stage 2.
  MODPOST 2 modules
WARNING: could not find /home/lancer/H826D-expert-install/aver/.osdep_dvb.o.cmd for /home/lancer/H826D-expert-install/aver/osdep_dvb.o
  CC      /home/lancer/H826D-expert-install/averusbh826d.mod.o
  LD [M]  /home/lancer/H826D-expert-install/averusbh826d.ko
  CC      /home/lancer/H826D-expert-install/h826d.mod.o
  LD [M]  /home/lancer/H826D-expert-install/h826d.ko
make[1]: Leaving directory `/usr/src/linux-headers-3.2.0-24-generic'
strip --strip-debug *.ko

Copying h826d.ko to /lib/modules/3.2.0-24-generic/kernel/drivers/media/dvb/dvb-usb/h826d.ko

Copying averusbh826d.ko to /lib/modules/3.2.0-24-generic/kernel/drivers/media/dvb/dvb-usb/averusbh826d.ko

Running depmod -a

Cleaning
find -L -name '*.o' -exec rm -f {} \;
find -L -name '.*.o.cmd' -exec rm -f {} \;
rm -rf *~ *.o *.ko *.mod.c .tmp_versions 
rm -rf aver/*.o aver/.*.o.cmd
rm -f .version .exversion .*.o.flags .*.o.d .*.o.cmd .*.ko.cmd
rm -f Module.symvers Modules.symvers

Completed
lancer@lancer-desktop:~/H826D-expert-install$



沒有留言:

張貼留言