update:1、更新双sensor驱动 2、关闭mpp调试信息,缩小rootfs尺寸

This commit is contained in:
李海波 2025-04-11 15:31:16 +08:00
parent ef53c30fce
commit 485e855b5e
9 changed files with 171 additions and 130 deletions

View File

@ -1651,7 +1651,6 @@ CONFIG_VIN_LOG=y
CONFIG_SUPPORT_ISP_TDM=y
CONFIG_TDM_LBC_EN=y
# CONFIG_TDM_ONE_BUFFER is not set
# CONFIG_TDM_ONE_BUFFER_WITH_TWORX is not set
# CONFIG_TDM_OFFLINE_HANDLE_RAW is not set
# CONFIG_MIPI_VC is not set
# CONFIG_AVG_TDM_FIFO is not set
@ -2828,7 +2827,7 @@ CONFIG_PROC_FS=y
CONFIG_MODULE_PROC_FS=y
# CONFIG_EXECDOMAINS_PROC_FS is not set
# CONFIG_PROC_SYSCTL is not set
CONFIG_PROC_PAGE_MONITOR=y
# CONFIG_PROC_PAGE_MONITOR is not set
# CONFIG_PROC_CHILDREN is not set
# CONFIG_PROC_UID is not set
CONFIG_KERNFS=y

View File

@ -53,8 +53,8 @@ size = 16
[partition]
name = rootfs
;size = 12288
size = 12544
size = 12288
;size = 12544
downloadfile = "rootfs.fex"
user_type = 0x8000

View File

@ -1,30 +0,0 @@
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x28000;
. = ALIGN(4);
.head :
{
main/fes1_head.o (.rodata)
}
.text :
{
/home/huangjituan/SmartLock/src/back_board/sl100_sdk/lichee/brandy-2.0/spl/arch/arm/cpu/armv7/fes1_entry.o (.text)
*(.text)
}
. = ALIGN(16);
.rodata : { *(.rodata) }
. = ALIGN(16);
.data : { *(.data) }
. = ALIGN(4);
.bss :
{
__bss_start = .;
*(.bss)
}
. = ALIGN(4);
__bss_end = .;
_end = .;
}

View File

@ -1,33 +0,0 @@
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x20000;
. = ALIGN(4);
.head :
{
main/boot0_head.o (.rodata)
}
. = ALIGN(1);
.text :
{
/home/huangjituan/SmartLock/src/back_board/sl100_sdk/lichee/brandy-2.0/spl/arch/arm/cpu/armv7/boot0_entry.o (.text)
/home/huangjituan/SmartLock/src/back_board/sl100_sdk/lichee/brandy-2.0/spl/solution/libsolution.o (.text)
*(.text)
}
. = ALIGN(16);
.rodata : { *(.rodata) }
. = ALIGN(16);
.data : { *(.data) }
. = ALIGN(4);
.bss :
{
__bss_start = .;
*(.bss)
}
. = ALIGN(4);
__bss_end = .;
_end = .;
ASSERT(. <= (0x20000 + 0x10000), "boot0 image has exceeded its limit.")
}

View File

@ -30,16 +30,16 @@ MODULE_DESCRIPTION("A low-level driver for SC202CS sensors");
MODULE_LICENSE("GPL");
//define the registers
#define EXP_HIGH 0xff
#define EXP_MID 0x03
#define EXP_LOW 0x04
#define GAIN_HIGH 0xff
#define GAIN_LOW 0x24
/*
* Our nominal (default) frame rate.
*/
#define ID_REG_HIGH 0xf0
#define ID_REG_LOW 0xf1
#define EXP_HIGH 0x3e00
#define EXP_MID 0x3e01
#define EXP_LOW 0x3e02
#define DIG_GAIN 0x3e06
#define DIG_FINE_GAIN 0x3e07
#define ANA_GAIN 0x3e09
#define GAIN_STEP_BASE 128 //mean gain min step is 1/128gain
#define ID_REG_HIGH 0x3e07
#define ID_REG_LOW 0x3e08
#define ID_VAL_HIGH ((V4L2_IDENT_SENSOR) >> 8)
#define ID_VAL_LOW ((V4L2_IDENT_SENSOR) & 0xff)
@ -66,7 +66,7 @@ MODULE_LICENSE("GPL");
#endif
#define EXPOSURE_MIN 6
#define EXPOSURE_MAX (VTS - 6)
#define EXPOSURE_MAX (VTS)
#define EXPOSURE_STEP 1
#define EXPOSURE_DEFAULT 0x0148
@ -373,8 +373,58 @@ static int sensor_g_gain(struct v4l2_subdev *sd, __s32 *value)
return 0;
}
static unsigned char analog_Gain_Reg[] = {0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f};
static int setSensorGain(struct v4l2_subdev *sd, int gain)
{
int ana_gain = gain / GAIN_STEP_BASE;
int dig_Gain;
int gain_flag = 1;
if (ana_gain >= 32 * 2) {
gain_flag = 5;
} else if (ana_gain >= 32) {
gain_flag = 5;
} else if (ana_gain >= 16) {
gain_flag = 4;
} else if (ana_gain >= 8) {
gain_flag = 3;
} else if (ana_gain >= 4) {
gain_flag = 2;
} else if (ana_gain >= 2) {
gain_flag = 1;
} else {
gain_flag = 0;
}
sensor_write(sd, ANA_GAIN, analog_Gain_Reg[gain_flag]);
dig_Gain = gain >> gain_flag; //dig_Gain min mean 1/128gain
if (dig_Gain < 2 * GAIN_STEP_BASE) {
//step1/128
sensor_write(sd, DIG_GAIN, 0x00);
sensor_write(sd, DIG_FINE_GAIN, dig_Gain - 128 + 0x80);
//sensor_print("sensor set analog_gain:0x%02x, dig_gain:0x%02x, dig_fine_gain:0x%02x", analog_Gain_Reg[gain_flag], 0x00, dig_Gain - 128 + 0x80);
} else if (dig_Gain < 4 * GAIN_STEP_BASE) {
//step1/64
sensor_write(sd, DIG_GAIN, 0x01);
sensor_write(sd, DIG_FINE_GAIN, (dig_Gain - 128 * 2) / 2 + 0x80);
//sensor_print("sensor set analog_gain:0x%02x, dig_gain:0x%02x, dig_fine_gain:0x%02x", analog_Gain_Reg[gain_flag], 0x01, (dig_Gain - 128 * 2) / 2 + 0x80);
} else if (dig_Gain < 8 * GAIN_STEP_BASE) {
//step1/32
sensor_write(sd, DIG_GAIN, 0x03);
sensor_write(sd, DIG_FINE_GAIN, (dig_Gain - 128 * 4) / 4 + 0x80);
//sensor_print("sensor set analog_gain:0x%02x, dig_gain:0x%02x, dig_fine_gain:0x%02x", analog_Gain_Reg[gain_flag], 0x03, (dig_Gain - 128 * 4) / 4 + 0x80);
} else {
sensor_write(sd, DIG_GAIN, 0x03);
sensor_write(sd, DIG_FINE_GAIN, 0xfe);
}
return 0;
}
static int sensor_s_gain(struct v4l2_subdev *sd, int gain_val)
{
#if 0
struct sensor_info *info = to_state(sd);
//sensor_dbg("%s():%d. info:%p, gain_val:%d\n", __func__, __LINE__, info, gain_val);
// if (gain_val == info->gain) {
@ -414,6 +464,15 @@ static int sensor_s_gain(struct v4l2_subdev *sd, int gain_val)
//sensor_dbg("drv sensor_s_gain(%d)\n", gain_val);
info->gain = gain_val;
#endif
struct sensor_info *info = to_state(sd);
//if (gain_val == info->gain)
// return 0;
//sensor_print("gain_val:%d\n", gain_val);
setSensorGain(sd, gain_val);
info->gain = gain_val;
return 0;
}
@ -421,8 +480,30 @@ static int sensor_s_gain(struct v4l2_subdev *sd, int gain_val)
static int sensor_s_exp_gain(struct v4l2_subdev *sd,
struct sensor_exp_gain *exp_gain)
{
sensor_s_exp(sd, exp_gain->exp_val);
sensor_s_gain(sd, exp_gain->gain_val);
int exp_val, gain_val;
//int shutter = 0, frame_length = 0;
struct sensor_info *info = to_state(sd);
struct i2c_client *client = v4l2_get_subdevdata(sd);
if ((exp_gain->exp_val - exp_gain->exp_val / 16 * 16) > 0) {
exp_val = exp_gain->exp_val / 16 + 1;
} else {
exp_val = exp_gain->exp_val / 16;
}
exp_val = exp_val & 0xffff;
if (exp_val > 1250){
exp_val = 1250;
}
//gain min step is 1/128gain
gain_val = exp_gain->gain_val * GAIN_STEP_BASE;
if ((gain_val - gain_val / 16 * 16) > 0) {
gain_val = gain_val / 16 + 1;
} else {
gain_val = gain_val / 16;
}
sensor_s_exp(sd, exp_val);
sensor_s_gain(sd, gain_val);
return 0;
}
@ -466,7 +547,7 @@ static int sensor_s_hflip(struct v4l2_subdev *sd, int enable)
static int sensor_get_fmt_mbus_core(struct v4l2_subdev *sd, int *code)
{
*code = MEDIA_BUS_FMT_SBGGR10_1X10;// MEDIA_BUS_FMT_SRGGB10_1X10; // gc2053 support change the rgb format by itself
*code = MEDIA_BUS_FMT_SBGGR10_1X10;//;MEDIA_BUS_FMT_SBGGR10_1X10;
return 0;
}
@ -655,8 +736,8 @@ static int sensor_init(struct v4l2_subdev *sd, u32 val)
info->focus_status = 0;
info->low_speed = 0;
info->width = SENSOR_WIDTH;
info->height = SENSOR_HEIGHT;
info->width = 1600;
info->height = 1200;
info->hflip = 0;
info->vflip = 0;
info->gain = 0;
@ -695,13 +776,7 @@ static long sensor_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
case SET_FPS:
break;
case VIDIOC_VIN_SENSOR_EXP_GAIN:
if (m_autoexp == V4L2_EXPOSURE_MANUAL) {
sensor_print("SENSOR_EXP_GAIN continue\n");
break;
} else {
//sensor_dbg("SENSOR_EXP_GAIN set\n");
ret = sensor_s_exp_gain(sd, (struct sensor_exp_gain *)arg);
}
sensor_s_exp_gain(sd, (struct sensor_exp_gain *)arg);
break;
// case VIDIOC_VIN_SENSOR_SET_FPS:
// ret = sensor_s_fps(sd, (struct sensor_fps *)arg);
@ -727,7 +802,7 @@ static long sensor_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
static struct sensor_format_struct sensor_formats[] = {
{
.desc = "Raw RGB Bayer",
.mbus_code = MEDIA_BUS_FMT_SBGGR10_1X10,//MEDIA_BUS_FMT_SRGGB10_1X10, /*.mbus_code = MEDIA_BUS_FMT_SBGGR10_1X10, */
.mbus_code = MEDIA_BUS_FMT_SBGGR10_1X10,//MEDIA_BUS_FMT_SBGGR10_1X10, /*.mbus_code = MEDIA_BUS_FMT_SBGGR10_1X10, */
.regs = sensor_fmt_raw,
.regs_size = ARRAY_SIZE(sensor_fmt_raw),
.bpp = 1
@ -746,16 +821,16 @@ static struct sensor_win_size sensor_win_sizes[] = {
.height = 1200, //
.hoffset = 0,
.voffset = 0,
.hts = 2200,
.hts = 1920,
.vts = 1250,
.pclk = 74250000,
.mipi_bps = 371250000,
.pclk = 71250000,
.mipi_bps = 297 * 1000 * 1000,
.fps_fixed = 30,
.bin_factor = 1,
.intg_min = 1 << 4,
.intg_max = (1250 - 8) << 4,
.intg_max = 1250 << 4,
.gain_min = 1 << 4,
.gain_max = 128 << 4,
.gain_max = 16 << 4,
.regs = sensor_normal_regs,
.regs_size = ARRAY_SIZE(sensor_normal_regs),
.set_size = NULL,
@ -973,23 +1048,18 @@ static int sensor_init_controls(struct v4l2_subdev *sd,
v4l2_ctrl_handler_init(handler, 5);
ctrl = v4l2_ctrl_new_std(handler, ops, V4L2_CID_GAIN,
GAIN_MIN, GAIN_MAX,
GAIN_STEP, GAIN_DEFAULT);
ctrl = v4l2_ctrl_new_std(handler, ops, V4L2_CID_GAIN, 1 * 1600, 256 * 1600, 1, 1 * 1600);
if (ctrl != NULL)
ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
ctrl = v4l2_ctrl_new_std(handler, ops, V4L2_CID_EXPOSURE,
EXPOSURE_MIN, EXPOSURE_MAX,
EXPOSURE_STEP, EXPOSURE_DEFAULT);
if (ctrl != NULL)
ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
ctrl = v4l2_ctrl_new_std(handler, ops, V4L2_CID_EXPOSURE, 1, 65536 * 16, 1, 1);
v4l2_ctrl_new_std(handler, ops, V4L2_CID_HFLIP, 0, 1, 1, 0);
v4l2_ctrl_new_std(handler, ops, V4L2_CID_VFLIP, 0, 1, 1, 0);
v4l2_ctrl_new_std_menu(handler, ops, V4L2_CID_EXPOSURE_AUTO,
V4L2_EXPOSURE_APERTURE_PRIORITY, 0,
V4L2_EXPOSURE_AUTO);
if (ctrl != NULL)
ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
if (handler->error) {
ret = handler->error;
@ -1039,7 +1109,7 @@ static int sensor_probe(struct i2c_client *client,
info->af_first_flag = 1;
info->exp = 0;
info->gain = 0;
//info->time_hs = 0x11;
info->time_hs = 0x11;
info->deskew = 0x02;
#if defined CONFIG_VIN_INIT_MELIS

View File

@ -37,7 +37,7 @@
#define ID_VAL_LOW 0x52
#define SENSOR_FRAME_RATE 30
#define GAIN_STEP_BASE 64 //mean gain min step is 1/64gain
//#define GAIN_STEP_BASE 64 //mean gain min step is 1/64gain
#define I2C_ADDR 0x60
//#define I2C_ADDR_2 0x32
@ -260,6 +260,7 @@ static int setSensorGain(int id, int gain)
static int sensor_s_gain(int id, int gain_val)
{
#if 0
#if 0
int tem_gain_val;
@ -301,7 +302,10 @@ static int sensor_s_gain(int id, int gain_val)
sensor_write(id, 0x3e08, 0x1f);
sensor_write(id, 0x3e09, gain_val >> 3);
}
#endif
#endif
sensor_print("gain_val:%d.\n", gain_val);
setSensorGain(id, gain_val);
return 0;
}
@ -310,12 +314,43 @@ static int sensor_s_exp_gain(int id, struct sensor_exp_gain *exp_gain)
int exp_val,gain_val;
int shutter = 0, frame_length = 0;
//sensor_print("sensor_s_exp_gain exp:%d gain:%d\n", exp_gain->gain_val, exp_gain->exp_val);
if((exp_gain->exp_val - exp_gain->exp_val / 16 * 16) > 0) {
exp_val = exp_gain->exp_val / 16 + 1;
} else {
exp_val = exp_gain->exp_val / 16;
}
exp_val = exp_val & 0xffff;
gain_val = exp_gain->gain_val * GAIN_STEP_BASE;
if((gain_val - gain_val / 16 * 16) > 0) {
gain_val = gain_val / 16 + 1;
} else {
gain_val = gain_val / 16;
}
if (exp_val > 1250){
exp_val = 1250;
}
sensor_s_exp(id, exp_val);
sensor_s_gain(id, gain_val);
return 0;
}
#if 0
static int sensor_g_fps(int id, struct sensor_fps *fps)
{
data_type frame_length = 0, act_vts = 0;
sensor_read(id, 0x320f, &frame_length);
act_vts = frame_length << 8;
sensor_read(id, 0x320e, &frame_length);
act_vts |= frame_length;
fps>fps = current_win[id]>pclk / (current_win[id]>hts * act_vts);
sensor_dbg("fps = %d\n", fps>fps);
return 0;
}
#endif
static int sensor_power(int id, int on)
{
int ret;
@ -333,13 +368,13 @@ static int sensor_power(int id, int on)
vin_set_mclk_freq(id, MCLK);
vin_set_mclk(id, 1);
hal_usleep(1000);
ret = vin_gpio_get_status(id, IR_CUT0);
if(ret != 1){ //if not output, set output
vin_gpio_set_status(id, IR_CUT0, 1); /* power en*/
vin_gpio_write(id, IR_CUT0, CSI_GPIO_HIGH); /* power en*/
}
//ret = vin_gpio_get_status(id, IR_CUT0);
//if(ret != 1){ //if not output, set output
// vin_gpio_set_status(id, IR_CUT0, 1); /* power en*/
// vin_gpio_write(id, IR_CUT0, CSI_GPIO_HIGH); /* power en*/
//}
//vin_gpio_get_status(id, IR_CUT0);
vin_gpio_read(id, IR_CUT0);
//vin_gpio_read(id, IR_CUT0);
vin_gpio_set_status(id, PWDN, 1);
vin_gpio_set_status(id, RESET, 1);
//vin_gpio_set_status(id, IR_CUT0, 1); /* power en*/
@ -431,21 +466,21 @@ static int sensor_init(int id)
static struct sensor_format_struct sensor_formats[] = {
{
.mbus_code = MEDIA_BUS_FMT_SBGGR10_1X10, /*.mbus_code = MEDIA_BUS_FMT_SBGGR10_1X10, */
.mbus_code = MEDIA_BUS_FMT_SBGGR10_1X10,//MEDIA_BUS_FMT_SBGGR10_1X10, /*.mbus_code = MEDIA_BUS_FMT_SBGGR10_1X10, */
.width = 1600,
.height = 1200,//1080,
.hoffset = 0,
.voffset = 0,
.hts = 2200,
.hts = 1920,
.vts = 1250,
.pclk = 74250000,
.mipi_bps = 371250000,
.pclk = 71250000,
.mipi_bps = 297 * 1000 * 1000,
.fps_fixed = 30,
.bin_factor = 1,
.intg_min = 1 << 4,
.intg_max = 1250 << 4,
.gain_min = 1 << 4,
.gain_max = 128 << 4,
.gain_max = 16 << 4,
.offs_h = 0,
.offs_v = 0,
.regs = sensor_normal_regs,
@ -512,21 +547,21 @@ static struct sensor_format_struct switch_sensor_formats[] = {
#if SENSOR_30FPS
{
.mbus_code = MEDIA_BUS_FMT_SBGGR10_1X10,
.mbus_code = MEDIA_BUS_FMT_SBGGR10_1X10,//MEDIA_BUS_FMT_SBGGR10_1X10, /*.mbus_code = MEDIA_BUS_FMT_SBGGR10_1X10, */
.width = 1600,
.height = 1200,//1080,
.hoffset = 0,
.voffset = 0,
.hts = 2200,
.hts = 1920,
.vts = 1250,
.pclk = 74250000,
.mipi_bps = 371250000,
.pclk = 71250000,
.mipi_bps = 297 * 1000 * 1000,
.fps_fixed = 30,
.bin_factor = 1,
.intg_min = 1 << 4,
.intg_max = 1250 << 4,
.gain_min = 1 << 4,
.gain_max = 128 << 4,
.gain_max = 16 << 4,
.switch_regs = sensor_normal_regs,
.switch_regs_size = ARRAY_SIZE(sensor_normal_regs),
}
@ -622,7 +657,8 @@ static int sensor_reg_init(int id, int isp_id)
sensor_s_exp_gain(id, &exp_gain);
sc202cs_sensor_vts = current_win[id]->vts;
//sensor_dbg("sc202cs_sensor_vts = %d\n", sc202cs_sensor_vts);
sensor_dbg("sc202cs_sensor_vts = %d, exp_val = %d, gain_val = %d\n",
sc202cs_sensor_vts, exp_gain.exp_val, exp_gain.gain_val);
return 0;
}

View File

@ -13,7 +13,7 @@ export HOME=${HOME:-/root}
export PS1='\u@\h:\w\$ '
export LD_LIBRARY_PATH=/usr/lib/eyesee-mpp:${LD_LIBRARY_PATH}
ulimit -c unlimited
mount -t debugfs none /sys/kernel/debug
#mount -t debugfs none /sys/kernel/debug
[ -x /bin/more ] || alias more=less
[ -x /usr/bin/vim ] && alias vi=vim || alias vim=vi

View File

@ -145,7 +145,7 @@ CONFIG_KERNEL_BUILD_USER=""
CONFIG_KERNEL_BUILD_DOMAIN=""
CONFIG_KERNEL_PRINTK=y
# CONFIG_KERNEL_SWAP is not set
CONFIG_KERNEL_DEBUG_FS=y
# CONFIG_KERNEL_DEBUG_FS is not set
# CONFIG_KERNEL_HW_PERF_EVENTS is not set
# CONFIG_KERNEL_PERF_EVENTS is not set
# CONFIG_KERNEL_FRAME_POINTER is not set
@ -169,7 +169,7 @@ CONFIG_KERNEL_DEBUG_FS=y
# CONFIG_KERNEL_PROVE_LOCKING is not set
CONFIG_KERNEL_PRINTK_TIME=y
# CONFIG_KERNEL_SLABINFO is not set
CONFIG_KERNEL_PROC_PAGE_MONITOR=y
# CONFIG_KERNEL_PROC_PAGE_MONITOR is not set
CONFIG_KERNEL_PROC_SYSCTL=y
# CONFIG_KERNEL_KEXEC is not set
# CONFIG_USE_RFKILL is not set
@ -4620,7 +4620,6 @@ CONFIG_PACKAGE_mtd-utils-mkfs.jffs2=y
# CONFIG_PACKAGE_prlimit is not set
# CONFIG_PACKAGE_procps is not set
# CONFIG_PACKAGE_procps-ng is not set
# CONFIG_PACKAGE_procrank_linux is not set
# CONFIG_PACKAGE_px5g is not set
# CONFIG_PACKAGE_px5g-standalone is not set
# CONFIG_PACKAGE_qrencode is not set