驱动采用模块加载的方式
1) 模块加载的文件在android中配置(修改点)
\A20-T2\android\device\softwinner\wing-n71j\init.sun7i.rc

# csi module    insmod /system/vendor/modules/videobuf-core.ko    insmod /system/vendor/modules/videobuf-dma-contig.ko    insmod /system/vendor/modules/camera.ko    # insmod_modules camera    insmod /system/vendor/modules/nt99141.ko //需要修改的设备驱动    insmod /system/vendor/modules/sunxi_csi0.ko //csi驱动

2) 修改android使用权限,video1 值可以变化,可能是video0 (一般不用修改)
\A20-T2\android\device\softwinner wing-n71j\ueventd.sun7i.rc

3) 修改camera.cfg配置文件,设置摄像头的属性 (一般不用修改)
板子上的地址/system/etc/camera.cfg
系统地址:device/softwinner/wing-k70/configs/camera.cfg

;——————————————————————————-
; driver device name
;——————————————————————————-
camera_device = /dev/video0
摄像头挂载的设备节点
4) 修改media_profiles.xml配置录像参数 板子上的地址/system/etc/media_profiles.xml
系统地址:device/softwinner/wing-k70/configs/media_profiles.xml (一般不用修改)
5) 参数设置完毕,剩下的需要修改sys_config.fex (需要修改)
Linux kernel 给android的配置,使用哪个摄像头。
Z:\A20-T2\lichee\tools\pack\chips\sun7i\configs\android\wing-n71j\sys_config.fex
【配置如下】

;--------------------------------------------------------------------------------;csi gpio configuration;csi_if: 0:hv_8bit 1:hv_16bit 2:hv_24bit 3:bt656 1ch 4:bt656 2ch 5:bt656 4ch;csi_mode: 0:sample one csi to one buffer 1:sample two csi to one buffer;csi_dev_qty: The quantity of devices linked to csi interface;csi_vflip: flip in vertical direction 0:disable 1:enable;csi_hflip: flip in horizontal direction 0:disable 1:enable;csi_stby_mode: 0:not shut down power at standby 1:shut down power at standby;csi_iovdd: camera module io power , pmu power supply;csi_avdd:  camera module analog power , pmu power supply;csi_dvdd:  camera module core power , pmu power supply;pmu_ldo3:  fill "axp20_pll";pmu_ldo4:  fill "axp20_hdmi";fill "" when not using any pmu power supply;csi_flash_pol: the active polority of the flash light IO 0:low active 1:high active;--------------------------------------------------------------------------------[camera_list_para]camera_list_para_used   = 1ov7670                  = 0nt99141                 = 1  //选择某个摄像头gc0308                  = 0gt2005                  = 0hi704                   = 0sp0838                  = 0mt9m112                 = 0mt9m113                 = 0gc2035                  = 0ov2655                  = 0hi253                   = 0gc0307                  = 0mt9d112                 = 0ov5640                  = 0gc2015                  = 0ov2643                  = 0gc0329                  = 0gc0309                  = 0tvp5150                 = 0s5k4ec                  = 0ov5650_mv9335           = 0siv121d                 = 0;--------------------------------------------------------------------------------;csi gpio configuration;csi_if: 0:hv_8bit 1:hv_16bit 2:hv_24bit 3:bt656 1ch 4:bt656 2ch 5:bt656 4ch;csi_mode: 0:sample one csi to one buffer 1:sample two csi to one buffer;csi_dev_qty: The quantity of devices linked to csi interface;csi_vflip: flip in vertical direction 0:disable 1:enable;csi_hflip: flip in horizontal direction 0:disable 1:enable;csi_stby_mode: 0:not shut down power at standby 1:shut down power at standby;csi_iovdd: camera module io power , pmu power supply;csi_avdd:  camera module analog power , pmu power supply;csi_dvdd:  camera module core power , pmu power supply;pmu_ldo3:  fill "axp20_pll";pmu_ldo4:  fill "axp20_hdmi";fill "" when not using any pmu power supply;csi_flash_pol: the active polority of the flash light IO 0:low active 1:high active;--------------------------------------------------------------------------------[csi0_para]      // CSI0 接口使用摄像头的配置csi_used            = 1csi_dev_qty         = 2  //数量2个csi_stby_mode       = 0csi_mname           = "nt99141"csi_twi_id          = 1csi_twi_addr        = 0x54  // I2C地址csi_if              = 0csi_vflip           = 0csi_hflip           = 0csi_iovdd           = "axp20_hdmi"csi_avdd            = ""csi_dvdd            = ""csi_vol_iovdd       = 3300csi_vol_dvdd        = csi_vol_avdd        = csi_flash_pol       = 0csi_mname_b         =   // 第二个摄像头的配置,若不存在,放空csi_twi_id_b        = csi_twi_addr_b      = csi_if_b            = csi_vflip_b         = csi_hflip_b         = csi_iovdd_b         = csi_avdd_b          = csi_dvdd_b          = csi_vol_iovdd_b     =csi_vol_avdd_b      = csi_vol_dvdd_b      = csi_flash_pol_b     = // 以下为摄像头的硬件GPIO口配置,需要HW提供csi_pck             = port:PE00<3><default><default><default>csi_ck              = port:PE01<3><default><default><default>csi_hsync           = port:PE02<3><default><default><default>csi_vsync           = port:PE03<3><default><default><default>csi_d0              = port:PE04<3><default><default><default>csi_d1              = port:PE05<3><default><default><default>csi_d2              = port:PE06<3><default><default><default>csi_d3              = port:PE07<3><default><default><default>csi_d4              = port:PE08<3><default><default><default>csi_d5              = port:PE09<3><default><default><default>csi_d6              = port:PE10<3><default><default><default>csi_d7              = port:PE11<3><default><default><default>csi_reset           = port:PH14<1><default><default><0>csi_power_en        = port:PH16<1><default><default><0>csi_stby            = port:PH19<1><default><default><0>csi_flash           =csi_af_en           =csi_reset_b         = port:PH13<1><default><default><0>csi_power_en_b      = port:PH16<1><default><default><0>csi_stby_b          = port:PH18<1><default><default><0>csi_flash_b         =csi_af_en_b         =[csi1_para]   // CSI1 接口使用摄像头的配置csi_used            = 0csi_dev_qty         = 1csi_stby_mode       = 0csi_mname           = "gc0308"csi_if              = 0csi_iovdd           = "axp20_pll"csi_avdd            = ""csi_dvdd            = ""csi_vol_iovdd       = 2800csi_vol_dvdd        = csi_vol_avdd        = csi_vflip           = 0csi_hflip           = 0csi_flash_pol       = 0csi_facing          = 1csi_twi_id          = 1csi_twi_addr        = 0x42csi_pck             = port:PG00<3><default><default><default>csi_ck              = port:PG01<3><default><default><default>csi_hsync           = port:PG02<3><default><default><default>csi_vsync           = port:PG03<3><default><default><default>csi_d0              = port:PG04<3><default><default><default>csi_d1              = port:PG05<3><default><default><default>csi_d2              = port:PG06<3><default><default><default>csi_d3              = port:PG07<3><default><default><default>csi_d4              = port:PG08<3><default><default><default>csi_d5              = port:PG09<3><default><default><default>csi_d6              = port:PG10<3><default><default><default>csi_d7              = port:PG11<3><default><default><default>csi_reset           = port:PH13<1><default><default><0>csi_power_en        = port:PH16<1><default><default><0>csi_stby            = port:PH19<1><default><default><0>

6) 增加驱动 (需要修改)以上分几个步骤说明
Z:\A20-T2\lichee\linux-3.4\drivers\media\video\sunxi_csi\device
init.sun7i.rc文件中增加的驱动如下图所示,与摄像头相关的驱动有3个
camera.ko sun7i_csi0.ko 和nt99141,ko,分别对应下面目录中的驱动

lichee\linux-3.4\drivers\media\video\sunxi_csi
的目录结构如下:

camera_detector:对摄像头的检测
csi0 csi1:
COMS Sensor Interface:CSI接口通常从COMS Sensor,Video Encoder和其它视频输出设备收集数据。Camera Serial Interface,相机串行接口,MIPI接口之一。
device:摄像头设备驱动
Kconfig:config文件,用于选择配置摄像头

第一步:修改camera_detector中camera_list.c
增加添加的摄像头,例如:

#define __NT99141__static void camera_pwr_on_nt99141(__u32 list_index, __camera_info_t *camera_info){            camera_gpio_set_status(camera_info->stby_pin, 1);        camera_gpio_set_status(camera_info->reset_pin, 1);        //power supply        camera_gpio_write(camera_info->stby_pin, camera_list[list_index].CSI_STBY_ON);        camera_gpio_write(camera_info->reset_pin, camera_list[list_index].CSI_RST_ON);        mdelay(1);        clk_enable(camera_info->module_clk);        mdelay(10);        camera_gpio_write(camera_info->pwr_pin, camera_list[list_index].CSI_PWR_ON);        mdelay(10);        if(camera_info->dvdd)         {        regulator_enable(camera_info->dvdd);        mdelay(10);        }        if(camera_info->avdd)        {        regulator_enable(camera_info->avdd);        mdelay(10);        }        if(camera_info->iovdd)         {        regulator_enable(camera_info->iovdd);        mdelay(10);        }        //standby off io        camera_gpio_write(camera_info->stby_pin, camera_list[list_index].CSI_STBY_OFF);        mdelay(10);        camera_gpio_write(camera_info->reset_pin, camera_list[list_index].CSI_RST_OFF);        mdelay(10);        camera_gpio_write(camera_info->reset_pin, camera_list[list_index].CSI_RST_ON);        mdelay(10);        camera_gpio_write(camera_info->reset_pin, camera_list[list_index].CSI_RST_OFF);        mdelay(10);    }static void camera_pwr_off_nt99141(__u32 list_index, __camera_info_t *camera_info){        camera_gpio_write(camera_info->stby_pin, camera_list[list_index].CSI_STBY_ON);    mdelay(10);    //reset on io    camera_gpio_write(camera_info->reset_pin, camera_list[list_index].CSI_RST_ON);    mdelay(10);    //inactive mclk after power off    //power supply off    if(camera_info->iovdd) {        regulator_disable(camera_info->iovdd);    }    if(camera_info->avdd) {        regulator_disable(camera_info->avdd);    }    if(camera_info->dvdd) {        regulator_disable(camera_info->dvdd);    }    camera_gpio_write(camera_info->pwr_pin, camera_list[list_index].CSI_PWR_OFF);    mdelay(10);    //standby of io   clk_disable(camera_info->module_clk);    //set the io to hi-z    camera_gpio_set_status(camera_info->reset_pin, 0);//set the gpio to input   // camera_gpio_set_status(camera_info->stby_pin, 0);//set the gpio to input}static __s32 camera_detect_nt99141(__u32 list_index, struct i2c_adapter *i2c_adap){    int ret;    struct regval_list regs;    __u32 i2c_addr  = camera_list[list_index].i2c_addr;    __u32 addr_step = camera_list[list_index].REG_ADDR_STEP;    __u32 data_step = camera_list[list_index].REG_DATA_STEP;    list_print("try to detect nt99141 ...addr_step = %d data_step = %d\n", addr_step, data_step);    return 0;    regs.reg_num[0] = 0x30;    regs.reg_num[1] = 0x21;    ret = camera_i2c_read(i2c_adap, regs.reg_num, regs.value, i2c_addr, addr_step, data_step);    if (ret < 0) {        list_print("gaoliang no read \n");        return ret;    }        list_print("gaoliang read value = 0x%d \n", regs.value[0]);    if (regs.value[0] != 0x56) {        return -ENODEV;    }    list_print("detect nt99141 success!!\n");    return 0;}__camera_list_t camera_list[MAX_CAMERA_LIST_ITEM]中增加nt99141    CAMERA_LIST_ITEM_INIT(nt99141,       2, 1, 0x54, 1, 0, 0, 1, 1, 0),

第二步:修改CSI驱动,目前有两路CSI,具体使用哪路在配置文件中设置
\lichee\tools\pack\chips\sun7i\configs\android\wing-n71j\sys_config.fex
一般驱动不做修改
第三步:在device文件夹中增加你所添加的驱动。例如添加nt99141
先修改Makefile增加你所添加的驱动
obj-$(CONFIG_CSI_NT99141) += nt99141.o
再增加驱动原始文件
第四步:修改Kconfig

config CSI_NT99141    tristate "OmniVision NT99141 5M sensor support"    default m    depends on I2C && VIDEO_V4L2    select  CSI_DEV_SEL    ---help---      This is a Video4Linux2 sensor-level driver for the OmniVision      NT99141 5M camera.

剩下就是测试,调试驱动文件了。

更多相关文章

  1. 【Android笔记】Android统计文件夹大小,删除文件夹下的所有文件方
  2. Android设备定制为永不锁屏
  3. [安卓]Android(安卓)Developer Tools(Eclipse)+Android(安卓)Stu
  4. Android(安卓)AIDL基本步骤
  5. cocos2dx android
  6. Android输入框限制字符长度,字母自动大写
  7. Android(安卓)多媒体扫描过程
  8. Android中隐藏标题栏和状态栏(电源,信号,时间等信息)
  9. 〖Android〗我的ADT Eclipse定制

随机推荐

  1. 内嵌Xilinx FPGA,由VisualApllet编程实现
  2. 如何构建阿里小蜜算法模型的迭代闭环?
  3. 函数的嵌套调用和链式访问
  4. URL百分比编码与符号字符
  5. C语言函数功能的强大和入坑体会
  6. 迪芝伦(Digilent)推出全新开发板PYNQ-Z1,支
  7. RPA逆势火了
  8. 关于Xilinx Zynq UltraScale+ MPSoC的电
  9. 同态加密技术及其在机器学习中的应用详解
  10. 看Mellanox公司如何降低服务器CPU负载!