From 4aa7e21847673103f040835b0cbb890e654a890c Mon Sep 17 00:00:00 2001 From: cdorn Date: Fri, 19 Mar 2021 11:52:22 +0100 Subject: [PATCH 01/23] Changed symbol task_work_func_t to task_worker_func_t as it conflicts with an exported kernel symbol --- driver/utils/thread/include/task_model.h | 4 ++-- driver/utils/thread/task_model.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/driver/utils/thread/include/task_model.h b/driver/utils/thread/include/task_model.h index 3db4e6b..ddbf681 100644 --- a/driver/utils/thread/include/task_model.h +++ b/driver/utils/thread/include/task_model.h @@ -24,7 +24,7 @@ extern "C" { #define TASK_MODEL_CXT_ID fourcc_id('T','A','S','K') - typedef void (*task_work_func_t)(void *data); + typedef void (*task_worker_func_t)(void *data); typedef void (*task_done_callback_func_t)(void *data); typedef void *task_model_handle_t; typedef void *task_handle_t; @@ -33,7 +33,7 @@ extern "C" { task_model_handle_t task_model_init(cxt_mgr_handle_t cxt_mgr); void task_model_stop_task(task_model_handle_t task_model_handle,task_handle_t task_handle); - task_handle_t task_model_create_task(task_model_handle_t task_model_handle,task_work_func_t work_func,void *work_cxt,const char *name); + task_handle_t task_model_create_task(task_model_handle_t task_model_handle,task_worker_func_t work_func,void *work_cxt,const char *name); void task_model_release_task(task_model_handle_t task_model_handle,task_handle_t task_handle); void task_model_run_task(task_model_handle_t task_model_handle,task_handle_t task_handle); void task_model_run_task_after(task_model_handle_t task_model_handle,task_handle_t task_handle,unsigned int us); diff --git a/driver/utils/thread/task_model.c b/driver/utils/thread/task_model.c index adbe55d..4bf4b0f 100644 --- a/driver/utils/thread/task_model.c +++ b/driver/utils/thread/task_model.c @@ -28,7 +28,7 @@ typedef struct { queue_t queue; const char *name; - task_work_func_t work_func; + task_worker_func_t work_func; void *work_cxt; }task_model_task_t; @@ -414,7 +414,7 @@ static task_model_task_t *task_model_new_task(task_model_cxt_t *task_model_cxt) -task_handle_t task_model_create_task(task_model_handle_t task_model_handle,task_work_func_t work_func,void *work_cxt,const char *name) +task_handle_t task_model_create_task(task_model_handle_t task_model_handle,task_worker_func_t work_func,void *work_cxt,const char *name) { task_model_task_t *task=NULL; From 8cf80a02ce47d56f11ee9b29ab0310fc4ab6e3c8 Mon Sep 17 00:00:00 2001 From: cdorn Date: Fri, 19 Mar 2021 11:53:58 +0100 Subject: [PATCH 02/23] Changed V4L_TYPE_GRABBER to VFL_TYPE_VIDEO as the symbol is deprecated --- driver/utils/v4l2/v4l2_model_device.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/driver/utils/v4l2/v4l2_model_device.c b/driver/utils/v4l2/v4l2_model_device.c index 0655e55..8d8bad7 100644 --- a/driver/utils/v4l2/v4l2_model_device.c +++ b/driver/utils/v4l2/v4l2_model_device.c @@ -146,7 +146,7 @@ v4l2_model_handle_t v4l2_model_init(cxt_mgr_handle_t cxt_mgr,v4l2_model_device_s switch(context->device_info.type) { case DEVICE_TYPE_GRABBER: - devicetype = VFL_TYPE_GRABBER; + devicetype = VFL_TYPE_VIDEO; break; case DEVICE_TYPE_VBI: devicetype = VFL_TYPE_VBI; From 7dcc7afde0d08939cefec82675feecbdcd15292c Mon Sep 17 00:00:00 2001 From: cdorn Date: Fri, 19 Mar 2021 11:55:13 +0100 Subject: [PATCH 03/23] Changed ktime symbols and functions to use ktime64 --- driver/utils/misc/sys.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/driver/utils/misc/sys.c b/driver/utils/misc/sys.c index 5e456c7..40dd68a 100644 --- a/driver/utils/misc/sys.c +++ b/driver/utils/misc/sys.c @@ -87,10 +87,10 @@ int sys_sscanf(const char *buf, const char *fmt, ...) unsigned long long sys_gettimestamp() { - struct timespec ts; + struct timespec64 ts; unsigned long long timestamp; - ktime_get_ts(&ts); + ktime_get_ts64(&ts); timestamp=ts.tv_sec ; timestamp*=1000000000; timestamp+=ts.tv_nsec; From 7894671c05ad393a737a686c350d34c5bf52fa82 Mon Sep 17 00:00:00 2001 From: cdorn Date: Fri, 19 Mar 2021 11:55:32 +0100 Subject: [PATCH 04/23] Removed vfs_fstat as it is not needed and no longer exported; Changed vfs_read to kernel_read as it is no longer exported --- driver/utils/misc/sys.c | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/driver/utils/misc/sys.c b/driver/utils/misc/sys.c index 40dd68a..ba2365f 100644 --- a/driver/utils/misc/sys.c +++ b/driver/utils/misc/sys.c @@ -355,9 +355,6 @@ void *sys_fopen(const char *filename, enum sys_fop_flag_e flag) else if ((flag & SYS_FOP_FLAG_WRITE_BIT)) new_flag = O_WRONLY; - if (0 == vfs_stat(filename, &stat)) - printk("file size:%lld", stat.size); - fp = filp_open(filename, new_flag, 0); @@ -372,22 +369,14 @@ void sys_fclose(void *fp) SIZE_T sys_fread(void *fp, void *buf, SIZE_T size, SIZE_T count, SIZE_T offset) { - mm_segment_t fs; loff_t pos = offset; SIZE_T res; - fs =get_fs(); - set_fs(KERNEL_DS); - -// vfs_read(fp, buf, count, &pos); - res = vfs_read(fp, buf, count, &pos); - if (res > 0) { -// ((struct file*)fp)->f_pos = pos; -// printk("read size:%d", (int)res); + res = kernel_read(fp, buf, count, &pos); + if (res == 0) { + printk(KERN_INFO "kernel read: read zero bytes\n", res); } - set_fs(fs); - return res; } From b7790aa8a2a09aee42909da45b0cf828ee290266 Mon Sep 17 00:00:00 2001 From: cdorn Date: Fri, 19 Mar 2021 11:59:47 +0100 Subject: [PATCH 05/23] moved library to lib folder and extracted it to shipped objects; adapted makefile accordingly; added creation of .cmd files for shipped objects --- driver/Makefile | 29 +++++++++++------- driver/lib/AVerScaleVideo.o_shipped | Bin 0 -> 41184 bytes driver/lib/aver_xilinx.o_shipped | Bin 0 -> 92320 bytes driver/{ => lib}/include/AVerScaleVideo.h | 0 driver/{ => lib}/include/aver_xilinx.h | 0 driver/{ => lib}/include/iTE6805_VM_TABLE.h | 0 driver/{ => lib}/include/it6664_EDID.h | 0 driver/{ => lib}/include/it6664_IO.h | 0 driver/{ => lib}/include/it6664_config.h | 0 driver/{ => lib}/include/it6664_extern.h | 0 driver/{ => lib}/include/it6664_hdmi2_rx.h | 0 driver/{ => lib}/include/it6664_hdmi2_tx.h | 0 driver/{ => lib}/include/it6664_hdmi2sp.h | 0 driver/{ => lib}/include/it6664_typedef.h | 0 driver/{ => lib}/include/ite6664.h | 0 driver/{ => lib}/include/ite6805.h | 0 driver/{ => lib}/include/ite6805_EDID.h | 0 driver/{ => lib}/include/ite6805_EQ.h | 0 driver/{ => lib}/include/ite6805_config.h | 0 driver/{ => lib}/include/ite6805_csc_table.h | 0 driver/{ => lib}/include/ite6805_debug.h | 0 driver/{ => lib}/include/ite6805_dev_define.h | 0 driver/{ => lib}/include/ite6805_drv.h | 0 driver/{ => lib}/include/ite6805_sys.h | 0 driver/{ => lib}/include/pic_bmp.h | 0 driver/{ => lib}/include/sha204.h | 0 driver/{ => lib}/include/typedef.h | 0 driver/lib/it6664_EDID.o_shipped | Bin 0 -> 37104 bytes driver/lib/it6664_hdmi2_rx.o_shipped | Bin 0 -> 47328 bytes driver/lib/it6664_hdmi2_tx.o_shipped | Bin 0 -> 54456 bytes driver/lib/it6664_hdmi2sp.o_shipped | Bin 0 -> 28408 bytes driver/lib/ite6664.o_shipped | Bin 0 -> 19520 bytes driver/lib/ite6805.o_shipped | Bin 0 -> 29752 bytes driver/lib/ite6805_EDID.o_shipped | Bin 0 -> 6440 bytes driver/lib/ite6805_EQ.o_shipped | Bin 0 -> 29648 bytes driver/lib/ite6805_drv.o_shipped | Bin 0 -> 75552 bytes driver/lib/ite6805_sys.o_shipped | Bin 0 -> 83408 bytes driver/lib/pic_bmp.o_shipped | Bin 0 -> 9576 bytes 38 files changed, 18 insertions(+), 11 deletions(-) create mode 100644 driver/lib/AVerScaleVideo.o_shipped create mode 100644 driver/lib/aver_xilinx.o_shipped rename driver/{ => lib}/include/AVerScaleVideo.h (100%) rename driver/{ => lib}/include/aver_xilinx.h (100%) rename driver/{ => lib}/include/iTE6805_VM_TABLE.h (100%) rename driver/{ => lib}/include/it6664_EDID.h (100%) rename driver/{ => lib}/include/it6664_IO.h (100%) rename driver/{ => lib}/include/it6664_config.h (100%) rename driver/{ => lib}/include/it6664_extern.h (100%) rename driver/{ => lib}/include/it6664_hdmi2_rx.h (100%) rename driver/{ => lib}/include/it6664_hdmi2_tx.h (100%) rename driver/{ => lib}/include/it6664_hdmi2sp.h (100%) rename driver/{ => lib}/include/it6664_typedef.h (100%) rename driver/{ => lib}/include/ite6664.h (100%) rename driver/{ => lib}/include/ite6805.h (100%) rename driver/{ => lib}/include/ite6805_EDID.h (100%) rename driver/{ => lib}/include/ite6805_EQ.h (100%) rename driver/{ => lib}/include/ite6805_config.h (100%) rename driver/{ => lib}/include/ite6805_csc_table.h (100%) rename driver/{ => lib}/include/ite6805_debug.h (100%) rename driver/{ => lib}/include/ite6805_dev_define.h (100%) rename driver/{ => lib}/include/ite6805_drv.h (100%) rename driver/{ => lib}/include/ite6805_sys.h (100%) rename driver/{ => lib}/include/pic_bmp.h (100%) rename driver/{ => lib}/include/sha204.h (100%) rename driver/{ => lib}/include/typedef.h (100%) create mode 100644 driver/lib/it6664_EDID.o_shipped create mode 100644 driver/lib/it6664_hdmi2_rx.o_shipped create mode 100644 driver/lib/it6664_hdmi2_tx.o_shipped create mode 100644 driver/lib/it6664_hdmi2sp.o_shipped create mode 100644 driver/lib/ite6664.o_shipped create mode 100644 driver/lib/ite6805.o_shipped create mode 100644 driver/lib/ite6805_EDID.o_shipped create mode 100644 driver/lib/ite6805_EQ.o_shipped create mode 100644 driver/lib/ite6805_drv.o_shipped create mode 100644 driver/lib/ite6805_sys.o_shipped create mode 100644 driver/lib/pic_bmp.o_shipped diff --git a/driver/Makefile b/driver/Makefile index 7a47546..4153653 100644 --- a/driver/Makefile +++ b/driver/Makefile @@ -23,46 +23,53 @@ include $(BASE_DIR)helper.mk MODULE_NAME ?= $(BOARD) UTILS_DIR := $(BASE_DIR)utils/ +LIB_DIR := $(BASE_DIR)lib/ ifeq ($(call check_dir,$(BOARD_BASE_DIR)/$(BOARD)),$(NULL)) $(error no board $(BOARD) exists) endif -lib_file:=../AverMediaLib_64.a +basic-objs := entry.o cxt_mgr.o - -basic-objs := entry.o cxt_mgr.o utils := $(call dirs, $(UTILS_DIR)) utils_src := $(call rpath, $(foreach util, $(utils), $(call list_files_from_file, $(UTILS_DIR)$(util)SOURCE))) utils_objs := $(patsubst %.c, %.o, $(utils_src)) utils_inc := $(foreach util, $(utils), $(addprefix -I, $(UTILS_DIR)$(util)include)) -board_src:=$(call rpath,$(call list_files_from_file,$(BOARD_BASE_DIR)/$(BOARD)/SOURCE)) + +board_src:=$(call rpath,$(call list_files_from_file, $(BOARD_BASE_DIR)/$(BOARD)/SOURCE)) board_objs:=$(patsubst %.c,%.o,$(board_src)) +lib_src:=$(call rpath,$(wildcard $(LIB_DIR)*.c) $(wildcard $(LIB_DIR)*.o) $(subst _shipped,,$(wildcard $(LIB_DIR)*.o_shipped))) +lib_objs := $(patsubst %.c, %.o, $(lib_src)) +lib_cmd := $(addprefix $(call rpath, $(LIB_DIR))., $(addsuffix .cmd, $(subst _shipped,, $(notdir $(wildcard $(LIB_DIR)*.o_shipped))))) +lib_inc := $(addprefix -I, $(LIB_DIR)include) + common-include-dir := $(BASE_DIR)include common-include := $(addprefix -I, $(common-include-dir)) -common-include += $(utils_inc) +common-include += $(utils_inc) $(lib_inc) $(MODULE_NAME)-objs += $(basic-objs) $(MODULE_NAME)-objs += $(utils_objs) $(MODULE_NAME)-objs += $(board_objs) -$(MODULE_NAME)-objs += AverMediaLib_64.o +$(MODULE_NAME)-objs += $(lib_objs) #$(call add_cflags, $(MODULE_NAME)-objs, common-include) -fno-common -EXTRA_CFLAGS += $(common-include) -Wno-maybe-uninitialized -EXTRA_LDFLAGS += --whole-archive +EXTRA_CFLAGS += $(common-include) -Wno-maybe-uninitialized +EXTRA_LDFLAGS += --whole-archive obj-m += $(MODULE_NAME).o - -build: - cp $(lib_file) AverMediaLib_64.o +build: + $(info test1 $(lib_cmd)) + $(info test $(call rpath, $(LIB_DIR))) + $(shell touch $(lib_cmd)) make -C $(KDIR) M=$(BASE_DIR) modules all: buildlib build make -C $(KDIR) M=$(BASE_DIR) modules clean: + $(shell rm $(lib_cmd)) $(MAKE) -C $(KDIR) M=$(BASE_DIR) clean .PHONY: all clean buildlib build diff --git a/driver/lib/AVerScaleVideo.o_shipped b/driver/lib/AVerScaleVideo.o_shipped new file mode 100644 index 0000000000000000000000000000000000000000..4b47f471da2081f5cfac71e5aa088bdc0659377f GIT binary patch literal 41184 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 DbLn<@ literal 0 HcmV?d00001 diff --git a/driver/lib/aver_xilinx.o_shipped b/driver/lib/aver_xilinx.o_shipped new file mode 100644 index 0000000000000000000000000000000000000000..d64496fe84222851bfbab319fe57ab8caaf00100 GIT binary patch literal 92320 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�uunia2X2O3h#Fsyu4kWf*#8U-vjfoQp* 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 Z^svUW*5AK;vg14F1m#^g(AIkV{{R*{;@1EG literal 0 HcmV?d00001 diff --git a/driver/include/AVerScaleVideo.h b/driver/lib/include/AVerScaleVideo.h similarity index 100% rename from driver/include/AVerScaleVideo.h rename to driver/lib/include/AVerScaleVideo.h diff --git a/driver/include/aver_xilinx.h b/driver/lib/include/aver_xilinx.h similarity index 100% rename from driver/include/aver_xilinx.h rename to driver/lib/include/aver_xilinx.h diff --git a/driver/include/iTE6805_VM_TABLE.h b/driver/lib/include/iTE6805_VM_TABLE.h similarity index 100% rename from driver/include/iTE6805_VM_TABLE.h rename to driver/lib/include/iTE6805_VM_TABLE.h diff --git a/driver/include/it6664_EDID.h b/driver/lib/include/it6664_EDID.h similarity index 100% rename from driver/include/it6664_EDID.h rename to driver/lib/include/it6664_EDID.h diff --git a/driver/include/it6664_IO.h b/driver/lib/include/it6664_IO.h similarity index 100% rename from driver/include/it6664_IO.h rename to driver/lib/include/it6664_IO.h diff --git a/driver/include/it6664_config.h b/driver/lib/include/it6664_config.h similarity index 100% rename from driver/include/it6664_config.h rename to driver/lib/include/it6664_config.h diff --git a/driver/include/it6664_extern.h b/driver/lib/include/it6664_extern.h similarity index 100% rename from driver/include/it6664_extern.h rename to driver/lib/include/it6664_extern.h diff --git a/driver/include/it6664_hdmi2_rx.h b/driver/lib/include/it6664_hdmi2_rx.h similarity index 100% rename from driver/include/it6664_hdmi2_rx.h rename to driver/lib/include/it6664_hdmi2_rx.h diff --git a/driver/include/it6664_hdmi2_tx.h b/driver/lib/include/it6664_hdmi2_tx.h similarity index 100% rename from driver/include/it6664_hdmi2_tx.h rename to driver/lib/include/it6664_hdmi2_tx.h diff --git a/driver/include/it6664_hdmi2sp.h b/driver/lib/include/it6664_hdmi2sp.h similarity index 100% rename from driver/include/it6664_hdmi2sp.h rename to driver/lib/include/it6664_hdmi2sp.h diff --git a/driver/include/it6664_typedef.h b/driver/lib/include/it6664_typedef.h similarity index 100% rename from driver/include/it6664_typedef.h rename to driver/lib/include/it6664_typedef.h diff --git a/driver/include/ite6664.h b/driver/lib/include/ite6664.h similarity index 100% rename from driver/include/ite6664.h rename to driver/lib/include/ite6664.h diff --git a/driver/include/ite6805.h b/driver/lib/include/ite6805.h similarity index 100% rename from driver/include/ite6805.h rename to driver/lib/include/ite6805.h diff --git a/driver/include/ite6805_EDID.h b/driver/lib/include/ite6805_EDID.h similarity index 100% rename from driver/include/ite6805_EDID.h rename to driver/lib/include/ite6805_EDID.h diff --git a/driver/include/ite6805_EQ.h b/driver/lib/include/ite6805_EQ.h similarity index 100% rename from driver/include/ite6805_EQ.h rename to driver/lib/include/ite6805_EQ.h diff --git a/driver/include/ite6805_config.h b/driver/lib/include/ite6805_config.h similarity index 100% rename from driver/include/ite6805_config.h rename to driver/lib/include/ite6805_config.h diff --git a/driver/include/ite6805_csc_table.h b/driver/lib/include/ite6805_csc_table.h similarity index 100% rename from driver/include/ite6805_csc_table.h rename to driver/lib/include/ite6805_csc_table.h diff --git a/driver/include/ite6805_debug.h b/driver/lib/include/ite6805_debug.h similarity index 100% rename from driver/include/ite6805_debug.h rename to driver/lib/include/ite6805_debug.h diff --git a/driver/include/ite6805_dev_define.h b/driver/lib/include/ite6805_dev_define.h similarity index 100% rename from driver/include/ite6805_dev_define.h rename to driver/lib/include/ite6805_dev_define.h diff --git a/driver/include/ite6805_drv.h b/driver/lib/include/ite6805_drv.h similarity index 100% rename from driver/include/ite6805_drv.h rename to driver/lib/include/ite6805_drv.h diff --git a/driver/include/ite6805_sys.h b/driver/lib/include/ite6805_sys.h similarity index 100% rename from driver/include/ite6805_sys.h rename to driver/lib/include/ite6805_sys.h diff --git a/driver/include/pic_bmp.h b/driver/lib/include/pic_bmp.h similarity index 100% rename from driver/include/pic_bmp.h rename to driver/lib/include/pic_bmp.h diff --git a/driver/include/sha204.h b/driver/lib/include/sha204.h similarity index 100% rename from driver/include/sha204.h rename to driver/lib/include/sha204.h diff --git a/driver/include/typedef.h b/driver/lib/include/typedef.h similarity index 100% rename from driver/include/typedef.h rename to driver/lib/include/typedef.h diff --git a/driver/lib/it6664_EDID.o_shipped b/driver/lib/it6664_EDID.o_shipped new file mode 100644 index 0000000000000000000000000000000000000000..1281cdcd3888d6cd3bb3eb828b61880904703e11 GIT binary patch literal 37104 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 literal 0 HcmV?d00001 diff --git a/driver/lib/it6664_hdmi2_rx.o_shipped b/driver/lib/it6664_hdmi2_rx.o_shipped new file mode 100644 index 0000000000000000000000000000000000000000..c5d2bf40dca5471b1ec5a272f637e87d6d220cf6 GIT binary patch literal 47328 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 o@$=`WOn=)0@@?QybRt)48^l2+Y) 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 literal 0 HcmV?d00001 diff --git a/driver/lib/ite6805_EDID.o_shipped b/driver/lib/ite6805_EDID.o_shipped new file mode 100644 index 0000000000000000000000000000000000000000..dcaf48dba409524def6d160110afc2818d794566 GIT binary patch literal 6440 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 AL;wH) literal 0 HcmV?d00001 diff --git a/driver/lib/ite6805_EQ.o_shipped b/driver/lib/ite6805_EQ.o_shipped new file mode 100644 index 0000000000000000000000000000000000000000..c29a511c2002d08a0847dab834b775f354808205 GIT binary patch literal 29648 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 DY>lkW literal 0 HcmV?d00001 diff --git a/driver/lib/ite6805_drv.o_shipped b/driver/lib/ite6805_drv.o_shipped new file mode 100644 index 0000000000000000000000000000000000000000..bd16efd2798a4140b2c12fa32981ba45d8b8e521 GIT binary patch literal 75552 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 literal 0 HcmV?d00001 diff --git a/driver/lib/ite6805_sys.o_shipped b/driver/lib/ite6805_sys.o_shipped new file mode 100644 index 0000000000000000000000000000000000000000..e71b3c8f7c1af63396c9a88eb1995b48c4936a5f GIT binary patch literal 83408 zcmeIb3wRaP_4hv^;VKf;ddGTHL{z|po1k2RBp8%S%3VPNBtcR`f+0b$BF84!M8w9{ zw*J&wTB)@^t=Oq>2@*wP+Pni#0LW0^YD<{jarWt&{JpoK0-s_y0b^(|JhF zna}>tcdxzonmv~@Ijqc?Fs?&NN}x+hFe+$WQyK)@#%Mx{u|6QoyPnHmJ?8*=tkHTGQ9 zP;rXWN)J^xR2;$Uk!}mMG17KNZHTi7AICU-Lp-0xW=&oSuhrD?N+?NN)sS9&bB7>U z%^e?9HKs85IlUFIFD1SDme$oq+MwdZ+^{gWc6092PxE$<@Gm!x>eGdE$A>EiP<3d> z?En?EshOL$IX;_nFnl|w_3dT)mh%XQDSbnO>+1AsZifc%I$;@YBjDiagyv1Q83*N9 zhRMm#Z*@bZ?nazQiQR}-!tHnmJm7Ymi;3-cCESj7^7QJvC1a^+oV^JduW&5FM|^4N zwX(_vw7N)EISyLAoL5)J*U{RlhRQr%)7h0;kj3luG`-j<_t9R&HuA6fw@hiIcf*L? zuCbP?i0mr|Ws*f&@EkS$3%|GXh|&ax2NXAf4NEe`##g*YseJ~G6b;;aZeo`mfU-T2 z16)?!kY4*)YxBcHz_wQK#hv}6Kk!IO{qe-U4poimNxH=C5vzkoMJhigB2S##92>!jbDQHLSk7&xeU5V*O4r1IP^Z&*(0@;2s7G8T zMowaIJpOwUbAaxL|+DYJnF>=C*HuzkVPIWM`H zZF}S_lZvgj=+gU{WJSu3h{&I%UGLe`e?zQxQ!<6JBO_aFrLDGBHLh&k z2FrDulOo$ZM}a+;tVkKPF>yev$@x9Wf1j*K*&ieF=Slv2vZDBkXXxbaXC$VWpQ&zG zK8#hX<9E`YTeUB(^2}tTyj{<9oTJ=T;O(m#`T8Zsn65ScNFH*pAv!dnl!<6 zjIJi<1y>W%#DGwk6a|NQyll0R1F6Ss3N?KBn9y)bBbxY%t<}b{>ht#=t?T4i|wAFnAd{lKhv+)-Ir3PI22`tB3=tO z|5dz^-Y=lO<2zT|(`9{l&dZhE<179URCbE5crmE>GMl9YEyu7(lax}hQ^*%ot#~P= zvKR~hllPHnrZxP{E_%K(CY_N&BTmx*?-CP2T1kx%%D2CUCf&I<$LFWf&gUXqQ&&Lm z!ysSQ28Fin`gy-}P|~!=tGk+~=P#hEm7xJ_&7=27&t z=C-J*n@?*jm4R=mP$6y0%3+%-k5V-umJi!hF-hDxStuL$ZiqUBZx>KO&~k>F`D
  • NTUa@Z@PZ5zRt9kpO(>Q8Lv~fI|k}Y&X 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 llH23-kYfiBxr05}4@ve*Rr Date: Fri, 19 Mar 2021 12:07:16 +0100 Subject: [PATCH 06/23] Added .idea files to gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index c6127b3..9c773e3 100644 --- a/.gitignore +++ b/.gitignore @@ -50,3 +50,6 @@ modules.order Module.symvers Mkfile.old dkms.conf + +#IntelliJ CLion Files +.idea/ From b8789d3902d11c25dac3d447939ff06fe3cb7041 Mon Sep 17 00:00:00 2001 From: cdorn Date: Fri, 19 Mar 2021 13:01:55 +0100 Subject: [PATCH 07/23] renamed cx511h board to gc573 --- driver/Makefile | 2 +- .../board/{cx511h => gc573}/ReleaseNote.txt | 0 driver/board/{cx511h => gc573}/SOURCE | 0 driver/board/{cx511h => gc573}/board_alsa.c | 22 +++---- driver/board/{cx511h => gc573}/board_alsa.h | 0 driver/board/{cx511h => gc573}/board_config.c | 4 +- driver/board/{cx511h => gc573}/board_gpio.c | 0 driver/board/{cx511h => gc573}/board_gpio.h | 0 driver/board/{cx511h => gc573}/board_i2c.c | 2 +- driver/board/{cx511h => gc573}/board_i2c.h | 0 driver/board/{cx511h => gc573}/board_v4l2.c | 60 +++++++++---------- driver/board/{cx511h => gc573}/board_v4l2.h | 0 driver/include/board.h | 14 ++--- 13 files changed, 52 insertions(+), 52 deletions(-) rename driver/board/{cx511h => gc573}/ReleaseNote.txt (100%) rename driver/board/{cx511h => gc573}/SOURCE (100%) rename driver/board/{cx511h => gc573}/board_alsa.c (89%) rename driver/board/{cx511h => gc573}/board_alsa.h (100%) rename driver/board/{cx511h => gc573}/board_config.c (99%) rename driver/board/{cx511h => gc573}/board_gpio.c (100%) rename driver/board/{cx511h => gc573}/board_gpio.h (100%) rename driver/board/{cx511h => gc573}/board_i2c.c (98%) rename driver/board/{cx511h => gc573}/board_i2c.h (100%) rename driver/board/{cx511h => gc573}/board_v4l2.c (95%) rename driver/board/{cx511h => gc573}/board_v4l2.h (100%) diff --git a/driver/Makefile b/driver/Makefile index 4153653..52671e3 100644 --- a/driver/Makefile +++ b/driver/Makefile @@ -14,7 +14,7 @@ else KERNEL_VER:=$(shell uname -r) endif -BOARD ?= cx511h +BOARD ?= gc573 ifeq ($(MAKELEVEL),0) export BASE_DIR:=$(realpath $(dir $(MAKEFILE_LIST)))/ diff --git a/driver/board/cx511h/ReleaseNote.txt b/driver/board/gc573/ReleaseNote.txt similarity index 100% rename from driver/board/cx511h/ReleaseNote.txt rename to driver/board/gc573/ReleaseNote.txt diff --git a/driver/board/cx511h/SOURCE b/driver/board/gc573/SOURCE similarity index 100% rename from driver/board/cx511h/SOURCE rename to driver/board/gc573/SOURCE diff --git a/driver/board/cx511h/board_alsa.c b/driver/board/gc573/board_alsa.c similarity index 89% rename from driver/board/cx511h/board_alsa.c rename to driver/board/gc573/board_alsa.c index f74e5af..bd51d0f 100644 --- a/driver/board/cx511h/board_alsa.c +++ b/driver/board/gc573/board_alsa.c @@ -29,12 +29,12 @@ typedef struct BASIC_CXT_HANDLE_DECLARE; alsa_model_handle_t alsa_handle; handle_t aver_xilinx_handle; - handle_t i2c_chip_handle[CL511H_I2C_CHIP_COUNT]; + handle_t i2c_chip_handle[GC573_I2C_CHIP_COUNT]; }board_alsa_cxt_t; -static board_chip_desc_t cl511h_chip_desc[CL511H_I2C_CHIP_COUNT]= +static board_chip_desc_t gc573_chip_desc[GC573_I2C_CHIP_COUNT]= { - [CL511H_I2C_CHIP_ITE6805_0]= + [GC573_I2C_CHIP_ITE6805_0]= { .name=ITE6805_DRVNAME, .index=1, @@ -42,9 +42,9 @@ static board_chip_desc_t cl511h_chip_desc[CL511H_I2C_CHIP_COUNT]= }; -static alsa_model_pcm_info_t cl511h_pcm_info= +static alsa_model_pcm_info_t gc573_pcm_info= { - .name="cl511h capture pcm", + .name="gc573 capture pcm", .capture_count=1, }; @@ -76,7 +76,7 @@ static void board_alsa_capture_start(void *data) { board_alsa_cxt_t *board_alsa=data; aver_xilinx_audio_cbinfo_t audio_cbinfo; - //handle_t ite6805_handle=board_alsa->i2c_chip_handle[CL511H_I2C_CHIP_ITE6805_0]; + //handle_t ite6805_handle=board_alsa->i2c_chip_handle[GC573_I2C_CHIP_ITE6805_0]; //enum ite6805_audio_sample fe_audioinfo=0; //aver_xilinx_audio_cfg_t cfg; @@ -126,11 +126,11 @@ void board_alsa_init(cxt_mgr_handle_t cxt_mgr) break; } if (subsystem_id == 0x5730) - alsa_info.name="AVerMedia CL511H"; - alsa_info.pcm_count=sizeof(cl511h_pcm_info)/sizeof(alsa_model_pcm_info_t); + alsa_info.name="AVerMedia GC573"; + alsa_info.pcm_count=sizeof(gc573_pcm_info)/sizeof(alsa_model_pcm_info_t); alsa_info.support_fmt_mask=BIT_ALSA_MODEL_FMT_S16_LE | BIT_ALSA_MODEL_FMT_S24_LE; alsa_info.support_rate_mask=BIT_ALSA_MODEL_RATE_32K|BIT_ALSA_MODEL_RATE_44_1K|BIT_ALSA_MODEL_RATE_48K| BIT_ALSA_MODEL_RATE_96K | BIT_ALSA_MODEL_RATE_192K; - alsa_info.pcm_info=&cl511h_pcm_info; + alsa_info.pcm_info=&gc573_pcm_info; alsa_info.period_size=7680*4;//12*1024; alsa_info.max_period_num=128; board_alsa->alsa_handle=alsa_model_init(cxt_mgr,&alsa_info); @@ -155,9 +155,9 @@ void board_alsa_init(cxt_mgr_handle_t cxt_mgr) break; } - for(i=0;ii2c_chip_handle[i]=i2c_model_get_nth_driver_handle(i2c_mgr,cl511h_chip_desc[i].name,cl511h_chip_desc[i].index); + board_alsa->i2c_chip_handle[i]=i2c_model_get_nth_driver_handle(i2c_mgr,gc573_chip_desc[i].name,gc573_chip_desc[i].index); debug_msg("board_alsa i2c_chip_handle[%d] %p\n",i,board_alsa->i2c_chip_handle[i]); } diff --git a/driver/board/cx511h/board_alsa.h b/driver/board/gc573/board_alsa.h similarity index 100% rename from driver/board/cx511h/board_alsa.h rename to driver/board/gc573/board_alsa.h diff --git a/driver/board/cx511h/board_config.c b/driver/board/gc573/board_config.c similarity index 99% rename from driver/board/cx511h/board_config.c rename to driver/board/gc573/board_config.c index e770a0f..ccc32a3 100644 --- a/driver/board/cx511h/board_config.c +++ b/driver/board/gc573/board_config.c @@ -44,7 +44,7 @@ MODULE_PARM_DESC(copy_protetion_pic, "Loading this bitmap file and display it wh int board_init(void); void board_exit(void); -const char *BOARD_NAME="CL511H"; +const char *BOARD_NAME="GC573"; //pci_model_driver_setup_t pci_setup; extern int subsystem_id; @@ -54,7 +54,7 @@ pci_model_id_t id_table[]={ .device=0x0054, //according to hw DEVICE ID config .sub_vendor = 0x1461, .sub_device = 0x5730, - .driver_data=CL511H, + .driver_data=GC573, }, { 0 diff --git a/driver/board/cx511h/board_gpio.c b/driver/board/gc573/board_gpio.c similarity index 100% rename from driver/board/cx511h/board_gpio.c rename to driver/board/gc573/board_gpio.c diff --git a/driver/board/cx511h/board_gpio.h b/driver/board/gc573/board_gpio.h similarity index 100% rename from driver/board/cx511h/board_gpio.h rename to driver/board/gc573/board_gpio.h diff --git a/driver/board/cx511h/board_i2c.c b/driver/board/gc573/board_i2c.c similarity index 98% rename from driver/board/cx511h/board_i2c.c rename to driver/board/gc573/board_i2c.c index 12380b4..0f00c4b 100644 --- a/driver/board/cx511h/board_i2c.c +++ b/driver/board/gc573/board_i2c.c @@ -55,7 +55,7 @@ static i2c_dev_info_t cx511h_i2c_bus1_devices[]= static i2c_dev_info_t *board_i2c_bus_devices[SUPPORT_BOARD_NUM][BOARD_I2C_BUS_NUM]= { - [CL511H][I2C_BUS_COM]= &cx511h_i2c_bus1_devices[0], //reserved one I2C + [GC573][I2C_BUS_COM]= &cx511h_i2c_bus1_devices[0], //reserved one I2C }; diff --git a/driver/board/cx511h/board_i2c.h b/driver/board/gc573/board_i2c.h similarity index 100% rename from driver/board/cx511h/board_i2c.h rename to driver/board/gc573/board_i2c.h diff --git a/driver/board/cx511h/board_v4l2.c b/driver/board/gc573/board_v4l2.c similarity index 95% rename from driver/board/cx511h/board_v4l2.c rename to driver/board/gc573/board_v4l2.c index fc072c0..d75bfdb 100644 --- a/driver/board/cx511h/board_v4l2.c +++ b/driver/board/gc573/board_v4l2.c @@ -36,7 +36,7 @@ typedef struct i2c_model_handle_t i2c_model_handle; task_model_handle_t task_model_handle; handle_t aver_xilinx_handle; - handle_t i2c_chip_handle[CL511H_I2C_CHIP_COUNT]; + handle_t i2c_chip_handle[GC573_I2C_CHIP_COUNT]; ite6805_frameinfo_t cur_fe_frameinfo; enum ite6805_audio_sample cur_fe_audioinfo; int cur_bchs_value; @@ -45,9 +45,9 @@ typedef struct int board_id; }board_v4l2_context_t; -static board_chip_desc_t cl511h_chip_desc[CL511H_I2C_CHIP_COUNT]= +static board_chip_desc_t gc573_chip_desc[GC573_I2C_CHIP_COUNT]= { - [CL511H_I2C_CHIP_ITE6805_0]= + [GC573_I2C_CHIP_ITE6805_0]= { .name=ITE6805_DRVNAME, .index=1, @@ -55,9 +55,9 @@ static board_chip_desc_t cl511h_chip_desc[CL511H_I2C_CHIP_COUNT]= }; -static framegrabber_setup_input_info_t cl511h_input_info[] = +static framegrabber_setup_input_info_t gc573_input_info[] = { - [CL511H_HDMI_INPUT] = + [GC573_HDMI_INPUT] = { .name = "HDMI", .support_framesize_info = @@ -86,15 +86,15 @@ static framegrabber_setup_input_info_t cl511h_input_info[] = | REFRESHRATE_25_BIT | REFRESHRATE_24_BIT, }, }, - [CL511H_INPUT_COUNT] = + [GC573_INPUT_COUNT] = { .name = NULL, }, }; -static framegrabber_property_t cl511h_property={ - .name="CL511H", - .input_setup_info=cl511h_input_info, +static framegrabber_property_t gc573_property={ + .name="GC573", + .input_setup_info=gc573_input_info, .support_out_pixfmt_mask=FRAMEGRABBER_PIXFMT_BITMSK,//FRAMEGRABBER_PIXFMT_YUYV_BIT , //tt 0615 //.max_supported_line_width=3840, //.max_supported_line_width=4096, @@ -105,8 +105,8 @@ static framegrabber_property_t cl511h_property={ static v4l2_model_device_setup_t device_info= { .type = DEVICE_TYPE_GRABBER, - .driver_name="CL511H", - .card_name="AVerMedia CL511H", + .driver_name="GC573", + .card_name="AVerMedia GC573", .capabilities= V4L2_MODEL_CAPS_CAPTURE_BIT | V4L2_MODEL_CAPS_READWRITE_BIT | V4L2_MODEL_CAPS_STREAMING_BIT, .buffer_type=V4L2_MODEL_BUF_TYPE_DMA_SG, }; @@ -204,7 +204,7 @@ static void cx511h_stream_on(framegrabber_handle_t handle) framegrabber_framemode_e framemode; const framegrabber_pixfmt_t *pixfmt=framegrabber_g_out_pixelfmt(handle); - handle_t ite6805_handle=board_v4l2_cxt->i2c_chip_handle[CL511H_I2C_CHIP_ITE6805_0]; + handle_t ite6805_handle=board_v4l2_cxt->i2c_chip_handle[GC573_I2C_CHIP_ITE6805_0]; //ite6805_get_hdcp_state(ite6805_handle, &hdcp_state); //ite6805_set_hdcp_state(ite6805_handle, hdcp_state); @@ -365,7 +365,7 @@ static void cx511h_stream_on(framegrabber_handle_t handle) static void cx511h_stream_off(framegrabber_handle_t handle) { board_v4l2_context_t *board_v4l2_cxt=framegrabber_get_data(handle); - //handle_t ite6805_handle=board_v4l2_cxt->i2c_chip_handle[CL511H_I2C_CHIP_ITE6805_0]; + //handle_t ite6805_handle=board_v4l2_cxt->i2c_chip_handle[GC573_I2C_CHIP_ITE6805_0]; //debug_msg(">>>>>>>>>>>%s...\n",__func__); //ite6805_set_freerun_screen(ite6805_handle,TRUE); @@ -398,7 +398,7 @@ static int cx511h_flash_update(framegrabber_handle_t handle,int start_block, int static void cx511h_brightness_read(framegrabber_handle_t handle,int *brightness) { board_v4l2_context_t *board_v4l2_cxt=framegrabber_get_data(handle);// - //handle_t ite6805_handle=board_v4l2_cxt->i2c_chip_handle[CL511H_I2C_CHIP_ITE6805_0]; + //handle_t ite6805_handle=board_v4l2_cxt->i2c_chip_handle[GC573_I2C_CHIP_ITE6805_0]; //ite6805_get_brightness(ite6805_handle,&board_v4l2_cxt->cur_bchs_value); //board_v4l2_cxt->cur_bchs_value = aver_xilinx_get_bright(board_v4l2_cxt->aver_xilinx_handle); @@ -411,7 +411,7 @@ static void cx511h_brightness_read(framegrabber_handle_t handle,int *brightness) static void cx511h_contrast_read(framegrabber_handle_t handle,int *contrast) { board_v4l2_context_t *board_v4l2_cxt=framegrabber_get_data(handle); - //handle_t ite6805_handle=board_v4l2_cxt->i2c_chip_handle[CL511H_I2C_CHIP_ITE6805_0]; + //handle_t ite6805_handle=board_v4l2_cxt->i2c_chip_handle[GC573_I2C_CHIP_ITE6805_0]; //ite6805_get_contrast(ite6805_handle,&board_v4l2_cxt->cur_bchs_value); //board_v4l2_cxt->cur_bchs_value = aver_xilinx_get_contrast(board_v4l2_cxt->aver_xilinx_handle); @@ -425,7 +425,7 @@ static void cx511h_contrast_read(framegrabber_handle_t handle,int *contrast) static void cx511h_hue_read(framegrabber_handle_t handle,int *hue) { board_v4l2_context_t *board_v4l2_cxt=framegrabber_get_data(handle); - //handle_t ite6805_handle=board_v4l2_cxt->i2c_chip_handle[CL511H_I2C_CHIP_ITE6805_0]; + //handle_t ite6805_handle=board_v4l2_cxt->i2c_chip_handle[GC573_I2C_CHIP_ITE6805_0]; //ite6805_get_hue(ite6805_handle,&board_v4l2_cxt->cur_bchs_value); //board_v4l2_cxt->cur_bchs_value = aver_xilinx_get_hue(board_v4l2_cxt->aver_xilinx_handle); @@ -439,7 +439,7 @@ static void cx511h_hue_read(framegrabber_handle_t handle,int *hue) static void cx511h_saturation_read(framegrabber_handle_t handle,int *saturation) { board_v4l2_context_t *board_v4l2_cxt=framegrabber_get_data(handle); - //handle_t ite6805_handle=board_v4l2_cxt->i2c_chip_handle[CL511H_I2C_CHIP_ITE6805_0]; + //handle_t ite6805_handle=board_v4l2_cxt->i2c_chip_handle[GC573_I2C_CHIP_ITE6805_0]; //ite6805_get_saturation(ite6805_handle,&board_v4l2_cxt->cur_bchs_value); //board_v4l2_cxt->cur_bchs_value = aver_xilinx_get_saturation(board_v4l2_cxt->aver_xilinx_handle); @@ -453,7 +453,7 @@ static void cx511h_saturation_read(framegrabber_handle_t handle,int *saturation) static void cx511h_bchs_write(framegrabber_handle_t handle) { // board_v4l2_context_t *board_v4l2_cxt=framegrabber_get_data(handle); - //handle_t ite6805_handle=board_v4l2_cxt->i2c_chip_handle[CL511H_I2C_CHIP_ITE6805_0]; + //handle_t ite6805_handle=board_v4l2_cxt->i2c_chip_handle[GC573_I2C_CHIP_ITE6805_0]; int bchs_value = handle->fg_bchs_value; int bchs_select = handle->fg_bchs_selection; @@ -525,7 +525,7 @@ static int cx511h_reg_write(framegrabber_handle_t handle, unsigned int offset, u { //stop task board_v4l2_context_t *board_v4l2_cxt=framegrabber_get_data(handle); - handle_t ite6805_handle=board_v4l2_cxt->i2c_chip_handle[CL511H_I2C_CHIP_ITE6805_0]; + handle_t ite6805_handle=board_v4l2_cxt->i2c_chip_handle[GC573_I2C_CHIP_ITE6805_0]; ite6805_power_off(ite6805_handle); @@ -535,7 +535,7 @@ static int cx511h_reg_write(framegrabber_handle_t handle, unsigned int offset, u { //start task board_v4l2_context_t *board_v4l2_cxt=framegrabber_get_data(handle); - handle_t ite6805_handle=board_v4l2_cxt->i2c_chip_handle[CL511H_I2C_CHIP_ITE6805_0]; + handle_t ite6805_handle=board_v4l2_cxt->i2c_chip_handle[GC573_I2C_CHIP_ITE6805_0]; ite6805_power_on(ite6805_handle); @@ -616,7 +616,7 @@ static void cx511h_v4l2_buffer_init(v4l2_model_callback_parameter_t *cb_info) static void cx511h_v4l2_hardware_init(framegrabber_handle_t handle) { board_v4l2_context_t *board_v4l2_cxt=framegrabber_get_data(handle); - handle_t ite6805_handle=board_v4l2_cxt->i2c_chip_handle[CL511H_I2C_CHIP_ITE6805_0]; + handle_t ite6805_handle=board_v4l2_cxt->i2c_chip_handle[GC573_I2C_CHIP_ITE6805_0]; iTE6805_Hardware_Init(ite6805_handle); } @@ -625,7 +625,7 @@ static void check_signal_stable_task(void *data) { board_v4l2_context_t *board_v4l2_cxt=data; //ite6805_frameinfo_t *fe_frameinfo=&board_v4l2_cxt->cur_fe_frameinfo; - //handle_t ite6805_handle=board_v4l2_cxt->i2c_chip_handle[CL511H_I2C_CHIP_ITE6805_0]; //check 20170511 + //handle_t ite6805_handle=board_v4l2_cxt->i2c_chip_handle[GC573_I2C_CHIP_ITE6805_0]; //check 20170511 int width,height; int dual_pixel; int dual_pixel_set; @@ -701,7 +701,7 @@ static void cx511h_ite6805_event(void *cxt,ite6805_event_e event) board_v4l2_context_t *board_v4l2_cxt=cxt; ite6805_frameinfo_t *fe_frameinfo=&board_v4l2_cxt->cur_fe_frameinfo; enum ite6805_audio_sample *fe_audioinfo=&board_v4l2_cxt->cur_fe_audioinfo; - handle_t ite6805_handle=board_v4l2_cxt->i2c_chip_handle[CL511H_I2C_CHIP_ITE6805_0]; + handle_t ite6805_handle=board_v4l2_cxt->i2c_chip_handle[GC573_I2C_CHIP_ITE6805_0]; ite6805_out_format_e out_format; unsigned int hdcp_flag; @@ -833,7 +833,7 @@ void board_v4l2_init(cxt_mgr_handle_t cxt_mgr, int board_id) break; } - framegrabber_handle = framegrabber_init(cxt_mgr, &cl511h_property, &cx511h_ops); + framegrabber_handle = framegrabber_init(cxt_mgr, &gc573_property, &cx511h_ops); if (framegrabber_handle == NULL) { err = BOARD_V4L2_ERROR_FRAMEGRABBER_INIT; @@ -870,9 +870,9 @@ void board_v4l2_init(cxt_mgr_handle_t cxt_mgr, int board_id) break; } board_v4l2_cxt->i2c_model_handle = i2c_mgr; - for(i=0;ii2c_chip_handle[i]=i2c_model_get_nth_driver_handle(i2c_mgr,cl511h_chip_desc[i].name,cl511h_chip_desc[i].index); + board_v4l2_cxt->i2c_chip_handle[i]=i2c_model_get_nth_driver_handle(i2c_mgr,gc573_chip_desc[i].name,gc573_chip_desc[i].index); debug_msg("board_v4l2 i2c_chip_handle[%d] %p\n",i,board_v4l2_cxt->i2c_chip_handle[i]); } task_model_handle=cxt_manager_get_context(cxt_mgr,TASK_MODEL_CXT_ID,0); @@ -899,12 +899,12 @@ void board_v4l2_init(cxt_mgr_handle_t cxt_mgr, int board_id) v4l2_model_register_callback(v4l2_handle,V4L2_MODEL_CALLBACK_BUFFER_PREPARE,&cx511h_v4l2_buffer_prepare, board_v4l2_cxt); v4l2_model_register_callback(v4l2_handle,V4L2_MODEL_CALLBACK_BUFFER_INIT,&cx511h_v4l2_buffer_init, board_v4l2_cxt); - ite6805_register_callback(board_v4l2_cxt->i2c_chip_handle[CL511H_I2C_CHIP_ITE6805_0],cx511h_ite6805_event,board_v4l2_cxt); + ite6805_register_callback(board_v4l2_cxt->i2c_chip_handle[GC573_I2C_CHIP_ITE6805_0],cx511h_ite6805_event,board_v4l2_cxt); framegrabber_start(framegrabber_handle); cxt_manager_ref_context(aver_xilinx_handle); board_v4l2_cxt->board_id = board_id; - //ite6805_get_board_id(board_v4l2_cxt->i2c_chip_handle[CL511H_I2C_CHIP_ITE6805_0],&board_v4l2_cxt->board_id); + //ite6805_get_board_id(board_v4l2_cxt->i2c_chip_handle[GC573_I2C_CHIP_ITE6805_0],&board_v4l2_cxt->board_id); } while (0); @@ -939,7 +939,7 @@ void board_v4l2_suspend(cxt_mgr_handle_t cxt_mgr) return; } - ite6805_handle = board_v4l2_cxt->i2c_chip_handle[CL511H_I2C_CHIP_ITE6805_0]; + ite6805_handle = board_v4l2_cxt->i2c_chip_handle[GC573_I2C_CHIP_ITE6805_0]; if (!ite6805_handle) { debug_msg("Error: cannot get ite6805_handle"); @@ -961,7 +961,7 @@ void board_v4l2_resume(cxt_mgr_handle_t cxt_mgr) return; } - ite6805_handle = board_v4l2_cxt->i2c_chip_handle[CL511H_I2C_CHIP_ITE6805_0]; + ite6805_handle = board_v4l2_cxt->i2c_chip_handle[GC573_I2C_CHIP_ITE6805_0]; if (!ite6805_handle) { debug_msg("Error: cannot get ite6805_handle"); diff --git a/driver/board/cx511h/board_v4l2.h b/driver/board/gc573/board_v4l2.h similarity index 100% rename from driver/board/cx511h/board_v4l2.h rename to driver/board/gc573/board_v4l2.h diff --git a/driver/include/board.h b/driver/include/board.h index b8cdbd6..1e830a9 100644 --- a/driver/include/board.h +++ b/driver/include/board.h @@ -24,20 +24,20 @@ extern "C" { typedef enum { - CL511H=0, + GC573=0, SUPPORT_BOARD_NUM, }board_type_e; -enum cl511h_input_e +enum gc573_input_e { - CL511H_HDMI_INPUT=0, - CL511H_INPUT_COUNT, + GC573_HDMI_INPUT=0, + GC573_INPUT_COUNT, }; -enum cl511h_i2c_chip_e +enum gc573_i2c_chip_e { - CL511H_I2C_CHIP_ITE6805_0, - CL511H_I2C_CHIP_COUNT, + GC573_I2C_CHIP_ITE6805_0, + GC573_I2C_CHIP_COUNT, }; typedef struct From 6e297353cdde5dbbbbecce3c1839112bb0871dbf Mon Sep 17 00:00:00 2001 From: cdorn Date: Fri, 19 Mar 2021 13:02:26 +0100 Subject: [PATCH 08/23] modified insmod and install files to fit gc573 board --- insmod.sh | 3 +-- install.sh | 4 +++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/insmod.sh b/insmod.sh index 2610fa0..dacef5b 100755 --- a/insmod.sh +++ b/insmod.sh @@ -1,10 +1,9 @@ #!/bin/sh modprobe snd modprobe snd-pcm -modprobe videobuf2-core modprobe videobuf2-dma-contig modprobe videobuf2-dma-sg modprobe videobuf2-v4l2 modprobe videobuf2-vmalloc modprobe videodev -insmod cx511h.ko +insmod driver/gc573.ko diff --git a/install.sh b/install.sh index e4ce1c0..6c2398c 100755 --- a/install.sh +++ b/install.sh @@ -7,7 +7,9 @@ #echo "Please boot to correct kernel version then install again. Thanks" #exit #fi + MODULE_INSTALL_DIR=/lib/modules/`uname -r`/kernel/drivers/media/avermedia install -d $MODULE_INSTALL_DIR -install -m 644 cx511h.ko $MODULE_INSTALL_DIR +install -m 644 drivers/gc573h.ko $MODULE_INSTALL_DIR + /sbin/depmod -a From ec3ade68cb1e48ed80cc339eafd8f36388298a81 Mon Sep 17 00:00:00 2001 From: cdorn Date: Fri, 19 Mar 2021 13:25:10 +0100 Subject: [PATCH 09/23] fixed typo in install.sh --- install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.sh b/install.sh index 6c2398c..e13efbd 100755 --- a/install.sh +++ b/install.sh @@ -10,6 +10,6 @@ MODULE_INSTALL_DIR=/lib/modules/`uname -r`/kernel/drivers/media/avermedia install -d $MODULE_INSTALL_DIR -install -m 644 drivers/gc573h.ko $MODULE_INSTALL_DIR +install -m 644 driver/gc573.ko $MODULE_INSTALL_DIR /sbin/depmod -a From 2f1365d447752b887ac0c755b9cc5da5e39e92f0 Mon Sep 17 00:00:00 2001 From: cdorn Date: Sat, 20 Mar 2021 11:12:40 +0100 Subject: [PATCH 10/23] fixup! renamed cx511h board to gc573 --- driver/board/gc573/board_i2c.c | 4 +- driver/board/gc573/board_v4l2.c | 132 ++++++++++++++++---------------- driver/board/gc573/board_v4l2.h | 2 +- 3 files changed, 69 insertions(+), 69 deletions(-) diff --git a/driver/board/gc573/board_i2c.c b/driver/board/gc573/board_i2c.c index 0f00c4b..2bc5b0e 100644 --- a/driver/board/gc573/board_i2c.c +++ b/driver/board/gc573/board_i2c.c @@ -40,7 +40,7 @@ static ite6805_cfg_t ite6805_cfg={ }; -static i2c_dev_info_t cx511h_i2c_bus1_devices[]= +static i2c_dev_info_t gc573_i2c_bus1_devices[]= { { .name=ITE6805_DRVNAME, @@ -55,7 +55,7 @@ static i2c_dev_info_t cx511h_i2c_bus1_devices[]= static i2c_dev_info_t *board_i2c_bus_devices[SUPPORT_BOARD_NUM][BOARD_I2C_BUS_NUM]= { - [GC573][I2C_BUS_COM]= &cx511h_i2c_bus1_devices[0], //reserved one I2C + [GC573][I2C_BUS_COM]= &gc573_i2c_bus1_devices[0], //reserved one I2C }; diff --git a/driver/board/gc573/board_v4l2.c b/driver/board/gc573/board_v4l2.c index d75bfdb..fc32c36 100644 --- a/driver/board/gc573/board_v4l2.c +++ b/driver/board/gc573/board_v4l2.c @@ -113,43 +113,43 @@ static v4l2_model_device_setup_t device_info= static void *board_v4l2_alloc(void); static void board_v4l2_release(void *cxt); -static void cx511h_v4l2_stream_on(v4l2_model_callback_parameter_t *cb_info); -static void cx511h_v4l2_stream_off(v4l2_model_callback_parameter_t *cb_info); -static void cx511h_stream_on(framegrabber_handle_t handle); -static void cx511h_stream_off(framegrabber_handle_t handle); -//static void cx511h_bchs_read(framegrabber_handle_t handle); -static void cx511h_bchs_write(framegrabber_handle_t handle); -static void cx511h_brightness_read(framegrabber_handle_t handle,int *brightness); -static void cx511h_contrast_read(framegrabber_handle_t handle,int *contrast); -static void cx511h_hue_read(framegrabber_handle_t handle,int *hue); -static void cx511h_saturation_read(framegrabber_handle_t handle,int *saturation); -static void cx511h_hdcp_state_read(framegrabber_handle_t handle,int *hdcp_state); -static void cx511h_hdcp_state_set(framegrabber_handle_t handle,int hdcp_state); -static int cx511h_i2c_read(framegrabber_handle_t handle, unsigned char channel, unsigned int slave, unsigned int sub, unsigned char sublen, unsigned char *data, unsigned int datalen, unsigned int is_10bit); -static int cx511h_i2c_write(framegrabber_handle_t handle, unsigned char channel, unsigned int slave, unsigned int sub, unsigned char sublen, unsigned char *data, unsigned int datalen, unsigned int is_10bit); -static int cx511h_reg_read(framegrabber_handle_t handle, unsigned int offset, unsigned char n_bytes, unsigned int *data); -static int cx511h_reg_write(framegrabber_handle_t handle, unsigned int offset, unsigned char n_bytes, unsigned int data); - -static int cx511h_flash_dump(framegrabber_handle_t handle,int start_block, int blocks, U8_T *flash_dump); // -static int cx511h_flash_update(framegrabber_handle_t handle,int start_block, int blocks, U8_T *flash_dump); // - -static framegrabber_interface_t cx511h_ops={ - .stream_on = cx511h_stream_on, - .stream_off = cx511h_stream_off, - //.bchs_get = cx511h_bchs_read, - .brightness_get = cx511h_brightness_read, - .contrast_get = cx511h_contrast_read, - .hue_get = cx511h_hue_read, - .saturation_get = cx511h_saturation_read, - .bchs_set = cx511h_bchs_write, - .flash_read = cx511h_flash_dump, - .flash_update = cx511h_flash_update, - .hdcp_state_get = cx511h_hdcp_state_read, - .hdcp_state_set = cx511h_hdcp_state_set, - .i2c_read = cx511h_i2c_read, - .i2c_write = cx511h_i2c_write, - .reg_read = cx511h_reg_read, - .reg_write = cx511h_reg_write, +static void gc573_v4l2_stream_on(v4l2_model_callback_parameter_t *cb_info); +static void gc573_v4l2_stream_off(v4l2_model_callback_parameter_t *cb_info); +static void gc573_stream_on(framegrabber_handle_t handle); +static void gc573_stream_off(framegrabber_handle_t handle); +//static void gc573_bchs_read(framegrabber_handle_t handle); +static void gc573_bchs_write(framegrabber_handle_t handle); +static void gc573_brightness_read(framegrabber_handle_t handle,int *brightness); +static void gc573_contrast_read(framegrabber_handle_t handle,int *contrast); +static void gc573_hue_read(framegrabber_handle_t handle,int *hue); +static void gc573_saturation_read(framegrabber_handle_t handle,int *saturation); +static void gc573_hdcp_state_read(framegrabber_handle_t handle,int *hdcp_state); +static void gc573_hdcp_state_set(framegrabber_handle_t handle,int hdcp_state); +static int gc573_i2c_read(framegrabber_handle_t handle, unsigned char channel, unsigned int slave, unsigned int sub, unsigned char sublen, unsigned char *data, unsigned int datalen, unsigned int is_10bit); +static int gc573_i2c_write(framegrabber_handle_t handle, unsigned char channel, unsigned int slave, unsigned int sub, unsigned char sublen, unsigned char *data, unsigned int datalen, unsigned int is_10bit); +static int gc573_reg_read(framegrabber_handle_t handle, unsigned int offset, unsigned char n_bytes, unsigned int *data); +static int gc573_reg_write(framegrabber_handle_t handle, unsigned int offset, unsigned char n_bytes, unsigned int data); + +static int gc573_flash_dump(framegrabber_handle_t handle,int start_block, int blocks, U8_T *flash_dump); // +static int gc573_flash_update(framegrabber_handle_t handle,int start_block, int blocks, U8_T *flash_dump); // + +static framegrabber_interface_t gc573_ops={ + .stream_on = gc573_stream_on, + .stream_off = gc573_stream_off, + //.bchs_get = gc573_bchs_read, + .brightness_get = gc573_brightness_read, + .contrast_get = gc573_contrast_read, + .hue_get = gc573_hue_read, + .saturation_get = gc573_saturation_read, + .bchs_set = gc573_bchs_write, + .flash_read = gc573_flash_dump, + .flash_update = gc573_flash_update, + .hdcp_state_get = gc573_hdcp_state_read, + .hdcp_state_set = gc573_hdcp_state_set, + .i2c_read = gc573_i2c_read, + .i2c_write = gc573_i2c_write, + .reg_read = gc573_reg_read, + .reg_write = gc573_reg_write, }; static void *board_v4l2_alloc() @@ -177,7 +177,7 @@ static void board_v4l2_release(void *cxt) } } -static void cx511h_v4l2_stream_on(v4l2_model_callback_parameter_t *cb_info) +static void gc573_v4l2_stream_on(v4l2_model_callback_parameter_t *cb_info) { board_v4l2_context_t *board_v4l2_cxt=cb_info->asso_data; @@ -185,13 +185,13 @@ static void cx511h_v4l2_stream_on(v4l2_model_callback_parameter_t *cb_info) } -static void cx511h_v4l2_stream_off(v4l2_model_callback_parameter_t *cb_info) +static void gc573_v4l2_stream_off(v4l2_model_callback_parameter_t *cb_info) { board_v4l2_context_t *board_v4l2_cxt=cb_info->asso_data; debug_msg("%s %p\n",__func__,board_v4l2_cxt); } -static void cx511h_stream_on(framegrabber_handle_t handle) +static void gc573_stream_on(framegrabber_handle_t handle) { board_v4l2_context_t *board_v4l2_cxt=framegrabber_get_data(handle); aver_xilinx_video_process_cfg_t vip_cfg; @@ -362,7 +362,7 @@ static void cx511h_stream_on(framegrabber_handle_t handle) //ite6805_set_freerun_screen(ite6805_handle,FALSE); } -static void cx511h_stream_off(framegrabber_handle_t handle) +static void gc573_stream_off(framegrabber_handle_t handle) { board_v4l2_context_t *board_v4l2_cxt=framegrabber_get_data(handle); //handle_t ite6805_handle=board_v4l2_cxt->i2c_chip_handle[GC573_I2C_CHIP_ITE6805_0]; @@ -373,7 +373,7 @@ static void cx511h_stream_off(framegrabber_handle_t handle) aver_xilinx_enable_video_streaming(board_v4l2_cxt->aver_xilinx_handle,FALSE); } -static int cx511h_flash_dump(framegrabber_handle_t handle,int start_block, int blocks, U8_T *flash_dump) // +static int gc573_flash_dump(framegrabber_handle_t handle,int start_block, int blocks, U8_T *flash_dump) // { board_v4l2_context_t *board_v4l2_cxt=framegrabber_get_data(handle); //char version[10]; @@ -384,7 +384,7 @@ static int cx511h_flash_dump(framegrabber_handle_t handle,int start_block, int b return ret; } -static int cx511h_flash_update(framegrabber_handle_t handle,int start_block, int blocks, U8_T *flash_update) +static int gc573_flash_update(framegrabber_handle_t handle,int start_block, int blocks, U8_T *flash_update) { board_v4l2_context_t *board_v4l2_cxt=framegrabber_get_data(handle); //char version[10]; @@ -395,7 +395,7 @@ static int cx511h_flash_update(framegrabber_handle_t handle,int start_block, int return ret; } -static void cx511h_brightness_read(framegrabber_handle_t handle,int *brightness) +static void gc573_brightness_read(framegrabber_handle_t handle,int *brightness) { board_v4l2_context_t *board_v4l2_cxt=framegrabber_get_data(handle);// //handle_t ite6805_handle=board_v4l2_cxt->i2c_chip_handle[GC573_I2C_CHIP_ITE6805_0]; @@ -408,7 +408,7 @@ static void cx511h_brightness_read(framegrabber_handle_t handle,int *brightness) //handle->fg_bchs_value = *brightness; debug_msg("%s get brightness=%x\n",__func__,board_v4l2_cxt->cur_bchs_value); } -static void cx511h_contrast_read(framegrabber_handle_t handle,int *contrast) +static void gc573_contrast_read(framegrabber_handle_t handle,int *contrast) { board_v4l2_context_t *board_v4l2_cxt=framegrabber_get_data(handle); //handle_t ite6805_handle=board_v4l2_cxt->i2c_chip_handle[GC573_I2C_CHIP_ITE6805_0]; @@ -422,7 +422,7 @@ static void cx511h_contrast_read(framegrabber_handle_t handle,int *contrast) debug_msg("%s get contrast=%x\n",__func__,board_v4l2_cxt->cur_bchs_value); } -static void cx511h_hue_read(framegrabber_handle_t handle,int *hue) +static void gc573_hue_read(framegrabber_handle_t handle,int *hue) { board_v4l2_context_t *board_v4l2_cxt=framegrabber_get_data(handle); //handle_t ite6805_handle=board_v4l2_cxt->i2c_chip_handle[GC573_I2C_CHIP_ITE6805_0]; @@ -436,7 +436,7 @@ static void cx511h_hue_read(framegrabber_handle_t handle,int *hue) debug_msg("%s get hue=%x\n",__func__,board_v4l2_cxt->cur_bchs_value); } -static void cx511h_saturation_read(framegrabber_handle_t handle,int *saturation) +static void gc573_saturation_read(framegrabber_handle_t handle,int *saturation) { board_v4l2_context_t *board_v4l2_cxt=framegrabber_get_data(handle); //handle_t ite6805_handle=board_v4l2_cxt->i2c_chip_handle[GC573_I2C_CHIP_ITE6805_0]; @@ -450,7 +450,7 @@ static void cx511h_saturation_read(framegrabber_handle_t handle,int *saturation) debug_msg("%s get saturation=%x\n",__func__,board_v4l2_cxt->cur_bchs_value); } -static void cx511h_bchs_write(framegrabber_handle_t handle) +static void gc573_bchs_write(framegrabber_handle_t handle) { // board_v4l2_context_t *board_v4l2_cxt=framegrabber_get_data(handle); //handle_t ite6805_handle=board_v4l2_cxt->i2c_chip_handle[GC573_I2C_CHIP_ITE6805_0]; @@ -472,21 +472,21 @@ static void cx511h_bchs_write(framegrabber_handle_t handle) } } -static void cx511h_hdcp_state_read(framegrabber_handle_t handle,int *hdcp_state) +static void gc573_hdcp_state_read(framegrabber_handle_t handle,int *hdcp_state) { board_v4l2_context_t *board_v4l2_cxt=framegrabber_get_data(handle); aver_xilinx_get_hdcp_state(board_v4l2_cxt->aver_xilinx_handle,hdcp_state); } -static void cx511h_hdcp_state_set(framegrabber_handle_t handle,int hdcp_state) +static void gc573_hdcp_state_set(framegrabber_handle_t handle,int hdcp_state) { board_v4l2_context_t *board_v4l2_cxt=framegrabber_get_data(handle); aver_xilinx_set_hdcp_state(board_v4l2_cxt->aver_xilinx_handle, hdcp_state); } -static int cx511h_i2c_read(framegrabber_handle_t handle, unsigned char channel, unsigned int slave, unsigned int sub, unsigned char sublen, unsigned char *data, unsigned int datalen, unsigned int is_10bit) +static int gc573_i2c_read(framegrabber_handle_t handle, unsigned char channel, unsigned int slave, unsigned int sub, unsigned char sublen, unsigned char *data, unsigned int datalen, unsigned int is_10bit) { board_v4l2_context_t *board_v4l2_cxt = framegrabber_get_data(handle); i2c_model_handle_t i2c_mgr = board_v4l2_cxt->i2c_model_handle; @@ -495,7 +495,7 @@ static int cx511h_i2c_read(framegrabber_handle_t handle, unsigned char channel, return board_i2c_read(cxt_mgr, channel, slave, sub, data, datalen); } -static int cx511h_i2c_write(framegrabber_handle_t handle, unsigned char channel, unsigned int slave, unsigned int sub, unsigned char sublen, unsigned char *data, unsigned int datalen, unsigned int is_10bit) +static int gc573_i2c_write(framegrabber_handle_t handle, unsigned char channel, unsigned int slave, unsigned int sub, unsigned char sublen, unsigned char *data, unsigned int datalen, unsigned int is_10bit) { board_v4l2_context_t *board_v4l2_cxt = framegrabber_get_data(handle); i2c_model_handle_t i2c_mgr = board_v4l2_cxt->i2c_model_handle; @@ -504,7 +504,7 @@ static int cx511h_i2c_write(framegrabber_handle_t handle, unsigned char channel, return board_i2c_write(cxt_mgr, channel, slave, sub, data, datalen); } -static int cx511h_reg_read(framegrabber_handle_t handle, unsigned int offset, unsigned char n_bytes, unsigned int *data) +static int gc573_reg_read(framegrabber_handle_t handle, unsigned int offset, unsigned char n_bytes, unsigned int *data) { board_v4l2_context_t *board_v4l2_cxt=framegrabber_get_data(handle); int ret = 0; @@ -514,7 +514,7 @@ static int cx511h_reg_read(framegrabber_handle_t handle, unsigned int offset, un return ret; } -static int cx511h_reg_write(framegrabber_handle_t handle, unsigned int offset, unsigned char n_bytes, unsigned int data) +static int gc573_reg_write(framegrabber_handle_t handle, unsigned int offset, unsigned char n_bytes, unsigned int data) { board_v4l2_context_t *board_v4l2_cxt=framegrabber_get_data(handle); int ret = 0; @@ -548,7 +548,7 @@ static int cx511h_reg_write(framegrabber_handle_t handle, unsigned int offset, u return ret; } -static void cx511h_video_buffer_done(void *data) +static void gc573_video_buffer_done(void *data) { board_v4l2_context_t *board_v4l2_cxt=data; //mesg("%s board_v4l2_cxt %p\n",__func__,board_v4l2_cxt); @@ -558,7 +558,7 @@ static void cx511h_video_buffer_done(void *data) } } -static void cx511h_v4l2_buffer_prepare(v4l2_model_callback_parameter_t *cb_info) +static void gc573_v4l2_buffer_prepare(v4l2_model_callback_parameter_t *cb_info) { board_v4l2_context_t *board_v4l2_cxt=cb_info->asso_data; v4l2_model_buffer_info_t *buffer_info=cb_info->u.buffer_prepare_info.buffer_info; @@ -592,11 +592,11 @@ static void cx511h_v4l2_buffer_prepare(v4l2_model_callback_parameter_t *cb_info) //mesg("addr %08x size %x\n",desc[i].addr,desc[i].size); } - aver_xilinx_active_current_desclist(board_v4l2_cxt->aver_xilinx_handle,cx511h_video_buffer_done,board_v4l2_cxt); + aver_xilinx_active_current_desclist(board_v4l2_cxt->aver_xilinx_handle,gc573_video_buffer_done,board_v4l2_cxt); } } -static void cx511h_v4l2_buffer_init(v4l2_model_callback_parameter_t *cb_info) +static void gc573_v4l2_buffer_init(v4l2_model_callback_parameter_t *cb_info) { // board_v4l2_context_t *board_v4l2_cxt=cb_info->asso_data; v4l2_model_buffer_info_t *buffer_info=cb_info->u.buffer_prepare_info.buffer_info; @@ -613,7 +613,7 @@ static void cx511h_v4l2_buffer_init(v4l2_model_callback_parameter_t *cb_info) } } /* -static void cx511h_v4l2_hardware_init(framegrabber_handle_t handle) +static void gc573_v4l2_hardware_init(framegrabber_handle_t handle) { board_v4l2_context_t *board_v4l2_cxt=framegrabber_get_data(handle); handle_t ite6805_handle=board_v4l2_cxt->i2c_chip_handle[GC573_I2C_CHIP_ITE6805_0]; @@ -696,7 +696,7 @@ static void check_signal_stable_task(void *data) } } -static void cx511h_ite6805_event(void *cxt,ite6805_event_e event) +static void gc573_ite6805_event(void *cxt,ite6805_event_e event) { board_v4l2_context_t *board_v4l2_cxt=cxt; ite6805_frameinfo_t *fe_frameinfo=&board_v4l2_cxt->cur_fe_frameinfo; @@ -833,7 +833,7 @@ void board_v4l2_init(cxt_mgr_handle_t cxt_mgr, int board_id) break; } - framegrabber_handle = framegrabber_init(cxt_mgr, &gc573_property, &cx511h_ops); + framegrabber_handle = framegrabber_init(cxt_mgr, &gc573_property, &gc573_ops); if (framegrabber_handle == NULL) { err = BOARD_V4L2_ERROR_FRAMEGRABBER_INIT; @@ -894,12 +894,12 @@ void board_v4l2_init(cxt_mgr_handle_t cxt_mgr, int board_id) aver_xilinx_hdmi_hotplug(board_v4l2_cxt->aver_xilinx_handle); - v4l2_model_register_callback(v4l2_handle,V4L2_MODEL_CALLBACK_STREAMON ,&cx511h_v4l2_stream_on, board_v4l2_cxt); - v4l2_model_register_callback(v4l2_handle,V4L2_MODEL_CALLBACK_STREAMOFF,&cx511h_v4l2_stream_off, board_v4l2_cxt); - v4l2_model_register_callback(v4l2_handle,V4L2_MODEL_CALLBACK_BUFFER_PREPARE,&cx511h_v4l2_buffer_prepare, board_v4l2_cxt); - v4l2_model_register_callback(v4l2_handle,V4L2_MODEL_CALLBACK_BUFFER_INIT,&cx511h_v4l2_buffer_init, board_v4l2_cxt); + v4l2_model_register_callback(v4l2_handle,V4L2_MODEL_CALLBACK_STREAMON ,&gc573_v4l2_stream_on, board_v4l2_cxt); + v4l2_model_register_callback(v4l2_handle,V4L2_MODEL_CALLBACK_STREAMOFF,&gc573_v4l2_stream_off, board_v4l2_cxt); + v4l2_model_register_callback(v4l2_handle,V4L2_MODEL_CALLBACK_BUFFER_PREPARE,&gc573_v4l2_buffer_prepare, board_v4l2_cxt); + v4l2_model_register_callback(v4l2_handle,V4L2_MODEL_CALLBACK_BUFFER_INIT,&gc573_v4l2_buffer_init, board_v4l2_cxt); - ite6805_register_callback(board_v4l2_cxt->i2c_chip_handle[GC573_I2C_CHIP_ITE6805_0],cx511h_ite6805_event,board_v4l2_cxt); + ite6805_register_callback(board_v4l2_cxt->i2c_chip_handle[GC573_I2C_CHIP_ITE6805_0],gc573_ite6805_event,board_v4l2_cxt); framegrabber_start(framegrabber_handle); cxt_manager_ref_context(aver_xilinx_handle); diff --git a/driver/board/gc573/board_v4l2.h b/driver/board/gc573/board_v4l2.h index 4acaaee..d67f4da 100644 --- a/driver/board/gc573/board_v4l2.h +++ b/driver/board/gc573/board_v4l2.h @@ -25,7 +25,7 @@ extern "C" { void board_v4l2_init(cxt_mgr_handle_t cxt_mgr, int board_id); void board_v4l2_suspend(cxt_mgr_handle_t cxt_mgr); void board_v4l2_resume(cxt_mgr_handle_t cxt_mgr); -//void cx511h_adv7619_set_bchs(framegrabber_handle_t handle); +//void gc573_adv7619_set_bchs(framegrabber_handle_t handle); #define BOARD_V4L2_CXT_ID fourcc_id('B','V','4','L') #ifdef __cplusplus From ac4b6a89dfbb0601d18754cbdb4334367228c6c6 Mon Sep 17 00:00:00 2001 From: cdorn Date: Sat, 20 Mar 2021 11:14:26 +0100 Subject: [PATCH 11/23] fixup! renamed cx511h board to gc573 --- driver/entry.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/driver/entry.c b/driver/entry.c index 8ec099c..6ea951b 100644 --- a/driver/entry.c +++ b/driver/entry.c @@ -40,7 +40,7 @@ module_exit(aver_fini); MODULE_VERSION(DRIVER_VER); MODULE_LICENSE("GPL"); -MODULE_DESCRIPTION("Driver for cx511h capture card" " v" DRIVER_VER); +MODULE_DESCRIPTION("Driver for gc573 capture card" " v" DRIVER_VER); MODULE_AUTHOR("AVerMedia Tech. Inc."); From 05e7d656e1e34a67cdec5025ded0d89f782615b3 Mon Sep 17 00:00:00 2001 From: cdorn Date: Sat, 20 Mar 2021 11:15:32 +0100 Subject: [PATCH 12/23] Partly applied updates from new driver version --- driver/lib/AVerScaleVideo.o_shipped | Bin 41184 -> 42880 bytes driver/lib/include/it6664_config.h | 4 ++ driver/lib/include/ite6664.h | 1 - driver/lib/include/ite6805.h | 14 +++---- driver/lib/include/ite6805_config.h | 2 +- driver/lib/it6664_EDID.o_shipped | Bin 37104 -> 37152 bytes driver/lib/it6664_hdmi2_rx.o_shipped | Bin 47328 -> 47304 bytes driver/lib/it6664_hdmi2_tx.o_shipped | Bin 54456 -> 54528 bytes driver/lib/it6664_hdmi2sp.o_shipped | Bin 28408 -> 28424 bytes driver/lib/ite6664.o_shipped | Bin 19520 -> 19488 bytes driver/lib/ite6805.o_shipped | Bin 29752 -> 28000 bytes driver/lib/ite6805_EDID.o_shipped | Bin 6440 -> 6448 bytes driver/lib/ite6805_EQ.o_shipped | Bin 29648 -> 29656 bytes driver/lib/ite6805_drv.o_shipped | Bin 75552 -> 74384 bytes driver/lib/ite6805_sys.o_shipped | Bin 83408 -> 82968 bytes driver/utils/mem/mem_model.c | 13 +++++- driver/utils/misc/g_queue.c | 43 ++++++++++++++++++++ driver/utils/misc/include/queue.h | 48 ++++------------------- driver/utils/v4l2/v4l2_model_device.c | 2 + driver/utils/v4l2/v4l2_model_ioctl.c | 16 +++++--- driver/utils/v4l2/v4l2_model_videobuf2.c | 1 + 21 files changed, 86 insertions(+), 58 deletions(-) diff --git a/driver/lib/AVerScaleVideo.o_shipped b/driver/lib/AVerScaleVideo.o_shipped index 4b47f471da2081f5cfac71e5aa088bdc0659377f..e850e72c1c204e64816f3897d28ac6494e1835f8 100644 GIT binary patch literal 42880 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 fb6%Tm>3v3%e4$?g#R9yCGvmh&XwnvF>YMt1yb=

    SwxU$f-o=$DG3loK_o`0XrWLOz)IYN&A@I$ zAn8FXZ9g!85?`&D8nxA$pe!la>2NmslnaGErG2GOxwy)we15l2`OM~1&Rh6yOE0_oluK?<&a02g4YQ*!Oi@mi z#J(hNiIH+G?8-ZL!pkiJ2QMy+HT(yd*tO>w2xQE{>%m{ZnXs!eB~B z_*j}se^2;n{0mDiU%o8As4bx+$H4k0d%q_E*p_&I7%;4Uc+%eJxEJ!7wn3vr$DsNT z2aK==Tj~=X`PPJjcC}LRtI}Z%vz^usdQAF=L2KlY1s@ zc(v^wfh`9%tZ!8>E8vTA12Zb^P>U|A^xELeK6|)T81Q0Q>BT5{Ytr*W@}d$GVO`bx zYRA`?FRR`cE__WZQ~J5|H|+*!>eF&irunp)thP_P5sz4(HcNlx;o(_(b;cz(1^fJwL}H&n&D@Kh@wzQ8(3 z$1rv3qn=&S%+4UE7SGiBrhS$|fjmhPP9IHp`g*KlSi_+%Pdh)}7Rd*vi#p3o4 z^JsBs@1i*Y&8{$Rz0o2!Jk0D&dZ`6m8qY*~G+BV+;qHi)w~g&-v3MKd@<(`#m;FAC z8AkbpwwA!p&}i^7hJuL>a>bNau^3knYYJk`azmWijKxtA&C`*97S#@E5eEq zwoL@)(|RzmG4eKZOz4ZLWzXU@USZ`vazmr{=ovOxMPu9oV7_IP3Rrt)bC|RqthT_(6yqB!qXLW@VM1>JlG|Jk1FgU7R3su-;5XG*n zYj0Y69@P8Ky&@g_BJF0{gS}$&KDH9IkLW)yMQfBR$`C`2YW)m_j%vxMMd_-s5>(Jo#GH$jjMc-_u4RG1;5Im(S-_zM@4hrTy{9YK63(Yem6$BNk^Ms~jdf^u`?I}= zJH5j#6tEuE1_R>_CGeB36g*t16PSv+Kt0V?GVTgtCLx|YT5pqDbl9_9jI3>Jx6~$E z^bmvRu5MjorLY8sFjc(EI}3qTy2Lbl5g3GXj&2cE9(TwptPX6A3H6u=mpdtItHSUI zm%Clo=7ixP9_K=woA!pRjnoPL*N(=+H$ypws4r6yYee+fybtob3q89KIR2yPY6w!L zZwRh=(2RpC%m2^U(YFlm+k)$FY!+9yk;J1Vfj!2;4|j(wZ`*7O-+F-k*YoANs{JCk zU2tINZoW<bh6v=I)e<2%N6}$$olO z_IU$QUEedUo!Nre3BF-FheboS&SiQ!WGP;xSES;Q;qVss-A02Ru5aB>VPp2PkZhs5 zT~)ZNzPOM1BR5qMyL}ZRfcEa3H&;Zc3)CWZW9~V1G%`$mV-;yfAJM9<#N)TI2=Bkg zjl5G&Eskm_Xy?#>R2zXBV}ac$D#feYAFDN%#JY7VXuu*Wt=b6MKW4OxJM3=ybO@rZ zKNe9~o4}}`)wdj$>Gf5L_TRD)Z__)cy)E$s%qxNaMYsh+QFrN|b*C=^? zkjeHm4F_*ft3*HVMb+z5y>E#etke2I1so;_h|Ry?WHml*N7C~ zqxBWA@o4e3H2I@Ob0M{?YC03wcn04BAtYY$?V+zROW+ku67p>p2Q9?v$dd#MsYPm( zn%x~PdFL}A!fI4NWN9nG$P9Acsr1Ff9fQ59rt!RT6G)jxt$aa5u%csXQ494RH+Ys> zbhMlNTVJzD8@3oML~PS}36@iZ`to)str<5go4JdxCPR*qWOAk;1P2o#{z4E0_ zIPOK;RHe~HTQkSHHmTmyM^$f0wYSBiY!CfnKjXy5i~>xl^C`9XN_Cq$$LO=Uryp7A^5IM0_Wo(&?_+&apc zFw*fLT71fWOW+;>6<{|}_N$dZYn?-fx&51(I-=YilB}H;bEg2$#a#fJk~(@W>$(9s z9(*Kqwj(MDXx;eh24qJ$9_ z36b)2RandGA|YKB^m2?BP^(a-l~w7|1hL)7W#$=?%sWjmDiR8sz%^1pr-j_pWy=1j zveNx=^41-f*p)-4Ro=A0 zz&sO);z`b#FgBXUdw`yvkm9)gf-0R<-Dh%;f=*EmZk%LTgV79`TRqCbkhT=N*&`cR zit=~}mXS0=aCst(ONz_v!Kg=hf@KQ}94IS2V3oIe#fd`hcIM>epn&{cm74XhI;C1a zqdCY6tScHA*Q9y8YZ_No9&&Ay=n0RtOsS2EH1~V|<|!!Ht`p)DzM$59IK_j|Sx^hw z?IQBxr02}t>UGn^L0fUOh~ujJjZMpLf4xBUeuU+H2Fu&e%li}<;YI0?8))6cv_T)} zYv~KjPDl6x{T=;kqEqsce`4Cq*${Qg7&s26SPi`11m7yaE6!+opanciaNzW|y87*{ zm|0c2sFokzD7>T(-8kt6$xaVWDoA#M^#8!`GjaBzw5TGI;y~|{Nu#8udijRoQjq3v z;WU3EbuwsZ-Q+QJVcaNJ3kK7oMqk6n5MJe^Pw}7jDXp?kIUR+AMns_Y-Z*GniGxNQ zI{qDpjsL)*DMx7otdZJ=jZ3d0a!MxAf1VMx*~*E`8gD$VXvsh>Qt}T>f1}a)+xB8I(8@5?v74 zyW}d2cOk-f(J-E{T@2gn6kHITEG4TAdri4YRrI^nk#*_HPPLSv{1YkHRX7Ut%+sIIcr(zxx@{7`9MCv z3iyAb+cCt`imah-ZyOVl3@#+h`dJ6%ytZVyc6d@Y~ncZs3iaF!HMgk)EmOq$Z)LJ zN>np7!(Fg&EMwWmE5p-xy{{*%jM^WtR zC4L${XLuhrUK~emwdjj^MJ>5SO|)swepivZBe6Ku-El{;5=emkr}Iw~#f8(`S=ovw zQ3k%?YD4ZDo$4V%b@`4 zHPb_&BzXQtw6!h5hz2rIrb%QKZWKyX&0{t57^QWJ^0B<-80Dy0Q8}IxDpu3yufcSG zsC#@!ss%Hl4W_{eQ7T_lO=I8i!=3pJdvFm){ge7!>O0P#snuzxf2sYXpO8FnxsZ^! zWNhqb;#Z~HsXebhy|yeS8IGIFJkMhjFKPxC_!!S0mESgy+UE_Gc7Zg5Zn!DQS}al7 zQakq=gkDOEIC1Q{HW7v$F=uOJ9h^ zFa17$k+g?H_z-L|f@Pl0(pXK#F2RaRCwT1X!l6vT&Agq6fM+ZibBcbsDDA5GzVjXU z&R;xTTJ;@`;9s0q`r7jTwCkff(ryjuhDLAT^RB?DjS(unlb(P>ihYriX65CK#3D`-@%V)2>4D zm$wd0*cJE?20+hf?m7IntLb?Idd<{(S-6+)s(KBi>}4!(4=fCM7{@NUciGj*8%Td! zhRvhiy8K^KVgb$sZ^CYX|5AwG+o{)zQoRuyfZ15TdqtMir)hyVw*_0(hn@mIJ|NEx5yoR~E+Ycltu6{~!iQAoWlGkYg)wa!Y2 ziTXOaS8SYRFq-%yg0FTYEuHvTTKs*dJOH|Nwj~jvZGZ33wmtOD_X}K8F#(-)6D5kA&$^BXmfC>=gV?#TTEg2904o2o@w24W*SkZ1u0)TWn3eaT*ig-y??c zTT$<0kt_>YHm)ejUo*3Ef$7Z+0w$8A!6L^YuN12v)ihbU92eN!@SyJLaj zCfuigNS~gR`hZCx=X2>;XT+{Z{eD5Mp!uty{ECu(YnJx()!Y?tQJdXyDhI$n~QPN&Sk)1>@_YJm>qzfIv{KBIA)=r}q7^amm6 zs1Wpdk{+~6$yA8aNluizMEzY+o)azURD3VO4tgNFDA2$E2RveCZMXLYqXHsfmVi~V?b!?@M}tS*&VNU zgMK2=uR_ovA$@yLIr{c9!cpWLVMbhbX#usOTqnw1qC81SWp>B8kY1sy!$~uNj^XVU z7cZecqNW#{X+6+KhU#xDaXfBwEU!>)ncexP5OhKadMTv+`jGY!B$czCTo#M+m!f<_ zls}@va=W8;I6B~BiT!Y!5{FO?di9_u%kOa9IF2cFnotkfN2y!vj=PM&%N#<-+f4aD z*D92Ee8&PbQPRUl~9j(p? z#qZNhpkEm%OPPV&|#~JcWG>($C&2Zg~ad3miE#-l#h{jM|RTEtvcN%LlWqA2)dow z@dc}NY$E0FoMf$Bh2(hvJ+?DLs-{2e%*KCIbU4}UidXzfW-)Rni?MrIl4yOkJ^svg loq8kX?-<4@ICbnuVuxwDR|o21^k;9nwK`MUMBeIA{|~e*Ih_Ci delta 12231 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 UX>nCjx4rx+57(1awmIeh0c%P9h5!Hn diff --git a/driver/lib/it6664_hdmi2_rx.o_shipped b/driver/lib/it6664_hdmi2_rx.o_shipped index c5d2bf40dca5471b1ec5a272f637e87d6d220cf6..a1cf6c0ce0d9147ea4778bfb39f1b346104e1ded 100644 GIT binary patch delta 8368 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 delta 8489 zcma)>4_s8$w#R4lPf&3jOgG2BjDG-0g;7%z5$5HI@qbwA^Uo{5n^#S*qTsFPB|*?2 zv%uva{4biNrPVlzW-psDo6MU%=-vb?5WL-|Nh+hD)O%gu+UuNg_8sN(-uZm^&OYn6 z*4k_DbM~GyhqIo5dQU(}ERQ;7xPPQjE5%?mbh0P+2n()iEvRQ;dc2EcdDxiX5LatJ zLA?>ryTQ3m{n<9S*(r{tKzCzy#Gf(JwqA9*Q$m?r1w-R(*lX;;hQogtqk;-rSvFiU z_F;P+_lz5ZjkV}(tWb9p)Q7HhX2-(buHC|n6;4-c5TsL= zq8FG3^nu#`efe7Fi|uaNjB(D!uD0USwyJA5iMFuQj@kWZFg6eD1C(~I`q23U41rKN zU=jli><1~)qxI=t9UW!V^yK2ta8C11?trG~NccRummZf4SEG}#9fUcIFepZ}MLq^g zW77R%_fc$1j4w7a))zaM+FIYlId&$KuE?0UUqgcL7~JYzNVHV2YPe;I zV|Sp}(7qO|@2YLyH@5uKW0{!CXDUPS%HGA9DyUzLRoTjH8#)G{=?o@JMyY3v8c^5iugUcmw7oo;0z_ zBK0<&paB&;X}+(VMw3UF#GKz4t=?S8-RcE~`VBPP9C*68vZ}R6t#0g!W}IqDc;miV z3u+QUHG0r$waF`A6j3!Is!2HBH{;2z(dumxbw@;rx^8>bA4Jd{5rieHx9*$qqY^WEx=Jhystk6Uf})UA3#-0H0`w|cw1TW#*>R$Ibx)Iqp! z1z=}2r*OBwzrnlJYQsPr`aag*yiDv*Cvy&ZkT|(ok&~s8hQD`j1^iOZjRbgx@N36D`f4yrK+W` zrPba-q&jF{os2^;Ry-5zvCVT8JrjIIOMxq=8aE)^0~FkF#k3j=-^6u9V=u+VKNsR1 z@DhFF%Nd6{roye4hGQ#+qv^d^4OFHpU8qBxG+JF^+Hz{(R7Mo^%m^P|U0lhWtWw)s z{l}nnO8dqG!MSqqBuxGP4<0^N;wuP;G$wNZGdR*SJB9Wc zIpnb+34@2_Waj)KJIC^}Wz>*_;RB<{ig$tmHZO{qv9Bk#terZq3wRUMP(SlT(TA z?m0#*o)*aVLGjW(tN;csOU3WwtYv>xZVwfy4TcMN4aKnlKO+pxPzo%Iv+kf|rG`=Q zs7-@~S;(bwF>6J2II9IqK37_enk#x3IR5<)t`Rzb<#QGaE~F7k(NpQ{ z^Nf@{$C6JfF&8}Oxli)!CVASyyoM_uORAjb2NBC|P@cPjN}$QtW3-fKDA+O2(=I=!1O%8c^LT#rBqB9bhWp%8!z&NNO-xQSA|dCOpKP$n}qatOCwv3LmzB+N+2= z$#R6+E?|XR`LmQk9wW|qA!q+ZG(rY?#&w~ts4sc`CkmB0!A1Up9l?VfO8i&i%fvT{ z=LD5z@d%HHs9YZPAjn_K*$QYt9soP?V`^U{-X%tYX&qPM#ene;8G7KK_kNfoRQv%W zxEZpL9}ugc9NV{uQBZ{$R51)Z{AX_!uvfUUR#N4ec>^q{ekiH(%)bX2sQyJZ9o8t><~jLbad`^>vCp z(1z-y*t#}UGq6{=lG=xgGI&>9rMSd+q=5z1xss|cFH%=P2CA=1YBPRzoh==G` zu6YVHtmn!?NtJ7Uh189bD#soo^^By-v6o5h(3iS>px?ew{u)=3Bvp=`BUEMwwt=(j z#0;=t`-q@2yuX%HTu`x>{(wIh#gPIT=rf&I0;SkKO0 zF7_+IXNW6_+lU_%Yl-)WW-z_M*%QR)iLVe32`XV?Y2hI%ly`<1P>yQ4q{^%5H>g6j zomeDzh*(+e3#^1IgW6E%gQbMCeBw^xapEZ`#i;XAR6OSOuE8d7VN?h3Ad>`@X@f-H z+I=GK74NY`sPI&2D72PzW+x%7l(TOst{vD*xzcm6<|$&@dxP+Eq)^!+;-8=a+o!>_ zk>f8v!62|A2N0hm{+?Jw+z92UI;dR2AqXJ25^Oof#4zLNoeEq8hCp@kHmXCr7f& z-`?xMzKJVux1pYf2F!m`&|=ab5JgqPq|9GPcKO@52CSR8a$Qp8ogSYHHj7nKg?xe9 zuL9e`*$%Rt#&$f;23iJm)*mGOXCqp&cY`Hc64@%q*uukKlk7d<{FZ)rtp**^N=8QhSDYNe!#4b^-1G?3ae(HAS<>!ZNFUF=ta%LJAD zHa!0drX9Fu#`yBc`%)rUQ5`R-BcvJ%AZrI_ZxTO-a`gOM@|5?eU!V%r-N7{~f@%9T%$>>PIOV8sB zk>w(>nTY?Gc~i_u1Nuy-_A=sn;#)))@dx5>k~t4Ixe-&L^%R z?k0W?rnfo!2k{ZGVtX(Vzx%QMoS@P;MeEVKlb_Z1>J}(R9}`p|`x0>muss{tL2*wC z?j|~kmx)18iuP!tjkt)op12!4sJ;(rhd8SgZOhd(-+1M3P2)75UB2H2Kt9H13MzXf zA9F2SDk44~ zzRTGs#5&?l$at5J57uAPh?OW;)l0I=yVEeqF8kw?Hs=2$m=AMSM(vM?=Y&P+F~c`@ zd6ou28mg1qP!~WxX4_1BAMDuvhByZrFlzfuUru>-zYC@#T=`5=j#{jA^x2>3$oDC3CfYDh-Rq5_8Q{f z1T7Jn51*xel3l*HM}fs2qgWo(qAK+lg$z%{9Wo!X?0ozux?1n229MC9uKL+abbFJZ zy$@8`xpH8n7FDLNd2e5){PZ|z{9J432CT$ zU%!f%y|Q`-@=^7^ggxx1mVzBs@2l9K{nR>WK=p|JjW$Shh=;e|XfS=~d)d0!PhAOC zRJ|{1Kk!q(hO7@c`x%Nqyu`-B!eb*%3s!2`TlMGGj$l6)&t8UxW64N!MKa5S3}gwE zS0tO#?V9%}y<&VjSP>tVw@9Oq=FCRqGC}210wZ-m@Bz>v7nKM(xQeC5|RQ5P3}dgO$kkc zH&r^+YU|h6*lNErGk)r{7;{sV1Ta#uHd1t$)@oFWiPz3V>mxJuG5@t6=dAPCH_E^cAw^SK|cuRAfer}UL!_Ga9 zA~qLuY~Jw#TfwnMCANxV-J=CvC9rVoU6iI`o6bkFk5`JcpX|ktm1@4wPxTo;)f_+7 zSU=V0{ZuFVsV?$Ujq_7oEU0$)#f!Ea@aH4ky2CFbQTp-%O23#y>B|o&{h|`3FHfM9 z;&NpZr7vIMR-y35o=|f~xM>Yc%2PtQeof34nrNmU74I$(sUm%xtTNsrOA{CwN4T}{ z^l)o8(xS3&>HOV)wseb_i2`?OEzj$iW?b^HOWX zmj3s;CwKD*io&+FLCpoq4>$c>7=SA;=L2%NQPeJ-9ZnccgV2h$Q4Z4N@?DYKx{S7k ziE73mRD*C--en}L=Ib8*gT!>n-8SmelBKC5+;Vsb6;7+qv4(I{lZdAfQ5F@@q+=r| z1Uk8JbD@iB1Vm_>?t)Gq+_+R-X&1hJBedaoN_d8RGK@Vy-8#-<o}7)LBaBm0^e7TC}_5Bn0JB*7{aSl!uf^QA_0+g=$zuehRdpenrmDpC5%QV}QI{29?U@+=3% z%OIm}?mgdpR z7CFo2hLWqi0q8Wu^8&y{R%W&X549j<>nS||>9uJT<}utF`*iY-f=Av*P~NE*=W05; znlC{4TA6sb^+)uCY|u|*$5-Gj-NLxyVN6lBFSTsgLv{r8{wZd|V|35m^q}Tkhqgm< zc9lrWuT3H;jyqOB)jUc%=@ouZA(}ij7w+9^kK$&ixof;Bq+;mdxP&P8lYBee8r#{_ zv3V?h@eGqjzb@SLFeu%T2Qx#SP&D0u_|Z1Hr}yIKQoolk!a+-pDNWhSN}Dfe>7M?! zm$t8YB)r6v&GS%(e(8z7O6Bw3n9BY;dr)fKaM@G~qAlIR;@Trb{axI&-W5Un8Qy?Y z^ISwEg$hM(g>RTeZ;d@$TlTheclP9j&>O?QhnYuidA5B%W1gAjRS(PZpy~l5VE8!RWjv^ujU7wKUUw|M$F{%&!hAeA5Jnqr6=c#L4y6|DBxf(1 ziN!xbd?#R-6Yx`4z;GwvURS^fy8^k|q`dI%w(QEs7bn7l$$`Kk?|X;(D~kkizW7$JOeW|&Bf&BNt5WVx7|xvPVP>0txLvYuH$XCeH#nMleQd`|fl#I_|iek|j`}pm%>M8K%D*Y9* zno8U>TiH0@*}RcFg6>?nqSTtAe8m{0&J?BA7$sqfQYWGaql3nk!G&9wktqrXN!7VY z$bZq^a5Gg4WpQqD7$_qr*)Q6gye^OwCd)`kW{{p2NUDuk3PG}7v^OzIl{G70uZicv zlTu6m6rsu^SvPWY5%oJU;F;sRdEp^egb_G7{*6+VOxiok}oi z2*dD6U_^s9nrgiriFoA&1Q{A|PoIpNM+UdN2nQ`KMWj<++C2w=^x}^ym~TXnisl0s zku}k3o0`vBB`PORF+I~7oB>1}!r~S6r2e+WE0w))b1PVR#RfEFu}NUlc+l~z zAA3G+uX1p5sWfPTk!IASx1$At>)m-s{}^I<)ZGC;us|3Zuleb}51>T9ry?YXcgAmv z^_Iskkef&n!-PkUZ`*$au~y!=k9MBK8{a61x6~iOmXp|FkROS+#Cq`C6Ic66V!iTB z?kI`%%Qv}~BsPG4)?v2l8g9jq#)Dv#8|#U-^kZl?lB8XMo8yU>Q=&b36yJ}qbSF_& zW})gKswOiPB@=C3L(1esi8NdNYg=T2FBMSLULrckXEts)$?##LHtLU6}qD` zXKfwe5HzKy!#|?%fW0TK@PHjBuJC|;Ca&;+-6gK@&q4^722_4d5`E&>VYV|Q-24=X zo&23e@>4}}#dpFHk|mtCT~Zwdnvx==7ecPTTTP0(i3oVNuhH=ivupRl-mPh z{i))U6wL|Lmd6eUR9T|JG8R>j<-Kv*b`r;cgT2z)l6W0JC}zfY{#sY9LR75-RJHaa zl>;BUYVCJbEm@J|5GlAWQ7WiQ&;o4sg+Pr!Z!Rh^-RZMzFO{&-Q@q*@q&js-RHvD# zRv{?bM)$xv?vmbE#}yUzPECDONBXk`72SjEn95F-`&_Jgi7GGp+OhoxW0|C=P8B9) zqB>PkiRCjRuTvCNI4dsQN7#OdgFQ$%?&q?fKzU$e=!uk^#c%->d{!` z&qWBW+>=P*TYn-$J_WI&Z9U+Xrd!sGnF$OT%UmJVLJ>bHds0rQqn+G=+#W_VaH2GT zSm>Ex_0nAwjylPs+cttp_T{jVSdV}IjvNu9HsHMc9-hm7k4p;TS?e<;|Av)Z*Q#*h9!c8*+05zenuuaF2Xb-QnJb`rV;$^PeFZ@=P&~ zq^ZDM`AEfnZ3lkQANZ6VxXK@R&<-s12R>~FR`>&dV+WS`1D~-2sgLE6_P2Imz$#vM zAGLbOc22l?H=b*}d5`QMida*u zJjv+^FpHk-WwIO=4#B;1R-43 zmBCgDO(%P2q6g}uQ&cRK?#(#?sX)V4I+ZOIgu!_5(l*T66h;21v7DG?+%T~# z_DZNL_Uf>%*wGWZVt*Rb6+4D@;x()9-;to7aesT>$7c+te>&b~Oe@0yj2A*Lg|@`m zMlo7u$bEDaSmRI1oS8S|_{ig{_&b`5`1lj?Lk;zZbCQ_N6eY{bte<2%PN$X`spDZ; z>!_mcjnWo}Nyu9IR@_|1f;#nDC#~Y(;g!ywVIg{Wl~%T~=R#Q##oj})Tl}#XA9ImW zo0|S+0NJ1XWVd3z6)>|awM1XScO{myO= z`32P~@q+ji%5l1>9LH(JI_3D^Q6T{ zhns(dreE15)dOq**Se+&p&ZvMEoQOM;@k{AvSL6S-D&o^D38oO++6P@fni#5ok|YG zFlW@BB)$V;(TIz*k58=zFxNe)V3>9D(!o;*H(`8F&C(F+S>F#ps&a*qIsABRKbu)h zZdG9u{b7kRcixdAQw2V8ny*Fhm!#BR<3Mi0T@3b=f|}K16L&Nx-rI7ZFqJ%-THce2 zy#UEvBO601Sma6`Ck7gQi&2`8=_q0j=s7t+feR#hv}F30Mu+dB_~+o}aTAMs?3A$C z{9HeQW*`JO&loO-;L6WT^HVK;fhR*g%Oi&?nSk$;WVquqQnB}Jjw)@Fiem5Cv#Os$ z;Vk{1R5)(6e&W*6%15yTuCJ-^LG=9T6j8AlNn=W2H~)rtfWBcCV`_Y1fcbDe!swQ7 zs*`l2E7pS^=F9kdMfEoO@%twJ-ooEs@V6I#`_PNskH07I*M;{dvB@X~mr|&_$8P3X z5*VGtb_XodJ1q8v)TZj#ZqeHr)(ZxPOP50HE_zNh0hc`ao?;q>hF^+VOh;?+uIw_m` zWNx2O8+Ii-Oi4yusl+&f}y+~P+l1@Ek3G)*TnWoL$ z0y(JJFC7HD;4X=)FCgr%0q`VbkP+N70Qz*&fYB2phb@~u>ZJz0BiGe z#Q_g$ZGP}3t}FH~4Io9Y!rTW5H$D2_(7=iDv#(X(Lk6UVAG!$|I^|$Jo&=bGq8`ss z8&x?g9MIX(d4T{~n$u6vmuaYf&q_ub>fg2KlhxR}jlEc4de_-t+;}1xPm4NXbNq=?HtGh=c7b21&5*FeH7l0$tZc9137r> zm2cD@;_Y=Ug`Q><6MO4?A`?eS0m*KvcoNHeu20HTP6KvLkSg9linQ#9#~1PV#*_xI zN5_5yW`$oIx2e?;fdbTiNgprLrAgWU7RcfXaC0f1R2Xi>T=MdxY8Q2EAe9d(Ubm8? zWnf|8_Gyq6WA8M@F2u%ZA$hOm-)2p8*heks;8r>+E{z?l8-qL_qn*Mu&+efJq zks~zsP2tQX;yG$zxY}n5`g~URy!B*q=9=UzdVmJ|XT8SM~H-e~2rl z(WcT%28nrqtCWMXA{BcX zi#{rL5~E)X5c7ub*o;9ty&Wn{%~g91?+X~Fqn)7fH|@d$8yX#>U7xB&(Q~~G$c*2? zh!sayB@3qOialmGDgFVfNL6fM{}EE@`xb8K|9?7~%rXL#tz8Ud)lmP~cQ;}D{ zjiKnvfQEXs*3C`COwO`Q5Q{VSu^ozPai%*}jP)LAO1c>m&8hDzT8D}plxhO6@Ji$A zBgCz~*&wD2gj*XXpve#)m&H0#JL!etbBBkwk5Z&vg3>PCXxopGNLuXqsiYjKygKqU z05yLHqw~h7g7)t!n_~@D3T$1Pc2Y!$))piKvLja*bjn-1#KD5^q{;wqxbqI;&*EL30utqR>|NpX;Fl#;7M z@S=PARNP!zrIMDPanp*ZQ>)QljKEm#Fvc~9`51^nJrG1xKpun1#6_DWlUCF7`Y7pA4}Oi~GV4kqibSI<*1{q}hmJ6h-) z5<9(L;E1Eo%vc@Q!Bj$7c1RgGuS$^9Q<6v*B%F)SA*hsO z$ANz}T(E~MQIYC#fKIs#5FG5EN zUwF}v8pqR+UQD`sPv9ULvD05y@GkKUtwl4(@(84k1~K&}xEW5Mps#N26DZW#e)13s zVxRR83USI3Hld5ORFap74`{>R_$ngX*+2$N2T|BGg+#LvH~$d_iY6VQ(9?1A>=ahY zYCuSuZblB#wnCzzTl+J(Jx=Lq@A&eE7we_u%9PAtiU%Z{DWwbuw`gYLvXA!YK zf^YfmioK0;h`lYwC2u>W4Bv5-Sf$UWBB*4Np=5_Q)W3b=CTxy>dtA7AxooKn)QvqK zx^@fXgOlnUUg+hl)6|}kXwzA!nAe&*7%$=5d{kYrcdWif#I=()oY9K)8!L0Art&LA zXEXL5)blwg^u5NOi!k>*iE9*V2J}(NyI4bba?>v}c{@d~CH9U$-)X3SCluaJMAjfNh`D+dJudUql zvhumko_Sj7M;zKN53|Le{(6*B!<(80?vZb5oIq`0cRP*6JkrNV zF!p^U(u7mqzOO=~ZSUhLO}D`BU%FKd%tkPpIM9fpT}%scpXe+Pktm8+FewqZ6e5-; zdR=l%a6!So<-W&Xf-tomDu0biF!1 zNHP$l2StP}UDPe*yFJ29V@HZ2qj2%T(-lb2olR_9O~^eLcFx`VC6!9(>z}@T7@N4G z(-uJ59m}bH-nXv}pTj?4Y(|e7+Y-&QPhM zplHq&fiPYBK)nYjBbAhlJ^d3qD4g8EhWdlKn;vqq0`-Ra9>-*vVmJlaxY!A%oR0J5 z%<8)xF&ru?qrNR($m**AghA*tRyZ+Q{N{(78%Qi!p80b_iG-?nz0Rhghfc@m1UER` zO)|(fiJ8|B3p}%!<@Ex8I{6MnRYc55IyRh}p;3nO&eTAHA~HO30ohC?dS)smR{BdE zG{|HwP{IFmjN>Pm<g~YzM4c1hnXC7?)Zu9HTPwoD7NPbH*JTZDdQU{ zjW1c|lpK|nP3-e`DHmfhZ>53kp6gm~G^=l(7jigd&)YCpL=yL7`SmVd&2qxcyYTML zJ*j<;0}Wm6nGH@Xw;H`Qr^q36=`d@~z4gnftl_55LMi?#MU#h4N}gKyiZ2lUEZp=x z7YylWi)9Zrs$}E;2cdY^oss{Wu9?n}W$tB&=AwjG6Ir~+kSNp{gSU0Nt|9VvAU^ka`Skq&ZG=PGjPPh1-Hl1Aev2%6bH7CiI1c-7oz1$k zqtij`eH|SY0qna;gMsUx zh@^vy%}Lr+9He>w5Pv*)`UfGa8V6RQ)RiEp6a_?`V-oUY0DByZV{a1qG)iU24TIj6heR@ z%c2(fg4BiFLCel+QV00@bCAJK0gRNq6<4!C-&Xp z(=;Yd$sf2f)=x5a;^r+jZe-Z?Qsm=CHnd2Vn{X<0^JmmauL0qvEQxzAdZNKkZnMGZ(53CFZ zR?FX~49Dr)7t~|&Ngr@maU6gTh12?wg2dAY4fP+4*hC*hy)WM1Z>WDiZ_@(}^&gHS z5Au=tzUd?K3Ln`=97brlLZpPlX-Ml{PdgCgY2Oo+ls7#^r1H}8pV$Vy{QVTUI7l%N zN{oPQB&KDSHq;MT3G^;7r-R<+frgZL$Xu$Co~;Tw$3t1DaCk!*w`Y$;cIx#_eo&*o zU7{KNUhGH{WiAgE%4dSxA(%F_+KX8T=E<A#IE@9#0Q3lF(2)w$J(;o^QP@O+fF62P#iaAw0^k@U3I8QsMR}VpEZQ;-<)D6j^myCv*X3 zblgh>L0LBQC@K&csZ_RxcCciY?MXP%bb{hFgaaI*$UzRNbQI>%A6}PPeSZ*>EnKI? z(E2nPYcWzBU{d5bCbz>>b(Bo7+AMU_<2Vj~Qgoz?ihKtHS&Q(Z@a{C^k2+CCk zZ8^pq0sa4vh$jt&8Tr-#Odp;@3ph7vS0}q%uGYZg`o*G}sSdhCE*_Q{zSG@gwbT!Y ztu{CALtd;~mTj(&T!JgIY(?>uHIaC6QDlB)Y4zIj$inJGd2MZSVQG7*_tTV7Y5ID2Ew&E>T<6&2@9i`15{om#N@ zqKnSC4BGR{9h`nqO*PkV*7VD(OINQiw*|Plrgoi5zuKR?EKe!;(s&e#E{E_-%IlKr z6Oqdz#nGipAtWx5Pb1xe=)y&Qy7@)(BTLI_OE;`uUsb)fWND%_k*ot(%DB|qvK0{+ z(T$^)3exgKBwn<5;j9@2k%;7`(p?!yH*>~pn@sWJl-_0YBJ-2AwJ6d^ zof2b8!K}@L#h(=^bsIv3;^$;Q7dwhMQgq!y(tB_qWle_K`b54EeKYAGQd3*CwyL^x zJ&{ZkbY(T`YigCcY<=1E^Ow#ykP`a<`pVjx4W*H?n(9qMix<0k{&lm8mI?u;MU<39 zH8)pB>dH!`fel5@*|Q2FiJHjl*|Q_1)oUVyG0=8#BPnInf|}a0^2kN2g+81-iLjZo zBCCn>MfmXs6&QnvIyllbwN;V%MKUF(KPg9T4dhTNCwZI%RjrTDf{k8RwWho#0z0P) zcuhrx$7OiRMfgt{1r-kFL)DsSKF;NGJ!JAFST2y8M$!A>=^~q=Oo43%&*U!GoxVkjG42}kpYoe1vBRq%qh4S3DL$XxC?2W5xHAj7}q*fQ)F6qa?qONMi8 z8IG#(qr(`F+?R%F8S;={y6CVyJB{4CLpuB{6@ITP{Ks}U&Dqjb=;D8=&3}ywKc43y zceuy^>8MGCx46Qa?C|?kcn=we)=};sMrrx>tMD6K>0fWBe^iCfqF+1ybX)#BN*C7! zbkpJ0LcO94&r;#*T>7oB^-Gg5bp6W3zt!fyMupS%Qk#FyLXkiOP?HM(SL({^^r?)0 zn=fccN4peF4o@TJ13UbH3cogw@yK12M+6kVSA~BS&vqI)Njv^X${VgFbkj2AEVjd^ zs&G0P#tE;n!{aKPmS>&t|7C|)s&M)`%L!j#ho@BdaF_fcTmD@t{FknJ^nj>G5wJX< z!fA7^&HpOFo)F_j>ddp=q+z7*%C#uef8|;#F;7q~I0ap~78$1h%C%?>%75ir!Co-e zqLH)vqFu&gnViB`0i!Y}bMjs@00iMt15O`4694C>NKV3!;c>abb$Y`80b7N?ApYfw z{=qst;1YI(-)j5?(Kj1#`o=Jb{^!6+&XbGqfJ^ui{L%o2@W$zcDnE+fJ@_O1gewTO zEa98*OPkYz_&;mFUpC+w1O9;l55v?*o^Mg3giH8h{GO!n^DY&zC44X*Co23*rASfl zfRm34l7GGdr-@Wb_m%?5U$h~3{F1_dMQ1eO673UyD-3*U6#a{27`TM5#V>sbN&NG# z7qIlPc%*HNg#V*(x|Su{Cg9&u_%m}Qy=YVLc#py#_>#nhuf^joh5vMc#6=r{$6o*s z(!&#q{?%GZFZ>}Mf2;6s6iZyRC3yV3!sjdbMH>M8H3R=Q6@AqWl8^BDc+7?WrTjjk zaN+BLhk*yld77fXgDMCv;n(qdj>30t5U?fM13b=B_>HQ52|o^eo`FBLStL)VvLE4> zLH{L%k4{Sd!XM)?q42R=Brg0g9=9v}iLDYB{+AxB5_9IvnO#!3W<%AilEmg2Wme^^ z#O9K!+OJqu%VH%9XU#8JQeL{|iYwklCBp{3=CC7a_L*T`raZ?0WaZ9mpj zTN}#j)>@!hws}#kNGBFsQ?+Js&6@I(r8ie4$|`NPpmV3AQ?|+~*FmVtHDw!Tm8`4V zWYJSyqE7tQuCeO2)Rk;lQ@*}*iKh& z4luD5Dy0V+M^f*477^EOro5D_uhJCd)flwdY)BSs4df}UN?3`_waIGAwO{CBON_R! z_yY7|lg$!h)o!kwSyES7N?NGhEVUrZJF$6FX>CarvLs4p#nPH2hDg@h@m(N@S zzMkR7Bc4w8y9T_&fWL0Q$B`ho=!f%Pz;K@5T87gHQCgn+89s*L`x$-$!w)N*(j10A zeZ9!&$wz4ZZ!(jYXoT70)Qy9+WT+MLK|C&;gkoB*D{>b-*3PV zF`V=Hkl~!qbk*hd=IeQeQy*N*lc&1$Ui#UTNnC`F!=I+FU^v&q?Iav7U0&Vt)%vc& zi4QNYJq+i3-eNdC>U2ku(cmJCiXvb6krNf}<^L0ge-`wbPYxLeE^mH!C|vU|R{X!m z=(+qI4CnIyh2dQO2-ozN zGMw{S$#9;pNmO}odHHW)IM46T7|!i8NtH_R;q*UYIH&(thI4sl6OrP>>2G2$#9CQ@g&1}e(z;CWl_`r z)`0giobw+`Mv05;fy;9?!)dWx^S_bdw1G$CcQKq6#5I0|;hcXl88I$zx?eZoKQ-X@ zGn^iEx=%3Nm0uD97p2SPe1zd#&Vvl+dbp2Xa1kF~E{7S;%jK^O=k_^+l!%M?aJ#&E8O&qjjfzmnmcPcy^0UH!8G|DyrVootDViktGR%jJBAbN-bE{7wTNIm6-4 z<-f{+uV*-^O3O3AaPF^8KhxpQY6G4y;NLgkBhGcw<@udzz~?iZ_cwmbaL#9s0q-&3q4R>} zIgQ~w-OCxy(_Ll2?=ax|8Gal@&~`FrTChA*8P4UIZ@_Od;9Cs%_ZiOfwVUBo#kHLM z3_qUXCrx+c=XN{SfZxDy&gW|e{6&Uyz5UgIPnhAz!|5+H;7bg6jRC*ifd7L5f6jov zWx&Jd2g^UrfG;%Q6$U(I!2g-y+`sK(IJr`74<9g`>v?K{BR{!7O<%-tPG7@tPX9W? zxm}H&>G0=xu>s#~z{g(@%xAd)|C#~6*MOfmJDC5)2K;k} zI_dIqyoTXi|63W(`Txv-A2i@^8u0OR9CqY3>EdAi`wjSq4Cj1K zzr^9g?Qos}FEQX-4fxL(&eQE;I8XPO0Uu!aRHpyQmpbxu{-q4(`uqXIIsLB~&gJ=o z0e|0sPn_$>!}-i-I8V2X;hesO;hg>l4Ci{-&u~s(bD5Nfcn`y0oI0YowkVul!}!zw zm+^&u>ob%~tIH%8_@5s;T z3k>+R2E5jQ-(kRiVZiq@oY(h1Go0&fOpzl$&(~UpPhjOz&+ro&{$qyo^4ep-uZ=nB za(Sv5&gDrlobx}-aL(s-hI2W`F9=R|@|6zG`LAR+=fBN>|J;E8#(@9DfS(+9SIsKUo z=k%8`oYUXPa87?S!#Vx;7|!Ycnc~J?$Dt9*%EkI4|G(8P4es z8SnuEetL0my2}mt*BH+GEgv$R>vPt%!TeVk@UI*2`waL~2E5;ZpR^=cp1B5mwE<5V z@COX|VFUi320XGfSk46o{04^ecK;TJb9??J!^a{iZMVN+IJfiH7|zRg$}%aZuJ1=w zeLr8}-uiwq!?`?PVE9=~o`VcOhv643m+2CJF8{3t{09u@d>%C57hV_4f29H6!*E_t z|HN=E=l8F7`15||0}MYIB)VK)V)!WxKV^l(=TwH5GMw{oHsJR%ob!K@;hay#fWO0V zUcM)M(UJ2+Cg%kVpTY22hVy*g!*DL=GY0&91Agw89C{dGLwH7 z!?~aQ1H-v~-eEYeUuUj#qXOgyEdNhvB>&LpM2ca{LSfK8@i#zl#~p`FxS#Gm(_8*EJ01 za{fr++OLkvmGb?Z(T5qI-!Pop!wVihXDdF(7(M4Ry2Q}~=QG=YKf21H=ki}(>fl@t z%?#)KZzv0<|0%;c{qHM+=_6|$oYVh_;j=)Z^*^yPm_BB}pJ6!9*XOGoJ{-Y{0|og5``F z@G1koP2tCb9gQ#acZs(#dM@Yv48H*My4+u4IG2Ce`d~Sy8SuEmwLCpaZ%Y_Gm#3cL zJl%gX;D-$OfC10nAm!KcMDpbODGK-Y$IfFo_n%RQ^Lky&a4vr%!#SUE)s8+nelEi~ z|9K4O^tUsdx2IRtxbwS8<#(CFz4=Xe=)b1uziy!adxrCReURZ?592mE`Q`MJ6|T$W zdn(=Y7=0K~wS8XCaL#{=htDq*pGHQ{`TPUJIiEHUpQja{y^Nmod6nTjU*WGf`Q`k- zVZfheIOp>g!#SVxY90QZ{#u4}`Yi^0yTY~pdsTjSGJ2lh7Z^U4mCM)b9C^5X-pO!o z&$}4T>7Qr#g^d482E5mRziGhr2fk$god2kVBR|K-8t_vMcqzmAI>;>ypUCp{zZrfm z!+*taUa#L__~#k@>ZFukmt!S00=T}VaLVsz@Tcq1E`}e+@B<7lVE8GU@Pdo@MDVBi zOk?oeDZ^p`MKY?jNx2w*D{>z`5uPza?yS(gk;DTPf&KbQRPqLmC8?T_TVq6`rqKe z_o@1s^574sdZO!r=Kr{ouiHc4uH-r5!CzDLp~r*YtL&iHgV!qk_IvQ_Rk{(WW}ySp zgT9K?17Y;1&$(FR!S%TqO&(mIn{b~8*XK|i@ZkFVg+>L{dT@Qtg5Lk4 z>Gin}l^%M1&O*wA>vI+xITa3eh;qCUwGPs>+=_^8FgDW;D9guCTitxrGBc#K?XAt<(m`M zj5Vc+QftQQx;kryKx=CxQdYBJ0}i3HW>nWC%4b}8_44WBPy$6&URhFsfrtNQ#k4V9GzS z^5%aYFe0J8C%^Ky%QupbUpoK#m$pynXHK_3#pf73dueY_m^c4%6~EV`SS`Qidp#b4 z@*jUjQgkcEl>brq)A1+BV9`hSBq2g3JSzz*6rKL@%1`fJ*@?E`n=*!ON5|kbD1E|$ Q(!b~LWc>R)%)ROV7rQ}P00000 literal 54456 zcmeHw4R}=5wf33(Ku~0&QpF!+M6o~-0a1aXW+a1y4I25AiWowE2<0aXEVDVd)W2pH-L7}pr~FNGS$tmp0TMdE9bG0Hg2 zSQ>48V{vrbTkXK2txrZj`skz9{$xurKC7ZT@+M3ac%*N7XLLskrAAv@YUpE!`H?^Q z6w27LiDTECDzGga`?uFV!+H)tO$ZTf9`Gy;REu)lRQ?;nr@i9>KPqUJ;4XqYEg#ViKiCA5eNlB}$J@ zpftth#wJRSUcokD@TT5COJ}gT63*nZeXiFMi-jdx=tJha7eum3pCW&ZwwkpGjNBsF zR&+tItp{aM-M8+2;r-Sgkux^USz7B+l~a$KJi4L>4xk`|JlPPQBe{$6W$~F>Riqy| zw+$~?6cF8UuW<7FyNYv)U=t5mtiY#80$HG&F4%_L&7JX}Y6mtQ`B77E4q1I{&fr!L zwslJCeiWxyYfy`ytFvt8i_Vmkr{;wWc`co>v)y{aNF{;H7$*a6Q-53gxr}7(sK$t1 zUwx6H#+;SIrSPhk6dsMDEXR&r#?0B;C8g*f4~G-K-r6&wzjdD^NtRxaaggtGXtMW( zH(UGP>$$LpXOI+@uMO%hFn+N4C&B?7x?Bdx5k}FvlscR+oC2W{ZYK>=6zm_~~oP}nq37;GVnI*pvg%gt_BMmh4l zlDT=o=EoqHYy!=lTM;Zgfv+Tx{-z+36%^h*;~Q&?psXW zj)FzxNMEf=@-+3rIW^NH|Wv>HM$9;9kNgoupl6499jL)?h2Yu@?=F2HJ zz0JibRzDc0_{}zjzt6-j^R+yMSf2{X1a<+Zu|ZRB5h@{KvmZC8XW2C-#&|qxx6lwq zcJV8`ZRR>C?g}8}im>GZF2LY{5F&WAisq&N8T@TVu)g020``+)qA!h&x9QLGr~e|O zXdPTMaPbk%2P{#YvLl)=VM2JvAc-fbE#$;wR-+MBkV?7@+ti(#Y`GP*7}%K~j_8Pi zohJ)env_EPR&U|99mWj74r6Tcvxh*A5rUA=GSp6UG=(@5fK9r=jph}t&)HGTuEk*U zhiLV7f#(jPKzIi?Ny_7!Ry=oypJ*2b5_%r*iKF*=GULRe#JZjw}myA7ERkiHA}(=%}E!{4XG)bjFs#bmjnJGyOeK|Z)Y zG5Us`Hv|w71b%-spU~>ok=I!+7lO-O;`CkWPPgqd^XHXTHw~-}ZoffPy>wIL3AUUe zI!3OtU%t15j-1MGs*0$c*EEn9AK4{JFw$vHHk*0%fxJ>O9A_GC&qEHsxvhgLH4IeY zcDj2TsBJ_mROBp~8;GxRCt%1B&GP|EjLb|M9%@aPeW%&}$*|3bu*Bii?$gm7H4oi~ zlkPNpb99_tEnh?h8<{BNr*BQ2Uq+C$8t4xQL-Qk@9QiPrsCXv1B){FthhaYvC!VBx zZo|Whb3J+vf}EO#TYsq&$tqm%+qpbXmY<5dg&$OiW>?e2NW$m{eXpj|JNzk2ZI1IRl^g4xh%TF4+7yD4m(ZgSes7WfRCBZl`-{A8rowyZIs=v=o_A zq+V9qLP1OS)VJKU>1YAM#DSLEQDI)`iN7r6DtAul|9gAUKzd}2g6fWOo?yPK>N(ka_X7bzf`G-rk%5#$x#QI19l@MF0ZN?-DOj^wyi&d~4X>B&3%qFWzC2Uhd#Y@5OspYsSBSK4RSkfxd zol85T_eTS?EI`e50gO*Azhj~|pKR)~$;$HPw2%&U+bk`R&q(=eAscu461W5xW9P`i z;1j}oc9sUJTkj=53O>;vt=JoEE6MMS?m#bF(UmO8p%oh@{LX0L6XwhLg!ytmVZOW} z=kqmkux%+k`*73ich2q!eq-;4%xOYo?rU-DxBxd-O^czFf8!eGrnV|Dfs_>8Iy^K_ zqpvXsB9gje8vsY4*0`0rD1^5|s?zTVrSuuJ$EMCjCwnXK+$8xwn(0<=SZh z#5)5mo5_eh_S{t|3kLM|t)6}=yGq?TQ? z_QkPMFPxAO!2=o5w?K4*mk18Yh`tS?30@-QpJs9Q%-RM={JCMA#cHQ8XYASVB%iJ7sb~ zYL(gPu>nZx8nAOn^ZbiQPiI=@+teOiM6@l3%Mi^qYS4Vq{YQP z)lOk?uVr`+SZ1QLY_Da^TFDHTvrS8Iu?6}6V)a!1cUO;?=^XSnh_Kr!t$m@yljH`0 z_;P1uIW~wqx!trOun)J>T{y4H{ka1=_==%$4RYDd%|Y8vqoTiU<4LL)Y-s~4x7dJ& zEH-QkTDp6ubarI@*b8F&WPmfbIsG;VX-UkCcC?~@i&KZx0}#k%?oPykYT;FTPs67bE1#kBBGIO|rbSyDkKv$55Ju&ev0|LQ=S$?!Il@A-%SZODYd~m)ebO-Kg_tsq?33WJFAjtT<=6s)~!UDsz#egyl|_ zON_3_EBJdEf3F5I81qM7HS0RqmX|X(H+~9`S7`1SdBv5MBhp?LX)jZn`1Wd|@ztD$ zcKnuF2|hXTibUhffz2ynh2C&Gxqgan9XLhl><&!=pxFpS^X^#V&g&{PH`p>9K{?U* zN+5XmNf1*NptCBRixk>=Cy|18KV+tS3Sx!Zd%-J3x2%fk2{ejjt~1R-89ym|GEShg zg93qhw2M~LL~Q^uFfzdoq_Zk)bJBjL3CL$2+W?Ohbd{STVj#xT752x;T;t29V0MP7_ri!6$VZB zVl3B~9f#co+ud9U-CQ4abH~B158WKbg-hxCfZPuB8y=YHBI3#+_;*OS8r<0MP*MRz zASX5{J(am7pf5{wo!$^H^;nFda1@HPx4zxl)B3CA(mlz@BhaB8`W(aOF>6HJYyOfW z;=V-Von;R=pSKdLy@`jd#0qcX z3sxcxvs}_1u@Zgu;$BQs#|O1@f-QUS&7xi5Wpv0&yv>{Vtd+RZoA{iSc)K_8*H&Vg zH?hY`yvd!2M!L7Rp!FGx;zl2ez_IGq$kFPi#-m2C`2`RJpNJea&t84*=_ycHjY&mi z+YJIu9>~&ObBri*O)&BdgElJ7)i&uK9)pY6L2EV_k^4wTN5Mu1-JYVGY7?1=CA&Wx ztQN#BG}%x-;qP8HyP{3|qgm#FH0$e&=CfHJe#vA0)VgVMGeBGCJLqWO)emkD7!6n& z5_n%&EQrf#Q!|8ccvl7|A{3oDKof&d51qG^o-H{(rR0&8$!w({4bj7&&Rfc{_I#ru z4E?CT9Ghk8Ft#i5dY~)v`~0rR@ljooH%{w{yos*jgpvLu3iLAW@5uZ3jKTDcQ!U1{ zzw5(z0qjy_Nt|sWqhyBM$47uQ{!E!O*9pi_!R2#Qe8ccR))3f@xP-&yaR1>Huj1*0TeIuN}&+7G~~ai zXgi#u&r(vbX&@ME`2o6q>6g?FaEM#kn%0DJ96xD4i=~$4X7G#@1ELsEv!5k-i&Z#vM~Tc7ctUBO62V)Oru~`*a%0YFuvQi1!k%Hrcv=?k zYwd1*JGt<9a%pce@;iv;nA~WJ!A4j76fxIGFGO`hsN={vpw{I8`97VaCQQ0#VO08V z%0CG=SDaYbYn6lp!;`%Pih&T|bJ}z<4VQstikE8P?|3m3v|MsHit%~A$V|6`Ml$lA z#Zi{6Gg0I{Yi0G*sGY_ClWNCl*H2tM%KE4m-%U1|K8T?|ojS5dN&NBS0ebvcEQZTj zwVY%00>vC#4wL%2BK;U+zKy>>;qM*%y^Fs;<|sgEktGd{iW3W=p|SNfpPi+>|(hNpDQ$e_?NLt~t=A$bL)=)5XAu zbZ|BM2#AM?Vfu@7fK<#u0-b80Zs(s*j@jwX&(G{fj_w>y;=Sa}EJil5iT7hYmGsd4~fu|LTEj9!ANMlx*s% zOL$8F3z;!Y+f3rjS0E@J>dqAv{KC$WB>0Pg?%Dfd<%!1UPYG_n9DCE5rIvKyX`ajV zx06fm>~<1Ww!&gfokIupJN~SB%3Q3=eH)aPuAc5H8R^N?Ll@N)U_^7`B3cHT`&O4u zoV{M8LF*nxV(FxD0Gso3#d{g#=KK))Hv~YMKZ-GhegqP1{`r4H?7lDP9uM5>O+YC zi+x-;eLhYn+9OfBAC(MSz1HTttX6AueOubcaL3IE$Pefiv_&{e<04WFPK|2$o$+(0r6wuy*yr$l9;Cq}1 z_704ogDb6(H_cx;V1i$L=C54y*B_JwYK2j(>8cxI2|qM5K=m; zXGh*_I1M_#N#~&{HDEhosn{C99?u@{V2-v(dXS^X+9IK$9e%N)9e&9}Lm1lq8ePzH z)Q9ZB($X=pUcQ8a8h%E4bU{t@NbTrnK1$C-&`{*z6fGa?&gj@wj|eKd`>lSNMXNbl zAyIiM#O6hACl{2*;H#tBY$_Tm$u%O+*utg)5vZtF^PWMosX~H^?%oZorzx|Fzrut{ z4}W@_EApXivHG|GU;XuHe+Ee@BGRP)Q}%Q@*C-;YeOfLlIu;miA2$dUbv1Hw>TUMY zfuu%yiKRrtsH`w<{(8xAr0B_N^;ARhK67=??-ZA#zG!rj%{!^0rLPpZCDMC=@GTF$ z@`6;Uo0B=@HwD8|Le!fs8|uy86k3(Ha%z1lwP=u>H+a)!nTx$CjxxXCO_w>BcvBoX zOT6ha=TdKqBj-YIy3D!Eo8rjnv;8P@-ZDteo4n~}PRIPm$GhXAdd#B-lxz>9Wy!vs zJN4BVq|kP*ncp);NJiea5N9K-W-i!HR-mslpFkPo#hl`SPAE7%T3t%26Rcc8f#yWCk^2CW z(tn2=M*p9VC9_Sy%EN?=qfay*!en)gI3g?s%ZHR5 z_;XhA&V}z#FS~$t&4?o9*|m@EjJ%_~f~HXPWI&=3{dG$-F*6rf#)zGnJ?w;{+?nZ3 zmX5KjhKdiji~iK}AgoPA5lY52pI(=Z5~4!}x*8mo13NJkSAd+lxjL+-=WK*aLAc^qO1 zwnqkCa0s>>#K=k!hQ+CAshy8onCu)g0l&eRx%8AO5SF65ZwD)>kesC&REf-8{VLwU zOAH^PVC$}U2NjJ~Qhwc~q`E}NC8+$mMoDGLHJy0*4UQaCM4R#()<~)%QQ|71%3^zF z)htwC0;>w!XDM-zfs~Z1Q}CjD>O9;WRwXYqAH}A1SG!pwcGJxA2&OiN&6(X{J8)KS zYdkz9uz3U~R!5BZ&&3-fd@97_3hn3VjS3 z*m=zpu)*dZkX|MgRu|pdb@Z-4clqg8Sr*;)eP6N^>{xs#!Ss*)q_e;#NdVJ zaVgv+EY#m3zfZ*S+f@#Bw9PjpcGk+UZO_aZDzA;ng0dWuhJs_@N{;nB$3r&02dwPJ zYSaO#5R4gar@MFF2f2=rB!kWN)UyeqPER(dXBp(v3gCbZf}(S?9CX4Wl`P4eEBXaJ zDTx_^L~!v01X+?fa^Q~**=IV&D2s``*W%U#Z2Pr!Ac;=K+=F$kfbEhGGi`gT7nZ`i zZzp0LMDM=67@wZ?iWW-6dv1&9V~6;VlX;rgi-mXhi!_K-oc333ysPCJKn5)yi*HSx z391!N!(jXrOS6o5c{m}lAx?K;uB@bBIgM0f_L3PjFcKsK=(cgi>8QZ zHsR)dWr3tgg(&p`++2r+rLhu7NzqNqA>3X>G<55D4!5VMJY_sP_{#D+wh_s4Mv`o~ z7HUCL`k)shNJ_s-NdG4?N~5rsCG0FgR+()9=CM?{jxvyiNW^qkR${*Sc)u!)3k~Xp z4r)=>OO4>Fqjva1;z|06_c087Xes;@l(pOeX^$3h_gyhJdDpIGgpcFIDs>skcl6k(*KD@%sS(T}RBhjX^P_e)@aWGyYym_c-cRJmKyjIbgcdXJD zcIJ9T; zaC<%6Lex3lm_ahjs>9=+sEuP-w3T60bvsl?K(Ro3!pNM1Uwu)UUbQam!vP=2aY8UZ zk!U=zqTw|ebM0gEv^I=9LtG42`~1k!(?RnwSMw432@{NKTb~gWG!Ai7h;!P{QSwtc zNLJBB(2EBeoy`~f>G@&{69kx~7K)6>$1@&7Pq>iYl-f-=jD+7e(r+@OVC;EP1W$an z{Jl&Kw|{_dDZ2SS1k)p%U^ar0#DQiF9b$24Ild{)>>VN!Me_0|B?6UA$Srm#Tn3Tv zoc?MaMk-7h`dEM`4hXc5?>L_C6NA9i`dX zFbj$75q&I7$=+#A4Q6b5FEXNpo{rH}-5zHuY8ogCHvcEuqRm}+6Pif#I9OlRhR1G! zbhXKvgtrbm2AgT~o-%b6ohb^IE>9!N4l%>!t)nY)(4Z5jk%P*S@ep4iK2?^Anxdsw zB*LkzH{<<`G^wFtTFsZ*Q+^TV4kj88<~BTHs{;E5(obQ@OfsARHD=q%r0HmnW=8rO z$YE1aC8f8zAtPN42s2SEvc*P|FEVr9~H;@k{PHSFKa3?wKrV>Ubui>fU(7@NtGSnV&e(L#@5 z1L@0U^8Xy?cnE8Ks>0y&Eo=U^h;yl@B~ip-E(e?2fg*d;ea$0^6?%fr+u>-^`3g+u zi&xk+M|EWpdjek4!I<1zS|EGqy4ju0NMGZIY);vA%XefXaX(gI@8ZoYC)lzZzn$8X z*{`&rp_@Ik!OrD0qr2r4+k_4qX4Tx?zU;;tZ2k<4;%!p2f@qiIYK5WEw?VXXqLtZ(AN(YY~GI z@h-j|`&HQPI^p|RG((ju5qt5~(Jy)Tv4}e5p|e!TjW>GATIUpSZjN}KKt^a&@WX-kI#N-IV71Ul7|+5IG>&(qqnAkP5YsS|Z7 z1A$=k{g4M=?i_)w!t>J;V63KroM1DZ`Nm@a7>^*hrbhvG4>Y%tS;?y%=2vD_15NLm zteej?;`5-JPx|}lBW%(Zq=(z-t}RlITTlyG$1PI8(Kv$$cRHCk2+a^P)n;}YR7abBs`&XM?w5~eH^4>ZA z+2HA&g{*2CSVb>gR}Km9gwk~P8e8y1iZ%M*<$5l<2y0y3o&{v{=>;72FYJo+;_tO` zJPACmEAsnQc)B%&r(##)sn`p#igJ5bq;GszBwf}O`2*-O)m@RdK=B8F@)ia?$B|gA5+PjT{wo_{eLsA}_@Y?caEU z>BWrrEv7d|ajbeo0~!29Y&p>?-$?C2ULOymTnYW?P#14J{Y196;kcrzeGwHKUn8y*Mw5k*d~X9>2Pjap4K zzKL@W8_`@T-KPym3FN#2oj`o6p0ZDFQ)21B@OEipU2Ga$3u4o@O9E6fygrPtuGY?$ z%W@ljmA=-DC}a&wmOy-~;AHNN`WLDZ)-6lX$B{+u_4%0#+QG{9rcx*PraanZFd5ZZ z8#Y89L+rQ@ZbKp+stsjTjulTK_`a$OXI96izwNO!7EdW6I27wA8TaDmt~TyuIQ>%W z;YL1GV%D1oD|GWJYL}Nlx=uy$KUPS+m|Nh#*g+MTQEM>vMOoO39?_w8C#b#ksjp4) z*Fg+!YYN`b)ZemfXRj;rAr1h4U}Q?VA}5UurdCToAcdp!3=G;aMWvHGRGb3fLlL$< zq$Kg}WTNrp@P_^P{ek%XL89@4yoR488b2IO5#%HBoYO}X6+W_Fbr_;83sDl@QA1XD z$JznESo@x!B;C{^k<_L2ee5wV{UAvp4pQKWnc?t_*p$rTMB{)F!}tQLIv8(uCz9ez z=JN{ay;CBST$Du;M>I6^_C9SQyVM>he_^AyXA+?qN7F=|n}_@gnc!9m4Y@i>SqfIl zu+@MjvUB0vWFc`rObpDXfy&WFc9A`@ZwnCzbQ0(Y-ZL^2>3N6P7~FHoCQF4q?ag%9 z?mbb1?-51AVdW@XQSckI(*Yl=>Ei!86BB{F;N6d4z}?!3|NrzC(8Kts*GX1{^YLes zv~WDk`siFe1XoLeX2i&HAU)V}I>Li$0JctGLk(w?Zc`m`ir&UXG_)s3GBJOrXOPUI zZH``qKQrg1R=l&6Pw#o7@`G7u@aUtPvqIz{YtND9bTQ(UZDTwcUt*-ENzA8vw)n}@ znKz-5d{1b}D2CcZh@pEbiJQYQEvwV2iLQT8b~oRsr=#-KT=|z!%AsR4kS-C9pz9P( zOJ|dd-r;BZOg1V^rOg`2elA8)dHu(6Ud~f{{H+Mtw9S;O64d?-MH%n^b>gOijk0#S z!m{ROrX2>vAp8@)MH5Ethm*?*x<~#(LRu<|ija~Y zy!$k4Ryae7I9z1CdQ)f_c6%pmf#T?;FCip_^@n;S6^OJ{QmvuAVKU1xCA`{njN~mcr^&OtOX8*gzy)a(d~`8*pxe>IMIa zNvR#?(*IyC*GT&m3;WRBH(p38>cZp-!}<8?h!=K^FsgI(RF4Q=bk9~IP1t30^gE$Q z?l^e8^>!R3IX2;@x}&DvBE0$pZ*(k*&ya@25iW74>-5bbS&QeQKU<>ovRi+KmNth_ zvNtE*&6B%rE2~>w26S#X%^($?~OhEU(Q+l=%C6Xfv zZ$zeEWz2M`*(D7{o&VpQg#leJWVKqiaKe!}!M5k+;WoTAAkb62x38eHFSla`>M!{4 zzDavqyWyIcg^4PWj*G@W+EGa*x#=e;gAA2^M~|^cK>w2?@|ljpocvB7Oua&f_Hb^O zZbJvFge%+sS9#nO`o+GQt_?awF3ryj+vV)CS{nz%d7G8bKo`UK%91UOp*grhOO}^T zs0>9*i$n8j$~Ug53N6?etE#JuZ;FL(y3r&VGX4DdDubK5vD~}udl6G z7pjfNHpOG1iFH-=Rk2Gp)o!k;tF5k{G$mA5wPxb9Ewg4#x*FE=v8QkO#kCu`eY2Kd zwXuBl`YKC+&9!ywWceGt#hZ3B1z#Ku!_ZX_eo<9@e0?l*b*MDFcrk>;CG^zN%?~dq z@zTvJo)=nNQCGfU_4>6N*OV=emB-@s;7W>{c3ZMM1SeWKVzD5tiiM)Z3m43oIxQ43 zxyf=@_|i?EI@2PP{CGXk_t5;cbyZZ})z^gP#p~)&rJ;H$#)N4zwhWekMyTBB2-T9G zt$?a_RCB0!*#fe=eS{NXhbn3}HViFaf+W)v?L0!#@>DT`}2Zw%E}l$#DV6gg+km==oF zhGx#387kjc85)d%@{5&Zlo9i5>nf^3vsMdx*gA={=`%vBiSsOcxRa)7lZe_s(@k}2 zL-UHwl9>HWIqGU5hcr3KV;3k}eRKwVblKXs;O5@op$Nvaq(;V z*QU>!I&J186P4WQR25x;I~Ey%Ero&eMh-97g~3M%7>!-&nl>J{@TkJ=IrB~%7H!JS zy=XkB%=986z_kJ+HH#*9SuPP!{#E#+>jb7RcKYkXRCMONQez{dhj(k^5@Ck|7WJ()9p+Dj9OW7f|UJ%k&>P z(tl{B(`qeUa~=GzviMiZ^pRYL+~Gn2vQe{4Z*in2taMQ>=w2tMu;hDrgpzN+%)io6 z{&K7Q<1&2)eOmc1wdBvEa&cWrHQl`_{ zQj34i0#QH+P_s<`Esfz-`BcZx7YZ7((QZkT!^_AyX{C3|^u>9MNA8VzL_qobWcnTW zZk3S}xAGT|ZnzfFP05h6&`O^u)9KAHc6zOq9+l~|HEXAT&q}Y6>GXJ(oj%`6Ps;S+ z4*7E|`FG3o#~khGXQCa2z_MGW2RZ*61bafX7nw89c$?;ro-5a&RPU8*$iiGnx!~k? z66rWGykMLiR;o4M3D}IW_)13@39q=^#6{nPulGp2b*_nvJ_TPNlz7dpCN5$v zzV4RzviT-1`Ure|6u6%qej(`}sx#?DJjB;uOMF(TiHp7jU;j8LMXU!N1nwv2`I7!dY9P2oT*v1miI;2;up#;be4Qcj^Q1qB zI1c<84S(vhNS-@oLlkit^tVdV-+)m6d>%K#HwVN&`+^G6z0&miKuEu>4?`n8IpY9l6V78{bqsDwP_ zYhy-iOI>^;Y3&ud)DW}m>%IWHSY$JVSan-!rkB;%l#>pQlkp}ekaEmRV< zvwU%F98)7>O;xO{VQnQ6s%t5sxTWos*p#Wl5?$pn~t8`qZ>FPg8+ zL@q>?glXCOsyY`6rd72fTa}$svB`-DJ<4ceTXxf;GR%I<$V-I7s<;U^Ht;eF;{!at zMc00jY8Y<(4;s7>?Vc_-{goP=;;5oO6<<`jH23hs#R*X)5Pwdu#g`afsnI;(xmqRZ~ z=6q0$y;dO)U9T{DF3%V_6m-iohvA%mJ;S;D zI~dOG{6mKG`g)Y%T;Kf?SMuL)if=r}=(+rFGMvlvSB7)`=g7(?eYswbF`V1^4Tf|2 zb7_2!i};*@KUFV94Cns8p5dJS#~S<)!#SS;hI2ljl|yc~UOfyylgarJ!?|9Q=m#$1 zGa7$NuN4gE^xH@{T&li$%%8>%i4z}QUwatN`J7-leO2XtC~^9rs!;K(fSd`JoBw?b zr{_EspZ6Hf%e{-72AASrD&yKWB<|+_IKw%gK8ADoKXUO`adQMU5?pTnvl-6iKgRI0 zkWc9~z;G_lX=HR<#GlT>D*8(q&iO24IOlUZH6C2VhvVxR&h@>Y;oLuKs8Qh}KAiqL z4CnNR7|zT6ED_-%KAiq$hI9IR7|!*5jNzRAs0JTLjR%*z+%IVG%^Lh4HTcUK{8Va$ zvfMHFRP}f=XSV@en@&= zFOM>u*UN7h&i!))8By}#_-qZnR)eo5Wh5V7Zk@zcJnWJ2@T-iT$Mc^uobx%V!QXW8 zACUa}89nEJD=iTD$hlpE?_xNw-?tdf?RN24n?I2#e<)@+eN}i3!#SUX#FgDb+5Rs5f0IOqQ%!!Ka;Q|JdSDvry4JHt8uyBN;-Kf`d&=l2Zfe1?w`#fow{ zpK%g*+hG!;=XO}YaL#`N!#V#SFq}kFc00&$F8@h}b3UIB+46J0U8BM8(cmeD^M36O zhI9TGTxf`k>WkwyXz-&9=kgolZ9W_y&u~&*+2>~r=W+E2!?`@~Yw*xTcDbB>z6M{f z!FMy9+pSxJ_i6Bgi*0#0pNSegs=<>Qe76SgV0ehx`4GdY>XiMDGMvYyK8BOY75%6Q z_<<`2f85URGo06B=n_Hhp`Wk8*K6=^Yw&gr{)z_A`>ek_lQnp$27hvr&4=sziU$8H z!>Q|2_FOXApHEza->1Q!(BOv|&ddEX!@2xtea>H=s0P1-;ioXY_A{LGf0f}}p7%BQ zXQtTlaQbN){APypa@R4Onyj+_PZ)kG!=Gh1_w#o&_?eg5a&kVGYw+(foZD@W27g|I z|Az)Yb*e27=RZ+{M>P0q4gO6H{?8h`TZ6x$!E-M2mw%iF4{Pu*F`UP@uQHrMo$`k^ zhI6~U#&8OCivA?SIsL?Gw)~v_9~sX5>YxT6G2Q0F>8ES(o*Dl1qb~Qyuh8JPY4AfD z{7)MEjG1=1yj{#ejYw(|H@E#5R7Y(j9 z?x^47@;6>-%g^=w9>cj_zhpSq>-P-j^to5r{CPhwgxX_I4?KBaL(sJ4gM&@ zCqe|}|G#B8=YRg^Z8^C;moc2vH!z&bbDsu(LW3XE;2$!amwUlnTTWhXF~d3iGKOkZ<6$PXy`XzL)^UM-X}EpUWW5_^e)4> z{Gn_8`Il($O$k9^Lk&x zaNaIr8vJVv=YI77!#SVb4CnOS4CnNH8hpe&TQ5#OS%cr8!M~)zzshjl-v5c=+-|>M zIM-`ju`TBqRxejD{7i-~V>qv`%^EyEV)N(njAuBPXD-7z|0KgXp9dJuc7}8MV+`l?e_}YNKjRCwUYvdk!#RBk!#RC5!#VwShI9G{8P4fD8P4hd zjp3aBeTH-TP>HPw8#( z&%Mbmm)GxVhI2ki4gNC?enf+xT56Ze`OjcDAGhpbIJa|};hazKW`F)yXz&#pe47UU zi3WdGgTJG}&spRz=d~KVN`vpv;Qy+@U((?rKZD`ipTETLGmusJZ8O8U zpFhBGUcbMSxN7g}oY|XnqKZoI~8P4P6y$t8}d6?n6eZ8!~N35{rln`Izt3=9k3ZMoFKh4< z4Cne5+-}Ry`HyD!bdV_jnapr5=W>awxH=-&D^SGL1IQNI|y7*io`8>qvIiCXz z=Y0OC!8fn6_2u&aC&RfN!sRwS=Rc;x#yS1%4CnOsRr}Nbj^UjCp*1%B4187g{|&=A zeW1ps=lItd&gFbZgD+p}&u5dwRsBX~z1+d*dA&Tya4ye54gOaRKKV=j@?0lzCC?Tq zPYI*v^3*Y$%ku*beo%v-)Zi1=`OA5=#Fd=8rJUC@dM;-T!!HL*Rqx+tIG2B~2Jh40 zdFxF%PsIn#cY38fqa;rK7nf%?!+E)DH260)_#O>@Na9MKP@XB@QAW?@Il*uqKTk58 zx9h1JOn&b9+O-Vle0ntan+)gt-)A`I6WwT+%lp%US`%0Lu9EtmA#u0;XSnFUD(UBH z=vOkFxA#_t^LjkYa8CcK#Fd=imF1=xeGsZB|NP7*TVKxqDv2vT>Uo1Oqvw3qFr4#g zaPc`L5r%UC)pUm*B4Cn3oF@|5o=tFU{Tvd-X6m)TwNSxaH>G)IasG8xYF#K+Y zPh{Mt|x(7nLqty%(d|g{$`_{K$o?_fT}ZaP|I$J{PXuk5E7c z!=>a=?}?b`!qs~sqApy$Poc(ztM^|dUATIW#%>p`-m}o{!qs~d`dqkrA4GvPu99E9 z4`QMVSMOO+=U)`PdhbJxi(b8FA?d=^dlvr1g{$`_9CG36JqvHSaP^*uk#b%|$@Hh* zvoOVltM{9fxN!BJj`c2Fy?@~wE?m8T;a^<1djG;97p~sFU`(ywx&bft!e^|`{H#&m z>hL0isj;dpF=J|Fd92)+y1KsJm@3e^S`(?L-LL^KpEIUztc_Joz5d3fmx`AXNUExu zvTD30uZkS;Z@fatPp&e|#ivOAzDKrCl`P##{S<4mdH7XiA@a+&&Ch{3<|oB%%3EOm z6wlVtR~q{eF3m`gxL$CTt8jPu6l00!C(VB)@)A$!Zun+i$7J~fGF~ZM$*+D-#}_~S z2M(DO1yW$uZ>juaB!g@4NhCD(PdfIXzH_?wWqyv)cQ@^A5_9Ws zY&UcExeTl1H&YGc7JTv3-+0cX=#h*`{}K38`IY`8kEd*4eXY3RQvKjaeD}*wm`g;; fW-R|Z@nQVP#oVnw%@O?a_w<wDfY<|Vqb`O&)7i1Yzw5(Bt|DfyDl5<>NDY&?4%j})PrHxrHY46!bxKT9M|n; z6OgIzMSM@cludYV=#Q{G%`Ux5?a0P(e>$Xo*G%bRMNkUwn?@aDlkiqTrE#_5>FkF^ zxkby^K-K)7B~koyqgj;iuefDA}4B8m7?kZg88EVoHuFq*bw)QsNJuzciY^DJ2I3 zeLtnhJSyD!f!MchluzJvip{7=S7xO9DYmjvtf5C9-QPK?7rVbVJw45r0yFd7V9}>8 z`qV?(f)ei@^DEiL0s+&)C)PZ3fgtDw#XpXF6Y@T7lUeEn3&@jr{{!#Ope^@U!ojfU z51Sw*&%=h`Sl-WLikkdfwhT7sx9in$16FZ`i^j<3PF++_!{%v@D;jYz9_@$lL zt{gTL6!MA7Q+5@*KcRT!U;sBdAV;SxJyG~->UQeh>3lm^twE2WjYNW7RSWyMYus&LdbP+YTBKF z(ub}t)opT($it@%w-WdhC-?XcEb^d>#aj4(cA$*NDh@%Q`o(i<0lh|C2UYQJSJSCI zR4PnXW4wUYUnWR!TXBRcd{jKoNJ|uid&N1XVDt!&PTF3Q!&L9rORgDpf*v+IHb5xV z;O(;inz1inuRT{hbcOOAmZt*s`NGZjVUuGEtAO(ks~-P)K*W*Fg5JB13%We|B*qQ& zaU3yZ&U_;V`bLWUiYKUasov45%es;!rIn@Si>usQ-EAFi`(ArhX?bO-y`sp<32Q~U zy{f#bd>N({yhF=Qu<|=P6rE}5-MVK}6ZD_z%!wx9X;cl-VTKo@-I?L<>*39s-C`^K zk(p7x3|X~H#FdZez6vkY+Ox_Y(G}}4IJEDa@9nQG*RdOL^DAFVdb^ym2*OHOR(FBj zfq&Kgf?440`aQPaF4P#F48`kMQKrCzuuao5usau83{k5Uno`hVKV%hwcBjOi2amHX z=|QDNmVw{7T3T8mGyNPA*Kr^DBECb(loUKdpc!!^*bzH9zQHx8 zxE$g*$uSfBXyf3xmZO_vH`tma_8Tq-3GLSxQUBTm;@{4LC+ID303%cqTGlOo=o>#h z7etVK^$Bb*vFs!`nW0xQAmeM<2&)gqDAnKFmmBZ2qZW-zu>Zj;lC! zKr?ENaqQ#xXO82*P@e>oh{YUNa@@u72*(E;vC|iMr-&=y3}PF{pTQcG`#F1=<84Aq z5-lHIv>Wl0EC%N`i9HKrh#R0Cv4?Bk<9Lzd$DEzwY$dSm68i?&5nBi?uQ_;N9@&m! ztm_NVj5Z%~EP$hESs(p$XV458*yxP9D5el zAbUBEjeiR_iDf!CgE)`SQdWh|cu|&k%NmHFO#@`SM4b|@C-m08G^Mk|PONbBOeJT! zBe14LnmNI&q{1u4J`V?wjh%u`vseq9K{j@J{%RI`10pSw?m?yZiu zn7y`L)r?iahSqBKJ{)bW!+)~ITI(`|9hzZ!G@Kc1Z4&gi&1LB@*0vCqw$05rU8~tN X8ntICG`E!{o0e<8R_Wl{&M*B3+K#JV delta 3530 zcmc&$eNa@_6@T~bE-bL{_|oTsCd-#VtiWbLbg~9E;Z2^7aU`0SOhmv$tT9rVurd9> zz@QF0nT(;QP3&YQ4UN-D+Zijf3@T%B*UT)&I+;+^(pK@&v<@l(F??*>OzAoI?c#!Q z`bYohoq4}|-uaz-&bjBEdw1K1S@1f0Cr^H3uP{H#xl}GB2=N_dGwO``mNL{Ejmo|% z1l7|&N(Sx9tkk2-NIjnu?-}TgT5N$dnuO_SXcSXn#*hpju@e?t=WEm0VV`v91e`Ec zK&QB$%|No@7~*dXYuSwVZ-%#7mTs4L*w>Vb?k*qlecwXi!bwmF?@vr3W3%vHRB^}O z(^E9$HP!TF9Hpv^(i_CDS{D8G^HW^j9=*auThicQbow`HSG=k98WwM+UAcjaMg!$b z1PnUm+~!_}^R#n=I}zs@=gV$0CF87b+St;3+Gi!Plt0^SD@c0Fx z__c9q=;()W`Icef&X1&?=ZAR(PR3=Jbm{86^mSauw}vr?c4fGwdDtKw`N7=W9B&GY z%zJ}{W|7a{4VL4naL<-yQT?OXCD`x=&v|b~hQi{fSU{P^X9k~HcrEj%X1`|65wKd2 zkmX^0a4hSC`zmL4CM$)S?8X@M;tv|zGzkW?pUYRe)nigmg$et}r%J!YZugv5J)f(7 z&7|hjB&rNM(A^E2bMlryXuZexE>U+2+^<23BHWvEO3$7fZdHn}lng>m&HB%2mwwsy~RQ66-EuUGT``Ewu&Bb*D>17a7@wq9I=y>I++b8eRi+^VajX-eq#s zyYoTf3fAi~2ET$|(&MKr*hNgrvrQRYkT{c$Jcf;fVMpuRf^+U9ly27__PNdV{mRvo z#ye4b76MxzzCHHexA*_uo!YMqVTlCVn{>*TLuU@J;~~|*YbcSnE>)cJsZ1FP8wfr@ zSWn=#VS&+ZR8)IEna;8FVvQP{xjjsv*{P;uX}hL=dg#jfK|)Zfe4mDg;@>k)iN7_x@y@jhKfQtEXY4XPc;dzO@|I# zyN2T)j(r@ja}07!fQ%h7%jMVyl_+258044$U7RKS3`P)d5n7F_FbodLB(he^A*n`Y z70`&d3tWgtIKIan|T- z@8_1+IL;DUld08kEdEjssC-#wn_vWSC$u7Va7{PID;#eUYh{l69_XJ|xVzRv(k_`* zfeZ09LMudAQi5U2PoWWQu5m1cPPE)ueBWne|J1?&S~iglUL>quwmv}(jf3*1J1gvS zGuV+m7QvQAuzgU6?DYt?AcFmhSY`n~Vh*8o-5R8EP?ShZ1t!sEGi2`o diff --git a/driver/lib/ite6664.o_shipped b/driver/lib/ite6664.o_shipped index ed2eb9488e90b7cf2c692a332fdc0fd5423b5c92..77dc89a8b9e84684c77715b6d2eb4b6a9bbb199f 100644 GIT binary patch delta 5047 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 BTaf?& diff --git a/driver/lib/ite6805.o_shipped b/driver/lib/ite6805.o_shipped index b8d4970723db89b8868aefbcdce36ae87db3e81b..28e4c27d5563eaf3fd862ed2a93543268646b534 100644 GIT binary patch literal 28000 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 Ye`fyJCi(Ioxf&D@K7pM^1T+8t0n)>RB>(^b literal 29752 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 diff --git a/driver/lib/ite6805_EDID.o_shipped b/driver/lib/ite6805_EDID.o_shipped index dcaf48dba409524def6d160110afc2818d794566..986ffe0b8de3f1b204f0cb29109e5ef6dd6e3956 100644 GIT binary patch delta 278 zcmZ2sw83bChWG|i1~_m4vm6-s7`QjuALeBAnas?k$jZsi-pn~!lS_GW0GB=+NXcQQ z$%&i`u}QOnr6(`swwQc_n@`+fCz-Q0zxqWMa9h-%_cL72v43PuENMS`JlKx zqrhZF346gEP_+{fY9+)czmSk%^q9;jsXkdigky4ngn-}+9*6=5CJ4M zK@S12#S90SAvE{oNU`^V93l|j3JApj6csmT)S5g|+?QFs Jw8nwgNWQzkK)q$Ayinu!|L#MHLQD5uo2|b|zv=Oe|(?K~G|96x$O#ladw9_5e%&Cmvi$|Bva8a}3^|)-ci8vv%10o6-@S zO>4;9Q+kz!_!_t?zHG}o2j2Qvp)QuDy1P}tB?dI38QH4oTB z;pkweZG^F5*lS;ugqPZlYhdo_$C5+tHsQzxusgD*gt2T%i=8L$uz=06eB6#V{(r}8 zxaOEXUT0X97bo6rxNLyDRCWs9%WH{IE{l5~6y?7bIrxkIprIhcFyUtK^@4_IZAFu` zyC!Izdml^IZf`H1`>68hyjK{T2Nxf37+M|-W)_t*yev)g?JNz?sd3kW;*6>01d}n! zfSr^UJY4K&*@dE8;$ewbqIJpA=BTJ4ShsL>QULGMi1!V{BvTCZ72g9*wb8+^7yg~G zEC?;mV8>u^aSclVPpKq-lc7xP7O#kH6;3r#V8TW4mr4$+tYo8jVQjlp_37ElG0g+R zb~S$pepfnMzByA-|ET;3r&aX?h-H#oRiLC(P0H^LRs9-VsDAo@lBH9@a5|36=QACA zWlNYJJ}R4G$tx7f%PZ@vE6U4l1@=5=@M_r)adK^<(vwd$9sh3LR$3ddHIn>>PEFOR zA#kjb*tf(O@M1iRxSCV0NQ%@Hb-ijJgwEYCjNHp9f2DIy(>cEZ>qC-!NvGbcQzw82 z)fvf=QTXN1X8s!ZACg!P@f37pe2&NREh*yXg*CqfgXl>Hajhh~)GNnVLtiruT&R{# zj#SW}*9P#dmDmf!4o>-y&Z!^kB&pwzqYA**No)!+pSTP{n5h6S@+Xu5ir=C5W3I|Y z_uPF}TVWV``H5{{T`#dNiVuPZ<9|_X0sneQPM;d7kb|MNGWnz~(W(4)(A0Vu#5#M4 zxY`(>AYLFwf$w2{E}VtLmBcN?CQkWH^(o@3%`c`_c|WiXlKlBN>Yu@}LBjWk7rBvG z5A7Jg%qhR0iG{F@t$B<*r^$bdVhM(^mldp!@M=7MocJv9Map+l+zZ|4`5W=yl$i|T zqY|4>Tn8?UYltnx0I{DKh5)Lm(1$D_J_u~1#43r6#C^nW;_rz={Le4`|2O2*XGTLdZoFZ{(CKb0f3W z--nIld6oR{QhbznhIoyb2;GlKtQZE7>p5lbjJsERhSWBls(+TdsKR05Y2syKJOsQF zn+ko%pAtKWf1vzXaBP;?2vGzt#yP~9(2ns+;${e8{5)|#@i^sg6Y)N*;7^Jl`4V`L zZ&Lgr@eAUZ8r2GLUo;^Pu~kN5@g0=O^}3qIsbPI;L`4fq`jk%9ulXxn zWq40MA+c*j8+b8Z1r8(-zog7%iu0iT2}v$jzf%0^)353W5W-$Zh+lHbXLL^fNmDwVy1f3KImM||8vAy# zLm!U2W*l`3slOgaJF+qx$+d>Jd^0$5D;o z*(S03z>jou%9ZMlWbBzXklLZDeEs=OO>09ih!x^M{4w8Aa6Shv7%*dWlLu zeo9st+%Cz})ekxDw5V}~|6K&JI_x|b?F`>o2a8Rpi`Hgpx^#y1r=zByXh zTbsl7!*{ifVrG@%w5V0h@U*W+v~O3k>RUuG!*$;r<^)IG97AP^QmrnBZH0I17UVvr znh&TaWyZez*^Nv~n+TpA(nO2;Z*?>HYBTs|9Qtc5Fi;#V9$%>VV$_$01?KLU L%}&C$9ohc{^3cT4 delta 3890 zcmZ{m4^R~M702%#SB^h{z2%R~N+Mz*5Up?v2&gDvgpfp%pkmOP;KfKV6p(*2+NSD7 zlZZ|%_%b1rOj1ZXu{CY==31iDN#JU&CQX~1oi@hIwBWP}(uwA@Q7lIKesA}<4S}7x z&%J%$@9+J7zun*N{?2_4AAJs8nMqyEmdT@pqY{g3aaho$CZIFjhACl*p2pSTZ~zCx zQ=kTi!f(%58e_3k94H%;`giw$#ZuHO?aiE$>XY^+;&<(*6CAPWF^b zJ?$Noo;iWX2XhSBMh z`pd3L{nY{RiP=|dK3n1beJ@?Gy3SP(MM-a${Ws{kB3#}h-y4E>-al`{*@V<0CFKh0SiMYF4TiSC8Pf(5xRm`~lgv+!c>PIIa` zFU2}B?(NFkZVO&j8i2m4y-ADjgoNPYcG1KqmDNjr0#Jw-mTI=n_xDwM6N_pg!dP?p z*j1G5?O7HJF}rpaFHe~x#oEKetl)iTxf@anvKD1I7v^?6*3s17q3zTPvz&Q%&E>3E z)VQVOIq3{NN0!o9$FtVEW5UBuddEwuAa2ZNN|x;j3%i7mu2?O-LF+T*ea$PQn|0){VFtA!t560>3McH)v-JH;mpJM771^$3l z#Lt+~=%(1otY+4sXN{t^#)m4*F;#dDhspmk^KU4xRn%dVbGFGDz*15pjO!~#BAe8O z*s@lk$F`4nLQwr!A(;;06peyo9$^n4R4XuBP*qgn)14XgA9Sunjnw317P*dDtw0x5 z*ofW4PG&E20DYACE60~P4#U)S3ZyXenUz?zPEqTO)gVSFCLQeehr*-2ID>kGE4(Wz zKrs#z8&G~&fxUw2!8<~u%{0|K%6!oo?>BsgStLIIs`OYrGs`U!gGPk3f;%??q z^iX_;<4;%xlsAZbN>tNQr|)YSd!AtKX6ODHoNut_B>Ji5znQlXWh*TOLv15$2DukK$hR6HhTmnKZ{o#p)8=#N3T8ieDF02k)GI zUPJ7$VpXjI$><}09UKdmo=Z7kr??oy4slo>4;|MMVe$4Sf)F?j8@gVaP<`qHJ zv0(aYspz9tJDI(L>R)DXUcl7H6u7}mz$%ItFtgE3aTRk5dMMtAH`O5*DH{Y z0g4xMypiK=9KXY{pW_kc1alU8>J|0<#d_CbzG4RyJT~Aksk@fw=VBJ(aSwheUT5|6 z4C*MWlCj&E+BO?owu-ea*o=KdH^*A8om$jk(e2UtOa-#y{cvs_L zkkQ{rH`v%N3>i)_P4UY>XbNrd=8E!k1l3{GNDXe#Hce3n&_!yd@v`WhqE28psllz^ z&=mD4^pV7w6gE|5#^)g9+j_5WBb-IfhUv1MB^(L+3j zfo;3wqy}Ag7!_mD-O?;)HtJd9DYe8Rv=+d8^sk7=Rjq0CDs5>krjLfFwOFn(yvK|Y nlebO5nzkf)aD`qaLTt0?kkH+hO&@blTLvbzB|!vgZ5jUu6{My* diff --git a/driver/lib/ite6805_drv.o_shipped b/driver/lib/ite6805_drv.o_shipped index bd16efd2798a4140b2c12fa32981ba45d8b8e521..a7e20d9e437a24e1f321f7d2b1f90fb926428510 100644 GIT binary patch delta 15101 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 Tmv+a_l&_H018%gtxa|J{h^>@T delta 16106 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 IJW(Y6FBfvSS*k)xEu? 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 JX+}VT{|^>> #include #include +#include #include "cxt_mgr.h" #include "mem_model.h" #include "debug.h" @@ -414,12 +415,20 @@ void mem_model_release_pool(mem_model_pool_handle_t pool_handle) void *mem_model_new(unsigned int size) { - return vmalloc(size); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,12,0) + return kvzalloc(size, GFP_KERNEL); +#else + return kmalloc(size, GFP_KERNEL|__GFP_NORETRY); +#endif } void mem_model_delete(void *buf) { - if (buf) vfree(buf); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,12,0) + if (buf) kvfree(buf); +#else + if (buf) kfree(buf); +#endif } static void *mem_model_alloc(void) diff --git a/driver/utils/misc/g_queue.c b/driver/utils/misc/g_queue.c index 7363fe4..423cff5 100644 --- a/driver/utils/misc/g_queue.c +++ b/driver/utils/misc/g_queue.c @@ -13,6 +13,49 @@ #include "g_queue.h" #include "debug.h" +void init_queue(queue_t *item) + { + item->next= item; + item->prev = item; + } + +int queue_empty(queue_t *head) +{ + return (head->next == head); +} + +void __queue_add(queue_t *new,queue_t *prev,queue_t *next) +{ + next->prev = new; + new->next = next; + new->prev = prev; + prev->next= new; + } + + void queue_add_tail(queue_t *new, queue_t *head) + { + __queue_add(new, head->prev, head); + } + + void __queue_del(queue_t * prev, queue_t * next) + { + next->prev = prev; + prev->next= next; + } + +void __queue_del_entry(queue_t *entry) +{ + __queue_del(entry->prev, entry->next); +} + +void queue_del(queue_t *entry) +{ + __queue_del(entry->prev, entry->next); + entry->next = entry; + entry->prev = entry; +} + + void init_g_queue(g_queue_t *head) { init_queue(&head->queue); diff --git a/driver/utils/misc/include/queue.h b/driver/utils/misc/include/queue.h index cdff90e..e765862 100644 --- a/driver/utils/misc/include/queue.h +++ b/driver/utils/misc/include/queue.h @@ -56,47 +56,13 @@ typedef struct queue_item_s { -static inline void init_queue(queue_t *item) - { - item->next= item; - item->prev = item; - } - -static inline int queue_empty(queue_t *head) -{ - return (head->next == head); -} - -static inline void __queue_add(queue_t *new,queue_t *prev,queue_t *next) -{ - next->prev = new; - new->next = next; - new->prev = prev; - prev->next= new; - } - - static inline void queue_add_tail(queue_t *new, queue_t *head) - { - __queue_add(new, head->prev, head); - } - - static inline void __queue_del(queue_t * prev, queue_t * next) - { - next->prev = prev; - prev->next= next; - } - -static inline void __queue_del_entry(queue_t *entry) -{ - __queue_del(entry->prev, entry->next); -} - -static inline void queue_del(queue_t *entry) -{ - __queue_del(entry->prev, entry->next); - entry->next = entry; - entry->prev = entry; -} +void init_queue(queue_t *item); +int queue_empty(queue_t *head); +void __queue_add(queue_t *new,queue_t *prev,queue_t *next); +void queue_add_tail(queue_t *new, queue_t *head); +void __queue_del(queue_t * prev, queue_t * next); +void __queue_del_entry(queue_t *entry); +void queue_del(queue_t *entry); #ifdef __cplusplus diff --git a/driver/utils/v4l2/v4l2_model_device.c b/driver/utils/v4l2/v4l2_model_device.c index 8d8bad7..0c58d4c 100644 --- a/driver/utils/v4l2/v4l2_model_device.c +++ b/driver/utils/v4l2/v4l2_model_device.c @@ -180,7 +180,9 @@ v4l2_model_handle_t v4l2_model_init(cxt_mgr_handle_t cxt_mgr,v4l2_model_device_s context->pic_bmp_handle = cxt_manager_get_context(cxt_mgr, PCI_BMP_CXT_ID, 0); vdev = &context->vdev; +#if LINUX_VERSION_CODE > KERNEL_VERSION(4,18,0) vdev->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; +#endif vdev->release = video_device_release_empty; vdev->v4l2_dev = &context->v4l2_dev; vdev->vfl_dir = VFL_DIR_RX; diff --git a/driver/utils/v4l2/v4l2_model_ioctl.c b/driver/utils/v4l2/v4l2_model_ioctl.c index 260761b..3bb6afb 100644 --- a/driver/utils/v4l2/v4l2_model_ioctl.c +++ b/driver/utils/v4l2/v4l2_model_ioctl.c @@ -10,6 +10,7 @@ * ================================================================= */ #include "typedef.h" +#include #include #include #include @@ -71,9 +72,9 @@ enum v4l2_bchs_type { V4L2_BCHS_TYPE_SATURATION, }; -static struct v4l2_queryctrl g_cx511h_ctrls[] = +static struct v4l2_queryctrl g_gc573_ctrls[] = { - #if 0 + #if 1 { V4L2_CID_BRIGHTNESS, //id V4L2_CTRL_TYPE_INTEGER, //type @@ -148,15 +149,15 @@ static struct v4l2_queryctrl g_cx511h_ctrls[] = #endif }; -#define ARRAY_SIZE_OF_CTRL (sizeof(g_cx511h_ctrls)/sizeof(g_cx511h_ctrls[0])) +#define ARRAY_SIZE_OF_CTRL (sizeof(g_gc573_ctrls)/sizeof(g_gc573_ctrls[0])) static struct v4l2_queryctrl *find_ctrl(unsigned int id) { int i; //scan supported queryctrl table for( i=0; icard, v4l2m_context->device_info.card_name,sizeof(cap->card)); sprintf(cap->bus_info, "%s", dev_name(v4l2m_context->dev)); +#if LINUX_VERSION_CODE <= KERNEL_VERSION(4,18,0) if(v4l2m_context->device_info.capabilities) { - //cap->device_caps = v4l2_model_to_v4l2_caps(v4l2m_context->device_info.capabilities) ; + cap->device_caps = v4l2_model_to_v4l2_caps(v4l2m_context->device_info.capabilities) ; } +#else cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; +#endif cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS; } return 0; diff --git a/driver/utils/v4l2/v4l2_model_videobuf2.c b/driver/utils/v4l2/v4l2_model_videobuf2.c index d62832b..128f76b 100644 --- a/driver/utils/v4l2/v4l2_model_videobuf2.c +++ b/driver/utils/v4l2/v4l2_model_videobuf2.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include From 71da4ce19af8137d6873ffb79aaf5b7d1b1e7e36 Mon Sep 17 00:00:00 2001 From: cdorn Date: Sat, 20 Mar 2021 18:23:16 +0100 Subject: [PATCH 13/23] Changed kernel messages/debugging to use module name prefix --- driver/board/gc573/board_gpio.c | 2 +- driver/cxt_mgr.c | 8 +- driver/utils/alsa/alsa.c | 36 +++--- driver/utils/alsa/alsa_model.c | 38 +++--- driver/utils/gpio/gpio_model.c | 8 +- driver/utils/i2c/i2c_model.c | 13 +- driver/utils/mem/mem_model.c | 6 +- driver/utils/misc/g_queue.c | 2 + driver/utils/misc/sys.c | 11 +- driver/utils/pci/pci_model.c | 30 ++--- driver/utils/thread/task_model.c | 6 +- driver/utils/trace/debug.c | 20 ++- driver/utils/trace/include/debug.h | 23 ++-- driver/utils/trace/trace.c | 16 +-- driver/utils/v4l2/framegrabber.c | 67 +++++----- driver/utils/v4l2/v4l2_model_device.c | 45 +++---- driver/utils/v4l2/v4l2_model_device.h | 2 +- driver/utils/v4l2/v4l2_model_ioctl.c | 151 ++++++++++++----------- driver/utils/v4l2/v4l2_model_table.c | 3 + driver/utils/v4l2/v4l2_model_videobuf2.c | 105 ++++++++-------- 20 files changed, 322 insertions(+), 270 deletions(-) diff --git a/driver/board/gc573/board_gpio.c b/driver/board/gc573/board_gpio.c index 36918f8..235d488 100644 --- a/driver/board/gc573/board_gpio.c +++ b/driver/board/gc573/board_gpio.c @@ -113,7 +113,7 @@ int board_gpio_init(cxt_mgr_handle_t cxt_mgr) // board_gpio_cxt->gpio_pin_handle[i]=gpio_model_request_pin_handle(gpio_mgr,pin_name[i]); // if(board_gpio_cxt->gpio_pin_handle[i]==GPIO_MODEL_BAD_PIN_HANDLE) // { -// printk(" request %s failed\n",pin_name[i]); +// pr_info(" request %s failed\n",pin_name[i]); // } // } } diff --git a/driver/cxt_mgr.c b/driver/cxt_mgr.c index 34b561e..fc64ac5 100644 --- a/driver/cxt_mgr.c +++ b/driver/cxt_mgr.c @@ -36,7 +36,7 @@ static void cxt_item_unref(cxt_item_t *cxt_item) if (cxt_item->ref_count == 0) { // char *idc=(char *)&cxt_item->cxt_id; - // printk("%s %c%c%c%c\n",__func__,idc[0],idc[1],idc[2],idc[3]); + // pr_info("%s %c%c%c%c\n",__func__,idc[0],idc[1],idc[2],idc[3]); queue_del(&cxt_item->queue); if (cxt_item->release) @@ -93,7 +93,7 @@ void cxt_manager_release(cxt_mgr_handle_t handle) } mem_model_free_buffer(cxt_mgr); - // printk("%s done\n",__func__); + // pr_info("%s done\n",__func__); } void *cxt_manager_add_cxt(cxt_mgr_handle_t handle, U32_T id, cxt_alloc_func_t *alloc_func, cxt_release_func_t *release_func) @@ -167,7 +167,7 @@ void cxt_manager_ref_context(void *context) } if (!cxt_mgr) { - // printk("%s can't get cxt_mgr from context\n",__func__); + // pr_info("%s can't get cxt_mgr from context\n",__func__); } } @@ -181,7 +181,7 @@ void *cxt_manager_get_context(cxt_mgr_handle_t handle, U32_T cxt_id, U8_T index) for_each_queue_entry(pos, &cxt_mgr->cxt_queue, queue) { - //printk("%s %p %x\n",__func__,pos,pos->cxt_id); + //pr_info("%s %p %x\n",__func__,pos,pos->cxt_id); if (pos->cxt_id == cxt_id && pos->index == index) { found = pos; diff --git a/driver/utils/alsa/alsa.c b/driver/utils/alsa/alsa.c index 07aed61..be64954 100644 --- a/driver/utils/alsa/alsa.c +++ b/driver/utils/alsa/alsa.c @@ -9,7 +9,9 @@ * Version: * ================================================================= */ - + +#define pr_fmt(fmt) KBUILD_MODNAME ": " "%s, %d: " fmt, __func__, __LINE__ + #include #include #include @@ -78,7 +80,7 @@ static int sagitta_snd_test_stream(void *this) int done_size; bool reset; - printk("%s blob_size = %d\n", __func__, blob_size); + pr_info("%s blob_size = %d\n", __func__, blob_size); for(;;) { @@ -97,7 +99,7 @@ static int sagitta_snd_test_stream(void *this) deliver_size = &_binary_audio_dump_end - audio_head; reset = false; } - printk("%s deliver\n", __func__); + pr_info("%s deliver\n", __func__); #if 1 for(i = 0; i < deliver_size; i++) { if(*(audio_head + i)) { @@ -117,7 +119,7 @@ static int sagitta_snd_test_stream(void *this) } stop: - printk("%s end\n", __func__); + pr_info("%s end\n", __func__); __set_current_state(TASK_RUNNING); @@ -210,7 +212,7 @@ static int snd_sagitta_pcm_open(struct snd_pcm_substream *substream) struct sagitta_snd_dev *sdev = snd_pcm_substream_chip(substream); struct snd_pcm_runtime *runtime = substream->runtime; - printk("%s\n", __func__); + pr_info("%s\n", __func__); sdev->substream = substream; runtime->hw = snd_sagitta_hw; @@ -225,7 +227,7 @@ static int snd_sagitta_pcm_close(struct snd_pcm_substream *substream) { struct sagitta_snd_dev *sdev = snd_pcm_substream_chip(substream); - printk("%s\n", __func__); + pr_info("%s\n", __func__); sdev->substream = NULL; @@ -235,7 +237,7 @@ static int snd_sagitta_pcm_close(struct snd_pcm_substream *substream) static int snd_sagitta_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *hw_params) { - printk("%s() alloc buffer size = %u" + pr_info("%s() alloc buffer size = %u" " periods = %u period_bytes = %u\n", __func__, params_buffer_bytes(hw_params), @@ -253,7 +255,7 @@ static int snd_sagitta_hw_params(struct snd_pcm_substream *substream, static int snd_sagitta_hw_free(struct snd_pcm_substream *substream) { - printk("%s\n", __func__); + pr_info("%s\n", __func__); if(substream->runtime->dma_area) { @@ -269,7 +271,7 @@ static int snd_sagitta_prepare(struct snd_pcm_substream *substream) { struct sagitta_snd_dev *sdev = snd_pcm_substream_chip(substream); - printk("%s\n", __func__); + pr_info("%s\n", __func__); sdev->capture_transfer_done = 0; sdev->hwptr = 0; @@ -285,13 +287,13 @@ static void sagitta_audio_trigger(struct work_struct *work) if(atomic_read(&ssdev->stream_started)) { - printk("%s start\n", __func__); + pr_info("%s start\n", __func__); #if 0 add_timer(&filldata_timer); #endif } else { - printk("%s stop\n", __func__); + pr_info("%s stop\n", __func__); #if 0 del_timer_sync(&filldata_timer); #endif @@ -303,7 +305,7 @@ static int snd_sagitta_card_trigger(struct snd_pcm_substream *substream, { struct sagitta_snd_dev *sdev = snd_pcm_substream_chip(substream); - printk("%s\n", __func__); + pr_info("%s\n", __func__); switch(cmd) { @@ -355,7 +357,7 @@ static int snd_sagitta_pcm(struct sagitta_snd_dev *dev, struct snd_pcm *pcm; int err; - printk("%s\n", __func__); + pr_info("%s\n", __func__); err = snd_pcm_new(dev->card, name, device_idx, 0, 1, &pcm); if(err < 0) @@ -377,7 +379,7 @@ static struct sagitta_snd_dev *audio_dev_register(struct sagitta_dev *sdev) int err; - printk("%s\n", __func__); + pr_info("%s\n", __func__); #if 0 snd_dev = kmalloc(sizeof(struct sagitta_snd_dev), GFP_KERNEL); if(!snd_dev) { @@ -433,7 +435,7 @@ static struct sagitta_snd_dev *audio_dev_register(struct sagitta_dev *sdev) void audio_dev_deregister(struct sagitta_snd_dev *ssdev) { if(ssdev->card) { - printk("%s snd_card_free\n", __func__); + pr_info("%s snd_card_free\n", __func__); snd_card_free(ssdev->card); ssdev->card = NULL; } @@ -477,7 +479,7 @@ static void alsa_disconnect(struct sagitta_module *module, struct sagitta_dev *s //struct sagitta_snd_dev *ssdev = (struct sagitta_snd_dev *) sagitta_virtdev_getdata(svdev); struct sagitta_snd_dev *ssdev = (struct sagitta_snd_dev *)alsa_mod->context; - printk("%s\n", __func__); + pr_info("%s\n", __func__); //sagitta_trace(module, "%s\n", __func__); @@ -510,7 +512,7 @@ void *alsa_module_get_context(struct sagitta_dev *sdev) if(strncmp(mod->name,ALSA_MODULE_ID_STR,strlen(mod->name))==0) { struct alsa_module *this=(struct alsa_module *)mod; - //printk("%s found context %p\n",__func__,this->context); + //pr_info("%s found context %p\n",__func__,this->context); return this->context; } } diff --git a/driver/utils/alsa/alsa_model.c b/driver/utils/alsa/alsa_model.c index 68c30af..bb88ce7 100644 --- a/driver/utils/alsa/alsa_model.c +++ b/driver/utils/alsa/alsa_model.c @@ -9,7 +9,9 @@ * Version: * ================================================================= */ - + +#define pr_fmt(fmt) KBUILD_MODNAME ": " "%s, %d: " fmt, __func__, __LINE__ + #include #include #include @@ -113,17 +115,17 @@ static void alsa_model_release(void *context) { alsa_model_t *alsa_cxt = context; - printk("%s\n", __func__); + pr_info("%s\n", __func__); if (alsa_cxt) { if (alsa_cxt->card) { snd_card_free(alsa_cxt->card); - printk("%s snd_card_free \n", __func__); + pr_info("%s snd_card_free \n", __func__); } kfree(alsa_cxt); } - printk("%s done\n", __func__); + pr_info("%s done\n", __func__); } #if 1 @@ -168,7 +170,7 @@ static int alsa_model_pcm_open(struct snd_pcm_substream *substream) struct snd_pcm_runtime *runtime = substream->runtime; alsa_cb_info_t *cb_info = NULL; - printk("%s\n", __func__); + pr_info("%s\n", __func__); alsa_cxt->substream = substream; runtime->hw = alsa_cxt->hw_parm; @@ -202,7 +204,7 @@ static int alsa_model_pcm_close(struct snd_pcm_substream *substream) static int alsa_model_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *hw_params) { - printk("%s() alloc buffer size = %u"" periods = %u period_bytes = %u\n", __func__, params_buffer_bytes(hw_params), params_periods(hw_params), params_period_bytes(hw_params)); + pr_info("%s() alloc buffer size = %u"" periods = %u period_bytes = %u\n", __func__, params_buffer_bytes(hw_params), params_periods(hw_params), params_period_bytes(hw_params)); if (substream->runtime->dma_area) { @@ -214,7 +216,7 @@ static int alsa_model_hw_params(struct snd_pcm_substream *substream, struct snd_ static int alsa_model_hw_free(struct snd_pcm_substream *substream) { - printk("%s\n", __func__); + pr_info("%s\n", __func__); if (substream->runtime->dma_area) { @@ -230,7 +232,7 @@ static int alsa_model_prepare(struct snd_pcm_substream *substream) { alsa_model_t *alsa_cxt = snd_pcm_substream_chip(substream); - printk("%s\n", __func__); + pr_info("%s\n", __func__); alsa_cxt->capture_transfer_done = 0; alsa_cxt->hwptr = 0; @@ -243,7 +245,7 @@ static int alsa_model_card_trigger(struct snd_pcm_substream *substream, int cmd) alsa_model_t *alsa_cxt = snd_pcm_substream_chip(substream); alsa_cb_info_t *cb_info = NULL; - printk("%s %p\n", __func__,substream); + pr_info("%s %p\n", __func__,substream); switch (cmd) { @@ -281,7 +283,7 @@ static snd_pcm_uframes_t alsa_model_pointer(struct snd_pcm_substream *substream) spin_lock_irqsave(&alsa_cxt ->slock, flags); hwptr = alsa_cxt ->hwptr; spin_unlock_irqrestore(&alsa_cxt ->slock, flags); -// printk("%s %d\n",__func__,hwptr); +// pr_info("%s %d\n",__func__,hwptr); return hwptr; } @@ -302,33 +304,33 @@ void alsa_model_feed_data(alsa_model_handle_t handle, U8_T *buf, SIZE_T length) bool period_elapsed = false; // int i; - // printk("%s %d: ",__func__,length); + // pr_info("%s %d: ",__func__,length); // for(i=0;i<16;i++) // { - // printk("%02x ",buf[i]); + // pr_info("%02x ",buf[i]); // } - // printk("\n"); + // pr_info("\n"); if (!alsa_cxt->substream) { - // printk("NO substream\n"); + // pr_info("NO substream\n"); return; } if (!length) { - printk("NO length\n"); + pr_info("NO length\n"); return; } if (!alsa_cxt->substream->runtime) { - printk("NO runtime\n"); + pr_info("NO runtime\n"); return; } if (!alsa_cxt->substream->runtime->frame_bits) { - printk("frame_bits 0\n"); + pr_info("frame_bits 0\n"); return; } @@ -340,7 +342,7 @@ void alsa_model_feed_data(alsa_model_handle_t handle, U8_T *buf, SIZE_T length) /* bytes to copy_frames */ remain_frames = length / stride; copy_frames = remain_frames; - //printk("alsa stride:%d remain:%d copy:%d \n", stride, remain_frames, copy_frames); + //pr_info("alsa stride:%d remain:%d copy:%d \n", stride, remain_frames, copy_frames); /* if(oldptr) { diff --git a/driver/utils/gpio/gpio_model.c b/driver/utils/gpio/gpio_model.c index 56dd85f..c98719d 100644 --- a/driver/utils/gpio/gpio_model.c +++ b/driver/utils/gpio/gpio_model.c @@ -9,7 +9,9 @@ * Version: * ================================================================= */ - + +#define pr_fmt(fmt) KBUILD_MODNAME ": " "%s, %d: " fmt, __func__, __LINE__ + #include #include #include @@ -63,7 +65,7 @@ static void gpio_model_free_pindesc(pin_desc_t *pin_desc); // struct gpio_module *this=(struct gpio_module *)module; // // this->context=gpio_model_alloc(); -// printk("%s context %p\n",__func__,this->context); +// pr_info("%s context %p\n",__func__,this->context); //} // //static void gpio_module_disconnect(struct sagitta_module *module, struct sagitta_dev *sdev) @@ -205,7 +207,7 @@ static pin_desc_t *gpio_model_find_pin(gpio_ic_t *ic,const char *pin_name) //void gpio_module_init(struct sagitta_module *module) //{ -// printk("%s\n",__func__); +// pr_info("%s\n",__func__); // module->probe = gpio_module_probe; // module->disconnect = gpio_module_disconnect; //} diff --git a/driver/utils/i2c/i2c_model.c b/driver/utils/i2c/i2c_model.c index 419fd4a..9256633 100644 --- a/driver/utils/i2c/i2c_model.c +++ b/driver/utils/i2c/i2c_model.c @@ -1,3 +1,6 @@ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " "%s, %d: " fmt, __func__, __LINE__ + #include #include #include @@ -91,7 +94,7 @@ static void i2c_model_release(void *context) cxt_manager_unref_context(bus->ref_cxt); } - printk("i2c_del_adapter %p %s\n",&bus->i2c_adap,bus->bus_name); + pr_info("i2c_del_adapter %p %s\n",&bus->i2c_adap,bus->bus_name); i2c_del_adapter(&bus->i2c_adap); mem_model_free_buffer(bus); @@ -338,7 +341,7 @@ int i2c_model_add_bus(i2c_model_handle_t handle,const char *bus_name,void *adap, bus->ref_cxt=ref_cxt; cxt_manager_ref_context(ref_cxt); } - //printk("%s %p %s\n",__func__,bus->adap,bus->bus_name); + //pr_info("%s %p %s\n",__func__,bus->adap,bus->bus_name); }while(0); if(err!=I2C_MODEL_OK) { @@ -398,7 +401,7 @@ i2c_model_error_e i2c_model_bus_attach_device(i2c_model_handle_t handle,const ch { found=pdriver; // SHA204 not ready - printk("I2C_MODEL_BUS pdriver->drv_name ok %s and %s\n",pdriver->drv_name,drv_name); // + pr_info("I2C_MODEL_BUS pdriver->drv_name ok %s and %s\n",pdriver->drv_name,drv_name); // break; } pdriver++; @@ -530,7 +533,7 @@ void *i2c_model_get_nth_driver_handle(i2c_model_handle_t handle,const char *drv_ // { // if(pos->attach) // { -// printk("%s attach\n",pos->drv_name); +// pr_info("%s attach\n",pos->drv_name); // pos->attach(); // } // } @@ -546,7 +549,7 @@ void *i2c_model_get_nth_driver_handle(i2c_model_handle_t handle,const char *drv_ // { // if(pos->detach) // { -// printk("%s detach\n",pos->drv_name); +// pr_info("%s detach\n",pos->drv_name); // pos->detach(); // } // } diff --git a/driver/utils/mem/mem_model.c b/driver/utils/mem/mem_model.c index 70b64d1..f6d4778 100644 --- a/driver/utils/mem/mem_model.c +++ b/driver/utils/mem/mem_model.c @@ -9,7 +9,9 @@ * Version: * ================================================================= */ - + +#define pr_fmt(fmt) KBUILD_MODNAME ": " "%s, %d: " fmt, __func__, __LINE__ + #include #include #include @@ -455,7 +457,7 @@ static void mem_model_release(void *context) mem_model_dma_buffer_item_t *cur_buffer,*next_buffer; for_each_queue_entry_safe(cur_buffer,next_buffer,&pos->buffer_queue,queue) { - printk("%s %lx size %lx\n",__func__,cur_buffer->dma_buffer.phys_addr,cur_buffer->dma_buffer.size); + pr_info("%s %lx size %lx\n",__func__,cur_buffer->dma_buffer.phys_addr,cur_buffer->dma_buffer.size); mem_model_free_buffer_item(mem_model_cxt,cur_buffer); } } diff --git a/driver/utils/misc/g_queue.c b/driver/utils/misc/g_queue.c index 423cff5..bf2e23e 100644 --- a/driver/utils/misc/g_queue.c +++ b/driver/utils/misc/g_queue.c @@ -9,6 +9,8 @@ * Version: * ================================================================= */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " "%s, %d: " fmt, __func__, __LINE__ #include "g_queue.h" #include "debug.h" diff --git a/driver/utils/misc/sys.c b/driver/utils/misc/sys.c index ba2365f..ad5bcd5 100644 --- a/driver/utils/misc/sys.c +++ b/driver/utils/misc/sys.c @@ -9,7 +9,10 @@ * Version: * ================================================================= */ - #include "typedef.h" + +#define pr_fmt(fmt) KBUILD_MODNAME ": " "%s, %d: " fmt, __func__, __LINE__ + +#include "typedef.h" #include #include #include @@ -338,13 +341,13 @@ void *sys_fopen(const char *filename, enum sys_fop_flag_e flag) if (!filename) { - printk("Error: NULL pointer"); + pr_err("Error: NULL pointer"); return NULL; } if (flag & ~SYS_FOP_FLAG_BIT_MASK) { - printk("Error: the flag is not supported "); + pr_err("Error: the flag is not supported "); return NULL; } @@ -374,7 +377,7 @@ SIZE_T sys_fread(void *fp, void *buf, SIZE_T size, SIZE_T count, SIZE_T offset) res = kernel_read(fp, buf, count, &pos); if (res == 0) { - printk(KERN_INFO "kernel read: read zero bytes\n", res); + pr_info("kernel read: read zero bytes\n", res); } return res; diff --git a/driver/utils/pci/pci_model.c b/driver/utils/pci/pci_model.c index 7bb5dc0..8d412c5 100644 --- a/driver/utils/pci/pci_model.c +++ b/driver/utils/pci/pci_model.c @@ -9,7 +9,9 @@ * Version: * ================================================================= */ - + +#define pr_fmt(fmt) KBUILD_MODNAME ": " "%s, %d: " fmt, __func__, __LINE__ + #include #include "linux/pci.h" #include "linux/interrupt.h" @@ -129,7 +131,7 @@ static int pci_model_probe(struct pci_dev *pci_dev,const struct pci_device_id *p ERROR_REQUEST_IRQ, }err=NO_ERROR; - printk("pci_model_probe prepare\n"); + pr_info("pci_model_probe prepare\n"); do { if(!pci_model_drv_cxt) @@ -168,11 +170,11 @@ static int pci_model_probe(struct pci_dev *pci_dev,const struct pci_device_id *p if(!pci_set_dma_mask(pci_dev, DMA_BIT_MASK(64))) { - mesg_info("set 64bit DMA mask\n"); + pr_info("set 64bit DMA mask\n"); }else if(!pci_set_dma_mask(pci_dev, DMA_BIT_MASK(32))) { - mesg_info("set 32bit DMA mask\n"); + pr_info("set 32bit DMA mask\n"); }else { @@ -184,7 +186,7 @@ static int pci_model_probe(struct pci_dev *pci_dev,const struct pci_device_id *p { if(!pci_set_dma_mask(pci_dev, DMA_BIT_MASK(32))) { - mesg_info("set 32bit DMA mask\n"); + pr_info("set 32bit DMA mask\n"); }else { @@ -239,10 +241,10 @@ static int pci_model_probe(struct pci_dev *pci_dev,const struct pci_device_id *p bar_info->phys_addr=phys_addr; bar_info->size=size; bar_info->mmio=mmio; - mesg_debug("%s ioremap %08x size %x to %p\n",__func__,phys_addr,size,mmio); + mesg_debug("%s ioremap %08llx size %llx to %p\n",__func__,phys_addr,size,mmio); }else { - mesg_err("%s ioremap %08x size %x error\n",__func__,phys_addr,size); + mesg_err("%s ioremap %08llx size %llx error\n",__func__,phys_addr,size); } pci_cxt->bar_count++; @@ -252,12 +254,12 @@ static int pci_model_probe(struct pci_dev *pci_dev,const struct pci_device_id *p subsystem_id = sub_system; - printk("%s sub_id=%x\n",__func__,sub_system); + pr_info("%s sub_id=%x\n",__func__,sub_system); if(pci_model_drv_cxt->probe_func) { ret=pci_model_drv_cxt->probe_func(dev,driver_data->driver_data); - printk("board_probe=%d\n",ret); + pr_info("board_probe=%d\n",ret); } @@ -265,7 +267,7 @@ static int pci_model_probe(struct pci_dev *pci_dev,const struct pci_device_id *p if(err!=NO_ERROR) { mesg_err("%s error %d\n",__func__,err); - printk("pci_model_probe fail\n"); + pr_err("pci_model_probe fail\n"); switch(err) { case ERROR_REQUEST_REGIONS: @@ -597,7 +599,7 @@ void pci_model_register_isr(pci_model_handle_t handle,pci_model_irq_func_t irq_f int pci_model_driver_init(pci_model_driver_setup_t *pcidrv_setup) { int err; - printk("pci_model_driver_init\n"); + pr_info("pci_model_driver_init\n"); if(pci_model_drv_cxt==NULL) { pci_model_drv_cxt=mem_model_alloc_buffer(sizeof(pci_model_driver_cxt_t)); @@ -636,7 +638,7 @@ int pci_model_driver_init(pci_model_driver_setup_t *pcidrv_setup) if(id_setup->device) { id->device=id_setup->device; - printk("id->device=%02x\n",id->device); + pr_info("id->device=%02x\n",id->device); } else id->device=PCI_ANY_ID; @@ -672,11 +674,11 @@ int pci_model_driver_init(pci_model_driver_setup_t *pcidrv_setup) err = pci_register_driver(&pci_model_drv_cxt->driver); if (err ==0) { - printk(">>>pci_register_driver ok\n"); + pr_info(">>>pci_register_driver ok\n"); } else { - printk(">>>pci_register_driver fail\n"); + pr_err(">>>pci_register_driver fail\n"); } //pcidrv_setup->subsystem_id = subsystem_id; diff --git a/driver/utils/thread/task_model.c b/driver/utils/thread/task_model.c index 4bf4b0f..5553314 100644 --- a/driver/utils/thread/task_model.c +++ b/driver/utils/thread/task_model.c @@ -14,7 +14,9 @@ * To change this template file, choose Tools | Templates * and open the template in the editor. */ - + +#define pr_fmt(fmt) KBUILD_MODNAME ": " "%s, %d: " fmt, __func__, __LINE__ + #include #include #include @@ -318,7 +320,7 @@ static void task_model_tasklet_func(unsigned long data) //check atomic_set(&task_model_cxt->need_reschedue_DPC,1); #if 1 //In order to avoid video stop while aging test if(!queue_empty(&task_model_cxt->DPC_queue)) { - printk("interrupt add que Detection\n"); + pr_info("interrupt add que Detection\n"); atomic_set(&task_model_cxt->need_reschedue_DPC,0); tasklet_schedule(&task_model_cxt->tasklet); } diff --git a/driver/utils/trace/debug.c b/driver/utils/trace/debug.c index 86121f7..3cd0a7a 100644 --- a/driver/utils/trace/debug.c +++ b/driver/utils/trace/debug.c @@ -14,7 +14,9 @@ * To change this template file, choose Tools | Templates * and open the template in the editor. */ - + +#define pr_fmt(fmt) KBUILD_MODNAME ": %s, %d: " fmt, __func__, __LINE__ + #include "cxt_mgr.h" #include "trace.h" #include "debug.h" @@ -327,14 +329,24 @@ void uninit_debug() int mesg(const char *fmt,...) { + char *tmp; va_list args; int r; - + + tmp = kmalloc(sizeof (KBUILD_MODNAME ": ") + strlen(fmt), GFP_KERNEL); + if ( !tmp ) + return -1; + + strcpy(tmp, KBUILD_MODNAME ": "); + strcat(tmp, fmt); + va_start(args, fmt); - r=vprintk(fmt,args); + r= vprintk(tmp,args); va_end(args); - + + kfree(tmp); + return r; } diff --git a/driver/utils/trace/include/debug.h b/driver/utils/trace/include/debug.h index 1036b5f..86bb7c2 100644 --- a/driver/utils/trace/include/debug.h +++ b/driver/utils/trace/include/debug.h @@ -27,29 +27,32 @@ extern "C" { #endif -#define DEBUG 1 + + +#define DEBUG 1 int mesg(const char *fmt,...); + #define mesg_info(fmt, ...) \ - mesg(KERN_INFO fmt, ##__VA_ARGS__) + pr_info(fmt, ##__VA_ARGS__) #define mesg_emerg(fmt, ...) \ - mesg(KERN_EMERG fmt, ##__VA_ARGS__) + pr_emerg(fmt, ##__VA_ARGS__) #define mesg_alert(fmt, ...) \ - mesg(KERN_ALERT fmt, ##__VA_ARGS__) + pr_alert(fmt, ##__VA_ARGS__) #define mesg_crit(fmt, ...) \ - mesg(KERN_CRIT fmt, ##__VA_ARGS__) + pr_crit(fmt, ##__VA_ARGS__) #define mesg_err(fmt, ...) \ - mesg(KERN_ERR fmt, ##__VA_ARGS__) + pr_err(fmt, ##__VA_ARGS__) #define mesg_warning(fmt, ...) \ - mesg(KERN_WARNING fmt, ##__VA_ARGS__) + pr_warning(fmt, ##__VA_ARGS__) #define mesg_notice(fmt, ...) \ - mesg(KERN_NOTICE fmt, ##__VA_ARGS__) + pr_notice(fmt, ##__VA_ARGS__) #if DEBUG #define mesg_debug(fmt, ...) \ debug_msg(KERN_DEBUG fmt, ##__VA_ARGS__) - #else -#define mesg_debug(fmt, ...) +#define mesg_debug(fmt, ...) \ + pr_debug(fmt, ##__VA_ARGS__) #endif typedef enum diff --git a/driver/utils/trace/trace.c b/driver/utils/trace/trace.c index 4e9aa5e..e1628fd 100644 --- a/driver/utils/trace/trace.c +++ b/driver/utils/trace/trace.c @@ -14,6 +14,8 @@ * To change this template file, choose Tools | Templates * and open the template in the editor. */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " "%s, %d: " fmt, __func__, __LINE__ #include #include @@ -156,7 +158,7 @@ void trace_attr_free(trace_attr_handle_t attr_handle) if (attr) { - // printk("%s %s\n",__func__,attr->attr.attr.name); + // pr_info("%s %s\n",__func__,attr->attr.attr.name); if (attr->attr.attr.name) mem_model_free_buffer((void *) attr->attr.attr.name); queue_del(&attr->queue); @@ -171,7 +173,7 @@ static __attribute__((unused)) void trace_free_attr_list(trace_context_t *trace_ for_each_queue_entry_safe(attr, tmp, &trace_cxt->attrs_queue, queue) { - printk("%s %s\n", __func__, attr->attr.attr.name); + pr_info("%s %s\n", __func__, attr->attr.attr.name); queue_del(&attr->queue); //mem_model_free(attr); } @@ -205,12 +207,12 @@ static void trace_update_group(trace_context_t *trace_cxt) i++; } trace_cxt->attrs[i] = NULL; - //printk("%d\n", trace_cxt->attr_count); + //pr_info("%d\n", trace_cxt->attr_count); for (i = 0; i < trace_cxt->attr_count; i++) { if (trace_cxt->attrs[i]) { - //printk("[%d] %s\n", i, trace_cxt->attrs[i]->name); + //pr_info("[%d] %s\n", i, trace_cxt->attrs[i]->name); } } @@ -218,7 +220,7 @@ static void trace_update_group(trace_context_t *trace_cxt) } trace_cxt->attr_group.attrs = trace_cxt->attrs; } - printk("%s done\n", __func__); + pr_info("%s done\n", __func__); } @@ -236,7 +238,7 @@ static void trace_model_release(void *cxt) { trace_context_t *trace_cxt = cxt; - printk("%s\n", __func__); + pr_info("%s\n", __func__); if (trace_cxt) { @@ -341,7 +343,7 @@ void *trace_model_init(void *cxt_mgr) while (0); if (err != NO_ERROR) { - printk("%s err %d\n", __func__, err); + pr_info("%s err %d\n", __func__, err); switch (err) { case ERR_CREATE_GROUP: diff --git a/driver/utils/v4l2/framegrabber.c b/driver/utils/v4l2/framegrabber.c index 46761c4..6f0b52f 100644 --- a/driver/utils/v4l2/framegrabber.c +++ b/driver/utils/v4l2/framegrabber.c @@ -9,6 +9,9 @@ * Version: * ================================================================= */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " "%s, %d: " fmt, __func__, __LINE__ + #include "typedef.h" #include #include @@ -218,7 +221,7 @@ framegrabber_handle_t framegrabber_init(cxt_mgr_handle_t cxt_mgr,framegrabber_pr { if(fg_cxt->pixfmt_cap & (1<current_out_pixfmt=%d\n",__func__,i); + //pr_info("%s fg_cxt->current_out_pixfmt=%d\n",__func__,i); fg_cxt->current_out_pixfmt=i; break; } @@ -358,7 +361,7 @@ void framegrabber_mask_s_status(framegrabber_handle_t handle,framegrabber_status current_status &= ~mask; current_status |= (status & mask); diff=current_status ^ context->current_status; - //printk("%s diff %08x status %08x=>%08x\n",__func__,diff,context->current_status,current_status); + //pr_info("%s diff %08x status %08x=>%08x\n",__func__,diff,context->current_status,current_status); context->current_status=current_status; @@ -370,7 +373,7 @@ void framegrabber_mask_s_status(framegrabber_handle_t handle,framegrabber_status // streaming status changed from STOP to START, so we have to set streaming on if(handle->stream_on) { - printk("%s stream_on\n",__func__); + pr_info("%s stream_on\n",__func__); handle->stream_on(handle); } }else @@ -378,7 +381,7 @@ void framegrabber_mask_s_status(framegrabber_handle_t handle,framegrabber_status // streaming status changed from START to STOP, so we have to set streaming off if(handle->stream_off) { - printk("%s stream_off\n",__func__); + pr_info("%s stream_off\n",__func__); handle->stream_off(handle); } } @@ -391,7 +394,7 @@ void framegrabber_mask_s_status(framegrabber_handle_t handle,framegrabber_status // signal status changed from UNLOCK to LOCK and the current streaming status is START, so we have to set streaming on if(handle->stream_on) { - printk("%s stream_on\n",__func__); + pr_info("%s stream_on\n",__func__); handle->stream_on(handle); } } @@ -403,14 +406,14 @@ void framegrabber_mask_s_status(framegrabber_handle_t handle,framegrabber_status { if(handle->stream_on) { - printk("%s stream_on\n",__func__); + pr_info("%s stream_on\n",__func__); handle->stream_on(handle); } }else { if(handle->stream_off) { - printk("%s stream_off\n",__func__); + pr_info("%s stream_off\n",__func__); handle->stream_off(handle); } } @@ -602,14 +605,14 @@ void framegrabber_s_input_dualmode(framegrabber_handle_t handle,int dual_pixel) int framegrabber_g_input_dualmode(framegrabber_handle_t handle) { framegrabber_context_t *context=framegrabber_getcontext(handle); - printk(">>>>>%s ..%d\n",__func__,context->current_dual_pixel); + pr_info(">>>>>%s ..%d\n",__func__,context->current_dual_pixel); return context->current_dual_pixel; } int framegrabber_g_input_framerate(framegrabber_handle_t handle) { framegrabber_context_t *context=framegrabber_getcontext(handle); - //printk(">>>>>%s ..%d\n",__func__,context->current_framerate); + //pr_info(">>>>>%s ..%d\n",__func__,context->current_framerate); return context->current_framerate; } @@ -627,7 +630,7 @@ void framegrabber_s_input_framerate(framegrabber_handle_t handle,int framerate,i context->current_framerate=framerate; context->current_denominator=denominator; - //printk(">>>>>%s ..%d\n",__func__,context->current_framerate); + //pr_info(">>>>>%s ..%d\n",__func__,context->current_framerate); } void framegrabber_s_out_framerate(framegrabber_handle_t handle,int framerate) @@ -636,14 +639,14 @@ void framegrabber_s_out_framerate(framegrabber_handle_t handle,int framerate) context->current_out_framerate=framerate; - //printk(">>>>>>%s ..%d\n",__func__,context->current_out_framerate); + //pr_info(">>>>>>%s ..%d\n",__func__,context->current_out_framerate); } int framegrabber_g_out_framerate(framegrabber_handle_t handle) { framegrabber_context_t *context=framegrabber_getcontext(handle); - //printk(">>>>>>>%s ..%d\n",__func__,context->current_out_framerate); + //pr_info(">>>>>>>%s ..%d\n",__func__,context->current_out_framerate); return context->current_out_framerate; } @@ -654,14 +657,14 @@ void framegrabber_s_input_audioinfo(framegrabber_handle_t handle,enum framegrabb context->current_audioinfo=audioinfo; - //printk(">>>>>%s ..%d\n",__func__,context->current_audioinfo); + //pr_info(">>>>>%s ..%d\n",__func__,context->current_audioinfo); } int framegrabber_g_input_audioinfo(framegrabber_handle_t handle) { framegrabber_context_t *context=framegrabber_getcontext(handle); - //printk(">>>>>>>%s ..%d\n",__func__,context->current_audioinfo); + //pr_info(">>>>>>>%s ..%d\n",__func__,context->current_audioinfo); return context->current_audioinfo; } @@ -674,7 +677,7 @@ int framegrabber_g_input_bchs(framegrabber_handle_t handle,int bchs_select) //context->current_bchs_selection=*bchs_select; - //printk("%s current_bchs_value(%d) = %x\n",__func__,context->current_bchs_selection,context->current_bchs_value); + //pr_info("%s current_bchs_value(%d) = %x\n",__func__,context->current_bchs_selection,context->current_bchs_value); switch (bchs_select) { @@ -682,35 +685,35 @@ int framegrabber_g_input_bchs(framegrabber_handle_t handle,int bchs_select) { handle->brightness_get(handle,&bchs_value); //bchs_value = &handle->fg_bchs_value; - //printk("%s brightness=%d\n",__func__,*bchs_value); + //pr_info("%s brightness=%d\n",__func__,*bchs_value); break; } case 1: //contrast { handle->contrast_get(handle,&bchs_value); //bchs_value = &handle->fg_bchs_value; - //printk("%s contrast=%d\n",__func__,*bchs_value); + //pr_info("%s contrast=%d\n",__func__,*bchs_value); break; } case 2: //hue { handle->hue_get(handle,&bchs_value); //bchs_value = &handle->fg_bchs_value; - //printk("%s hue=%d\n",__func__,*bchs_value); + //pr_info("%s hue=%d\n",__func__,*bchs_value); break; } case 3: //saturation { handle->saturation_get(handle,&bchs_value); //bchs_value = &handle->fg_bchs_value; - //printk("%s saturation=%d\n",__func__,bchs_value); + //pr_info("%s saturation=%d\n",__func__,bchs_value); break; } } //context->current_bchs_value = *bchs_value; - //printk("%s bchs_value(%d) = %d\n",__func__,context->current_bchs_selection,context->current_bchs_value); + //pr_info("%s bchs_value(%d) = %d\n",__func__,context->current_bchs_selection,context->current_bchs_value); return bchs_value; } @@ -731,7 +734,7 @@ void framegrabber_s_input_bchs(framegrabber_handle_t handle,int bchs_value,int b if(handle->bchs_set) handle->bchs_set(handle); - printk("%s current_bchs_value(%d) = %d\n",__func__,bchs_select,context->current_bchs_value); + pr_info("%s current_bchs_value(%d) = %d\n",__func__,bchs_select,context->current_bchs_value); } @@ -743,7 +746,7 @@ int framegrabber_g_hdcp_state(framegrabber_handle_t handle) int state_value=0; handle->hdcp_state_get(handle,&state_value); - printk("%s hdcp state value=%d\n",__func__,state_value); + pr_info("%s hdcp state value=%d\n",__func__,state_value); return state_value; @@ -905,7 +908,7 @@ int framegrabber_g_hdcp_flag(framegrabber_handle_t handle) int hdcp_flag; hdcp_flag = context->hdcp_flag; - //printk("%s hdcp_flag =%u\n",__func__,hdcp_flag); + //pr_info("%s hdcp_flag =%u\n",__func__,hdcp_flag); return hdcp_flag; } @@ -915,7 +918,7 @@ void framegrabber_s_hdcp_flag(framegrabber_handle_t handle, unsigned int hdcp_fl context->hdcp_flag = hdcp_flag; - //printk("%s hdcp_flag =%u\n",__func__,hdcp_flag); + //pr_info("%s hdcp_flag =%u\n",__func__,hdcp_flag); } int framegrabber_g_i2c(framegrabber_handle_t handle, unsigned char channel, unsigned int slave, unsigned int sub, unsigned char sublen, unsigned char *data, unsigned int datalen, unsigned int is_10bit) @@ -923,13 +926,13 @@ int framegrabber_g_i2c(framegrabber_handle_t handle, unsigned char channel, unsi framegrabber_context_t *context = framegrabber_getcontext(handle); if(context == NULL) { - printk("param is null!\n"); + pr_info("param is null!\n"); return -1; } if(!context->interface.i2c_read) { - printk("function pointer is null\n"); + pr_info("function pointer is null\n"); return -1; } @@ -941,13 +944,13 @@ int framegrabber_s_i2c(framegrabber_handle_t handle, unsigned char channel, unsi framegrabber_context_t *context = framegrabber_getcontext(handle); if(context == NULL) { - printk("param is null!\n"); + pr_info("param is null!\n"); return -1; } if(!context->interface.i2c_write) { - printk("function pointer is null\n"); + pr_info("function pointer is null\n"); return -1; } @@ -959,13 +962,13 @@ int framegrabber_g_reg(framegrabber_handle_t handle, unsigned int offset, unsign framegrabber_context_t *context = framegrabber_getcontext(handle); if(context == NULL) { - printk("param is null!\n"); + pr_info("param is null!\n"); return -1; } if(!context->interface.reg_read) { - printk("function pointer is null\n"); + pr_info("function pointer is null\n"); return -1; } @@ -977,13 +980,13 @@ int framegrabber_s_reg(framegrabber_handle_t handle, unsigned int offset, unsign framegrabber_context_t *context = framegrabber_getcontext(handle); if(context == NULL) { - printk("param is null!\n"); + pr_info("param is null!\n"); return -1; } if(!context->interface.reg_write) { - printk("function pointer is null\n"); + pr_info("function pointer is null\n"); return -1; } diff --git a/driver/utils/v4l2/v4l2_model_device.c b/driver/utils/v4l2/v4l2_model_device.c index 0c58d4c..cd7cc3e 100644 --- a/driver/utils/v4l2/v4l2_model_device.c +++ b/driver/utils/v4l2/v4l2_model_device.c @@ -9,6 +9,9 @@ * Version: * ================================================================= */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " "%s, %d: " fmt, __func__, __LINE__ + #include "v4l2_model.h" #include #include @@ -158,7 +161,7 @@ v4l2_model_handle_t v4l2_model_init(cxt_mgr_handle_t cxt_mgr,v4l2_model_device_s devicetype = VFL_TYPE_SUBDEV; break; default: - printk("%s no supported device type 0x%x\n",__func__, context->device_info.type); + pr_info("%s no supported device type 0x%x\n",__func__, context->device_info.type); break; } ret = v4l2_device_register(dev,&context->v4l2_dev); @@ -251,7 +254,7 @@ static void v4l2_model_release(v4l2_model_handle_t context) if(!v4l2m_context) { return; } - printk("%s\n", __func__); + pr_info("%s\n", __func__); #if LINUX_VERSION_CODE < KERNEL_VERSION(4,18,0) for(i=0;iAVER_FLASH_IOCTL_FW_UPDATE\n"); + pr_info("----->AVER_FLASH_IOCTL_FW_UPDATE\n"); ret = v4l2_model_ioctl_s_flash(file,(struct v4l2_dump_flash *)arg); break; case AVER_HDCP_IOCTL_GET_STATE: - printk("AVER_HDCP_IOCTL_GET_STATE\n"); + pr_info("AVER_HDCP_IOCTL_GET_STATE\n"); ret = v4l2_model_ioctl_g_hdcp_state(file, &hdcp_state); copy_to_user ((unsigned int *)arg, &hdcp_state, sizeof(hdcp_state)); break; case AVER_HDCP_IOCTL_SET_STATE: - //printk("hdcp:%x \n", arg); + //pr_info("hdcp:%x \n", arg); //copy_from_user (&hdcp_state,(unsigned int *) arg, sizeof(hdcp_state)); hdcp_state = arg; - printk("----->AVER_HDCP_IOCTL_SET_STATE:%ld \n", arg); + pr_info("----->AVER_HDCP_IOCTL_SET_STATE:%ld \n", arg); ret = v4l2_model_ioctl_s_hdcp_state(file,&hdcp_state); break; case AVER_GET_I2C: - //printk("----->AVER_GET_I2C\n"); + //pr_info("----->AVER_GET_I2C\n"); ret = v4l2_model_ioctl_g_i2c(file, (struct i2c_t *) arg); if (ret) { - printk("AVER_GET_I2C failed...\n"); + pr_info("AVER_GET_I2C failed...\n"); } break; case AVER_SET_I2C: - //printk("----->AVER_SET_I2C\n"); + //pr_info("----->AVER_SET_I2C\n"); ret = v4l2_model_ioctl_s_i2c(file, (struct i2c_t *) arg); if (ret) { - printk("AVER_SET_I2C failed...\n"); + pr_info("AVER_SET_I2C failed...\n"); } break; case AVER_GET_REG: - //printk("----->AVER_GET_REG\n"); + //pr_info("----->AVER_GET_REG\n"); ret = v4l2_model_ioctl_g_reg(file, (struct reg_t *) arg); if (ret) { - printk("AVER_GET_REG failed...\n"); + pr_info("AVER_GET_REG failed...\n"); } break; case AVER_SET_REG: - //printk("----->AVER_SET_REG\n"); + //pr_info("----->AVER_SET_REG\n"); ret = v4l2_model_ioctl_s_reg(file, (struct reg_t *) arg); if (ret) { - printk("AVER_SET_REG failed...\n"); + pr_info("AVER_SET_REG failed...\n"); } break; @@ -623,9 +626,9 @@ static void v4l2_model_notify(struct v4l2_subdev *sd,unsigned int notification, { v4l2_model_context_t *v4l2m_context=container_of(sd->v4l2_dev,v4l2_model_context_t,v4l2_dev); - printk("%s sd name %s owner %s\n",__func__,sd->name,sd->owner->name); + pr_info("%s sd name %s owner %s\n",__func__,sd->name,sd->owner->name); framegrabber_notify(v4l2m_context->framegrabber_handle,sd->name,notification, arg); -// printk("%s %s notification %d \n",__func__,sd->name,notification); +// pr_info("%s %s notification %d \n",__func__,sd->name,notification); // if(notification==2) // { // struct v4l2_dv_timings detected_timings; @@ -633,8 +636,8 @@ static void v4l2_model_notify(struct v4l2_subdev *sd,unsigned int notification, // int status; // v4l2_subdev_call(sd,video, query_dv_timings, &detected_timings); // v4l2_subdev_call(sd,video, g_input_status, &status); -// printk("%s input status %x\n",__func__,status); -// printk("%s detected %dx%d%c\n", __func__,detected_timings.bt.width, detected_timings.bt.height,detected_timings.bt.interlaced == V4L2_DV_INTERLACED ? 'i' : 'p'); +// pr_info("%s input status %x\n",__func__,status); +// pr_info("%s detected %dx%d%c\n", __func__,detected_timings.bt.width, detected_timings.bt.height,detected_timings.bt.interlaced == V4L2_DV_INTERLACED ? 'i' : 'p'); // v4l2_subdev_call(sd,video, s_dv_timings, &detected_timings); // // diff --git a/driver/utils/v4l2/v4l2_model_device.h b/driver/utils/v4l2/v4l2_model_device.h index 02489c6..b10e647 100644 --- a/driver/utils/v4l2/v4l2_model_device.h +++ b/driver/utils/v4l2/v4l2_model_device.h @@ -95,7 +95,7 @@ typedef struct v4l2_model_context_s -#define V4L2_MODEL_DEBUG(fmt, ...) //printk(fmt, ##__VA_ARGS__) +#define V4L2_MODEL_DEBUG(fmt, ...) //pr_info(fmt, ##__VA_ARGS__) #endif /* V4L2_MODEL_DEVICE_H_ */ diff --git a/driver/utils/v4l2/v4l2_model_ioctl.c b/driver/utils/v4l2/v4l2_model_ioctl.c index 3bb6afb..ac5a9de 100644 --- a/driver/utils/v4l2/v4l2_model_ioctl.c +++ b/driver/utils/v4l2/v4l2_model_ioctl.c @@ -9,6 +9,9 @@ * Version: * ================================================================= */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " "%s, %d: " fmt, __func__, __LINE__ + #include "typedef.h" #include #include @@ -211,7 +214,7 @@ u32 v4l2_model_to_v4l2_caps(u32 v4l2m_caps) if(v4l2m_caps) { //V4L2_MODEL_DEBUG("Unsupport capabilities!!!\n"); - printk("Unsupport capabilities!!!\n"); + pr_info("Unsupport capabilities!!!\n"); } @@ -223,7 +226,7 @@ int v4l2_model_ioctl_querycap(struct file *file, void *fh, struct v4l2_capabilit { v4l2_model_context_t *v4l2m_context = video_drvdata(file); - //printk("%s...\n",__func__); + //pr_info("%s...\n",__func__); if(v4l2m_context) { @@ -253,10 +256,10 @@ int v4l2_model_ioctl_enum_fmt_vid_cap(struct file *file, void *fh, struct v4l2_f v4l2_model_context_t *v4l2m_context = video_drvdata(file); U32_T index = f->index; - //printk("%s...\n",__func__); + //pr_info("%s...\n",__func__); if(f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) { - printk("%s.\n",__func__); + pr_info("%s.\n",__func__); return -EINVAL; } @@ -274,7 +277,7 @@ int v4l2_model_ioctl_enum_fmt_vid_cap(struct file *file, void *fh, struct v4l2_f else { pixfmt=framegrabber_g_support_pixelfmt_by_index(v4l2m_context->framegrabber_handle,f->index); - //printk("%s..pixfmt=%d.\n",__func__,f->index); + //pr_info("%s..pixfmt=%d.\n",__func__,f->index); f->index = index; f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; strlcpy(f->description, pixfmt->name, sizeof(f->description)); @@ -284,7 +287,7 @@ int v4l2_model_ioctl_enum_fmt_vid_cap(struct file *file, void *fh, struct v4l2_f if(pixfmt==NULL) return -EINVAL; - //printk("%s....pixfmt=%d.\n",__func__,f->index); + //pr_info("%s....pixfmt=%d.\n",__func__,f->index); strlcpy(f->description, pixfmt->name, sizeof(f->description)); f->pixelformat=pixfmt->fourcc; } @@ -306,10 +309,10 @@ int v4l2_model_ioctl_g_fmt_vid_cap(struct file *file, void *fh,struct v4l2_forma { int width,height; //unsigned bytesperline; - //printk("%s...\n",__func__); + //pr_info("%s...\n",__func__); framegrabber_g_input_framesize(v4l2m_context->framegrabber_handle,&width,&height); //bytesperline=framegrabber_g_out_bytesperline(v4l2m_context->framegrabber_handle); - //printk("%s..f->fmt.pix.width=%d.f->fmt.pix.height=%d.\n",__func__,f->fmt.pix.width,f->fmt.pix.height); + //pr_info("%s..f->fmt.pix.width=%d.f->fmt.pix.height=%d.\n",__func__,f->fmt.pix.width,f->fmt.pix.height); f->fmt.pix.width=width; f->fmt.pix.height=height; @@ -330,7 +333,7 @@ int v4l2_model_ioctl_g_fmt_vid_cap(struct file *file, void *fh,struct v4l2_forma //f->fmt.pix.height = height*2; f->fmt.pix.field=V4L2_FIELD_INTERLACED; } - //printk("%s....f->fmt.pix.width=%d.f->fmt.pix.height=%d.\n",__func__,f->fmt.pix.width,f->fmt.pix.height); + //pr_info("%s....f->fmt.pix.width=%d.f->fmt.pix.height=%d.\n",__func__,f->fmt.pix.width,f->fmt.pix.height); return 0; } @@ -343,7 +346,7 @@ int v4l2_model_ioctl_try_fmt_vid_cap(struct file *file, void *fh, struct v4l2_fo const framegrabber_pixfmt_t *fmt; int width,height; BOOL_T interlace_mode; - //printk("%s>>f->fmt.pix.width=%d.f->fmt.pix.height=%d.f->fmt.pix.pixelformat=%d\n",__func__,f->fmt.pix.width,f->fmt.pix.height,f->fmt.pix.pixelformat); + //pr_info("%s>>f->fmt.pix.width=%d.f->fmt.pix.height=%d.f->fmt.pix.pixelformat=%d\n",__func__,f->fmt.pix.width,f->fmt.pix.height,f->fmt.pix.pixelformat); fmt = framegrabber_g_support_pixelfmt_by_fourcc(v4l2m_context->framegrabber_handle, f->fmt.pix.pixelformat); framegrabber_g_input_framesize(v4l2m_context->framegrabber_handle,&width,&height); @@ -352,7 +355,7 @@ int v4l2_model_ioctl_try_fmt_vid_cap(struct file *file, void *fh, struct v4l2_fo if(!fmt) { - printk("%s..\n",__func__); + pr_info("%s..\n",__func__); return 0; } @@ -365,7 +368,7 @@ int v4l2_model_ioctl_try_fmt_vid_cap(struct file *file, void *fh, struct v4l2_fo f->fmt.pix.width=width; //f->fmt.pix.height=height*2; f->fmt.pix.field =V4L2_FIELD_INTERLACED; //field order - //printk("%s>f->fmt.pix.width=%d.f->fmt.pix.height=%d.\n",__func__,f->fmt.pix.width,f->fmt.pix.height); + //pr_info("%s>f->fmt.pix.width=%d.f->fmt.pix.height=%d.\n",__func__,f->fmt.pix.width,f->fmt.pix.height); } else { @@ -380,7 +383,7 @@ int v4l2_model_ioctl_try_fmt_vid_cap(struct file *file, void *fh, struct v4l2_fo { //f->fmt.pix.height=height*2; f->fmt.pix.field =V4L2_FIELD_INTERLACED; - //printk("%s f->fmt.pix.width=%d.f->fmt.pix.height=%d.\n",__func__,f->fmt.pix.width,f->fmt.pix.height); + //pr_info("%s f->fmt.pix.width=%d.f->fmt.pix.height=%d.\n",__func__,f->fmt.pix.width,f->fmt.pix.height); } else { @@ -405,7 +408,7 @@ int v4l2_model_ioctl_try_fmt_vid_cap(struct file *file, void *fh, struct v4l2_fo f->fmt.pix.priv = 0; - //printk("%s<fmt.pix.width=%d.f->fmt.pix.height=%d.\n",__func__,f->fmt.pix.width,f->fmt.pix.height); + //pr_info("%s<fmt.pix.width=%d.f->fmt.pix.height=%d.\n",__func__,f->fmt.pix.width,f->fmt.pix.height); return 0; } @@ -418,30 +421,30 @@ int v4l2_model_ioctl_s_fmt_vid_cap(struct file *file, void *fh,struct v4l2_forma int ret = v4l2_model_ioctl_try_fmt_vid_cap(file, fh, f); if (ret < 0) { - printk("%s..\n",__func__); + pr_info("%s..\n",__func__); return ret; } if (vb2_is_busy(&v4l2m_context->queue)) { - printk("%s.\n",__func__); + pr_info("%s.\n",__func__); return -EBUSY; } /* TODO check setting format is supported */ - //printk("%s...\n",__func__); + //pr_info("%s...\n",__func__); if(framegrabber_g_support_pixelfmt_by_fourcc(v4l2m_context->framegrabber_handle,f->fmt.pix.pixelformat)==NULL) { - printk("..%s..\n",__func__); + pr_info("..%s..\n",__func__); return -EINVAL; } if(f->fmt.pix.width==0 || f->fmt.pix.height==0) { - printk("..%s.\n",__func__); + pr_info("..%s.\n",__func__); return -EINVAL; } - //printk("%s.f->fmt.pix.width=%d..f->fmt.pix.height=%d\n",__func__,f->fmt.pix.width,f->fmt.pix.height); + //pr_info("%s.f->fmt.pix.width=%d..f->fmt.pix.height=%d\n",__func__,f->fmt.pix.width,f->fmt.pix.height); framegrabber_s_out_framesize(v4l2m_context->framegrabber_handle,f->fmt.pix.width,f->fmt.pix.height); framegrabber_s_out_pixelfmt(v4l2m_context->framegrabber_handle,f->fmt.pix.pixelformat); @@ -454,26 +457,26 @@ int v4l2_model_ioctl_enum_framesizes(struct file *file, void *fh, struct v4l2_fr const framegrabber_pixfmt_t *pixfmt; int width=0,height=0; - //printk("%s...\n",__func__); + //pr_info("%s...\n",__func__); pixfmt=framegrabber_g_support_pixelfmt_by_fourcc(v4l2m_context->framegrabber_handle,fsize->pixel_format); - //printk("%s %08x %p\n",__func__,fsize->pixel_format,pixfmt); + //pr_info("%s %08x %p\n",__func__,fsize->pixel_format,pixfmt); if(pixfmt==NULL) { - printk("%s..\n",__func__); + pr_info("%s..\n",__func__); return -EINVAL; } else { - //printk("%s %08x %x\n",__func__,fsize->pixel_format,pixfmt->fourcc); + //pr_info("%s %08x %x\n",__func__,fsize->pixel_format,pixfmt->fourcc); } if(framegrabber_g_supportframesize(v4l2m_context->framegrabber_handle,fsize->index,&width,&height)!=FRAMEGRABBER_OK) { - //printk("%s. invalid framesize\n",__func__); + //pr_info("%s. invalid framesize\n",__func__); return -EINVAL; } - //printk("%s...supportframesize width=%d height=%d..\n",__func__,width,height); //12 + //pr_info("%s...supportframesize width=%d height=%d..\n",__func__,width,height); //12 fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE; fsize->pixel_format=pixfmt->fourcc; fsize->discrete.width=width; @@ -485,7 +488,7 @@ int v4l2_model_ioctl_enum_framesizes(struct file *file, void *fh, struct v4l2_fr int v4l2_model_ioctl_enum_input(struct file *file, void *fh, struct v4l2_input *inp) { v4l2_model_context_t *v4l2m_context = video_drvdata(file); - printk("%s...\n",__func__); + pr_info("%s...\n",__func__); if (inp->index >= framegrabber_g_input_num(v4l2m_context->framegrabber_handle)) return -EINVAL; inp->type = V4L2_INPUT_TYPE_CAMERA; @@ -495,14 +498,14 @@ int v4l2_model_ioctl_enum_input(struct file *file, void *fh, struct v4l2_input * if(inp->index==framegrabber_g_input(v4l2m_context->framegrabber_handle)) { u32 input_status=framegrabber_g_input_status(v4l2m_context->framegrabber_handle); - //printk("%s..\n",__func__); + //pr_info("%s..\n",__func__); if(input_status == FRAMEGRABBER_INPUT_STATUS_OK) { - //printk("%s.FRAMEGRABBER_INPUT_STATUS_OK\n",__func__); + //pr_info("%s.FRAMEGRABBER_INPUT_STATUS_OK\n",__func__); inp->status=0; }else { - //printk("..%s..\n",__func__); + //pr_info("..%s..\n",__func__); if(input_status & FRAMEGRABBER_INPUT_STATUS_NO_POWER) inp->status |= V4L2_IN_ST_NO_POWER; @@ -514,7 +517,7 @@ int v4l2_model_ioctl_enum_input(struct file *file, void *fh, struct v4l2_input * } }else { - //printk("..%s.\n",__func__); + //pr_info("..%s.\n",__func__); inp->status |= V4L2_IN_ST_NO_POWER; } @@ -525,17 +528,17 @@ int v4l2_model_ioctl_g_input(struct file *file, void *fh, unsigned int *i) { v4l2_model_context_t *v4l2m_context = video_drvdata(file); *i=framegrabber_g_input(v4l2m_context->framegrabber_handle); - //printk("%s..input=%d.\n",__func__,*i); + //pr_info("%s..input=%d.\n",__func__,*i); return 0; } int v4l2_model_ioctl_s_input(struct file *file, void *fh, unsigned int i) { v4l2_model_context_t *v4l2m_context = video_drvdata(file); - //printk("%s...\n",__func__); + //pr_info("%s...\n",__func__); if(i < 0 || i > framegrabber_g_input_num(v4l2m_context->framegrabber_handle)) { - printk("..%s..\n",__func__); + pr_info("..%s..\n",__func__); return -EINVAL; } @@ -552,18 +555,18 @@ int v4l2_model_ioctl_enum_frameintervals(struct file *file, void *fh, struct v4l interlace_mode = framegrabber_g_input_interlace(v4l2m_context->framegrabber_handle); - //printk("%s...\n",__func__); + //pr_info("%s...\n",__func__); frameinterval=framegrabber_g_framesize_supportrefreshrate(v4l2m_context->framegrabber_handle,fival->width,fival->height,fival->index); if(frameinterval) { - //printk("%s..\n",__func__); + //pr_info("%s..\n",__func__); fival->type = V4L2_FRMIVAL_TYPE_DISCRETE; fival->discrete.numerator=1; fival->discrete.denominator=frameinterval; }else { - //printk("%s.\n",__func__); + //pr_info("%s.\n",__func__); if(fival->index==0) { //frameinterval = framegrabber_g_out_framerate(v4l2m_context->framegrabber_handle); @@ -584,7 +587,7 @@ int v4l2_model_ioctl_enum_frameintervals(struct file *file, void *fh, struct v4l if (interlace_mode) fival->discrete.denominator /=2; - //printk("%s.frameinterval =%d.fival->width=%d.fival->height=%d\n",__func__,frameinterval,fival->width,fival->height); + //pr_info("%s.frameinterval =%d.fival->width=%d.fival->height=%d\n",__func__,frameinterval,fival->width,fival->height); return 0; } @@ -592,29 +595,29 @@ int v4l2_model_ioctl_g_parm(struct file *file, void *fh,struct v4l2_streamparm * { v4l2_model_context_t *v4l2m_context = video_drvdata(file); //int current_denominator; - //printk("%s...\n",__func__); + //pr_info("%s...\n",__func__); if (a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) { - printk("%s..\n",__func__); + pr_info("%s..\n",__func__); return -EINVAL; } a->parm.capture.capability = V4L2_CAP_TIMEPERFRAME; a->parm.capture.capturemode = V4L2_MODE_HIGHQUALITY; a->parm.capture.timeperframe.numerator = 1; - //printk("%s>>>>>>>>>denominator=%d\n",__func__,a->parm.capture.timeperframe.denominator); + //pr_info("%s>>>>>>>>>denominator=%d\n",__func__,a->parm.capture.timeperframe.denominator); a->parm.capture.readbuffers = 1; //a->parm.capture.timeperframe.denominator = framegrabber_g_out_framerate(v4l2m_context->framegrabber_handle); - //printk("%s>>>>>>>>>denominator=%d\n",__func__,a->parm.capture.timeperframe.denominator); + //pr_info("%s>>>>>>>>>denominator=%d\n",__func__,a->parm.capture.timeperframe.denominator); if ((a->parm.capture.timeperframe.denominator ==0) || (a->parm.capture.timeperframe.denominator >60)) { a->parm.capture.timeperframe.denominator = framegrabber_g_input_framerate(v4l2m_context->framegrabber_handle); - //printk("%s..io_framerate=%d\n",__func__,a->parm.capture.timeperframe.denominator/a->parm.capture.timeperframe.numerator); + //pr_info("%s..io_framerate=%d\n",__func__,a->parm.capture.timeperframe.denominator/a->parm.capture.timeperframe.numerator); }else {// //framegrabbe_s_out_framerate(v4l2m_context->framegrabber_handle,a->parm.capture.timeperframe.denominator/a->parm.capture.timeperframe.numerator); - //printk("%s..in_framerate=%d\n",__func__,a->parm.capture.timeperframe.denominator/a->parm.capture.timeperframe.numerator); + //pr_info("%s..in_framerate=%d\n",__func__,a->parm.capture.timeperframe.denominator/a->parm.capture.timeperframe.numerator); } return 0; @@ -625,24 +628,24 @@ int v4l2_model_ioctl_s_parm(struct file *file, void *fh,struct v4l2_streamparm * v4l2_model_context_t *v4l2m_context = video_drvdata(file); U32_T io_frame_rate; U32_T in_frame_rate; - //printk("%s...a->parm.capture.timeperframe.denominator=%d\n",__func__,a->parm.capture.timeperframe.denominator); + //pr_info("%s...a->parm.capture.timeperframe.denominator=%d\n",__func__,a->parm.capture.timeperframe.denominator); io_frame_rate = a->parm.capture.timeperframe.denominator/a->parm.capture.timeperframe.numerator; in_frame_rate = framegrabber_g_input_framerate(v4l2m_context->framegrabber_handle); if ((io_frame_rate !=0) /*&& (io_frame_rate <=85)*/) { framegrabber_s_out_framerate(v4l2m_context->framegrabber_handle,io_frame_rate); //a->parm.capture.timeperframe.denominator = io_frame_rate; - printk("%s set io_framerate= %u\n", __func__, io_frame_rate); + pr_info("%s set io_framerate= %u\n", __func__, io_frame_rate); } else { framegrabber_s_out_framerate(v4l2m_context->framegrabber_handle,in_frame_rate); - printk("%s set in_framerate= %u\n", __func__, in_frame_rate); + pr_info("%s set in_framerate= %u\n", __func__, in_frame_rate); } //framegrabber_s_input_framerate(v4l2m_context->framegrabber_handle,a->parm.capture.timeperframe.denominator/a->parm.capture.timeperframe.numerator,a->parm.capture.timeperframe.denominator); //for test - //printk("%s..%d %d\n",__func__,a->parm.capture.timeperframe.denominator,a->parm.capture.timeperframe.numerator); + //pr_info("%s..%d %d\n",__func__,a->parm.capture.timeperframe.denominator,a->parm.capture.timeperframe.numerator); return 0; } @@ -656,7 +659,7 @@ int v4l2_model_ioctl_g_ctrl(struct file *file, void *fh,struct v4l2_control *a)/ //int BCHSinfo; int bchs_select=0; - //printk("%s...ctrl->id=%x\n",__func__,ctrl->id); + //pr_info("%s...ctrl->id=%x\n",__func__,ctrl->id); //bchs_select = ADV7619_BCHS_DISABLE; @@ -666,14 +669,14 @@ int v4l2_model_ioctl_g_ctrl(struct file *file, void *fh,struct v4l2_control *a)/ bchs_select = V4L2_BCHS_TYPE_BRIGHTNESS; //adv7619_get_bchs(v4l2m_context->adv7619_handle,&BCHSinfo,bchs_select); ctrl->value = framegrabber_g_input_bchs(v4l2m_context->framegrabber_handle,bchs_select); - printk("%s...brightness(%d)\n",__func__,ctrl->value); + pr_info("%s...brightness(%d)\n",__func__,ctrl->value); ret = 0; break; case V4L2_CID_CONTRAST: bchs_select = V4L2_BCHS_TYPE_CONTRAST; - printk("%s...contrast(%d)\n",__func__,bchs_select); + pr_info("%s...contrast(%d)\n",__func__,bchs_select); ctrl->value = framegrabber_g_input_bchs(v4l2m_context->framegrabber_handle,bchs_select); ret = 0; break; @@ -681,7 +684,7 @@ int v4l2_model_ioctl_g_ctrl(struct file *file, void *fh,struct v4l2_control *a)/ case V4L2_CID_SATURATION: bchs_select = V4L2_BCHS_TYPE_SATURATION; - printk("%s...saturation(%d)\n",__func__,bchs_select); + pr_info("%s...saturation(%d)\n",__func__,bchs_select); ctrl->value = framegrabber_g_input_bchs(v4l2m_context->framegrabber_handle,bchs_select); ret = 0; break; @@ -689,7 +692,7 @@ int v4l2_model_ioctl_g_ctrl(struct file *file, void *fh,struct v4l2_control *a)/ case V4L2_CID_HUE: bchs_select = V4L2_BCHS_TYPE_HUE; - printk("%s...hue(%d)\n",__func__,bchs_select); + pr_info("%s...hue(%d)\n",__func__,bchs_select); ctrl->value = framegrabber_g_input_bchs(v4l2m_context->framegrabber_handle,bchs_select); ret = 0; break; // @@ -708,7 +711,7 @@ int v4l2_model_ioctl_g_ctrl(struct file *file, void *fh,struct v4l2_control *a)/ else ctrl->value = 96000; - printk("%s...audio(%d)\n",__func__,ctrl->value); + pr_info("%s...audio(%d)\n",__func__,ctrl->value); break; #endif #if 0 @@ -719,12 +722,12 @@ int v4l2_model_ioctl_g_ctrl(struct file *file, void *fh,struct v4l2_control *a)/ ctrl->value =framegrabber_g_hdcp_state(v4l2m_context->framegrabber_handle); - printk("%s...hdcp flag(%d)\n",__func__,ctrl->value); + pr_info("%s...hdcp flag(%d)\n",__func__,ctrl->value); break; #endif default: ctrl->value =0; - printk("control id %d not handled\n", ctrl->id); + pr_info("control id %d not handled\n", ctrl->id); break; } @@ -734,7 +737,7 @@ int v4l2_model_ioctl_g_ctrl(struct file *file, void *fh,struct v4l2_control *a)/ ctrl->value = framegrabber_g_input_bchs(v4l2m_context->framegrabber_handle,&bchs_select); } #endif - //printk("%s...ctrl->value(%d)=%x\n",__func__,bchs_select,ctrl->value); + //pr_info("%s...ctrl->value(%d)=%x\n",__func__,bchs_select,ctrl->value); return ret; } @@ -749,7 +752,7 @@ int v4l2_model_ioctl_s_ctrl(struct file *file, void *fh,struct v4l2_control *a) // int io_bchs_value=0; // int io_bchs_select=0; - //printk("%s...\n",__func__); + //pr_info("%s...\n",__func__); if( found_ctrl ) { switch( found_ctrl->type ) { @@ -776,7 +779,7 @@ int v4l2_model_ioctl_s_ctrl(struct file *file, void *fh,struct v4l2_control *a) break; case V4L2_CID_AUTOGAIN: //framegrabber_s_hdcp_state(v4l2m_context->framegrabber_handle, ctrl->value); - printk("%s...hdcp state(%d)\n",__func__,ctrl->value); + pr_info("%s...hdcp state(%d)\n",__func__,ctrl->value); break; default: @@ -789,7 +792,7 @@ int v4l2_model_ioctl_s_ctrl(struct file *file, void *fh,struct v4l2_control *a) ret = 0; } else { //error - printk("control %s out of range\n", found_ctrl->name); + pr_info("control %s out of range\n", found_ctrl->name); } break; #if 0 @@ -801,7 +804,7 @@ int v4l2_model_ioctl_s_ctrl(struct file *file, void *fh,struct v4l2_control *a) #endif default: //error - printk("control type %d not handled\n", found_ctrl->type); + pr_info("control type %d not handled\n", found_ctrl->type); } } @@ -822,7 +825,7 @@ int v4l2_model_ioctl_queryctrl(struct file *file, void *fh,struct v4l2_queryctrl ctrl->flags = V4L2_CTRL_FLAG_DISABLED; } else { *ctrl = *found_ctrl; - printk("control %s\n", found_ctrl->name); + pr_info("control %s\n", found_ctrl->name); ret = 0; } @@ -837,7 +840,7 @@ int v4l2_model_ioctl_cropcap(struct file *file, void *fh,struct v4l2_cropcap *a) if (a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) { - printk("%s..\n",__func__); + pr_info("%s..\n",__func__); return -EINVAL; } @@ -871,7 +874,7 @@ int v4l2_model_ioctl_s_hdcp_state(struct file *file,unsigned int *arg) { v4l2_model_context_t *v4l2m_context = video_drvdata(file); int ret=0; - printk("ioctl set hdcp state:%d \n", *arg); + pr_info("ioctl set hdcp state:%d \n", *arg); framegrabber_s_hdcp_state(v4l2m_context->framegrabber_handle, *arg); return ret; } @@ -882,7 +885,7 @@ int v4l2_model_ioctl_g_flash(struct file *file,struct v4l2_dump_flash *flash_dum v4l2_model_context_t *v4l2m_context = video_drvdata(file); int ret=0; - printk("%s pad=%d, sb=%d, bs=%d\n", __func__, + pr_info("%s pad=%d, sb=%d, bs=%d\n", __func__, flash_dump->pad, flash_dump->start_block, flash_dump->blocks); ret = framegrabber_g_flash(v4l2m_context->framegrabber_handle, flash_dump->start_block, flash_dump->blocks, flash_dump->flash); @@ -895,7 +898,7 @@ int v4l2_model_ioctl_s_flash(struct file *file,struct v4l2_dump_flash *flash_upd v4l2_model_context_t *v4l2m_context = video_drvdata(file); int ret=0; - printk("%s pad=%d, sb=%d, bs=%d\n", __func__, + pr_info("%s pad=%d, sb=%d, bs=%d\n", __func__, flash_update->pad, flash_update->start_block, flash_update->blocks); #if 1 ret = framegrabber_s_flash(v4l2m_context->framegrabber_handle, flash_update->start_block, @@ -908,7 +911,7 @@ int v4l2_model_ioctl_s_flash(struct file *file,struct v4l2_dump_flash *flash_upd int v4l2_model_ioctl_s_dv_timings(struct file *file, void *fd, struct v4l2_dv_timings *timings) { - printk("%s...\n", __func__); + pr_info("%s...\n", __func__); return 0; } @@ -916,49 +919,49 @@ int v4l2_model_ioctl_s_dv_timings(struct file *file, void *fd, int v4l2_model_ioctl_g_dv_timings(struct file *file, void *fd, struct v4l2_dv_timings *timings) { - printk("%s...\n", __func__); + pr_info("%s...\n", __func__); return 0; } int v4l2_model_ioctl_enum_std(struct file *file, void *fd, struct v4l2_standard *std) { - printk("%s...\n",__func__); + pr_info("%s...\n",__func__); return -EINVAL; } int v4l2_model_ioctl_s_std(struct file *file, void *fd, v4l2_std_id std) { - printk("%s...\n",__func__); + pr_info("%s...\n",__func__); return 0; } int v4l2_model_ioctl_g_std(struct file *file, void *fd, v4l2_std_id *std) { - printk("%s...\n",__func__); + pr_info("%s...\n",__func__); return 0; } int v4l2_model_ioctl_querystd(struct file *file, void *fd, v4l2_std_id *std) { - printk("%s...\n",__func__); + pr_info("%s...\n",__func__); return 0; } int v4l2_model_g_tuner(struct file *file, void *fd, struct v4l2_tuner *tuner) { - printk("%s...\n",__func__); + pr_info("%s...\n",__func__); return 0; } int v4l2_model_s_tuner(struct file *file, void *fd, const struct v4l2_tuner *tuner) { - printk("%s...\n",__func__); + pr_info("%s...\n",__func__); return 0; } diff --git a/driver/utils/v4l2/v4l2_model_table.c b/driver/utils/v4l2/v4l2_model_table.c index 7c0c3a1..9a384e6 100644 --- a/driver/utils/v4l2/v4l2_model_table.c +++ b/driver/utils/v4l2/v4l2_model_table.c @@ -9,6 +9,9 @@ * Version: * ================================================================= */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " "%s, %d: " fmt, __func__, __LINE__ + #include "typedef.h" #include #include diff --git a/driver/utils/v4l2/v4l2_model_videobuf2.c b/driver/utils/v4l2/v4l2_model_videobuf2.c index 128f76b..a1b175d 100644 --- a/driver/utils/v4l2/v4l2_model_videobuf2.c +++ b/driver/utils/v4l2/v4l2_model_videobuf2.c @@ -9,6 +9,9 @@ * Version: * ================================================================= */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " "%s, %d: " fmt, __func__, __LINE__ + #include "typedef.h" #include #include @@ -113,7 +116,7 @@ static int v4l2_model_qops_queue_setup(struct vb2_queue *q, framegrabber_g_max_framebuffersize(v4l2m_context-> framegrabber_handle); framegrabber_g_out_framesize(v4l2m_context->framegrabber_handle, &width, &height); //test - printk("%s framebufsize %u, width %d, height %d\n", __func__, + pr_info("%s framebufsize %u, width %d, height %d\n", __func__, framebufsize, width, height); //if (framebufsize == 0) { @@ -126,7 +129,7 @@ static int v4l2_model_qops_queue_setup(struct vb2_queue *q, framegrabber_g_out_bytesperline(v4l2m_context-> framegrabber_handle); framebufsize = bytesperline * height; - printk("%s >>> framebufsize %u, width %d, height %d\n", + pr_info("%s >>> framebufsize %u, width %d, height %d\n", __func__, framebufsize, width, height); } @@ -138,12 +141,12 @@ static int v4l2_model_qops_queue_setup(struct vb2_queue *q, framebufsize = framegrabber_g_max_framebuffersize(v4l2m_context-> framegrabber_handle); - printk("===============================================\n"); - printk("debug framebufsize %u, width %d, height %d\n", + pr_info("===============================================\n"); + pr_info("debug framebufsize %u, width %d, height %d\n", framebufsize, width, height); } - //printk("%s framebufsize %u, width %d, height %d\n", __func__, + //pr_info("%s framebufsize %u, width %d, height %d\n", __func__, // framebufsize, width, height); if (v4l2m_context->pic_bmp_handle) @@ -170,7 +173,7 @@ static int v4l2_model_qops_queue_setup(struct vb2_queue *q, *num_buffers; callback_item->callback(&callback_item->data); } - printk("%s >>>>>\n", __func__); + pr_info("%s >>>>>\n", __func__); return 0; } @@ -194,7 +197,7 @@ static int v4l2_model_qops_buf_init(struct vb2_buffer *vb) v4l2m_context->inibuffer_create++; - //printk("==%s vb %p ; buffer create++=%d\n", __func__, vb, v4l2m_context->inibuffer_create); + //pr_info("==%s vb %p ; buffer create++=%d\n", __func__, vb, v4l2m_context->inibuffer_create); if (callback_item->callback) { v4l2_model_callback_parameter_t *parm = &callback_item->data; @@ -224,7 +227,7 @@ static int v4l2_model_qops_buf_prepare(struct vb2_buffer *vb) int width, height; int buffer_size = 0; -// printk("%s >>>>>\n",__func__); +// pr_info("%s >>>>>\n",__func__); framegrabber_g_out_framesize(v4l2m_context->framegrabber_handle, &width, &height); pixfmt = @@ -236,7 +239,7 @@ static int v4l2_model_qops_buf_prepare(struct vb2_buffer *vb) v4l2_model_buffer_info_t *buffer_info = &v4l2_buf->buffer_info; switch (vb2_cxt->queue_type) { case V4L2_MODEL_BUF_TYPE_VMALLOC: -// printk("%s >>>>> V4L2_MODEL_BUF_TYPE_VMALLOC\n",__func__); +// pr_info("%s >>>>> V4L2_MODEL_BUF_TYPE_VMALLOC\n",__func__); buffer_info->buf_count[i] = 1; v4l2_buf->buf_descs[i] = kzalloc(sizeof(v4l2_model_buf_desc_t) * @@ -258,13 +261,13 @@ static int v4l2_model_qops_buf_prepare(struct vb2_buffer *vb) struct scatterlist *sg; int j; -// printk("%s >>>>> V4L2_MODEL_BUF_TYPE_DMA_SG\n",__func__); +// pr_info("%s >>>>> V4L2_MODEL_BUF_TYPE_DMA_SG\n",__func__); buffer_info->buf_count[i] = sgt->nents; if (v4l2m_context->inibuffer_index != 0) { - printk("%s >>>>>\n",__func__); + pr_info("%s >>>>>\n",__func__); v4l2_buf->buf_descs[i] = kzalloc(sizeof(v4l2_model_buf_desc_t) * buffer_info->buf_count[i],GFP_KERNEL); @@ -275,7 +278,7 @@ static int v4l2_model_qops_buf_prepare(struct vb2_buffer *vb) if (!dma_map_sg (v4l2m_context->dev, sgt->sgl, sgt->nents, DMA_FROM_DEVICE)) - printk("error dma_map_sg\n"); + pr_err("error dma_map_sg\n"); #endif for_each_sg(sgt->sgl, sg, sgt->nents, j) { @@ -294,7 +297,7 @@ static int v4l2_model_qops_buf_prepare(struct vb2_buffer *vb) } break; case V4L2_MODEL_BUF_TYPE_DMA_CONT: -// printk("%s >>>>> V4L2_MODEL_BUF_TYPE_DMA_CONT\n",__func__); +// pr_info("%s >>>>> V4L2_MODEL_BUF_TYPE_DMA_CONT\n",__func__); v4l2_buf->buffer_info.buf_count[i] = 1; v4l2_buf->buf_descs[i] = kzalloc(sizeof(v4l2_model_buf_desc_t) * @@ -317,8 +320,8 @@ static int v4l2_model_qops_buf_prepare(struct vb2_buffer *vb) } -// printk("%s >>>>> %dx%d %dbit\n", __func__, width, height, pixfmt->depth); -// printk("%s >>>>> buffer size = %d\n", __func__, buffer_size); +// pr_info("%s >>>>> %dx%d %dbit\n", __func__, width, height, pixfmt->depth); +// pr_info("%s >>>>> buffer size = %d\n", __func__, buffer_size); if (callback_item->callback) { v4l2_model_callback_parameter_t *parm = &callback_item->data; @@ -343,7 +346,7 @@ static void v4l2_model_qops_buf_cleanup(struct vb2_buffer *vb) container_of(vb, v4l2_model_vb2_buffer_t, vb); #endif int i; - printk("=====================%s vb %p \n", __func__, vb); + pr_info("=====================%s vb %p \n", __func__, vb); //return; //rr3 @@ -387,7 +390,7 @@ static void v4l2_model_qops_buf_finish(struct vb2_buffer *vb) //v4l2_model_vb2_context_t *vb2_context=(v4l2_model_vb2_context_t *)v4l2m_context->vb2_context; v4l2_model_callback_item_t *callback_item = &v4l2m_context->callbacks[V4L2_MODEL_CALLBACK_BUFFER_FINISH]; - //printk("%s vb %p \n", __func__, vb); + //pr_info("%s vb %p \n", __func__, vb); if (callback_item->callback) { callback_item->callback(&callback_item->data); @@ -407,7 +410,7 @@ static int v4l2_model_qops_start_streaming(struct vb2_queue *q, (v4l2_model_vb2_context_t *) v4l2m_context->vb2_context; v4l2_model_callback_item_t *callback_item = &v4l2m_context->callbacks[V4L2_MODEL_CALLBACK_STREAMON]; - printk("%s...\n", __func__); + pr_info("%s...\n", __func__); if (callback_item->callback) { callback_item->callback(&callback_item->data); } @@ -439,11 +442,11 @@ static void v4l2_model_qops_stop_streaming(struct vb2_queue *q) callback_item->callback(&callback_item->data); } if (list_empty(&vb2_context->buffer_list)) { - printk("%s vb2_context->buffer_list empty\n", __func__); + pr_info("%s vb2_context->buffer_list empty\n", __func__); } else { v4l2_model_queue_cancel(v4l2m_context); - printk("%s...\n", __func__); + pr_info("%s...\n", __func__); } // v4l2m_context->current_framebuf_info.vbuf_info=NULL; // v4l2m_context->current_framebuf_info.rcv_size=0; @@ -477,7 +480,7 @@ static void v4l2_model_qops_buf_queue(struct vb2_buffer *vb) #endif v4l2_model_vb2_context_t *vb2_context = v4l2m_context->vb2_context; - //printk("%s vb %p\n",__func__,vb); + //pr_info("%s vb %p\n",__func__,vb); spin_lock_irqsave(&vb2_context->queuelock, flags); list_add_tail(&v4l2_model_buffer->list, &vb2_context->buffer_list); spin_unlock_irqrestore(&vb2_context->queuelock, flags); @@ -561,7 +564,7 @@ void *v4l2_model_vb2_init(struct vb2_queue *q, v4l2_model_devicetype_t dev_type, vb2_context->alloc_ctx = vb2_dma_contig_init_ctx(dev); if (!vb2_context->alloc_ctx) { - printk("vb2_dma_contig_init_ctx fail\n"); + pr_err("vb2_dma_contig_init_ctx fail\n"); kfree(vb2_context); return NULL; } @@ -578,7 +581,7 @@ void *v4l2_model_vb2_init(struct vb2_queue *q, v4l2_model_devicetype_t dev_type, vb2_context->alloc_ctx = vb2_dma_sg_init_ctx(dev); if (!vb2_context->alloc_ctx) { - printk("vb2_dma_sg_init_ctx fail\n"); + pr_err("vb2_dma_sg_init_ctx fail\n"); kfree(vb2_context); return NULL; } @@ -595,7 +598,7 @@ void *v4l2_model_vb2_init(struct vb2_queue *q, v4l2_model_devicetype_t dev_type, rc = vb2_queue_init(q); if (rc) { - printk("%s vb2 queue init failed\n", __func__); + pr_err("%s vb2 queue init failed\n", __func__); kfree(vb2_context); return NULL; } @@ -615,7 +618,7 @@ void v4l2_model_vb2_release(void *context) switch (vb2_context->queue_type) { case V4L2_MODEL_BUF_TYPE_VMALLOC: - printk("%s vmalloc should not have alloc_cxt \n", __func__); + pr_info("%s vmalloc should not have alloc_cxt \n", __func__); break; case V4L2_MODEL_BUF_TYPE_DMA_CONT: vb2_dma_contig_cleanup_ctx(vb2_context->alloc_ctx); @@ -642,7 +645,7 @@ void v4l2_model_queue_cancel(void *context) (v4l2_model_vb2_context_t *) v4l2m_context->vb2_context; v4l2_model_vb2_buffer_t *buf; framegrabber_status_bitmask_e framegrabber_status; - printk("%s\n", __func__); + pr_info("%s\n", __func__); //spin_lock_irqsave(&vb2_context->queuelock, flags); while (!list_empty(&vb2_context->buffer_list)) { struct vb2_buffer *vb; @@ -655,7 +658,7 @@ void v4l2_model_queue_cancel(void *context) #else vb = &buf->vb; #endif - //printk("%s vb %p done\n",__func__,vb); + //pr_info("%s vb %p done\n",__func__,vb); list_del_init(&buf->list); framegrabber_status = framegrabber_g_status(v4l2m_context->framegrabber_handle); @@ -668,14 +671,14 @@ void v4l2_model_queue_cancel(void *context) vb2_buffer_done(vb, VB2_BUF_STATE_DONE); } else { - printk("%s framegrabber_status %08x\n", __func__, + pr_info("%s framegrabber_status %08x\n", __func__, framegrabber_status); vb2_buffer_done(vb, VB2_BUF_STATE_ERROR); } } //spin_unlock_irqrestore(&vb2_context->queuelock, flags); - printk("%s done\n", __func__); + pr_info("%s done\n", __func__); } void v4l2_model_next_buffer(v4l2_model_handle_t context, @@ -690,7 +693,7 @@ void v4l2_model_next_buffer(v4l2_model_handle_t context, spin_lock_irqsave(&vb2_context->queuelock, flags); if (list_empty(&vb2_context->buffer_list)) { - //printk("%s vb2 queue is empty\n", __func__); + //pr_info("%s vb2 queue is empty\n", __func__); *buffer_info = NULL; spin_unlock_irqrestore(&vb2_context->queuelock, flags); return; @@ -702,7 +705,7 @@ void v4l2_model_next_buffer(v4l2_model_handle_t context, spin_unlock_irqrestore(&vb2_context->queuelock, flags); //vb= &next_buffer->vb; - //printk("%s vb %p\n",__func__,vb); + //pr_info("%s vb %p\n",__func__,vb); *buffer_info = &next_buffer->buffer_info; } @@ -734,7 +737,7 @@ void v4l2_model_buffer_done(v4l2_model_handle_t context) spin_unlock_irqrestore(&vb2_context->queuelock, flags); if (!buf) { - printk("%s no buffer to serve\n", __func__); + pr_info("%s no buffer to serve\n", __func__); return; } #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,5,0) @@ -782,20 +785,20 @@ void v4l2_model_buffer_done(v4l2_model_handle_t context) int width, height; framegrabber_g_out_framesize(v4l2m_context->framegrabber_handle, &width, &height); load_no_signal_image(v4l2m_context->pic_bmp_handle, vb2_context->image_data, width, height); - printk("load no signal done\n"); + pr_info("load no signal done\n"); } else if (type == V4L2_MODEL_VB2_IMAGE_COPY_PROTECTION) { int width, height; framegrabber_g_out_framesize(v4l2m_context->framegrabber_handle, &width, &height); load_copy_protection_image(v4l2m_context->pic_bmp_handle, vb2_context->image_data, width, height); - printk("load copy protection done\n"); + pr_info("load copy protection done\n"); } vb2_context->image_type = type; } ptr = vb2_context->image_data; - //printk(".\n"); + //pr_info(".\n"); } if (ptr) @@ -829,7 +832,7 @@ void v4l2_model_buffer_done(v4l2_model_handle_t context) FRAMEGRABBER_STATUS_SIGNAL_LOCKED_BIT)) { vb2_buffer_done(vb, VB2_BUF_STATE_DONE); } else { - //printk("%s framegrabber_status %08x\n", __func__, framegrabber_status); + //pr_info("%s framegrabber_status %08x\n", __func__, framegrabber_status); vb2_buffer_done(vb, VB2_BUF_STATE_ERROR); } } @@ -849,14 +852,14 @@ void v4l2_model_feed_video_data(v4l2_model_handle_t context, void *buffer, SIZE_ framebuffer_info_t *pframebuf_info; //unsigned line; int width, height; - //printk("%s %p %p size %ld\n",__func__,context,buffer,size); + //pr_info("%s %p %p size %ld\n",__func__,context,buffer,size); if (v4l2m_cxt) { pframebuf_info = &v4l2m_cxt->current_framebuf_info; if (!pframebuf_info->vbuf_info) { v4l2_model_next_buffer(v4l2m_cxt, &pframebuf_info->vbuf_info); - //printk("framebuf change to %p\n",pframebuf_info->vbuf_info->plane_vaddr[0]); + //pr_info("framebuf change to %p\n",pframebuf_info->vbuf_info->plane_vaddr[0]); } framegrabber_g_input_framesize(v4l2m_cxt->framegrabber_handle, @@ -891,7 +894,7 @@ void v4l2_model_feed_video_data(v4l2_model_handle_t context, void *buffer, SIZE_ memcpy(lb,b,s);\ }else \ { \ - printk("copy may out of framebuf size %u offset %lu size %lu !\n",framebuf_size,(unsigned long)(lb-framebuf),(unsigned long)s) ;\ + pr_info("copy may out of framebuf size %u offset %lu size %lu !\n",framebuf_size,(unsigned long)(lb-framebuf),(unsigned long)s) ;\ }\ } @@ -921,7 +924,7 @@ void v4l2_model_feed_video_data(v4l2_model_handle_t context, void *buffer, SIZE_ if (framemode == FRAMEGRABBER_FRAMEMODE_PROGRESS) { - //printk("Progress line %d offset %d\n",line,line_stride*line); + //pr_info("Progress line %d offset %d\n",line,line_stride*line); linebuf = &framebuf[line_stride * line]; } else if (framemode == FRAMEGRABBER_FRAMEMODE_INTERLACED) { @@ -937,10 +940,10 @@ void v4l2_model_feed_video_data(v4l2_model_handle_t context, void *buffer, SIZE_ line]; } - //printk("Interlace line %d offset %d\n",line,bytesperline+line_stride*line); + //pr_info("Interlace line %d offset %d\n",line,bytesperline+line_stride*line); } - //printk("%dx%dx%d rcv_size %d line %d offset %d line_stride %d bytesperline %d\n",width,height,pix_size,pframebuf_info->rcv_size,line,offset,line_stride,bytesperline); + //pr_info("%dx%dx%d rcv_size %d line %d offset %d line_stride %d bytesperline %d\n",width,height,pix_size,pframebuf_info->rcv_size,line,offset,line_stride,bytesperline); frame_remain_size = (width * height * pix_size) - pframebuf_info->rcv_size; @@ -950,7 +953,7 @@ void v4l2_model_feed_video_data(v4l2_model_handle_t context, void *buffer, SIZE_ copy_size = remain_size; copy_to_framebuffer(&linebuf[offset], buf, copy_size); - //printk("memcpy offset %d size %d\n",offset,copy_size); + //pr_info("memcpy offset %d size %d\n",offset,copy_size); buf += copy_size; frame_remain_size -= copy_size; remain_size -= copy_size; @@ -958,12 +961,12 @@ void v4l2_model_feed_video_data(v4l2_model_handle_t context, void *buffer, SIZE_ linebuf += line_stride; } do { - //printk("remain_size %d frame_remain_size %d\n",remain_size,frame_remain_size); + //pr_info("remain_size %d frame_remain_size %d\n",remain_size,frame_remain_size); if (frame_remain_size > remain_size) { copy_size = (width * pix_size); while (remain_size >= copy_size) { - //printk("%d memcpy %ld(%d) size %d\n",__LINE__,linebuf-framebuf,(linebuf-framebuf)/bytesperline,copy_size); + //pr_info("%d memcpy %ld(%d) size %d\n",__LINE__,linebuf-framebuf,(linebuf-framebuf)/bytesperline,copy_size); copy_to_framebuffer (linebuf, buf, copy_size); @@ -993,7 +996,7 @@ void v4l2_model_feed_video_data(v4l2_model_handle_t context, void *buffer, SIZE_ } if (remain_size) { - //printk("%d memcpy %ld(%d) size %d\n",__LINE__,linebuf-framebuf,(linebuf-framebuf)/bytesperline,remain_size); + //pr_info("%d memcpy %ld(%d) size %d\n",__LINE__,linebuf-framebuf,(linebuf-framebuf)/bytesperline,remain_size); copy_to_framebuffer (linebuf, buf, remain_size); @@ -1009,7 +1012,7 @@ void v4l2_model_feed_video_data(v4l2_model_handle_t context, void *buffer, SIZE_ frame_remain_size; while (frame_remain_size >= copy_size) { - //printk("%d memcpy %ld(%d) size %d\n",__LINE__,linebuf-framebuf,(linebuf-framebuf)/bytesperline,copy_size); + //pr_info("%d memcpy %ld(%d) size %d\n",__LINE__,linebuf-framebuf,(linebuf-framebuf)/bytesperline,copy_size); copy_to_framebuffer (linebuf, buf, copy_size); @@ -1039,7 +1042,7 @@ void v4l2_model_feed_video_data(v4l2_model_handle_t context, void *buffer, SIZE_ } if (frame_remain_size) { - //printk("%d memcpy %ld(%d) size %d\n",__LINE__,linebuf-framebuf,(linebuf-framebuf)/bytesperline,remain_size); + //pr_info("%d memcpy %ld(%d) size %d\n",__LINE__,linebuf-framebuf,(linebuf-framebuf)/bytesperline,remain_size); copy_to_framebuffer (linebuf, buf, remain_size); @@ -1061,7 +1064,7 @@ void v4l2_model_feed_video_data(v4l2_model_handle_t context, void *buffer, SIZE_ vbuf_info); if (pframebuf_info-> vbuf_info == NULL) { - printk + pr_info ("No video buffer to receive\n"); break; } else { @@ -1074,7 +1077,7 @@ void v4l2_model_feed_video_data(v4l2_model_handle_t context, void *buffer, SIZE_ vbuf_info-> buf_info [0]->addr; - //printk("framebuf change to %p\n",framebuf); + //pr_info("framebuf change to %p\n",framebuf); linebuf = framebuf; frame_remain_size @@ -1100,7 +1103,7 @@ void v4l2_model_streamoff(v4l2_model_handle_t context) { v4l2_model_context_t *v4l2m_context = (v4l2_model_context_t *) context; - printk("%s\n", __func__); + pr_info("%s\n", __func__); vb2_streamoff(&v4l2m_context->queue, V4L2_BUF_TYPE_VIDEO_CAPTURE); From ce70873451e99cb0ecf0245ba0ccbbc94d9db7bd Mon Sep 17 00:00:00 2001 From: cdorn Date: Sat, 20 Mar 2021 19:46:49 +0100 Subject: [PATCH 14/23] Removed function printk spamming --- driver/utils/alsa/alsa.c | 10 --------- driver/utils/trace/trace.c | 2 -- driver/utils/v4l2/v4l2_model_ioctl.c | 32 ++++++++++++++-------------- 3 files changed, 16 insertions(+), 28 deletions(-) diff --git a/driver/utils/alsa/alsa.c b/driver/utils/alsa/alsa.c index be64954..ecad24f 100644 --- a/driver/utils/alsa/alsa.c +++ b/driver/utils/alsa/alsa.c @@ -212,8 +212,6 @@ static int snd_sagitta_pcm_open(struct snd_pcm_substream *substream) struct sagitta_snd_dev *sdev = snd_pcm_substream_chip(substream); struct snd_pcm_runtime *runtime = substream->runtime; - pr_info("%s\n", __func__); - sdev->substream = substream; runtime->hw = snd_sagitta_hw; snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); @@ -227,8 +225,6 @@ static int snd_sagitta_pcm_close(struct snd_pcm_substream *substream) { struct sagitta_snd_dev *sdev = snd_pcm_substream_chip(substream); - pr_info("%s\n", __func__); - sdev->substream = NULL; return 0; @@ -305,8 +301,6 @@ static int snd_sagitta_card_trigger(struct snd_pcm_substream *substream, { struct sagitta_snd_dev *sdev = snd_pcm_substream_chip(substream); - pr_info("%s\n", __func__); - switch(cmd) { case SNDRV_PCM_TRIGGER_START: @@ -357,8 +351,6 @@ static int snd_sagitta_pcm(struct sagitta_snd_dev *dev, struct snd_pcm *pcm; int err; - pr_info("%s\n", __func__); - err = snd_pcm_new(dev->card, name, device_idx, 0, 1, &pcm); if(err < 0) return err; @@ -379,7 +371,6 @@ static struct sagitta_snd_dev *audio_dev_register(struct sagitta_dev *sdev) int err; - pr_info("%s\n", __func__); #if 0 snd_dev = kmalloc(sizeof(struct sagitta_snd_dev), GFP_KERNEL); if(!snd_dev) { @@ -479,7 +470,6 @@ static void alsa_disconnect(struct sagitta_module *module, struct sagitta_dev *s //struct sagitta_snd_dev *ssdev = (struct sagitta_snd_dev *) sagitta_virtdev_getdata(svdev); struct sagitta_snd_dev *ssdev = (struct sagitta_snd_dev *)alsa_mod->context; - pr_info("%s\n", __func__); //sagitta_trace(module, "%s\n", __func__); diff --git a/driver/utils/trace/trace.c b/driver/utils/trace/trace.c index e1628fd..f83d870 100644 --- a/driver/utils/trace/trace.c +++ b/driver/utils/trace/trace.c @@ -238,8 +238,6 @@ static void trace_model_release(void *cxt) { trace_context_t *trace_cxt = cxt; - pr_info("%s\n", __func__); - if (trace_cxt) { uninit_debug(); diff --git a/driver/utils/v4l2/v4l2_model_ioctl.c b/driver/utils/v4l2/v4l2_model_ioctl.c index ac5a9de..88be19e 100644 --- a/driver/utils/v4l2/v4l2_model_ioctl.c +++ b/driver/utils/v4l2/v4l2_model_ioctl.c @@ -226,7 +226,7 @@ int v4l2_model_ioctl_querycap(struct file *file, void *fh, struct v4l2_capabilit { v4l2_model_context_t *v4l2m_context = video_drvdata(file); - //pr_info("%s...\n",__func__); + if(v4l2m_context) { @@ -256,7 +256,7 @@ int v4l2_model_ioctl_enum_fmt_vid_cap(struct file *file, void *fh, struct v4l2_f v4l2_model_context_t *v4l2m_context = video_drvdata(file); U32_T index = f->index; - //pr_info("%s...\n",__func__); + if(f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) { pr_info("%s.\n",__func__); @@ -309,7 +309,7 @@ int v4l2_model_ioctl_g_fmt_vid_cap(struct file *file, void *fh,struct v4l2_forma { int width,height; //unsigned bytesperline; - //pr_info("%s...\n",__func__); + framegrabber_g_input_framesize(v4l2m_context->framegrabber_handle,&width,&height); //bytesperline=framegrabber_g_out_bytesperline(v4l2m_context->framegrabber_handle); //pr_info("%s..f->fmt.pix.width=%d.f->fmt.pix.height=%d.\n",__func__,f->fmt.pix.width,f->fmt.pix.height); @@ -432,7 +432,7 @@ int v4l2_model_ioctl_s_fmt_vid_cap(struct file *file, void *fh,struct v4l2_forma /* TODO check setting format is supported */ - //pr_info("%s...\n",__func__); + if(framegrabber_g_support_pixelfmt_by_fourcc(v4l2m_context->framegrabber_handle,f->fmt.pix.pixelformat)==NULL) { @@ -457,7 +457,7 @@ int v4l2_model_ioctl_enum_framesizes(struct file *file, void *fh, struct v4l2_fr const framegrabber_pixfmt_t *pixfmt; int width=0,height=0; - //pr_info("%s...\n",__func__); + pixfmt=framegrabber_g_support_pixelfmt_by_fourcc(v4l2m_context->framegrabber_handle,fsize->pixel_format); //pr_info("%s %08x %p\n",__func__,fsize->pixel_format,pixfmt); if(pixfmt==NULL) @@ -488,7 +488,7 @@ int v4l2_model_ioctl_enum_framesizes(struct file *file, void *fh, struct v4l2_fr int v4l2_model_ioctl_enum_input(struct file *file, void *fh, struct v4l2_input *inp) { v4l2_model_context_t *v4l2m_context = video_drvdata(file); - pr_info("%s...\n",__func__); + if (inp->index >= framegrabber_g_input_num(v4l2m_context->framegrabber_handle)) return -EINVAL; inp->type = V4L2_INPUT_TYPE_CAMERA; @@ -535,7 +535,7 @@ int v4l2_model_ioctl_g_input(struct file *file, void *fh, unsigned int *i) int v4l2_model_ioctl_s_input(struct file *file, void *fh, unsigned int i) { v4l2_model_context_t *v4l2m_context = video_drvdata(file); - //pr_info("%s...\n",__func__); + if(i < 0 || i > framegrabber_g_input_num(v4l2m_context->framegrabber_handle)) { pr_info("..%s..\n",__func__); @@ -555,7 +555,7 @@ int v4l2_model_ioctl_enum_frameintervals(struct file *file, void *fh, struct v4l interlace_mode = framegrabber_g_input_interlace(v4l2m_context->framegrabber_handle); - //pr_info("%s...\n",__func__); + frameinterval=framegrabber_g_framesize_supportrefreshrate(v4l2m_context->framegrabber_handle,fival->width,fival->height,fival->index); if(frameinterval) @@ -595,7 +595,7 @@ int v4l2_model_ioctl_g_parm(struct file *file, void *fh,struct v4l2_streamparm * { v4l2_model_context_t *v4l2m_context = video_drvdata(file); //int current_denominator; - //pr_info("%s...\n",__func__); + if (a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) { pr_info("%s..\n",__func__); @@ -752,7 +752,7 @@ int v4l2_model_ioctl_s_ctrl(struct file *file, void *fh,struct v4l2_control *a) // int io_bchs_value=0; // int io_bchs_select=0; - //pr_info("%s...\n",__func__); + if( found_ctrl ) { switch( found_ctrl->type ) { @@ -926,42 +926,42 @@ int v4l2_model_ioctl_g_dv_timings(struct file *file, void *fd, int v4l2_model_ioctl_enum_std(struct file *file, void *fd, struct v4l2_standard *std) { - pr_info("%s...\n",__func__); + return -EINVAL; } int v4l2_model_ioctl_s_std(struct file *file, void *fd, v4l2_std_id std) { - pr_info("%s...\n",__func__); + return 0; } int v4l2_model_ioctl_g_std(struct file *file, void *fd, v4l2_std_id *std) { - pr_info("%s...\n",__func__); + return 0; } int v4l2_model_ioctl_querystd(struct file *file, void *fd, v4l2_std_id *std) { - pr_info("%s...\n",__func__); + return 0; } int v4l2_model_g_tuner(struct file *file, void *fd, struct v4l2_tuner *tuner) { - pr_info("%s...\n",__func__); + return 0; } int v4l2_model_s_tuner(struct file *file, void *fd, const struct v4l2_tuner *tuner) { - pr_info("%s...\n",__func__); + return 0; } From 3f5b465e5bf05f841b6d20080996b4fdf06ca010 Mon Sep 17 00:00:00 2001 From: cdorn Date: Sat, 20 Mar 2021 19:58:29 +0100 Subject: [PATCH 15/23] fixed warnings/ignore variable length array warning --- driver/Makefile | 2 +- driver/board/gc573/board_config.c | 3 +++ driver/board/gc573/board_v4l2.c | 6 +++--- driver/utils/alsa/alsa_model.c | 2 ++ driver/utils/misc/sys.c | 4 +--- driver/utils/pci/pci_model.c | 2 ++ driver/utils/trace/trace.c | 1 + driver/utils/v4l2/v4l2_model_device.c | 3 +++ 8 files changed, 16 insertions(+), 7 deletions(-) diff --git a/driver/Makefile b/driver/Makefile index 52671e3..9a09f80 100644 --- a/driver/Makefile +++ b/driver/Makefile @@ -55,7 +55,7 @@ $(MODULE_NAME)-objs += $(lib_objs) #$(call add_cflags, $(MODULE_NAME)-objs, common-include) -fno-common -EXTRA_CFLAGS += $(common-include) -Wno-maybe-uninitialized +EXTRA_CFLAGS += -Wno-vla -Wno-declaration-after-statement $(common-include) -Wno-maybe-uninitialized EXTRA_LDFLAGS += --whole-archive obj-m += $(MODULE_NAME).o diff --git a/driver/board/gc573/board_config.c b/driver/board/gc573/board_config.c index ccc32a3..8883ac3 100644 --- a/driver/board/gc573/board_config.c +++ b/driver/board/gc573/board_config.c @@ -206,10 +206,13 @@ int board_probe(struct device *dev,unsigned long driver_info) { case ERROR_AVER_XILINX: cxt_manager_unref_context(i2c_mgr); + // fall through case ERROR_I2C_MGR: cxt_manager_unref_context(gpio_mgr); + // fall through case ERROR_GPIO_MGR: cxt_manager_unref_context(trace_handle); + // fall through case ERROR_TRACE_HANDLE: case NO_PCI_HANDLE: diff --git a/driver/board/gc573/board_v4l2.c b/driver/board/gc573/board_v4l2.c index fc32c36..baa7a0f 100644 --- a/driver/board/gc573/board_v4l2.c +++ b/driver/board/gc573/board_v4l2.c @@ -209,7 +209,7 @@ static void gc573_stream_on(framegrabber_handle_t handle) //ite6805_get_hdcp_state(ite6805_handle, &hdcp_state); //ite6805_set_hdcp_state(ite6805_handle, hdcp_state); - enum ite6805_audio_sample fe_audioinfo=0; +// enum ite6805_audio_sample fe_audioinfo=0; ite6805_frameinfo_t *fe_frameinfo=&board_v4l2_cxt->cur_fe_frameinfo; //aver_xilinx_frame_info_t detected_frameinfo; @@ -375,7 +375,7 @@ static void gc573_stream_off(framegrabber_handle_t handle) static int gc573_flash_dump(framegrabber_handle_t handle,int start_block, int blocks, U8_T *flash_dump) // { - board_v4l2_context_t *board_v4l2_cxt=framegrabber_get_data(handle); +// board_v4l2_context_t *board_v4l2_cxt=framegrabber_get_data(handle); //char version[10]; int ret=0; @@ -386,7 +386,7 @@ static int gc573_flash_dump(framegrabber_handle_t handle,int start_block, int bl static int gc573_flash_update(framegrabber_handle_t handle,int start_block, int blocks, U8_T *flash_update) { - board_v4l2_context_t *board_v4l2_cxt=framegrabber_get_data(handle); +// board_v4l2_context_t *board_v4l2_cxt=framegrabber_get_data(handle); //char version[10]; int ret=0; diff --git a/driver/utils/alsa/alsa_model.c b/driver/utils/alsa/alsa_model.c index bb88ce7..e277bac 100644 --- a/driver/utils/alsa/alsa_model.c +++ b/driver/utils/alsa/alsa_model.c @@ -622,8 +622,10 @@ alsa_model_handle_t alsa_model_init(cxt_mgr_handle_t cxt_mgr, alsa_model_setup_t case ALSA_MODEL_REGISTER_SND_CARD_ERROR: case ALSA_MODEL_CREATE_PCM_ERR: snd_card_free(card); + // fall through case ALSA_MODEL_CREATE_SND_CARD_ERROR: cxt_manager_unref_context(alsa_cxt); + // fall through case ALSA_MODEL_ERROR_ALLOC: case ALSA_MODEL_NO_SETUP_INFO: break; diff --git a/driver/utils/misc/sys.c b/driver/utils/misc/sys.c index ad5bcd5..e9cfbd4 100644 --- a/driver/utils/misc/sys.c +++ b/driver/utils/misc/sys.c @@ -337,7 +337,6 @@ void *sys_fopen(const char *filename, enum sys_fop_flag_e flag) { struct file *fp = NULL; int new_flag = 0; - struct kstat stat; if (!filename) { @@ -358,7 +357,6 @@ void *sys_fopen(const char *filename, enum sys_fop_flag_e flag) else if ((flag & SYS_FOP_FLAG_WRITE_BIT)) new_flag = O_WRONLY; - fp = filp_open(filename, new_flag, 0); return IS_ERR(fp) ? NULL : fp; @@ -377,7 +375,7 @@ SIZE_T sys_fread(void *fp, void *buf, SIZE_T size, SIZE_T count, SIZE_T offset) res = kernel_read(fp, buf, count, &pos); if (res == 0) { - pr_info("kernel read: read zero bytes\n", res); + pr_info("kernel read: read zero bytes\n"); } return res; diff --git a/driver/utils/pci/pci_model.c b/driver/utils/pci/pci_model.c index 8d412c5..d1c44ad 100644 --- a/driver/utils/pci/pci_model.c +++ b/driver/utils/pci/pci_model.c @@ -273,9 +273,11 @@ static int pci_model_probe(struct pci_dev *pci_dev,const struct pci_device_id *p case ERROR_REQUEST_REGIONS: pci_clear_master(pci_dev); pci_disable_device(pci_dev); + // fall through case ERROR_ENABLE_PCI_DEV: cxt_manager_unref_context(pci_cxt); pci_cxt=NULL; + // fall through case ERROR_ALLOC_CXT: case NO_CXT_MGR: case NO_DRV_CXT: diff --git a/driver/utils/trace/trace.c b/driver/utils/trace/trace.c index f83d870..4b5b49e 100644 --- a/driver/utils/trace/trace.c +++ b/driver/utils/trace/trace.c @@ -346,6 +346,7 @@ void *trace_model_init(void *cxt_mgr) { case ERR_CREATE_GROUP: kobject_put(trace_cxt->kobj); + // fall through case ERR_NO_DEV_KOBJ: cxt_manager_unref_context(trace_cxt); trace_cxt = NULL; diff --git a/driver/utils/v4l2/v4l2_model_device.c b/driver/utils/v4l2/v4l2_model_device.c index cd7cc3e..f0b92fc 100644 --- a/driver/utils/v4l2/v4l2_model_device.c +++ b/driver/utils/v4l2/v4l2_model_device.c @@ -215,10 +215,13 @@ v4l2_model_handle_t v4l2_model_init(cxt_mgr_handle_t cxt_mgr,v4l2_model_device_s { case V4L2_MODEL_ERROR_REGISTER_VIDEO: v4l2_model_vb2_release(context->vb2_context); + // fall through case V4L2_MODEL_ERROR_VIDEO_BUF: v4l2_device_unregister(&context->v4l2_dev); + // fall through case V4L2_MODEL_ERROR_REGISTER_V4L2: kfree(context); + // fall through case V4L2_MODEL_ERROR_ALLOC: case V4L2_MODEL_ERROR_NO_DEV: break; From 019516647f8f852e904a9c0c1614d47c3f54903c Mon Sep 17 00:00:00 2001 From: cdorn Date: Sun, 9 Jan 2022 15:27:23 +0100 Subject: [PATCH 16/23] fixed install and build files; fixed support for bmp pictures --- build.sh | 2 +- driver/board/gc573/board_config.c | 14 +++++++------- insmod.sh | 7 +++++-- install.sh | 5 +++++ 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/build.sh b/build.sh index c201406..9c4b75b 100755 --- a/build.sh +++ b/build.sh @@ -1,4 +1,4 @@ #!/bin/sh make -C driver clean make -C driver -cp driver/cx511h.ko ./ +cp driver/gc573.ko ./ diff --git a/driver/board/gc573/board_config.c b/driver/board/gc573/board_config.c index 8883ac3..74d2084 100644 --- a/driver/board/gc573/board_config.c +++ b/driver/board/gc573/board_config.c @@ -33,13 +33,13 @@ static char *no_signal_pic = NULL; module_param(no_signal_pic, charp, 0444); MODULE_PARM_DESC(no_signal_pic, "Loading this bitmap file and display it when the input is no signal"); -//static char *out_of_range_pic = NULL; -//module_param(out_of_range_pic, charp, 0444); -//MODULE_PARM_DESC(out_of_range_pic, "Loading this bitmap file and display it when the content is out of range"); +static char *out_of_range_pic = NULL; +module_param(out_of_range_pic, charp, 0444); +MODULE_PARM_DESC(out_of_range_pic, "Loading this bitmap file and display it when the content is out of range"); -static char *copy_protetion_pic = NULL; -module_param(copy_protetion_pic, charp, 0444); -MODULE_PARM_DESC(copy_protetion_pic, "Loading this bitmap file and display it when the content was protected"); +static char *copy_protection_pic = NULL; +module_param(copy_protection_pic, charp, 0444); +MODULE_PARM_DESC(copy_protection_pic, "Loading this bitmap file and display it when the content was protected"); int board_init(void); void board_exit(void); @@ -192,7 +192,7 @@ int board_probe(struct device *dev,unsigned long driver_info) mesg("%s subsystem_id=%x\n",__func__,subsystem_id); - pic_bmp_init(cxt_mgr, no_signal_pic, NULL, copy_protetion_pic); + pic_bmp_init(cxt_mgr, no_signal_pic, out_of_range_pic, copy_protection_pic); board_alsa_init(cxt_mgr); board_v4l2_init(cxt_mgr,subsystem_id); //aver_xilinx_sha204_init(aver_xilinx_handle); diff --git a/insmod.sh b/insmod.sh index dacef5b..e310e3b 100755 --- a/insmod.sh +++ b/insmod.sh @@ -1,4 +1,7 @@ -#!/bin/sh +#!/bin/bash + +SCRIPT_DIR=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd) + modprobe snd modprobe snd-pcm modprobe videobuf2-dma-contig @@ -6,4 +9,4 @@ modprobe videobuf2-dma-sg modprobe videobuf2-v4l2 modprobe videobuf2-vmalloc modprobe videodev -insmod driver/gc573.ko +insmod driver/gc573.ko no_signal_pic="$SCRIPT_DIR/driver/aver_custom_no_signal.bmp" copy_protection_pic="$SCRIPT_DIR/driver/aver_custom_copy_protection.bmp" out_of_range_pic="$SCRIPT_DIR/driver/aver_custom_out_of_range.bmp" diff --git a/install.sh b/install.sh index e13efbd..5c08bcb 100755 --- a/install.sh +++ b/install.sh @@ -11,5 +11,10 @@ MODULE_INSTALL_DIR=/lib/modules/`uname -r`/kernel/drivers/media/avermedia install -d $MODULE_INSTALL_DIR install -m 644 driver/gc573.ko $MODULE_INSTALL_DIR +install -m 644 driver/aver_custom_copy_protection.bmp $MODULE_INSTALL_DIR +install -m 644 driver/aver_custom_no_signal.bmp $MODULE_INSTALL_DIR +install -m 644 driver/aver_custom_out_of_range.bmp $MODULE_INSTALL_DIR + +echo "options gc573 no_signal_pic=\"$MODULE_INSTALL_DIR/aver_custom_no_signal.bmp\" out_of_range_pic=\"$MODULE_INSTALL_DIR/aver_custom_out_of_range.bmp\" copy_protection_pic=\"$MODULE_INSTALL_DIR/aver_custom_copy_protection.bmp\"" > /etc/modprobe.d/gc573.conf /sbin/depmod -a From 07233c8cc65444c36be9c297da22baf8e85952df Mon Sep 17 00:00:00 2001 From: cdorn Date: Sun, 9 Jan 2022 15:30:44 +0100 Subject: [PATCH 17/23] moved declaradion of board init/exit --- driver/entry.c | 5 +++-- driver/include/board.h | 3 +++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/driver/entry.c b/driver/entry.c index 6ea951b..b139d7b 100644 --- a/driver/entry.c +++ b/driver/entry.c @@ -17,10 +17,11 @@ #include #include #include "aver_version.h" +#include "board.h" //#define DRIVER_VER "1.0.0026" -int board_init(void); -void board_exit(void); +//int board_init(void); +//void board_exit(void); static int __init aver_init(void) { int ret=0; diff --git a/driver/include/board.h b/driver/include/board.h index 1e830a9..9dcba2a 100644 --- a/driver/include/board.h +++ b/driver/include/board.h @@ -46,6 +46,9 @@ typedef struct int index; }board_chip_desc_t; +int board_init(void); +void board_exit(void); + #ifdef __cplusplus } #endif From 1b3e498f8ac1d0bb77be460c8bc4f6fa93bb742f Mon Sep 17 00:00:00 2001 From: cdorn Date: Sun, 9 Jan 2022 15:32:48 +0100 Subject: [PATCH 18/23] fixed warn_unused_result warnings --- driver/utils/trace/debug.c | 19 +++++++++++++------ driver/utils/v4l2/v4l2_model_device.c | 4 +++- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/driver/utils/trace/debug.c b/driver/utils/trace/debug.c index 3cd0a7a..761bf92 100644 --- a/driver/utils/trace/debug.c +++ b/driver/utils/trace/debug.c @@ -226,16 +226,23 @@ static unsigned int debug_ctl_store(void *cxt, const char *buf, unsigned int cou { *end=0; end++; - if(start[0]) - kstrtoint(start,10,&lineno); - else - lineno=1; + if(start[0]) { + if (kstrtoint(start, 10, &lineno) != 0) { + lineno = 1; + } + } else { + lineno = 1; + } debug_ctrl.start_line=lineno; - kstrtoint(end,10,&lineno); + if (kstrtoint(end,10,&lineno) != 0) { + lineno = 1; + } debug_ctrl.end_line=lineno; }else { - kstrtoint(start,10,&lineno); + if (kstrtoint(start,10,&lineno) != 0) { + lineno = 1; + } debug_ctrl.start_line=lineno; debug_ctrl.end_line=lineno; } diff --git a/driver/utils/v4l2/v4l2_model_device.c b/driver/utils/v4l2/v4l2_model_device.c index f0b92fc..7d3173a 100644 --- a/driver/utils/v4l2/v4l2_model_device.c +++ b/driver/utils/v4l2/v4l2_model_device.c @@ -519,7 +519,9 @@ static long v4l2_model_ioctl(struct file *file, unsigned int cmd, unsigned long case AVER_HDCP_IOCTL_GET_STATE: pr_info("AVER_HDCP_IOCTL_GET_STATE\n"); ret = v4l2_model_ioctl_g_hdcp_state(file, &hdcp_state); - copy_to_user ((unsigned int *)arg, &hdcp_state, sizeof(hdcp_state)); + if (copy_to_user ((unsigned int *)arg, &hdcp_state, sizeof(hdcp_state)) != 0) { + pr_err("AVER_HDCP_IOCTL_GET_STATE copy_to_user() failed\n"); + } break; case AVER_HDCP_IOCTL_SET_STATE: From dc951df479ffed700c4103700a76ac648d4db483 Mon Sep 17 00:00:00 2001 From: cdorn Date: Sun, 9 Jan 2022 15:34:03 +0100 Subject: [PATCH 19/23] fixed scheduling while atomic bug that leads to system crash --- driver/utils/trace/debug.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/driver/utils/trace/debug.c b/driver/utils/trace/debug.c index 761bf92..8e2a082 100644 --- a/driver/utils/trace/debug.c +++ b/driver/utils/trace/debug.c @@ -340,7 +340,7 @@ int mesg(const char *fmt,...) va_list args; int r; - tmp = kmalloc(sizeof (KBUILD_MODNAME ": ") + strlen(fmt), GFP_KERNEL); + tmp = kzalloc(sizeof (KBUILD_MODNAME ": ") + strlen(fmt), GFP_ATOMIC); if ( !tmp ) return -1; From 857f042230bdaec96c9ea6000e43a5f9edecbe8e Mon Sep 17 00:00:00 2001 From: cdorn Date: Sun, 9 Jan 2022 15:41:57 +0100 Subject: [PATCH 20/23] changed debug messages to use kernel print macros --- driver/board/gc573/board_config.c | 9 +-- driver/board/gc573/board_v4l2.c | 74 ++++++++++++------------ driver/utils/mem/mem_model.c | 4 +- driver/utils/v4l2/framegrabber.c | 2 +- driver/utils/v4l2/v4l2_model_ioctl.c | 14 ++--- driver/utils/v4l2/v4l2_model_videobuf2.c | 8 +-- 6 files changed, 57 insertions(+), 54 deletions(-) diff --git a/driver/board/gc573/board_config.c b/driver/board/gc573/board_config.c index 74d2084..bc718f2 100644 --- a/driver/board/gc573/board_config.c +++ b/driver/board/gc573/board_config.c @@ -170,14 +170,14 @@ int board_probe(struct device *dev,unsigned long driver_info) ret=board_gpio_init(cxt_mgr); if(ret!=0) { - mesg("board_gpio_init\n"); + pr_err("board_gpio_init failed\n"); err=ERROR_BOARD_GPIO_INIT; break; } ret=board_i2c_init(cxt_mgr,driver_info); if(ret!=0) { - mesg("board_i2c_init\n"); + pr_err("board_i2c_init failed\n"); err=ERROR_BOARD_I2C_INIT; break; } @@ -186,11 +186,12 @@ int board_probe(struct device *dev,unsigned long driver_info) ite6805_handle_1=i2c_model_get_driver_handle(i2c_mgr,ITE6805_DRVNAME); if(!ite6805_handle_1) { - break; + pr_err("error getting ite6805 handle\n"); + break; } ite6805_add_trace(ite6805_handle_1,trace_handle); - mesg("%s subsystem_id=%x\n",__func__,subsystem_id); + pr_info("subsystem_id=%x\n", subsystem_id); pic_bmp_init(cxt_mgr, no_signal_pic, out_of_range_pic, copy_protection_pic); board_alsa_init(cxt_mgr); diff --git a/driver/board/gc573/board_v4l2.c b/driver/board/gc573/board_v4l2.c index baa7a0f..8795e91 100644 --- a/driver/board/gc573/board_v4l2.c +++ b/driver/board/gc573/board_v4l2.c @@ -9,7 +9,8 @@ * Version: * ================================================================= */ - +#define pr_fmt(fmt) KBUILD_MODNAME ": " "%s, %d: " fmt, __func__, __LINE__ + //#include #include "board.h" #include "cxt_mgr.h" @@ -227,16 +228,18 @@ static void gc573_stream_on(framegrabber_handle_t handle) //framegrabber_s_out_framerate(board_v4l2_cxt->fg_handle,0); framegrabber_g_out_framesize(board_v4l2_cxt->fg_handle,&out_width,&out_height); - debug_msg("%s in %dx%d out %dx%d\n",__func__,width,height,out_width,out_height); - + if ((out_width ==0) || (out_height ==0)) { - debug_msg("debug...\n"); + pr_info("Output framesize is not set: Setting to 1920x1080\n"); + out_width = 1920; out_height = 1080; framegrabber_s_out_framesize(board_v4l2_cxt->fg_handle,1920,1080); } + pr_info("in %dx%d out %dx%d\n",width, height,out_width,out_height); + if(framemode==FRAMEGRABBER_FRAMEMODE_INTERLACED) vip_cfg.in_videoformat.is_interlace=TRUE; else @@ -257,10 +260,10 @@ static void gc573_stream_on(framegrabber_handle_t handle) framegrabber_s_input_audioinfo(board_v4l2_cxt->fg_handle,audio_rate); - mesg("%s...vip_cfg.audio_rate_index=%d\n",__func__,vip_cfg.audio_rate); + pr_info("vip_cfg.audio_rate_index=%d\n", vip_cfg.audio_rate); ite6805_get_frameinfo(ite6805_handle,fe_frameinfo); - debug_msg("%s========fe_frameinfo->packet_colorspace=%d\n",__func__,fe_frameinfo->packet_colorspace); + pr_info("fe_frameinfo->packet_colorspace=%d\n", fe_frameinfo->packet_colorspace); vip_cfg.in_videoformat.fps = framegrabber_g_input_framerate(board_v4l2_cxt->fg_handle); //if(vip_cfg.is_interlace==TRUE) @@ -283,7 +286,7 @@ static void gc573_stream_on(framegrabber_handle_t handle) vip_cfg.in_ddrmode = fe_frameinfo->ddr_mode; //vip_cfg.out_framerate= 0; //for test vip_cfg.out_videoformat.fps=frameinterval; - mesg("%s..in_framerate=%d out_framerate=%d pixel_clock=%d\n",__func__,vip_cfg.in_videoformat.fps,vip_cfg.out_videoformat.fps,vip_cfg.pixel_clock); + pr_info("in_framerate=%d out_framerate=%d, pixel_clock=%d, in_ddrmode=%d\n",vip_cfg.in_videoformat.fps,vip_cfg.out_videoformat.fps,vip_cfg.pixel_clock, vip_cfg.in_ddrmode); ite6805_get_workingmode(ite6805_handle, &(vip_cfg.in_workingmode)) ; vip_cfg.in_colorspacemode = 0; // 0-yuv, 1-rgb limit, 2-rgb full @@ -291,9 +294,12 @@ static void gc573_stream_on(framegrabber_handle_t handle) vip_cfg.in_videoformat.colorspace = VIDEO_RGB_MODE; vip_cfg.in_packetsamplingmode = 1; // 0-rgb, 1-422, 2-444 vip_cfg.in_packetcsc_bt = COLORMETRY_ITU709; + ite6805_get_sampingmode(ite6805_handle, &(vip_cfg.in_packetsamplingmode)); vip_cfg.currentCSC = CAPTURE_BT709_COMPUTER; - + + pr_info("in_colorspacemode = %d, in_packetsamplingmode = %d, in_videoformat_colorspace = %d\n", vip_cfg.in_colorspacemode , (int) vip_cfg.in_videoformat.colorspace, vip_cfg.in_packetsamplingmode); + //enable video bypass if (((vip_cfg.in_videoformat.vactive == 4096) && (vip_cfg.out_videoformat.width == 4096) && (vip_cfg.out_videoformat.height == 2160) && (vip_cfg.out_videoformat.height == 2160)) || //4096x2160 @@ -319,13 +325,13 @@ static void gc573_stream_on(framegrabber_handle_t handle) && (vip_cfg.in_videoformat.hactive == 1080) && (vip_cfg.out_videoformat.height == 1080) && (vip_cfg.in_videoformat.fps == 120))) { - mesg("%s bypass = 1.. in %dx%d out %dx%d\n",__func__,vip_cfg.in_videoformat.vactive, vip_cfg.in_videoformat.hactive,vip_cfg.out_videoformat.width,vip_cfg.out_videoformat.height); + pr_info("bypass = 1.. in %dx%d out %dx%d\n",vip_cfg.in_videoformat.hactive, vip_cfg.in_videoformat.vactive,vip_cfg.out_videoformat.width,vip_cfg.out_videoformat.height); //aver_xilinx_video_bypass(board_v4l2_cxt->aver_xilinx_handle,1); //enable video bypass vip_cfg.video_bypass = 1; } else { - mesg("%s bypass = 0.. in %dx%d out %dx%d\n",__func__,vip_cfg.in_videoformat.vactive,vip_cfg.in_videoformat.hactive,vip_cfg.out_videoformat.width,vip_cfg.out_videoformat.height); + pr_info("bypass = 0.. in %dx%d out %dx%d\n",vip_cfg.in_videoformat.hactive,vip_cfg.in_videoformat.vactive,vip_cfg.out_videoformat.width,vip_cfg.out_videoformat.height); //aver_xilinx_video_bypass(board_v4l2_cxt->aver_xilinx_handle,0); //disable video bypass vip_cfg.video_bypass = 0; } @@ -406,7 +412,7 @@ static void gc573_brightness_read(framegrabber_handle_t handle,int *brightness) //framegrabber_set_data(handle,board_v4l2_cxt); *brightness = board_v4l2_cxt->cur_bchs_value; //handle->fg_bchs_value = *brightness; - debug_msg("%s get brightness=%x\n",__func__,board_v4l2_cxt->cur_bchs_value); + pr_info("brightness=%x\n",board_v4l2_cxt->cur_bchs_value); } static void gc573_contrast_read(framegrabber_handle_t handle,int *contrast) { @@ -419,7 +425,7 @@ static void gc573_contrast_read(framegrabber_handle_t handle,int *contrast) //framegrabber_set_data(handle,board_v4l2_cxt); *contrast = board_v4l2_cxt->cur_bchs_value; //handle->fg_bchs_value = *contrast; - debug_msg("%s get contrast=%x\n",__func__,board_v4l2_cxt->cur_bchs_value); + pr_info("contrast=%x\n",board_v4l2_cxt->cur_bchs_value); } static void gc573_hue_read(framegrabber_handle_t handle,int *hue) @@ -433,7 +439,7 @@ static void gc573_hue_read(framegrabber_handle_t handle,int *hue) //framegrabber_set_data(handle,board_v4l2_cxt); *hue = board_v4l2_cxt->cur_bchs_value; //handle->fg_bchs_value = *hue; - debug_msg("%s get hue=%x\n",__func__,board_v4l2_cxt->cur_bchs_value); + pr_info("hue=%x\n",board_v4l2_cxt->cur_bchs_value); } static void gc573_saturation_read(framegrabber_handle_t handle,int *saturation) @@ -447,7 +453,7 @@ static void gc573_saturation_read(framegrabber_handle_t handle,int *saturation) //framegrabber_set_data(handle,board_v4l2_cxt); *saturation = board_v4l2_cxt->cur_bchs_value; //handle->fg_bchs_value = *saturation; - debug_msg("%s get saturation=%x\n",__func__,board_v4l2_cxt->cur_bchs_value); + pr_info("saturation=%x\n",board_v4l2_cxt->cur_bchs_value); } static void gc573_bchs_write(framegrabber_handle_t handle) @@ -465,10 +471,10 @@ static void gc573_bchs_write(framegrabber_handle_t handle) //framegrabber_s_input_bchs(board_v4l2_cxt->fg_handle,board_v4l2_cxt->cur_bchs_value,board_v4l2_cxt->cur_bchs_selection); //ite6805_set_bchs(ite6805_handle,&bchs_value,&bchs_select); //aver_xilinx_set_bchs(board_v4l2_cxt->aver_xilinx_handle,bchs_value,bchs_select); - if (bchs_select ==0) debug_msg("set brightness=%d\n",bchs_value); - if (bchs_select ==1) debug_msg("set contrast=%d\n",bchs_value); - if (bchs_select ==2) debug_msg("set hue=%d\n",bchs_value); - if (bchs_select ==3) debug_msg("set saturation=%d\n",bchs_value); + if (bchs_select ==0) pr_info("set brightness=%d\n",bchs_value); + if (bchs_select ==1) pr_info("set contrast=%d\n",bchs_value); + if (bchs_select ==2) pr_info("set hue=%d\n",bchs_value); + if (bchs_select ==3) pr_info("set saturation=%d\n",bchs_value); } } @@ -562,7 +568,7 @@ static void gc573_v4l2_buffer_prepare(v4l2_model_callback_parameter_t *cb_info) { board_v4l2_context_t *board_v4l2_cxt=cb_info->asso_data; v4l2_model_buffer_info_t *buffer_info=cb_info->u.buffer_prepare_info.buffer_info; - //mesg("%s %p buffer_info %p\n",__func__,board_v4l2_cxt,buffer_info); + pr_debug("context %p buffer_info %p\n",board_v4l2_cxt,buffer_info); if(buffer_info) { int i; @@ -608,7 +614,7 @@ static void gc573_v4l2_buffer_init(v4l2_model_callback_parameter_t *cb_info) //mesg("buf type %d count %d\n",buffer_info->buf_type,buffer_info->buf_count[0]); for(i=0,desc=buffer_info->buf_info[0];ibuf_count[0];i++) { - //mesg("addr %08x size %x\n",desc[i].addr,desc[i].size); + pr_info("addr %08lx size %lx\n",desc[i].addr,desc[i].size); } } } @@ -633,9 +639,7 @@ static void check_signal_stable_task(void *data) aver_xilinx_frame_info_t detected_frameinfo; ite6805_frameinfo_t *fe_frameinfo=&board_v4l2_cxt->cur_fe_frameinfo; BOOL_T is_interlace; - - debug_msg("%s\n",__func__); - + //ite6805_get_frameinfo(ite6805_handle,fe_frameinfo); //debug_msg("%s ite6805 detected size %dx%d;framerate %d \n",__func__,fe_frameinfo->width,fe_frameinfo->height,fe_frameinfo->framerate); @@ -650,8 +654,8 @@ static void check_signal_stable_task(void *data) else dual_pixel_set = detected_frameinfo.width; - debug_msg("%s framegrabber size %dx%d\n",__func__,width,height); - debug_msg("%s fpga detected size %dx%d\n",__func__,detected_frameinfo.width,detected_frameinfo.height); + pr_info("framegrabber size %dx%d%c\n",width,height,(fe_frameinfo->is_interlace) ?'i':'p'); + pr_info("fpga detected size %dx%d%c\n",detected_frameinfo.width,detected_frameinfo.height,(detected_frameinfo.is_interlace) ?'i':'p'); if((((detected_frameinfo.width<320 || detected_frameinfo.height<240)) || (width !=/*detected_frameinfo.width*/dual_pixel_set)|| (height !=detected_frameinfo.height)) && (cnt_retry<3)) { cnt_retry++; @@ -659,9 +663,7 @@ static void check_signal_stable_task(void *data) task_model_run_task_after(board_v4l2_cxt->task_model_handle,board_v4l2_cxt->check_signal_task_handle,100000); return; } - - //debug_msg("%s fpga detected size %dx%d\n",__func__,detected_frameinfo.width,detected_frameinfo.height); - + if (fe_frameinfo->is_interlace) { detected_frameinfo.width = fe_frameinfo->width; @@ -711,8 +713,8 @@ static void gc573_ite6805_event(void *cxt,ite6805_event_e event) { case ITE6805_LOCK: { - //debug_msg("ITE6805_LOCK\n"); - //aver_xilinx_get_frameinfo(aver_xilinx_handle,&detected_frameinfo,fe_frameinfo->pixel_clock); + pr_info("ITE6805_LOCK\n"); +// aver_xilinx_get_frameinfo(board_v4l2_cxt->aver_xilinx_handle,&detected_frameinfo,fe_frameinfo->pixel_clock); { //aver_xilinx_color_adjust_control(board_v4l2_cxt->aver_xilinx_handle); @@ -720,8 +722,8 @@ static void gc573_ite6805_event(void *cxt,ite6805_event_e event) // aver_xilinx_hdmi_hotplug(board_v4l2_cxt->aver_xilinx_handle); - mesg("%s locked fe %dx%d%c\n",__func__,fe_frameinfo->width,fe_frameinfo->height,(fe_frameinfo->is_interlace)?'i':'p'/*,fe_frameinfo->framerate*/); - //debug_msg("pixclock %d colorspace %d\n",fe_frameinfo->pixel_clock,fe_frameinfo->colorspace); + pr_info("locked fe %dx%d%c %dHz %d\n",fe_frameinfo->width,fe_frameinfo->height,(fe_frameinfo->is_interlace)?'i':'p', fe_frameinfo->framerate, fe_frameinfo->denominator); + pr_info("pixclock %d\n",fe_frameinfo->pixel_clock); //work around for ITE6805 detect issue if ((fe_frameinfo->is_interlace==0) && ((fe_frameinfo->height == 240) || (fe_frameinfo->height == 288))) @@ -771,7 +773,7 @@ static void gc573_ite6805_event(void *cxt,ite6805_event_e event) //debug_msg("=========== ite6805_set_out_format=%02x\n",out_format); } //sys_msleep(100); - //debug_msg("pixelclock %d detected %dx%d%c\n",fe_frameinfo->pixel_clock,detected_frameinfo.width,detected_frameinfo.height,(detected_frameinfo.is_interlace) ?'i':'p'); + pr_info("pixelclock %d detected %dx%d%c\n",fe_frameinfo->pixel_clock,fe_frameinfo->width,fe_frameinfo->height,(fe_frameinfo->is_interlace) ?'i':'p'); framegrabber_s_input_status(board_v4l2_cxt->fg_handle,FRAMEGRABBER_INPUT_STATUS_OK); framegrabber_mask_s_status(board_v4l2_cxt->fg_handle,FRAMEGRABBER_STATUS_SIGNAL_LOCKED_BIT,FRAMEGRABBER_STATUS_SIGNAL_LOCKED_BIT); @@ -779,7 +781,7 @@ static void gc573_ite6805_event(void *cxt,ite6805_event_e event) } break; case ITE6805_UNLOCK: - //debug_msg("ITE6805_UNLOCK\n"); + pr_info("ITE6805_UNLOCK\n"); framegrabber_s_hdcp_flag(board_v4l2_cxt->fg_handle,0); framegrabber_s_input_framesize(board_v4l2_cxt->fg_handle,0,0); //tt 0615 framegrabber_mask_s_status(board_v4l2_cxt->fg_handle,FRAMEGRABBER_STATUS_SIGNAL_LOCKED_BIT,0); @@ -787,7 +789,7 @@ static void gc573_ite6805_event(void *cxt,ite6805_event_e event) break; case ITE6805_HDCP: - //debug_msg("ITE6805_HDCP\n"); + pr_info("ITE6805_HDCP\n"); ite6805_get_hdcp_level(ite6805_handle, &hdcp_flag); framegrabber_s_hdcp_flag(board_v4l2_cxt->fg_handle,hdcp_flag); break; @@ -923,7 +925,7 @@ void board_v4l2_init(cxt_mgr_handle_t cxt_mgr, int board_id) default: break; } - debug_msg("%s err %d\n", __func__, err); + pr_err("err %d\n", err); } } diff --git a/driver/utils/mem/mem_model.c b/driver/utils/mem/mem_model.c index f6d4778..8e20932 100644 --- a/driver/utils/mem/mem_model.c +++ b/driver/utils/mem/mem_model.c @@ -263,14 +263,14 @@ static mem_model_dma_buffer_t *mem_model_dma_pool_alloc_mem(mem_model_handle_t m if( buffer_item) { - + dma_buffer=&buffer_item->dma_buffer; //dma_buffer->phys_addr=(unsigned long int)dma_addr; dma_buffer->phys_addr=dma_addr; dma_buffer->vaddr=vaddr; dma_buffer->size=dma_pool->cfg.size; queue_add_tail(&buffer_item->queue,&dma_pool->buffer_queue); - debug_msg("%s dma_addr %llx dma_buffer->phys_addr %lx\n",__func__,dma_addr,dma_buffer->phys_addr); + pr_info("dma_addr %llx dma_buffer->phys_addr %lx dma_buffer->size %ld\n",dma_addr,dma_buffer->phys_addr, dma_buffer->size); } } } diff --git a/driver/utils/v4l2/framegrabber.c b/driver/utils/v4l2/framegrabber.c index 6f0b52f..69befc8 100644 --- a/driver/utils/v4l2/framegrabber.c +++ b/driver/utils/v4l2/framegrabber.c @@ -221,7 +221,7 @@ framegrabber_handle_t framegrabber_init(cxt_mgr_handle_t cxt_mgr,framegrabber_pr { if(fg_cxt->pixfmt_cap & (1<current_out_pixfmt=%d\n",__func__,i); + pr_info("fg_cxt->current_out_pixfmt=%d\n",i); fg_cxt->current_out_pixfmt=i; break; } diff --git a/driver/utils/v4l2/v4l2_model_ioctl.c b/driver/utils/v4l2/v4l2_model_ioctl.c index 88be19e..ea450f4 100644 --- a/driver/utils/v4l2/v4l2_model_ioctl.c +++ b/driver/utils/v4l2/v4l2_model_ioctl.c @@ -421,12 +421,12 @@ int v4l2_model_ioctl_s_fmt_vid_cap(struct file *file, void *fh,struct v4l2_forma int ret = v4l2_model_ioctl_try_fmt_vid_cap(file, fh, f); if (ret < 0) { - pr_info("%s..\n",__func__); + pr_err("try_vid_cap failed\n"); return ret; } if (vb2_is_busy(&v4l2m_context->queue)) { - pr_info("%s.\n",__func__); + pr_warn("vb2 is busy\n"); return -EBUSY; } @@ -598,7 +598,7 @@ int v4l2_model_ioctl_g_parm(struct file *file, void *fh,struct v4l2_streamparm * if (a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) { - pr_info("%s..\n",__func__); + pr_err("unsupported video buffer type"); return -EINVAL; } @@ -669,14 +669,14 @@ int v4l2_model_ioctl_g_ctrl(struct file *file, void *fh,struct v4l2_control *a)/ bchs_select = V4L2_BCHS_TYPE_BRIGHTNESS; //adv7619_get_bchs(v4l2m_context->adv7619_handle,&BCHSinfo,bchs_select); ctrl->value = framegrabber_g_input_bchs(v4l2m_context->framegrabber_handle,bchs_select); - pr_info("%s...brightness(%d)\n",__func__,ctrl->value); + pr_info("brightness(%d)\n",ctrl->value); ret = 0; break; case V4L2_CID_CONTRAST: bchs_select = V4L2_BCHS_TYPE_CONTRAST; - pr_info("%s...contrast(%d)\n",__func__,bchs_select); + pr_info("contrast(%d)\n",bchs_select); ctrl->value = framegrabber_g_input_bchs(v4l2m_context->framegrabber_handle,bchs_select); ret = 0; break; @@ -684,7 +684,7 @@ int v4l2_model_ioctl_g_ctrl(struct file *file, void *fh,struct v4l2_control *a)/ case V4L2_CID_SATURATION: bchs_select = V4L2_BCHS_TYPE_SATURATION; - pr_info("%s...saturation(%d)\n",__func__,bchs_select); + pr_info("saturation(%d)\n",bchs_select); ctrl->value = framegrabber_g_input_bchs(v4l2m_context->framegrabber_handle,bchs_select); ret = 0; break; @@ -692,7 +692,7 @@ int v4l2_model_ioctl_g_ctrl(struct file *file, void *fh,struct v4l2_control *a)/ case V4L2_CID_HUE: bchs_select = V4L2_BCHS_TYPE_HUE; - pr_info("%s...hue(%d)\n",__func__,bchs_select); + pr_info("hue(%d)\n",bchs_select); ctrl->value = framegrabber_g_input_bchs(v4l2m_context->framegrabber_handle,bchs_select); ret = 0; break; // diff --git a/driver/utils/v4l2/v4l2_model_videobuf2.c b/driver/utils/v4l2/v4l2_model_videobuf2.c index a1b175d..6836fdd 100644 --- a/driver/utils/v4l2/v4l2_model_videobuf2.c +++ b/driver/utils/v4l2/v4l2_model_videobuf2.c @@ -173,7 +173,7 @@ static int v4l2_model_qops_queue_setup(struct vb2_queue *q, *num_buffers; callback_item->callback(&callback_item->data); } - pr_info("%s >>>>>\n", __func__); + return 0; } @@ -346,7 +346,7 @@ static void v4l2_model_qops_buf_cleanup(struct vb2_buffer *vb) container_of(vb, v4l2_model_vb2_buffer_t, vb); #endif int i; - pr_info("=====================%s vb %p \n", __func__, vb); + pr_info("===================== vb %p \n", vb); //return; //rr3 @@ -693,7 +693,7 @@ void v4l2_model_next_buffer(v4l2_model_handle_t context, spin_lock_irqsave(&vb2_context->queuelock, flags); if (list_empty(&vb2_context->buffer_list)) { - //pr_info("%s vb2 queue is empty\n", __func__); + pr_info("vb2 queue is empty\n"); *buffer_info = NULL; spin_unlock_irqrestore(&vb2_context->queuelock, flags); return; @@ -894,7 +894,7 @@ void v4l2_model_feed_video_data(v4l2_model_handle_t context, void *buffer, SIZE_ memcpy(lb,b,s);\ }else \ { \ - pr_info("copy may out of framebuf size %u offset %lu size %lu !\n",framebuf_size,(unsigned long)(lb-framebuf),(unsigned long)s) ;\ + pr_warn("copy may out of framebuf size %u offset %lu size %lu !\n",framebuf_size,(unsigned long)(lb-framebuf),(unsigned long)s) ;\ }\ } From 8616675bb7b5605c686cccfdf684cc5340ce199b Mon Sep 17 00:00:00 2001 From: cdorn Date: Sun, 9 Jan 2022 15:42:32 +0100 Subject: [PATCH 21/23] changed bus_info to be v4l2 compliant --- driver/utils/v4l2/v4l2_model_ioctl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/driver/utils/v4l2/v4l2_model_ioctl.c b/driver/utils/v4l2/v4l2_model_ioctl.c index ea450f4..a60d58a 100644 --- a/driver/utils/v4l2/v4l2_model_ioctl.c +++ b/driver/utils/v4l2/v4l2_model_ioctl.c @@ -237,7 +237,7 @@ int v4l2_model_ioctl_querycap(struct file *file, void *fh, struct v4l2_capabilit //else strncpy(cap->card, v4l2m_context->device_info.card_name,sizeof(cap->card)); - sprintf(cap->bus_info, "%s", dev_name(v4l2m_context->dev)); + sprintf(cap->bus_info, "PCIe:%s", dev_name(v4l2m_context->dev)); #if LINUX_VERSION_CODE <= KERNEL_VERSION(4,18,0) if(v4l2m_context->device_info.capabilities) { From 19a64a20a0bb22090ec18df0cd461651b7c1d8f3 Mon Sep 17 00:00:00 2001 From: cdorn Date: Sun, 9 Jan 2022 15:45:15 +0100 Subject: [PATCH 22/23] changed EDID to fit to lg4k on windows --- driver/lib/include/ite6805_EDID.h | 68 ++++++++++++++++--------------- 1 file changed, 35 insertions(+), 33 deletions(-) diff --git a/driver/lib/include/ite6805_EDID.h b/driver/lib/include/ite6805_EDID.h index 6e5f7e1..e6778c5 100644 --- a/driver/lib/include/ite6805_EDID.h +++ b/driver/lib/include/ite6805_EDID.h @@ -25,22 +25,23 @@ iTE_u8 Default_Edid_Block[256] = { // refer ite6664_defaultEDID.h add by AndyNien, 20171115 // ////////////////////////////////////////////////////////////////////////////////////////// -0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x06, 0xd8, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, -0x24, 0x1c, 0x01, 0x03, 0x80, 0xa0, 0x5a, 0x78, 0xea, 0x08, 0xa5, 0xa2, 0x57, 0x4f, 0xa2, 0x28, -0x0f, 0x50, 0x54, 0x25, 0x0b, 0x00, 0xd1, 0xc0, 0x81, 0xc0, 0x81, 0x80, 0x81, 0x00, 0x8b, 0xc0, -0x95, 0x00, 0xb3, 0x00, 0x3b, 0x80, 0x08, 0xe8, 0x00, 0x30, 0xf2, 0x70, 0x5a, 0x80, 0xb0, 0x58, -0x8a, 0x00, 0x6d, 0x55, 0x21, 0x00, 0x00, 0x1e, 0x02, 0x3a, 0x80, 0x18, 0x71, 0x38, 0x2d, 0x40, -0x58, 0x2c, 0x45, 0x00, 0x40, 0x84, 0x63, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x41, -0x56, 0x54, 0x20, 0x43, 0x4c, 0x35, 0x31, 0x31, 0x2d, 0x48, 0x4e, 0x0a, 0x00, 0x00, 0x00, 0xfd, -0x00, 0x32, 0xf0, 0x1e, 0xde, 0x3c, 0x00, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0x7f, -0x02, 0x03, 0x50, 0x70, 0x5e, 0x61, 0x60, 0x66, 0x65, 0x5f, 0x5e, 0x5d, 0x10, 0x1f, 0x5a, 0x3f, -0x05, 0x14, 0x04, 0x13, 0x12, 0x11, 0x03, 0x02, 0x01, 0x22, 0x21, 0x20, 0x16, 0x15, 0x07, 0x06, -0x62, 0x63, 0x64, 0x23, 0x0f, 0x07, 0x07, 0x83, 0x4f, 0x00, 0x00, 0x6e, 0x03, 0x0c, 0x00, 0x10, -0x00, 0x38, 0x3c, 0x20, 0x00, 0x80, 0x01, 0x02, 0x03, 0x04, 0x67, 0xd8, 0x5d, 0xc4, 0x01, 0x78, -0x80, 0x03, 0xe2, 0x00, 0x4f, 0xe3, 0x05, 0xc0, 0x00, 0xe2, 0x0f, 0x0f, 0xe3, 0x06, 0x05, 0x01, -0x56, 0x5e, 0x00, 0xa0, 0xa0, 0xa0, 0x29, 0x50, 0x30, 0x20, 0x35, 0x00, 0x55, 0x50, 0x21, 0x00, -0x00, 0x1e, 0xfc, 0x7e, 0x80, 0x88, 0x70, 0x38, 0x12, 0x40, 0x18, 0x20, 0x35, 0x00, 0x20, 0x2f, -0x21, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x06, 0xd8, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x1c, 0x01, 0x03, 0x80, 0xa0, 0x5a, 0x78,0xea, 0x08, 0xa5, 0xa2, 0x57, 0x4f, 0xa2, 0x28, + 0x0f, 0x50, 0x54, 0x25, 0x0b, 0x00, 0xd1, 0xc0, 0x81, 0x40, 0x81, 0x80, 0x81, 0x00, 0x8b, 0xc0, + 0x95, 0x00, 0xb3, 0x00, 0x3b, 0x80, 0x08, 0xe8, 0x00, 0x30, 0xf2, 0x70, 0x5a, 0x80, 0xb0, 0x58, + 0x8a, 0x00, 0x6d, 0x55, 0x21, 0x00, 0x00, 0x1e, 0x0c, 0xdf, 0x80, 0xa0, 0x70, 0x38, 0x40, 0x40, + 0x30, 0x40, 0x35, 0x00, 0x20, 0x2f, 0x21, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x41, + 0x56, 0x54, 0x20, 0x47, 0x43, 0x35, 0x37, 0x33, 0x0a, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0xfd, + 0x00, 0x32, 0xf0, 0x1e, 0xde, 0x3c, 0x00, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0x11, + 0x02, 0x03, 0x44, 0xf1, 0x59, 0x61, 0x60, 0x5f, 0x5e, 0x5d, 0x10, 0x1f, 0x5a, 0x3f, 0x05, 0x14, + 0x04, 0x13, 0x12, 0x11, 0x03, 0x02, 0x01, 0x22, 0x21, 0x20, 0x16, 0x15, 0x07, 0x06, 0x23, 0x0f, + 0x07, 0x07, 0x83, 0x4f, 0x00, 0x00, 0x67, 0x03, 0x0c, 0x00, 0x10, 0x00, 0x38, 0x3c, 0x67, 0xd8, + 0x5d, 0xc4, 0x01, 0x78, 0x80, 0x03, 0xe2, 0x00, 0xcf, 0xe3, 0x05, 0xc0, 0x00, 0xe2, 0x0f, 0x03, + 0xe3, 0x06, 0x05, 0x01, 0x6f, 0xc2, 0x00, 0xa0, 0xa0, 0xa0, 0x55, 0x50, 0x30, 0x20, 0x35, 0x00, + 0x55, 0x50, 0x21, 0x00, 0x00, 0x1e, 0x9e, 0xe8, 0x00, 0x78, 0xa0, 0xa0, 0x67, 0x50, 0x08, 0x20, + 0x98, 0x04, 0x55, 0x50, 0x21, 0x00, 0x00, 0x1e, 0xfc, 0x7e, 0x80, 0x88, 0x70, 0x38, 0x12, 0x40, + 0x18, 0x20, 0x35, 0x00, 0x20, 0x2f, 0x21, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff + }; // this is the fixed edid, cannot be change @@ -50,23 +51,24 @@ iTE_u8 Default_Edid_Block[256] = { // so, if user doing edid restore defauld api, system will copy this block to Default_Edid_Block // iTE_u8 Fix_Edid_Block_Number = 2; - iTE_u8 Fix_Edid_Block[256] = { -0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x06, 0xd8, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, -0x24, 0x1c, 0x01, 0x03, 0x80, 0xa0, 0x5a, 0x78, 0xea, 0x08, 0xa5, 0xa2, 0x57, 0x4f, 0xa2, 0x28, -0x0f, 0x50, 0x54, 0x25, 0x0b, 0x00, 0xd1, 0xc0, 0x81, 0xc0, 0x81, 0x80, 0x81, 0x00, 0x8b, 0xc0, -0x95, 0x00, 0xb3, 0x00, 0x3b, 0x80, 0x08, 0xe8, 0x00, 0x30, 0xf2, 0x70, 0x5a, 0x80, 0xb0, 0x58, -0x8a, 0x00, 0x6d, 0x55, 0x21, 0x00, 0x00, 0x1e, 0x02, 0x3a, 0x80, 0x18, 0x71, 0x38, 0x2d, 0x40, -0x58, 0x2c, 0x45, 0x00, 0x40, 0x84, 0x63, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x41, -0x56, 0x54, 0x20, 0x43, 0x4c, 0x35, 0x31, 0x31, 0x2d, 0x48, 0x4e, 0x0a, 0x00, 0x00, 0x00, 0xfd, -0x00, 0x32, 0xf0, 0x1e, 0xde, 0x3c, 0x00, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0x7f, -0x02, 0x03, 0x50, 0x70, 0x5e, 0x61, 0x60, 0x66, 0x65, 0x5f, 0x5e, 0x5d, 0x10, 0x1f, 0x5a, 0x3f, -0x05, 0x14, 0x04, 0x13, 0x12, 0x11, 0x03, 0x02, 0x01, 0x22, 0x21, 0x20, 0x16, 0x15, 0x07, 0x06, -0x62, 0x63, 0x64, 0x23, 0x0f, 0x07, 0x07, 0x83, 0x4f, 0x00, 0x00, 0x6e, 0x03, 0x0c, 0x00, 0x10, -0x00, 0x38, 0x3c, 0x20, 0x00, 0x80, 0x01, 0x02, 0x03, 0x04, 0x67, 0xd8, 0x5d, 0xc4, 0x01, 0x78, -0x80, 0x03, 0xe2, 0x00, 0x4f, 0xe3, 0x05, 0xc0, 0x00, 0xe2, 0x0f, 0x0f, 0xe3, 0x06, 0x05, 0x01, -0x56, 0x5e, 0x00, 0xa0, 0xa0, 0xa0, 0x29, 0x50, 0x30, 0x20, 0x35, 0x00, 0x55, 0x50, 0x21, 0x00, -0x00, 0x1e, 0xfc, 0x7e, 0x80, 0x88, 0x70, 0x38, 0x12, 0x40, 0x18, 0x20, 0x35, 0x00, 0x20, 0x2f, -0x21, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, + iTE_u8 Fix_Edid_Block[256] = { + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x06, 0xd8, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x1c, 0x01, 0x03, 0x80, 0xa0, 0x5a, 0x78,0xea, 0x08, 0xa5, 0xa2, 0x57, 0x4f, 0xa2, 0x28, + 0x0f, 0x50, 0x54, 0x25, 0x0b, 0x00, 0xd1, 0xc0, 0x81, 0x40, 0x81, 0x80, 0x81, 0x00, 0x8b, 0xc0, + 0x95, 0x00, 0xb3, 0x00, 0x3b, 0x80, 0x08, 0xe8, 0x00, 0x30, 0xf2, 0x70, 0x5a, 0x80, 0xb0, 0x58, + 0x8a, 0x00, 0x6d, 0x55, 0x21, 0x00, 0x00, 0x1e, 0x0c, 0xdf, 0x80, 0xa0, 0x70, 0x38, 0x40, 0x40, + 0x30, 0x40, 0x35, 0x00, 0x20, 0x2f, 0x21, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x41, + 0x56, 0x54, 0x20, 0x47, 0x43, 0x35, 0x37, 0x33, 0x0a, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0xfd, + 0x00, 0x32, 0xf0, 0x1e, 0xde, 0x3c, 0x00, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0x11, + 0x02, 0x03, 0x44, 0xf1, 0x59, 0x61, 0x60, 0x5f, 0x5e, 0x5d, 0x10, 0x1f, 0x5a, 0x3f, 0x05, 0x14, + 0x04, 0x13, 0x12, 0x11, 0x03, 0x02, 0x01, 0x22, 0x21, 0x20, 0x16, 0x15, 0x07, 0x06, 0x23, 0x0f, + 0x07, 0x07, 0x83, 0x4f, 0x00, 0x00, 0x67, 0x03, 0x0c, 0x00, 0x10, 0x00, 0x38, 0x3c, 0x67, 0xd8, + 0x5d, 0xc4, 0x01, 0x78, 0x80, 0x03, 0xe2, 0x00, 0xcf, 0xe3, 0x05, 0xc0, 0x00, 0xe2, 0x0f, 0x03, + 0xe3, 0x06, 0x05, 0x01, 0x6f, 0xc2, 0x00, 0xa0, 0xa0, 0xa0, 0x55, 0x50, 0x30, 0x20, 0x35, 0x00, + 0x55, 0x50, 0x21, 0x00, 0x00, 0x1e, 0x9e, 0xe8, 0x00, 0x78, 0xa0, 0xa0, 0x67, 0x50, 0x08, 0x20, + 0x98, 0x04, 0x55, 0x50, 0x21, 0x00, 0x00, 0x1e, 0xfc, 0x7e, 0x80, 0x88, 0x70, 0x38, 0x12, 0x40, + 0x18, 0x20, 0x35, 0x00, 0x20, 0x2f, 0x21, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff + }; From 7b3b128e9f29d079b59ad9fa5a53c1c073b5e512 Mon Sep 17 00:00:00 2001 From: cdorn Date: Sun, 9 Jan 2022 15:55:14 +0100 Subject: [PATCH 23/23] applied updates for new driver version; fixed bytesperline for obs to work; fixed singleplane support for NV12 and YV12; fixed multiplane buffers; fixed ioctl for v4l2 compliance; started development on multiplane support --- driver/board/gc573/board_v4l2.c | 166 +++--- driver/lib/aver_xilinx.o_shipped | Bin 92320 -> 111472 bytes driver/lib/include/aver_xilinx.h | 27 +- driver/lib/include/pic_bmp.h | 15 +- driver/lib/pic_bmp.o_shipped | Bin 9576 -> 10552 bytes driver/utils/v4l2/framegrabber.c | 322 +++++++++-- driver/utils/v4l2/include/framegrabber.h | 43 +- driver/utils/v4l2/v4l2_model_device.c | 34 +- driver/utils/v4l2/v4l2_model_ioctl.c | 703 ++++++++++++++++------- driver/utils/v4l2/v4l2_model_ioctl.h | 3 + driver/utils/v4l2/v4l2_model_videobuf2.c | 337 ++++++----- 11 files changed, 1128 insertions(+), 522 deletions(-) diff --git a/driver/board/gc573/board_v4l2.c b/driver/board/gc573/board_v4l2.c index 8795e91..4d1e4b5 100644 --- a/driver/board/gc573/board_v4l2.c +++ b/driver/board/gc573/board_v4l2.c @@ -214,7 +214,6 @@ static void gc573_stream_on(framegrabber_handle_t handle) ite6805_frameinfo_t *fe_frameinfo=&board_v4l2_cxt->cur_fe_frameinfo; //aver_xilinx_frame_info_t detected_frameinfo; - mesg("%s\n",__func__); //aver_xilinx_get_frameinfo(board_v4l2_cxt->aver_xilinx_handle,&detected_frameinfo); framemode=framegrabber_g_input_interlace(board_v4l2_cxt->fg_handle); framegrabber_g_input_framesize(board_v4l2_cxt->fg_handle,&width,&height); @@ -235,7 +234,7 @@ static void gc573_stream_on(framegrabber_handle_t handle) out_width = 1920; out_height = 1080; - framegrabber_s_out_framesize(board_v4l2_cxt->fg_handle,1920,1080); + framegrabber_s_out_framesize(board_v4l2_cxt->fg_handle,out_width,out_height); } pr_info("in %dx%d out %dx%d\n",width, height,out_width,out_height); @@ -269,8 +268,8 @@ static void gc573_stream_on(framegrabber_handle_t handle) //if(vip_cfg.is_interlace==TRUE) //vip_cfg.in_framerate = vip_cfg.in_framerate * 2; vip_cfg.packet_colorspace = fe_frameinfo->packet_colorspace; - vip_cfg.in_videoformat.vactive = width; - vip_cfg.in_videoformat.hactive = height; + vip_cfg.in_videoformat.vactive = height; + vip_cfg.in_videoformat.hactive = width; //if (vip_cfg.in_videoformat.is_interlace==TRUE) //vip_cfg.in_videoformat.hactive *= 2; vip_cfg.out_videoformat.width=out_width; @@ -301,28 +300,28 @@ static void gc573_stream_on(framegrabber_handle_t handle) pr_info("in_colorspacemode = %d, in_packetsamplingmode = %d, in_videoformat_colorspace = %d\n", vip_cfg.in_colorspacemode , (int) vip_cfg.in_videoformat.colorspace, vip_cfg.in_packetsamplingmode); //enable video bypass - if (((vip_cfg.in_videoformat.vactive == 4096) && (vip_cfg.out_videoformat.width == 4096) - && (vip_cfg.out_videoformat.height == 2160) && (vip_cfg.out_videoformat.height == 2160)) || //4096x2160 - ((vip_cfg.in_videoformat.vactive == 3840) && (vip_cfg.out_videoformat.width == 3840) - && (vip_cfg.out_videoformat.height == 2160) && (vip_cfg.out_videoformat.height == 2160)) || //3840x2160 - ((vip_cfg.in_videoformat.vactive == 2560) && (vip_cfg.out_videoformat.width == 2560) - && (vip_cfg.in_videoformat.hactive == 1600) && (vip_cfg.out_videoformat.height == 1600)) || //2560x1600 - ((vip_cfg.in_videoformat.vactive == 2560) && (vip_cfg.out_videoformat.width == 2560) - && (vip_cfg.in_videoformat.hactive == 1440) && (vip_cfg.out_videoformat.height == 1440)) || //2560x1440 - ((vip_cfg.in_videoformat.vactive == 2560) && (vip_cfg.out_videoformat.width == 2560) - && (vip_cfg.in_videoformat.hactive == 1080) && (vip_cfg.out_videoformat.height == 1080)) || //2560x1080 - ((vip_cfg.in_videoformat.vactive == 1920) && (vip_cfg.out_videoformat.width == 1920) - && (vip_cfg.in_videoformat.hactive == 1440) && (vip_cfg.out_videoformat.height == 1440)) || //1920x1440 - ((vip_cfg.in_videoformat.vactive == 1856) && (vip_cfg.out_videoformat.width == 1856) - && (vip_cfg.in_videoformat.hactive == 1392) && (vip_cfg.out_videoformat.height == 1392)) || //1856x1392 - ((vip_cfg.in_videoformat.vactive == 1792) && (vip_cfg.out_videoformat.width == 1792) - && (vip_cfg.in_videoformat.hactive == 1344) && (vip_cfg.out_videoformat.height == 1344)) || //1792x1344 - ((vip_cfg.in_videoformat.vactive == 2048) && (vip_cfg.out_videoformat.width == 2048) - && (vip_cfg.in_videoformat.hactive == 1152) && (vip_cfg.out_videoformat.height == 1152)) || //2048x1152 - ((vip_cfg.in_videoformat.vactive == 1920) && (vip_cfg.out_videoformat.width == 1920) - && (vip_cfg.in_videoformat.hactive == 1200) && (vip_cfg.out_videoformat.height == 1200)) || //1920x1200 - ((vip_cfg.in_videoformat.vactive == 1920) && (vip_cfg.out_videoformat.width == 1920) - && (vip_cfg.in_videoformat.hactive == 1080) && (vip_cfg.out_videoformat.height == 1080) + if (((vip_cfg.in_videoformat.hactive == 4096) && (vip_cfg.out_videoformat.width == 4096) + && (vip_cfg.in_videoformat.vactive == 2160) && (vip_cfg.out_videoformat.height == 2160)) || //4096x2160 + ((vip_cfg.in_videoformat.hactive == 3840) && (vip_cfg.out_videoformat.width == 3840) + && (vip_cfg.in_videoformat.vactive == 2160) && (vip_cfg.out_videoformat.height == 2160)) || //3840x2160 + ((vip_cfg.in_videoformat.hactive == 2560) && (vip_cfg.out_videoformat.width == 2560) + && (vip_cfg.in_videoformat.vactive == 1600) && (vip_cfg.out_videoformat.height == 1600)) || //2560x1600 + ((vip_cfg.in_videoformat.hactive == 2560) && (vip_cfg.out_videoformat.width == 2560) + && (vip_cfg.in_videoformat.vactive == 1440) && (vip_cfg.out_videoformat.height == 1440)) || //2560x1440 + ((vip_cfg.in_videoformat.hactive == 2560) && (vip_cfg.out_videoformat.width == 2560) + && (vip_cfg.in_videoformat.vactive == 1080) && (vip_cfg.out_videoformat.height == 1080)) || //2560x1080 + ((vip_cfg.in_videoformat.hactive == 1920) && (vip_cfg.out_videoformat.width == 1920) + && (vip_cfg.in_videoformat.vactive == 1440) && (vip_cfg.out_videoformat.height == 1440)) || //1920x1440 + ((vip_cfg.in_videoformat.hactive == 1856) && (vip_cfg.out_videoformat.width == 1856) + && (vip_cfg.in_videoformat.vactive == 1392) && (vip_cfg.out_videoformat.height == 1392)) || //1856x1392 + ((vip_cfg.in_videoformat.hactive == 1792) && (vip_cfg.out_videoformat.width == 1792) + && (vip_cfg.in_videoformat.vactive == 1344) && (vip_cfg.out_videoformat.height == 1344)) || //1792x1344 + ((vip_cfg.in_videoformat.hactive == 2048) && (vip_cfg.out_videoformat.width == 2048) + && (vip_cfg.in_videoformat.vactive == 1152) && (vip_cfg.out_videoformat.height == 1152)) || //2048x1152 + ((vip_cfg.in_videoformat.hactive == 1920) && (vip_cfg.out_videoformat.width == 1920) + && (vip_cfg.in_videoformat.vactive == 1200) && (vip_cfg.out_videoformat.height == 1200)) || //1920x1200 + ((vip_cfg.in_videoformat.hactive == 1920) && (vip_cfg.out_videoformat.width == 1920) + && (vip_cfg.in_videoformat.vactive == 1080) && (vip_cfg.out_videoformat.height == 1080) && (vip_cfg.in_videoformat.fps == 120))) { pr_info("bypass = 1.. in %dx%d out %dx%d\n",vip_cfg.in_videoformat.hactive, vip_cfg.in_videoformat.vactive,vip_cfg.out_videoformat.width,vip_cfg.out_videoformat.height); @@ -338,26 +337,42 @@ static void gc573_stream_on(framegrabber_handle_t handle) switch(pixfmt->pixfmt_out) { - case AVER_XILINX_FMT_YUYV: - case AVER_XILINX_FMT_UYVY: - case AVER_XILINX_FMT_YVYU: - case AVER_XILINX_FMT_VYUY: + case YUYV: + case YVYU: + case VYUY: vip_cfg.pixel_format=AVER_XILINX_FMT_YUYV; - mesg("%s...vip_cfg.pixel_format_output=AVER_XILINX_FMT_YUYV\n",__func__); + pr_info("vip_cfg.pixel_format_output=AVER_XILINX_FMT_YUYV\n"); break; - case AVER_XILINX_FMT_RGBP: //RGB565 - case AVER_XILINX_FMT_RGBR: //RGB565X - case AVER_XILINX_FMT_RGBO: - case AVER_XILINX_FMT_RGBQ: - case AVER_XILINX_FMT_RGB3: //RGB24 4:4:4 - case AVER_XILINX_FMT_BGR3: - case AVER_XILINX_FMT_RGB4: - case AVER_XILINX_FMT_BGR4: - vip_cfg.pixel_format=AVER_XILINX_FMT_RGB3; - mesg("%s...vip_cfg.pixel_format=AVER_XILINX_FMT_RGB3\n",__func__); + case UYVY: + vip_cfg.pixel_format=AVER_XILINX_FMT_UYVY; + pr_info("vip_cfg.pixel_format_output=AVER_XILINX_FMT_UYVY\n"); + break; + case YVU420: + case YVU420M: //YV12 + vip_cfg.pixel_format=AVER_XILINX_FMT_YVU420; + pr_info("vip_cfg.pixel_format_output=AVER_XILINX_FMT_YVU420\n"); + break; + case NV12: + case NV12M: + vip_cfg.pixel_format=AVER_XILINX_FMT_NV12; + pr_info("vip_cfg.pixel_format_output=AVER_XILINX_FMT_NV12\n"); + break; + case RGBP: //RGB565 + case RGBR: //RGB565X + case RGBO: + case RGBQ: + case RGB3: //RGB24 4:4:4 + case BGR3: + vip_cfg.pixel_format=AVER_XILINX_FMT_BGR3; + pr_info("vip_cfg.pixel_format=AVER_XILINX_FMT_BGR3\n"); + break; + case AR24: //fall through + case BA24: + vip_cfg.pixel_format=AVER_XILINX_FMT_RGB4; + pr_info("vip_cfg.pixel_format=AVER_XILINX_FMT_RGB4\n"); break; default: - vip_cfg.pixel_format=AVER_XILINX_CS_YUV422; + vip_cfg.pixel_format=AVER_XILINX_FMT_YUYV; break; } aver_xilinx_config_video_process(board_v4l2_cxt->aver_xilinx_handle,&vip_cfg); @@ -571,33 +586,41 @@ static void gc573_v4l2_buffer_prepare(v4l2_model_callback_parameter_t *cb_info) pr_debug("context %p buffer_info %p\n",board_v4l2_cxt,buffer_info); if(buffer_info) { - int i; + int i, j; v4l2_model_buf_desc_t *desc; - unsigned framebufsize,remain; - int width,height; - unsigned bytesperline; - - framegrabber_g_out_framesize(board_v4l2_cxt->fg_handle,&width,&height); - bytesperline=framegrabber_g_out_bytesperline(board_v4l2_cxt->fg_handle); - framebufsize=bytesperline*height; - //debug_msg("%s %dx%d framesize %u\n",__func__,width,height,framebufsize); - // mesg("buf type %d count %d\n",buffer_info->buf_type,buffer_info->buf_count[0]); - for(i=0,desc=buffer_info->buf_info[0],remain=framebufsize;ibuf_count[0];i++) - { - if(remain >= desc[i].size) - { - aver_xilinx_add_to_cur_desclist(board_v4l2_cxt->aver_xilinx_handle,desc[i].addr,desc[i].size); - remain -= desc[i].size; - }else - { - aver_xilinx_add_to_cur_desclist(board_v4l2_cxt->aver_xilinx_handle,desc[i].addr,remain); - remain =0; - break; + unsigned remain; + unsigned sizes[3]; + unsigned plane_sizes[3]; + + sizes[2] = framegrabber_g_out_planarbuffersize(board_v4l2_cxt->fg_handle, 3); + sizes[1] = framegrabber_g_out_planarbuffersize(board_v4l2_cxt->fg_handle, 2); + sizes[0] = framegrabber_g_out_planarbuffersize(board_v4l2_cxt->fg_handle, 1); + + +// debug_msg("%s %dx%d framesize %u\n",__func__,width,height,framebufsize); + + for(j=0; j < buffer_info->planes; j ++) { + pr_debug("plane %d buf_type %d count %d\n", j, buffer_info->buf_type, buffer_info->buf_count[j]); + for (i = 0, desc = buffer_info->buf_info[j], remain = sizes[j]; i < buffer_info->buf_count[j]; i++) { + if (remain >= desc[i].size) { + aver_xilinx_add_to_cur_desclist(board_v4l2_cxt->aver_xilinx_handle, desc[i].addr, desc[i].size); + remain -= desc[i].size; + } else { + aver_xilinx_add_to_cur_desclist(board_v4l2_cxt->aver_xilinx_handle, desc[i].addr, remain); + remain = 0; + break; + } + + pr_debug("addr %08lx size %lx\n", desc[i].addr, desc[i].size); } - - //mesg("addr %08x size %x\n",desc[i].addr,desc[i].size); } + plane_sizes[2] = framegrabber_g_out_planesize(board_v4l2_cxt->fg_handle, 3); + plane_sizes[1] = framegrabber_g_out_planesize(board_v4l2_cxt->fg_handle, 2); + plane_sizes[0] = framegrabber_g_out_planesize(board_v4l2_cxt->fg_handle, 1); + + aver_xilinx_translate_desclist(board_v4l2_cxt->aver_xilinx_handle, plane_sizes[0], plane_sizes[1], plane_sizes[2]); + aver_xilinx_active_current_desclist(board_v4l2_cxt->aver_xilinx_handle,gc573_video_buffer_done,board_v4l2_cxt); } } @@ -737,8 +760,15 @@ static void gc573_ite6805_event(void *cxt,ite6805_event_e event) { //debug_msg("ITE6805 framerate adapter\n"); fe_frameinfo->framerate /= 2; - } + } + ite6805_get_hdcp_level(ite6805_handle, &hdcp_flag); + + U8_T state; + if (gc573_i2c_read(board_v4l2_cxt->fg_handle, 0, 0x70, 0xd0, 1, &state, 1, 0) == 0){ + hdcp_flag = hdcp_flag | (state&1); + } + *fe_audioinfo = aver_xilinx_get_audioinfo(board_v4l2_cxt->aver_xilinx_handle); framegrabber_s_input_audioinfo(board_v4l2_cxt->fg_handle,*fe_audioinfo); @@ -749,7 +779,7 @@ static void gc573_ite6805_event(void *cxt,ite6805_event_e event) framegrabber_s_input_framesize(board_v4l2_cxt->fg_handle,fe_frameinfo->width,fe_frameinfo->height); //tt 0602 framegrabber_s_input_dualmode(board_v4l2_cxt->fg_handle,fe_frameinfo->dual_pixel); //tt 1003 - + framegrabber_s_hdcp_flag(board_v4l2_cxt->fg_handle,hdcp_flag); //aver_xilinx_dual_pixel(board_v4l2_cxt->aver_xilinx_handle,fe_frameinfo->dual_pixel); @@ -770,7 +800,7 @@ static void gc573_ite6805_event(void *cxt,ite6805_event_e event) ite6805_set_out_format(ite6805_handle,out_format); //ite6805_set_out_format(board_v4l2_cxt->i2c_chip_handle[CX511H_I2C_CHIP_ITE6805_1],ITE6805_OUT_FORMAT_SDR_ITU656_24_MODE0); } - //debug_msg("=========== ite6805_set_out_format=%02x\n",out_format); + pr_info("ite6805_set_out_format=%02x\n",out_format); } //sys_msleep(100); pr_info("pixelclock %d detected %dx%d%c\n",fe_frameinfo->pixel_clock,fe_frameinfo->width,fe_frameinfo->height,(fe_frameinfo->is_interlace) ?'i':'p'); diff --git a/driver/lib/aver_xilinx.o_shipped b/driver/lib/aver_xilinx.o_shipped index d64496fe84222851bfbab319fe57ab8caaf00100..1ced32317f6c0aca3c385f18fe6fa9453722603f 100644 GIT binary patch literal 111472 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 z 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�uunia2X2O3h#Fsyu4kWf*#8U-vjfoQp* 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 Z^svUW*5AK;vg14F1m#^g(AIkV{{R*{;@1EG diff --git a/driver/lib/include/aver_xilinx.h b/driver/lib/include/aver_xilinx.h index 8f2f2a8..11a6720 100644 --- a/driver/lib/include/aver_xilinx.h +++ b/driver/lib/include/aver_xilinx.h @@ -314,17 +314,19 @@ typedef enum typedef enum { AVER_XILINX_FMT_YUYV = 0, - AVER_XILINX_FMT_UYVY, - AVER_XILINX_FMT_YVYU, - AVER_XILINX_FMT_VYUY, - AVER_XILINX_FMT_RGBP, - AVER_XILINX_FMT_RGBR, - AVER_XILINX_FMT_RGBO, - AVER_XILINX_FMT_RGBQ, - AVER_XILINX_FMT_RGB3, - AVER_XILINX_FMT_BGR3, - AVER_XILINX_FMT_RGB4, - AVER_XILINX_FMT_BGR4, + AVER_XILINX_FMT_UYVY, //1 + AVER_XILINX_FMT_YVYU, //2, not available + AVER_XILINX_FMT_VYUY, //3, not available + AVER_XILINX_FMT_YVU420, //YV12 + AVER_XILINX_FMT_NV12, //5 + AVER_XILINX_FMT_RGBP, //6, not available + AVER_XILINX_FMT_RGBR, //7, not available + AVER_XILINX_FMT_RGBO, //8, not available + AVER_XILINX_FMT_RGBQ, //9, not available + AVER_XILINX_FMT_RGB3, //0x0a, not available + AVER_XILINX_FMT_BGR3, //0x0b + AVER_XILINX_FMT_RGB4, //0x0c + AVER_XILINX_FMT_BGR4, //0x0d, not available }aver_xilinx_pixfmt_e; typedef enum @@ -450,6 +452,9 @@ void aver_xilinx_set_audio_dma(handle_t aver_xilinx_handle,aver_xilinx_audio_cfg void aver_xilinx_start_audio_streaming(handle_t aver_xilinx_handle,aver_xilinx_audio_cbinfo_t *cb_info); void aver_xilinx_stop_audio_streaming(handle_t aver_xilinx_handle); void aver_xilinx_add_to_cur_desclist(handle_t aver_xilinx_handle,unsigned long phys_addr,unsigned size); +#if 1 //[AVTLD-79]+ +void aver_xilinx_translate_desclist(handle_t aver_xilinx_handle, unsigned int size, unsigned int size_2, unsigned int size_3); +#endif //[AVTLD-79]- void aver_xilinx_active_current_desclist(handle_t aver_xilinx_handle,aver_xilinx_callback_t callback,void *cb_cxt); void aver_xilinx_config_video_process(handle_t aver_xilinx_handle,aver_xilinx_video_process_cfg_t *vip_cfg); void aver_xilinx_get_frameinfo(handle_t aver_xilinx_handle,aver_xilinx_frame_info_t *frameinfo,U32_T pixelclock); diff --git a/driver/lib/include/pic_bmp.h b/driver/lib/include/pic_bmp.h index b83811a..89de332 100644 --- a/driver/lib/include/pic_bmp.h +++ b/driver/lib/include/pic_bmp.h @@ -12,6 +12,15 @@ typedef void *pic_bmp_handle_t; +typedef enum _pic_bmp_pixfmt_enum_t +{ + PIC_BMP_PIXFMT_YUYV, + PIC_BMP_PIXFMT_YV12, + PIC_BMP_PIXFMT_NV12, + PIC_BMP_PIXFMT_RGB24, + PIC_BMP_PIXFMT_OTHERS, +} pic_bmp_pixfmt_enum_t; + void pic_bmp_init(cxt_mgr_handle_t cxt_mgr , const char *no_signal_filename , const char *out_of_range_filename @@ -19,9 +28,9 @@ void pic_bmp_init(cxt_mgr_handle_t cxt_mgr void pic_bmp_prepare(pic_bmp_handle_t pic_bmp_handle, unsigned long src_width, unsigned long src_height, unsigned long dst_width, unsigned long dst_height); -void load_no_signal_image(pic_bmp_handle_t pic_bmp_handle, unsigned char *dst, int width, int height); -void load_out_of_range_image(pic_bmp_handle_t pic_bmp_handle, unsigned char *dst, int width, int height); -void load_copy_protection_image(pic_bmp_handle_t pic_bmp_handle, unsigned char *dst, int width, int height); +void load_no_signal_image(pic_bmp_handle_t pic_bmp_handle, unsigned char *dst, int width, int height, pic_bmp_pixfmt_enum_t pixfmt_out); +void load_out_of_range_image(pic_bmp_handle_t pic_bmp_handle, unsigned char *dst, int width, int height, pic_bmp_pixfmt_enum_t pixfmt_out); +void load_copy_protection_image(pic_bmp_handle_t pic_bmp_handle, unsigned char *dst, int width, int height, pic_bmp_pixfmt_enum_t pixfmt_out); void load_black_image(pic_bmp_handle_t pic_bmp_handle, unsigned char *dst, int width, int height); #endif /* PIC_INCLUDE_PIC_BMP_H_ */ diff --git a/driver/lib/pic_bmp.o_shipped b/driver/lib/pic_bmp.o_shipped index 5899439b722e9d0f24635a3e228c5ee7ab12f984..d04fe2dff1d2797e2434e87d86dbdd4bab2af808 100644 GIT binary patch literal 10552 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 llH23-kYfiBxr05}4@ve*Rrinterface.s_framesize(handle,width,height); } +unsigned framegrabber_g_out_planesize(framegrabber_handle_t handle, int plane) { + framegrabber_context_t *context=framegrabber_getcontext(handle); + const framegrabber_pixfmt_t *pixfmt; + int width, height; + unsigned out_planesize; + + if (!context) + { + pr_err("ERROR: context is NULL"); + return 0; + } + + pixfmt = &support_pixfmts[context->current_out_pixfmt]; + width = context->current_out_framesize.width; + height = context->current_out_framesize.height; + out_planesize=0; + + switch (pixfmt->pixfmt_out) + { + case NV12: + case NV12M: + if (plane == 1) + out_planesize = width * height; + else if (plane == 2) + out_planesize = (width * height) >> 1; + break; + case YVU420: + case YVU420M: //YV12 + if (plane == 1) + out_planesize = width * height; + else if (plane == 2) + out_planesize = ((width >> 1) * (height >> 1)); + else if (plane == 3) + out_planesize = ((width >> 1) * (height >> 1)); + break; + case RGB3: + case BGR3: + if (plane == 1) + out_planesize = width * height * 3; + break; + case AR24: + case BA24: + if (plane == 1) + out_planesize = width * height * 4; + break; + default: + if (plane == 1) + out_planesize = width * height * 2; + break; + } + + return out_planesize; +} + +unsigned framegrabber_g_out_planarbuffersize(framegrabber_handle_t handle, int plane) +{ + framegrabber_context_t *context=framegrabber_getcontext(handle); + const framegrabber_pixfmt_t *pixfmt; + int width, height; + unsigned out_planarbufsize; + + if (!context) + { + pr_err("ERROR: context is NULL"); + return 0; + } + + pixfmt = &support_pixfmts[context->current_out_pixfmt]; + width = context->current_out_framesize.width; + height = context->current_out_framesize.height; + out_planarbufsize=0; + + switch (pixfmt->pixfmt_out) + { + case NV12: + if (plane == 1) + out_planarbufsize = (width * height) + ((width * height) >> 1); +// out_planarbufsize = width * height * 3; + break; + case NV12M: + if (plane == 1) + out_planarbufsize = width * height; + else if (plane == 2) + out_planarbufsize = (width * height) >> 1; + break; + case YVU420: + if (plane == 1 ) + out_planarbufsize = (width * height) + 2*((width >> 1) * (height >> 1)); +// out_planarbufsize = width * height * 3; + break; + case YVU420M: //YV12 + if (plane == 1) + out_planarbufsize = width * height; + else if (plane == 2) + out_planarbufsize = ((width >> 1) * (height >> 1)); + else if (plane == 3) + out_planarbufsize = ((width >> 1) * (height >> 1)); + break; + case RGB3: + case BGR3: + if (plane == 1) + out_planarbufsize = width * height * 3; + break; + case AR24: + case BA24: + if (plane == 1) + out_planarbufsize = width * height * 4; + break; + default: + if (plane == 1) + out_planarbufsize = width * height * 2; + break; + } + + return out_planarbufsize; +} + +unsigned framegrabber_g_out_framebuffersize(framegrabber_handle_t handle) +{ + unsigned out_framebufsize = 0; + + out_framebufsize += framegrabber_g_out_planarbuffersize(handle, 1); + out_framebufsize += framegrabber_g_out_planarbuffersize(handle, 2); + out_framebufsize += framegrabber_g_out_planarbuffersize(handle, 3); + + return out_framebufsize; +} + unsigned framegrabber_g_max_framebuffersize(framegrabber_handle_t handle) { framegrabber_context_t *context=framegrabber_getcontext(handle); @@ -533,30 +707,95 @@ unsigned framegrabber_g_max_framebuffersize(framegrabber_handle_t handle) return max_framebufsize; } -unsigned framegrabber_g_out_bytesperline(framegrabber_handle_t handle) +unsigned framegrabber_g_out_bytesperline(framegrabber_handle_t handle, int plane) { - framegrabber_context_t *context=framegrabber_getcontext(handle); - const framegrabber_pixfmt_t *pixfmt=framegrabber_g_out_pixelfmt(handle); - unsigned bytesperline; + framegrabber_context_t *context=framegrabber_getcontext(handle); + + if (!context) + { + pr_err("ERROR: context is NULL"); + return 0; + } -// if(context->max_supported_width) -// bytesperline=(context->max_supported_width * pixfmt->depth) >> 3; -// else -// { - if(context->current_out_framesize.width) - bytesperline=(context->current_out_framesize.width * pixfmt->depth) >> 3; - else - bytesperline=(context->current_input_framesize.width * pixfmt->depth) >> 3; - //} + int out_bytesperline = 0; + int width; + const framegrabber_pixfmt_t *pixfmt; + + + if(context->current_out_framesize.width) { + width = context->current_out_framesize.width; + } else { + width = context->current_input_framesize.width; + } + + pixfmt = &support_pixfmts[context->current_out_pixfmt]; + + switch (pixfmt->pixfmt_out) + { + case NV12: + case NV12M: + if (plane == 1) { + out_bytesperline = width; + } + else if (plane == 2) { + out_bytesperline = width; + } + break; + case YVU420: + case YVU420M: //YV12 + if (plane == 1) { + out_bytesperline = width; + } else if (plane == 2) { + out_bytesperline = width/2; + } else if (plane == 3) { + out_bytesperline = width/2; + } + break; + case RGB3: + case BGR3: + if (plane == 1) { + out_bytesperline = width * 3; + } + break; + case AR24: + case BA24: + if (plane == 1) { + out_bytesperline = width * 4; + } + break; + default: + if (plane == 1) { + out_bytesperline = width * 2; + } + break; + } - return bytesperline; + return out_bytesperline; } void framegrabber_g_out_framesize(framegrabber_handle_t handle,int *width,int *height) { framegrabber_context_t *context=framegrabber_getcontext(handle); + if (context->current_out_framesize.width == 0 || context->current_out_framesize.height == 0) { + context->current_out_framesize.width = context->current_input_framesize.width; + context->current_out_framesize.height = context->current_input_framesize.height; + + if(context->interface.s_framesize) + context->interface.s_framesize(handle, context->current_out_framesize.width, context->current_out_framesize.height); + } + + if (context->current_out_framesize.width == 0 || context->current_out_framesize.height == 0) { + context->current_out_framesize.width = 1920; + context->current_out_framesize.height = 1080; + + pr_warn("width == 0 or height == 0 => setting width = %d, height = %d\n", context->current_out_framesize.width, context->current_out_framesize.height); + + if(context->interface.s_framesize) + context->interface.s_framesize(handle, context->current_out_framesize.width, context->current_out_framesize.height); + } + *width=context->current_out_framesize.width; *height=context->current_out_framesize.height; @@ -816,6 +1055,19 @@ int framegrabber_g_supportframesize(framegrabber_handle_t handle,int index,int * return FRAMEGRABBER_ERROR_INVALID_FRAMESIZE; } +int framegrabber_g_support_framesize(framegrabber_handle_t handle,int width,int height) { + int i; + + for(i=0;ivdev; #if LINUX_VERSION_CODE > KERNEL_VERSION(4,18,0) - vdev->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; +// vdev->device_caps = V4L2_CAP_VIDEO_CAPTURE_MPLANE | V4L2_CAP_READWRITE; + vdev->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING | V4L2_CAP_READWRITE; #endif vdev->release = video_device_release_empty; vdev->v4l2_dev = &context->v4l2_dev; diff --git a/driver/utils/v4l2/v4l2_model_ioctl.c b/driver/utils/v4l2/v4l2_model_ioctl.c index a60d58a..197692b 100644 --- a/driver/utils/v4l2/v4l2_model_ioctl.c +++ b/driver/utils/v4l2/v4l2_model_ioctl.c @@ -35,7 +35,7 @@ // defaults for ADV7619 #define BrightnessDefault 0x200 #define ContrastDefault 0x100 -#define SaturationDefault 0x100 +#define SaturationDefault 0x80 #define HueDefault 0x00 //static U32_T SharpnessDefault = 0x00; @@ -49,10 +49,10 @@ #define MAX_VAMP_CONTRAST_UNITS 0x1ff #define MIN_VAMP_SATURATION_UNITS 0 -#define MAX_VAMP_SATURATION_UNITS 360 +#define MAX_VAMP_SATURATION_UNITS 0x1ff #define MIN_VAMP_HUE_UNITS 0 -#define MAX_VAMP_HUE_UNITS 0x1ff +#define MAX_VAMP_HUE_UNITS 360 int brightness_tmp=0; @@ -244,7 +244,8 @@ int v4l2_model_ioctl_querycap(struct file *file, void *fh, struct v4l2_capabilit cap->device_caps = v4l2_model_to_v4l2_caps(v4l2m_context->device_info.capabilities) ; } #else - cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; +// cap->device_caps = V4L2_CAP_VIDEO_CAPTURE_MPLANE | V4L2_CAP_STREAMING; + cap->device_caps = v4l2m_context->vdev.device_caps; #endif cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS; } @@ -253,164 +254,405 @@ int v4l2_model_ioctl_querycap(struct file *file, void *fh, struct v4l2_capabilit int v4l2_model_ioctl_enum_fmt_vid_cap(struct file *file, void *fh, struct v4l2_fmtdesc *f) { - v4l2_model_context_t *v4l2m_context = video_drvdata(file); - U32_T index = f->index; + v4l2_model_context_t *v4l2m_context = video_drvdata(file); + U32_T index = f->index; + if(f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE && f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) + { + pr_err("ENUM_FMT with invalid type: %d\n", f->type); + return -EINVAL; + } - if(f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) - { - pr_info("%s.\n",__func__); - return -EINVAL; - } + if(v4l2m_context) + { + const framegrabber_pixfmt_t *pixfmt; - if(v4l2m_context) - { - const framegrabber_pixfmt_t *pixfmt; - if(f->index <0) - { - return -EINVAL; - } - if(f->index >= FRAMEGRABBER_PIXFMT_MAX) - { - return -EINVAL; - } - else - { - pixfmt=framegrabber_g_support_pixelfmt_by_index(v4l2m_context->framegrabber_handle,f->index); - //pr_info("%s..pixfmt=%d.\n",__func__,f->index); - f->index = index; - f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - strlcpy(f->description, pixfmt->name, sizeof(f->description)); - f->pixelformat=pixfmt->fourcc; - } - - - if(pixfmt==NULL) - return -EINVAL; - //pr_info("%s....pixfmt=%d.\n",__func__,f->index); - strlcpy(f->description, pixfmt->name, sizeof(f->description)); - f->pixelformat=pixfmt->fourcc; - } + if(f->index <0) + { + return -EINVAL; + } + + if(f->index >= FRAMEGRABBER_PIXFMT_MAX) + { + return -EINVAL; + } + + pixfmt=framegrabber_g_support_pixelfmt_by_index(v4l2m_context->framegrabber_handle,f->index); + + if(pixfmt==NULL) + return -EINVAL; + + if ((pixfmt->num_planes > 1) && (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)) { + return -EINVAL; + } + + pr_info("%s pixfmt=%d\n", pixfmt->name, f->index); + f->index = index; + + strlcpy(f->description, pixfmt->name, sizeof(f->description)); + f->pixelformat=pixfmt->fourcc; + } + + return 0; - return 0; - } int v4l2_model_ioctl_g_fmt_vid_cap(struct file *file, void *fh,struct v4l2_format *f) { - v4l2_model_context_t *v4l2m_context = video_drvdata(file); - const framegrabber_pixfmt_t *pixfmt; - BOOL_T interlace_mode; + v4l2_model_context_t *v4l2m_context = video_drvdata(file); + const framegrabber_pixfmt_t *pixfmt; + BOOL_T interlace_mode; - pixfmt=framegrabber_g_out_pixelfmt(v4l2m_context->framegrabber_handle); - interlace_mode = framegrabber_g_input_interlace(v4l2m_context->framegrabber_handle); - if(pixfmt) - { - int width,height; - //unsigned bytesperline; - - framegrabber_g_input_framesize(v4l2m_context->framegrabber_handle,&width,&height); - //bytesperline=framegrabber_g_out_bytesperline(v4l2m_context->framegrabber_handle); - //pr_info("%s..f->fmt.pix.width=%d.f->fmt.pix.height=%d.\n",__func__,f->fmt.pix.width,f->fmt.pix.height); - - f->fmt.pix.width=width; - f->fmt.pix.height=height; - f->fmt.pix.field=V4L2_FIELD_NONE; //Field - f->fmt.pix.pixelformat = pixfmt->fourcc; - - //f->fmt.pix.bytesperline = bytesperline; - f->fmt.pix.bytesperline = (f->fmt.pix.width * pixfmt->depth) >> 3; - f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline; - if (pixfmt->is_yuv) - f->fmt.pix.colorspace = V4L2_COLORSPACE_REC709; - else - f->fmt.pix.colorspace = V4L2_COLORSPACE_SRGB; + if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) { + pr_err("G_FMT with invalid type: %d\n", f->type); + return -EINVAL; + } - - if (interlace_mode) + interlace_mode = framegrabber_g_input_interlace(v4l2m_context->framegrabber_handle); + pixfmt=framegrabber_g_out_pixelfmt(v4l2m_context->framegrabber_handle); + + if (!pixfmt || pixfmt->num_planes > 1) { + pr_err("numplanes > 1 while type is single planar\n"); + pixfmt = framegrabber_g_support_pixelfmt_by_index(v4l2m_context->framegrabber_handle,0); + framegrabber_s_out_pixelfmt(v4l2m_context->framegrabber_handle, pixfmt->fourcc); + } + + if(pixfmt) + { + int width,height; + unsigned bytesperline; + unsigned sizeimage; + + framegrabber_g_out_framesize(v4l2m_context->framegrabber_handle, &width, &height); + + if(framegrabber_g_support_framesize(v4l2m_context->framegrabber_handle, width, height) != FRAMEGRABBER_OK) { + + framegrabber_g_input_framesize(v4l2m_context->framegrabber_handle, &width, &height); + + if (width == 0 || height == 0) { + width = 1920; + height = 1080; + } + pr_warn("no correct output framesize defined, using %dx%d\n", width, height); + framegrabber_s_out_framesize(v4l2m_context->framegrabber_handle, width, height); + } + + bytesperline = framegrabber_g_out_bytesperline(v4l2m_context->framegrabber_handle, 1); + sizeimage = framegrabber_g_out_planarbuffersize(v4l2m_context->framegrabber_handle, 1); + + pr_info("pixelformat = %s bytesperline = %d and sizeimage = %d\n", pixfmt->name, bytesperline, sizeimage); + + f->fmt.pix.width = width; + f->fmt.pix.height = height; + f->fmt.pix.field = V4L2_FIELD_NONE; //Field + f->fmt.pix.pixelformat = pixfmt->fourcc; + + f->fmt.pix.bytesperline = bytesperline; + f->fmt.pix.sizeimage = sizeimage; + if (pixfmt->is_yuv) { + f->fmt.pix.colorspace = V4L2_COLORSPACE_REC709; + f->fmt.pix.xfer_func = V4L2_XFER_FUNC_DEFAULT; + f->fmt.pix.ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT; + f->fmt.pix.quantization = V4L2_QUANTIZATION_DEFAULT; + } else { + f->fmt.pix.colorspace = V4L2_COLORSPACE_SRGB; + f->fmt.pix.xfer_func = V4L2_XFER_FUNC_DEFAULT; + f->fmt.pix.ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT; + f->fmt.pix.quantization = V4L2_QUANTIZATION_DEFAULT; + } + + if (interlace_mode) { + //f->fmt.pix.height = height*2; + f->fmt.pix.field = V4L2_FIELD_INTERLACED; + } + + //pr_info("%s....f->fmt.pix.width=%d.f->fmt.pix.height=%d.\n",__func__,f->fmt.pix.width,f->fmt.pix.height); + return 0; + } + + return -EINVAL; +} + +int v4l2_model_ioctl_g_fmt_vid_cap_mplane(struct file *file, void *fh,struct v4l2_format *f) { + v4l2_model_context_t *v4l2m_context = video_drvdata(file); + const framegrabber_pixfmt_t *pixfmt; + BOOL_T interlace_mode; + + if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) { + pr_err("G_FMT with invalid type: %d\n", f->type); + return -EINVAL; + } + + interlace_mode = framegrabber_g_input_interlace(v4l2m_context->framegrabber_handle); + + pixfmt=framegrabber_g_out_pixelfmt(v4l2m_context->framegrabber_handle); + if (!pixfmt) { + pr_warn("no output pixelformat defined\n"); + pixfmt = framegrabber_g_support_pixelfmt_by_index(v4l2m_context->framegrabber_handle,0); + framegrabber_s_out_pixelfmt(v4l2m_context->framegrabber_handle, pixfmt->fourcc); + } + + if(pixfmt) { + int width, height; + int i; + + framegrabber_g_out_framesize(v4l2m_context->framegrabber_handle, &width, &height); + + if(framegrabber_g_support_framesize(v4l2m_context->framegrabber_handle, width, height) != FRAMEGRABBER_OK) { + + framegrabber_g_input_framesize(v4l2m_context->framegrabber_handle, &width, &height); + + if (width == 0 || height == 0) { + width = 1920; + height = 1080; + } + pr_warn("no correct output framesize defined, using %dx%d\n", width, height); + framegrabber_s_out_framesize(v4l2m_context->framegrabber_handle, width, height); + } + + if (pixfmt->num_planes == 1) { + f->fmt.pix.bytesperline = framegrabber_g_out_bytesperline(v4l2m_context->framegrabber_handle, 1); + f->fmt.pix.sizeimage = framegrabber_g_out_planarbuffersize(v4l2m_context->framegrabber_handle, 1); + + if (pixfmt->is_yuv) { + f->fmt.pix.colorspace = V4L2_COLORSPACE_REC709; + f->fmt.pix.xfer_func = V4L2_XFER_FUNC_DEFAULT; + f->fmt.pix.ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT; + f->fmt.pix.quantization = V4L2_QUANTIZATION_DEFAULT; + } else { + f->fmt.pix.colorspace = V4L2_COLORSPACE_SRGB; + f->fmt.pix.xfer_func = V4L2_XFER_FUNC_DEFAULT; + f->fmt.pix.ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT; + f->fmt.pix.quantization = V4L2_QUANTIZATION_DEFAULT; + } + + if (interlace_mode) { + //f->fmt.pix.height = height*2; + f->fmt.pix.field = V4L2_FIELD_INTERLACED; + } else { + f->fmt.pix.field = V4L2_FIELD_NONE; + } + + f->fmt.pix.priv = 0; + } + + pr_info("pixelformat %s on %d planes with size %dx%d\n", pixfmt->name, pixfmt->num_planes, width, height); + + f->fmt.pix_mp.num_planes = pixfmt->num_planes; + f->fmt.pix_mp.width = width; + f->fmt.pix_mp.height = height; + f->fmt.pix_mp.field = V4L2_FIELD_NONE; //Field + f->fmt.pix_mp.pixelformat = pixfmt->fourcc; + + if (pixfmt->is_yuv) { + f->fmt.pix_mp.colorspace = V4L2_COLORSPACE_REC709; + f->fmt.pix_mp.xfer_func = V4L2_XFER_FUNC_709; + f->fmt.pix_mp.ycbcr_enc = V4L2_YCBCR_ENC_709; + } else { + f->fmt.pix_mp.colorspace = V4L2_COLORSPACE_SRGB; + f->fmt.pix_mp.xfer_func = V4L2_XFER_FUNC_SRGB; + f->fmt.pix_mp.ycbcr_enc = V4L2_YCBCR_ENC_BT2020; + } + + if (interlace_mode) { - //f->fmt.pix.height = height*2; - f->fmt.pix.field=V4L2_FIELD_INTERLACED; - } - //pr_info("%s....f->fmt.pix.width=%d.f->fmt.pix.height=%d.\n",__func__,f->fmt.pix.width,f->fmt.pix.height); - return 0; - } + //f->fmt.pix.height = height*2; + f->fmt.pix_mp.field=V4L2_FIELD_INTERLACED; + } - return -EINVAL; + for (i=0; i < pixfmt->num_planes; i++) { + f->fmt.pix_mp.plane_fmt[i].bytesperline = framegrabber_g_out_bytesperline(v4l2m_context->framegrabber_handle, i+1); + f->fmt.pix_mp.plane_fmt[i].sizeimage = framegrabber_g_out_planarbuffersize(v4l2m_context->framegrabber_handle, i+1); + + pr_info("plane[%d]: set bytesperline %d and sizeimage %d\n", i, f->fmt.pix_mp.plane_fmt[i].bytesperline, f->fmt.pix_mp.plane_fmt[i].sizeimage); + } + + return 0; + } + + return -EINVAL; } + int v4l2_model_ioctl_try_fmt_vid_cap(struct file *file, void *fh, struct v4l2_format *f) { - v4l2_model_context_t *v4l2m_context = video_drvdata(file); - const framegrabber_pixfmt_t *fmt; - int width,height; - BOOL_T interlace_mode; + v4l2_model_context_t *v4l2m_context = video_drvdata(file); + const framegrabber_pixfmt_t *pixfmt; + BOOL_T interlace_mode; + + if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) { + pr_err("TRY_FMT with invalid type: %d\n", f->type); + return -EINVAL; + } + //pr_info("%s>>f->fmt.pix.width=%d.f->fmt.pix.height=%d.f->fmt.pix.pixelformat=%d\n",__func__,f->fmt.pix.width,f->fmt.pix.height,f->fmt.pix.pixelformat); - fmt = framegrabber_g_support_pixelfmt_by_fourcc(v4l2m_context->framegrabber_handle, f->fmt.pix.pixelformat); - - framegrabber_g_input_framesize(v4l2m_context->framegrabber_handle,&width,&height); - - interlace_mode = framegrabber_g_input_interlace(v4l2m_context->framegrabber_handle); - - if(!fmt) + pixfmt = framegrabber_g_support_pixelfmt_by_fourcc(v4l2m_context->framegrabber_handle, f->fmt.pix.pixelformat); + if(!pixfmt || pixfmt->num_planes > 1) { - pr_info("%s..\n",__func__); - return 0; - } + pr_warn("fmt is not valid\n"); + pixfmt = framegrabber_g_support_pixelfmt_by_index(v4l2m_context->framegrabber_handle,0); - //if(width!=0 && height!=0) - { - if ((f->fmt.pix.width <320) || (f->fmt.pix.width >4096) || (f->fmt.pix.height <240) || (f->fmt.pix.height >2160)) - { - if (interlace_mode) - { - f->fmt.pix.width=width; - //f->fmt.pix.height=height*2; - f->fmt.pix.field =V4L2_FIELD_INTERLACED; //field order - //pr_info("%s>f->fmt.pix.width=%d.f->fmt.pix.height=%d.\n",__func__,f->fmt.pix.width,f->fmt.pix.height); - } - else - { - f->fmt.pix.width=width; - f->fmt.pix.height=height; - f->fmt.pix.field = V4L2_FIELD_NONE; - } - } - else - { - if ((f->fmt.pix.height == height) && interlace_mode) - { - //f->fmt.pix.height=height*2; - f->fmt.pix.field =V4L2_FIELD_INTERLACED; - //pr_info("%s f->fmt.pix.width=%d.f->fmt.pix.height=%d.\n",__func__,f->fmt.pix.width,f->fmt.pix.height); - } - else - { - f->fmt.pix.field = V4L2_FIELD_NONE; - } - } - } - if ((f->fmt.pix.width ==0) || (f->fmt.pix.height ==0)) - { - f->fmt.pix.width = 1920; - f->fmt.pix.height = 1080; - } - - - f->fmt.pix.bytesperline = (f->fmt.pix.width * fmt->depth) >> 3; - f->fmt.pix.sizeimage =f->fmt.pix.height * f->fmt.pix.bytesperline; - - if (fmt!=NULL && fmt->is_yuv) - f->fmt.pix.colorspace = V4L2_COLORSPACE_REC709;//V4L2_COLORSPACE_SMPTE170M; - else - f->fmt.pix.colorspace = V4L2_COLORSPACE_SRGB; + f->fmt.pix.pixelformat = pixfmt->fourcc; + } + + interlace_mode = framegrabber_g_input_interlace(v4l2m_context->framegrabber_handle); + + if(framegrabber_g_support_framesize(v4l2m_context->framegrabber_handle, f->fmt.pix.width, f->fmt.pix.height) != FRAMEGRABBER_OK) { + int width, height; + + pr_warn("framesize %dx%d is not supported\n", f->fmt.pix.width, f->fmt.pix.height); + + framegrabber_g_input_framesize(v4l2m_context->framegrabber_handle, &width, &height); + + if (width == 0 || height == 0) { + width = 1920; + height = 1080; + } + + f->fmt.pix.width = width; + f->fmt.pix.height = height; + } + + unsigned bytesperline; + unsigned sizeimage; + + bytesperline = framegrabber_g_out_bytesperline(v4l2m_context->framegrabber_handle, 1); + sizeimage = framegrabber_g_out_planarbuffersize(v4l2m_context->framegrabber_handle, 1); + + f->fmt.pix.bytesperline = bytesperline; + f->fmt.pix.sizeimage = sizeimage; + + if (pixfmt->is_yuv) { + f->fmt.pix.colorspace = V4L2_COLORSPACE_REC709; + f->fmt.pix.xfer_func = V4L2_XFER_FUNC_DEFAULT; + f->fmt.pix.ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT; + f->fmt.pix.quantization = V4L2_QUANTIZATION_DEFAULT; + } else { + f->fmt.pix.colorspace = V4L2_COLORSPACE_SRGB; + f->fmt.pix.xfer_func = V4L2_XFER_FUNC_DEFAULT; + f->fmt.pix.ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT; + f->fmt.pix.quantization = V4L2_QUANTIZATION_DEFAULT; + } + + if (interlace_mode) + { + //f->fmt.pix.height = height*2; + f->fmt.pix.field=V4L2_FIELD_INTERLACED; + } else { + f->fmt.pix.field = V4L2_FIELD_NONE; + } + + f->fmt.pix.priv = 0; - f->fmt.pix.priv = 0; - //pr_info("%s<fmt.pix.width=%d.f->fmt.pix.height=%d.\n",__func__,f->fmt.pix.width,f->fmt.pix.height); - return 0; + return 0; +} + +int v4l2_model_ioctl_try_fmt_vid_cap_mplane(struct file *file, void *fh, struct v4l2_format *f) +{ + v4l2_model_context_t *v4l2m_context = video_drvdata(file); + const framegrabber_pixfmt_t *pixfmt; + BOOL_T interlace_mode; + int i; + + if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) { + pr_err("TRY_FMT with invalid type: %d\n", f->type); + return -EINVAL; + } + + pixfmt = framegrabber_g_support_pixelfmt_by_fourcc(v4l2m_context->framegrabber_handle, f->fmt.pix_mp.pixelformat); + if(!pixfmt) + { + pr_warn("fmt is not valid\n"); + pixfmt = framegrabber_g_out_pixelfmt(v4l2m_context->framegrabber_handle); + + f->fmt.pix_mp.pixelformat = pixfmt->fourcc; + } + if (f->fmt.pix_mp.num_planes != pixfmt->num_planes) { + pr_warn("wrong number of planes %d\n", f->fmt.pix_mp.num_planes); + f->fmt.pix_mp.num_planes = pixfmt->num_planes; + } + + interlace_mode = framegrabber_g_input_interlace(v4l2m_context->framegrabber_handle); + + if(framegrabber_g_support_framesize(v4l2m_context->framegrabber_handle, f->fmt.pix_mp.width, f->fmt.pix_mp.height) != FRAMEGRABBER_OK) { + int width,height; + + pr_warn("framesize %dx%d is not supported\n", f->fmt.pix_mp.width, f->fmt.pix_mp.height); + + framegrabber_g_input_framesize(v4l2m_context->framegrabber_handle,&width,&height); + + if (width == 0 || height == 0) { + width = 1920; + height = 1080; + } + + if (pixfmt->num_planes == 1) { + f->fmt.pix.width=width; + f->fmt.pix.height=height; + } + + f->fmt.pix_mp.width=width; + f->fmt.pix_mp.height=height; + } + + if (pixfmt->num_planes == 1) { + f->fmt.pix.bytesperline = framegrabber_g_out_bytesperline(v4l2m_context->framegrabber_handle, 1); + f->fmt.pix.sizeimage = framegrabber_g_out_planarbuffersize(v4l2m_context->framegrabber_handle, 1); + + if (pixfmt->is_yuv) { + f->fmt.pix.colorspace = V4L2_COLORSPACE_REC709; + f->fmt.pix.xfer_func = V4L2_XFER_FUNC_DEFAULT; + f->fmt.pix.ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT; + f->fmt.pix.quantization = V4L2_QUANTIZATION_DEFAULT; + } else { + f->fmt.pix.colorspace = V4L2_COLORSPACE_SRGB; + f->fmt.pix.xfer_func = V4L2_XFER_FUNC_DEFAULT; + f->fmt.pix.ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT; + f->fmt.pix.quantization = V4L2_QUANTIZATION_DEFAULT; + } + + if (interlace_mode) { + //f->fmt.pix.height = height*2; + f->fmt.pix.field = V4L2_FIELD_INTERLACED; + } else { + f->fmt.pix.field = V4L2_FIELD_NONE; + } + + f->fmt.pix.priv = 0; + } + + f->fmt.pix_mp.num_planes = pixfmt->num_planes; + f->fmt.pix_mp.field = V4L2_FIELD_NONE; //Field + f->fmt.pix_mp.pixelformat = pixfmt->fourcc; + + if (pixfmt->is_yuv) { + f->fmt.pix_mp.colorspace = V4L2_COLORSPACE_REC709; + f->fmt.pix_mp.xfer_func = V4L2_XFER_FUNC_DEFAULT; + f->fmt.pix_mp.ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT; + f->fmt.pix_mp.quantization = V4L2_QUANTIZATION_DEFAULT; + } else { + f->fmt.pix_mp.colorspace = V4L2_COLORSPACE_SRGB; + f->fmt.pix_mp.xfer_func = V4L2_XFER_FUNC_DEFAULT; + f->fmt.pix_mp.ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT; + f->fmt.pix_mp.quantization = V4L2_QUANTIZATION_DEFAULT; + } + + if (interlace_mode) + { + //f->fmt.pix.height = height*2; + f->fmt.pix_mp.field=V4L2_FIELD_INTERLACED; + } + + for (i=0; i < pixfmt->num_planes; i++) { + f->fmt.pix_mp.plane_fmt[i].bytesperline = framegrabber_g_out_bytesperline(v4l2m_context->framegrabber_handle, i+1); + f->fmt.pix_mp.plane_fmt[i].sizeimage = framegrabber_g_out_planarbuffersize(v4l2m_context->framegrabber_handle, i+1); + } + + //pr_info("%s<fmt.pix.width=%d.f->fmt.pix.height=%d.\n",__func__,f->fmt.pix.width,f->fmt.pix.height); + return 0; } int v4l2_model_ioctl_s_fmt_vid_cap(struct file *file, void *fh,struct v4l2_format *f) @@ -430,23 +672,41 @@ int v4l2_model_ioctl_s_fmt_vid_cap(struct file *file, void *fh,struct v4l2_forma return -EBUSY; } - /* TODO check setting format is supported */ + pr_info("f->fmt.pix.width=%d..f->fmt.pix.height=%d..f->fmt.pix.pixelformat=%d\n",f->fmt.pix.width,f->fmt.pix.height,f->fmt.pix.pixelformat); + framegrabber_s_out_framesize(v4l2m_context->framegrabber_handle,f->fmt.pix.width,f->fmt.pix.height); + framegrabber_s_out_pixelfmt(v4l2m_context->framegrabber_handle,f->fmt.pix.pixelformat); + unsigned bytesperline = framegrabber_g_out_bytesperline(v4l2m_context->framegrabber_handle, 1); + unsigned sizeimage = framegrabber_g_out_planarbuffersize(v4l2m_context->framegrabber_handle, 1); + f->fmt.pix.bytesperline = bytesperline; + f->fmt.pix.sizeimage = sizeimage; - if(framegrabber_g_support_pixelfmt_by_fourcc(v4l2m_context->framegrabber_handle,f->fmt.pix.pixelformat)==NULL) - { - pr_info("..%s..\n",__func__); - return -EINVAL; - } - if(f->fmt.pix.width==0 || f->fmt.pix.height==0) - { - pr_info("..%s.\n",__func__); - return -EINVAL; - } - //pr_info("%s.f->fmt.pix.width=%d..f->fmt.pix.height=%d\n",__func__,f->fmt.pix.width,f->fmt.pix.height); - framegrabber_s_out_framesize(v4l2m_context->framegrabber_handle,f->fmt.pix.width,f->fmt.pix.height); - framegrabber_s_out_pixelfmt(v4l2m_context->framegrabber_handle,f->fmt.pix.pixelformat); + pr_info("bytesperline = %d and sizeimage = %d\n", bytesperline, sizeimage); + + return 0; +} + +int v4l2_model_ioctl_s_fmt_vid_cap_mplane(struct file *file, void *fh,struct v4l2_format *f) +{ + + v4l2_model_context_t *v4l2m_context = video_drvdata(file); + + int ret = v4l2_model_ioctl_try_fmt_vid_cap_mplane(file, fh, f); + if (ret < 0) + { + pr_err("try_vid_cap failed\n"); + return ret; + } + + if (vb2_is_busy(&v4l2m_context->queue)) { + pr_info("%s.\n",__func__); + return -EBUSY; + } + + pr_info("f->fmt.pix_mp.width=%d..f->fmt.pix_mp.height=%d pixelformat=%d\n",f->fmt.pix.width,f->fmt.pix.height, f->fmt.pix_mp.pixelformat); + framegrabber_s_out_framesize(v4l2m_context->framegrabber_handle,f->fmt.pix_mp.width,f->fmt.pix_mp.height); + framegrabber_s_out_pixelfmt(v4l2m_context->framegrabber_handle,f->fmt.pix_mp.pixelformat); return 0; } @@ -465,10 +725,8 @@ int v4l2_model_ioctl_enum_framesizes(struct file *file, void *fh, struct v4l2_fr pr_info("%s..\n",__func__); return -EINVAL; } - else - { - //pr_info("%s %08x %x\n",__func__,fsize->pixel_format,pixfmt->fourcc); - } + + //pr_info("%s %08x %x\n",__func__,fsize->pixel_format,pixfmt->fourcc); if(framegrabber_g_supportframesize(v4l2m_context->framegrabber_handle,fsize->index,&width,&height)!=FRAMEGRABBER_OK) { @@ -549,101 +807,100 @@ int v4l2_model_ioctl_s_input(struct file *file, void *fh, unsigned int i) int v4l2_model_ioctl_enum_frameintervals(struct file *file, void *fh, struct v4l2_frmivalenum *fival) { - int frameinterval=0; - v4l2_model_context_t *v4l2m_context = video_drvdata(file); + int fivaldenominator=0; + int fivalnumerator = 1; + v4l2_model_context_t *v4l2m_context = video_drvdata(file); BOOL_T interlace_mode; - - interlace_mode = framegrabber_g_input_interlace(v4l2m_context->framegrabber_handle); + interlace_mode = framegrabber_g_input_interlace(v4l2m_context->framegrabber_handle); - frameinterval=framegrabber_g_framesize_supportrefreshrate(v4l2m_context->framegrabber_handle,fival->width,fival->height,fival->index); - if(frameinterval) - { - //pr_info("%s..\n",__func__); - fival->type = V4L2_FRMIVAL_TYPE_DISCRETE; - fival->discrete.numerator=1; - fival->discrete.denominator=frameinterval; - }else - { - //pr_info("%s.\n",__func__); - if(fival->index==0) - { - //frameinterval = framegrabber_g_out_framerate(v4l2m_context->framegrabber_handle); - //if (frameinterval ==0) - { - frameinterval=framegrabber_g_input_framerate(v4l2m_context->framegrabber_handle); - } - fival->type = V4L2_FRMIVAL_TYPE_DISCRETE; - fival->discrete.numerator=1; - //fival->discrete.numerator=1000; - fival->discrete.denominator=frameinterval; - - }else{ - return -EINVAL; - } - } - - if (interlace_mode) fival->discrete.denominator /=2; - - - //pr_info("%s.frameinterval =%d.fival->width=%d.fival->height=%d\n",__func__,frameinterval,fival->width,fival->height); - return 0; + + fivaldenominator=framegrabber_g_framesize_supportrefreshrate(v4l2m_context->framegrabber_handle, fival->width, fival->height, fival->index); + + if(fivaldenominator) + { + pr_info("fivaldenominator = %d\n", fivaldenominator); + fival->type = V4L2_FRMIVAL_TYPE_DISCRETE; + fival->discrete.numerator=fivalnumerator; + fival->discrete.denominator=fivaldenominator; + }else{ + return -EINVAL; + } + + if (interlace_mode) fival->discrete.denominator /=2; + + + //pr_info("%s.fivaldenominator =%d.fival->width=%d.fival->height=%d\n",__func__,fivaldenominator,fival->width,fival->height); + return 0; } int v4l2_model_ioctl_g_parm(struct file *file, void *fh,struct v4l2_streamparm *a) { v4l2_model_context_t *v4l2m_context = video_drvdata(file); - //int current_denominator; + U32_T io_frame_rate; + U32_T in_frame_rate; - if (a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) + if ((a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) && (a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)) { pr_err("unsupported video buffer type"); return -EINVAL; } + io_frame_rate = framegrabber_g_out_framerate(v4l2m_context->framegrabber_handle); + in_frame_rate = framegrabber_g_input_framerate(v4l2m_context->framegrabber_handle); + a->parm.capture.capability = V4L2_CAP_TIMEPERFRAME; - a->parm.capture.capturemode = V4L2_MODE_HIGHQUALITY; - a->parm.capture.timeperframe.numerator = 1; - //pr_info("%s>>>>>>>>>denominator=%d\n",__func__,a->parm.capture.timeperframe.denominator); + a->parm.capture.readbuffers = 1; - //a->parm.capture.timeperframe.denominator = framegrabber_g_out_framerate(v4l2m_context->framegrabber_handle); - //pr_info("%s>>>>>>>>>denominator=%d\n",__func__,a->parm.capture.timeperframe.denominator); - if ((a->parm.capture.timeperframe.denominator ==0) || (a->parm.capture.timeperframe.denominator >60)) + a->parm.capture.timeperframe.numerator = 1; + a->parm.capture.timeperframe.denominator = io_frame_rate; + + if ((a->parm.capture.timeperframe.denominator ==0) || (a->parm.capture.timeperframe.denominator >144)) { - a->parm.capture.timeperframe.denominator = framegrabber_g_input_framerate(v4l2m_context->framegrabber_handle); - //pr_info("%s..io_framerate=%d\n",__func__,a->parm.capture.timeperframe.denominator/a->parm.capture.timeperframe.numerator); - }else - {// - //framegrabbe_s_out_framerate(v4l2m_context->framegrabber_handle,a->parm.capture.timeperframe.denominator/a->parm.capture.timeperframe.numerator); - - //pr_info("%s..in_framerate=%d\n",__func__,a->parm.capture.timeperframe.denominator/a->parm.capture.timeperframe.numerator); - } - - return 0; + if (in_frame_rate != 0) { + a->parm.capture.timeperframe.denominator = in_frame_rate; + } else { + //If there is no input framerate and no output framerate is set, default to 60 + a->parm.capture.timeperframe.denominator = REFRESHRATE_60; + } + + //If output framerate is not valid, set it to the read value + framegrabber_s_out_framerate(v4l2m_context->framegrabber_handle,a->parm.capture.timeperframe.denominator); + } + + pr_info("a->parm.capture.timeperframe.denominator=%d a->parm.capture.timeperframe.numerator=%d\n",a->parm.capture.timeperframe.denominator, a->parm.capture.timeperframe.numerator); + + return 0; } int v4l2_model_ioctl_s_parm(struct file *file, void *fh,struct v4l2_streamparm *a) { v4l2_model_context_t *v4l2m_context = video_drvdata(file); - U32_T io_frame_rate; - U32_T in_frame_rate; - //pr_info("%s...a->parm.capture.timeperframe.denominator=%d\n",__func__,a->parm.capture.timeperframe.denominator); - io_frame_rate = a->parm.capture.timeperframe.denominator/a->parm.capture.timeperframe.numerator; - in_frame_rate = framegrabber_g_input_framerate(v4l2m_context->framegrabber_handle); - if ((io_frame_rate !=0) /*&& (io_frame_rate <=85)*/) + U32_T io_frame_rate = 0; + U32_T in_frame_rate = 0; + pr_info("a->parm.capture.timeperframe.denominator=%d a->parm.capture.timeperframe.numerator=%d\n",a->parm.capture.timeperframe.denominator, a->parm.capture.timeperframe.numerator); + + if (a->parm.capture.timeperframe.numerator > 0) + io_frame_rate = a->parm.capture.timeperframe.denominator/a->parm.capture.timeperframe.numerator; + in_frame_rate = framegrabber_g_input_framerate(v4l2m_context->framegrabber_handle); + if ((io_frame_rate > 0) && (io_frame_rate <= 144)) { framegrabber_s_out_framerate(v4l2m_context->framegrabber_handle,io_frame_rate); //a->parm.capture.timeperframe.denominator = io_frame_rate; - pr_info("%s set io_framerate= %u\n", __func__, io_frame_rate); + pr_info("set framerate to io_framerate= %u\n", io_frame_rate); } - else + else if (in_frame_rate != 0) { framegrabber_s_out_framerate(v4l2m_context->framegrabber_handle,in_frame_rate); - pr_info("%s set in_framerate= %u\n", __func__, in_frame_rate); - } - - + pr_info("set framerate to in_framerate= %u\n", in_frame_rate); + } else { + framegrabber_s_out_framerate(v4l2m_context->framegrabber_handle,REFRESHRATE_60); + pr_info("set framerate to 60 Hz\n"); + } + + a->parm.capture.capability = V4L2_CAP_TIMEPERFRAME; + //framegrabber_s_input_framerate(v4l2m_context->framegrabber_handle,a->parm.capture.timeperframe.denominator/a->parm.capture.timeperframe.numerator,a->parm.capture.timeperframe.denominator); //for test //pr_info("%s..%d %d\n",__func__,a->parm.capture.timeperframe.denominator,a->parm.capture.timeperframe.numerator); return 0; diff --git a/driver/utils/v4l2/v4l2_model_ioctl.h b/driver/utils/v4l2/v4l2_model_ioctl.h index 3e2d9a6..4eb292b 100644 --- a/driver/utils/v4l2/v4l2_model_ioctl.h +++ b/driver/utils/v4l2/v4l2_model_ioctl.h @@ -22,8 +22,11 @@ int v4l2_model_ioctl_querycap(struct file *file, void *fh, struct v4l2_capability *cap); int v4l2_model_ioctl_enum_fmt_vid_cap(struct file *file, void *fh, struct v4l2_fmtdesc *f); int v4l2_model_ioctl_g_fmt_vid_cap(struct file *file, void *fh,struct v4l2_format *f); +int v4l2_model_ioctl_g_fmt_vid_cap_mplane(struct file *file, void *fh,struct v4l2_format *f); int v4l2_model_ioctl_try_fmt_vid_cap(struct file *file, void *fh, struct v4l2_format *f); +int v4l2_model_ioctl_try_fmt_vid_cap_mplane(struct file *file, void *fh, struct v4l2_format *f); int v4l2_model_ioctl_s_fmt_vid_cap(struct file *file, void *fh,struct v4l2_format *f); +int v4l2_model_ioctl_s_fmt_vid_cap_mplane(struct file *file, void *fh,struct v4l2_format *f); int v4l2_model_ioctl_enum_framesizes(struct file *file, void *fh, struct v4l2_frmsizeenum *fsize); int v4l2_model_ioctl_enum_input(struct file *file, void *fh, struct v4l2_input *inp); int v4l2_model_ioctl_g_input(struct file *file, void *fh, unsigned int *i); diff --git a/driver/utils/v4l2/v4l2_model_videobuf2.c b/driver/utils/v4l2/v4l2_model_videobuf2.c index 6836fdd..036fa0f 100644 --- a/driver/utils/v4l2/v4l2_model_videobuf2.c +++ b/driver/utils/v4l2/v4l2_model_videobuf2.c @@ -102,71 +102,63 @@ static int v4l2_model_qops_queue_setup(struct vb2_queue *q, (v4l2_model_vb2_context_t *) v4l2m_context->vb2_context; v4l2_model_callback_item_t *callback_item = &v4l2m_context->callbacks[V4L2_MODEL_CALLBACK_QUEUE_SETUP]; -// const framegrabber_pixfmt_t *pixfmt; - unsigned framebufsize; int width, height; - unsigned bytesperline; - -// pixfmt = framegrabber_g_out_pixelfmt(v4l2m_context->framegrabber_handle); -// if (width == 0 || height == 0) -// { -// return -EINVAL; -// } - framebufsize = - framegrabber_g_max_framebuffersize(v4l2m_context-> - framegrabber_handle); - framegrabber_g_out_framesize(v4l2m_context->framegrabber_handle, &width, &height); //test - pr_info("%s framebufsize %u, width %d, height %d\n", __func__, - framebufsize, width, height); - //if (framebufsize == 0) - { - //int width, height; - //unsigned bytesperline; - - //framegrabber_g_out_framesize(v4l2m_context->framegrabber_handle, - // &width, &height); - bytesperline = - framegrabber_g_out_bytesperline(v4l2m_context-> - framegrabber_handle); - framebufsize = bytesperline * height; - pr_info("%s >>> framebufsize %u, width %d, height %d\n", - __func__, framebufsize, width, height); - } - - if (width ==0) - { - width = 1920; - height = 1080; - - framebufsize = - framegrabber_g_max_framebuffersize(v4l2m_context-> - framegrabber_handle); - pr_info("===============================================\n"); - pr_info("debug framebufsize %u, width %d, height %d\n", - framebufsize, width, height); - } - - //pr_info("%s framebufsize %u, width %d, height %d\n", __func__, - // framebufsize, width, height); - - if (v4l2m_context->pic_bmp_handle) - { - if (vb2_context->image_data) - { - vfree(vb2_context->image_data); - vb2_context->image_data = NULL; - } - vb2_context->image_data = vmalloc(framebufsize); + const framegrabber_pixfmt_t *pixfmt; + framegrabber_pixfmt_enum_t pixfmt_out; + + framegrabber_g_out_framesize(v4l2m_context->framegrabber_handle, &width, &height); //test + + pixfmt = framegrabber_g_out_pixelfmt(v4l2m_context->framegrabber_handle); + pixfmt_out = pixfmt->pixfmt_out; + pr_info("pixelformat %s\n", pixfmt->name); + + *num_planes = pixfmt->num_planes; + + switch (*num_planes) { + case 3: + if (vb2_context->alloc_ctx) + alloc_ctxs[2] = vb2_context->alloc_ctx; + sizes[2] = framegrabber_g_out_planarbuffersize(v4l2m_context->framegrabber_handle, 3); + pr_info("size of plane 3 %d\n", sizes[2]); + // fall through + case 2: + if (vb2_context->alloc_ctx) + alloc_ctxs[1] = vb2_context->alloc_ctx; + sizes[1] = framegrabber_g_out_planarbuffersize(v4l2m_context->framegrabber_handle, 2); + pr_info("size of plane 2 %d\n", sizes[1]); + // fall through + case 1: + if (vb2_context->alloc_ctx) + alloc_ctxs[0] = vb2_context->alloc_ctx; + sizes[0] = framegrabber_g_out_planarbuffersize(v4l2m_context->framegrabber_handle, 1); + pr_info("size of plane 1 %d\n", sizes[0]); + } + pr_info("number of requested planes %d\n", *num_planes); + pr_info("number of requested buffers %d\n", *num_buffers); + + if (v4l2m_context->pic_bmp_handle) + { + if (vb2_context->image_data) + { + vfree(vb2_context->image_data); + vb2_context->image_data = NULL; + } + /*allocate full framebuffer size (i.e. size of all planes) even in multiplanar architecture */ + vb2_context->image_data = vmalloc(framegrabber_g_out_framebuffersize(v4l2m_context->framegrabber_handle)); + + pic_bmp_prepare(v4l2m_context->pic_bmp_handle, 640, 480, width, height); + load_no_signal_image(v4l2m_context->pic_bmp_handle, vb2_context->image_data, width, height + , (pixfmt_out == YUYV) ? PIC_BMP_PIXFMT_YUYV + : (pixfmt_out == YVU420 || pixfmt_out == YVU420M) ? PIC_BMP_PIXFMT_YV12 + : (pixfmt_out == NV12 || pixfmt_out == NV12M) ? PIC_BMP_PIXFMT_NV12 + : (pixfmt_out == BGR3) ? PIC_BMP_PIXFMT_RGB24 + : PIC_BMP_PIXFMT_OTHERS); + vb2_context->image_type = V4L2_MODEL_VB2_IMAGE_NO_SIGNAL; + } - pic_bmp_prepare(v4l2m_context->pic_bmp_handle, 640, 480, width, height); - load_no_signal_image(v4l2m_context->pic_bmp_handle, vb2_context->image_data, width, height); - vb2_context->image_type = V4L2_MODEL_VB2_IMAGE_NO_SIGNAL; - } - sizes[0] = framebufsize; - *num_planes = 1; - if (vb2_context->alloc_ctx) - alloc_ctxs[0] = vb2_context->alloc_ctx; + v4l2m_context->inibuffer_create = 0; + v4l2m_context->inibuffer_index = 0; if (callback_item->callback) { callback_item->data.u.queue_setup_info.buffer_num = @@ -191,14 +183,33 @@ static void v4l2_model_qops_wait_finish(struct vb2_queue *q) static int v4l2_model_qops_buf_init(struct vb2_buffer *vb) { + int i; v4l2_model_context_t *v4l2m_context = vb2b_to_v4l2context(vb); v4l2_model_callback_item_t *callback_item = &v4l2m_context->callbacks[V4L2_MODEL_CALLBACK_BUFFER_INIT]; - + +#if LINUX_VERSION_CODE >=KERNEL_VERSION(4,4,0) + v4l2_model_vb2_buffer_t *v4l2_buf = + container_of(to_vb2_v4l2_buffer(vb), v4l2_model_vb2_buffer_t, vb); +#else + v4l2_model_vb2_buffer_t *v4l2_buf = + container_of(vb, v4l2_model_vb2_buffer_t, vb); +#endif + v4l2_model_buffer_info_t *buffer_info = &v4l2_buf->buffer_info; + v4l2m_context->inibuffer_create++; - - //pr_info("==%s vb %p ; buffer create++=%d\n", __func__, vb, v4l2m_context->inibuffer_create); - + + for (i=0; i < vb->num_planes; i++) { + struct sg_table *sgt = vb2_dma_sg_plane_desc(vb, i); + + buffer_info->buf_count[i] = sgt->nents; + + v4l2_buf->buf_descs[i] = + kzalloc(sizeof(v4l2_model_buf_desc_t) * buffer_info->buf_count[i], GFP_KERNEL); + pr_info("v4l2_buf %p, v4l2_buf->buffer_info %p plane %d buf_descs[%d] %p\n", v4l2_buf, &v4l2_buf->buffer_info, i, i, v4l2_buf->buf_descs[i]); + } + + if (callback_item->callback) { v4l2_model_callback_parameter_t *parm = &callback_item->data; callback_item->callback(parm); @@ -223,56 +234,45 @@ static int v4l2_model_qops_buf_prepare(struct vb2_buffer *vb) v4l2_model_vb2_buffer_t *v4l2_buf = container_of(vb, v4l2_model_vb2_buffer_t, vb); #endif + const framegrabber_pixfmt_t *pixfmt; int width, height; int buffer_size = 0; // pr_info("%s >>>>>\n",__func__); - framegrabber_g_out_framesize(v4l2m_context->framegrabber_handle, &width, - &height); - pixfmt = - framegrabber_g_out_pixelfmt(v4l2m_context->framegrabber_handle); + framegrabber_g_out_framesize(v4l2m_context->framegrabber_handle, &width, &height); + pixfmt = framegrabber_g_out_pixelfmt(v4l2m_context->framegrabber_handle); - v4l2_buf->buffer_info.planes = vb->num_planes; + pr_debug("framesize %dx%d %dbit\n", width, height, pixfmt->depth); + pr_debug("numberofplanes = %d\n", vb->num_planes); + + + v4l2_buf->buffer_info.planes = vb->num_planes; v4l2_buf->buffer_info.buf_type = vb2_cxt->queue_type; for (i = 0; i < vb->num_planes; i++) { v4l2_model_buffer_info_t *buffer_info = &v4l2_buf->buffer_info; switch (vb2_cxt->queue_type) { case V4L2_MODEL_BUF_TYPE_VMALLOC: -// pr_info("%s >>>>> V4L2_MODEL_BUF_TYPE_VMALLOC\n",__func__); buffer_info->buf_count[i] = 1; v4l2_buf->buf_descs[i] = - kzalloc(sizeof(v4l2_model_buf_desc_t) * - buffer_info->buf_count[i], GFP_KERNEL); + kzalloc(sizeof(v4l2_model_buf_desc_t) * buffer_info->buf_count[i], GFP_KERNEL); if (v4l2_buf->buf_descs[i]) { - v4l2_model_buf_desc_t *buf_descs = - v4l2_buf->buf_descs[i]; - buf_descs[0].addr = - (unsigned long)vb2_plane_vaddr(vb, i); - buf_descs[0].size = vb2_plane_size(vb, i); - } + v4l2_model_buf_desc_t *buf_descs = v4l2_buf->buf_descs[i]; + buf_descs[i].addr = (unsigned long)vb2_plane_vaddr(vb, i); + buf_descs[i].size = vb2_plane_size(vb, i); + buffer_size = buf_descs[i].size; + } buffer_info->buf_info[i] = v4l2_buf->buf_descs[i]; break; case V4L2_MODEL_BUF_TYPE_DMA_SG: { - struct sg_table *sgt = - vb2_dma_sg_plane_desc(vb, i); + struct sg_table *sgt = vb2_dma_sg_plane_desc(vb, i); struct scatterlist *sg; int j; -// pr_info("%s >>>>> V4L2_MODEL_BUF_TYPE_DMA_SG\n",__func__); - buffer_info->buf_count[i] = sgt->nents; - - if (v4l2m_context->inibuffer_index != 0) - { - pr_info("%s >>>>>\n",__func__); - v4l2_buf->buf_descs[i] = - kzalloc(sizeof(v4l2_model_buf_desc_t) * - buffer_info->buf_count[i],GFP_KERNEL); - v4l2m_context->inibuffer_index--; - } + if (v4l2_buf->buf_descs[i]) { #if LINUX_VERSION_CODE < KERNEL_VERSION(3,19,0) if (!dma_map_sg @@ -280,49 +280,45 @@ static int v4l2_model_qops_buf_prepare(struct vb2_buffer *vb) sgt->nents, DMA_FROM_DEVICE)) pr_err("error dma_map_sg\n"); #endif - + pr_debug("plane[%d]: number of sg buffers %d\n", i, sgt->nents); for_each_sg(sgt->sgl, sg, sgt->nents, j) { - v4l2_model_buf_desc_t *buf_descs - = v4l2_buf->buf_descs[i]; + v4l2_model_buf_desc_t *buf_descs = v4l2_buf->buf_descs[i]; - buf_descs[j].addr = - sg_dma_address(sg); - buf_descs[j].size = - sg_dma_len(sg); + buf_descs[j].addr = sg_dma_address(sg); + buf_descs[j].size = sg_dma_len(sg); buffer_size += buf_descs[j].size; + + pr_debug("plane[%d]: sg_buffer %lx sg_buffer_size %ld\n", i, buf_descs[j].addr, buf_descs[j].size); } - buffer_info->buf_info[i] = - v4l2_buf->buf_descs[i]; + buffer_info->buf_info[i] = v4l2_buf->buf_descs[i]; } } break; case V4L2_MODEL_BUF_TYPE_DMA_CONT: -// pr_info("%s >>>>> V4L2_MODEL_BUF_TYPE_DMA_CONT\n",__func__); - v4l2_buf->buffer_info.buf_count[i] = 1; - v4l2_buf->buf_descs[i] = - kzalloc(sizeof(v4l2_model_buf_desc_t) * - buffer_info->buf_count[i], GFP_KERNEL); - if (v4l2_buf->buf_descs[i]) { - v4l2_model_buf_desc_t *buf_descs = - v4l2_buf->buf_descs[i]; - buf_descs[0].addr = - vb2_dma_contig_plane_dma_addr(vb, i); - buf_descs[0].size = vb2_plane_size(vb, i); - } - buffer_info->buf_info[i] = v4l2_buf->buf_descs[i]; - - break; - } + { + int j; + v4l2_buf->buffer_info.buf_count[i] = 1; + v4l2_buf->buf_descs[i] = kzalloc(sizeof(v4l2_model_buf_desc_t) * + buffer_info->buf_count[i], GFP_KERNEL); + if (v4l2_buf->buf_descs[i]) { + v4l2_model_buf_desc_t *buf_descs = v4l2_buf->buf_descs[i]; + for (j = 0; j < buffer_info->buf_count[i]; j++) { + buf_descs[j].addr = vb2_dma_contig_plane_dma_addr(vb, i); + buf_descs[j].size = vb2_plane_size(vb, i); + buffer_size += buf_descs[j].size; + } + } + buffer_info->buf_info[i] = v4l2_buf->buf_descs[i]; + } + break; + } /* set vb2 plane bytesused size */ - vb2_set_plane_payload(vb, i, - width * height * (pixfmt->depth >> 3)); - v4l2_buf->length += vb2_plane_size(vb, i); + vb2_set_plane_payload(vb, i,vb2_plane_size(vb, i)); + v4l2_buf->length += vb2_plane_size(vb, i); + pr_debug("plane[%d]: buffer_size = %d plane_size = %ld\n", i, buffer_size, vb2_plane_size(vb, i)); } -// pr_info("%s >>>>> %dx%d %dbit\n", __func__, width, height, pixfmt->depth); -// pr_info("%s >>>>> buffer size = %d\n", __func__, buffer_size); - if (callback_item->callback) { v4l2_model_callback_parameter_t *parm = &callback_item->data; parm->u.buffer_prepare_info.buffer_info = @@ -419,7 +415,7 @@ static int v4l2_model_qops_start_streaming(struct vb2_queue *q, //v4l2m_context->current_framebuf_info.rcv_size=0; v4l2_model_reset_video_data(v4l2m_context); - v4l2m_context->inibuffer_index =v4l2m_context->inibuffer_create; + v4l2m_context->inibuffer_index =v4l2m_context->inibuffer_create; return 0; } @@ -720,10 +716,6 @@ void v4l2_model_buffer_done(v4l2_model_handle_t context) (v4l2_model_vb2_context_t *) v4l2m_context->vb2_context; v4l2_model_vb2_buffer_t *buf; framegrabber_status_bitmask_e framegrabber_status; - //int width, height; - //const framegrabber_pixfmt_t *pixfmt=framegrabber_g_out_pixelfmt(v4l2m_context->framegrabber_handle); - //framegrabber_g_input_framesize(v4l2m_context->framegrabber_handle, - // &width, &height); /* get next v4l2_model_buffer from vb2 context buffer_list */ spin_lock_irqsave(&vb2_context->queuelock, flags); @@ -737,7 +729,7 @@ void v4l2_model_buffer_done(v4l2_model_handle_t context) spin_unlock_irqrestore(&vb2_context->queuelock, flags); if (!buf) { - pr_info("%s no buffer to serve\n", __func__); + pr_err("no buffer to serve\n"); return; } #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,5,0) @@ -765,18 +757,29 @@ void v4l2_model_buffer_done(v4l2_model_handle_t context) } #endif #endif - if (1) + if (v4l2m_context->pic_bmp_handle) { u32 input_status, hdcp_flag; u8 *ptr = NULL; + const framegrabber_pixfmt_t *pixfmt = framegrabber_g_out_pixelfmt(v4l2m_context->framegrabber_handle); + framegrabber_pixfmt_enum_t pixfmt_out = pixfmt->pixfmt_out; input_status = framegrabber_g_input_status(v4l2m_context->framegrabber_handle); hdcp_flag = framegrabber_g_hdcp_flag(v4l2m_context->framegrabber_handle); + if (input_status != FRAMEGRABBER_INPUT_STATUS_OK || hdcp_flag) { - v4l2_model_vb2_image_type_e type = - (input_status == FRAMEGRABBER_INPUT_STATUS_NO_SIGNAL) ? V4L2_MODEL_VB2_IMAGE_NO_SIGNAL - : (hdcp_flag) ? V4L2_MODEL_VB2_IMAGE_COPY_PROTECTION - : V4L2_MODEL_VB2_IMAGE_NO_SIGNAL; + pr_debug("framegrabber input status not ok"); + v4l2_model_vb2_image_type_e type = V4L2_MODEL_VB2_IMAGE_NO_SIGNAL; + if (input_status == FRAMEGRABBER_INPUT_STATUS_NO_SIGNAL || input_status == FRAMEGRABBER_INPUT_STATUS_NO_POWER) { + type = V4L2_MODEL_VB2_IMAGE_NO_SIGNAL; + } + else if (input_status == FRAMEGRABBER_INPUT_STATUS_NO_SYNC) { + type = V4L2_MODEL_VB2_IMAGE_OUT_OF_RANGE; + } else { + if (hdcp_flag) { + type = V4L2_MODEL_VB2_IMAGE_COPY_PROTECTION; + } + } if (type != vb2_context->image_type) { @@ -784,21 +787,42 @@ void v4l2_model_buffer_done(v4l2_model_handle_t context) { int width, height; framegrabber_g_out_framesize(v4l2m_context->framegrabber_handle, &width, &height); - load_no_signal_image(v4l2m_context->pic_bmp_handle, vb2_context->image_data, width, height); - pr_info("load no signal done\n"); + load_no_signal_image(v4l2m_context->pic_bmp_handle, vb2_context->image_data, width, height + , (pixfmt_out == YUYV) ? PIC_BMP_PIXFMT_YUYV + : (pixfmt_out == YVU420 || pixfmt_out == YVU420M) ? PIC_BMP_PIXFMT_YV12 + : (pixfmt_out == NV12 || pixfmt_out == NV12M) ? PIC_BMP_PIXFMT_NV12 + : (pixfmt_out == BGR3) ? PIC_BMP_PIXFMT_RGB24 + : PIC_BMP_PIXFMT_OTHERS); + pr_debug("load no signal done\n"); } else if (type == V4L2_MODEL_VB2_IMAGE_COPY_PROTECTION) { int width, height; framegrabber_g_out_framesize(v4l2m_context->framegrabber_handle, &width, &height); - load_copy_protection_image(v4l2m_context->pic_bmp_handle, vb2_context->image_data, width, height); - pr_info("load copy protection done\n"); + load_copy_protection_image(v4l2m_context->pic_bmp_handle, vb2_context->image_data, width, height + , (pixfmt_out == YUYV) ? PIC_BMP_PIXFMT_YUYV + : (pixfmt_out == YVU420 || pixfmt_out == YVU420M) ? PIC_BMP_PIXFMT_YV12 + : (pixfmt_out == NV12 || pixfmt_out == NV12M) ? PIC_BMP_PIXFMT_NV12 + : (pixfmt_out == BGR3) ? PIC_BMP_PIXFMT_RGB24 + : PIC_BMP_PIXFMT_OTHERS); + pr_debug("load copy protection done\n"); + } + else if (type == V4L2_MODEL_VB2_IMAGE_OUT_OF_RANGE) + { + int width, height; + framegrabber_g_out_framesize(v4l2m_context->framegrabber_handle, &width, &height); + load_out_of_range_image(v4l2m_context->pic_bmp_handle, vb2_context->image_data, width, height + , (pixfmt_out == YUYV) ? PIC_BMP_PIXFMT_YUYV + : (pixfmt_out == YVU420 || pixfmt_out == YVU420M) ? PIC_BMP_PIXFMT_YV12 + : (pixfmt_out == NV12 || pixfmt_out == NV12M) ? PIC_BMP_PIXFMT_NV12 + : (pixfmt_out == BGR3) ? PIC_BMP_PIXFMT_RGB24 + : PIC_BMP_PIXFMT_OTHERS); + pr_debug("load out of range done\n"); } vb2_context->image_type = type; } ptr = vb2_context->image_data; - //pr_info(".\n"); } if (ptr) @@ -809,11 +833,17 @@ void v4l2_model_buffer_done(v4l2_model_handle_t context) break; case V4L2_MODEL_BUF_TYPE_DMA_SG: { - struct sg_table *sgt = vb2_dma_sg_plane_desc(vb, 0); - int width, height; - framegrabber_g_out_framesize(v4l2m_context->framegrabber_handle, &width, &height); + int i; + u8 *srcBuffer = ptr; + for (i =0; i < vb->num_planes; i++) { + struct sg_table *sgt = vb2_dma_sg_plane_desc(vb, i); + unsigned planesize = vb2_plane_size(vb, i); + + size_t bytes_copied = sg_copy_from_buffer(sgt->sgl, sg_nents_for_len(sgt->sgl, planesize), srcBuffer, planesize); + pr_debug("copied %zd bytes from %p to sg_buffer in plane %d\n", bytes_copied, srcBuffer, i); - sg_copy_from_buffer(sgt->sgl, sgt->nents, ptr, width * height * 2); + srcBuffer+=planesize; + } } break; case V4L2_MODEL_BUF_TYPE_DMA_CONT: @@ -826,15 +856,14 @@ void v4l2_model_buffer_done(v4l2_model_handle_t context) framegrabber_g_status(v4l2m_context->framegrabber_handle); if ((framegrabber_status & - (FRAMEGRABBER_STATUS_V4L_START_STREAMING_BIT | - FRAMEGRABBER_STATUS_SIGNAL_LOCKED_BIT)) == - (FRAMEGRABBER_STATUS_V4L_START_STREAMING_BIT | - FRAMEGRABBER_STATUS_SIGNAL_LOCKED_BIT)) { - vb2_buffer_done(vb, VB2_BUF_STATE_DONE); - } else { - //pr_info("%s framegrabber_status %08x\n", __func__, framegrabber_status); - vb2_buffer_done(vb, VB2_BUF_STATE_ERROR); - } + (FRAMEGRABBER_STATUS_V4L_START_STREAMING_BIT | + FRAMEGRABBER_STATUS_SIGNAL_LOCKED_BIT)) != (FRAMEGRABBER_STATUS_V4L_START_STREAMING_BIT | + FRAMEGRABBER_STATUS_SIGNAL_LOCKED_BIT)) { + pr_debug("no input detected\n"); + } + + vb2_buffer_done(vb, VB2_BUF_STATE_DONE); +// vb2_buffer_done(vb, VB2_BUF_STATE_ERROR); } void v4l2_model_reset_video_data(v4l2_model_handle_t context) @@ -901,7 +930,7 @@ void v4l2_model_feed_video_data(v4l2_model_handle_t context, void *buffer, SIZE_ framemode = framegrabber_g_input_framemode(v4l2m_cxt-> framegrabber_handle); - bytesperline = framegrabber_g_out_bytesperline(v4l2m_cxt->framegrabber_handle); + bytesperline = framegrabber_g_out_bytesperline(v4l2m_cxt->framegrabber_handle, 1); //bytesperline = width*pix_size; framegrabber_g_out_framesize(v4l2m_cxt->framegrabber_handle, &width, &height);