全志平台camera.cfg文件的选项内容说明


全志平台采用camera.cfg对摄像头的基本配置项进行配置,在调试过程中,可以通过adb的方式进行简单方便的调试,其具体含义说明如下:

  1. ;-------------------------------------------------------------------------------  
  2. ; 用于camera的配置  
  3. ;  
  4. ; 采用格式:  
  5. key = key_value  
  6. ; 注意: 每个key需要顶格写;  
  7. ; key_value紧跟着key后面的等号后面, 位于同一行中;  
  8. ; key_value限制大小为256字节以内;  
  9. ;  
  10. ;-------------------------------------------------------------------------------  
  11.    
  12. ;-------------------------------------------------------------------------------  
  13. ; exif information of "make" and "model"  
  14. ; exif 信息,用于标识照片的来源及拍照设备名称,一般不用修改。  
  15. ;-------------------------------------------------------------------------------  
  16. key_camera_exif_make = MAKE_A23  
  17. key_camera_exif_model = MODEL_A23  
  18.    
  19. ;-------------------------------------------------------------------------------  
  20. ; 1 for single camera, 2 for double camera  
  21. ;  摄像头数量,1 -- 单摄像头 ;2 -- 双摄像头  
  22. ;-------------------------------------------------------------------------------  
  23. number_of_camera = 1  
  24.    
  25. ;-------------------------------------------------------------------------------  
  26. ; CAMERA_FACING_BACK  
  27. ;  
  28. ; 后置摄像头,一般情况0 表示后置摄像头,当转化摄像头配置的gpio口时,可能为后置。  
  29. ; 具体根据硬件配置。  
  30. ;-------------------------------------------------------------------------------  
  31. camera_id = 0  
  32.    
  33. ;-------------------------------------------------------------------------------  
  34. ; 1 for CAMERA_FACING_FRONT  
  35. ; 0 for CAMERA_FACING_BACK  
  36. ; 摄像头的朝向,0 -- 背对人脸的方向, 1 -- 面对人脸的方向。  
  37. ;-------------------------------------------------------------------------------  
  38. camera_facing = 0  
  39.    
  40. ;-------------------------------------------------------------------------------  
  41. ; 1 for camera without isp(using built-in isp of Axx)  
  42. ; 0 for camera with isp  
  43. ; 是否内置isp , 0 -- 有 1 -- 没有   
  44. ;-------------------------------------------------------------------------------  
  45. use_builtin_isp = 0  
  46.    
  47. ;-------------------------------------------------------------------------------  
  48. ; camera orientation (0, 90, 180, 270)  
  49.    
  50. ; 摄像头旋转方向,一般不做旋转,出现某个摄像头出现方向不对是做调整。  
  51. ;-------------------------------------------------------------------------------  
  52. camera_orientation = 0  
  53.    
  54. ;-------------------------------------------------------------------------------  
  55. ; driver device name  
  56. ; 系统设备名称,一般前后摄像头共用dev/video0;  
  57. ; 检测是否有摄像头设备挂载,可以adb  shell ll dev/ 查看是否有该设备。  
  58. ;-------------------------------------------------------------------------------  
  59. camera_device = /dev/video0  
  60.    
  61. ;-------------------------------------------------------------------------------  
  62. ; device id  
  63. ; for two camera devices with one CSI  
  64. ; 用于区分CSI设备的序号,一般不做修改。  
  65. ;-------------------------------------------------------------------------------  
  66. device_id = 0  
  67. ;------------------------------------------------------  
  68. ; 浏览配置。  
  69. ; used_preview_size -- 是否配置的画面尺寸。 1 -- 是,0 -- 否  
  70. ; key_support_preview_size -- 可以支持的画面尺寸。  
  71. ; key_default_preview_size -- 默认支持的画面尺寸  
  72. ; 不建议做修改  
  73. ;-----------------------------------------------------  
  74. used_preview_size = 1  
  75. key_support_preview_size = 640x480  
  76. key_default_preview_size = 640x480  
  77.    
  78. ;------------------------------------------------------  
  79. ; 拍照配置。  
  80. ; used_picture_size -- 是否配置的画面尺寸。 1 -- 是,0 -- 否  
  81. ; key_support_picture_size -- 可以支持的画面尺寸。  
  82. ; key_default_picture_size -- 默认支持的画面尺寸  
  83. ;-----------------------------------------------------  
  84. used_picture_size = 1  
  85. key_support_picture_size = 1600x1200,800x600  
  86. key_default_picture_size = 1600x1200  
  87.    
  88. ;------------------------------------------------------  
  89. ; 闪光灯配置。  
  90. ; used_flash_mode -- 是否使用闪光灯。 1 -- 是,0 -- 否  
  91. ; key_support_flash_mode -- 可以支持的闪光灯的配置项目,在页面上显示一般为。on -- 开启, off -- 关闭  
  92. ; key_default_flash_mode -- 默认闪光灯配置  
  93. ;-----------------------------------------------------  
  94. used_flash_mode = 1  
  95. key_support_flash_mode = on,off  
  96. key_default_flash_mode = on  
  97.    
  98. ;------------------------------------------------------  
  99. ; 颜色特效配置。  
  100. ; used_color_effect -- 是否使用颜色特效 。1 -- 是,0 -- 否  
  101. ; key_support_color_effect -- 可以支持的颜色特效的配置项目,在页面上显示一般为。  
  102. ; none -- 无; mono -- 单色; negative -- 底片模式 ; sepia -- 棕褐色;aqua -- 浅绿色  
  103. ; key_default_color_effect -- 默认颜色特效配置 none  
  104. ;-----------------------------------------------------  
  105.    
  106. used_color_effect=1  
  107. key_support_color_effect = none,mono,negative,sepia,aqua  
  108. key_default_color_effect = none  
  109.    
  110. ;------------------------------------------------------  
  111. ; 帧频率配置。  
  112. ; used_frame_rate -- 是否使用帧频率 。1 -- 是,0 -- 否  
  113. ; key_support_frame_rate -- 可以支持的帧频率 ;一般为20~25,根据摄像头的情况配置  
  114. ; key_support_frame_rate -- 默认帧频率   
  115. ;-----------------------------------------------------  
  116.    
  117. used_frame_rate = 1  
  118. key_support_frame_rate = 25  
  119. key_default_frame_rate = 25  
  120. ;------------------------------------------------------  
  121. ; 聚焦模式配置。  
  122. ; used_focus_mode -- 是否使用聚焦模式 。1 -- 是,0 -- 否  
  123. ; key_support_focus_mode -- 可以支持的聚焦模式;  
  124. ; auto -- 自动 ; infinity -- 远焦距模式 ;macro -- 微距 ; fixed -- 定焦 ; continuous-video -- 视频自动连续对焦; continuous-picture -- 图片自动连续对焦  
  125. ; key_default_focus_mode -- 默认聚焦模式  
  126. ; 聚焦模式需要摄像头支持  
  127. ;-----------------------------------------------------  
  128. used_focus_mode = 0  
  129. key_support_focus_mode = auto,infinity,macro,fixed,continuous-video,continuous-picture  
  130. key_default_focus_mode = auto  
  131.    
  132. ;------------------------------------------------------  
  133. ; 场景模式配置。  
  134. ; used_scene_mode -- 是否使用场景模式 。1 -- 是,0 -- 否  
  135. ; key_support_scene_mode -- 可以支持的场景模式;  
  136. ; auto -- 自动 ; portrait -- 人物模式;landscape --  风景 ;night -- 夜景;night-portrait -- 夜景人物;  
  137. ;theatre -- 室内;beach -- 户外;snow -- 雪景; sunset -- 黄昏; steadyphoto -- 防抖 ;fireworks -- 强光;  
  138. ;sports -- 运动模式; party -- 聚会; candlelight -- 灯光;barcode -- 条形码  
  139. ; key_default_scene_mode -- 默认场景模式 -- auto  
  140. ; 场景模式需要摄像头支持,翻译不一定准确,请核对相应的专业词汇。  
  141. ;-----------------------------------------------------  
  142.    
  143. used_scene_mode = 0  
  144. key_support_scene_mode = auto,portrait,landscape,night,night-portrait,theatre,beach,snow,sunset,steadyphoto,fireworks,sports,party,candlelight,barcode  
  145. key_default_scene_mode = auto  
  146.    
  147. ;------------------------------------------------------  
  148. ; 白平衡配置。  
  149. ; used_white_balance -- 是否使用白平衡 。1 -- 是,0 -- 否  
  150. ; key_support_white_balance -- 可以支持的白平衡配置。  
  151. ; auto -- 自动 ;incandescent -- 白炽灯   fluorescent  -- 荧光  
  152. ;warm-fluorescent -- 荧光   daylight -- 日光 ;cloudy-daylight -- 阴天  
  153. ; key_default_white_balance -- 默认白平衡 -- auto  
  154. ;-----------------------------------------------------  
  155. used_white_balance = 1  
  156. key_support_white_balance = auto,incandescent,fluorescent,warm-fluorescent,daylight,cloudy-daylight  
  157. key_default_white_balance = auto  
  158.    
  159. ;------------------------------------------------------  
  160. ; 曝光值配置。  
  161. ; used_scene_mode -- 是否使用曝光值 1 -- 是,0 -- 否  
  162. ; key_max_exposure_compensation --  最大曝光值  
  163. ;key_min_exposure_compensation -- 最小曝光值  
  164. ; key_step_exposure_compensation -- 步进值  
  165. ;key_default_exposure_compensation -- 默认曝光值  
  166. ;-----------------------------------------------------  
  167.    
  168. used_exposure_compensation = 1  
  169. key_max_exposure_compensation = 3  
  170. key_min_exposure_compensation = -3  
  171. key_step_exposure_compensation = 1  
  172. key_default_exposure_compensation = 0  
  173.    
  174. ;-------------------------------------------------------------------------------  

以上为个人总结,若有谬误,还请指出。

全志A23音频配置操作说明 -- 修改工具版


  1. 用DragonFace-A23.exe工具打开*.img文件后,选择:高级设置>>修改系统配置。

  2. 在打开的sysconfig1.lhs文件中,使用ctrl + F 查找 audio0 。

  3. 找到audio0所在位置的配置属性,按照需求修改如下参数:

    1. audio_used        = 1            ;AudioCodec是否使用,1—使用,0—不使用  
    2. audio_hp_ldo      = "none"   ; 独立电源控制配置,一般置为:none  
    3. headphone_vol     = 0x3b     ;耳机音量极值=< 0x3f,63级  
    4. cap_vol           = 0x1          ;录音音量:0x0--0db,0x1--24db,0x2--27db,0x3--30db,0x4--33db,0x5--36db,0x6--39db,0x7--42db         
    5. digital_vol       = 0x3          ;差分输出时用于调节波形失真导致的问题(0x2~0x6)。  
    6. pa_single_vol     = 0x3b         ;单喇叭音量极值=< 0x3f,63级;1.5db/step。  
    7. pa_double_used    = 0        ;差分与单通信号配置,0-为差分,1-为单通  
    8. pa_double_vol     = 0x3b     ;双喇叭音量极值=< 0x3f,63级;1.5db/step。  
    9. headphone_direct_used   = 1      ;耳机直驱与交驱选择:0-为交驱,1-为直驱  
    10. audio_pa_ctrl = port:PH09 ; 喇叭的gpio控制  
  4. 说明:关于单喇叭与双喇叭及差分,单通的关系。

    • 采用差分时,一般HPL和HPR时输出差分信号,需要同时接到AP的IN+和IN-,若此时采用短接的方式可能导致没有音频输出。
    • 采用单端时,左右声道是分开输出,需要采用短接的方式将左右声道信号混合输出,若此时未短接可能导致声道信号缺失。

Android Linux内核驱动编写简要步骤说明.


众所周知,Android系统使用linux作为其内核,而Android的驱动多数情况下与linux系统驱动特点一致,下面简述一下linux驱动的添加步骤(主要针对简单设备驱动,不包括各平台额外添加或者摄像头,wifi等多层次驱动的添加)。

定位设备类型,寻找驱动存放位置

一般情况,我们要求不同类型的设备驱动要放到指定的位置,但是位置不影响最后驱动的调用效果,仅仅是作为一个驱动程序员的自觉。

新建驱动文件及目录

在找的目录下新建一个存放此设备的驱动文件的文件夹是一个好习惯,因为通常情况下驱动文件可能包含多个文件。
常规驱动的文件一般包含有:
1. 1个或者多个c文件来编写设备驱动;
2. 1个或者多个h文件,用来定义常量,文件间可调用的函数申明等;
3. 然后就是Kconfig和Makefile文件,若未新建文件,此2个文件可省略,并将其内容写到c文件所在的Kconfig和Makefile文件中。

驱动文件编写方法 - -c及h文件

此为驱动的主文件,通常有3种实现方式,分别为:传统方式,proc方式和dvfs方式。

传统方式:设备按照文件方式进行访问,其需要定义的函数包括:open , release , read, write四个函数及file_operations的方法表。

proc方式:按照proc的方式进行访问,其需要定义proc_read, proc_write方法,同时需要定义create_proc和remove_proc。

dvfs方式:定义val_show, val_store方法和内部函数get_val, set_val。

驱动文件的内容,依据标准的linux的文件格式要求,然后按照设备运行的基本流程和逻辑实现运行过程即可,每一种设备的驱动具体内容不一致,但是需要按照格式编写对应的文件才能加载驱动,所以编写驱动本身和格式同样重要,此处暂不针对不同的设备类型驱动具体实现进行展开。

最后还需要增加驱动加载和卸载函数:init和exit,通常按照如下方式增加:

module_init(init_func);
module_exit(exit_func);

以上为驱动文件的主要内容,下述为驱动的文件的运行流程:

驱动运行的一般流程

  • 加载流程:分配设备号 => 分配结构图变量 => 初始化设备 => 在/sys/class目录下创建目录 => 在/dev和/sys/class/驱动名 目录下创建设备文件 => 在/sys/class/驱动名 目录下创建属性文件 =>创建/proc/驱动名 文件
  • 卸载流程:删除/proc/驱动名 文件 => 销毁设备类别和设备  => 删除字符设备  =>释放设备内存 => 释放设备号

Kconfig文件及Makefile文件的编写说明:

  • Kconfig文件内容:
config XXXXXXX_XXX_XX # 此处时可用的变量,在.config中置为y,即可以编译此模块。
    bool "提示字符串"  
    default n
    help 
      "解释此驱动的针对内容,及如何配置。"

说明:
1. 每个config菜单项都要有类型定义,bool:布尔类型, tristate三态:内建、模块、移除, string:字符串, hex:十六进制, integer:整型;bool类型的只能选中或不选中,tristate类型的菜单项多了编译成内核模块的选项,假如选择编译成内核模块,则会在.config中生成一个CONFIG_HELLO_MODULE=m的配置,假如选择内建,就是直接编译成内核影响,就会在.config中生成一个CONFIG_HELLO_MODULE=y的配置.
2. 依赖型定义depends on或requires,指此菜单的出现是否依赖于另一个定义。
3. 编写好Kconfig文件后,需要在此文件的上一级Kconfig中增加 source "xxx/kconfig"

  • Makefile的编写,一般按照如下格式:
obj -$(CONFIG_XXXXXXX_XXX_XX) += XXX.c xx.c #需要包含所有用的c文件。

MTK平台新增摄像头指南 -- 已更新android 7.0路径的更改。


增加驱动及配置到Kernel 层:

  • 增加驱动文件夹到如下目录:
mediatek\custom\common\kernel\imgsensor\
mediatek\custom\mt6582[mt8127]\kernel\imgsensor\
mediatek\custom\[project]\kernel\imgsensor\
//说明:
//优先级:[project]/mt6582/mt8127 /common
//建议增加时:yuv 放到 common ,raw 放到:mt6582/mt8127.
//驱动文件夹命名规则为:品牌+型号+ _ +yuv/raw
  • 增加可选摄像头到mediatek\custom\common\kernel\imgsensor\src\kd_sensorlist.h,修改内容如下:

a. 申明摄像头初始化函数, 注意此函数在摄像头驱动文件中实现,注意检查是否一致,如下增加gc0312摄像头为例。

UINT32 GC0312_YUV_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc);

b. 增加摄像头到 camera List(此处宏定义可在 ProjectConfig.mk 文件中找到并对应即可编译此摄像头)

#if defined(GC0312_YUV)
    {GC0312_SENSOR_ID, SENSOR_DRVNAME_GC0312_YUV, GC0312_YUV_SensorInit},
#endif
  • 配置摄像的检测的参数,修改 mediatek\custom\common\kernel\imgsensor\inc\kd_imgsensor.h增加sensor name 和sensor id的定义
#define GC0312_SENSOR_ID                        0xb310
#define SENSOR_DRVNAME_GC0312_YUV               "gc0312yuv"
  • 修改上电文件保证摄像头上电:mediatek\custom\[project]\kernel\camera\camera\kd_camera_hw.c
    根据实际情况调节上电电压和方式。


增加驱动及配置到HAL 层:

  • 增加驱动文件夹到目录:
mediatek\custom\common\hal\imgsensor\
mediatek\custom\mt6582[mt8127]\hal\imgsensor\
mediatek\custom\[project]\hal\imgsensor\
//优先级:[project] > mt6582/mt8127 > common
//建议增加时:yuv 放到 common ,raw 放到:mt6582/mt8127.
//驱动文件夹命名规则为:品牌+型号+ _ +yuv/raw
  • 增加可选摄像头到文件:mediatek\custom\common\hal\imgsensor\src\sensorlist.cpp
#if defined(GC0312_YUV)
    YUV_INFO(GC0312_SENSOR_ID, SENSOR_DRVNAME_GC0312_YUV, NULL),
#endif

注:在 kdSensorList 和 SensorList 里面添加驱动的时候要注意,Sensor 添加的位置要一样。否则驱动会跑乱,轻则 ISP 参数不对,重则 Sensor 无法启动。


到此添加设备到系统已经内容完毕,但编译测试之前需要对 ProjectConfig.mk 进行配置,

打开对应工程的 ProjectConfig.mk 文件,具体路径为:mediatek\config\[project]\ProjectConfig.mk
将对应的文件夹的名字拷贝到等号后面。

Kernel 部分:
CUSTOM_KERNEL_IMGSENSOR =
后置摄像头: CUSTOM_KERNEL_MAIN_IMGSENSOR =
前置摄像头: CUSTOM_KERNEL_SUB_IMGSENSOR =

HAL 部分:
CUSTOM_HAL_IMGSENSOR =
后置摄像头: CUSTOM_HAL_MAIN_IMGSENSOR =
前置摄像头: CUSTOM_HAL_SUB_IMGSENSOR =

注:摄像头的数量不超过 16 个,否则多余的不可识别。

关于编译:

增加或者修改内核部分,编译时:
./mk -o=TARGET_BUILD_VARIANT=user [project] n k bootimg

修改 HAL 层,编译时:
./mk -o=TARGET_BUILD_VARIANT=user [project] mm mediatek/platform/mt6582[mt8127]/hardware/mtkcam/

注,为保证编译有效,编译前需要删除如下文件夹的内容:
out\target\product\[project]\obj\CUSTGEN\custom\hal\imgsensor
out\target\product\[project]\obj\CUSTGEN\custom\kernel\imgsensor


android 7.0 路径的变化

# 增加了kernel和hal同步的kd_imgsensor.h
device/mediatek/common/kernel-headers/kd_imgsensor.h

# kernel 驱动文件位置的更新
kernel-3.18/drivers/misc/mediatek/imgsensor/

#kernel上电文件位置的更新
kernel-3.18/drivers/misc/mediatek/imgsensor/src/mt8163/camera_hw/

# hal 驱动文件的位置的更新
vendor/mediatek/proprietary/custom/mt8163/hal/imgsensor/

# hal层调整摄像头方向等参数文件的更新
vendor/mediatek/proprietary/custom/mt8163/hal/sendepfeature/

LCD协议及接口详述


接口与协议

LCM常用的按照物理接口分为:MCU/CPU接口,RGB接口,LVDS接口,MIPI DSI接口等,但是按照MIPI(Mobile Industry Processor Interface)联盟下的Display工作组提出协议标准来划分的话就分为DBI(Display Bus Interface),DPI(Display Pixel Interface) ,DSI(Display Serial Interface)三种,另外MIPI联盟还提出DCS(Display Command Set)标准来规范其显示命令设置。

协议做为数据和指令传输方式的规范,需要配合物理接口工作,下面将针对协议部分其对应物理接口进行分别叙述。

MIPI DBI协议和MCU/CPU接口

MIPI  DBI 协议可细分为MIPI DBI TypeA、MIPI DBI TypeB、MIPI DBI Type C这三种不同的模式,他规定了它的硬件接口方式,不同模式下的硬件接口以及数据的采样都有所不同。
详细解说及调试指导,后续会更新文章说明。

DBI协议对应的接口为MCU接口,MCU接口的LCD的Driver IC都带GRAM,Driver IC作为MCU的一片协处理器,接受MCU发过来的Command/Data,可以相对独立的工作。对于MCU接口的LCM(LCD Module),其内部的芯片就叫LCD驱动器。主要功能是对主机发过的数据/命令,进行变换,变成每个象素的RGB数据,使之在屏上显示出来,这个过程不需要点、行、帧时钟。

注:CPU/MCU接口常用在单片机等比较简单的显示需求的设备上,且由于其需要GRAM,在大尺寸的LCD显示上成本很高,因此很少采用。

MIPI DPI协议和RGB接口、LVDS接口

MIPI DPI协议的数据线和控制线分离,它采用直接写LCD的方式来控制输出显示,DPI对应了2种不同接口,包括RGB接口和LVDS接口。

详细解说及调试指导,后续会更新文章说明。

RGB接口的LCD的显存是由系统内存充当,通过VSYNC,HSYNC,DOTCLK,CS,RESET进行控制和数据同步,然后通过并行的方式传输RGB数据。在运行过程只需显存组织好数据。启动显示后,LCD-DMA会自动把显存中的数据通过RGB接口送到LCM。而LVDS接口主要是将RGB TTL信号按照SPWG/JEIDA格式转换成LVDS信号进行传输,LVDS接口只能传输数据和控制信号,不能传输指令

注:TTL是用高电平表示1,低电平表示0的模式,LVDS是正负两个对应波形,用两个波形的差值来表示当前是1还是0。

MIPI DSI协议和MIPI 接口

MIPI DSI 协议定义了一个位于处理器和显示模组之间的高速串行接口,分为应用层、协议层、通道管理层、物理层四个层,它是一种串行传输方式,包括数据、指令、其他信息。

详细解说及调试指导,后续会更新文章说明。

MIPI接口有一组时钟线和1~4组数据线组成,它可以运行在低速和高速2个模式,一般低速用于指令传输,高速用于数据传输。其中只有数据线0是双向的(低速模式双向,高速模式也只能是单向),其他的都只能是单向(高速模式单向)。

其数据特点如下:

  • 在高速模式下,发送端同时驱动该通道仅有的两根互连线,输出低摆幅差分信号。
  • 低速模式下,发送端分别驱动互连线,各自输出单端信号,但摆幅相对较大。

其他接口类型:

待更新