No.02 (byte b3 = b1 + b2 ; ) ?

本文详细解析了Java中的基本数据类型,包括整数型、浮点型、字符型及布尔型,并通过实例演示了不同数据类型之间的运算规则及其可能产生的问题。

基本数据类型

先看如下一段代码:

class Test {
public static void main (String [] args){
byte b1 , b2 , b3;
b1 = 3 ;
b2 = 4 ;
b3 = b1 + b2 ;
}
}

代码编译后会报错:“错误: 不兼容的类型: 从int转换到byte可能会有损失”

那么为什么会报错呢?

java 中的基本数据类型共有四类八种分别是
*整数型
byte 1字节 -128~+127;
short 2字节 -2^15~2^15-1;
int 4字节 -2^31~2^31-1;
long 8字节 -2^63~2^63-1
*浮点型
float 占四个字节 -3.403E38~3.403E38 单精度
double 占八个字节-1.798E308~1.798E308 双精度
* 字符型
char 占两个字节 0~65535 (ASCII表)
* 布尔型
boolean
boolean理论上是占八分之一个字节,因为一个开关就可以决定是true和false了,但是java中boolean类型没有明确指定他的大小
java 默认的整型运算时int型, b3 = b1 + b2 ; b1+b2的运算结果默认成int型 ,而b3却是byte型,将int型值赋予byte将导致精度损失,反小的数据类型赋值给大的却不会
class Test {
public static void main (String [] args){
byte b1 , b2 ;
b1 = 3 ;
b2 = 4 ;
int b3 = b1 + b2 ;
}
}

对于第一段代码,如果强制转换虽然不会报错,但是会产生一些意想不到的结果;

class Test {
public static void main (String [] args){
byte b1 , b2 , b3;
b1 = 113 ;
b2 = 124 ;
b3 =(byte) (b1 + b2) ;
}
}

这里的结果是-19,

java 中整型计算都是以二进制进行的,是在对应的数的补码之间相互计算的
113 的二进制表示方法是 01110001 ,首位的0代表是正数,
对于正数,原码反码补码都是自己本身
124的 二进制表示方法是 01111100
对两个数的补码相加得到11101101,首位的1表示负数,负数的补码求取方式是首位不变,其后逐位取反得到反码,反码末位加1即得补码,11101101经过还原后得到原码10010011,即-19。

/* Result Sets Interface */ #ifndef SQL_CRSR # define SQL_CRSR struct sql_cursor { unsigned int curocn; void *ptr1; void *ptr2; unsigned int magic; }; typedef struct sql_cursor sql_cursor; typedef struct sql_cursor SQL_CURSOR; #endif /* SQL_CRSR */ /* Thread Safety */ typedef void * sql_context; typedef void * SQL_CONTEXT; /* Object support */ struct sqltvn { unsigned char *tvnvsn; unsigned short tvnvsnl; unsigned char *tvnnm; unsigned short tvnnml; unsigned char *tvnsnm; unsigned short tvnsnml; }; typedef struct sqltvn sqltvn; struct sqladts { unsigned int adtvsn; unsigned short adtmode; unsigned short adtnum; sqltvn adttvn[1]; }; typedef struct sqladts sqladts; static struct sqladts sqladt = { 1,1,0, }; /* Binding to PL/SQL Records */ struct sqltdss { unsigned int tdsvsn; unsigned short tdsnum; unsigned char *tdsval[1]; }; typedef struct sqltdss sqltdss; static struct sqltdss sqltds = { 1, 0, }; /* File name & Package Name */ struct sqlcxp { unsigned short fillen; char filnam[16]; }; static struct sqlcxp sqlfpn = { 15, "store_ngskip.pc" }; static unsigned int sqlctx = 2697803; static struct sqlexd { unsigned long sqlvsn; unsigned int arrsiz; unsigned int iters; unsigned int offset; unsigned short selerr; unsigned short sqlety; unsigned int occurs; short *cud; unsigned char *sqlest; char *stmt; sqladts *sqladtp; sqltdss *sqltdsp; unsigned char **sqphsv; unsigned long *sqphsl; int *sqphss; short **sqpind; int *sqpins; unsigned long *sqparm; unsigned long **sqparc; unsigned short *sqpadto; unsigned short *sqptdso; unsigned int sqlcmax; unsigned int sqlcmin; unsigned int sqlcincr; unsigned int sqlctimeout; unsigned int sqlcnowait; int sqfoff; unsigned int sqcmod; unsigned int sqfmod; unsigned int sqlpfmem; unsigned char *sqhstv[12]; unsigned long sqhstl[12]; int sqhsts[12]; short *sqindv[12]; int sqinds[12]; unsigned long sqharm[12]; unsigned long *sqharc[12]; unsigned short sqadto[12]; unsigned short sqtdso[12]; } sqlstm = {13,12}; /* SQLLIB Prototypes */ extern sqlcxt (/*_ void **, unsigned int *, struct sqlexd *, struct sqlcxp * _*/); extern sqlcx2t(/*_ void **, unsigned int *, struct sqlexd *, struct sqlcxp * _*/); extern sqlbuft(/*_ void **, char * _*/); extern sqlgs2t(/*_ void **, char * _*/); extern sqlorat(/*_ void **, unsigned int *, void * _*/); /* Forms Interface */ static int IAPSUCC = 0; static int IAPFAIL = 1403; static int IAPFTL = 535; extern void sqliem(/*_ unsigned char *, signed int * _*/); typedef struct { unsigned short len; unsigned char arr[1]; } VARCHAR; typedef struct { unsigned short len; unsigned char arr[1]; } varchar; /* CUD (Compilation Unit Data) Array */ static short sqlcud0[] = {13,4130,1,0,0, 5,0,0,0,0,0,27,60,0,0,4,4,0,1,0,1,97,0,0,1,97,0,0,1,97,0,0,1,10,0,0, 36,0,0,2,0,0,32,64,0,0,0,0,0,1,0, 51,0,0,3,0,0,32,80,0,0,0,0,0,1,0, 66,0,0,4,0,0,31,115,0,0,0,0,0,1,0, 81,0,0,5,71,0,4,120,0,0,1,0,0,1,0,2,97,0,0, 100,0,0,6,174,0,3,159,0,0,7,7,0,1,0,1,97,0,0,1,97,0,0,1,97,0,0,1,97,0,0,1,97,0, 0,1,97,0,0,1,0,0,0, 143,0,0,7,143,0,3,189,0,0,4,4,0,1,0,1,97,0,0,1,97,0,0,1,97,0,0,1,0,0,0, 174,0,0,8,0,0,29,229,0,0,0,0,0,1,0, 189,0,0,9,0,0,31,232,0,0,0,0,0,1,0, 204,0,0,10,0,0,31,258,0,0,0,0,0,1,0, 219,0,0,11,229,0,3,322,0,0,12,12,0,1,0,1,97,0,0,1,3,0,0,1,97,0,0,1,97,0,0,1,97, 0,0,1,97,0,0,1,97,0,0,1,3,0,0,1,97,0,0,1,97,0,0,1,97,0,0,1,0,0,0, }; /****************************************************************************** 受発注連携クライアント DB処理 mod:2018/5/21 SQLエラー時にabortするよう修正 mod:2019/10/7 発注データ内容不正時の処理追加 ******************************************************************************/ #include <sys/types.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> /*** add 2019/10/7 start ***/ #include <errno.h> /*** add 2019/10/7 end ***/ #include <sqlda.h> #include <sqlcpr.h> #include "logging.h" #include "bj_onl_trn_client.h" #include "store.h" /*** add 2019/10/7 start ***/ #include "config.h" /*** add 2019/10/7 end ***/ /* procコマンドでエラーが表示されるため _DEBUG_のときのみインクルードする */ #ifdef _DEBUG_ #include "trace.h" #else #define _TRACE_(level, body) #endif /****************************************************************************** ホスト変数 ******************************************************************************/ char dbname[DB_NAME_LEN+1]; char username[DB_USERNAME_LEN+1]; char password[DB_PASSWORD_LEN+1]; char process_name[LEN_PG_ID+1]; struct odr_trn_head trn_head; struct odr_trn_mei trn_mei; /****************************************************************************** sqlca ******************************************************************************/ #include <sqlca.h> /****************************************************************************** 初期化 返り値 0 : OK -1 : エラー ******************************************************************************/ int store_initialize() { _TRACE_(10, ("username [%s] password [%s] dbname [%s]" , username, password, dbname)); /* データベースへの接続 */ /* EXEC SQL CONNECT :username IDENTIFIED BY :password USING :dbname; */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 13; sqlstm.arrsiz = 4; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.iters = (unsigned int )10; sqlstm.offset = (unsigned int )5; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlstm.sqhstv[0] = (unsigned char *)username; sqlstm.sqhstl[0] = (unsigned long )21; sqlstm.sqhsts[0] = ( int )21; sqlstm.sqindv[0] = ( short *)0; sqlstm.sqinds[0] = ( int )0; sqlstm.sqharm[0] = (unsigned long )0; sqlstm.sqadto[0] = (unsigned short )0; sqlstm.sqtdso[0] = (unsigned short )0; sqlstm.sqhstv[1] = (unsigned char *)password; sqlstm.sqhstl[1] = (unsigned long )41; sqlstm.sqhsts[1] = ( int )41; sqlstm.sqindv[1] = ( short *)0; sqlstm.sqinds[1] = ( int )0; sqlstm.sqharm[1] = (unsigned long )0; sqlstm.sqadto[1] = (unsigned short )0; sqlstm.sqtdso[1] = (unsigned short )0; sqlstm.sqhstv[2] = (unsigned char *)dbname; sqlstm.sqhstl[2] = (unsigned long )21; sqlstm.sqhsts[2] = ( int )21; sqlstm.sqindv[2] = ( short *)0; sqlstm.sqinds[2] = ( int )0; sqlstm.sqharm[2] = (unsigned long )0; sqlstm.sqadto[2] = (unsigned short )0; sqlstm.sqtdso[2] = (unsigned short )0; sqlstm.sqphsv = sqlstm.sqhstv; sqlstm.sqphsl = sqlstm.sqhstl; sqlstm.sqphss = sqlstm.sqhsts; sqlstm.sqpind = sqlstm.sqindv; sqlstm.sqpins = sqlstm.sqinds; sqlstm.sqparm = sqlstm.sqharm; sqlstm.sqparc = sqlstm.sqharc; sqlstm.sqpadto = sqlstm.sqadto; sqlstm.sqptdso = sqlstm.sqtdso; sqlstm.sqlcmax = (unsigned int )100; sqlstm.sqlcmin = (unsigned int )2; sqlstm.sqlcincr = (unsigned int )1; sqlstm.sqlctimeout = (unsigned int )0; sqlstm.sqlcnowait = (unsigned int )0; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } _TRACE_(0, ("sqlcode : %d", sqlca.sqlcode)); if(sqlca.sqlcode < 0) { log_printf(LOG_ERROR, "Database connect error %s%", sqlca.sqlerrm.sqlerrmc); /* EXEC SQL ROLLBACK RELEASE; */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 13; sqlstm.arrsiz = 4; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )36; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } return -1; } return 0; } /****************************************************************************** 終了 返り値 0 : OK ******************************************************************************/ int store_terminate() { _TRACE_(10, ("")); /* データベースからの切断 */ /* EXEC SQL ROLLBACK WORK RELEASE; */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 13; sqlstm.arrsiz = 4; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )51; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } return 0; } /****************************************************************************** トランザクションの開始 返り値 0 : OK ******************************************************************************/ int store_begin(char *trn_file_id) { _TRACE_(10, ("")); log_printf(LOG_INFO, "START TRN_FILE_ID=%s", trn_file_id); /* 発注キュー及び発注トランヘッダ用ホスト変数の初期化 */ memset(&trn_head, 0, sizeof(trn_head)); /* トランファイルIDをホスト変数へ格納 */ strncpy(trn_head.trn_file_id, trn_file_id, LEN_TRN_FILE_ID); return 0; } /*** add 2019/10/7 start ***/ /****************************************************************************** 発注データINSERTエラー時の処理 ******************************************************************************/ int store_ins_error(char *buffer, size_t size) { char timestamp_buf[18]; FILE *temp_file = NULL; char temp_filename[PATH_MAX]; _TRACE_(10, ("")); _TRACE_(10, ("trn_file_id [%s]", trn_head.trn_file_id)); /* EXEC SQL ROLLBACK WORK; */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 13; sqlstm.arrsiz = 4; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )66; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } memset(timestamp_buf, 0, sizeof(timestamp_buf)); memset(temp_filename, 0, sizeof(temp_filename)); /* EXEC SQL SELECT TO_CHAR(SYSTIMESTAMP,&#39;YYYYMMDDHH24MISSFF3&#39;) INTO :timestamp_buf FROM DUAL; */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 13; sqlstm.arrsiz = 4; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.stmt = "select TO_CHAR(SYSTIMESTAMP,&#39;YYYYMMDDHH24MISSFF3&#39;) into :\ b0 from DUAL "; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )81; sqlstm.selerr = (unsigned short)1; sqlstm.sqlpfmem = (unsigned int )0; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlstm.sqhstv[0] = (unsigned char *)timestamp_buf; sqlstm.sqhstl[0] = (unsigned long )18; sqlstm.sqhsts[0] = ( int )0; sqlstm.sqindv[0] = ( short *)0; sqlstm.sqinds[0] = ( int )0; sqlstm.sqharm[0] = (unsigned long )0; sqlstm.sqadto[0] = (unsigned short )0; sqlstm.sqtdso[0] = (unsigned short )0; sqlstm.sqphsv = sqlstm.sqhstv; sqlstm.sqphsl = sqlstm.sqhstl; sqlstm.sqphss = sqlstm.sqhsts; sqlstm.sqpind = sqlstm.sqindv; sqlstm.sqpins = sqlstm.sqinds; sqlstm.sqparm = sqlstm.sqharm; sqlstm.sqparc = sqlstm.sqharc; sqlstm.sqpadto = sqlstm.sqadto; sqlstm.sqptdso = sqlstm.sqtdso; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } if(sqlca.sqlcode < 0) { log_printf(LOG_ERROR, "Database session error%s%", sqlca.sqlerrm.sqlerrmc); abort(); } else { /* TEMPファイル出力 */ sprintf(temp_filename, "%s_%s.TEMP.%s" , get_config()->log_file , get_config()->process_name , timestamp_buf); temp_file = fopen(temp_filename, "ab+"); if(temp_file == NULL) { log_printf(LOG_ERROR, "TEMP file open error : [%s] %s(%d)",temp_filename, strerror(errno), errno); abort(); } fwrite(buffer, size, 1, temp_file); fclose(temp_file); log_printf(LOG_WARN, "SKIP TRN_FILE_ID=%s TEMP_FILE=%s", trn_head.trn_file_id, temp_filename); } return 0; } /*** add 2019/10/7 end ***/ /****************************************************************************** 仕上げの処理(発注トランヘッダテーブルと発注キューテーブルの登録) 返り値 0 : OK -1 : エラー ******************************************************************************/ int store_finish() { int retry_count = 0; BOOL sqldone = NO; _TRACE_(10, ("")); /* 発注トランヘッダテーブルへINSERT */ while(!sqldone) { /* EXEC SQL INSERT INTO BJ_T_ODR_TRN_HEAD (TRN_FILE_ID,HCHIKU_HEAD,TENBAN_HEAD, RCV_DATE,RCV_TIME,REC_RGST_DT,REC_RGST_PG_ID,REC_RGST_ID) VALUES (:trn_head.trn_file_id,:trn_head.hchiku_head,:trn_head.tenban_head ,:trn_head.rcv_date,:trn_head.rcv_time,systimestamp,:process_name,:process_name); */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 13; sqlstm.arrsiz = 7; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.stmt = "insert into BJ_T_ODR_TRN_HEAD (TRN_FILE_ID,HCHIKU_HEA\ D,TENBAN_HEAD,RCV_DATE,RCV_TIME,REC_RGST_DT,REC_RGST_PG_ID,REC_RGST_ID) values\ (:b0,:b1,:b2,:b3,:b4,systimestamp,:b5,:b5)"; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )100; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlstm.sqhstv[0] = (unsigned char *)(trn_head.trn_file_id); sqlstm.sqhstl[0] = (unsigned long )129; sqlstm.sqhsts[0] = ( int )0; sqlstm.sqindv[0] = ( short *)0; sqlstm.sqinds[0] = ( int )0; sqlstm.sqharm[0] = (unsigned long )0; sqlstm.sqadto[0] = (unsigned short )0; sqlstm.sqtdso[0] = (unsigned short )0; sqlstm.sqhstv[1] = (unsigned char *)(trn_head.hchiku_head); sqlstm.sqhstl[1] = (unsigned long )3; sqlstm.sqhsts[1] = ( int )0; sqlstm.sqindv[1] = ( short *)0; sqlstm.sqinds[1] = ( int )0; sqlstm.sqharm[1] = (unsigned long )0; sqlstm.sqadto[1] = (unsigned short )0; sqlstm.sqtdso[1] = (unsigned short )0; sqlstm.sqhstv[2] = (unsigned char *)(trn_head.tenban_head); sqlstm.sqhstl[2] = (unsigned long )6; sqlstm.sqhsts[2] = ( int )0; sqlstm.sqindv[2] = ( short *)0; sqlstm.sqinds[2] = ( int )0; sqlstm.sqharm[2] = (unsigned long )0; sqlstm.sqadto[2] = (unsigned short )0; sqlstm.sqtdso[2] = (unsigned short )0; sqlstm.sqhstv[3] = (unsigned char *)(trn_head.rcv_date); sqlstm.sqhstl[3] = (unsigned long )9; sqlstm.sqhsts[3] = ( int )0; sqlstm.sqindv[3] = ( short *)0; sqlstm.sqinds[3] = ( int )0; sqlstm.sqharm[3] = (unsigned long )0; sqlstm.sqadto[3] = (unsigned short )0; sqlstm.sqtdso[3] = (unsigned short )0; sqlstm.sqhstv[4] = (unsigned char *)(trn_head.rcv_time); sqlstm.sqhstl[4] = (unsigned long )10; sqlstm.sqhsts[4] = ( int )0; sqlstm.sqindv[4] = ( short *)0; sqlstm.sqinds[4] = ( int )0; sqlstm.sqharm[4] = (unsigned long )0; sqlstm.sqadto[4] = (unsigned short )0; sqlstm.sqtdso[4] = (unsigned short )0; sqlstm.sqhstv[5] = (unsigned char *)process_name; sqlstm.sqhstl[5] = (unsigned long )18; sqlstm.sqhsts[5] = ( int )0; sqlstm.sqindv[5] = ( short *)0; sqlstm.sqinds[5] = ( int )0; sqlstm.sqharm[5] = (unsigned long )0; sqlstm.sqadto[5] = (unsigned short )0; sqlstm.sqtdso[5] = (unsigned short )0; sqlstm.sqhstv[6] = (unsigned char *)process_name; sqlstm.sqhstl[6] = (unsigned long )18; sqlstm.sqhsts[6] = ( int )0; sqlstm.sqindv[6] = ( short *)0; sqlstm.sqinds[6] = ( int )0; sqlstm.sqharm[6] = (unsigned long )0; sqlstm.sqadto[6] = (unsigned short )0; sqlstm.sqtdso[6] = (unsigned short )0; sqlstm.sqphsv = sqlstm.sqhstv; sqlstm.sqphsl = sqlstm.sqhstl; sqlstm.sqphss = sqlstm.sqhsts; sqlstm.sqpind = sqlstm.sqindv; sqlstm.sqpins = sqlstm.sqinds; sqlstm.sqparm = sqlstm.sqharm; sqlstm.sqparc = sqlstm.sqharc; sqlstm.sqpadto = sqlstm.sqadto; sqlstm.sqptdso = sqlstm.sqtdso; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } if(sqlca.sqlcode < 0) { log_printf(LOG_ERROR, "Database insert BJ_T_ODR_TRN_HEAD error%s%", sqlca.sqlerrm.sqlerrmc); /*** mod 2019/10/7 start ***/ /* EXEC SQL ROLLBACK WORK;*/ /* if (retry_count < MAX_SQL_RETRY) {*/ /* sleep(SQL_RETRY_TIMER);*/ /* retry_count++;*/ /* } else {*/ /* abort();*/ /* }*/ if (retry_count < MAX_INS_RETRY) { sleep(SQL_RETRY_TIMER); retry_count++; } else { return -1; } /*** mod 2019/10/7 end ***/ } else { sqldone = YES; } } /* 発注キューテーブルへINSERT */ retry_count = 0; sqldone = NO; while(!sqldone) { /* EXEC SQL INSERT INTO BJ_T_HAT_QUETBL (TRN_FILE_ID,TENBAN_HEAD,PROC_FLG,REC_RGST_DT,REC_RGST_PG_ID,REC_RGST_ID) VALUES (:trn_head.trn_file_id,:trn_head.tenban_head,&#39;0&#39;,systimestamp,:process_name,:process_name); */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 13; sqlstm.arrsiz = 7; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.stmt = "insert into BJ_T_HAT_QUETBL (TRN_FILE_ID,TENBAN_HEAD,\ PROC_FLG,REC_RGST_DT,REC_RGST_PG_ID,REC_RGST_ID) values (:b0,:b1,&#39;0&#39;,systimest\ amp,:b2,:b2)"; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )143; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlstm.sqhstv[0] = (unsigned char *)(trn_head.trn_file_id); sqlstm.sqhstl[0] = (unsigned long )129; sqlstm.sqhsts[0] = ( int )0; sqlstm.sqindv[0] = ( short *)0; sqlstm.sqinds[0] = ( int )0; sqlstm.sqharm[0] = (unsigned long )0; sqlstm.sqadto[0] = (unsigned short )0; sqlstm.sqtdso[0] = (unsigned short )0; sqlstm.sqhstv[1] = (unsigned char *)(trn_head.tenban_head); sqlstm.sqhstl[1] = (unsigned long )6; sqlstm.sqhsts[1] = ( int )0; sqlstm.sqindv[1] = ( short *)0; sqlstm.sqinds[1] = ( int )0; sqlstm.sqharm[1] = (unsigned long )0; sqlstm.sqadto[1] = (unsigned short )0; sqlstm.sqtdso[1] = (unsigned short )0; sqlstm.sqhstv[2] = (unsigned char *)process_name; sqlstm.sqhstl[2] = (unsigned long )18; sqlstm.sqhsts[2] = ( int )0; sqlstm.sqindv[2] = ( short *)0; sqlstm.sqinds[2] = ( int )0; sqlstm.sqharm[2] = (unsigned long )0; sqlstm.sqadto[2] = (unsigned short )0; sqlstm.sqtdso[2] = (unsigned short )0; sqlstm.sqhstv[3] = (unsigned char *)process_name; sqlstm.sqhstl[3] = (unsigned long )18; sqlstm.sqhsts[3] = ( int )0; sqlstm.sqindv[3] = ( short *)0; sqlstm.sqinds[3] = ( int )0; sqlstm.sqharm[3] = (unsigned long )0; sqlstm.sqadto[3] = (unsigned short )0; sqlstm.sqtdso[3] = (unsigned short )0; sqlstm.sqphsv = sqlstm.sqhstv; sqlstm.sqphsl = sqlstm.sqhstl; sqlstm.sqphss = sqlstm.sqhsts; sqlstm.sqpind = sqlstm.sqindv; sqlstm.sqpins = sqlstm.sqinds; sqlstm.sqparm = sqlstm.sqharm; sqlstm.sqparc = sqlstm.sqharc; sqlstm.sqpadto = sqlstm.sqadto; sqlstm.sqptdso = sqlstm.sqtdso; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } if(sqlca.sqlcode < 0) { log_printf(LOG_ERROR, "Database insert BJ_T_HAT_QUETBL error%s%", sqlca.sqlerrm.sqlerrmc); /*** mod 2019/10/7 start ***/ /* EXEC SQL ROLLBACK WORK;*/ /* if (retry_count < MAX_SQL_RETRY) {*/ /* sleep(SQL_RETRY_TIMER);*/ /* retry_count++;*/ /* } else {*/ /* abort();*/ /* }*/ if (retry_count < MAX_INS_RETRY) { sleep(SQL_RETRY_TIMER); retry_count++; } else { return -1; } /*** mod 2019/10/7 end ***/ } else { sqldone = YES; } } return 0; } /****************************************************************************** トランザクションのコミット 返り値 0 : OK -1 : エラー ******************************************************************************/ int store_commit() { int retry_count = 0; BOOL sqldone = NO; _TRACE_(10, ("")); /* トランザクションのコミット */ while(!sqldone) { /* EXEC SQL COMMIT WORK; */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 13; sqlstm.arrsiz = 7; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )174; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } if(sqlca.sqlcode < 0) { log_printf(LOG_ERROR, "Database commit error%s%", sqlca.sqlerrm.sqlerrmc); /* EXEC SQL ROLLBACK WORK; */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 13; sqlstm.arrsiz = 7; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )189; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } if (retry_count < MAX_SQL_RETRY) { retry_count++; sleep(SQL_RETRY_TIMER); } else { abort(); } } else { sqldone = YES; } } log_printf(LOG_INFO, "END TRN_FILE_ID=%s", trn_head.trn_file_id); return 0; } /****************************************************************************** トランザクションのアボート 返り値 0 : OK ******************************************************************************/ int store_abort() { _TRACE_(10, ("")); /* トランザクションのアボート */ /* EXEC SQL ROLLBACK WORK; */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 13; sqlstm.arrsiz = 7; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )204; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } log_printf(LOG_INFO, "ABORT TRN_FILE_ID=%s", trn_head.trn_file_id); return 0; } /****************************************************************************** 発注データ(ヘッダ部)処理 返り値 0 : OK ******************************************************************************/ int store_add_head(interm_head_def *interm_head) { _TRACE_(10, ("")); /* 値のホスト変数への格納 */ memcpy(trn_head.hchiku_head, interm_head->hchiku, LEN_HCHIKU); memcpy(trn_head.tenban_head, interm_head->tenban, LEN_TENBAN); memcpy(trn_head.rcv_date, interm_head->rcv_date, LEN_RCV_DATE); memcpy(trn_head.rcv_time, interm_head->rcv_time, LEN_RCV_TIME); return 0; } /****************************************************************************** 発注データ(データ部)処理 返り値 0 : OK ******************************************************************************/ int store_add_data(interm_data_def *intinterm_data) { _TRACE_(10, ("")); /* 発注トラン明細用ホスト変数の初期化 */ memset(&trn_mei, 0, sizeof(trn_mei)); /* 値のホスト変数への格納 */ trn_mei.seq_no = intinterm_data->seq_no; memcpy(trn_mei.hchiku, intinterm_data->hchiku, LEN_HCHIKU); memcpy(trn_mei.tenban, intinterm_data->tenban, LEN_TENBAN); memcpy(trn_mei.hat_date, intinterm_data->hat_date, LEN_HAT_DATE); return 0; } /****************************************************************************** 発注データ(データ部)のTEXT部処理 返り値 0 : OK -1 : エラー ******************************************************************************/ int store_add_detail(interm_detail_def *interm_detail) { int retry_count = 0; BOOL sqldone = NO; _TRACE_(10, ("")); /* 値のホスト変数への格納 */ memcpy(trn_mei.hatsk_cd, interm_detail->hatsk_cd, LEN_HATSK_CD); memcpy(trn_mei.shohin_cd, interm_detail->shohin_cd, LEN_SHOHIN_CD); trn_mei.hat_baisu =interm_detail-> hat_baisu; memcpy(trn_mei.pop_kbn, interm_detail->pop_kbn, LEN_POP_KBN); memcpy(trn_mei.hat_type, interm_detail->hat_type, LEN_HAT_TYPE); /* 発注トラン明細テーブルへINSERT */ while(!sqldone) { /* EXEC SQL INSERT INTO BJ_T_ODR_TRN_MEI (TRN_FILE_ID,SEQ_NO,HCHIKU,TENBAN,HAT_DATE ,HATSK_CD,SHOHIN_CD,HAT_BAISU,POP_KBN,HAT_TYPE ,REC_RGST_DT,REC_RGST_PG_ID,REC_RGST_ID) VALUES (:trn_head.trn_file_id,:trn_mei.seq_no,:trn_mei.hchiku,:trn_mei.tenban,:trn_mei.hat_date ,:trn_mei.hatsk_cd,:trn_mei.shohin_cd,:trn_mei.hat_baisu,:trn_mei.pop_kbn,:trn_mei.hat_type ,systimestamp,:process_name,:process_name); */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 13; sqlstm.arrsiz = 12; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.stmt = "insert into BJ_T_ODR_TRN_MEI (TRN_FILE_ID,SEQ_NO,HCHI\ KU,TENBAN,HAT_DATE,HATSK_CD,SHOHIN_CD,HAT_BAISU,POP_KBN,HAT_TYPE,REC_RGST_DT,R\ EC_RGST_PG_ID,REC_RGST_ID) values (:b0,:b1,:b2,:b3,:b4,:b5,:b6,:b7,:b8,:b9,sys\ timestamp,:b10,:b10)"; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )219; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlstm.sqhstv[0] = (unsigned char *)(trn_head.trn_file_id); sqlstm.sqhstl[0] = (unsigned long )129; sqlstm.sqhsts[0] = ( int )0; sqlstm.sqindv[0] = ( short *)0; sqlstm.sqinds[0] = ( int )0; sqlstm.sqharm[0] = (unsigned long )0; sqlstm.sqadto[0] = (unsigned short )0; sqlstm.sqtdso[0] = (unsigned short )0; sqlstm.sqhstv[1] = (unsigned char *)&(trn_mei.seq_no); sqlstm.sqhstl[1] = (unsigned long )sizeof(int); sqlstm.sqhsts[1] = ( int )0; sqlstm.sqindv[1] = ( short *)0; sqlstm.sqinds[1] = ( int )0; sqlstm.sqharm[1] = (unsigned long )0; sqlstm.sqadto[1] = (unsigned short )0; sqlstm.sqtdso[1] = (unsigned short )0; sqlstm.sqhstv[2] = (unsigned char *)(trn_mei.hchiku); sqlstm.sqhstl[2] = (unsigned long )3; sqlstm.sqhsts[2] = ( int )0; sqlstm.sqindv[2] = ( short *)0; sqlstm.sqinds[2] = ( int )0; sqlstm.sqharm[2] = (unsigned long )0; sqlstm.sqadto[2] = (unsigned short )0; sqlstm.sqtdso[2] = (unsigned short )0; sqlstm.sqhstv[3] = (unsigned char *)(trn_mei.tenban); sqlstm.sqhstl[3] = (unsigned long )6; sqlstm.sqhsts[3] = ( int )0; sqlstm.sqindv[3] = ( short *)0; sqlstm.sqinds[3] = ( int )0; sqlstm.sqharm[3] = (unsigned long )0; sqlstm.sqadto[3] = (unsigned short )0; sqlstm.sqtdso[3] = (unsigned short )0; sqlstm.sqhstv[4] = (unsigned char *)(trn_mei.hat_date); sqlstm.sqhstl[4] = (unsigned long )9; sqlstm.sqhsts[4] = ( int )0; sqlstm.sqindv[4] = ( short *)0; sqlstm.sqinds[4] = ( int )0; sqlstm.sqharm[4] = (unsigned long )0; sqlstm.sqadto[4] = (unsigned short )0; sqlstm.sqtdso[4] = (unsigned short )0; sqlstm.sqhstv[5] = (unsigned char *)(trn_mei.hatsk_cd); sqlstm.sqhstl[5] = (unsigned long )9; sqlstm.sqhsts[5] = ( int )0; sqlstm.sqindv[5] = ( short *)0; sqlstm.sqinds[5] = ( int )0; sqlstm.sqharm[5] = (unsigned long )0; sqlstm.sqadto[5] = (unsigned short )0; sqlstm.sqtdso[5] = (unsigned short )0; sqlstm.sqhstv[6] = (unsigned char *)(trn_mei.shohin_cd); sqlstm.sqhstl[6] = (unsigned long )9; sqlstm.sqhsts[6] = ( int )0; sqlstm.sqindv[6] = ( short *)0; sqlstm.sqinds[6] = ( int )0; sqlstm.sqharm[6] = (unsigned long )0; sqlstm.sqadto[6] = (unsigned short )0; sqlstm.sqtdso[6] = (unsigned short )0; sqlstm.sqhstv[7] = (unsigned char *)&(trn_mei.hat_baisu); sqlstm.sqhstl[7] = (unsigned long )sizeof(int); sqlstm.sqhsts[7] = ( int )0; sqlstm.sqindv[7] = ( short *)0; sqlstm.sqinds[7] = ( int )0; sqlstm.sqharm[7] = (unsigned long )0; sqlstm.sqadto[7] = (unsigned short )0; sqlstm.sqtdso[7] = (unsigned short )0; sqlstm.sqhstv[8] = (unsigned char *)(trn_mei.pop_kbn); sqlstm.sqhstl[8] = (unsigned long )3; sqlstm.sqhsts[8] = ( int )0; sqlstm.sqindv[8] = ( short *)0; sqlstm.sqinds[8] = ( int )0; sqlstm.sqharm[8] = (unsigned long )0; sqlstm.sqadto[8] = (unsigned short )0; sqlstm.sqtdso[8] = (unsigned short )0; sqlstm.sqhstv[9] = (unsigned char *)(trn_mei.hat_type); sqlstm.sqhstl[9] = (unsigned long )3; sqlstm.sqhsts[9] = ( int )0; sqlstm.sqindv[9] = ( short *)0; sqlstm.sqinds[9] = ( int )0; sqlstm.sqharm[9] = (unsigned long )0; sqlstm.sqadto[9] = (unsigned short )0; sqlstm.sqtdso[9] = (unsigned short )0; sqlstm.sqhstv[10] = (unsigned char *)process_name; sqlstm.sqhstl[10] = (unsigned long )18; sqlstm.sqhsts[10] = ( int )0; sqlstm.sqindv[10] = ( short *)0; sqlstm.sqinds[10] = ( int )0; sqlstm.sqharm[10] = (unsigned long )0; sqlstm.sqadto[10] = (unsigned short )0; sqlstm.sqtdso[10] = (unsigned short )0; sqlstm.sqhstv[11] = (unsigned char *)process_name; sqlstm.sqhstl[11] = (unsigned long )18; sqlstm.sqhsts[11] = ( int )0; sqlstm.sqindv[11] = ( short *)0; sqlstm.sqinds[11] = ( int )0; sqlstm.sqharm[11] = (unsigned long )0; sqlstm.sqadto[11] = (unsigned short )0; sqlstm.sqtdso[11] = (unsigned short )0; sqlstm.sqphsv = sqlstm.sqhstv; sqlstm.sqphsl = sqlstm.sqhstl; sqlstm.sqphss = sqlstm.sqhsts; sqlstm.sqpind = sqlstm.sqindv; sqlstm.sqpins = sqlstm.sqinds; sqlstm.sqparm = sqlstm.sqharm; sqlstm.sqparc = sqlstm.sqharc; sqlstm.sqpadto = sqlstm.sqadto; sqlstm.sqptdso = sqlstm.sqtdso; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } if(sqlca.sqlcode < 0) { log_printf(LOG_ERROR, "Database insert BJ_T_ODR_TRN_MEI error%s%", sqlca.sqlerrm.sqlerrmc); /*** mod 2019/10/7 start ***/ /* EXEC SQL ROLLBACK WORK;*/ /* if (retry_count < MAX_SQL_RETRY) {*/ /* sleep(SQL_RETRY_TIMER);*/ /* retry_count++;*/ /* } else {*/ /* abort();*/ /* }*/ if (retry_count < MAX_INS_RETRY) { sleep(SQL_RETRY_TIMER); retry_count++; } else { return -1; } /*** mod 2019/10/7 end ***/ } else { sqldone = YES; } } return 0; } /****************************************************************************** 締め処理(締め処理用の値を設定する) 返り値 0 : OK ******************************************************************************/ int store_order_closing(char *trn_file_id) { _TRACE_(10, ("")); _TRACE_(10, ("trn_file_id [%s]", trn_file_id)); /* 発注キュー及び発注トランヘッダ用ホスト変数の初期化 */ memset(&trn_head, 0, sizeof(trn_head)); /* トランファイルIDのホスト変数への格納 */ strncpy(trn_head.trn_file_id, trn_file_id, LEN_TRN_FILE_ID); /* それ以外の値へのスペースの格納 */ memset(trn_head.hchiku_head, &#39; &#39;, LEN_HCHIKU); memset(trn_head.tenban_head, &#39; &#39;, LEN_TENBAN); memset(trn_head.rcv_date, &#39; &#39;, LEN_RCV_DATE); memset(trn_head.rcv_time, &#39; &#39;, LEN_RCV_TIME); return 0; } /****************************************************************************** プログラムIDを設定する ******************************************************************************/ void store_set_process_name(const char *name) { _TRACE_(10, ("name [%s]", name)); /* プログラムIDのホスト変数への格納 */ strncpy(process_name, name, LEN_PG_ID); } /****************************************************************************** データベース名を設定する ******************************************************************************/ void store_set_name(const char *db_name) { _TRACE_(0, ("db_name [%s]", db_name)); /* データベース名のホスト変数への格納 */ strncpy(dbname, db_name, DB_NAME_LEN); } /****************************************************************************** ユーザとパスワードを設定する ******************************************************************************/ void store_set_user(const char *db_user, const char *db_password) { _TRACE_(0, ("db_user [%s]", db_user)); _TRACE_(0, ("db_password [%s]", db_password)); /* ユーザのホスト変数への格納 */ strncpy(username, db_user, DB_USERNAME_LEN); /* パスワードのホスト変数への格納 */ strncpy(password, db_password, DB_PASSWORD_LEN); } oracle转postgre 这个文件怎么改
08-22
/****************************************************************************** * * Filename: * --------- * gc05a2mipimadrid_Sensor.c * * Project: * -------- * ALPS * * Description: * ------------ * Source code of Sensor driver * * *----------------------------------------------------------------------------- * Upper this line, this part is controlled by CC/CQ. DO NOT MODIFY!! *============================================================================ * * Version: V20220830190306 by GC-S-TEAM * ******************************************************************************/ #include <linux/videodev2.h> #include <linux/i2c.h> #include <linux/platform_device.h> #include <linux/delay.h> #include <linux/cdev.h> #include <linux/uaccess.h> #include <linux/fs.h> #include <linux/atomic.h> #include <linux/types.h> #include "kd_camera_typedef.h" #include "kd_imgsensor.h" #include "kd_imgsensor_define.h" #include "kd_imgsensor_errcode.h" #include "gc05a2mipimadrid_Sensor.h" /************************** Modify Following Strings for Debug **************************/ #define PFX "gc05a2_camera_sensor" #define LOG_1 LOG_INF("GC05A2, MIPI 2LANE\n") /**************************** Modify end *******************************************/ #define GC05A2_DEBUG 1 #if GC05A2_DEBUG #define LOG_INF(format, args...) pr_debug(PFX "[%s] " format, __func__, ##args) #else #define LOG_INF(format, args...) #endif #define SN_OFFSET 0x2150 // sn starting address of otp guide #define SN_LENGTH 0x1F // sn length + read offset #define GC05A2_SN_DEBUG 0 static BYTE gc05a2_common_data[200] = { 0 }; static DEFINE_SPINLOCK(imgsensor_drv_lock); static struct imgsensor_info_struct imgsensor_info = { .sensor_id = GC05A2_SENSOR_ID_MADRID, .checksum_value = 0xe5d32119, .pre = { .pclk = 224000000, .linelength = 3616, .framelength = 2064, .startx = 0, .starty = 0, .grabwindow_width = 1296, .grabwindow_height = 972, .mipi_data_lp2hs_settle_dc = 85, .mipi_pixel_rate = 89600000, .max_framerate = 300, }, .cap = { .pclk = 224000000, .linelength = 3664, .framelength = 2032, .startx = 0, .starty = 0, .grabwindow_width = 2592, .grabwindow_height = 1944, .mipi_data_lp2hs_settle_dc = 85, .mipi_pixel_rate = 179200000, .max_framerate = 300, }, .normal_video = { .pclk = 224000000, .linelength = 3616, .framelength = 2064, .startx = 0, .starty = 0, .grabwindow_width = 1296, .grabwindow_height = 972, .mipi_data_lp2hs_settle_dc = 85, .mipi_pixel_rate = 89600000, .max_framerate = 300, }, .hs_video = { .pclk = 224000000, .linelength = 3616, .framelength = 2064, .startx = 0, .starty = 0, .grabwindow_width = 1296, .grabwindow_height = 972, .mipi_data_lp2hs_settle_dc = 85, .mipi_pixel_rate = 89600000, .max_framerate = 300, }, .slim_video = { .pclk = 224000000, .linelength = 3616, .framelength = 2064, .startx = 0, .starty = 0, .grabwindow_width = 1280, .grabwindow_height = 720, .mipi_data_lp2hs_settle_dc = 85, .mipi_pixel_rate = 89600000, .max_framerate = 300, }, .margin = 16, .min_shutter = 4, .max_frame_length = 0xfffe, .ae_shut_delay_frame = 0, .ae_sensor_gain_delay_frame = 0, .ae_ispGain_delay_frame = 2, .ihdr_support = 0, .ihdr_le_firstline = 0, .sensor_mode_num = 5, .cap_delay_frame = 2, .pre_delay_frame = 2, .video_delay_frame = 2, .hs_video_delay_frame = 2, .slim_video_delay_frame = 2, .isp_driving_current = ISP_DRIVING_6MA, .sensor_interface_type = SENSOR_INTERFACE_TYPE_MIPI, .mipi_sensor_type = MIPI_OPHY_NCSI2, .mipi_settle_delay_mode = MIPI_SETTLEDELAY_AUTO, //#if GC05A2_MIRROR_NORMAL .sensor_output_dataformat = SENSOR_OUTPUT_FORMAT_RAW_Gr, //#elif GC05A2_MIRROR_H // .sensor_output_dataformat = SENSOR_OUTPUT_FORMAT_RAW_R, //#elif GC05A2_MIRROR_V // .sensor_output_dataformat = SENSOR_OUTPUT_FORMAT_RAW_B, //#elif GC05A2_MIRROR_HV // .sensor_output_dataformat = SENSOR_OUTPUT_FORMAT_RAW_Gb, //#else // .sensor_output_dataformat = SENSOR_OUTPUT_FORMAT_RAW_Gr, //#endif .mclk = 24, .mipi_lane_num = SENSOR_MIPI_2_LANE, .i2c_addr_table = {0x7e, 0xff}, .i2c_speed = 400, }; static struct imgsensor_struct imgsensor = { .mirror = IMAGE_HV_MIRROR, .sensor_mode = IMGSENSOR_MODE_INIT, .shutter = 0x900, .gain = 0x40, .dummy_pixel = 0, .dummy_line = 0, .current_fps = 300, .autoflicker_en = KAL_FALSE, .test_pattern = KAL_FALSE, .current_scenario_id = MSDK_SCENARIO_ID_CAMERA_PREVIEW, .ihdr_en = 0, .i2c_write_id = 0x7e, }; /* Sensor output window information */ static struct SENSOR_WINSIZE_INFO_STRUCT imgsensor_winsize_info[5] = { { 2592, 1944, 0, 0, 2592, 1944, 1296, 972, 0, 0, 1296, 972, 0, 0, 1296, 972}, /* Preview */ { 2592, 1944, 0, 0, 2592, 1944, 2592, 1944, 0, 0, 2592, 1944, 0, 0, 2592, 1944}, /* capture */ { 2592, 1944, 0, 0, 2592, 1944, 1296, 972, 0, 0, 1296, 972, 0, 0, 1296, 972}, /* video */ { 2592, 1944, 0, 0, 2592, 1944, 1296, 972, 0, 0, 1296, 972, 0, 0, 1296, 972}, /* hs video */ { 2592, 1944, 0, 0, 2592, 1944, 1296, 972, 8, 126, 1280, 720, 0, 0, 1280, 720} /* slim video */ }; static kal_uint16 read_cmos_sensor(kal_uint32 addr) { kal_uint16 get_byte = 0; char pu_send_cmd[2] = { (char)((addr >> 8) & 0xff), (char)(addr & 0xff) }; iReadRegI2C(pu_send_cmd, 2, (u8 *)&get_byte, 1, imgsensor.i2c_write_id); return get_byte; } static void write_cmos_sensor(kal_uint32 addr, kal_uint32 para) { char pu_send_cmd[4] = { (char)((addr >> 8) & 0xff), (char)(addr & 0xff), (char)((para >> 8) & 0xff), (char)(para & 0xff) }; iWriteRegI2C(pu_send_cmd, 4, imgsensor.i2c_write_id); } static void write_cmos_sensor_8bit(kal_uint32 addr, kal_uint32 para) { char pu_send_cmd[3] = { (char)((addr >> 8) & 0xff), (char)(addr & 0xff), (char)(para & 0xff) }; iWriteRegI2C(pu_send_cmd, 3, imgsensor.i2c_write_id); } static void table_write_cmos_sensor(kal_uint16 *para, kal_uint32 len) { char puSendCmd[I2C_BUFFER_LEN]; kal_uint32 tosend = 0, idx = 0; kal_uint16 addr = 0, data = 0; while (len > idx) { addr = para[idx]; puSendCmd[tosend++] = (char)((addr >> 8) & 0xff); puSendCmd[tosend++] = (char)(addr & 0xff); data = para[idx + 1]; puSendCmd[tosend++] = (char)(data & 0xff); idx += 2; #if MULTI_WRITE if (tosend >= I2C_BUFFER_LEN || idx == len) { iBurstWriteReg_multi(puSendCmd, tosend, imgsensor.i2c_write_id, 3, imgsensor_info.i2c_speed); tosend = 0; } #else iWriteRegI2CTiming(puSendCmd, 3, imgsensor.i2c_write_id, imgsensor_info.i2c_speed); tosend = 0; #endif } } static kal_uint32 return_sensor_id(void) { kal_uint32 sensor_id = 0; sensor_id = (read_cmos_sensor(0x03f0) << 8) | read_cmos_sensor(0x03f1); return sensor_id; } static void set_dummy(void) { LOG_INF("frame length = %d\n", imgsensor.frame_length); write_cmos_sensor(0x0340, imgsensor.frame_length & 0xfffe); } static void set_max_framerate(kal_uint16 framerate, kal_bool min_framelength_en) { kal_uint32 frame_length = imgsensor.frame_length; frame_length = imgsensor.pclk / framerate * 10 / imgsensor.line_length; spin_lock(&imgsensor_drv_lock); imgsensor.frame_length = (frame_length > imgsensor.min_frame_length) ? frame_length : imgsensor.min_frame_length; imgsensor.dummy_line = imgsensor.frame_length - imgsensor.min_frame_length; if (imgsensor.frame_length > imgsensor_info.max_frame_length) { imgsensor.frame_length = imgsensor_info.max_frame_length; imgsensor.dummy_line = imgsensor.frame_length - imgsensor.min_frame_length; } if (min_framelength_en) imgsensor.min_frame_length = imgsensor.frame_length; spin_unlock(&imgsensor_drv_lock); set_dummy(); } static void set_shutter(kal_uint16 shutter) { unsigned long flags; kal_uint16 realtime_fps = 0; /*kal_uint32 frame_length = 0;*/ spin_lock_irqsave(&imgsensor_drv_lock, flags); imgsensor.shutter = shutter; spin_unlock_irqrestore(&imgsensor_drv_lock, flags); /* if shutter bigger than frame_length, should extend frame length first */ spin_lock(&imgsensor_drv_lock); if (shutter > imgsensor.min_frame_length - imgsensor_info.margin) imgsensor.frame_length = shutter + imgsensor_info.margin; else imgsensor.frame_length = imgsensor.min_frame_length; if (imgsensor.frame_length > imgsensor_info.max_frame_length) imgsensor.frame_length = imgsensor_info.max_frame_length; spin_unlock(&imgsensor_drv_lock); shutter = (shutter < imgsensor_info.min_shutter) ? imgsensor_info.min_shutter : shutter; shutter = (shutter > (imgsensor_info.max_frame_length - imgsensor_info.margin)) ? (imgsensor_info.max_frame_length - imgsensor_info.margin) : shutter; realtime_fps = imgsensor.pclk / imgsensor.line_length * 10 / imgsensor.frame_length; if (imgsensor.autoflicker_en) { if (realtime_fps >= 297 && realtime_fps <= 305) set_max_framerate(296, 0); else if (realtime_fps >= 147 && realtime_fps <= 150) set_max_framerate(146, 0); else write_cmos_sensor(0x0340, imgsensor.frame_length & 0xfffe); } else write_cmos_sensor(0x0340, imgsensor.frame_length & 0xfffe); /* Update Shutter */ write_cmos_sensor(0x0202, shutter); LOG_INF("shutter = %d, framelength = %d\n", shutter, imgsensor.frame_length); } static kal_uint16 gain2reg(kal_uint16 gain) { kal_uint16 reg_gain = gain << 4; reg_gain = (reg_gain < SENSOR_BASE_GAIN) ? SENSOR_BASE_GAIN : reg_gain; reg_gain = (reg_gain > SENSOR_MAX_GAIN) ? SENSOR_MAX_GAIN : reg_gain; return reg_gain; } static kal_uint16 set_gain(kal_uint16 gain) { kal_uint32 reg_gain = 0; reg_gain = gain2reg(gain); LOG_INF("gain = %d, reg_gain = %d\n", gain, reg_gain); write_cmos_sensor(0x0204, reg_gain & 0xffff); return gain; } static void ihdr_write_shutter_gain(kal_uint16 le, kal_uint16 se, kal_uint16 gain) { LOG_INF("le: 0x%x, se: 0x%x, gain: 0x%x\n", le, se, gain); } static void night_mode(kal_bool enable) { /* No Need to implement this function */ } static kal_uint16 gc05a2_init_addr_data[] = { /*system*/ 0x0315, 0xd4, 0x0d06, 0x01, 0x0a70, 0x80, 0x031a, 0x00, 0x0314, 0x00, 0x0130, 0x08, 0x0132, 0x01, 0x0135, 0x01, 0x0136, 0x38, 0x0137, 0x03, 0x0134, 0x5b, 0x031c, 0xe0, 0x0d82, 0x14, 0x0dd1, 0x56, /*gate_mode*/ 0x0af4, 0x01, 0x0002, 0x10, 0x00c3, 0x34, /*pre_setting*/ 0x0084, 0x21, 0x0d05, 0xcc, 0x0218, 0x00, 0x005e, 0x48, 0x0d06, 0x01, 0x0007, 0x16, 0x0101, GC05A2_MIRROR, /*analog*/ 0x0342, 0x07, 0x0343, 0x28, 0x0220, 0x07, 0x0221, 0xd0, 0x0202, 0x07, 0x0203, 0x32, 0x0340, 0x07, 0x0341, 0xf0, 0x0219, 0x00, 0x0346, 0x00, 0x0347, 0x04, 0x0d14, 0x00, 0x0d13, 0x05, 0x0d16, 0x05, 0x0d15, 0x1d, 0x00c0, 0x0a, 0x00c1, 0x30, 0x034a, 0x07, 0x034b, 0xa8, 0x0e0a, 0x00, 0x0e0b, 0x00, 0x0e0e, 0x03, 0x0e0f, 0x00, 0x0e06, 0x0a, 0x0e23, 0x15, 0x0e24, 0x15, 0x0e2a, 0x10, 0x0e2b, 0x10, 0x0e17, 0x49, 0x0e1b, 0x1c, 0x0e3a, 0x36, 0x0d11, 0x84, 0x0e52, 0x14, 0x000b, 0x10, 0x0008, 0x08, 0x0223, 0x17, 0x0d27, 0x39, 0x0d22, 0x00, 0x03f6, 0x0d, 0x0d04, 0x07, 0x03f3, 0x72, 0x03f4, 0xb8, 0x03f5, 0xbc, 0x0d02, 0x73, /*auto load start*/ 0x00c4, 0x00, 0x00c5, 0x01, 0x0af6, 0x00, 0x0ba0, 0x17, 0x0ba1, 0x00, 0x0ba2, 0x00, 0x0ba3, 0x00, 0x0ba4, 0x03, 0x0ba5, 0x00, 0x0ba6, 0x00, 0x0ba7, 0x00, 0x0ba8, 0x40, 0x0ba9, 0x00, 0x0baa, 0x00, 0x0bab, 0x00, 0x0bac, 0x40, 0x0bad, 0x00, 0x0bae, 0x00, 0x0baf, 0x00, 0x0bb0, 0x02, 0x0bb1, 0x00, 0x0bb2, 0x00, 0x0bb3, 0x00, 0x0bb8, 0x02, 0x0bb9, 0x00, 0x0bba, 0x00, 0x0bbb, 0x00, 0x0a70, 0x80, 0x0a71, 0x00, 0x0a72, 0x00, 0x0a66, 0x00, 0x0a67, 0x80, 0x0a4d, 0x4e, 0x0a50, 0x00, 0x0a4f, 0x0c, 0x0a66, 0x00, 0x00ca, 0x00, 0x00cb, 0x00, 0x00cc, 0x00, 0x00cd, 0x00, 0x0aa1, 0x00, 0x0aa2, 0xe0, 0x0aa3, 0x00, 0x0aa4, 0x40, 0x0a90, 0x03, 0x0a91, 0x0e, 0x0a94, 0x80, /*standby*/ 0x0af6, 0x20, 0x0b00, 0x91, 0x0b01, 0x17, 0x0b02, 0x01, 0x0b03, 0x00, 0x0b04, 0x01, 0x0b05, 0x17, 0x0b06, 0x01, 0x0b07, 0x00, 0x0ae9, 0x01, 0x0aea, 0x02, 0x0ae8, 0x53, 0x0ae8, 0x43, /*gain_partition*/ 0x0af6, 0x30, 0x0b00, 0x08, 0x0b01, 0x0f, 0x0b02, 0x00, 0x0b04, 0x1c, 0x0b05, 0x24, 0x0b06, 0x00, 0x0b08, 0x30, 0x0b09, 0x40, 0x0b0a, 0x00, 0x0b0c, 0x0e, 0x0b0d, 0x2a, 0x0b0e, 0x00, 0x0b10, 0x0e, 0x0b11, 0x2b, 0x0b12, 0x00, 0x0b14, 0x0e, 0x0b15, 0x23, 0x0b16, 0x00, 0x0b18, 0x0e, 0x0b19, 0x24, 0x0b1a, 0x00, 0x0b1c, 0x0c, 0x0b1d, 0x0c, 0x0b1e, 0x00, 0x0b20, 0x03, 0x0b21, 0x03, 0x0b22, 0x00, 0x0b24, 0x0e, 0x0b25, 0x0e, 0x0b26, 0x00, 0x0b28, 0x03, 0x0b29, 0x03, 0x0b2a, 0x00, 0x0b2c, 0x12, 0x0b2d, 0x12, 0x0b2e, 0x00, 0x0b30, 0x08, 0x0b31, 0x08, 0x0b32, 0x00, 0x0b34, 0x14, 0x0b35, 0x14, 0x0b36, 0x00, 0x0b38, 0x10, 0x0b39, 0x10, 0x0b3a, 0x00, 0x0b3c, 0x16, 0x0b3d, 0x16, 0x0b3e, 0x00, 0x0b40, 0x10, 0x0b41, 0x10, 0x0b42, 0x00, 0x0b44, 0x19, 0x0b45, 0x19, 0x0b46, 0x00, 0x0b48, 0x16, 0x0b49, 0x16, 0x0b4a, 0x00, 0x0b4c, 0x19, 0x0b4d, 0x19, 0x0b4e, 0x00, 0x0b50, 0x16, 0x0b51, 0x16, 0x0b52, 0x00, 0x0b80, 0x01, 0x0b81, 0x00, 0x0b82, 0x00, 0x0b84, 0x00, 0x0b85, 0x00, 0x0b86, 0x00, 0x0b88, 0x01, 0x0b89, 0x6a, 0x0b8a, 0x00, 0x0b8c, 0x00, 0x0b8d, 0x01, 0x0b8e, 0x00, 0x0b90, 0x01, 0x0b91, 0xf6, 0x0b92, 0x00, 0x0b94, 0x00, 0x0b95, 0x02, 0x0b96, 0x00, 0x0b98, 0x02, 0x0b99, 0xc4, 0x0b9a, 0x00, 0x0b9c, 0x00, 0x0b9d, 0x03, 0x0b9e, 0x00, 0x0ba0, 0x03, 0x0ba1, 0xd8, 0x0ba2, 0x00, 0x0ba4, 0x00, 0x0ba5, 0x04, 0x0ba6, 0x00, 0x0ba8, 0x05, 0x0ba9, 0x4d, 0x0baa, 0x00, 0x0bac, 0x00, 0x0bad, 0x05, 0x0bae, 0x00, 0x0bb0, 0x07, 0x0bb1, 0x3e, 0x0bb2, 0x00, 0x0bb4, 0x00, 0x0bb5, 0x06, 0x0bb6, 0x00, 0x0bb8, 0x0a, 0x0bb9, 0x1a, 0x0bba, 0x00, 0x0bbc, 0x09, 0x0bbd, 0x36, 0x0bbe, 0x00, 0x0bc0, 0x0e, 0x0bc1, 0x66, 0x0bc2, 0x00, 0x0bc4, 0x10, 0x0bc5, 0x06, 0x0bc6, 0x00, 0x02c1, 0xe0, 0x0207, 0x04, 0x02c2, 0x10, 0x02c3, 0x74, 0x02C5, 0x09, 0x02c1, 0xe0,//20221121 0x0207, 0x04, 0x02c2, 0x10, 0x02c5, 0x09, 0x02c1, 0xe0, 0x0207, 0x04, 0x02c2, 0x10, 0x02c5, 0x09, /*auto load CH_GAIN*/ 0x0aa1, 0x15, 0x0aa2, 0x50, 0x0aa3, 0x00, 0x0aa4, 0x09, 0x0a90, 0x25, 0x0a91, 0x0e, 0x0a94, 0x80, /*ISP*/ 0x0050, 0x00, 0x0089, 0x83, 0x005a, 0x40, 0x00c3, 0x35, 0x00c4, 0x80, 0x0080, 0x10, 0x0040, 0x12, 0x0053, 0x0a, 0x0054, 0x44, 0x0055, 0x32, 0x0058, 0x89, 0x004a, 0x03, 0x0048, 0xf0, 0x0049, 0x0f, 0x0041, 0x20, 0x0043, 0x0a, 0x009d, 0x08, 0x0236, 0x40, /*gain*/ 0x0204, 0x04, 0x0205, 0x00, 0x02b3, 0x00, 0x02b4, 0x00, 0x009e, 0x01, 0x009f, 0x94, /*OUT 2592x1944*/ 0x0350, 0x01, 0x0353, 0x00, 0x0354, 0x08, 0x034c, 0x0a, 0x034d, 0x20, 0x021f, 0x14, /*auto load REG*/ 0x0aa1, 0x10, 0x0aa2, 0xf8, 0x0aa3, 0x00, 0x0aa4, 0x1f, 0x0a90, 0x11, 0x0a91, 0x0e, 0x0a94, 0x80, 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00,//20221121 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00, 0x0a90, 0x00, 0x0a70, 0x00, 0x0a67, 0x00, 0x0af4, 0x29, /*DPHY */ 0x0d80, 0x07, 0x0dd3, 0x1c, /*MIPI*/ 0x0107, 0x05, 0x0117, 0x01, 0x0d81, 0x00, /*CISCTL_Reset*/ 0x031c, 0x80, 0x03fe, 0x30, 0x0d17, 0x06, 0x03fe, 0x00, 0x0d17, 0x00, 0x031c, 0x93, 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00, 0x031c, 0x80, 0x03fe, 0x30, 0x0d17, 0x06, 0x03fe, 0x00, 0x0d17, 0x00, 0x031c, 0x93, }; static kal_uint16 gc05a2_1296x972_addr_data[] = { /*system*/ 0x0315, 0xd4, 0x0d06, 0x01, 0x0a70, 0x80, 0x031a, 0x00, 0x0314, 0x00, 0x0130, 0x08, 0x0132, 0x01, 0x0135, 0x05, 0x0136, 0x38, 0x0137, 0x03, 0x0134, 0x5b, 0x031c, 0xe0, 0x0d82, 0x14, 0x0dd1, 0x56, /*gate_mode*/ 0x0af4, 0x01, 0x0002, 0x10, 0x00c3, 0x34, /*pre_setting*/ 0x0084, 0x21, 0x0d05, 0xcc, 0x0218, 0x80, 0x005e, 0x49, 0x0d06, 0x81, 0x0007, 0x16, /*analog */ 0x0342, 0x07, 0x0343, 0x10, 0x0220, 0x0f, 0x0221, 0xe0, 0x0202, 0x03, 0x0203, 0x32, 0x0340, 0x08, 0x0341, 0x10, 0x0346, 0x00, 0x0347, 0x04, 0x0d14, 0x00, 0x0d13, 0x05, 0x0d16, 0x05, 0x0d15, 0x1d, 0x00c0, 0x0a, 0x00c1, 0x30, 0x034a, 0x07, 0x034b, 0xa8, 0x000b, 0x0e, 0x0008, 0x03, 0x0223, 0x16, /*auto load DD*/ 0x00ca, 0x00, 0x00cb, 0x00, 0x00cc, 0x00, 0x00cd, 0x00, /*ISP*/ 0x00c3, 0x35, 0x0053, 0x0a, 0x0054, 0x44, 0x0055, 0x32, /*OUT 1296x972*/ 0x0350, 0x01, 0x0353, 0x00, 0x0354, 0x04, 0x034c, 0x05, 0x034d, 0x10, 0x021f, 0x14, /*MIPI*/ 0x0d84, 0x06, 0x0d85, 0x54, 0x0d86, 0x03, 0x0d87, 0x2b, 0x0db3, 0x03, 0x0db4, 0x04, 0x0db5, 0x0d, 0x0db6, 0x01, 0x0db8, 0x04, 0x0db9, 0x06, 0x0d93, 0x03, 0x0d94, 0x04, 0x0d95, 0x05, 0x0d99, 0x06, 0x0084, 0x01, /*CISCTL_Reset*/ 0x031c, 0x80, 0x03fe, 0x30, 0x0d17, 0x06, 0x03fe, 0x00, 0x0d17, 0x00, 0x031c, 0x93, 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00, 0x031c, 0x80, 0x03fe, 0x30, 0x0d17, 0x06, 0x03fe, 0x00, 0x0d17, 0x00, 0x031c, 0x93, /*OUT*/ 0x0110, 0x01, }; static kal_uint16 gc05a2_normal_video_addr_data[] = { /*system*/ 0x0315, 0xd4, 0x0d06, 0x01, 0x0a70, 0x80, 0x031a, 0x00, 0x0314, 0x00, 0x0130, 0x08, 0x0132, 0x01, 0x0135, 0x05, 0x0136, 0x38, 0x0137, 0x03, 0x0134, 0x5b, 0x031c, 0xe0, 0x0d82, 0x14, 0x0dd1, 0x56, /*gate_mode*/ 0x0af4, 0x01, 0x0002, 0x10, 0x00c3, 0x34, /*pre_setting*/ 0x0084, 0x21, 0x0d05, 0xcc, 0x0218, 0x80, 0x005e, 0x49, 0x0d06, 0x81, 0x0007, 0x16, /*analog */ 0x0342, 0x07, 0x0343, 0x10, 0x0220, 0x0f, 0x0221, 0xe0, 0x0202, 0x03, 0x0203, 0x32, 0x0340, 0x08, 0x0341, 0x10, 0x0346, 0x00, 0x0347, 0x04, 0x0d14, 0x00, 0x0d13, 0x05, 0x0d16, 0x05, 0x0d15, 0x1d, 0x00c0, 0x0a, 0x00c1, 0x30, 0x034a, 0x07, 0x034b, 0xa8, 0x000b, 0x0e, 0x0008, 0x03, 0x0223, 0x16, /*auto load DD*/ 0x00ca, 0x00, 0x00cb, 0x00, 0x00cc, 0x00, 0x00cd, 0x00, /*ISP*/ 0x00c3, 0x35, 0x0053, 0x0a, 0x0054, 0x44, 0x0055, 0x32, /*OUT 1296x972*/ 0x0350, 0x01, 0x0353, 0x00, 0x0354, 0x04, 0x034c, 0x05, 0x034d, 0x10, 0x021f, 0x14, /*MIPI*/ 0x0d84, 0x06, 0x0d85, 0x54, 0x0d86, 0x03, 0x0d87, 0x2b, 0x0db3, 0x03, 0x0db4, 0x04, 0x0db5, 0x0d, 0x0db6, 0x01, 0x0db8, 0x08, 0x0db9, 0x06, 0x0d93, 0x03, 0x0d94, 0x04, 0x0d95, 0x05, 0x0d99, 0x06, 0x0084, 0x01, /*CISCTL_Reset*/ 0x031c, 0x80, 0x03fe, 0x30, 0x0d17, 0x06, 0x03fe, 0x00, 0x0d17, 0x00, 0x031c, 0x93, 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00, 0x031c, 0x80, 0x03fe, 0x30, 0x0d17, 0x06, 0x03fe, 0x00, 0x0d17, 0x00, 0x031c, 0x93, /*OUT*/ 0x0110, 0x01, }; static kal_uint16 gc05a2_2592x1944_addr_data[] = { /*system*/ 0x0315, 0xd4, 0x0d06, 0x01, 0x0a70, 0x80, 0x031a, 0x00, 0x0314, 0x00, 0x0130, 0x08, 0x0132, 0x01, 0x0135, 0x01, 0x0136, 0x38, 0x0137, 0x03, 0x0134, 0x5b, 0x031c, 0xe0, 0x0d82, 0x14, 0x0dd1, 0x56, /*gate_mode*/ 0x0af4, 0x01, 0x0002, 0x10, 0x00c3, 0x34, /*pre_setting*/ 0x0084, 0x21, 0x0d05, 0xcc, 0x0218, 0x00, 0x005e, 0x48, 0x0d06, 0x01, 0x0007, 0x16, /*analog*/ 0x0342, 0x07, 0x0343, 0x28, 0x0220, 0x07, 0x0221, 0xd0, 0x0202, 0x07, 0x0203, 0x32, 0x0340, 0x07, 0x0341, 0xf0, 0x0346, 0x00, 0x0347, 0x04, 0x0d14, 0x00, 0x0d13, 0x05, 0x0d16, 0x05, 0x0d15, 0x1d, 0x00c0, 0x0a, 0x00c1, 0x30, 0x034a, 0x07, 0x034b, 0xa8, 0x000b, 0x10, 0x0008, 0x08, 0x0223, 0x17, /* auto load DD*/ 0x00ca, 0x00, 0x00cb, 0x00, 0x00cc, 0x00, 0x00cd, 0x00, /*ISP*/ 0x00c3, 0x35, 0x0053, 0x0a, 0x0054, 0x44, 0x0055, 0x32, /*OUT 2592x1944*/ 0x0350, 0x01, 0x0353, 0x00, 0x0354, 0x08, 0x034c, 0x0a, 0x034d, 0x20, 0x021f, 0x14, /*MIPI*/ 0x0d84, 0x0c, 0x0d85, 0xa8, 0x0d86, 0x06, 0x0d87, 0x55, 0x0db3, 0x06, 0x0db4, 0x08, 0x0db5, 0x1e, 0x0db6, 0x02, 0x0db8, 0x12, 0x0db9, 0x0a, 0x0d93, 0x06, 0x0d94, 0x09, 0x0d95, 0x0d, 0x0d99, 0x0b, 0x0084, 0x01, /* CISCTL_Reset*/ 0x031c, 0x80, 0x03fe, 0x30, 0x0d17, 0x06, 0x03fe, 0x00, 0x0d17, 0x00, 0x031c, 0x93, 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00, 0x031c, 0x80, 0x03fe, 0x30, 0x0d17, 0x06, 0x03fe, 0x00, 0x0d17, 0x00, 0x031c, 0x93, /*OUT*/ 0x0110, 0x01, }; static kal_uint16 gc05a2_1280x720_addr_data[] = { /*system*/ 0x0315, 0xd4, 0x0d06, 0x01, 0x0a70, 0x80, 0x031a, 0x00, 0x0314, 0x00, 0x0130, 0x08, 0x0132, 0x01, 0x0135, 0x05, 0x0136, 0x38, 0x0137, 0x03, 0x0134, 0x5b, 0x031c, 0xe0, 0x0d82, 0x14, 0x0dd1, 0x56, /*gate_mode*/ 0x0af4, 0x01, 0x0002, 0x10, 0x00c3, 0x34, /*pre_setting*/ 0x0084, 0x21, 0x0d05, 0xcc, 0x0218, 0x80, 0x005e, 0x49, 0x0d06, 0x81, 0x0007, 0x16, /*analog */ 0x0342, 0x07, 0x0343, 0x10, 0x0220, 0x07, 0x0221, 0xd0, 0x0202, 0x03, 0x0203, 0x32, 0x0340, 0x04, 0x0341, 0x08, 0x0346, 0x01, 0x0347, 0x00, 0x0d14, 0x00, 0x0d13, 0x05, 0x0d16, 0x05, 0x0d15, 0x1d, 0x00c0, 0x0a, 0x00c1, 0x30, 0x034a, 0x05, 0x034b, 0xb0, 0x000b, 0x0e, 0x0008, 0x03, 0x0223, 0x16, /*auto load DD*/ 0x00ca, 0x00, 0x00cb, 0xfc, 0x00cc, 0x00, 0x00cd, 0x00, /*ISP*/ 0x00c3, 0x35, 0x0053, 0x0a, 0x0054, 0x44, 0x0055, 0x32, /*OUT 1280x720*/ 0x0350, 0x01, 0x0353, 0x00, 0x0354, 0x0c, 0x034c, 0x05, 0x034d, 0x00, 0x021f, 0x14, /*MIPI*/ 0x0d84, 0x06, 0x0d85, 0x40, 0x0d86, 0x03, 0x0d87, 0x21, 0x0db3, 0x03, 0x0db4, 0x04, 0x0db5, 0x0d, 0x0db6, 0x01, 0x0db8, 0x04, 0x0db9, 0x06, 0x0d93, 0x03, 0x0d94, 0x04, 0x0d95, 0x05, 0x0d99, 0x06, 0x0084, 0x01, /*CISCTL_Reset*/ 0x031c, 0x80, 0x03fe, 0x30, 0x0d17, 0x06, 0x03fe, 0x00, 0x0d17, 0x00, 0x031c, 0x93, 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00, 0x031c, 0x80, 0x03fe, 0x30, 0x0d17, 0x06, 0x03fe, 0x00, 0x0d17, 0x00, 0x031c, 0x93, /*OUT*/ 0x0110, 0x01, }; static void gc05a2_stream_on(void) { write_cmos_sensor_8bit(0x0100, 0x01); } static void gc05a2_stream_off(void) { write_cmos_sensor_8bit(0x0100, 0x00); } static void sensor_init(void) { table_write_cmos_sensor(gc05a2_init_addr_data, sizeof(gc05a2_init_addr_data)/sizeof(kal_uint16)); } static void preview_setting(void) { gc05a2_stream_off(); table_write_cmos_sensor(gc05a2_1296x972_addr_data, sizeof(gc05a2_1296x972_addr_data)/sizeof(kal_uint16)); gc05a2_stream_on(); } static void capture_setting(void) { gc05a2_stream_off(); table_write_cmos_sensor(gc05a2_2592x1944_addr_data, sizeof(gc05a2_2592x1944_addr_data)/sizeof(kal_uint16)); gc05a2_stream_on(); } static void normal_video_setting(void) { gc05a2_stream_off(); table_write_cmos_sensor(gc05a2_normal_video_addr_data, sizeof(gc05a2_normal_video_addr_data)/sizeof(kal_uint16)); gc05a2_stream_on(); } static void hs_video_setting(void) { gc05a2_stream_off(); table_write_cmos_sensor(gc05a2_1296x972_addr_data, sizeof(gc05a2_1296x972_addr_data)/sizeof(kal_uint16)); gc05a2_stream_on(); } static void slim_video_setting(void) { gc05a2_stream_off(); table_write_cmos_sensor(gc05a2_1280x720_addr_data, sizeof(gc05a2_1280x720_addr_data)/sizeof(kal_uint16)); gc05a2_stream_on(); } static kal_uint32 set_test_pattern_mode(kal_bool enable) { LOG_INF("enable: %d\n", enable); if (enable){ write_cmos_sensor_8bit(0x008c, 0x01); write_cmos_sensor_8bit(0x008d, 0x00); } else { write_cmos_sensor_8bit(0x008c, 0x00); write_cmos_sensor_8bit(0x008d, 0x00); } printk("test_pattern 0x008c=%x 0x008d=%x",read_cmos_sensor(0x008c),read_cmos_sensor(0x008d)); spin_lock(&imgsensor_drv_lock); imgsensor.test_pattern = enable; spin_unlock(&imgsensor_drv_lock); return ERROR_NONE; } static kal_uint32 streaming_control(kal_bool enable) { printk("streaming_enable(0=Sw Standby,1=streaming): %d\n", enable); if (enable) { write_cmos_sensor(0x0100,0x01); mdelay(10);//delay 10ms } else { write_cmos_sensor(0x0100, 0x00); mdelay(10);//delay 10ms } //mdelay(10); return ERROR_NONE; } static void gc05a2_otp_init(void) { #if 1 write_cmos_sensor_8bit(0x031c, 0x60); write_cmos_sensor_8bit(0x0315, 0x80); write_cmos_sensor_8bit(0x0af4, 0x01); write_cmos_sensor_8bit(0x0af6, 0x00); write_cmos_sensor_8bit(0x0b90, 0x10); write_cmos_sensor_8bit(0x0b91, 0x00); write_cmos_sensor_8bit(0x0b92, 0x00); write_cmos_sensor_8bit(0x0ba0, 0x17); write_cmos_sensor_8bit(0x0ba1, 0x00); write_cmos_sensor_8bit(0x0ba2, 0x00); write_cmos_sensor_8bit(0x0ba4, 0x03); write_cmos_sensor_8bit(0x0ba5, 0x00); write_cmos_sensor_8bit(0x0ba6, 0x00); write_cmos_sensor_8bit(0x0ba8, 0x40); write_cmos_sensor_8bit(0x0ba9, 0x00); write_cmos_sensor_8bit(0x0baa, 0x00); write_cmos_sensor_8bit(0x0bac, 0x40); write_cmos_sensor_8bit(0x0bad, 0x00); write_cmos_sensor_8bit(0x0bae, 0x00); write_cmos_sensor_8bit(0x0bb0, 0x02); write_cmos_sensor_8bit(0x0bb1, 0x00); write_cmos_sensor_8bit(0x0bb2, 0x00); write_cmos_sensor_8bit(0x0bb8, 0x02); write_cmos_sensor_8bit(0x0bb9, 0x00); write_cmos_sensor_8bit(0x0bba, 0x00); write_cmos_sensor_8bit(0x0a70, 0x80); write_cmos_sensor_8bit(0x0a71, 0x00); write_cmos_sensor_8bit(0x0a72, 0x00); write_cmos_sensor_8bit(0x0a66, 0x00); write_cmos_sensor_8bit(0x0a67, 0x84); write_cmos_sensor_8bit(0x0a4d, 0x0e); write_cmos_sensor_8bit(0x0a45, 0x02); write_cmos_sensor_8bit(0x0a47, 0x02); write_cmos_sensor_8bit(0x0a50, 0x00); write_cmos_sensor_8bit(0x0a4f, 0x0c); #else //write_cmos_sensor(0x031c, 0x60); //write_cmos_sensor(0x0315, 0x80); //write_cmos_sensor(0x0af4, 0x01); write_cmos_sensor(0x0af6, 0x00); write_cmos_sensor(0x0b90, 0x10); write_cmos_sensor(0x0b91, 0x00); write_cmos_sensor(0x0b92, 0x00); write_cmos_sensor(0x0ba0, 0x17); write_cmos_sensor(0x0ba1, 0x00); write_cmos_sensor(0x0ba2, 0x00); write_cmos_sensor(0x0ba4, 0x03); write_cmos_sensor(0x0ba5, 0x00); write_cmos_sensor(0x0ba6, 0x00); write_cmos_sensor(0x0ba8, 0x40); write_cmos_sensor(0x0ba9, 0x00); write_cmos_sensor(0x0baa, 0x00); write_cmos_sensor(0x0bac, 0x40); write_cmos_sensor(0x0bad, 0x00); write_cmos_sensor(0x0bae, 0x00); write_cmos_sensor(0x0bb0, 0x02); write_cmos_sensor(0x0bb1, 0x00); write_cmos_sensor(0x0bb2, 0x00); write_cmos_sensor(0x0bb8, 0x02); write_cmos_sensor(0x0bb9, 0x00); write_cmos_sensor(0x0bba, 0x00); write_cmos_sensor(0x0a70, 0x80); write_cmos_sensor(0x0a71, 0x00); write_cmos_sensor(0x0a72, 0x00); write_cmos_sensor(0x0a66, 0x00); write_cmos_sensor(0x0a67, 0x84); write_cmos_sensor(0x0a4d, 0x0e); write_cmos_sensor(0x0a45, 0x02); write_cmos_sensor(0x0a47, 0x02); write_cmos_sensor(0x0a50, 0x00); write_cmos_sensor(0x0a4f, 0x0c); #endif mdelay(10); } static void gc05a2_otp_close(void) { #if 1 write_cmos_sensor_8bit(0x0a70, 0x00); write_cmos_sensor_8bit(0x0a67, 0x00); #else write_cmos_sensor(0x0a70, 0x00); write_cmos_sensor(0x0a67, 0x00); #endif } #if 0 static u16 gc05a2_otp_read_group(u16 addr, u8 *data, u16 length) { u16 i = 0; #if 1 //write_cmos_sensor_8bit(0x0a67, 0x84); write_cmos_sensor_8bit(0x0a69, (addr >> 8) & 0xff); write_cmos_sensor_8bit(0x0a6a, addr & 0xff); write_cmos_sensor_8bit(0x0a66, 0x20); write_cmos_sensor_8bit(0x0a66, 0x12); #else write_cmos_sensor(0x0a69, (addr >> 8) & 0xff); write_cmos_sensor(0x0a6a, addr & 0xff); write_cmos_sensor(0x0a66, 0x20); write_cmos_sensor(0x0a66, 0x12); #endif for (i = 0; i < length; i++) { data[i] = read_cmos_sensor(0x0a6c); printk("addr = 0x%x, data = 0x%x\n", addr + i * 8, data[i]); } return 0; } #else static u16 gc05a2_otp_read_single(u16 addr, u8 *data, u16 length) { int result = 0; u16 i = 8; for (i = 8; i < length; i++) { write_cmos_sensor_8bit(0x0a69, (addr >> 8) & 0xff); write_cmos_sensor_8bit(0x0a6a, addr & 0xff); write_cmos_sensor_8bit(0x0a66, 0x20); data[i] = read_cmos_sensor(0x0a6c); addr = addr + 8; #if GC05A2_SN_DEBUG printk("kernel addr = 0x%x, data = 0x%x\n", addr, data[i]); #endif } /* Manufacturer Code */ if (data[8] == 0) result = -1; return result; } #endif static void gc05a2_iReadData(unsigned int ui4_offset, unsigned int ui4_length, unsigned char *pinputdata) { int i4RetValue = 0; printk("gc05a2 otp ui4_offset = 0x%x, ui4_length = %d \n", ui4_offset, ui4_length); gc05a2_otp_init(); mdelay(10); i4RetValue = gc05a2_otp_read_single(ui4_offset, pinputdata, ui4_length); // gc05a2_common_data = pinputdata; if (i4RetValue != 0) { printk("I2C iReadData failed!!\n"); } gc05a2_otp_close(); } // static inkal_uint32t gc05a2madrid_sensor_otp_read_flag() { // } // static kal_uint32 gc05a2madrid_sensor_otp_set_flag() { // } // static kal_uint32 gc05a2madrid_sensor_otp_read_sn() { // } static kal_uint32 get_imgsensor_id(UINT32 *sensor_id) { kal_uint8 i = 0; kal_uint8 retry = 2; gc05a2_iReadData(SN_OFFSET,SN_LENGTH,gc05a2_common_data); while (imgsensor_info.i2c_addr_table[i] != 0xff) { spin_lock(&imgsensor_drv_lock); imgsensor.i2c_write_id = imgsensor_info.i2c_addr_table[i]; spin_unlock(&imgsensor_drv_lock); do { *sensor_id = return_sensor_id() + SENSOR_ID_OFFSET_MADRID; gc05a2_iReadData(SN_OFFSET,SN_LENGTH,gc05a2_common_data); if (*sensor_id == imgsensor_info.sensor_id) { pr_debug("[gc05a2_camera_sensor]get_imgsensor_id:i2c write id: 0x%x, sensor id: 0x%x\n", imgsensor.i2c_write_id, *sensor_id); gc05a2madrid_sensor_otp_read_sn(); return ERROR_NONE; } pr_debug("[gc05a2_camera_sensor]get_imgsensor_id:Read sensor id fail, write id: 0x%x, id: 0x%x\n", imgsensor.i2c_write_id, *sensor_id); retry--; } while (retry > 0); i++; retry = 2; } if (*sensor_id != imgsensor_info.sensor_id) { /* if Sensor ID is not correct, Must set *sensor_id to 0xFFFFFFFF */ *sensor_id = 0xFFFFFFFF; return ERROR_SENSOR_CONNECT_FAIL; } return ERROR_NONE; } static kal_uint32 open(void) { kal_uint8 i = 0; kal_uint8 retry = 2; kal_uint32 sensor_id = 0; LOG_1; LOG_INF("imgsensor_open\n"); while (imgsensor_info.i2c_addr_table[i] != 0xff) { spin_lock(&imgsensor_drv_lock); imgsensor.i2c_write_id = imgsensor_info.i2c_addr_table[i]; spin_unlock(&imgsensor_drv_lock); do { sensor_id = return_sensor_id() + SENSOR_ID_OFFSET_MADRID; if (sensor_id == imgsensor_info.sensor_id) { pr_debug("[gc05a2_camera_sensor]open:i2c write id: 0x%x, sensor id: 0x%x\n", imgsensor.i2c_write_id, sensor_id); break; } pr_debug("[gc05a2_camera_sensor]open:Read sensor id fail, write id: 0x%x, id: 0x%x\n", imgsensor.i2c_write_id, sensor_id); retry--; } while (retry > 0); i++; if (sensor_id == imgsensor_info.sensor_id) break; retry = 2; } if (imgsensor_info.sensor_id != sensor_id) return ERROR_SENSOR_CONNECT_FAIL; /* initail sequence write in */ sensor_init(); spin_lock(&imgsensor_drv_lock); imgsensor.autoflicker_en = KAL_FALSE; imgsensor.sensor_mode = IMGSENSOR_MODE_INIT; imgsensor.pclk = imgsensor_info.pre.pclk; imgsensor.frame_length = imgsensor_info.pre.framelength; imgsensor.line_length = imgsensor_info.pre.linelength; imgsensor.min_frame_length = imgsensor_info.pre.framelength; imgsensor.dummy_pixel = 0; imgsensor.dummy_line = 0; imgsensor.ihdr_en = 0; imgsensor.test_pattern = KAL_FALSE; imgsensor.current_fps = imgsensor_info.pre.max_framerate; spin_unlock(&imgsensor_drv_lock); return ERROR_NONE; } static kal_uint32 close(void) { LOG_INF("E\n"); /* No Need to implement this function */ streaming_control(KAL_FALSE); return ERROR_NONE; } static kal_uint32 preview(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) { LOG_INF("E\n"); spin_lock(&imgsensor_drv_lock); imgsensor.sensor_mode = IMGSENSOR_MODE_PREVIEW; imgsensor.pclk = imgsensor_info.pre.pclk; /* imgsensor.video_mode = KAL_FALSE; */ imgsensor.line_length = imgsensor_info.pre.linelength; imgsensor.frame_length = imgsensor_info.pre.framelength; imgsensor.min_frame_length = imgsensor_info.pre.framelength; imgsensor.autoflicker_en = KAL_TRUE; spin_unlock(&imgsensor_drv_lock); preview_setting(); return ERROR_NONE; } static kal_uint32 capture(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) { LOG_INF("E\n"); spin_lock(&imgsensor_drv_lock); imgsensor.sensor_mode = IMGSENSOR_MODE_CAPTURE; if (imgsensor.current_fps != imgsensor_info.cap.max_framerate) LOG_INF("Warning: current_fps %d fps is not support, so use cap&#39;s setting: %d fps!\n", imgsensor.current_fps, imgsensor_info.cap.max_framerate / 10); imgsensor.pclk = imgsensor_info.cap.pclk; imgsensor.line_length = imgsensor_info.cap.linelength; imgsensor.frame_length = imgsensor_info.cap.framelength; imgsensor.min_frame_length = imgsensor_info.cap.framelength; imgsensor.autoflicker_en = KAL_TRUE; spin_unlock(&imgsensor_drv_lock); capture_setting(); return ERROR_NONE; } static kal_uint32 normal_video(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) { LOG_INF("E\n"); spin_lock(&imgsensor_drv_lock); imgsensor.sensor_mode = IMGSENSOR_MODE_VIDEO; imgsensor.pclk = imgsensor_info.normal_video.pclk; imgsensor.line_length = imgsensor_info.normal_video.linelength; imgsensor.frame_length = imgsensor_info.normal_video.framelength; imgsensor.min_frame_length = imgsensor_info.normal_video.framelength; /*imgsensor.current_fps = 300*/ imgsensor.autoflicker_en = KAL_TRUE; spin_unlock(&imgsensor_drv_lock); normal_video_setting(); return ERROR_NONE; } static kal_uint32 hs_video(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) { LOG_INF("E\n"); spin_lock(&imgsensor_drv_lock); imgsensor.sensor_mode = IMGSENSOR_MODE_HIGH_SPEED_VIDEO; imgsensor.pclk = imgsensor_info.hs_video.pclk; /* imgsensor.video_mode = KAL_TRUE; */ imgsensor.line_length = imgsensor_info.hs_video.linelength; imgsensor.frame_length = imgsensor_info.hs_video.framelength; imgsensor.min_frame_length = imgsensor_info.hs_video.framelength; imgsensor.dummy_line = 0; imgsensor.dummy_pixel = 0; imgsensor.autoflicker_en = KAL_TRUE; spin_unlock(&imgsensor_drv_lock); hs_video_setting(); return ERROR_NONE; } static kal_uint32 slim_video(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) { LOG_INF("E\n"); spin_lock(&imgsensor_drv_lock); imgsensor.sensor_mode = IMGSENSOR_MODE_SLIM_VIDEO; imgsensor.pclk = imgsensor_info.slim_video.pclk; imgsensor.line_length = imgsensor_info.slim_video.linelength; imgsensor.frame_length = imgsensor_info.slim_video.framelength; imgsensor.min_frame_length = imgsensor_info.slim_video.framelength; imgsensor.dummy_line = 0; imgsensor.dummy_pixel = 0; imgsensor.autoflicker_en = KAL_TRUE; spin_unlock(&imgsensor_drv_lock); slim_video_setting(); return ERROR_NONE; } static kal_uint32 get_resolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *sensor_resolution) { LOG_INF("E\n"); sensor_resolution->SensorFullWidth = imgsensor_info.cap.grabwindow_width; sensor_resolution->SensorFullHeight = imgsensor_info.cap.grabwindow_height; sensor_resolution->SensorPreviewWidth = imgsensor_info.pre.grabwindow_width; sensor_resolution->SensorPreviewHeight = imgsensor_info.pre.grabwindow_height; sensor_resolution->SensorVideoWidth = imgsensor_info.normal_video.grabwindow_width; sensor_resolution->SensorVideoHeight = imgsensor_info.normal_video.grabwindow_height; sensor_resolution->SensorHighSpeedVideoWidth = imgsensor_info.hs_video.grabwindow_width; sensor_resolution->SensorHighSpeedVideoHeight = imgsensor_info.hs_video.grabwindow_height; sensor_resolution->SensorSlimVideoWidth = imgsensor_info.slim_video.grabwindow_width; sensor_resolution->SensorSlimVideoHeight = imgsensor_info.slim_video.grabwindow_height; return ERROR_NONE; } static kal_uint32 get_info(enum MSDK_SCENARIO_ID_ENUM scenario_id, MSDK_SENSOR_INFO_STRUCT *sensor_info, MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) { LOG_INF("scenario_id = %d\n", scenario_id); sensor_info->SensorClockPolarity = SENSOR_CLOCK_POLARITY_LOW; sensor_info->SensorClockFallingPolarity = SENSOR_CLOCK_POLARITY_LOW; /* not use */ sensor_info->SensorHsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; /* inverse with datasheet */ sensor_info->SensorVsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; sensor_info->SensorInterruptDelayLines = 4; /* not use */ sensor_info->SensorResetActiveHigh = FALSE; /* not use */ sensor_info->SensorResetDelayCount = 5; /* not use */ sensor_info->SensroInterfaceType = imgsensor_info.sensor_interface_type; sensor_info->MIPIsensorType = imgsensor_info.mipi_sensor_type; sensor_info->SettleDelayMode = imgsensor_info.mipi_settle_delay_mode; sensor_info->SensorOutputDataFormat = imgsensor_info.sensor_output_dataformat; sensor_info->CaptureDelayFrame = imgsensor_info.cap_delay_frame; sensor_info->PreviewDelayFrame = imgsensor_info.pre_delay_frame; sensor_info->VideoDelayFrame = imgsensor_info.video_delay_frame; sensor_info->HighSpeedVideoDelayFrame = imgsensor_info.hs_video_delay_frame; sensor_info->SlimVideoDelayFrame = imgsensor_info.slim_video_delay_frame; sensor_info->SensorMasterClockSwitch = 0; /* not use */ sensor_info->SensorDrivingCurrent = imgsensor_info.isp_driving_current; sensor_info->AEShutDelayFrame = imgsensor_info.ae_shut_delay_frame; sensor_info->AESensorGainDelayFrame = imgsensor_info.ae_sensor_gain_delay_frame; sensor_info->AEISPGainDelayFrame = imgsensor_info.ae_ispGain_delay_frame; sensor_info->IHDR_Support = imgsensor_info.ihdr_support; sensor_info->IHDR_LE_FirstLine = imgsensor_info.ihdr_le_firstline; sensor_info->SensorModeNum = imgsensor_info.sensor_mode_num; sensor_info->SensorMIPILaneNumber = imgsensor_info.mipi_lane_num; sensor_info->SensorClockFreq = imgsensor_info.mclk; sensor_info->SensorClockDividCount = 3; /* not use */ sensor_info->SensorClockRisingCount = 0; sensor_info->SensorClockFallingCount = 2; /* not use */ sensor_info->SensorPixelClockCount = 3; /* not use */ sensor_info->SensorDataLatchCount = 2; /* not use */ sensor_info->MIPIDataLowPwr2HighSpeedTermDelayCount = 0; sensor_info->MIPICLKLowPwr2HighSpeedTermDelayCount = 0; sensor_info->SensorWidthSampling = 0; /* 0 is default 1x */ sensor_info->SensorHightSampling = 0; /* 0 is default 1x */ sensor_info->SensorPacketECCOrder = 1; switch (scenario_id) { case MSDK_SCENARIO_ID_CAMERA_PREVIEW: sensor_info->SensorGrabStartX = imgsensor_info.pre.startx; sensor_info->SensorGrabStartY = imgsensor_info.pre.starty; sensor_info->MIPIDataLowPwr2HighSpeedSettleDelayCount = imgsensor_info.pre.mipi_data_lp2hs_settle_dc; break; case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: sensor_info->SensorGrabStartX = imgsensor_info.cap.startx; sensor_info->SensorGrabStartY = imgsensor_info.cap.starty; sensor_info->MIPIDataLowPwr2HighSpeedSettleDelayCount = imgsensor_info.cap.mipi_data_lp2hs_settle_dc; break; case MSDK_SCENARIO_ID_VIDEO_PREVIEW: sensor_info->SensorGrabStartX = imgsensor_info.normal_video.startx; sensor_info->SensorGrabStartY = imgsensor_info.normal_video.starty; sensor_info->MIPIDataLowPwr2HighSpeedSettleDelayCount = imgsensor_info.normal_video.mipi_data_lp2hs_settle_dc; break; case MSDK_SCENARIO_ID_HIGH_SPEED_VIDEO: sensor_info->SensorGrabStartX = imgsensor_info.hs_video.startx; sensor_info->SensorGrabStartY = imgsensor_info.hs_video.starty; sensor_info->MIPIDataLowPwr2HighSpeedSettleDelayCount = imgsensor_info.hs_video.mipi_data_lp2hs_settle_dc; break; case MSDK_SCENARIO_ID_SLIM_VIDEO: sensor_info->SensorGrabStartX = imgsensor_info.slim_video.startx; sensor_info->SensorGrabStartY = imgsensor_info.slim_video.starty; sensor_info->MIPIDataLowPwr2HighSpeedSettleDelayCount = imgsensor_info.slim_video.mipi_data_lp2hs_settle_dc; break; default: sensor_info->SensorGrabStartX = imgsensor_info.pre.startx; sensor_info->SensorGrabStartY = imgsensor_info.pre.starty; sensor_info->MIPIDataLowPwr2HighSpeedSettleDelayCount = imgsensor_info.pre.mipi_data_lp2hs_settle_dc; break; } return ERROR_NONE; } static kal_uint32 control(enum MSDK_SCENARIO_ID_ENUM scenario_id, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) { LOG_INF("scenario_id = %d\n", scenario_id); spin_lock(&imgsensor_drv_lock); imgsensor.current_scenario_id = scenario_id; spin_unlock(&imgsensor_drv_lock); switch (scenario_id) { case MSDK_SCENARIO_ID_CAMERA_PREVIEW: preview(image_window, sensor_config_data); break; case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: capture(image_window, sensor_config_data); break; case MSDK_SCENARIO_ID_VIDEO_PREVIEW: normal_video(image_window, sensor_config_data); break; case MSDK_SCENARIO_ID_HIGH_SPEED_VIDEO: hs_video(image_window, sensor_config_data); break; case MSDK_SCENARIO_ID_SLIM_VIDEO: slim_video(image_window, sensor_config_data); break; default: LOG_INF("Error ScenarioId setting"); preview(image_window, sensor_config_data); return ERROR_INVALID_SCENARIO_ID; } return ERROR_NONE; } static kal_uint32 set_video_mode(UINT16 framerate) { /*This Function not used after ROME*/ LOG_INF("framerate = %d\n ", framerate); /* SetVideoMode Function should fix framerate */ /*********** *if (framerate == 0) //Dynamic frame rate * return ERROR_NONE; *spin_lock(&imgsensor_drv_lock); *if ((framerate == 300) && (imgsensor.autoflicker_en == KAL_TRUE)) * imgsensor.current_fps = 296; *else if ((framerate == 150) && (imgsensor.autoflicker_en == KAL_TRUE)) * imgsensor.current_fps = 146; *else * imgsensor.current_fps = framerate; *spin_unlock(&imgsensor_drv_lock); *set_max_framerate(imgsensor.current_fps, 1); ********/ return ERROR_NONE; } static kal_uint32 set_auto_flicker_mode(kal_bool enable, UINT16 framerate) { LOG_INF("enable = %d, framerate = %d\n", enable, framerate); spin_lock(&imgsensor_drv_lock); if (enable) /* enable auto flicker */ imgsensor.autoflicker_en = KAL_TRUE; else /* Cancel Auto flick */ imgsensor.autoflicker_en = KAL_FALSE; spin_unlock(&imgsensor_drv_lock); return ERROR_NONE; } static kal_uint32 set_max_framerate_by_scenario(enum MSDK_SCENARIO_ID_ENUM scenario_id, MUINT32 framerate) { kal_uint32 frame_length; LOG_INF("scenario_id = %d, framerate = %d\n", scenario_id, framerate); switch (scenario_id) { case MSDK_SCENARIO_ID_CAMERA_PREVIEW: frame_length = imgsensor_info.pre.pclk / framerate * 10 / imgsensor_info.pre.linelength; spin_lock(&imgsensor_drv_lock); imgsensor.dummy_line = (frame_length > imgsensor_info.pre.framelength) ? (frame_length - imgsensor_info.pre.framelength) : 0; imgsensor.frame_length = imgsensor_info.pre.framelength + imgsensor.dummy_line; imgsensor.min_frame_length = imgsensor.frame_length; spin_unlock(&imgsensor_drv_lock); set_dummy(); break; case MSDK_SCENARIO_ID_VIDEO_PREVIEW: if (framerate == 0) return ERROR_NONE; frame_length = imgsensor_info.normal_video.pclk / framerate * 10 / imgsensor_info.normal_video.linelength; spin_lock(&imgsensor_drv_lock); imgsensor.dummy_line = (frame_length > imgsensor_info.normal_video.framelength) ? (frame_length - imgsensor_info.normal_video.framelength) : 0; imgsensor.frame_length = imgsensor_info.normal_video.framelength + imgsensor.dummy_line; imgsensor.min_frame_length = imgsensor.frame_length; spin_unlock(&imgsensor_drv_lock); set_dummy(); break; case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: if (imgsensor.current_fps != imgsensor_info.cap.max_framerate) LOG_INF("Warning: current_fps %d fps is not support, so use cap&#39;s setting: %d fps!\n", framerate, imgsensor_info.cap.max_framerate / 10); frame_length = imgsensor_info.cap.pclk / framerate * 10 / imgsensor_info.cap.linelength; spin_lock(&imgsensor_drv_lock); imgsensor.dummy_line = (frame_length > imgsensor_info.cap.framelength) ? (frame_length - imgsensor_info.cap.framelength) : 0; imgsensor.frame_length = imgsensor_info.cap.framelength + imgsensor.dummy_line; imgsensor.min_frame_length = imgsensor.frame_length; spin_unlock(&imgsensor_drv_lock); set_dummy(); break; case MSDK_SCENARIO_ID_HIGH_SPEED_VIDEO: frame_length = imgsensor_info.hs_video.pclk / framerate * 10 / imgsensor_info.hs_video.linelength; spin_lock(&imgsensor_drv_lock); imgsensor.dummy_line = (frame_length > imgsensor_info.hs_video.framelength) ? (frame_length - imgsensor_info.hs_video.framelength) : 0; imgsensor.frame_length = imgsensor_info.hs_video.framelength + imgsensor.dummy_line; imgsensor.min_frame_length = imgsensor.frame_length; spin_unlock(&imgsensor_drv_lock); set_dummy(); break; case MSDK_SCENARIO_ID_SLIM_VIDEO: frame_length = imgsensor_info.slim_video.pclk / framerate * 10 / imgsensor_info.slim_video.linelength; spin_lock(&imgsensor_drv_lock); imgsensor.dummy_line = (frame_length > imgsensor_info.slim_video.framelength) ? (frame_length - imgsensor_info.slim_video.framelength) : 0; imgsensor.frame_length = imgsensor_info.slim_video.framelength + imgsensor.dummy_line; imgsensor.min_frame_length = imgsensor.frame_length; spin_unlock(&imgsensor_drv_lock); set_dummy(); break; default: frame_length = imgsensor_info.pre.pclk / framerate * 10 / imgsensor_info.pre.linelength; spin_lock(&imgsensor_drv_lock); imgsensor.dummy_line = (frame_length > imgsensor_info.pre.framelength) ? (frame_length - imgsensor_info.pre.framelength) : 0; imgsensor.frame_length = imgsensor_info.pre.framelength + imgsensor.dummy_line; imgsensor.min_frame_length = imgsensor.frame_length; spin_unlock(&imgsensor_drv_lock); set_dummy(); LOG_INF("error scenario_id = %d, we use preview scenario\n", scenario_id); break; } return ERROR_NONE; } static kal_uint32 get_default_framerate_by_scenario(enum MSDK_SCENARIO_ID_ENUM scenario_id, MUINT32 *framerate) { LOG_INF("scenario_id = %d\n", scenario_id); switch (scenario_id) { case MSDK_SCENARIO_ID_CAMERA_PREVIEW: *framerate = imgsensor_info.pre.max_framerate; break; case MSDK_SCENARIO_ID_VIDEO_PREVIEW: *framerate = imgsensor_info.normal_video.max_framerate; break; case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: *framerate = imgsensor_info.cap.max_framerate; break; case MSDK_SCENARIO_ID_HIGH_SPEED_VIDEO: *framerate = imgsensor_info.hs_video.max_framerate; break; case MSDK_SCENARIO_ID_SLIM_VIDEO: *framerate = imgsensor_info.slim_video.max_framerate; break; default: break; } return ERROR_NONE; } static kal_uint32 feature_control(MSDK_SENSOR_FEATURE_ENUM feature_id, UINT8 *feature_para, UINT32 *feature_para_len) { UINT16 *feature_return_para_16 = (UINT16 *)feature_para; UINT16 *feature_data_16 = (UINT16 *)feature_para; UINT32 *feature_return_para_32 = (UINT32 *)feature_para; UINT32 *feature_data_32 = (UINT32 *)feature_para; unsigned long long *feature_data = (unsigned long long *)feature_para; struct SENSOR_WINSIZE_INFO_STRUCT *wininfo; MSDK_SENSOR_REG_INFO_STRUCT *sensor_reg_data = (MSDK_SENSOR_REG_INFO_STRUCT *)feature_para; LOG_INF("feature_id = %d\n", feature_id); switch (feature_id) { case SENSOR_FEATURE_GET_PERIOD: *feature_return_para_16++ = imgsensor.line_length; *feature_return_para_16 = imgsensor.frame_length; *feature_para_len = 4; break; case SENSOR_FEATURE_GET_PIXEL_CLOCK_FREQ: *feature_return_para_32 = imgsensor.pclk; *feature_para_len = 4; break; case SENSOR_FEATURE_GET_MIPI_PIXEL_RATE: { kal_uint32 rate; switch (*feature_data) { case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: rate = imgsensor_info.cap.mipi_pixel_rate; break; case MSDK_SCENARIO_ID_VIDEO_PREVIEW: rate = imgsensor_info.normal_video.mipi_pixel_rate; break; case MSDK_SCENARIO_ID_HIGH_SPEED_VIDEO: rate = imgsensor_info.hs_video.mipi_pixel_rate; break; case MSDK_SCENARIO_ID_SLIM_VIDEO: rate = imgsensor_info.slim_video.mipi_pixel_rate; break; case MSDK_SCENARIO_ID_CAMERA_PREVIEW: default: rate = imgsensor_info.pre.mipi_pixel_rate; break; } *(MUINT32 *)(uintptr_t)(*(feature_data + 1)) = rate; } break; case SENSOR_FEATURE_SET_ESHUTTER: set_shutter(*feature_data); break; case SENSOR_FEATURE_SET_NIGHTMODE: night_mode((BOOL)*feature_data); break; case SENSOR_FEATURE_SET_GAIN: set_gain((UINT16)*feature_data); break; case SENSOR_FEATURE_SET_FLASHLIGHT: break; case SENSOR_FEATURE_SET_ISP_MASTER_CLOCK_FREQ: break; case SENSOR_FEATURE_SET_REGISTER: write_cmos_sensor_8bit(sensor_reg_data->RegAddr, sensor_reg_data->RegData); break; case SENSOR_FEATURE_GET_REGISTER: sensor_reg_data->RegData = read_cmos_sensor(sensor_reg_data->RegAddr); LOG_INF("adb_i2c_read 0x%x = 0x%x\n", sensor_reg_data->RegAddr, sensor_reg_data->RegData); break; case SENSOR_FEATURE_GET_LENS_DRIVER_ID: /* get the lens driver ID from EEPROM or just return LENS_DRIVER_ID_DO_NOT_CARE */ /* if EEPROM does not exist in camera module. */ *feature_return_para_32 = LENS_DRIVER_ID_DO_NOT_CARE; *feature_para_len = 4; break; case SENSOR_FEATURE_SET_VIDEO_MODE: set_video_mode(*feature_data); break; case SENSOR_FEATURE_CHECK_SENSOR_ID: get_imgsensor_id(feature_return_para_32); break; case SENSOR_FEATURE_SET_AUTO_FLICKER_MODE: set_auto_flicker_mode((BOOL)*feature_data_16, *(feature_data_16 + 1)); break; case SENSOR_FEATURE_SET_MAX_FRAME_RATE_BY_SCENARIO: set_max_framerate_by_scenario((enum MSDK_SCENARIO_ID_ENUM)*feature_data, *(feature_data + 1)); break; case SENSOR_FEATURE_GET_DEFAULT_FRAME_RATE_BY_SCENARIO: get_default_framerate_by_scenario((enum MSDK_SCENARIO_ID_ENUM)*(feature_data), (MUINT32 *)(uintptr_t)(*(feature_data + 1))); break; case SENSOR_FEATURE_SET_TEST_PATTERN: set_test_pattern_mode((BOOL)*feature_data); break; case SENSOR_FEATURE_GET_TEST_PATTERN_CHECKSUM_VALUE: *feature_return_para_32 = imgsensor_info.checksum_value; *feature_para_len = 4; break; case SENSOR_FEATURE_SET_FRAMERATE: LOG_INF("current fps: %d\n", (UINT32)*feature_data); spin_lock(&imgsensor_drv_lock); imgsensor.current_fps = *feature_data; spin_unlock(&imgsensor_drv_lock); break; case SENSOR_FEATURE_SET_HDR: LOG_INF("ihdr enable: %d\n", (BOOL)*feature_data); spin_lock(&imgsensor_drv_lock); imgsensor.ihdr_en = (BOOL)*feature_data; spin_unlock(&imgsensor_drv_lock); break; case SENSOR_FEATURE_GET_EEPROM_COMDATA: memcpy(feature_return_para_32, gc05a2_common_data, CAMERA_EEPPROM_COMDATA_LENGTH); *feature_para_len = CAMERA_EEPPROM_COMDATA_LENGTH; break; case SENSOR_FEATURE_GET_CROP_INFO: LOG_INF("SENSOR_FEATURE_GET_CROP_INFO scenarioId: %d\n", (UINT32)*feature_data); wininfo = (struct SENSOR_WINSIZE_INFO_STRUCT *)(uintptr_t)(*(feature_data + 1)); switch (*feature_data_32) { case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: memcpy((void *)wininfo, (void *)&imgsensor_winsize_info[1], sizeof(struct SENSOR_WINSIZE_INFO_STRUCT)); break; case MSDK_SCENARIO_ID_VIDEO_PREVIEW: memcpy((void *)wininfo, (void *)&imgsensor_winsize_info[2], sizeof(struct SENSOR_WINSIZE_INFO_STRUCT)); break; case MSDK_SCENARIO_ID_HIGH_SPEED_VIDEO: memcpy((void *)wininfo, (void *)&imgsensor_winsize_info[3], sizeof(struct SENSOR_WINSIZE_INFO_STRUCT)); break; case MSDK_SCENARIO_ID_SLIM_VIDEO: memcpy((void *)wininfo, (void *)&imgsensor_winsize_info[4], sizeof(struct SENSOR_WINSIZE_INFO_STRUCT)); break; case MSDK_SCENARIO_ID_CAMERA_PREVIEW: default: memcpy((void *)wininfo, (void *)&imgsensor_winsize_info[0], sizeof(struct SENSOR_WINSIZE_INFO_STRUCT)); break; } break; case SENSOR_FEATURE_SET_IHDR_SHUTTER_GAIN: LOG_INF("SENSOR_SET_SENSOR_IHDR LE = %d, SE = %d, Gain = %d\n", (UINT16)*feature_data, (UINT16)*(feature_data + 1), (UINT16)*(feature_data + 2)); ihdr_write_shutter_gain((UINT16)*feature_data, (UINT16)*(feature_data + 1), (UINT16)*(feature_data + 2)); break; default: break; } return ERROR_NONE; } static struct SENSOR_FUNCTION_STRUCT sensor_func = { open, get_info, get_resolution, feature_control, control, close }; UINT32 GC05A2_MIPI_RAW_MADRID_SensorInit(struct SENSOR_FUNCTION_STRUCT **pfFunc) { /* Check Sensor status here */ if (pfFunc != NULL) *pfFunc = &sensor_func; return ERROR_NONE; } 修改代码,要读sn号
11-07
#include<p30f6015.h> #include<sinabc.h> #include<can.h> #define BITRATE 10000 // 10kbps #define NTQ 16 // Number of Tq cycles which will make the //CAN Bit Timing . #define BRP_VAL ((FCY/(2*NTQ*BITRATE))-1) //Formulae used for C1CFG1bits.BRP #define CAN_RX_AS_IN() {TRISFbits.TRISF0=1;} // #define CAN_RX PORTFbits.RF0 #define CAN_TX_AS_OUT() {TRISFbits.TRISF1=0;} // #define CAN_TX_SET() {LATFbits.LATF1=1;}// #define CAN_TX_CLR() {LATFbits.LATF1=0;}// #define CAN_TX LATFbits.LATF1 /************************************************************************** * Function Name: CAN1AbortAll中止等待中的发送 * Description: This function sets the ABAT bit in C1CTRL register * thus initiating the abort of all pending transmissions * Parameters: None * Return Value: None ***************************************************************************/ void CAN1AbortAll(void) { C1CTRLbits.ABAT = 1; } /********************************************************************* * Function Name : CAN1GetRXErrorCount接收错误计数值 * Description : This function gets the receiver error count * Parameters : None * Return Value : unsigned char: receiver error count *********************************************************************/ unsigned char CAN1GetRXErrorCount(void) { return C1RERRCNT; /* returns the lower byte of C1EC */ } /********************************************************************* * Function Name : CAN1GetTXErrorCount发送错误计数值 * Description : This function gets the transmit error count * Parameters : None * Return Value : unsigned char: transmit error count *********************************************************************/ unsigned char CAN1GetTXErrorCount(void) { return C1TERRCNT; /* upper byte of C1EC */ } /************************************************************************* * Function Name : CAN1Initialize初始化CAN * Description : This function configures Sync jump width, Baud Rate * Pre-scaler, Phase Buffer Segment 1 and 2, and * Propogation time segment. * Parameters : unsigned int: config1, unsigned int: config2 * Return Value : None **************************************************************************/ void CAN1Initialize(unsigned int config1, unsigned int config2) { C1CFG1 = config1; /* configure SJW and BRP */ C1CFG2 = config2; /* configure PHSEG2 and PHSEG1 and PROPSEG */ } /************************************************************************* * Function Name : CAN1IsBusOff总线是否为关闭状态 * Description : This function returns the status of the node, * indicating whether CAN is in BusOff error mode. * Parameters : None * Return Value : char:TXBO bit status *********************************************************************/ char CAN1IsBusOff(void) { return C1INTFbits.TXBO; } /*************************************************************************** * Function Name : CAN1IsRXPassive接收器是否为错误被动状态 * Description : This function returns the state of CAN receiver whether * it is in error passive mode. * Parameters : None * Return Value : char: RXEP bit status ***************************************************************************/ char CAN1IsRXPassive(void) { return C1INTFbits.RXEP; } /*************************************************************************** * Function Name : CAN1IsRXReady是否接收到新消息 * Description : This function returns RXFUL bit status which indicates * whether the receive buffer contains any received message * Parameters : char buffno * Return Value : char: RXFUL bit status ****************************************************************************/ char CAN1IsRXReady(char buffno) { switch(buffno) { case 0: return C1RX0CONbits.RXFUL; case 1: return C1RX1CONbits.RXFUL; } return 0; } /*************************************************************************** * Function Name : CAN1IsTXPassive发送器是否为错误被动状态 * Description : This function returns the state of CAN tranmitter * whether it is in error passive mode. * Parameters : None * Return Value : char:TXEP bit status ****************************************************************************/ char CAN1IsTXPassive(void) { return C1INTFbits.TXEP; } /**************************************************************************** * Function Name : CAN1IsTXReady发送是否准备好 * Description : This function returns TXREQ bit status which indicates * whether the transmitter is ready for next transmission. * Parameters : char: buffno * Return Value : char: compliment of TXREQ bit status *****************************************************************************/ char CAN1IsTXReady(char buffno) { switch(buffno) { case 0: return !(C1TX0CONbits.TXREQ); break; case 1: return !(C1TX1CONbits.TXREQ); break; case 2: return !(C1TX2CONbits.TXREQ); break; } return 0; } /************************************************************************* * Function Name : CAN1ReceiveMessage从缓冲器中读数据 * Description : This function reads the data from the receive buffer * into an array. * Parameters : unsigned char*: data pointer * unsigned char: datalen * char: MsgFlag * Return Value : void **************************************************************************/ void CAN1ReceiveMessage(unsigned char * data, unsigned char datalen, char MsgFlag) { int i; for(i = 0;i<datalen;i++) { switch(MsgFlag) { case 0: data[i] = *((unsigned char *)&C1RX0B1 + i); break; case 1: data[i] = *((unsigned char *)&C1RX1B1 + i); break; default: data[i] = *((unsigned char *)&C1RX0B1 + i); break; } } } /****************************************************************************** * Function Name : CAN1SendMessage发送数据 * Description : This function writes the message identifiers (SID, EID), writes the data to be transmitted into the Transmit buffer * and sets the corresponding Transmit request bit. * Parameters : unsigned long: id * unsigned char: * data * unsigned char: datalen * char: MsgFlag * Return Value : None *******************************************************************************/ void CAN1SendMessage(unsigned int sid, unsigned long eid, unsigned char * data, unsigned char datalen, char MsgFlag) { int i; unsigned int uppereid = eid >> 16; switch(MsgFlag) { case 0: C1TX0SID = sid; C1TX0EID = uppereid; C1TX0DLC = eid; break; case 1: C1TX1SID = sid; C1TX1EID = uppereid; C1TX1DLC = eid; break; case 2: C1TX2SID = sid; C1TX2EID = uppereid; C1TX2DLC = eid; break; default: C1TX0SID = sid; C1TX0EID = uppereid; C1TX0DLC = eid; break; } for(i = 0;i < datalen;i++) { switch(MsgFlag) { case 0: *((unsigned char *)&C1TX0B1+i)= data[i]; break; case 1: *((unsigned char *)&C1TX1B1+i)= data[i]; break; case 2: *((unsigned char *)&C1TX2B1+i)= data[i]; break; default:*((unsigned char *)&C1TX0B1+i)= data[i]; break; } } /* Msg send request */ switch(MsgFlag) { case 0: C1TX0DLCbits.DLC = datalen; C1TX0CONbits.TXREQ = 1; break; case 1: C1TX1DLCbits.DLC = datalen; C1TX1CONbits.TXREQ = 1; break; case 2: C1TX2DLCbits.DLC = datalen; C1TX2CONbits.TXREQ = 1; break; default: C1TX0DLCbits.DLC = datalen; C1TX0CONbits.TXREQ = 1; break; } } /********************************************************************* * Function Name : CAN1SetFilter设置接收过滤值 * Description : This function sets the acceptance filter values * (SID and EID) for the specified filter * Parameters : char: filter_no * unsigned int: sid register value * unsigned long: eid registers value * Return Value : None *********************************************************************/ void CAN1SetFilter(char filter_no, unsigned int sid, unsigned long eid) { unsigned int uppereid = eid >>16; switch(filter_no) { case 0: C1RXF0SID = sid; C1RXF0EIDH = uppereid; /*upper 16 to the EIDH reg */ C1RXF0EIDL = eid; /*lower 16 to EIDL */ break; case 1: C1RXF1SID = sid; C1RXF1EIDH = uppereid; /*upper 16 to the EIDH reg */ C1RXF1EIDL = eid; /*lower 16 to EIDH */ break; case 2: C1RXF2SID = sid; C1RXF2EIDH = uppereid; /*upper 16 to the EIDH reg */ C1RXF2EIDL = eid; /*lower 16 to EIDL */ break; case 3: C1RXF3SID = sid; C1RXF3EIDH = uppereid; /*upper 16 to the EIDH reg */ C1RXF3EIDL = eid; /*lower 16 to EIDL */ break; case 4: C1RXF4SID = sid; C1RXF4EIDH = uppereid; /*upper 16 to the EIDH reg */ C1RXF4EIDL = eid; /*lower 16 to EIDL */ break; case 5: C1RXF5SID = sid; C1RXF5EIDH = uppereid; /*upper 16 to the EIDH reg */ C1RXF5EIDL = eid; /*lower 16 to EIDL */ break; default: C1RXF0SID = sid; C1RXF0EIDH = uppereid; /*upper 16 to the EIDH reg */ C1RXF0EIDL = eid; /*lower 16 to EIDL */ break; } } /************************************************************************* * Function Name : CAN1SetMask设置接收屏蔽值 * Description : This function sets the values for the acceptance * filter mask registers (SID and EID) * Parameters : char: mask_no * unsigned int: sid register value * unsigned long: eid registers value * Return Value : None **************************************************************************/ void CAN1SetMask(char mask_no, unsigned int sid, unsigned long eid) { unsigned int uppereid = eid >>16; switch(mask_no) { case 0: C1RXM0SID = sid; C1RXM0EIDH = uppereid; /*upper 16 to the EIDH reg */ C1RXM0EIDL = eid; /*lower 16 to EIDL */ break; case 1: C1RXM1SID = sid; C1RXM1EIDH = uppereid; /*upper 16 to the EIDH reg */ C1RXM1EIDL = eid; /*lower 16 to EIDL */ break; default: C1RXM0SID = sid; C1RXM0EIDH = uppereid; /*upper 16 to the EIDH reg */ C1RXM0EIDL = eid; /*lower 16 to EIDL */ break; } } /*************************************************************************** * Function Name : CAN1SetOperationMode配置模块 * Description : This function configures the following bits of CxCTRL: * CSIDL, REQOP<2:0> and CANCKS * Parameters : unsigned int config * Return Value : None ****************************************************************************/ void CAN1SetOperationMode(unsigned int config) { C1CTRL = config; } /********************************************************************************* * Function Name : CAN1SetOperationModeNoWait * Description : This function sets the abort bit and configures the * following bits of CxCTRL: CSIDL, REQOP<2:0> and CANCKS * Parameters : unsigned int config * Return Value : None **********************************************************************************/ void CAN1SetOperationModeNoWait(unsigned int config) { C1CTRLbits.ABAT = 1; C1CTRL = config; } /**************************************************************************** * Function Name : CAN1SetRXMode接收器配置 * Description : This function configures the CxRXxCON register * Parameters : char buffno, unsigned int config * Return Value : None *****************************************************************************/ void CAN1SetRXMode(char buffno, unsigned int config) { switch(buffno) { case 0: C1RX0CON = config; break; case 1: C1RX1CON = config; break; default: C1RX0CON = config; break; } } /**************************************************************************** * Function Name : CAN1SetTXMode发送器配置 * Description : This function configures the CxTXxCON register * Parameters : char buffno, unsigned int config * Return Value : None *****************************************************************************/ void CAN1SetTXMode(char buffno, unsigned int config) { switch(buffno) { case 0: C1TX0CON = config; break; case 1: C1TX1CON = config; break; case 2: C1TX2CON = config; break; default: C1TX0CON = config; break; } } /* TQ=1/(BAD*K) BRP=(TQ*FCAN)/2-1 FOSC=40MHz C1CTRL C1CFG1 C1CFG2 波特率 同步 相位2 相位1 广播 FCAN 0x0C00 0x0031 0x01a1 10KHz 1 1 5 3 FCY 0x0C00 0x0018 0x01a1 20KHz 1 1 5 3 FCY 0x0C00 0x0009 0x01a1 50KHz 1 1 5 3 FCY 0x0C00 0x0004 0x01a1 100KHz 1 1 5 3 FCY 0x0C00 0x0003 0x01a1 125KHz 1 1 5 3 FCY 0x0400 0x0004 0x01BC 250KHz 1 2 8 5 FOSC 0x0400 0x0003 0x01a1 500KHz 1 1 5 3 FOSC */ void Can_ini(void) { CAN_RX_AS_IN(); CAN_TX_AS_OUT(); C1CTRL = 0x0C00; //空闲继续工作,FCAN=FCY,请求进入配置模式 while (C1CTRLbits.OPMODE!=0x4){} //确认进入配置模式 C1CFG1 = 0x0009; //波特率配置50KHZ,1tq,BRP=9 C1CFG2 = 0x01a1; //相位二:1,相位一:5,广播:3,总线采样一次,相位2自由编程 C1TX0CON = 0x0003; //发送0邮箱配置,高优先级 C1RX0CON = 0x0000; //接收0邮箱配置,dben=0 ->使能缓冲器0 C1RXF0SID = 0x0394; //接收滤波器0扩展标识符,11位->显示地址0xE5 C1RXF0EIDH = 0; //EID reg C1RXF0EIDL = 0; C1RXF1SID = 0; //接收滤波器1标准标识符,11位 C1RXF1EIDH = 0; //upper 16 to the EIDH reg C1RXF1EIDL = 0; //lower 16 to EIDL C1RXM0SID = 0x1FFC; //接收屏蔽0扩展标识符 C1RXM0EIDH = 0x0FFF; //upper 16 to the EIDH reg C1RXM0EIDL = 0xFC00; //lower 16 to EIDL C1TX0SID = 0x18d0; //发送0扩展标识符,11位 ->控制地址0xF4 C1TX0EID = 0; C1TX0DLC = 0x01c0; //发送0数据长度,8字节 C1CTRLbits.REQOP = 0x00; //请求进入正常模式 while (C1CTRLbits.OPMODE!=0x00){} //确认进入正常模式 C1INTF=0; C1INTE=0x00;// } void HandleCAN(void) { // static unsigned int count_time=0,cannum=0,xinghao=0; // unsigned long int n,m; static unsigned int step=0,step1=1; float ftemp,vatemp,vbtemp,vctemp,ierrtemp; unsigned char CAN_RxBuff[8]; //接收数据缓冲区 unsigned char CAN_TxBuff[8]; //发送数据缓冲区 if (C1INTFbits.RX0IF==1) { CAN_RxBuff[0]=C1RX0B1%0x100; CAN_RxBuff[1]=C1RX0B1/0x100; CAN_RxBuff[2]=C1RX0B2%0x100; CAN_RxBuff[3]=C1RX0B2/0x100; CAN_RxBuff[4]=C1RX0B3%0x100; CAN_RxBuff[5]=C1RX0B3/0x100; CAN_RxBuff[6]=C1RX0B4%0x100; CAN_RxBuff[7]=C1RX0B4/0x100; //上电握手和停机复位//B1 00 00 00 00 00 00 5A设置参数 if ((CAN_RxBuff[0]==0xB1)&&(CAN_RxBuff[7]==0x5A)) { DISP_OK=1;//握手 step1=1; } //启动时,控制向显示要数据1 B2 00 00 00 00 00 00 5A else if((CAN_RxBuff[0]==0xB2)&&(CAN_RxBuff[7]==0x5A)) { ftemp =CAN_RxBuff[1]*0x100+CAN_RxBuff[2]; vatemp=CAN_RxBuff[3]*0x100+CAN_RxBuff[4]; vbtemp=CAN_RxBuff[5]*0x100+CAN_RxBuff[6]; if((ftemp>FrqHigh)||(ftemp<FrqLow) ||(vatemp>VolHigh)||(vbtemp>VolHigh)) { Data_Err=1;//设置数据错误 SET_OK=2;// Flash_Err=0x04; } else { Data_Err=0;//设备数据正确 FreqSet=ftemp; VsetA=(unsigned int )vatemp; VsetB=(unsigned int )vbtemp; // VsetC=(unsigned int )vctemp; SetUpate=1; SetHL=1; } UERR=OVP; ierrtemp=OCP; IERR110=(unsigned int )(ierrtemp*OCP1); IERR125=(unsigned int )(ierrtemp*OCP2); IERR150=(unsigned int )(ierrtemp*OCP3); IERR200=(unsigned int )(ierrtemp*OCP4); } //启动时,控制向显示要数据2 B3 00 00 00 00 00 00 5A else if((CAN_RxBuff[0]==0xB3)&&(CAN_RxBuff[7]==0x5A)) { Vol_autadj=CAN_RxBuff[1]*0x100+CAN_RxBuff[2];; vctemp=CAN_RxBuff[3]*0x100+CAN_RxBuff[4]; if((Vol_autadj>MAXB)||(vctemp>VolHigh)) { Data_Err=1;//设备数据错误 SET_OK=2;// Flash_Err=0x04; } else { VolAdj=Vol_autadj; VsetC=(unsigned int )vctemp; SetHL=2;// SET_OK=1;//数据设置正确 } } //运行时,设置电压 else if((CAN_RxBuff[0]==0xB8)&&(CAN_RxBuff[7]==0x5A)) { vatemp=CAN_RxBuff[1]*0x100+CAN_RxBuff[2]; vbtemp=CAN_RxBuff[3]*0x100+CAN_RxBuff[4]; vctemp=CAN_RxBuff[5]*0x100+CAN_RxBuff[6]; if((vatemp>VolHigh)||(vbtemp>VolHigh)||(vctemp>VolHigh)) {;} else { VsetA=(unsigned int )vatemp; VsetB=(unsigned int )vbtemp; VsetC=(unsigned int )vctemp; } } //运行时,设置频率 else if((CAN_RxBuff[0]==0xB9)&&(CAN_RxBuff[7]==0x5A)) { ftemp=CAN_RxBuff[1]*0x100+CAN_RxBuff[2]; if((ftemp>FrqHigh)||(ftemp<FrqLow)) {;} else { FreqSet=ftemp; SetUpate=1; } } //运行时,设置补偿电压 else if((CAN_RxBuff[0]==0xBA)&&(CAN_RxBuff[7]==0x5A)) { Vol_autadj=CAN_RxBuff[1]*0x100+CAN_RxBuff[2]; if(Vol_autadj>MAXB) {;} else { VolAdj=Vol_autadj; SetUpate=1; } } C1INTFbits.RX0IF=0; C1RX0CONbits.RXFUL=0; } else if(TxStar) { TxStar=0; switch(SYS_status)//设备状态 { case 0://上电延时状态 case 1://空闲状态 case 2://等待启动 if(DISP_OK==0)//握手命令 { CAN_TxBuff[0]=0xA1; CAN_TxBuff[1]=0x00; CAN_TxBuff[2]=0x00; CAN_TxBuff[3]=0x00; CAN_TxBuff[4]=0x00; CAN_TxBuff[5]=0x00; CAN_TxBuff[6]=0x00; CAN_TxBuff[7]=0x5A; C1TX0B1=CAN_TxBuff[0]+CAN_TxBuff[1]*0x100; C1TX0B2=CAN_TxBuff[2]+CAN_TxBuff[3]*0x100; C1TX0B3=CAN_TxBuff[4]+CAN_TxBuff[5]*0x100; C1TX0B4=CAN_TxBuff[6]+CAN_TxBuff[7]*0x100; C1TX0CONbits.TXREQ = 1; //启动发送 } break; case 3://发启动命令到显示,回读设置数据 if(SetHL==0) { CAN_TxBuff[0]=0xA2; } else if(SetHL==1) { CAN_TxBuff[0]=0xA3; } CAN_TxBuff[1]=0x00; CAN_TxBuff[2]=0x00; CAN_TxBuff[3]=0x00; CAN_TxBuff[4]=0x00; CAN_TxBuff[5]=0x00; CAN_TxBuff[6]=0x00; CAN_TxBuff[7]=0x5A; C1TX0B1=CAN_TxBuff[0]+CAN_TxBuff[1]*0x100; C1TX0B2=CAN_TxBuff[2]+CAN_TxBuff[3]*0x100; C1TX0B3=CAN_TxBuff[4]+CAN_TxBuff[5]*0x100; C1TX0B4=CAN_TxBuff[6]+CAN_TxBuff[7]*0x100; C1TX0CONbits.TXREQ = 1; //启动发送 break; case 4://启动自检 break; case 5://缓启 case 6://运行 switch(step) { case 0: step++; CAN_TxBuff[0]=0xA4; CAN_TxBuff[1]=VolA/0x100; CAN_TxBuff[2]=VolA%0x100; CAN_TxBuff[3]=CuA/0x100; CAN_TxBuff[4]=CuA%0x100; CAN_TxBuff[5]=P_A/0x100; CAN_TxBuff[6]=P_A%0x100; CAN_TxBuff[7]=0x5A; break; case 1: step++; CAN_TxBuff[0]=0xA5; CAN_TxBuff[1]=VolB/0x100; CAN_TxBuff[2]=VolB%0x100; CAN_TxBuff[3]=CuB/0x100; CAN_TxBuff[4]=CuB%0x100; CAN_TxBuff[5]=P_B/0x100; CAN_TxBuff[6]=P_B%0x100; CAN_TxBuff[7]=0x5A; break; case 2: CAN_TxBuff[0]=0xA6; CAN_TxBuff[1]=VolC/0x100; CAN_TxBuff[2]=VolC%0x100; CAN_TxBuff[3]=CuC/0x100; CAN_TxBuff[4]=CuC%0x100; CAN_TxBuff[5]=P_C/0x100; CAN_TxBuff[6]=P_C%0x100; CAN_TxBuff[7]=0x5A; step=0; break; default: step=0; break; } C1TX0B1=CAN_TxBuff[0]+CAN_TxBuff[1]*0x100; C1TX0B2=CAN_TxBuff[2]+CAN_TxBuff[3]*0x100; C1TX0B3=CAN_TxBuff[4]+CAN_TxBuff[5]*0x100; C1TX0B4=CAN_TxBuff[6]+CAN_TxBuff[7]*0x100; C1TX0CONbits.TXREQ = 1; //启动发送 break; case 7://故障:故障优先级,如果有多个故障,只报最高优先级的. //if(step1) //{ //step1=0; CAN_TxBuff[0]=0xA7; CAN_TxBuff[1]=Flash_Err; CAN_TxBuff[2]=0x00; CAN_TxBuff[3]=0x00; CAN_TxBuff[4]=0x00; CAN_TxBuff[5]=0x00; CAN_TxBuff[6]=0x00; CAN_TxBuff[7]=0x5A; C1TX0B1=CAN_TxBuff[0]+CAN_TxBuff[1]*0x100; C1TX0B2=CAN_TxBuff[2]+CAN_TxBuff[3]*0x100; C1TX0B3=CAN_TxBuff[4]+CAN_TxBuff[5]*0x100; C1TX0B4=CAN_TxBuff[6]+CAN_TxBuff[7]*0x100; C1TX0CONbits.TXREQ = 1; //启动发送 //} break; default: break; } } } void __attribute__((__interrupt__,__auto_psv__)) _C1Interrupt(void)//CAN1 { if (C1INTFbits.TX0IF) C1INTFbits.TX0IF = 0; if (C1INTFbits.TX1IF) C1INTFbits.TX1IF = 0; if (C1INTFbits.TX2IF) C1INTFbits.TX2IF = 0; if (C1INTFbits.RX0IF) { C1INTFbits.RX0IF = 0; // 添加代码,读缓冲器0 C1RX0CONbits.RXFUL = 0; } if (C1INTFbits.RX1IF) { C1INTFbits.RX1IF = 0; // 添加代码,读缓冲器1 C1RX1CONbits.RXFUL = 0; } if (C1INTFbits.WAKIF) C1INTFbits.WAKIF = 0; // 添加唤醒处理代码 if (C1INTFbits.ERRIF) C1INTFbits.ERRIF = 0; // 添加错误处理代码 if (C1INTFbits.IVRIF) C1INTFbits.IVRIF = 0; if ( (C1INTF & C1INTE) == 0 ) IFS1bits.C1IF = 0; // 在返回前清零CAN1 中断标志 } 根据这个P32F6015的CAN代码和上面步骤逻辑,转一个完整的STM32(版本V3.5.0)的CAN
07-16
/* * Copyright (C) 2016 MediaTek Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See http://www.gnu.org/licenses/gpl-2.0.html for more details. */ #define PFX "CAM_CAL" #define pr_fmt(fmt) PFX "[%s] " fmt, __func__ #include <linux/kernel.h> #include <linux/module.h> #include <linux/i2c.h> #include <linux/platform_device.h> #include <linux/delay.h> #include <linux/cdev.h> #include <linux/uaccess.h> #include <linux/slab.h> #include <linux/fs.h> #include <linux/of.h> #include "cam_cal.h" #include "cam_cal_define.h" #include "cam_cal_list.h" #include <linux/dma-mapping.h> #ifdef CONFIG_COMPAT /* 64 bit */ #include <linux/fs.h> #include <linux/compat.h> #endif #include "kd_camera_typedef.h" #include "kd_imgsensor_define.h" #include "kd_imgsensor_errcode.h" #include "kd_camera_typedef.h" //#include "eeprom_i2c_custom_driver.c" #include "eeprom_i2c_gc05a2_madrid_driver.h" #define EEPROM_I2C_MSG_SIZE_READ 2 #define OTP_LENGTH 1938 #define LOG_INF(format, args...) pr_debug(PFX "[%s] " format, __func__, ##args) static struct i2c_client *g_pstI2CclientG; #define GC05A2_OTP_DEBUG 1 #define GC05A2_I2C_ID 0x7e #define GC05A2_SN_LENGTH 26 #define GC05A2_SN_OFFSET 0x2150 unsigned char gc05a2madrid_sn_data[34]; static int iReadRegI2C1(struct i2c_client *client, u8 *a_pSendData, u16 a_sizeSendData, u8 *a_pRecvData, u16 a_sizeRecvData, u16 i2cId) { int i4RetValue = 0; struct i2c_msg msg[EEPROM_I2C_MSG_SIZE_READ]; client->addr = (i2cId >> 1); msg[0].addr = client->addr; msg[0].flags = client->flags & I2C_M_TEN; msg[0].len = a_sizeSendData; msg[0].buf = a_pSendData; msg[1].addr = client->addr; msg[1].flags = client->flags & I2C_M_TEN; msg[1].flags |= I2C_M_RD; msg[1].len = a_sizeRecvData; msg[1].buf = a_pRecvData; i4RetValue = i2c_transfer(client->adapter, msg, EEPROM_I2C_MSG_SIZE_READ); if (i4RetValue != EEPROM_I2C_MSG_SIZE_READ) { printk("I2C read failed!!\n"); return -1; } return 0; } static int iWriteRegI2C(u8 *a_pSendData, u16 a_sizeSendData) { int i4RetValue = 0; i4RetValue = i2c_master_send(g_pstI2CclientG, a_pSendData, a_sizeSendData); if (i4RetValue != a_sizeSendData) { printk("I2C send failed!!, Addr = 0x%x\n", a_pSendData[0]); return -1; } return 0; } /*static int iWriteRegI2C(u8 *a_pSendData, u16 a_sizeSendData, u16 i2cId) { if (imgsensor_i2c_get_device() == NULL) return IMGSENSOR_RETURN_ERROR; return imgsensor_i2c_write( imgsensor_i2c_get_device(), a_pSendData, a_sizeSendData, a_sizeSendData, i2cId, IMGSENSOR_I2C_SPEED); }*/ static u16 read_cmos_sensor(u16 addr) { u16 get_byte=0; char pu_send_cmd[2] = { (char)((addr >> 8) & 0xff), (char)(addr & 0xff) }; iReadRegI2C1(g_pstI2CclientG,pu_send_cmd, 2, (u8 *)&get_byte, 1, GC05A2_I2C_ID); return get_byte; } static void write_cmos_sensor(kal_uint32 addr, kal_uint32 para) { #if 1 char pu_send_cmd[3] = {(char)(addr >> 8), (char)(addr & 0xFF), (char)(para & 0xFF)}; iWriteRegI2C(pu_send_cmd, 3); #else char pu_send_cmd[4] = { (char)((addr >> 8) & 0xff), (char)(addr & 0xff), (char)((para >> 8) & 0xff), (char)(para & 0xff) }; iWriteRegI2C(pu_send_cmd, 4, imgsensor.i2c_write_id); #endif } static void gc05a2_otp_init(void) { //write_cmos_sensor(0x031c, 0x60); //write_cmos_sensor(0x0315, 0x80); //write_cmos_sensor(0x0af4, 0x01); write_cmos_sensor(0x0af6, 0x00); write_cmos_sensor(0x0b90, 0x10); write_cmos_sensor(0x0b91, 0x00); write_cmos_sensor(0x0b92, 0x00); write_cmos_sensor(0x0ba0, 0x17); write_cmos_sensor(0x0ba1, 0x00); write_cmos_sensor(0x0ba2, 0x00); write_cmos_sensor(0x0ba4, 0x03); write_cmos_sensor(0x0ba5, 0x00); write_cmos_sensor(0x0ba6, 0x00); write_cmos_sensor(0x0ba8, 0x40); write_cmos_sensor(0x0ba9, 0x00); write_cmos_sensor(0x0baa, 0x00); write_cmos_sensor(0x0bac, 0x40); write_cmos_sensor(0x0bad, 0x00); write_cmos_sensor(0x0bae, 0x00); write_cmos_sensor(0x0bb0, 0x02); write_cmos_sensor(0x0bb1, 0x00); write_cmos_sensor(0x0bb2, 0x00); write_cmos_sensor(0x0bb8, 0x02); write_cmos_sensor(0x0bb9, 0x00); write_cmos_sensor(0x0bba, 0x00); write_cmos_sensor(0x0a70, 0x80); write_cmos_sensor(0x0a71, 0x00); write_cmos_sensor(0x0a72, 0x00); write_cmos_sensor(0x0a66, 0x00); write_cmos_sensor(0x0a67, 0x84); write_cmos_sensor(0x0a4d, 0x0e); write_cmos_sensor(0x0a45, 0x02); write_cmos_sensor(0x0a47, 0x02); write_cmos_sensor(0x0a50, 0x00); write_cmos_sensor(0x0a4f, 0x0c); mdelay(10); } static void gc05a2_otp_close(void) { write_cmos_sensor(0x0a70, 0x00); write_cmos_sensor(0x0a67, 0x00); } static u16 gc05a2_otp_read_group(u16 addr, u8 *data, u16 length) { u16 i = 0; //write_cmos_sensor(0x0a67, 0x84); write_cmos_sensor(0x0a69, (addr >> 8) & 0xff); write_cmos_sensor(0x0a6a, addr & 0xff); write_cmos_sensor(0x0a66, 0x20); write_cmos_sensor(0x0a66, 0x12); for (i = 0; i < length; i++) { data[i] = read_cmos_sensor(0x0a6c); LOG_INF("WLZ otp addr = 0x%x, data = 0x%x\n", addr + i * 8, data[i]); } return 0; } /* static u16 gc05a2_otp_read_single(u16 addr, u8 *data, u16 length) { u16 i = 0; for (i = 0; i < length; i++) { addr = addr + (i * 0x08); #if 0 //write_cmos_sensor_8bit(0x0a67, 0x84); write_cmos_sensor_8bit(0x0a69, (addr >> 8) & 0xff); write_cmos_sensor_8bit(0x0a6a, addr & 0xff); write_cmos_sensor_8bit(0x0a66, 0x20); write_cmos_sensor_8bit(0x0a66, 0x12); #else write_cmos_sensor(0x0a69, (addr >> 8) & 0xff); write_cmos_sensor(0x0a6a, addr & 0xff); write_cmos_sensor(0x0a66, 0x20); //write_cmos_sensor(0x0a66, 0x12); #endif data[i] = read_cmos_sensor(0x0a6c); printk("otp addr = 0x%x, data = 0x%x\n", addr, data[i]); } return 0; }*/ static int gc05a2_iReadData(unsigned int ui4_offset, unsigned int ui4_length, unsigned char *pinputdata) { int i4RetValue = 0; unsigned char* ptr_data = &gc05a2madrid_sn_data[8]; unsigned char* ptr_sn = &pinputdata[40]; printk("gc05a2 otp ui4_offset = 0x%x, ui4_length = %d \n", ui4_offset, ui4_length); gc05a2_otp_init(); mdelay(10); i4RetValue = gc05a2_otp_read_group(0x2000, pinputdata,OTP_LENGTH); //i4RetValue = gc05a2_otp_read_group(0x15a0, pinputdata, 0x7B1); LOG_INF("gc05a2 otp i4RetValue:%d \n", i4RetValue); if (i4RetValue != 0) { LOG_INF("I2C iReadData failed!!\n"); return -1; } gc05a2_otp_close(); if(pinputdata[40] != 0) { memcpy(ptr_data, ptr_sn, GC05A2_SN_LENGTH); } return 0; } void copy_sn_data(unsigned char *sndata) { memcpy(sndata,gc05a2madrid_sn_data,sizeof(gc05a2madrid_sn_data)/sizeof(char)); for(int i = 0;i < sizeof(gc05a2madrid_sn_data)/sizeof(char);i++) { LOG_INF("copy_sn_data sndata i %d sndata[i] 0x%x",i,gc05a2madrid_sn_data[i]); } } EXPORT_SYMBOL(copy_sn_data); unsigned int Gc05a2_read_region_madrid(struct i2c_client *client, unsigned int addr, unsigned char *data, unsigned int size) { g_pstI2CclientG = client; if (gc05a2_iReadData(addr, size, data) == 0) return size; else return 0; } /****************************************************************************** * * Filename: * --------- * gc05a2mipimadrid_Sensor.c * * Project: * -------- * ALPS * * Description: * ------------ * Source code of Sensor driver * * *----------------------------------------------------------------------------- * Upper this line, this part is controlled by CC/CQ. DO NOT MODIFY!! *============================================================================ * * Version: V20220830190306 by GC-S-TEAM * ******************************************************************************/ #include <linux/videodev2.h> #include <linux/i2c.h> #include <linux/platform_device.h> #include <linux/delay.h> #include <linux/cdev.h> #include <linux/uaccess.h> #include <linux/fs.h> #include <linux/atomic.h> #include <linux/types.h> #include "kd_camera_typedef.h" #include "kd_imgsensor.h" #include "kd_imgsensor_define.h" #include "kd_imgsensor_errcode.h" #include "gc05a2mipimadrid_Sensor.h" /************************** Modify Following Strings for Debug **************************/ #define PFX "gc05a2_camera_sensor" #define LOG_1 LOG_INF("GC05A2, MIPI 2LANE\n") /**************************** Modify end *******************************************/ #define GC05A2_DEBUG 0 #if GC05A2_DEBUG #define LOG_INF(format, args...) pr_debug(PFX "[%s] " format, __func__, ##args) #else #define LOG_INF(format, args...) #endif extern void copy_sn_data(char *sndata); unsigned char gc05a2madrid_sn_data_lz[200] = { 0 }; static DEFINE_SPINLOCK(imgsensor_drv_lock); static struct imgsensor_info_struct imgsensor_info = { .sensor_id = GC05A2_SENSOR_ID_MADRID, .checksum_value = 0xe5d32119, .pre = { .pclk = 224000000, .linelength = 3616, .framelength = 2064, .startx = 0, .starty = 0, .grabwindow_width = 1296, .grabwindow_height = 972, .mipi_data_lp2hs_settle_dc = 85, .mipi_pixel_rate = 89600000, .max_framerate = 300, }, .cap = { .pclk = 224000000, .linelength = 3664, .framelength = 2032, .startx = 0, .starty = 0, .grabwindow_width = 2592, .grabwindow_height = 1944, .mipi_data_lp2hs_settle_dc = 85, .mipi_pixel_rate = 179200000, .max_framerate = 300, }, .normal_video = { .pclk = 224000000, .linelength = 3616, .framelength = 2064, .startx = 0, .starty = 0, .grabwindow_width = 1296, .grabwindow_height = 972, .mipi_data_lp2hs_settle_dc = 85, .mipi_pixel_rate = 89600000, .max_framerate = 300, }, .hs_video = { .pclk = 224000000, .linelength = 3616, .framelength = 2064, .startx = 0, .starty = 0, .grabwindow_width = 1296, .grabwindow_height = 972, .mipi_data_lp2hs_settle_dc = 85, .mipi_pixel_rate = 89600000, .max_framerate = 300, }, .slim_video = { .pclk = 224000000, .linelength = 3616, .framelength = 2064, .startx = 0, .starty = 0, .grabwindow_width = 1280, .grabwindow_height = 720, .mipi_data_lp2hs_settle_dc = 85, .mipi_pixel_rate = 89600000, .max_framerate = 300, }, .margin = 16, .min_shutter = 4, .max_frame_length = 0xfffe, .ae_shut_delay_frame = 0, .ae_sensor_gain_delay_frame = 0, .ae_ispGain_delay_frame = 2, .ihdr_support = 0, .ihdr_le_firstline = 0, .sensor_mode_num = 5, .cap_delay_frame = 2, .pre_delay_frame = 2, .video_delay_frame = 2, .hs_video_delay_frame = 2, .slim_video_delay_frame = 2, .isp_driving_current = ISP_DRIVING_6MA, .sensor_interface_type = SENSOR_INTERFACE_TYPE_MIPI, .mipi_sensor_type = MIPI_OPHY_NCSI2, .mipi_settle_delay_mode = MIPI_SETTLEDELAY_AUTO, //#if GC05A2_MIRROR_NORMAL .sensor_output_dataformat = SENSOR_OUTPUT_FORMAT_RAW_Gr, //#elif GC05A2_MIRROR_H // .sensor_output_dataformat = SENSOR_OUTPUT_FORMAT_RAW_R, //#elif GC05A2_MIRROR_V // .sensor_output_dataformat = SENSOR_OUTPUT_FORMAT_RAW_B, //#elif GC05A2_MIRROR_HV // .sensor_output_dataformat = SENSOR_OUTPUT_FORMAT_RAW_Gb, //#else // .sensor_output_dataformat = SENSOR_OUTPUT_FORMAT_RAW_Gr, //#endif .mclk = 24, .mipi_lane_num = SENSOR_MIPI_2_LANE, .i2c_addr_table = {0x7e, 0xff}, .i2c_speed = 400, }; static struct imgsensor_struct imgsensor = { .mirror = IMAGE_HV_MIRROR, .sensor_mode = IMGSENSOR_MODE_INIT, .shutter = 0x900, .gain = 0x40, .dummy_pixel = 0, .dummy_line = 0, .current_fps = 300, .autoflicker_en = KAL_FALSE, .test_pattern = KAL_FALSE, .current_scenario_id = MSDK_SCENARIO_ID_CAMERA_PREVIEW, .ihdr_en = 0, .i2c_write_id = 0x7e, }; /* Sensor output window information */ static struct SENSOR_WINSIZE_INFO_STRUCT imgsensor_winsize_info[5] = { { 2592, 1944, 0, 0, 2592, 1944, 1296, 972, 0, 0, 1296, 972, 0, 0, 1296, 972}, /* Preview */ { 2592, 1944, 0, 0, 2592, 1944, 2592, 1944, 0, 0, 2592, 1944, 0, 0, 2592, 1944}, /* capture */ { 2592, 1944, 0, 0, 2592, 1944, 1296, 972, 0, 0, 1296, 972, 0, 0, 1296, 972}, /* video */ { 2592, 1944, 0, 0, 2592, 1944, 1296, 972, 0, 0, 1296, 972, 0, 0, 1296, 972}, /* hs video */ { 2592, 1944, 0, 0, 2592, 1944, 1296, 972, 8, 126, 1280, 720, 0, 0, 1280, 720} /* slim video */ }; static kal_uint16 read_cmos_sensor(kal_uint32 addr) { kal_uint16 get_byte = 0; char pu_send_cmd[2] = { (char)((addr >> 8) & 0xff), (char)(addr & 0xff) }; iReadRegI2C(pu_send_cmd, 2, (u8 *)&get_byte, 1, imgsensor.i2c_write_id); return get_byte; } static void write_cmos_sensor(kal_uint32 addr, kal_uint32 para) { char pu_send_cmd[4] = { (char)((addr >> 8) & 0xff), (char)(addr & 0xff), (char)((para >> 8) & 0xff), (char)(para & 0xff) }; iWriteRegI2C(pu_send_cmd, 4, imgsensor.i2c_write_id); } static void write_cmos_sensor_8bit(kal_uint32 addr, kal_uint32 para) { char pu_send_cmd[3] = { (char)((addr >> 8) & 0xff), (char)(addr & 0xff), (char)(para & 0xff) }; iWriteRegI2C(pu_send_cmd, 3, imgsensor.i2c_write_id); } static void table_write_cmos_sensor(kal_uint16 *para, kal_uint32 len) { char puSendCmd[I2C_BUFFER_LEN]; kal_uint32 tosend = 0, idx = 0; kal_uint16 addr = 0, data = 0; while (len > idx) { addr = para[idx]; puSendCmd[tosend++] = (char)((addr >> 8) & 0xff); puSendCmd[tosend++] = (char)(addr & 0xff); data = para[idx + 1]; puSendCmd[tosend++] = (char)(data & 0xff); idx += 2; #if MULTI_WRITE if (tosend >= I2C_BUFFER_LEN || idx == len) { iBurstWriteReg_multi(puSendCmd, tosend, imgsensor.i2c_write_id, 3, imgsensor_info.i2c_speed); tosend = 0; } #else iWriteRegI2CTiming(puSendCmd, 3, imgsensor.i2c_write_id, imgsensor_info.i2c_speed); tosend = 0; #endif } } static kal_uint32 return_sensor_id(void) { kal_uint32 sensor_id = 0; sensor_id = (read_cmos_sensor(0x03f0) << 8) | read_cmos_sensor(0x03f1); return sensor_id; } static void set_dummy(void) { LOG_INF("frame length = %d\n", imgsensor.frame_length); write_cmos_sensor(0x0340, imgsensor.frame_length & 0xfffe); } static void set_max_framerate(kal_uint16 framerate, kal_bool min_framelength_en) { kal_uint32 frame_length = imgsensor.frame_length; frame_length = imgsensor.pclk / framerate * 10 / imgsensor.line_length; spin_lock(&imgsensor_drv_lock); imgsensor.frame_length = (frame_length > imgsensor.min_frame_length) ? frame_length : imgsensor.min_frame_length; imgsensor.dummy_line = imgsensor.frame_length - imgsensor.min_frame_length; if (imgsensor.frame_length > imgsensor_info.max_frame_length) { imgsensor.frame_length = imgsensor_info.max_frame_length; imgsensor.dummy_line = imgsensor.frame_length - imgsensor.min_frame_length; } if (min_framelength_en) imgsensor.min_frame_length = imgsensor.frame_length; spin_unlock(&imgsensor_drv_lock); set_dummy(); } static void set_shutter(kal_uint16 shutter) { unsigned long flags; kal_uint16 realtime_fps = 0; /*kal_uint32 frame_length = 0;*/ spin_lock_irqsave(&imgsensor_drv_lock, flags); imgsensor.shutter = shutter; spin_unlock_irqrestore(&imgsensor_drv_lock, flags); /* if shutter bigger than frame_length, should extend frame length first */ spin_lock(&imgsensor_drv_lock); if (shutter > imgsensor.min_frame_length - imgsensor_info.margin) imgsensor.frame_length = shutter + imgsensor_info.margin; else imgsensor.frame_length = imgsensor.min_frame_length; if (imgsensor.frame_length > imgsensor_info.max_frame_length) imgsensor.frame_length = imgsensor_info.max_frame_length; spin_unlock(&imgsensor_drv_lock); shutter = (shutter < imgsensor_info.min_shutter) ? imgsensor_info.min_shutter : shutter; shutter = (shutter > (imgsensor_info.max_frame_length - imgsensor_info.margin)) ? (imgsensor_info.max_frame_length - imgsensor_info.margin) : shutter; realtime_fps = imgsensor.pclk / imgsensor.line_length * 10 / imgsensor.frame_length; if (imgsensor.autoflicker_en) { if (realtime_fps >= 297 && realtime_fps <= 305) set_max_framerate(296, 0); else if (realtime_fps >= 147 && realtime_fps <= 150) set_max_framerate(146, 0); else write_cmos_sensor(0x0340, imgsensor.frame_length & 0xfffe); } else write_cmos_sensor(0x0340, imgsensor.frame_length & 0xfffe); /* Update Shutter */ write_cmos_sensor(0x0202, shutter); LOG_INF("shutter = %d, framelength = %d\n", shutter, imgsensor.frame_length); } static kal_uint16 gain2reg(kal_uint16 gain) { kal_uint16 reg_gain = gain << 4; reg_gain = (reg_gain < SENSOR_BASE_GAIN) ? SENSOR_BASE_GAIN : reg_gain; reg_gain = (reg_gain > SENSOR_MAX_GAIN) ? SENSOR_MAX_GAIN : reg_gain; return reg_gain; } static kal_uint16 set_gain(kal_uint16 gain) { kal_uint32 reg_gain = 0; reg_gain = gain2reg(gain); LOG_INF("gain = %d, reg_gain = %d\n", gain, reg_gain); write_cmos_sensor(0x0204, reg_gain & 0xffff); return gain; } static void ihdr_write_shutter_gain(kal_uint16 le, kal_uint16 se, kal_uint16 gain) { LOG_INF("le: 0x%x, se: 0x%x, gain: 0x%x\n", le, se, gain); } static void night_mode(kal_bool enable) { /* No Need to implement this function */ } static kal_uint16 gc05a2_init_addr_data[] = { /*system*/ 0x0315, 0xd4, 0x0d06, 0x01, 0x0a70, 0x80, 0x031a, 0x00, 0x0314, 0x00, 0x0130, 0x08, 0x0132, 0x01, 0x0135, 0x01, 0x0136, 0x38, 0x0137, 0x03, 0x0134, 0x5b, 0x031c, 0xe0, 0x0d82, 0x14, 0x0dd1, 0x56, /*gate_mode*/ 0x0af4, 0x01, 0x0002, 0x10, 0x00c3, 0x34, /*pre_setting*/ 0x0084, 0x21, 0x0d05, 0xcc, 0x0218, 0x00, 0x005e, 0x48, 0x0d06, 0x01, 0x0007, 0x16, 0x0101, GC05A2_MIRROR, /*analog*/ 0x0342, 0x07, 0x0343, 0x28, 0x0220, 0x07, 0x0221, 0xd0, 0x0202, 0x07, 0x0203, 0x32, 0x0340, 0x07, 0x0341, 0xf0, 0x0219, 0x00, 0x0346, 0x00, 0x0347, 0x04, 0x0d14, 0x00, 0x0d13, 0x05, 0x0d16, 0x05, 0x0d15, 0x1d, 0x00c0, 0x0a, 0x00c1, 0x30, 0x034a, 0x07, 0x034b, 0xa8, 0x0e0a, 0x00, 0x0e0b, 0x00, 0x0e0e, 0x03, 0x0e0f, 0x00, 0x0e06, 0x0a, 0x0e23, 0x15, 0x0e24, 0x15, 0x0e2a, 0x10, 0x0e2b, 0x10, 0x0e17, 0x49, 0x0e1b, 0x1c, 0x0e3a, 0x36, 0x0d11, 0x84, 0x0e52, 0x14, 0x000b, 0x10, 0x0008, 0x08, 0x0223, 0x17, 0x0d27, 0x39, 0x0d22, 0x00, 0x03f6, 0x0d, 0x0d04, 0x07, 0x03f3, 0x72, 0x03f4, 0xb8, 0x03f5, 0xbc, 0x0d02, 0x73, /*auto load start*/ 0x00c4, 0x00, 0x00c5, 0x01, 0x0af6, 0x00, 0x0ba0, 0x17, 0x0ba1, 0x00, 0x0ba2, 0x00, 0x0ba3, 0x00, 0x0ba4, 0x03, 0x0ba5, 0x00, 0x0ba6, 0x00, 0x0ba7, 0x00, 0x0ba8, 0x40, 0x0ba9, 0x00, 0x0baa, 0x00, 0x0bab, 0x00, 0x0bac, 0x40, 0x0bad, 0x00, 0x0bae, 0x00, 0x0baf, 0x00, 0x0bb0, 0x02, 0x0bb1, 0x00, 0x0bb2, 0x00, 0x0bb3, 0x00, 0x0bb8, 0x02, 0x0bb9, 0x00, 0x0bba, 0x00, 0x0bbb, 0x00, 0x0a70, 0x80, 0x0a71, 0x00, 0x0a72, 0x00, 0x0a66, 0x00, 0x0a67, 0x80, 0x0a4d, 0x4e, 0x0a50, 0x00, 0x0a4f, 0x0c, 0x0a66, 0x00, 0x00ca, 0x00, 0x00cb, 0x00, 0x00cc, 0x00, 0x00cd, 0x00, 0x0aa1, 0x00, 0x0aa2, 0xe0, 0x0aa3, 0x00, 0x0aa4, 0x40, 0x0a90, 0x03, 0x0a91, 0x0e, 0x0a94, 0x80, /*standby*/ 0x0af6, 0x20, 0x0b00, 0x91, 0x0b01, 0x17, 0x0b02, 0x01, 0x0b03, 0x00, 0x0b04, 0x01, 0x0b05, 0x17, 0x0b06, 0x01, 0x0b07, 0x00, 0x0ae9, 0x01, 0x0aea, 0x02, 0x0ae8, 0x53, 0x0ae8, 0x43, /*gain_partition*/ 0x0af6, 0x30, 0x0b00, 0x08, 0x0b01, 0x0f, 0x0b02, 0x00, 0x0b04, 0x1c, 0x0b05, 0x24, 0x0b06, 0x00, 0x0b08, 0x30, 0x0b09, 0x40, 0x0b0a, 0x00, 0x0b0c, 0x0e, 0x0b0d, 0x2a, 0x0b0e, 0x00, 0x0b10, 0x0e, 0x0b11, 0x2b, 0x0b12, 0x00, 0x0b14, 0x0e, 0x0b15, 0x23, 0x0b16, 0x00, 0x0b18, 0x0e, 0x0b19, 0x24, 0x0b1a, 0x00, 0x0b1c, 0x0c, 0x0b1d, 0x0c, 0x0b1e, 0x00, 0x0b20, 0x03, 0x0b21, 0x03, 0x0b22, 0x00, 0x0b24, 0x0e, 0x0b25, 0x0e, 0x0b26, 0x00, 0x0b28, 0x03, 0x0b29, 0x03, 0x0b2a, 0x00, 0x0b2c, 0x12, 0x0b2d, 0x12, 0x0b2e, 0x00, 0x0b30, 0x08, 0x0b31, 0x08, 0x0b32, 0x00, 0x0b34, 0x14, 0x0b35, 0x14, 0x0b36, 0x00, 0x0b38, 0x10, 0x0b39, 0x10, 0x0b3a, 0x00, 0x0b3c, 0x16, 0x0b3d, 0x16, 0x0b3e, 0x00, 0x0b40, 0x10, 0x0b41, 0x10, 0x0b42, 0x00, 0x0b44, 0x19, 0x0b45, 0x19, 0x0b46, 0x00, 0x0b48, 0x16, 0x0b49, 0x16, 0x0b4a, 0x00, 0x0b4c, 0x19, 0x0b4d, 0x19, 0x0b4e, 0x00, 0x0b50, 0x16, 0x0b51, 0x16, 0x0b52, 0x00, 0x0b80, 0x01, 0x0b81, 0x00, 0x0b82, 0x00, 0x0b84, 0x00, 0x0b85, 0x00, 0x0b86, 0x00, 0x0b88, 0x01, 0x0b89, 0x6a, 0x0b8a, 0x00, 0x0b8c, 0x00, 0x0b8d, 0x01, 0x0b8e, 0x00, 0x0b90, 0x01, 0x0b91, 0xf6, 0x0b92, 0x00, 0x0b94, 0x00, 0x0b95, 0x02, 0x0b96, 0x00, 0x0b98, 0x02, 0x0b99, 0xc4, 0x0b9a, 0x00, 0x0b9c, 0x00, 0x0b9d, 0x03, 0x0b9e, 0x00, 0x0ba0, 0x03, 0x0ba1, 0xd8, 0x0ba2, 0x00, 0x0ba4, 0x00, 0x0ba5, 0x04, 0x0ba6, 0x00, 0x0ba8, 0x05, 0x0ba9, 0x4d, 0x0baa, 0x00, 0x0bac, 0x00, 0x0bad, 0x05, 0x0bae, 0x00, 0x0bb0, 0x07, 0x0bb1, 0x3e, 0x0bb2, 0x00, 0x0bb4, 0x00, 0x0bb5, 0x06, 0x0bb6, 0x00, 0x0bb8, 0x0a, 0x0bb9, 0x1a, 0x0bba, 0x00, 0x0bbc, 0x09, 0x0bbd, 0x36, 0x0bbe, 0x00, 0x0bc0, 0x0e, 0x0bc1, 0x66, 0x0bc2, 0x00, 0x0bc4, 0x10, 0x0bc5, 0x06, 0x0bc6, 0x00, 0x02c1, 0xe0, 0x0207, 0x04, 0x02c2, 0x10, 0x02c3, 0x74, 0x02C5, 0x09, 0x02c1, 0xe0,//20221121 0x0207, 0x04, 0x02c2, 0x10, 0x02c5, 0x09, 0x02c1, 0xe0, 0x0207, 0x04, 0x02c2, 0x10, 0x02c5, 0x09, /*auto load CH_GAIN*/ 0x0aa1, 0x15, 0x0aa2, 0x50, 0x0aa3, 0x00, 0x0aa4, 0x09, 0x0a90, 0x25, 0x0a91, 0x0e, 0x0a94, 0x80, /*ISP*/ 0x0050, 0x00, 0x0089, 0x83, 0x005a, 0x40, 0x00c3, 0x35, 0x00c4, 0x80, 0x0080, 0x10, 0x0040, 0x12, 0x0053, 0x0a, 0x0054, 0x44, 0x0055, 0x32, 0x0058, 0x89, 0x004a, 0x03, 0x0048, 0xf0, 0x0049, 0x0f, 0x0041, 0x20, 0x0043, 0x0a, 0x009d, 0x08, 0x0236, 0x40, /*gain*/ 0x0204, 0x04, 0x0205, 0x00, 0x02b3, 0x00, 0x02b4, 0x00, 0x009e, 0x01, 0x009f, 0x94, /*OUT 2592x1944*/ 0x0350, 0x01, 0x0353, 0x00, 0x0354, 0x08, 0x034c, 0x0a, 0x034d, 0x20, 0x021f, 0x14, /*auto load REG*/ 0x0aa1, 0x10, 0x0aa2, 0xf8, 0x0aa3, 0x00, 0x0aa4, 0x1f, 0x0a90, 0x11, 0x0a91, 0x0e, 0x0a94, 0x80, 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00,//20221121 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00, 0x0a90, 0x00, 0x0a70, 0x00, 0x0a67, 0x00, 0x0af4, 0x29, /*DPHY */ 0x0d80, 0x07, 0x0dd3, 0x1c, /*MIPI*/ 0x0107, 0x05, 0x0117, 0x01, 0x0d81, 0x00, /*CISCTL_Reset*/ 0x031c, 0x80, 0x03fe, 0x30, 0x0d17, 0x06, 0x03fe, 0x00, 0x0d17, 0x00, 0x031c, 0x93, 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00, 0x031c, 0x80, 0x03fe, 0x30, 0x0d17, 0x06, 0x03fe, 0x00, 0x0d17, 0x00, 0x031c, 0x93, }; static kal_uint16 gc05a2_1296x972_addr_data[] = { /*system*/ 0x0315, 0xd4, 0x0d06, 0x01, 0x0a70, 0x80, 0x031a, 0x00, 0x0314, 0x00, 0x0130, 0x08, 0x0132, 0x01, 0x0135, 0x05, 0x0136, 0x38, 0x0137, 0x03, 0x0134, 0x5b, 0x031c, 0xe0, 0x0d82, 0x14, 0x0dd1, 0x56, /*gate_mode*/ 0x0af4, 0x01, 0x0002, 0x10, 0x00c3, 0x34, /*pre_setting*/ 0x0084, 0x21, 0x0d05, 0xcc, 0x0218, 0x80, 0x005e, 0x49, 0x0d06, 0x81, 0x0007, 0x16, /*analog */ 0x0342, 0x07, 0x0343, 0x10, 0x0220, 0x0f, 0x0221, 0xe0, 0x0202, 0x03, 0x0203, 0x32, 0x0340, 0x08, 0x0341, 0x10, 0x0346, 0x00, 0x0347, 0x04, 0x0d14, 0x00, 0x0d13, 0x05, 0x0d16, 0x05, 0x0d15, 0x1d, 0x00c0, 0x0a, 0x00c1, 0x30, 0x034a, 0x07, 0x034b, 0xa8, 0x000b, 0x0e, 0x0008, 0x03, 0x0223, 0x16, /*auto load DD*/ 0x00ca, 0x00, 0x00cb, 0x00, 0x00cc, 0x00, 0x00cd, 0x00, /*ISP*/ 0x00c3, 0x35, 0x0053, 0x0a, 0x0054, 0x44, 0x0055, 0x32, /*OUT 1296x972*/ 0x0350, 0x01, 0x0353, 0x00, 0x0354, 0x04, 0x034c, 0x05, 0x034d, 0x10, 0x021f, 0x14, /*MIPI*/ 0x0d84, 0x06, 0x0d85, 0x54, 0x0d86, 0x03, 0x0d87, 0x2b, 0x0db3, 0x03, 0x0db4, 0x04, 0x0db5, 0x0d, 0x0db6, 0x01, 0x0db8, 0x04, 0x0db9, 0x06, 0x0d93, 0x03, 0x0d94, 0x04, 0x0d95, 0x05, 0x0d99, 0x06, 0x0084, 0x01, /*CISCTL_Reset*/ 0x031c, 0x80, 0x03fe, 0x30, 0x0d17, 0x06, 0x03fe, 0x00, 0x0d17, 0x00, 0x031c, 0x93, 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00, 0x031c, 0x80, 0x03fe, 0x30, 0x0d17, 0x06, 0x03fe, 0x00, 0x0d17, 0x00, 0x031c, 0x93, /*OUT*/ 0x0110, 0x01, }; static kal_uint16 gc05a2_normal_video_addr_data[] = { /*system*/ 0x0315, 0xd4, 0x0d06, 0x01, 0x0a70, 0x80, 0x031a, 0x00, 0x0314, 0x00, 0x0130, 0x08, 0x0132, 0x01, 0x0135, 0x05, 0x0136, 0x38, 0x0137, 0x03, 0x0134, 0x5b, 0x031c, 0xe0, 0x0d82, 0x14, 0x0dd1, 0x56, /*gate_mode*/ 0x0af4, 0x01, 0x0002, 0x10, 0x00c3, 0x34, /*pre_setting*/ 0x0084, 0x21, 0x0d05, 0xcc, 0x0218, 0x80, 0x005e, 0x49, 0x0d06, 0x81, 0x0007, 0x16, /*analog */ 0x0342, 0x07, 0x0343, 0x10, 0x0220, 0x0f, 0x0221, 0xe0, 0x0202, 0x03, 0x0203, 0x32, 0x0340, 0x08, 0x0341, 0x10, 0x0346, 0x00, 0x0347, 0x04, 0x0d14, 0x00, 0x0d13, 0x05, 0x0d16, 0x05, 0x0d15, 0x1d, 0x00c0, 0x0a, 0x00c1, 0x30, 0x034a, 0x07, 0x034b, 0xa8, 0x000b, 0x0e, 0x0008, 0x03, 0x0223, 0x16, /*auto load DD*/ 0x00ca, 0x00, 0x00cb, 0x00, 0x00cc, 0x00, 0x00cd, 0x00, /*ISP*/ 0x00c3, 0x35, 0x0053, 0x0a, 0x0054, 0x44, 0x0055, 0x32, /*OUT 1296x972*/ 0x0350, 0x01, 0x0353, 0x00, 0x0354, 0x04, 0x034c, 0x05, 0x034d, 0x10, 0x021f, 0x14, /*MIPI*/ 0x0d84, 0x06, 0x0d85, 0x54, 0x0d86, 0x03, 0x0d87, 0x2b, 0x0db3, 0x03, 0x0db4, 0x04, 0x0db5, 0x0d, 0x0db6, 0x01, 0x0db8, 0x08, 0x0db9, 0x06, 0x0d93, 0x03, 0x0d94, 0x04, 0x0d95, 0x05, 0x0d99, 0x06, 0x0084, 0x01, /*CISCTL_Reset*/ 0x031c, 0x80, 0x03fe, 0x30, 0x0d17, 0x06, 0x03fe, 0x00, 0x0d17, 0x00, 0x031c, 0x93, 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00, 0x031c, 0x80, 0x03fe, 0x30, 0x0d17, 0x06, 0x03fe, 0x00, 0x0d17, 0x00, 0x031c, 0x93, /*OUT*/ 0x0110, 0x01, }; static kal_uint16 gc05a2_2592x1944_addr_data[] = { /*system*/ 0x0315, 0xd4, 0x0d06, 0x01, 0x0a70, 0x80, 0x031a, 0x00, 0x0314, 0x00, 0x0130, 0x08, 0x0132, 0x01, 0x0135, 0x01, 0x0136, 0x38, 0x0137, 0x03, 0x0134, 0x5b, 0x031c, 0xe0, 0x0d82, 0x14, 0x0dd1, 0x56, /*gate_mode*/ 0x0af4, 0x01, 0x0002, 0x10, 0x00c3, 0x34, /*pre_setting*/ 0x0084, 0x21, 0x0d05, 0xcc, 0x0218, 0x00, 0x005e, 0x48, 0x0d06, 0x01, 0x0007, 0x16, /*analog*/ 0x0342, 0x07, 0x0343, 0x28, 0x0220, 0x07, 0x0221, 0xd0, 0x0202, 0x07, 0x0203, 0x32, 0x0340, 0x07, 0x0341, 0xf0, 0x0346, 0x00, 0x0347, 0x04, 0x0d14, 0x00, 0x0d13, 0x05, 0x0d16, 0x05, 0x0d15, 0x1d, 0x00c0, 0x0a, 0x00c1, 0x30, 0x034a, 0x07, 0x034b, 0xa8, 0x000b, 0x10, 0x0008, 0x08, 0x0223, 0x17, /* auto load DD*/ 0x00ca, 0x00, 0x00cb, 0x00, 0x00cc, 0x00, 0x00cd, 0x00, /*ISP*/ 0x00c3, 0x35, 0x0053, 0x0a, 0x0054, 0x44, 0x0055, 0x32, /*OUT 2592x1944*/ 0x0350, 0x01, 0x0353, 0x00, 0x0354, 0x08, 0x034c, 0x0a, 0x034d, 0x20, 0x021f, 0x14, /*MIPI*/ 0x0d84, 0x0c, 0x0d85, 0xa8, 0x0d86, 0x06, 0x0d87, 0x55, 0x0db3, 0x06, 0x0db4, 0x08, 0x0db5, 0x1e, 0x0db6, 0x02, 0x0db8, 0x12, 0x0db9, 0x0a, 0x0d93, 0x06, 0x0d94, 0x09, 0x0d95, 0x0d, 0x0d99, 0x0b, 0x0084, 0x01, /* CISCTL_Reset*/ 0x031c, 0x80, 0x03fe, 0x30, 0x0d17, 0x06, 0x03fe, 0x00, 0x0d17, 0x00, 0x031c, 0x93, 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00, 0x031c, 0x80, 0x03fe, 0x30, 0x0d17, 0x06, 0x03fe, 0x00, 0x0d17, 0x00, 0x031c, 0x93, /*OUT*/ 0x0110, 0x01, }; static kal_uint16 gc05a2_1280x720_addr_data[] = { /*system*/ 0x0315, 0xd4, 0x0d06, 0x01, 0x0a70, 0x80, 0x031a, 0x00, 0x0314, 0x00, 0x0130, 0x08, 0x0132, 0x01, 0x0135, 0x05, 0x0136, 0x38, 0x0137, 0x03, 0x0134, 0x5b, 0x031c, 0xe0, 0x0d82, 0x14, 0x0dd1, 0x56, /*gate_mode*/ 0x0af4, 0x01, 0x0002, 0x10, 0x00c3, 0x34, /*pre_setting*/ 0x0084, 0x21, 0x0d05, 0xcc, 0x0218, 0x80, 0x005e, 0x49, 0x0d06, 0x81, 0x0007, 0x16, /*analog */ 0x0342, 0x07, 0x0343, 0x10, 0x0220, 0x07, 0x0221, 0xd0, 0x0202, 0x03, 0x0203, 0x32, 0x0340, 0x04, 0x0341, 0x08, 0x0346, 0x01, 0x0347, 0x00, 0x0d14, 0x00, 0x0d13, 0x05, 0x0d16, 0x05, 0x0d15, 0x1d, 0x00c0, 0x0a, 0x00c1, 0x30, 0x034a, 0x05, 0x034b, 0xb0, 0x000b, 0x0e, 0x0008, 0x03, 0x0223, 0x16, /*auto load DD*/ 0x00ca, 0x00, 0x00cb, 0xfc, 0x00cc, 0x00, 0x00cd, 0x00, /*ISP*/ 0x00c3, 0x35, 0x0053, 0x0a, 0x0054, 0x44, 0x0055, 0x32, /*OUT 1280x720*/ 0x0350, 0x01, 0x0353, 0x00, 0x0354, 0x0c, 0x034c, 0x05, 0x034d, 0x00, 0x021f, 0x14, /*MIPI*/ 0x0d84, 0x06, 0x0d85, 0x40, 0x0d86, 0x03, 0x0d87, 0x21, 0x0db3, 0x03, 0x0db4, 0x04, 0x0db5, 0x0d, 0x0db6, 0x01, 0x0db8, 0x04, 0x0db9, 0x06, 0x0d93, 0x03, 0x0d94, 0x04, 0x0d95, 0x05, 0x0d99, 0x06, 0x0084, 0x01, /*CISCTL_Reset*/ 0x031c, 0x80, 0x03fe, 0x30, 0x0d17, 0x06, 0x03fe, 0x00, 0x0d17, 0x00, 0x031c, 0x93, 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00, 0x03fe, 0x00, 0x031c, 0x80, 0x03fe, 0x30, 0x0d17, 0x06, 0x03fe, 0x00, 0x0d17, 0x00, 0x031c, 0x93, /*OUT*/ 0x0110, 0x01, }; static void gc05a2_stream_on(void) { write_cmos_sensor_8bit(0x0100, 0x01); } static void gc05a2_stream_off(void) { write_cmos_sensor_8bit(0x0100, 0x00); } static void sensor_init(void) { table_write_cmos_sensor(gc05a2_init_addr_data, sizeof(gc05a2_init_addr_data)/sizeof(kal_uint16)); } static void preview_setting(void) { gc05a2_stream_off(); table_write_cmos_sensor(gc05a2_1296x972_addr_data, sizeof(gc05a2_1296x972_addr_data)/sizeof(kal_uint16)); gc05a2_stream_on(); } static void capture_setting(void) { gc05a2_stream_off(); table_write_cmos_sensor(gc05a2_2592x1944_addr_data, sizeof(gc05a2_2592x1944_addr_data)/sizeof(kal_uint16)); gc05a2_stream_on(); } static void normal_video_setting(void) { gc05a2_stream_off(); table_write_cmos_sensor(gc05a2_normal_video_addr_data, sizeof(gc05a2_normal_video_addr_data)/sizeof(kal_uint16)); gc05a2_stream_on(); } static void hs_video_setting(void) { gc05a2_stream_off(); table_write_cmos_sensor(gc05a2_1296x972_addr_data, sizeof(gc05a2_1296x972_addr_data)/sizeof(kal_uint16)); gc05a2_stream_on(); } static void slim_video_setting(void) { gc05a2_stream_off(); table_write_cmos_sensor(gc05a2_1280x720_addr_data, sizeof(gc05a2_1280x720_addr_data)/sizeof(kal_uint16)); gc05a2_stream_on(); } static kal_uint32 set_test_pattern_mode(kal_bool enable) { LOG_INF("enable: %d\n", enable); if (enable){ write_cmos_sensor_8bit(0x008c, 0x01); write_cmos_sensor_8bit(0x008d, 0x00); } else { write_cmos_sensor_8bit(0x008c, 0x00); write_cmos_sensor_8bit(0x008d, 0x00); } printk("test_pattern 0x008c=%x 0x008d=%x",read_cmos_sensor(0x008c),read_cmos_sensor(0x008d)); spin_lock(&imgsensor_drv_lock); imgsensor.test_pattern = enable; spin_unlock(&imgsensor_drv_lock); return ERROR_NONE; } static kal_uint32 streaming_control(kal_bool enable) { printk("streaming_enable(0=Sw Standby,1=streaming): %d\n", enable); if (enable) { write_cmos_sensor(0x0100,0x01); mdelay(10);//delay 10ms } else { write_cmos_sensor(0x0100, 0x00); mdelay(10);//delay 10ms } //mdelay(10); return ERROR_NONE; } static kal_uint32 get_imgsensor_id(UINT32 *sensor_id) { kal_uint8 i = 0; kal_uint8 retry = 2; while (imgsensor_info.i2c_addr_table[i] != 0xff) { spin_lock(&imgsensor_drv_lock); imgsensor.i2c_write_id = imgsensor_info.i2c_addr_table[i]; spin_unlock(&imgsensor_drv_lock); do { *sensor_id = return_sensor_id() + SENSOR_ID_OFFSET_MADRID; if (*sensor_id == imgsensor_info.sensor_id) { pr_debug("[gc05a2_camera_sensor]get_imgsensor_id:i2c write id: 0x%x, sensor id: 0x%x\n", imgsensor.i2c_write_id, *sensor_id); return ERROR_NONE; } pr_debug("[gc05a2_camera_sensor]get_imgsensor_id:Read sensor id fail, write id: 0x%x, id: 0x%x\n", imgsensor.i2c_write_id, *sensor_id); retry--; } while (retry > 0); i++; retry = 2; } if (*sensor_id != imgsensor_info.sensor_id) { /* if Sensor ID is not correct, Must set *sensor_id to 0xFFFFFFFF */ *sensor_id = 0xFFFFFFFF; return ERROR_SENSOR_CONNECT_FAIL; } return ERROR_NONE; } static kal_uint32 open(void) { kal_uint8 i = 0; kal_uint8 retry = 2; kal_uint32 sensor_id = 0; LOG_1; LOG_INF("imgsensor_open\n"); while (imgsensor_info.i2c_addr_table[i] != 0xff) { spin_lock(&imgsensor_drv_lock); imgsensor.i2c_write_id = imgsensor_info.i2c_addr_table[i]; spin_unlock(&imgsensor_drv_lock); do { sensor_id = return_sensor_id() + SENSOR_ID_OFFSET_MADRID; if (sensor_id == imgsensor_info.sensor_id) { pr_debug("[gc05a2_camera_sensor]open:i2c write id: 0x%x, sensor id: 0x%x\n", imgsensor.i2c_write_id, sensor_id); break; } pr_debug("[gc05a2_camera_sensor]open:Read sensor id fail, write id: 0x%x, id: 0x%x\n", imgsensor.i2c_write_id, sensor_id); retry--; } while (retry > 0); i++; if (sensor_id == imgsensor_info.sensor_id) break; retry = 2; } if (imgsensor_info.sensor_id != sensor_id) return ERROR_SENSOR_CONNECT_FAIL; /* initail sequence write in */ sensor_init(); spin_lock(&imgsensor_drv_lock); imgsensor.autoflicker_en = KAL_FALSE; imgsensor.sensor_mode = IMGSENSOR_MODE_INIT; imgsensor.pclk = imgsensor_info.pre.pclk; imgsensor.frame_length = imgsensor_info.pre.framelength; imgsensor.line_length = imgsensor_info.pre.linelength; imgsensor.min_frame_length = imgsensor_info.pre.framelength; imgsensor.dummy_pixel = 0; imgsensor.dummy_line = 0; imgsensor.ihdr_en = 0; imgsensor.test_pattern = KAL_FALSE; imgsensor.current_fps = imgsensor_info.pre.max_framerate; spin_unlock(&imgsensor_drv_lock); return ERROR_NONE; } static kal_uint32 close(void) { LOG_INF("E\n"); /* No Need to implement this function */ streaming_control(KAL_FALSE); return ERROR_NONE; } static kal_uint32 preview(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) { LOG_INF("E\n"); spin_lock(&imgsensor_drv_lock); imgsensor.sensor_mode = IMGSENSOR_MODE_PREVIEW; imgsensor.pclk = imgsensor_info.pre.pclk; /* imgsensor.video_mode = KAL_FALSE; */ imgsensor.line_length = imgsensor_info.pre.linelength; imgsensor.frame_length = imgsensor_info.pre.framelength; imgsensor.min_frame_length = imgsensor_info.pre.framelength; imgsensor.autoflicker_en = KAL_TRUE; spin_unlock(&imgsensor_drv_lock); preview_setting(); return ERROR_NONE; } static kal_uint32 capture(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) { LOG_INF("E\n"); spin_lock(&imgsensor_drv_lock); imgsensor.sensor_mode = IMGSENSOR_MODE_CAPTURE; if (imgsensor.current_fps != imgsensor_info.cap.max_framerate) LOG_INF("Warning: current_fps %d fps is not support, so use cap&#39;s setting: %d fps!\n", imgsensor.current_fps, imgsensor_info.cap.max_framerate / 10); imgsensor.pclk = imgsensor_info.cap.pclk; imgsensor.line_length = imgsensor_info.cap.linelength; imgsensor.frame_length = imgsensor_info.cap.framelength; imgsensor.min_frame_length = imgsensor_info.cap.framelength; imgsensor.autoflicker_en = KAL_TRUE; spin_unlock(&imgsensor_drv_lock); capture_setting(); return ERROR_NONE; } static kal_uint32 normal_video(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) { LOG_INF("E\n"); spin_lock(&imgsensor_drv_lock); imgsensor.sensor_mode = IMGSENSOR_MODE_VIDEO; imgsensor.pclk = imgsensor_info.normal_video.pclk; imgsensor.line_length = imgsensor_info.normal_video.linelength; imgsensor.frame_length = imgsensor_info.normal_video.framelength; imgsensor.min_frame_length = imgsensor_info.normal_video.framelength; /*imgsensor.current_fps = 300*/ imgsensor.autoflicker_en = KAL_TRUE; spin_unlock(&imgsensor_drv_lock); normal_video_setting(); return ERROR_NONE; } static kal_uint32 hs_video(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) { LOG_INF("E\n"); spin_lock(&imgsensor_drv_lock); imgsensor.sensor_mode = IMGSENSOR_MODE_HIGH_SPEED_VIDEO; imgsensor.pclk = imgsensor_info.hs_video.pclk; /* imgsensor.video_mode = KAL_TRUE; */ imgsensor.line_length = imgsensor_info.hs_video.linelength; imgsensor.frame_length = imgsensor_info.hs_video.framelength; imgsensor.min_frame_length = imgsensor_info.hs_video.framelength; imgsensor.dummy_line = 0; imgsensor.dummy_pixel = 0; imgsensor.autoflicker_en = KAL_TRUE; spin_unlock(&imgsensor_drv_lock); hs_video_setting(); return ERROR_NONE; } static kal_uint32 slim_video(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) { LOG_INF("E\n"); spin_lock(&imgsensor_drv_lock); imgsensor.sensor_mode = IMGSENSOR_MODE_SLIM_VIDEO; imgsensor.pclk = imgsensor_info.slim_video.pclk; imgsensor.line_length = imgsensor_info.slim_video.linelength; imgsensor.frame_length = imgsensor_info.slim_video.framelength; imgsensor.min_frame_length = imgsensor_info.slim_video.framelength; imgsensor.dummy_line = 0; imgsensor.dummy_pixel = 0; imgsensor.autoflicker_en = KAL_TRUE; spin_unlock(&imgsensor_drv_lock); slim_video_setting(); return ERROR_NONE; } static kal_uint32 get_resolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *sensor_resolution) { LOG_INF("E\n"); sensor_resolution->SensorFullWidth = imgsensor_info.cap.grabwindow_width; sensor_resolution->SensorFullHeight = imgsensor_info.cap.grabwindow_height; sensor_resolution->SensorPreviewWidth = imgsensor_info.pre.grabwindow_width; sensor_resolution->SensorPreviewHeight = imgsensor_info.pre.grabwindow_height; sensor_resolution->SensorVideoWidth = imgsensor_info.normal_video.grabwindow_width; sensor_resolution->SensorVideoHeight = imgsensor_info.normal_video.grabwindow_height; sensor_resolution->SensorHighSpeedVideoWidth = imgsensor_info.hs_video.grabwindow_width; sensor_resolution->SensorHighSpeedVideoHeight = imgsensor_info.hs_video.grabwindow_height; sensor_resolution->SensorSlimVideoWidth = imgsensor_info.slim_video.grabwindow_width; sensor_resolution->SensorSlimVideoHeight = imgsensor_info.slim_video.grabwindow_height; return ERROR_NONE; } static kal_uint32 get_info(enum MSDK_SCENARIO_ID_ENUM scenario_id, MSDK_SENSOR_INFO_STRUCT *sensor_info, MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) { LOG_INF("scenario_id = %d\n", scenario_id); sensor_info->SensorClockPolarity = SENSOR_CLOCK_POLARITY_LOW; sensor_info->SensorClockFallingPolarity = SENSOR_CLOCK_POLARITY_LOW; /* not use */ sensor_info->SensorHsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; /* inverse with datasheet */ sensor_info->SensorVsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; sensor_info->SensorInterruptDelayLines = 4; /* not use */ sensor_info->SensorResetActiveHigh = FALSE; /* not use */ sensor_info->SensorResetDelayCount = 5; /* not use */ sensor_info->SensroInterfaceType = imgsensor_info.sensor_interface_type; sensor_info->MIPIsensorType = imgsensor_info.mipi_sensor_type; sensor_info->SettleDelayMode = imgsensor_info.mipi_settle_delay_mode; sensor_info->SensorOutputDataFormat = imgsensor_info.sensor_output_dataformat; sensor_info->CaptureDelayFrame = imgsensor_info.cap_delay_frame; sensor_info->PreviewDelayFrame = imgsensor_info.pre_delay_frame; sensor_info->VideoDelayFrame = imgsensor_info.video_delay_frame; sensor_info->HighSpeedVideoDelayFrame = imgsensor_info.hs_video_delay_frame; sensor_info->SlimVideoDelayFrame = imgsensor_info.slim_video_delay_frame; sensor_info->SensorMasterClockSwitch = 0; /* not use */ sensor_info->SensorDrivingCurrent = imgsensor_info.isp_driving_current; sensor_info->AEShutDelayFrame = imgsensor_info.ae_shut_delay_frame; sensor_info->AESensorGainDelayFrame = imgsensor_info.ae_sensor_gain_delay_frame; sensor_info->AEISPGainDelayFrame = imgsensor_info.ae_ispGain_delay_frame; sensor_info->IHDR_Support = imgsensor_info.ihdr_support; sensor_info->IHDR_LE_FirstLine = imgsensor_info.ihdr_le_firstline; sensor_info->SensorModeNum = imgsensor_info.sensor_mode_num; sensor_info->SensorMIPILaneNumber = imgsensor_info.mipi_lane_num; sensor_info->SensorClockFreq = imgsensor_info.mclk; sensor_info->SensorClockDividCount = 3; /* not use */ sensor_info->SensorClockRisingCount = 0; sensor_info->SensorClockFallingCount = 2; /* not use */ sensor_info->SensorPixelClockCount = 3; /* not use */ sensor_info->SensorDataLatchCount = 2; /* not use */ sensor_info->MIPIDataLowPwr2HighSpeedTermDelayCount = 0; sensor_info->MIPICLKLowPwr2HighSpeedTermDelayCount = 0; sensor_info->SensorWidthSampling = 0; /* 0 is default 1x */ sensor_info->SensorHightSampling = 0; /* 0 is default 1x */ sensor_info->SensorPacketECCOrder = 1; switch (scenario_id) { case MSDK_SCENARIO_ID_CAMERA_PREVIEW: sensor_info->SensorGrabStartX = imgsensor_info.pre.startx; sensor_info->SensorGrabStartY = imgsensor_info.pre.starty; sensor_info->MIPIDataLowPwr2HighSpeedSettleDelayCount = imgsensor_info.pre.mipi_data_lp2hs_settle_dc; break; case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: sensor_info->SensorGrabStartX = imgsensor_info.cap.startx; sensor_info->SensorGrabStartY = imgsensor_info.cap.starty; sensor_info->MIPIDataLowPwr2HighSpeedSettleDelayCount = imgsensor_info.cap.mipi_data_lp2hs_settle_dc; break; case MSDK_SCENARIO_ID_VIDEO_PREVIEW: sensor_info->SensorGrabStartX = imgsensor_info.normal_video.startx; sensor_info->SensorGrabStartY = imgsensor_info.normal_video.starty; sensor_info->MIPIDataLowPwr2HighSpeedSettleDelayCount = imgsensor_info.normal_video.mipi_data_lp2hs_settle_dc; break; case MSDK_SCENARIO_ID_HIGH_SPEED_VIDEO: sensor_info->SensorGrabStartX = imgsensor_info.hs_video.startx; sensor_info->SensorGrabStartY = imgsensor_info.hs_video.starty; sensor_info->MIPIDataLowPwr2HighSpeedSettleDelayCount = imgsensor_info.hs_video.mipi_data_lp2hs_settle_dc; break; case MSDK_SCENARIO_ID_SLIM_VIDEO: sensor_info->SensorGrabStartX = imgsensor_info.slim_video.startx; sensor_info->SensorGrabStartY = imgsensor_info.slim_video.starty; sensor_info->MIPIDataLowPwr2HighSpeedSettleDelayCount = imgsensor_info.slim_video.mipi_data_lp2hs_settle_dc; break; default: sensor_info->SensorGrabStartX = imgsensor_info.pre.startx; sensor_info->SensorGrabStartY = imgsensor_info.pre.starty; sensor_info->MIPIDataLowPwr2HighSpeedSettleDelayCount = imgsensor_info.pre.mipi_data_lp2hs_settle_dc; break; } return ERROR_NONE; } static kal_uint32 control(enum MSDK_SCENARIO_ID_ENUM scenario_id, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) { LOG_INF("scenario_id = %d\n", scenario_id); spin_lock(&imgsensor_drv_lock); imgsensor.current_scenario_id = scenario_id; spin_unlock(&imgsensor_drv_lock); switch (scenario_id) { case MSDK_SCENARIO_ID_CAMERA_PREVIEW: preview(image_window, sensor_config_data); break; case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: capture(image_window, sensor_config_data); break; case MSDK_SCENARIO_ID_VIDEO_PREVIEW: normal_video(image_window, sensor_config_data); break; case MSDK_SCENARIO_ID_HIGH_SPEED_VIDEO: hs_video(image_window, sensor_config_data); break; case MSDK_SCENARIO_ID_SLIM_VIDEO: slim_video(image_window, sensor_config_data); break; default: LOG_INF("Error ScenarioId setting"); preview(image_window, sensor_config_data); return ERROR_INVALID_SCENARIO_ID; } return ERROR_NONE; } static kal_uint32 set_video_mode(UINT16 framerate) { /*This Function not used after ROME*/ LOG_INF("framerate = %d\n ", framerate); /* SetVideoMode Function should fix framerate */ /*********** *if (framerate == 0) //Dynamic frame rate * return ERROR_NONE; *spin_lock(&imgsensor_drv_lock); *if ((framerate == 300) && (imgsensor.autoflicker_en == KAL_TRUE)) * imgsensor.current_fps = 296; *else if ((framerate == 150) && (imgsensor.autoflicker_en == KAL_TRUE)) * imgsensor.current_fps = 146; *else * imgsensor.current_fps = framerate; *spin_unlock(&imgsensor_drv_lock); *set_max_framerate(imgsensor.current_fps, 1); ********/ return ERROR_NONE; } static kal_uint32 set_auto_flicker_mode(kal_bool enable, UINT16 framerate) { LOG_INF("enable = %d, framerate = %d\n", enable, framerate); spin_lock(&imgsensor_drv_lock); if (enable) /* enable auto flicker */ imgsensor.autoflicker_en = KAL_TRUE; else /* Cancel Auto flick */ imgsensor.autoflicker_en = KAL_FALSE; spin_unlock(&imgsensor_drv_lock); return ERROR_NONE; } static kal_uint32 set_max_framerate_by_scenario(enum MSDK_SCENARIO_ID_ENUM scenario_id, MUINT32 framerate) { kal_uint32 frame_length; LOG_INF("scenario_id = %d, framerate = %d\n", scenario_id, framerate); switch (scenario_id) { case MSDK_SCENARIO_ID_CAMERA_PREVIEW: frame_length = imgsensor_info.pre.pclk / framerate * 10 / imgsensor_info.pre.linelength; spin_lock(&imgsensor_drv_lock); imgsensor.dummy_line = (frame_length > imgsensor_info.pre.framelength) ? (frame_length - imgsensor_info.pre.framelength) : 0; imgsensor.frame_length = imgsensor_info.pre.framelength + imgsensor.dummy_line; imgsensor.min_frame_length = imgsensor.frame_length; spin_unlock(&imgsensor_drv_lock); set_dummy(); break; case MSDK_SCENARIO_ID_VIDEO_PREVIEW: if (framerate == 0) return ERROR_NONE; frame_length = imgsensor_info.normal_video.pclk / framerate * 10 / imgsensor_info.normal_video.linelength; spin_lock(&imgsensor_drv_lock); imgsensor.dummy_line = (frame_length > imgsensor_info.normal_video.framelength) ? (frame_length - imgsensor_info.normal_video.framelength) : 0; imgsensor.frame_length = imgsensor_info.normal_video.framelength + imgsensor.dummy_line; imgsensor.min_frame_length = imgsensor.frame_length; spin_unlock(&imgsensor_drv_lock); set_dummy(); break; case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: if (imgsensor.current_fps != imgsensor_info.cap.max_framerate) LOG_INF("Warning: current_fps %d fps is not support, so use cap&#39;s setting: %d fps!\n", framerate, imgsensor_info.cap.max_framerate / 10); frame_length = imgsensor_info.cap.pclk / framerate * 10 / imgsensor_info.cap.linelength; spin_lock(&imgsensor_drv_lock); imgsensor.dummy_line = (frame_length > imgsensor_info.cap.framelength) ? (frame_length - imgsensor_info.cap.framelength) : 0; imgsensor.frame_length = imgsensor_info.cap.framelength + imgsensor.dummy_line; imgsensor.min_frame_length = imgsensor.frame_length; spin_unlock(&imgsensor_drv_lock); set_dummy(); break; case MSDK_SCENARIO_ID_HIGH_SPEED_VIDEO: frame_length = imgsensor_info.hs_video.pclk / framerate * 10 / imgsensor_info.hs_video.linelength; spin_lock(&imgsensor_drv_lock); imgsensor.dummy_line = (frame_length > imgsensor_info.hs_video.framelength) ? (frame_length - imgsensor_info.hs_video.framelength) : 0; imgsensor.frame_length = imgsensor_info.hs_video.framelength + imgsensor.dummy_line; imgsensor.min_frame_length = imgsensor.frame_length; spin_unlock(&imgsensor_drv_lock); set_dummy(); break; case MSDK_SCENARIO_ID_SLIM_VIDEO: frame_length = imgsensor_info.slim_video.pclk / framerate * 10 / imgsensor_info.slim_video.linelength; spin_lock(&imgsensor_drv_lock); imgsensor.dummy_line = (frame_length > imgsensor_info.slim_video.framelength) ? (frame_length - imgsensor_info.slim_video.framelength) : 0; imgsensor.frame_length = imgsensor_info.slim_video.framelength + imgsensor.dummy_line; imgsensor.min_frame_length = imgsensor.frame_length; spin_unlock(&imgsensor_drv_lock); set_dummy(); break; default: frame_length = imgsensor_info.pre.pclk / framerate * 10 / imgsensor_info.pre.linelength; spin_lock(&imgsensor_drv_lock); imgsensor.dummy_line = (frame_length > imgsensor_info.pre.framelength) ? (frame_length - imgsensor_info.pre.framelength) : 0; imgsensor.frame_length = imgsensor_info.pre.framelength + imgsensor.dummy_line; imgsensor.min_frame_length = imgsensor.frame_length; spin_unlock(&imgsensor_drv_lock); set_dummy(); LOG_INF("error scenario_id = %d, we use preview scenario\n", scenario_id); break; } return ERROR_NONE; } static kal_uint32 get_default_framerate_by_scenario(enum MSDK_SCENARIO_ID_ENUM scenario_id, MUINT32 *framerate) { LOG_INF("scenario_id = %d\n", scenario_id); switch (scenario_id) { case MSDK_SCENARIO_ID_CAMERA_PREVIEW: *framerate = imgsensor_info.pre.max_framerate; break; case MSDK_SCENARIO_ID_VIDEO_PREVIEW: *framerate = imgsensor_info.normal_video.max_framerate; break; case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: *framerate = imgsensor_info.cap.max_framerate; break; case MSDK_SCENARIO_ID_HIGH_SPEED_VIDEO: *framerate = imgsensor_info.hs_video.max_framerate; break; case MSDK_SCENARIO_ID_SLIM_VIDEO: *framerate = imgsensor_info.slim_video.max_framerate; break; default: break; } return ERROR_NONE; } static kal_uint32 feature_control(MSDK_SENSOR_FEATURE_ENUM feature_id, UINT8 *feature_para, UINT32 *feature_para_len) { UINT16 *feature_return_para_16 = (UINT16 *)feature_para; UINT16 *feature_data_16 = (UINT16 *)feature_para; UINT32 *feature_return_para_32 = (UINT32 *)feature_para; UINT32 *feature_data_32 = (UINT32 *)feature_para; unsigned long long *feature_data = (unsigned long long *)feature_para; struct SENSOR_WINSIZE_INFO_STRUCT *wininfo; MSDK_SENSOR_REG_INFO_STRUCT *sensor_reg_data = (MSDK_SENSOR_REG_INFO_STRUCT *)feature_para; LOG_INF("feature_id = %d\n", feature_id); switch (feature_id) { case SENSOR_FEATURE_GET_PERIOD: *feature_return_para_16++ = imgsensor.line_length; *feature_return_para_16 = imgsensor.frame_length; *feature_para_len = 4; break; case SENSOR_FEATURE_GET_PIXEL_CLOCK_FREQ: *feature_return_para_32 = imgsensor.pclk; *feature_para_len = 4; break; case SENSOR_FEATURE_GET_MIPI_PIXEL_RATE: { kal_uint32 rate; switch (*feature_data) { case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: rate = imgsensor_info.cap.mipi_pixel_rate; break; case MSDK_SCENARIO_ID_VIDEO_PREVIEW: rate = imgsensor_info.normal_video.mipi_pixel_rate; break; case MSDK_SCENARIO_ID_HIGH_SPEED_VIDEO: rate = imgsensor_info.hs_video.mipi_pixel_rate; break; case MSDK_SCENARIO_ID_SLIM_VIDEO: rate = imgsensor_info.slim_video.mipi_pixel_rate; break; case MSDK_SCENARIO_ID_CAMERA_PREVIEW: default: rate = imgsensor_info.pre.mipi_pixel_rate; break; } *(MUINT32 *)(uintptr_t)(*(feature_data + 1)) = rate; } break; case SENSOR_FEATURE_SET_ESHUTTER: set_shutter(*feature_data); break; case SENSOR_FEATURE_SET_NIGHTMODE: night_mode((BOOL)*feature_data); break; case SENSOR_FEATURE_SET_GAIN: set_gain((UINT16)*feature_data); break; case SENSOR_FEATURE_SET_FLASHLIGHT: break; case SENSOR_FEATURE_SET_ISP_MASTER_CLOCK_FREQ: break; case SENSOR_FEATURE_SET_REGISTER: write_cmos_sensor_8bit(sensor_reg_data->RegAddr, sensor_reg_data->RegData); break; case SENSOR_FEATURE_GET_REGISTER: sensor_reg_data->RegData = read_cmos_sensor(sensor_reg_data->RegAddr); LOG_INF("adb_i2c_read 0x%x = 0x%x\n", sensor_reg_data->RegAddr, sensor_reg_data->RegData); break; case SENSOR_FEATURE_GET_LENS_DRIVER_ID: /* get the lens driver ID from EEPROM or just return LENS_DRIVER_ID_DO_NOT_CARE */ /* if EEPROM does not exist in camera module. */ *feature_return_para_32 = LENS_DRIVER_ID_DO_NOT_CARE; *feature_para_len = 4; break; case SENSOR_FEATURE_SET_VIDEO_MODE: set_video_mode(*feature_data); break; case SENSOR_FEATURE_CHECK_SENSOR_ID: get_imgsensor_id(feature_return_para_32); break; case SENSOR_FEATURE_SET_AUTO_FLICKER_MODE: set_auto_flicker_mode((BOOL)*feature_data_16, *(feature_data_16 + 1)); break; case SENSOR_FEATURE_SET_MAX_FRAME_RATE_BY_SCENARIO: set_max_framerate_by_scenario((enum MSDK_SCENARIO_ID_ENUM)*feature_data, *(feature_data + 1)); break; case SENSOR_FEATURE_GET_DEFAULT_FRAME_RATE_BY_SCENARIO: get_default_framerate_by_scenario((enum MSDK_SCENARIO_ID_ENUM)*(feature_data), (MUINT32 *)(uintptr_t)(*(feature_data + 1))); break; case SENSOR_FEATURE_SET_TEST_PATTERN: set_test_pattern_mode((BOOL)*feature_data); break; case SENSOR_FEATURE_GET_TEST_PATTERN_CHECKSUM_VALUE: *feature_return_para_32 = imgsensor_info.checksum_value; *feature_para_len = 4; break; case SENSOR_FEATURE_SET_FRAMERATE: LOG_INF("current fps: %d\n", (UINT32)*feature_data); spin_lock(&imgsensor_drv_lock); imgsensor.current_fps = *feature_data; spin_unlock(&imgsensor_drv_lock); break; case SENSOR_FEATURE_SET_HDR: LOG_INF("ihdr enable: %d\n", (BOOL)*feature_data); spin_lock(&imgsensor_drv_lock); imgsensor.ihdr_en = (BOOL)*feature_data; spin_unlock(&imgsensor_drv_lock); break; case SENSOR_FEATURE_GET_EEPROM_COMDATA: copy_sn_data(gc05a2madrid_sn_data_lz); memcpy(feature_return_para_32, gc05a2madrid_sn_data_lz, CAMERA_EEPPROM_COMDATA_LENGTH); *feature_para_len = CAMERA_EEPPROM_COMDATA_LENGTH; break; case SENSOR_FEATURE_GET_CROP_INFO: LOG_INF("SENSOR_FEATURE_GET_CROP_INFO scenarioId: %d\n", (UINT32)*feature_data); wininfo = (struct SENSOR_WINSIZE_INFO_STRUCT *)(uintptr_t)(*(feature_data + 1)); switch (*feature_data_32) { case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: memcpy((void *)wininfo, (void *)&imgsensor_winsize_info[1], sizeof(struct SENSOR_WINSIZE_INFO_STRUCT)); break; case MSDK_SCENARIO_ID_VIDEO_PREVIEW: memcpy((void *)wininfo, (void *)&imgsensor_winsize_info[2], sizeof(struct SENSOR_WINSIZE_INFO_STRUCT)); break; case MSDK_SCENARIO_ID_HIGH_SPEED_VIDEO: memcpy((void *)wininfo, (void *)&imgsensor_winsize_info[3], sizeof(struct SENSOR_WINSIZE_INFO_STRUCT)); break; case MSDK_SCENARIO_ID_SLIM_VIDEO: memcpy((void *)wininfo, (void *)&imgsensor_winsize_info[4], sizeof(struct SENSOR_WINSIZE_INFO_STRUCT)); break; case MSDK_SCENARIO_ID_CAMERA_PREVIEW: default: memcpy((void *)wininfo, (void *)&imgsensor_winsize_info[0], sizeof(struct SENSOR_WINSIZE_INFO_STRUCT)); break; } break; case SENSOR_FEATURE_SET_IHDR_SHUTTER_GAIN: LOG_INF("SENSOR_SET_SENSOR_IHDR LE = %d, SE = %d, Gain = %d\n", (UINT16)*feature_data, (UINT16)*(feature_data + 1), (UINT16)*(feature_data + 2)); ihdr_write_shutter_gain((UINT16)*feature_data, (UINT16)*(feature_data + 1), (UINT16)*(feature_data + 2)); break; default: break; } return ERROR_NONE; } static struct SENSOR_FUNCTION_STRUCT sensor_func = { open, get_info, get_resolution, feature_control, control, close }; UINT32 GC05A2_MIPI_RAW_MADRID_SensorInit(struct SENSOR_FUNCTION_STRUCT **pfFunc) { /* Check Sensor status here */ if (pfFunc != NULL) *pfFunc = &sensor_func; return ERROR_NONE; } 检查错误
最新发布
11-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值