# include "cdm.h"
# include "system/camerad/cameras/tici.h"
# include "system/camerad/sensors/sensor.h"
int build_update ( uint8_t * dst , const SensorInfo * s , std : : vector < uint32_t > & patches ) {
uint8_t * start = dst ;
dst + = write_random ( dst , {
0x2c , 0xffffffff ,
0x30 , 0xffffffff ,
0x34 , 0xffffffff ,
0x38 , 0xffffffff ,
0x3c , 0xffffffff ,
} ) ;
dst + = write_cont ( dst , 0x560 , {
0x00000001 ,
0x04440444 ,
0x04450445 ,
0x04440444 ,
0x04450445 ,
0x000000ca ,
0x0000009c ,
} ) ;
// white balance
dst + = write_cont ( dst , 0x6fc , {
0x00800080 ,
0x00000080 ,
0x00000000 ,
0x00000000 ,
} ) ;
dst + = write_cont ( dst , 0x40 , {
0x00000c06 , // (1<<8) to enable vignetting correction
} ) ;
dst + = write_cont ( dst , 0x48 , {
( 1 < < 3 ) | ( 1 < < 1 ) ,
} ) ;
dst + = write_cont ( dst , 0x4c , {
0x00000019 ,
} ) ;
dst + = write_cont ( dst , 0xe0c , {
0x00000e00 ,
} ) ;
dst + = write_cont ( dst , 0xe2c , {
0x00000e00 ,
} ) ;
dst + = write_cont ( dst , 0x44 , {
0x00000000 ,
} ) ;
dst + = write_cont ( dst , 0xaac , {
0x00000000 ,
} ) ;
dst + = write_cont ( dst , 0xf00 , {
0x00000000 ,
} ) ;
// black level scale + offset
dst + = write_cont ( dst , 0x6b0 , {
( ( uint32_t ) ( 1 < < 11 ) < < 0xf ) | ( s - > black_level < < ( 14 - s - > bits_per_pixel ) ) ,
0x0 ,
0x0 ,
} ) ;
return dst - start ;
}
int build_initial_config ( uint8_t * dst , const SensorInfo * s , std : : vector < uint32_t > & patches ) {
uint8_t * start = dst ;
// start with the every frame config
dst + = build_update ( dst , s , patches ) ;
uint64_t addr ;
// setup
dst + = write_cont ( dst , 0x478 , {
0x00000004 ,
0x004000c0 ,
} ) ;
dst + = write_cont ( dst , 0x488 , {
0x00000000 ,
0x00000000 ,
0x00000f0f ,
} ) ;
dst + = write_cont ( dst , 0x49c , {
0x00000001 ,
} ) ;
dst + = write_cont ( dst , 0xce4 , {
0x00000000 ,
0x00000000 ,
} ) ;
// linearization
dst + = write_cont ( dst , 0x4dc , {
0x00000000 ,
} ) ;
dst + = write_cont ( dst , 0x4e0 , s - > linearization_pts ) ;
dst + = write_cont ( dst , 0x4f0 , s - > linearization_pts ) ;
dst + = write_cont ( dst , 0x500 , s - > linearization_pts ) ;
dst + = write_cont ( dst , 0x510 , s - > linearization_pts ) ;
// TODO: this is DMI64 in the dump, does that matter?
dst + = write_dmi ( dst , & addr , 288 , 0xc24 , 9 ) ;
patches . push_back ( addr - ( uint64_t ) start ) ;
/* TODO
cdm_dmi_cmd_t 248
. length = 287
. reserved = 33
. cmd = 11
. addr = 0
. DMIAddr = 3108
. DMISel = 9
*/
// vignetting correction
dst + = write_cont ( dst , 0x6bc , {
0x0b3c0000 ,
0x00670067 ,
0xd3b1300c ,
0x13b1300c ,
0x00670067 ,
0xd3b1300c ,
0x13b1300c ,
0xec4e4000 ,
0x0100c003 ,
0xec4e4000 ,
0x0100c003 ,
} ) ;
dst + = write_dmi ( dst , & addr , 884 , 0xc24 , 14 ) ;
patches . push_back ( addr - ( uint64_t ) start ) ;
dst + = write_dmi ( dst , & addr , 884 , 0xc24 , 15 ) ;
patches . push_back ( addr - ( uint64_t ) start ) ;
// debayer
dst + = write_cont ( dst , 0x6f8 , {
0x00000100 ,
} ) ;
dst + = write_cont ( dst , 0x71c , {
0x00008000 ,
0x08000066 ,
} ) ;
// color correction
dst + = write_cont ( dst , 0x760 , s - > color_correct_matrix ) ;
// gamma
dst + = write_cont ( dst , 0x798 , {
0x00000000 ,
} ) ;
dst + = write_dmi ( dst , & addr , 256 , 0xc24 , 26 ) ; // G
patches . push_back ( addr - ( uint64_t ) start ) ;
dst + = write_dmi ( dst , & addr , 256 , 0xc24 , 28 ) ; // B
patches . push_back ( addr - ( uint64_t ) start ) ;
dst + = write_dmi ( dst , & addr , 256 , 0xc24 , 30 ) ; // R
patches . push_back ( addr - ( uint64_t ) start ) ;
// YUV
dst + = write_cont ( dst , 0xf30 , {
0x00680208 ,
0x00000108 ,
0x00400000 ,
0x03ff0000 ,
0x01c01ed8 ,
0x00001f68 ,
0x02000000 ,
0x03ff0000 ,
0x1fb81e88 ,
0x000001c0 ,
0x02000000 ,
0x03ff0000 ,
} ) ;
// TODO: remove this
dst + = write_cont ( dst , 0xa3c , {
0x00000003 ,
( ( s - > frame_width - 1 ) < < 16 ) | ( s - > frame_width - 1 ) ,
0x30036666 ,
0x00000000 ,
0x00000000 ,
s - > frame_width - 1 ,
( ( s - > frame_height - 1 ) < < 16 ) | ( s - > frame_height - 1 ) ,
0x30036666 ,
0x00000000 ,
0x00000000 ,
s - > frame_height - 1 ,
} ) ;
dst + = write_cont ( dst , 0xa68 , {
0x00000003 ,
( ( s - > frame_width / 2 - 1 ) < < 16 ) | ( s - > frame_width - 1 ) ,
0x3006cccc ,
0x00000000 ,
0x00000000 ,
s - > frame_width - 1 ,
( ( s - > frame_height / 2 - 1 ) < < 16 ) | ( s - > frame_height - 1 ) ,
0x3006cccc ,
0x00000000 ,
0x00000000 ,
s - > frame_height - 1 ,
} ) ;
// cropping
dst + = write_cont ( dst , 0xe10 , {
s - > frame_height - 1 ,
s - > frame_width - 1 ,
} ) ;
dst + = write_cont ( dst , 0xe30 , {
s - > frame_height / 2 - 1 ,
s - > frame_width - 1 ,
} ) ;
dst + = write_cont ( dst , 0xe18 , {
0x0ff00000 ,
0x00000016 ,
} ) ;
dst + = write_cont ( dst , 0xe38 , {
0x0ff00000 ,
0x00000017 ,
} ) ;
return dst - start ;
}