Mac Webcam (NOT WORK)

  1. Macbook pro 內建 webcam 無驅動程式,網路有相關程式,必須下載編譯。
    [root@dywmac src]# git clone https://github.com/patjak/bcwc_pcie/
    
  2. 安裝核心發展套件。
    [root@dywmac src]# rpm -ivh http://dy.csie.cyut.edu.tw/kernel/ltml/RPMS/\
    kernel-ml-devel-4.3.3-1.el6.elrepo.x86_64.rpm
    
  3. 以此核心版本編譯,雖完成編譯,但有警告訊息,且開機載入不成功。
    [root@dywmac src]# cd /usr/src/bcwc_pcie
    [root@dywmac bcwc_pcie]# make
    make -C /lib/modules/4.3.3-1.el6.elrepo.x86_64/build M=/usr/src/bcwc_pcie modules
    make[1]: Entering directory `/usr/src/kernels/4.3.3-1.el6.elrepo.x86_64'
      CC [M]  /usr/src/bcwc_pcie/fthd_ddr.o
      CC [M]  /usr/src/bcwc_pcie/fthd_hw.o
      CC [M]  /usr/src/bcwc_pcie/fthd_drv.o
      CC [M]  /usr/src/bcwc_pcie/fthd_ringbuf.o
      CC [M]  /usr/src/bcwc_pcie/fthd_isp.o
    /usr/src/bcwc_pcie/fthd_isp.c: In function ‘fthd_isp_cmd_channel_camera_config’:
    /usr/src/bcwc_pcie/fthd_isp.c:662:2: warning: ‘ret’ may be used uninitialized
     in this function [-Wmaybe-uninitialized]
      return ret;
      ^
      CC [M]  /usr/src/bcwc_pcie/fthd_v4l2.o
    /usr/src/bcwc_pcie/fthd_v4l2.c:298:2: warning: initialization from
     incompatible pointer type [enabled by default]
      .queue_setup            = fthd_buffer_queue_setup,
      ^
    /usr/src/bcwc_pcie/fthd_v4l2.c:298:2: warning: (near initialization
     for ‘vb2_queue_ops.queue_setup’) [enabled by default]
      CC [M]  /usr/src/bcwc_pcie/fthd_buffer.o
      CC [M]  /usr/src/bcwc_pcie/fthd_debugfs.o
      LD [M]  /usr/src/bcwc_pcie/facetimehd.o
      Building modules, stage 2.
      MODPOST 1 modules
    WARNING: "__fentry__" [/usr/src/bcwc_pcie/facetimehd.ko] undefined!
      CC      /usr/src/bcwc_pcie/facetimehd.mod.o
      LD [M]  /usr/src/bcwc_pcie/facetimehd.ko
    make[1]: Leaving directory `/usr/src/kernels/4.3.3-1.el6.elrepo.x86_64'
    
  4. 安裝 4.4.5-1 版核心發展套件。
    [root@dywmac RPMS]# rpm -ivh kernel-ml-devel-4.4.5-1.el6.elrepo.x86_64.rpm
    
  5. 編譯 facetimehd。
    [root@dywmac RPMS]# cd /usr/src/bcwc_pcie/
    [root@dywmac bcwc_pcie]# make
    make -C /lib/modules/4.4.5-1.el6.elrepo.x86_64/build M=/usr/src/bcwc_pcie modules
    make[1]: Entering directory `/usr/src/kernels/4.4.5-1.el6.elrepo.x86_64'
      CC [M]  /usr/src/bcwc_pcie/fthd_ddr.o
      CC [M]  /usr/src/bcwc_pcie/fthd_hw.o
      CC [M]  /usr/src/bcwc_pcie/fthd_drv.o
      CC [M]  /usr/src/bcwc_pcie/fthd_ringbuf.o
      CC [M]  /usr/src/bcwc_pcie/fthd_isp.o
    /usr/src/bcwc_pcie/fthd_isp.c: In function ‘fthd_isp_cmd_channel_camera_config’:
    /usr/src/bcwc_pcie/fthd_isp.c:662:2: warning: ‘ret’ may be used uninitialized
     in this function [-Wmaybe-uninitialized]
      return ret;
      ^
      CC [M]  /usr/src/bcwc_pcie/fthd_v4l2.o
      CC [M]  /usr/src/bcwc_pcie/fthd_buffer.o
      CC [M]  /usr/src/bcwc_pcie/fthd_debugfs.o
      LD [M]  /usr/src/bcwc_pcie/facetimehd.o
      Building modules, stage 2.
      MODPOST 1 modules
    WARNING: "__fentry__" [/usr/src/bcwc_pcie/facetimehd.ko] undefined!
      CC      /usr/src/bcwc_pcie/facetimehd.mod.o
      LD [M]  /usr/src/bcwc_pcie/facetimehd.ko
    make[1]: Leaving directory `/usr/src/kernels/4.4.5-1.el6.elrepo.x86_64'
    
  6. 安裝 facetimehd 模組。
    [root@dywmac bcwc_pcie]# make install
    make -C /lib/modules/4.4.5-1.el6.elrepo.x86_64/build M=/usr/src/bcwc_pcie modules_install
    make[1]: Entering directory `/usr/src/kernels/4.4.5-1.el6.elrepo.x86_64'
      INSTALL /usr/src/bcwc_pcie/facetimehd.ko
      DEPMOD  4.4.5-1.el6.elrepo.x86_64
    WARNING: /lib/modules/4.4.5-1.el6.elrepo.x86_64/extra/facetimehd.ko needs unknown symbol __fentry__
    make[1]: Leaving directory `/usr/src/kernels/4.4.5-1.el6.elrepo.x86_64'
    
  7. 無法載入 facetimehd 模組。
    [root@dywmac bcwc_pcie]# modprobe facetimehd
    FATAL: Error inserting facetimehd (/lib/modules/4.4.5-1.el6.elrepo.x86_64/extra/facetimehd.ko):
     Unknown symbol in module, or unknown parameter (see dmesg)
    
  8. 目前 gcc 版本 4.8,版本不對,降低版本至 4.4。
    [root@dywmac bcwc_pcie]# yum downgrade gcc-* libstdc++* cpp libgomp
    
  9. 再編譯已無 __fentry__ 相關的錯誤訊息。
    [root@dywmac bcwc_pcie]# make
    make -C /lib/modules/4.4.5-1.el6.elrepo.x86_64/build M=/usr/src/bcwc_pcie modules
    make[1]: Entering directory `/usr/src/kernels/4.4.5-1.el6.elrepo.x86_64'
      CC [M]  /usr/src/bcwc_pcie/fthd_ddr.o
      CC [M]  /usr/src/bcwc_pcie/fthd_hw.o
      CC [M]  /usr/src/bcwc_pcie/fthd_drv.o
      CC [M]  /usr/src/bcwc_pcie/fthd_ringbuf.o
      CC [M]  /usr/src/bcwc_pcie/fthd_isp.o
    /usr/src/bcwc_pcie/fthd_isp.c: In function ‘fthd_isp_cmd_channel_camera_config’:
    /usr/src/bcwc_pcie/fthd_isp.c:647: warning: ‘ret’ may be used uninitialized in this function
      CC [M]  /usr/src/bcwc_pcie/fthd_v4l2.o
      CC [M]  /usr/src/bcwc_pcie/fthd_buffer.o
      CC [M]  /usr/src/bcwc_pcie/fthd_debugfs.o
      LD [M]  /usr/src/bcwc_pcie/facetimehd.o
      Building modules, stage 2.
      MODPOST 1 modules
      CC      /usr/src/bcwc_pcie/facetimehd.mod.o
      LD [M]  /usr/src/bcwc_pcie/facetimehd.ko
    make[1]: Leaving directory `/usr/src/kernels/4.4.5-1.el6.elrepo.x86_64'
    
  10. 安裝 facetimehd 模組。
    [root@dywmac bcwc_pcie]# make install
    make -C /lib/modules/4.4.5-1.el6.elrepo.x86_64/build M=/usr/src/bcwc_pcie modules_install
    make[1]: Entering directory `/usr/src/kernels/4.4.5-1.el6.elrepo.x86_64'
      INSTALL /usr/src/bcwc_pcie/facetimehd.ko
      DEPMOD  4.4.5-1.el6.elrepo.x86_64
    make[1]: Leaving directory `/usr/src/kernels/4.4.5-1.el6.elrepo.x86_64'
    
  11. 成功載入 facetimehd 模組。
    [root@dywmac bcwc_pcie]# modprobe facetimehd
    [root@dywmac bcwc_pcie]# lsmod | grep facetimehd
    facetimehd             69632  0 
    videobuf2_v4l2         28672  2 uvcvideo,facetimehd
    videobuf2_dma_sg       20480  1 facetimehd
    videobuf2_core         36864  3 uvcvideo,facetimehd,videobuf2_v4l2
    videodev              180224  5 uvcvideo,facetimehd,videobuf2_v4l2,v4l2_common,videobuf2_core
    
  12. 但還是沒有 webcam,查詢 log 發現沒有 firmware.bin。
    [root@dywmac ~]# tail /var/log/messages 
    Sep 21 08:52:18 localhost kernel: facetimehd 0000:02:00.0: VDL set to: coarse=0x10008, fine=0x1011a
    Sep 21 08:52:18 localhost kernel: facetimehd 0000:02:00.0: Virtual VTT enabled
    Sep 21 08:52:18 localhost kernel: facetimehd 0000:02:00.0: S2 DRAM memory address: 0x22159559
    Sep 21 08:52:18 localhost kernel: facetimehd 0000:02:00.0: Rewrite DDR mode registers succeeded
    Sep 21 08:52:18 localhost kernel: facetimehd 0000:02:00.0: Full memory verification succeeded! (0)
    Sep 21 08:52:18 localhost kernel: facetimehd 0000:02:00.0: Direct firmware load for facetimehd/firmware.bin failed with error -2
    Sep 21 08:52:18 localhost kernel: facetimehd 0000:02:00.0: Falling back to user helper
    Sep 21 08:52:18 localhost kernel: facetimehd: probe of 0000:02:00.0 failed with error -11
    Sep 21 08:52:18 localhost firmware.sh[3287]: Cannot find  firmware file 'facetimehd/firmware.bin'
    Sep 21 08:52:19 localhost pulseaudio[2965]: ratelimit.c: 28 events suppressed
    
  13. 但還是沒有 webcam,查詢 log 發現沒有 firmware.bin。
    [root@dywmac ~]# tail /var/log/messages 
    Sep 21 08:52:18 localhost kernel: facetimehd 0000:02:00.0: VDL set to: coarse=0x10008, fine=0x1011a
    Sep 21 08:52:18 localhost kernel: facetimehd 0000:02:00.0: Virtual VTT enabled
    Sep 21 08:52:18 localhost kernel: facetimehd 0000:02:00.0: S2 DRAM memory address: 0x22159559
    Sep 21 08:52:18 localhost kernel: facetimehd 0000:02:00.0: Rewrite DDR mode registers succeeded
    Sep 21 08:52:18 localhost kernel: facetimehd 0000:02:00.0: Full memory verification succeeded! (0)
    Sep 21 08:52:18 localhost kernel: facetimehd 0000:02:00.0: Direct firmware load for facetimehd/firmware.bin failed with error -2
    Sep 21 08:52:18 localhost kernel: facetimehd 0000:02:00.0: Falling back to user helper
    Sep 21 08:52:18 localhost kernel: facetimehd: probe of 0000:02:00.0 failed with error -11
    Sep 21 08:52:18 localhost firmware.sh[3287]: Cannot find  firmware file 'facetimehd/firmware.bin'
    Sep 21 08:52:19 localhost pulseaudio[2965]: ratelimit.c: 28 events suppressed
    
  14. 進入原始碼目錄 /usr/src/bcwc_pcie/firmware,執行 make 進行編譯,出現錯誤。
    [root@dywmac ~]# cd /usr/src/bcwc_pcie/firmware/
    [root@dywmac firmware]# make
    
    Checking dependencies for driver download...
    /usr/bin/curl
    /usr/bin/xzcat
    /bin/cpio
    
    Downloading the driver, please wait...
    mv: cannot stat `System/Library/Extensions/AppleCameraInterface.kext
    /Contents/MacOS/AppleCameraInterface': No such file or directory
    make: *** [AppleCameraInterface] Error 1
    
  15. 原因為 Makefile 中下載檔案出問題。
    [root@dywmac firmware]#  curl -s -L -r "187085540-191012220" \
    "https://support.apple.com/downloads/DL1858/en_US/osxupd10.11.3.dmg" \
    | xzcat -q | cpio --format odc -i -d \
    "./System/Library/Extensions/AppleCameraInterface.kext/Contents/MacOS/AppleCameraInterface"
    xzcat: (stdin): Unexpected end of input
    cpio: premature end of file