基于全志a31s的camrea驱动调试(gc2145型号)

运行命令make ARCH = menuconfig进入device drivers--->Multimedia support--->配置如下

把GC2145的驱动文件gc2145.c放在lichee\linux-3.3\drivers\media\video\sunxi-vfe\device\下并在其目录下的Makefike文件添加

obj-$(CONFIG_CSI_VFE) += cci.o

......

obj-m += gc2145.o

修改lichee\tools\pack\chips\sun6i\configs\android\mars-ml220\sys_config.fex文件中内容如下

[vip1_para]

vip_used = 1

vip_dev0_mname = "gc2145"

vip_dev0_twi_id = 0

vip_dev0_twi_addr = 0x78

vip_dev0_isp_used = 0

vip_dev0_fmt = 0

vip_dev0_stby_mode = 0

vip_dev0_vflip = 0

vip_dev0_hflip = 0

vip_dev0_iovdd = "axp22_dldo2"

vip_dev0_iovdd_vol = 2800000

vip_dev0_avdd = "axp22_ldoio0"

vip_dev0_avdd_vol = 2800000

vip_dev0_dvdd = "axp22_eldo2"

vip_dev0_dvdd_vol = 1800000

vip_dev0_afvdd = "axp22_dldo2"

vip_dev0_afvdd_vol = 2800000

vip_dev0_power_en =

vip_dev0_reset = port:PH26<1><default><default><0>

vip_dev0_pwdn = port:PH27<1><default><default><1>

vip_dev0_flash_en =

vip_dev0_flash_mode =

vip_dev0_af_pwdn =

vip_dev0_act_used = 0

vip_dev0_act_name = "ad5820_act"

vip_dev0_act_slave = 0x18

[camera_list_para]

camera_list_para_used = 1

......

gc2145 = 1

修改android\device\softwinner\mars-ml220\init.sun6i.rc文件中如下内容

#csi module

insmod /system/vendor/modules/videobuf-core.ko

insmod /system/vendor/modules/videobuf-dma-contig.ko

#insmod /system/vendor/modules/uvcvideo.ko

insmod /system/vendor/modules/cam_detect.ko

#insmod /system/vendor/modules/actuator.ko

#insmod /system/vendor/modules/ad5820_act.ko

insmod /system/vendor/modules/cci.ko

insmod /system/vendor/modules/vfe_os.ko

insmod /system/vendor/modules/vfe_subdev.ko

#insmod /system/vendor/modules/ov5647.ko

insmod /system/vendor/modules/gc2145.ko #注意:gc2145.ko一定要在vfe_v4l2.ko前注册,不然会提示连接不到相机

insmod /system/vendor/modules/vfe_v4l2.ko

修改android\device\softwinner\mars-ml220\configs文件中内容如下

number_of_camera = 1

camera_id = 0

camera_facing = 0

use_builtin_isp = 0

camera_orientation = 0

device_id = 0

在lichee\linux-3.3\drivers\media\video\sunxi-vfe\config.c文件中添加

struct camera_info camera_info_list[] =

{

{"gc2145",0,0,0,0},

{"gc2235",0,0,1,1},

{"ov5647",0,0,1,1},

{"gc2035",0,0,0,0},

{"gc0308",0,0,0,0},

{"gc0307",0,0,0,0},

{"hi257",0,0,0,0},

};

在lichee\linux-3.3\drivers\media\video\sunxi-vfe\camera_detector\camera_list.c文件中添加

#define __GC2145__

static void camera_pwr_on_gc2145(__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);

msleep(1);

clk_enable(camera_info->module_clk);

msleep(10);

camera_gpio_write(camera_info->pwr_pin, camera_list[list_index].CSI_PWR_ON);

msleep(10);

if(camera_info->dvdd)

{

if(camera_info->dvdd_vol > 0)

{

regulator_set_voltage(camera_info->dvdd,camera_info->dvdd_vol,camera_info->dvdd_vol);

}

else

{

list_print("dvdd_vol is NULL!! \n");

}

regulator_enable(camera_info->dvdd);

msleep(10);

}

if(camera_info->avdd)

{

if(camera_info->dvdd_vol > 0)

{

regulator_set_voltage(camera_info->avdd,camera_info->avdd_vol,camera_info->avdd_vol);

}

else

{

list_print("dvdd_vol is NULL!! \n");

}

regulator_enable(camera_info->avdd);

msleep(10);

}

if(camera_info->iovdd)

{

if(camera_info->dvdd_vol > 0)

{

regulator_set_voltage(camera_info->iovdd,camera_info->iovdd_vol,camera_info->iovdd_vol);

}

else

{

list_print("dvdd_vol is NULL!! \n");

}

regulator_enable(camera_info->iovdd);

msleep(10);

}

//standby off io

camera_gpio_write(camera_info->stby_pin, camera_list[list_index].CSI_STBY_OFF);

msleep(10);

camera_gpio_write(camera_info->reset_pin, camera_list[list_index].CSI_RST_OFF);

msleep(10);

camera_gpio_write(camera_info->reset_pin, camera_list[list_index].CSI_RST_ON);

msleep(10);

camera_gpio_write(camera_info->reset_pin, camera_list[list_index].CSI_RST_OFF);

msleep(10);

}

static void camera_pwr_off_gc2145(__u32 list_index, __camera_info_t *camera_info)

{

camera_gpio_write(camera_info->stby_pin, camera_list[list_index].CSI_STBY_ON);

msleep(10);

//reset on io

camera_gpio_write(camera_info->reset_pin, camera_list[list_index].CSI_RST_ON);

msleep(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);

msleep(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_gc2145(__u32 list_index, struct i2c_adapter *i2c_adap)

{

char reg_num[1], value[1];

__s32 ret = 0;

__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 gc2145 ... \n");

reg_num[0] = 0xf0;

ret = camera_i2c_read(i2c_adap, reg_num, value, i2c_addr, addr_step, data_step);

if (ret < 0) {

return ret;

}

if(value[0] !=0x21)

return -ENODEV;

reg_num[0] = 0xf1;

ret = camera_i2c_read(i2c_adap, reg_num, value, i2c_addr, addr_step, data_step);

if (ret < 0) {

return ret;

}

if(value[0] !=0x55)

return -ENODEV;

list_print("detect gc2145 success!!\n");

return 0;

}

__camera_list_t camera_list[MAX_CAMERA_LIST_ITEM] = {

... ...

CAMERA_LIST_ITEM_INIT(gc2145, 1, 1, 0x78, 1, 0, 0, 1, 1, 0),

};

修改lichee\linux-3.3\drivers\media\video\sunxi-vfe\camera_detector\camera_list.h文件中内容如下

#define MAX_CAMERA_LIST_ITEM 26    //在原来的基础上加一

时间: 2024-10-19 21:11:15

基于全志a31s的camrea驱动调试(gc2145型号)的相关文章

设备驱动调试和移植的一般方法

做linux底层软件工作也有两年了,算上研究生时期对底层软件的研究,加起来也快四年了.慢慢地发现有必要总结一些一般性的方法了.因为一般性的方法有宏观上的指导意义,以后调试和移植驱动时,经常性地回味这些一般性的方法可以防止自己犯同样的错误,进而少走弯路,以最高的效率完成工作. 当谈到底层软件,我们一般都会想到bootloader.BSP.device driver.linux kernel等等.这篇文章将会着重介绍linux device driver调试的一般性方法.另外,关于设备驱动移植的方法

android 电容屏(二):驱动调试之基本概念篇

关键词:android  电容屏 tp 工作队列 中断 多点触摸协议平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台:S5PV310(samsung exynos 4210)  作者:xubin341719(欢迎转载,请注明作者) 参考网站:http://edsionte.com/techblog/archives/1582这部分参考别人的多一点 android 电容屏(一):电容屏基本原理篇 android 电容屏(二):驱动调试之基本概念篇

Windows7驱动调试小Tips

v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);}/* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colb

Linux驱动设计—— 驱动调试技术

参考博客与书籍: <Linux设备驱动开发详解> <Linux设备驱动程序> http://blog.chinaunix.net/uid-24219701-id-2884942.html 对于驱动程序设计来说,核心问题之一就是如何完成调试.当前常用的驱动调试技术可分为: 1. 打印调试 printk 重定向控制台消息 消息记录 开启和关闭消息速度限制 打印设备编号 2. 调试器调试 gdb kdb内核调试器 kgdb补丁 3. 查询调试 使用/proc文件系统 ioctl方法 4.

linux设备驱动第四篇:驱动调试方法

linux设备驱动第四篇:驱动调试方法linux设备驱动第四篇:驱动调试方法linux设备驱动第四篇:驱动调试方法linux设备驱动第四篇:驱动调试方法linux设备驱动第四篇:驱动调试方法linux设备驱动第四篇:驱动调试方法linux设备驱动第四篇:驱动调试方法linux设备驱动第四篇:驱动调试方法linux设备驱动第四篇:驱动调试方法 http://v.17173.com/playlist_18716517.htmlhttp://v.17173.com/playlist_18716521.

基于51单片机的12864驱动

/**************dis_12864.h***************/ #include <reg52.h> #ifndef __DIS_12864_H__ #define __DIS_12864_H__ #define uchar unsigned char #define uint  unsigned int /*12864端口定义*/ #define LCD_data  P0             //数据口 sbit LCD_RS  =  P1^0;          

展讯7731平台驱动调试总结-驱动配置部分

转载至:http://blog.csdn.net/bmw7bmw7/article/details/46126223 展讯7731平台驱动调试总结-驱动配置部分 1. 关键配置文件路径 1). 项目板级配置:idh.code/device/sprd/scx35_sp7731geaplus_pad_qhd/文件夹内各文件 ⑴.BoardConfig.mk---板级宏配置文件.包括设置该板(项目)所使用的uboot/kerenl全局配置宏文件,摄像头接口类型.分辨率等参数,所使用的重力加速度.光线传

linux驱动调试技术

 对于驱动程序设计来说,核心问题之一就是如何完成调试.当前常用的驱动调试技术可分为: ? 打印调试(printk) ? 调试器调试(kgdb) ? 查询调试 1.合理使用printk #ifdef PDEBUG #define PLOG(fmt,args...) printk(KERN_DEBUG "scull:"fmt,##args) #else #define PLOG(fmt,args...) /*do nothing */ #endif Makefile作如下修改: DEB

linux驱动调试--段错误之oops信息分析

linux驱动调试--段错误之oops信息分析 http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=29401328&id=4923447 1. 分析coredump打印信息 2. 确定发生错误的函数 看发生错误的地方的函数和pc PC is at segment_test_open+0x14/0x1c [segdrv] 看pc值: pc : [<7f000014>]    lr : [<800d958c>