1. 程式人生 > >RK3288 camera(HM2057+HM5065)驅動移植

RK3288 camera(HM2057+HM5065)驅動移植

camera驅動移植

平臺:rk3288  Android 7.1
一、移植步驟
1. 新增驅動檔案HM2057和HM5065到以下路徑:
hardware/rockchip/camera/siliconImage/isi/drv

2.新增編譯規則,將驅動檔案編譯進系統,修改camera/Cnfig目錄下的user.mk以及android.mk檔案,有些.mk檔案時預設編譯此資料夾下所有檔案,而有些需要手動新增,程式碼如下:

ifeq ($(strip $(TARGET_BOARD_PLATFORM)), rk3288)
    PRODUCT_PACKAGES += \
        libisp_isi_drv_GC2145 \

3.配置cam_board.xml檔案,將攝像頭名稱改成自己需要移植的,其他需要修改的引數根據原理圖,規格書來決定,主要是配置電源使能腳Pwen和Pwdn,復位腳Rst,以及馬達的pin腳,拍照解析度,預覽解析度等等,部分原理圖如下:
電源使能腳和復位腳
馬達腳

對應的GPIO
對應的GPIO
對應的GPIO
4.區域性編譯:

$:cd hardware/rockchip/camera
$:mm

注意:編譯之前要配置編譯環境,參考編譯下載筆記。
5.區域性更新

adb root
adb remount
adb push cam_board.xml /system/etc/
adb push camera.rk30board.so libisp_isi_drv_HM2057.so
libisp_isi_drv_HM5065.so /system/lib/hw/ adb shell sync adb reboot

這裡有一點需要注意,cam_board.xml檔案更新到/etc/目錄下後,/data/camera/目錄下的media_profiles.xml要刪除(暫時還不清楚原因)
6.logcat輸出日誌
輸出到文字以及檢視實時列印:

adb shell logcat > logcat.txt
adb shell
$:logcat -c
$:logcat

7.當修改的是cam_board_rk3288.xml檔案時,需要生成大韌體才能燒進機器

$:mm
$:./mkimage.sh

二、移植和除錯時遇到的問題及解決方法
1..除錯攝像頭時,預覽的圖片會發生左右或者上下偏轉。修改驅動程式碼中orientation的值就好,一般值為90或者270(角度),實際修改中這個度數與機器的sensor偏轉角度有關,相關原理自行百度。
(1)方法一:直接修改驅動程式碼中orientation的值

if (hwrotation == 0) {
    gCamInfos[0].facing_info.orientation = 270;    //該值為旋轉角度
    gCamInfos[1].facing_info.orientation = 270;
}

(2)修改cam_board.xml配置檔案

<SensorOrientation orientation="270"></SensorOrientation>

2.I2C通訊失敗,logcat檢視打印出現以下列印:

CameraHal: WARNING:HGT  retry i2c times:0
CameraHal: WARNING: HM5065 soft reset by i2c failed!, please check follow information:
CameraHal:     Slave_addr: 0x3e 0x0
CameraHal:     Soft reset reg: 0x0  val: 0x3                
CameraHal:     Power/PowerDown/Reset/Mclk/I2cBus
CameraHal: HM5065 device register failed!

以上列印資訊提示I2C復位失敗,設備註冊失敗,導致這個問題的原因是什麼?如何解決這個問題?
原因以及解決方法:cam_board.xml檔案中pwdn腳以及rst復位腳配錯,導致I2C通訊失敗(以後出現camera驅動I2C通訊失敗,可檢查是否是slave_addr,soft reset reg定義錯誤,以及引腳配置出錯)
3.由於是前置和後置雙攝像頭驅動移植,解決了I2C通訊問題之後,發現HM5065攝像頭設備註冊成功,雖然 HM2057沒有報I2C通訊失敗,但還是device register failed,logcat檢視hardware層列印可看到:

CameraHal: Check HM2057 ID: reg: 0x1  val: 0x20 default: 0x20  
CameraHal: Check HM2057 ID: reg: 0x2  val: 0x56 default: 0x56 
CameraHal: Check HM2057 ID: reg: 0x3  val: 0x19 default: 0xf9
CameraHal: HM2057 device register failed

通過以上打印發現val: 0x19 default: 0xf9兩者並不匹配,回到HM2057驅動程式碼,發現以下巨集定義:

#define HM2057_CHIP_ID_HIGH_BYTE_DEFAULT            (0x20) // r - 
#define HM2057_CHIP_ID_MIDDLE_BYTE_DEFAULT          (0x56) // r - 
#define HM2057_CHIP_ID_LOW_BYTE_DEFAULT             (0x19) // r –

第三個值設定為0x19,通過追驅動程式碼發現驅動中設定的值與實際值不一樣導致的(同事說可能是驅動程式碼在android5.1上,現在移植到7.1上導致,該值的作用現在也不知道,汗顏),將巨集定義的值改為0xf9則設備註冊成功。
4.驅動註冊成功之後,開啟相機APP,發現彈出app錯誤,此時先把出錯提示關掉,通過adb除錯:

adb shell
$logcat -c
$logcat 

再點選進入相機app,實時列印中可以查詢到報錯的地方如下:

AndroidRuntime:java.lang.RuntimeException:Unable to start activity ComponentInfo{com.android.camera.camera.CameraActivity}:  java.lang.IllegalArgumentException:Could not find supported video qualities.

該錯誤是找不到支援的拍攝視訊解析度
發現是cam_board.xml定義HM2057中某些屬性與驅動中的定義並不一致,原來是以下屬性:

<DV_VGA name="480p" width="640" height="480" fps="10" support="1"></DV_VGA>

但是在驅動中並沒有定義,追蹤驅動程式碼,在函式static RESULT HM2057_IsiGetCapsIssInterna()中定義的攝像頭的畫素:

switch (pIsiSensorCaps->Index) 
{
    case 0:
    {
        pIsiSensorCaps->Resolution = ISI_RES_1600_1200P7;
        break;
    }
    case 1:
    {
        pIsiSensorCaps->Resolution = ISI_RES_SVGAP15;
        break;
    }
    default:
    {
        result = RET_OUTOFRANGE;
        goto end;
    }
}

檢視ISI_RES_SVGAP15的巨集定義可以看到:

#define  ISI_RES_SVGAP15   0x1e320258  /**< 16 [email protected]*/

需要將DV屬性值改成如下:

<DV_VGA name="SVGA" width="800" height="600" fps="15" support="1"></DV_VGA>

發現可以正常進入相機APP,兩個攝像頭正常工作,說明驅動移植成功了。
5.正常進入相機apk後,發現原本HM5065S攝像頭是500W的畫素,但是相機解析度設定那裡只顯示30W。
解決方法:進入kernel先make clean,再編譯核心,重新燒錄全部.img檔案。

6.攝像頭預覽解析度獲取邏輯為先呼叫HM5065_IsiGetCapsIssInternel函式,看switch函式裡面是否有要和設定的解析度一致;
  有一致則獲取這個解析度,否則會取switch的最後一個解析度,比如HM_5065之前是ISI_RES_TV720P30,然後呼叫HM5065_SetOutputWindow函式設定HM5065的輸出解析度;
  之所以會有裁剪的情況出現,有兩個原因:
  (1)攝像頭暫存器設定有問題,本身就是裁剪的影象輸出。
  (2)在第二步中上層設定的解析度不在switch裡面,就會造成攝像頭輸出為1280x720,而實際只需要800x600,具體函式為setupPreview(width_sensor,height_sensor,width_sensor,height_sensor,mZoomVal);
  如果出現裁剪的情況,可以優先檢查是否出現第二種情況,再檢查第一種情況。