1 /******************************************************************************
2 * camera_isp.c - Linux ISP Device Driver
4 * Copyright 2008-2009 MediaTek Co.,Ltd.
7 * This file provid the other drivers ISP relative functions
9 ******************************************************************************/
11 #include <linux/types.h>
12 #include <linux/device.h>
13 #include <linux/cdev.h>
14 #include <linux/platform_device.h>
15 #include <linux/interrupt.h>
17 //#include <asm/tcm.h>
18 #include <linux/proc_fs.h> //proc file use
19 #include <linux/slab.h> //kmalloc/kfree in kernel 3.10
20 #include <linux/spinlock.h>
21 //#include <linux/io.h>
22 #include <linux/delay.h>
23 #include <linux/uaccess.h>
24 #include <asm/atomic.h>
25 #include <linux/sched.h>
27 #include <linux/xlog.h> // For xlog_printk().
28 #include <linux/aee.h>
30 #include <mach/hardware.h>
31 //#include <mach/mt6589_pll.h>
32 #include <mach/camera_isp.h>
33 #include <mach/mt_reg_base.h>
34 #include <mach/mt_clkmgr.h> // For clock mgr APIS. enable_clock()/disable_clock().
35 #include <mach/sync_write.h> // For mt65xx_reg_sync_writel().
36 #include <mach/mt_spm_idle.h> // For spm_enable_sodi()/spm_disable_sodi().
38 #include <linux/kobject.h>
39 #include <linux/sysfs.h>
40 #include <linux/init.h>
42 #include <smi_common.h>
47 /*******************************************************************************
49 ********************************************************************************/
50 typedef unsigned char MUINT8
;
51 typedef unsigned short MUINT16
;
52 typedef unsigned int MUINT32
;
53 typedef unsigned long long MUINT64
;
55 typedef signed char MINT8
;
56 typedef signed short MINT16
;
57 typedef signed int MINT32
;
58 typedef signed long long MINT64
;
73 /*******************************************************************************
75 ********************************************************************************/
76 //#define LOG_MSG(fmt, arg...) printk(KERN_ERR "[ISP][%s]" fmt,__FUNCTION__, ##arg)
77 //#define LOG_DBG(fmt, arg...) printk(KERN_ERR "[ISP][%s]" fmt,__FUNCTION__, ##arg)
78 //#define LOG_WRN(fmt, arg...) printk(KERN_ERR "[ISP][%s]Warning" fmt,__FUNCTION__, ##arg)
79 //#define LOG_ERR(fmt, arg...) printk(KERN_ERR "[ISP][%s]Err(%5d):" fmt, __FUNCTION__,__LINE__, ##arg)
81 #define LOG_VRB(format, args...) xlog_printk(ANDROID_LOG_VERBOSE, "ISP", "[%s] " format, __FUNCTION__, ##args)
82 #define LOG_DBG(format, args...) xlog_printk(ANDROID_LOG_DEBUG , "ISP", "[%s] " format, __FUNCTION__, ##args)
83 #define LOG_INF(format, args...) xlog_printk(ANDROID_LOG_INFO , "ISP", "[%s] " format, __FUNCTION__, ##args)
84 #define LOG_WRN(format, args...) xlog_printk(ANDROID_LOG_WARN , "ISP", "[%s] WARNING: " format, __FUNCTION__, ##args)
85 #define LOG_ERR(format, args...) xlog_printk(ANDROID_LOG_ERROR , "ISP", "[%s, line%04d] ERROR: " format, __FUNCTION__, __LINE__, ##args)
86 #define LOG_AST(format, args...) xlog_printk(ANDROID_LOG_ASSERT , "ISP", "[%s, line%04d] ASSERT: " format, __FUNCTION__, __LINE__, ##args)
87 #define LOG_GPIO_REG(format, args...) xlog_printk(ANDROID_LOG_ERROR , "CAM", "[%s ]: " format, __FUNCTION__, ##args)
89 /*******************************************************************************
91 ********************************************************************************/
93 #define ISP_WR32(addr, data) iowrite32(data, addr) // For other projects.
94 //#define ISP_WR32(addr, data) mt65xx_reg_sync_writel(data, addr) // For 89 Only.NEED_TUNING_BY_PROJECT
95 #define ISP_RD32(addr) ioread32(addr)
96 #define ISP_SET_BIT(reg, bit) ((*(volatile MUINT32*)(reg)) |= (MUINT32)(1 << (bit)))
97 #define ISP_CLR_BIT(reg, bit) ((*(volatile MUINT32*)(reg)) &= ~((MUINT32)(1 << (bit))))
99 #define OVERRUN_AEE_WARNING
101 /*******************************************************************************
103 ********************************************************************************/
104 ///////////////////////////////////////////////////////////////////
105 //for restricting range in mmap function
107 #define ISP_RTBUF_REG_RANGE 0x10000
108 #define IMGSYS_BASE_ADDR 0x15000000
109 #define ISP_REG_RANGE (0x10000) //0x6100,the same with the value in isp_reg.h and page-aligned
111 #define SENINF_BASE_ADDR 0x15008000 //the same with the value in seninf_drv.cpp(chip-dependent)
112 #define SENINF_REG_RANGE (0x1000) //0x800,the same with the value in seninf_reg.h and page-aligned
113 //#define IMGSYS_CG_CLR0_ADDR 0x15000000 //the same with the value in seninf_drv.cpp(chip-dependent)
114 //#define MMSYS_RANGE (0x1000) //0x100,the same with the value in seninf_drv.cpp and page-aligned
115 #define PLL_BASE_ADDR 0x10000000 //the same with the value in seninf_drv.cpp(chip-dependent)
116 #define PLL_RANGE (0x1000) //0x200,the same with the value in seninf_drv.cpp and page-aligned
117 #define MIPIRX_CONFIG_ADDR 0x1500C000 //the same with the value in seninf_drv.cpp(chip-dependent)
118 #define MIPIRX_CONFIG_RANGE (0x1000)//0x100,the same with the value in seninf_drv.cpp and page-aligned
119 #define MIPIRX_ANALOG_ADDR 0x10010000 //the same with the value in seninf_drv.cpp(chip-dependent)
120 #define MIPIRX_ANALOG_RANGE (0x1000)
121 #define GPIO_BASE_ADDR 0x10005000 //the same with the value in seninf_drv.cpp(chip-dependent)
122 #define GPIO_RANGE (0x1000)
123 #define EFUSE_BASE_ADDR 0x10206000
124 #define EFUSE_RANGE (0x1000) //0x400,the same with the value in seninf_drv.cpp and page-aligned
126 #define ISP_RANGE (0x10000)
127 ///////////////////////////////////////////////////////////////////
130 #define ISP_DEV_NAME "camera-isp"
131 #define ISP_IRQ_POLLING (0)
133 #define ISP_DBG_INT (0x00000001)
134 #define ISP_DBG_HOLD_REG (0x00000002)
135 #define ISP_DBG_READ_REG (0x00000004)
136 #define ISP_DBG_WRITE_REG (0x00000008)
137 #define ISP_DBG_CLK (0x00000010)
138 #define ISP_DBG_TASKLET (0x00000020)
139 #define ISP_DBG_SCHEDULE_WORK (0x00000040)
140 #define ISP_DBG_BUF_WRITE (0x00000080)
141 #define ISP_DBG_BUF_CTRL (0x00000100)
142 #define ISP_DBG_REF_CNT_CTRL (0x00000200)
144 #define ISP_ADDR (CAMINF_BASE + 0x4000)
145 #define ISP_ADDR_CAMINF CAMINF_BASE
146 #define ISP_REG_ADDR_EN1 (ISP_ADDR + 0x4)
147 #define ISP_REG_ADDR_INT_STATUS (ISP_ADDR + 0x24)
148 #define ISP_REG_ADDR_DMA_INT (ISP_ADDR + 0x28)
149 #define ISP_REG_ADDR_INTB_STATUS (ISP_ADDR + 0x30)
150 #define ISP_REG_ADDR_DMAB_INT (ISP_ADDR + 0x34)
151 #define ISP_REG_ADDR_INTC_STATUS (ISP_ADDR + 0x3C)
152 #define ISP_REG_ADDR_DMAC_INT (ISP_ADDR + 0x40)
153 #define ISP_REG_ADDR_INT_STATUSX (ISP_ADDR + 0x44)
154 #define ISP_REG_ADDR_DMA_INTX (ISP_ADDR + 0x48)
155 #define ISP_REG_ADDR_SW_CTL (ISP_ADDR + 0x5C)
156 #define ISP_REG_ADDR_CQ0C_BASE_ARRR (ISP_ADDR + 0xBC)
157 #define ISP_REG_ADDR_IMGO_FBC (ISP_ADDR + 0xF4)
158 #define ISP_REG_ADDR_IMG2O_FBC (ISP_ADDR + 0xF8)
159 #define ISP_REG_ADDR_IMGO_BASE_ADDR (ISP_ADDR + 0x300)
160 #define ISP_REG_ADDR_IMG2O_BASE_ADDR (ISP_ADDR + 0x320)
161 #define ISP_REG_ADDR_TG_VF_CON (ISP_ADDR + 0x414)
162 #define ISP_REG_ADDR_CTL_DBG_SET (ISP_ADDR + 0x160)
163 #define ISP_REG_ADDR_CTL_DBG_PORT (ISP_ADDR + 0x164)
164 #define ISP_REG_ADDR_CTL_EN2 (ISP_ADDR + 0x008)
165 #define ISP_REG_ADDR_CTL_CROP_X (ISP_ADDR + 0x110)
167 #define ISP_REG_ADDR_CTL_DBG_SET_CQ_STS (0x6000)
169 #define ISP_REG_ADDR_CTL_DBG_SET_IMGI_STS (0x9003)
170 #define ISP_REG_ADDR_CTL_DBG_SET_IMGI_SYNC (0x9004)
171 #define ISP_REG_ADDR_CTL_DBG_SET_IMGI_NO_SYNC (0x9005)
173 #define ISP_REG_ADDR_CTL_DBG_SET_CFA_STS (0x9006)
174 #define ISP_REG_ADDR_CTL_DBG_SET_CFA_SYNC (0x9007)
175 #define ISP_REG_ADDR_CTL_DBG_SET_CFA_NO_SYNC (0x9008)
177 #define ISP_REG_ADDR_CTL_DBG_SET_YUV_STS (0x9009)
178 #define ISP_REG_ADDR_CTL_DBG_SET_YUV_SYNC (0x900a)
179 #define ISP_REG_ADDR_CTL_DBG_SET_YUV_NO_SYNC (0x900b)
181 #define ISP_REG_ADDR_CTL_DBG_SET_OUT_STS (0x900c)
182 #define ISP_REG_ADDR_CTL_DBG_SET_OUT_SYNC (0x900d)
183 #define ISP_REG_ADDR_CTL_DBG_SET_OUT_NO_SYNC (0x900e)
185 #define ISP_REG_ADDR_CTL_EN2_UV_CRSA_EN_BIT (1<<23)
186 #define ISP_REG_ADDR_CTL_CROP_X_MDP_CROP_EN_BIT (1<<15)
188 //#define ISP_REG_ADDR_TG2_VF_CON (ISP_ADDR + 0x4B4)
191 #define ISP_TPIPE_ADDR (0x15004000)
193 //====== CAM_CTL_SW_CTL ======
195 #define ISP_REG_SW_CTL_SW_RST_TRIG (0x00000001)
196 #define ISP_REG_SW_CTL_SW_RST_STATUS (0x00000002)
197 #define ISP_REG_SW_CTL_HW_RST (0x00000004)
199 //====== CAM_CTL_INT_STATUS ======
202 #define ISP_REG_MASK_INT_STATUS (ISP_IRQ_INT_STATUS_VS1_ST |\
203 ISP_IRQ_INT_STATUS_TG1_ST1 |\
204 ISP_IRQ_INT_STATUS_TG1_ST2 |\
205 ISP_IRQ_INT_STATUS_EXPDON1_ST |\
206 ISP_IRQ_INT_STATUS_PASS1_TG1_DON_ST |\
207 ISP_IRQ_INT_STATUS_SOF1_INT_ST |\
208 ISP_IRQ_INT_STATUS_PASS2_DON_ST |\
209 ISP_IRQ_INT_STATUS_TPIPE_DON_ST |\
210 ISP_IRQ_INT_STATUS_AF_DON_ST |\
211 ISP_IRQ_INT_STATUS_FLK_DON_ST |\
212 ISP_IRQ_INT_STATUS_CQ_DON_ST)
214 #define ISP_REG_MASK_INT_STATUS_ERR (ISP_IRQ_INT_STATUS_TG1_ERR_ST |\
215 ISP_IRQ_INT_STATUS_CQ_ERR_ST |\
216 ISP_IRQ_INT_STATUS_IMGO_ERR_ST |\
217 ISP_IRQ_INT_STATUS_AAO_ERR_ST |\
218 ISP_IRQ_INT_STATUS_IMG2O_ERR_ST |\
219 ISP_IRQ_INT_STATUS_ESFKO_ERR_ST |\
220 ISP_IRQ_INT_STATUS_FLK_ERR_ST |\
221 ISP_IRQ_INT_STATUS_LSC_ERR_ST |\
222 ISP_IRQ_INT_STATUS_LSC2_ERR_ST |\
223 ISP_IRQ_INT_STATUS_BPC_ERR_ST |\
224 ISP_IRQ_INT_STATUS_DMA_ERR_ST)
225 //====== CAM_CTL_DMA_INT ======
228 #define ISP_REG_MASK_DMA_INT ( ISP_IRQ_DMA_INT_IMGO_DONE_ST |\
229 ISP_IRQ_DMA_INT_IMG2O_DONE_ST |\
230 ISP_IRQ_DMA_INT_AAO_DONE_ST |\
231 ISP_IRQ_DMA_INT_ESFKO_DONE_ST)
233 #define ISP_REG_MASK_DMA_INT_ERR (ISP_IRQ_DMA_INT_CQ0_ERR_ST |\
234 ISP_IRQ_DMA_INT_TG1_GBERR_ST )
236 //====== CAM_CTL_INTB_STATUS ======
239 #define ISP_REG_MASK_INTB_STATUS (ISP_IRQ_INTB_STATUS_PASS2_DON_ST |\
240 ISP_IRQ_INTB_STATUS_TPIPE_DON_ST |\
241 ISP_IRQ_INTB_STATUS_CQ_DON_ST)
243 #define ISP_REG_MASK_INTB_STATUS_ERR (ISP_IRQ_INTB_STATUS_CQ_ERR_ST |\
244 ISP_IRQ_INTB_STATUS_IMGO_ERR_ST |\
245 ISP_IRQ_INTB_STATUS_LCSO_ERR_ST |\
246 ISP_IRQ_INTB_STATUS_IMG2O_ERR_ST |\
247 ISP_IRQ_INTB_STATUS_LSC_ERR_ST |\
248 ISP_IRQ_INTB_STATUS_LCE_ERR_ST |\
249 ISP_IRQ_INTB_STATUS_DMA_ERR_ST)
252 #define ISP_REG_MASK_DMAB_INT (ISP_IRQ_DMAB_INT_IMGO_DONE_ST |\
253 ISP_IRQ_DMAB_INT_IMG2O_DONE_ST |\
254 ISP_IRQ_DMAB_INT_AAO_DONE_ST |\
255 ISP_IRQ_DMAB_INT_LCSO_DONE_ST |\
256 ISP_IRQ_DMAB_INT_ESFKO_DONE_ST |\
257 ISP_IRQ_DMAB_INT_DISPO_DONE_ST |\
258 ISP_IRQ_DMAB_INT_VIDO_DONE_ST )
260 #define ISP_REG_MASK_DMAB_INT_ERR //( ISP_IRQ_DMAB_INT_NR3O_ERR_ST)
262 //====== CAM_CTL_INTC_STATUS ======
265 #define ISP_REG_MASK_INTC_STATUS (ISP_IRQ_INTC_STATUS_PASS2_DON_ST |\
266 ISP_IRQ_INTC_STATUS_TPIPE_DON_ST |\
267 ISP_IRQ_INTC_STATUS_CQ_DON_ST)
269 #define ISP_REG_MASK_INTC_STATUS_ERR (ISP_IRQ_INTC_STATUS_CQ_ERR_ST |\
270 ISP_IRQ_INTC_STATUS_IMGO_ERR_ST |\
271 ISP_IRQ_INTC_STATUS_LCSO_ERR_ST |\
272 ISP_IRQ_INTC_STATUS_IMG2O_ERR_ST |\
273 ISP_IRQ_INTC_STATUS_LSC_ERR_ST |\
274 ISP_IRQ_INTC_STATUS_BPC_ERR_ST |\
275 ISP_IRQ_INTC_STATUS_LCE_ERR_ST |\
276 ISP_IRQ_INTC_STATUS_DMA_ERR_ST)
277 //====== CAM_CTL_DMAC_INT ======
280 #define ISP_REG_MASK_DMAC_INT ( ISP_IRQ_DMAC_INT_IMGO_DONE_ST |\
281 ISP_IRQ_DMAC_INT_IMG2O_DONE_ST |\
282 ISP_IRQ_DMAC_INT_AAO_DONE_ST |\
283 ISP_IRQ_DMAC_INT_LCSO_DONE_ST |\
284 ISP_IRQ_DMAC_INT_ESFKO_DONE_ST |\
285 ISP_IRQ_DMAC_INT_DISPO_DONE_ST |\
286 ISP_IRQ_DMAC_INT_VIDO_DONE_ST )
288 #define ISP_REG_MASK_DMAC_INT_ERR //( ISP_IRQ_DMAC_INT_NR3O_ERR_ST)
290 //====== CAM_CTL_INT_STATUSX ======
293 #define ISP_REG_MASK_INTX_STATUS (ISP_IRQ_INTX_STATUS_VS1_ST |\
294 ISP_IRQ_INTX_STATUS_TG1_ST1 |\
295 ISP_IRQ_INTX_STATUS_TG1_ST2 |\
296 ISP_IRQ_INTX_STATUS_EXPDON1_ST |\
297 ISP_IRQ_INTX_STATUS_VS2_ST |\
298 ISP_IRQ_INTX_STATUS_TG2_ST1 |\
299 ISP_IRQ_INTX_STATUS_TG2_ST2 |\
300 ISP_IRQ_INTX_STATUS_EXPDON2_ST |\
301 ISP_IRQ_INTX_STATUS_PASS1_TG1_DON_ST |\
302 ISP_IRQ_INTX_STATUS_PASS1_TG2_DON_ST |\
303 ISP_IRQ_INTX_STATUS_PASS2_DON_ST |\
304 ISP_IRQ_INTX_STATUS_TPIPE_DON_ST |\
305 ISP_IRQ_INTX_STATUS_AF_DON_ST |\
306 ISP_IRQ_INTX_STATUS_FLK_DON_ST |\
307 ISP_IRQ_INTX_STATUS_FMT_DON_ST |\
308 ISP_IRQ_INTX_STATUS_CQ_DON_ST)
310 #define ISP_REG_MASK_INTX_STATUS_ERR (ISP_IRQ_INTX_STATUS_TG1_ERR_ST |\
311 ISP_IRQ_INTX_STATUS_TG2_ERR_ST |\
312 ISP_IRQ_INTX_STATUS_CQ_ERR_ST |\
313 ISP_IRQ_INTX_STATUS_IMGO_ERR_ST |\
314 ISP_IRQ_INTX_STATUS_AAO_ERR_ST |\
315 ISP_IRQ_INTX_STATUS_LCSO_ERR_ST |\
316 ISP_IRQ_INTX_STATUS_LCSO_ERR_ST |\
317 ISP_IRQ_INTX_STATUS_ESFKO_ERR_ST |\
318 ISP_IRQ_INTX_STATUS_FLK_ERR_ST |\
319 ISP_IRQ_INTX_STATUS_LSC_ERR_ST |\
320 ISP_IRQ_INTX_STATUS_LCE_ERR_ST |\
321 ISP_IRQ_INTX_STATUS_DMA_ERR_ST)
322 // ISP_IRQ_INTX_STATUS_BPC_ERR_ST //Vent@20121025: Remove ISP_IRQ_INTX_STATUS_BPC_ERR_ST. From TH Wu's explanation, this bit is not used as an error state anymore.
325 //====== CAM_CTL_DMA_INTX ======
328 #define ISP_REG_MASK_DMAX_INT (ISP_IRQ_DMAX_INT_IMGO_DONE_ST |\
329 ISP_IRQ_DMAX_INT_IMG2O_DONE_ST |\
330 ISP_IRQ_DMAX_INT_AAO_DONE_ST |\
331 ISP_IRQ_DMAX_INT_LCSO_DONE_ST |\
332 ISP_IRQ_DMAX_INT_ESFKO_DONE_ST |\
333 ISP_IRQ_DMAX_INT_DISPO_DONE_ST |\
334 ISP_IRQ_DMAX_INT_VIDO_DONE_ST |\
335 ISP_IRQ_DMAX_INT_VRZO_DONE_ST |\
336 ISP_IRQ_DMAX_INT_NR3O_DONE_ST |\
337 ISP_IRQ_DMAX_INT_BUF_OVL_ST)
339 #define ISP_REG_MASK_DMAX_INT_ERR (ISP_IRQ_DMAX_INT_NR3O_ERR_ST |\
340 ISP_IRQ_DMAX_INT_CQ_ERR_ST |\
341 ISP_IRQ_DMAX_INT_TG1_GBERR_ST |\
342 ISP_IRQ_DMAX_INT_TG2_GBERR_ST)
344 /*******************************************************************************
346 ********************************************************************************/
348 #define ISP_BUF_SIZE (4096)
349 #define ISP_BUF_SIZE_WRITE 1024
350 #define ISP_BUF_WRITE_AMOUNT 6
354 ISP_BUF_STATUS_EMPTY
,
357 }ISP_BUF_STATUS_ENUM
;
363 }ISP_USER_INFO_STRUCT
;
367 volatile ISP_BUF_STATUS_ENUM Status
;
368 volatile MUINT32 Size
;
375 ISP_BUF_STRUCT Write
[ISP_BUF_WRITE_AMOUNT
];
376 }ISP_BUF_INFO_STRUCT
;
381 atomic_t WriteEnable
;
382 ISP_HOLD_TIME_ENUM Time
;
383 }ISP_HOLD_INFO_STRUCT
;
387 MUINT32 Status
[ISP_IRQ_TYPE_AMOUNT
];
388 MUINT32 Mask
[ISP_IRQ_TYPE_AMOUNT
];
389 MUINT32 ErrMask
[ISP_IRQ_TYPE_AMOUNT
];
390 }ISP_IRQ_INFO_STRUCT
;
397 MUINT32 WorkQueueExpdone
;
398 MUINT32 WorkQueueSeninf
;
400 MUINT32 TaskletExpdone
;
401 MUINT32 TaskletSeninf
;
402 }ISP_TIME_LOG_STRUCT
;
406 spinlock_t SpinLockIspRef
;
407 spinlock_t SpinLockIsp
;
408 spinlock_t SpinLockIrq
;
409 spinlock_t SpinLockHold
;
410 spinlock_t SpinLockRTBC
;
411 wait_queue_head_t WaitQueueHead
;
412 struct work_struct ScheduleWorkVD
;
413 struct work_struct ScheduleWorkEXPDONE
;
414 struct work_struct ScheduleWorkSENINF
;
418 ISP_IRQ_INFO_STRUCT IrqInfo
;
419 ISP_HOLD_INFO_STRUCT HoldInfo
;
420 ISP_BUF_INFO_STRUCT BufInfo
;
421 ISP_TIME_LOG_STRUCT TimeLog
;
422 ISP_CALLBACK_STRUCT Callback
[ISP_CALLBACK_AMOUNT
];
425 /*******************************************************************************
426 * internal global data
427 ********************************************************************************/
429 // pointer to the kmalloc'd area, rounded up to a page boundary
430 static MINT32
*g_pTbl_RTBuf
= NULL
;
432 // original pointer for kmalloc'd area as returned by kmalloc
433 static MVOID
*g_pBuf_kmalloc
= NULL
;
435 static ISP_RT_BUF_STRUCT
*g_pstRTBuf
= NULL
;
437 static ISP_INFO_STRUCT g_IspInfo
;
439 static atomic_t g_imem_ref_cnt
[ISP_REF_CNT_ID_MAX
];
441 MUINT32 g_EnableClkCnt
= 0;
442 volatile MUINT32 g_TempAddr
= 0;
444 //static ISP_DEQUE_BUF_INFO_STRUCT g_deque_buf = {0,{}}; // Marked to remove build warning.WARNING
446 unsigned long g_Flash_SpinLock
;
448 #ifndef _rtbc_use_cq0c_
449 static MUINT32 g_rtbcAAA
= 0;
450 static MUINT32 g_EnqBuf
= 0;
451 static MUINT32 g_DeqBuf
= 0;
452 static MINT32 g_rtbc_enq_dma
= _rt_dma_max_
;
453 static MINT32 g_rtbc_deq_dma
= _rt_dma_max_
;
456 static ISP_RT_BUF_INFO_STRUCT g_rt_buf_info
;
457 static ISP_RT_BUF_INFO_STRUCT g_ex_rt_buf_info
;
458 static ISP_DEQUE_BUF_INFO_STRUCT g_deque_buf
;
460 static MUINT32 g_prv_tstamp_s
= 0;
461 static MUINT32 g_prv_tstamp_us
= 0;
463 static MUINT32 g_sof_count
= 0;
464 static MUINT32 g_start_time
= 0;
465 static MUINT32 g_avg_frame_time
= 0;
468 static MINT32 g_sof_pass1done
= 0;
470 static dev_t g_IspDevNo
;
471 static struct cdev
*g_pIspCharDrv
= NULL
;
472 static struct class *g_pIspClass
= NULL
;
474 static MINT32 g_bPass1_On_In_Resume_TG1
= 0;
476 #define DEFAULT_PA 0x3773
478 static volatile MUINT32 g_oldImgoAddr
= DEFAULT_PA
;
479 static volatile MUINT32 g_newImgoAddr
= DEFAULT_PA
;
480 static volatile MUINT32 g_oldImg2oAddr
= DEFAULT_PA
;
481 static volatile MUINT32 g_newImg2oAddr
= DEFAULT_PA
;
489 static SENINF_DEBUG g_seninfDebug
[30];
491 /*******************************************************************************
493 ********************************************************************************/
496 #define ISP_KERNEL_MOTIFY_SINGAL_TEST
497 #ifdef ISP_KERNEL_MOTIFY_SINGAL_TEST
498 /*** Linux signal test ***/
499 #include <linux/module.h>
500 #include <linux/kernel.h>
501 #include <linux/init.h>
502 #include <asm/siginfo.h> //siginfo
503 #include <linux/rcupdate.h> //rcu_read_lock
504 #include <linux/sched.h> //find_task_by_pid_type
505 #include <linux/debugfs.h>
506 #include <linux/uaccess.h>
512 #define SIG_TEST 44 // we choose 44 as our signal number (real-time signals are in the range of 33 to 64)
515 struct task_struct
*t
;
518 int getTaskInfo( pid_t pid
)
520 /* send the signal */
521 memset(&info
, 0, sizeof(struct siginfo
));
522 info
.si_signo
= SIG_TEST
;
523 info
.si_code
= SI_QUEUE
; // this is bit of a trickery: SI_QUEUE is normally used by sigqueue from user space,
524 // and kernel space should use SI_KERNEL. But if SI_KERNEL is used the real_time data
525 // is not delivered to the user space signal handler function.
526 info
.si_int
= 1234; // real time signals may have 32 bits of data.
530 t
= find_task_by_vpid(pid
);
531 //t = find_task_by_pid_type(PIDTYPE_PID, g_pid); //find the task_struct associated with this pid
533 LOG_DBG("no such pid");
542 int sendSignal( void )
545 ret
= send_sig_info(SIG_TEST
, &info
, t
); //send the signal
547 LOG_DBG("error sending signal");
554 /*** Linux signal test ***/
556 #endif // ISP_KERNEL_MOTIFY_SINGAL_TEST
558 /*******************************************************************************
559 * transfer ms to jiffies
560 ********************************************************************************/
561 static __inline MUINT32
ISP_MsToJiffies(MUINT32 Ms
)
563 return ((Ms
* HZ
+ 512) >> 10);
566 /*******************************************************************************
567 * transfer jiffies to ms
568 ********************************************************************************/
569 static __inline MUINT32
ISP_JiffiesToMs(MUINT32 Jiffies
)
571 return ((Jiffies
*1000)/HZ
);
574 /*******************************************************************************
576 ********************************************************************************/
577 static __inline MUINT32
ISP_GetIRQState(MUINT32 type
, MUINT32 stus
)
582 spin_lock_irqsave(&(g_IspInfo
.SpinLockIrq
), flags
);
583 ret
= (g_IspInfo
.IrqInfo
.Status
[type
] & stus
);
584 spin_unlock_irqrestore(&(g_IspInfo
.SpinLockIrq
), flags
);
589 /*******************************************************************************
591 ********************************************************************************/
592 static void ISP_GetTime(MUINT32
*pSec
, MUINT32
*pUSec
)
597 Time
= ktime_get(); //ns
599 do_div( TimeSec
, 1000 );
600 *pUSec
= do_div( TimeSec
, 1000000);
601 *pSec
= (MUINT64
)TimeSec
;
604 /*******************************************************************************
606 ********************************************************************************/
607 static MINT32
ISP_DumpReg(MVOID
)
614 //spin_lock_irqsave(&(g_IspInfo.SpinLock), flags);
616 //tile tool parse range
617 //Joseph Hung (xa)#define ISP_ADDR_START 0x15004000
618 // #define ISP_ADDR_END 0x15006000
621 #if 0 //kk test 0:new tile format
622 for(i
= 0x0; i
<= 0x20; i
+= 4)
624 //LOG_DBG("0x%08X %08X ", ISP_ADDR + i, ISP_RD32(ISP_ADDR + i));
625 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ i
, ISP_RD32(ISP_ADDR
+ i
));
627 //ignore read clear registers
628 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x24, 0);
629 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x28, 0);
630 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x2C, ISP_RD32(ISP_ADDR
+ 0x2C));
631 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x30, 0);
632 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x34, 0);
633 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x38, ISP_RD32(ISP_ADDR
+ 0x38));
634 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x3C, 0);
635 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x40, 0);
636 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x44, 0);
637 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x48, 0);
638 for(i
= 0x4C; i
<= 0x5048; i
+= 4)
640 //LOG_DBG("0x%08X %08X ", ISP_ADDR + i, ISP_RD32(ISP_ADDR + i));
641 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ i
, ISP_RD32(ISP_ADDR
+ i
));
645 // for tpipe main start
647 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x000, ISP_RD32((void *)(ISP_ADDR
+ 0x000)));
648 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x004, ISP_RD32((void *)(ISP_ADDR
+ 0x004)));
649 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x008, ISP_RD32((void *)(ISP_ADDR
+ 0x008)));
650 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x00C, ISP_RD32((void *)(ISP_ADDR
+ 0x00C)));
651 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x010, ISP_RD32((void *)(ISP_ADDR
+ 0x010)));
652 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x018, ISP_RD32((void *)(ISP_ADDR
+ 0x018)));
653 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x01C, ISP_RD32((void *)(ISP_ADDR
+ 0x01C)));
654 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x020, ISP_RD32((void *)(ISP_ADDR
+ 0x020)));
656 #if 1 //it may touch ReadClear register
657 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x024, ISP_RD32((void *)(ISP_ADDR
+ 0x024)));
658 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x028, ISP_RD32((void *)(ISP_ADDR
+ 0x028)));
659 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x02C, ISP_RD32((void *)(ISP_ADDR
+ 0x02C)));
660 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x030, ISP_RD32((void *)(ISP_ADDR
+ 0x030)));
661 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x034, ISP_RD32((void *)(ISP_ADDR
+ 0x034)));
662 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x038, ISP_RD32((void *)(ISP_ADDR
+ 0x038)));
664 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x024, 0);
665 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x028, 0);
666 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x02C, 0);
667 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x030, 0);
668 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x034, 0);
669 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x038, 0);
672 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x050, ISP_RD32((void *)(ISP_ADDR
+ 0x050)));
673 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x074, ISP_RD32((void *)(ISP_ADDR
+ 0x074)));
674 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x078, ISP_RD32((void *)(ISP_ADDR
+ 0x078)));
675 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x07C, ISP_RD32((void *)(ISP_ADDR
+ 0x07C)));
676 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x080, ISP_RD32((void *)(ISP_ADDR
+ 0x080)));
677 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x084, ISP_RD32((void *)(ISP_ADDR
+ 0x084)));
678 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x088, ISP_RD32((void *)(ISP_ADDR
+ 0x088)));
679 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x08C, ISP_RD32((void *)(ISP_ADDR
+ 0x08C)));
680 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x090, ISP_RD32((void *)(ISP_ADDR
+ 0x090)));
681 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x094, ISP_RD32((void *)(ISP_ADDR
+ 0x094)));
682 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x0A8, ISP_RD32((void *)(ISP_ADDR
+ 0x0A8)));
683 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x0AC, ISP_RD32((void *)(ISP_ADDR
+ 0x0AC)));
684 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x0B0, ISP_RD32((void *)(ISP_ADDR
+ 0x0B0)));
685 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x0B4, ISP_RD32((void *)(ISP_ADDR
+ 0x0B4)));
686 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x0E8, ISP_RD32((void *)(ISP_ADDR
+ 0x0E8)));
687 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x138, ISP_RD32((void *)(ISP_ADDR
+ 0x138)));
688 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x13C, ISP_RD32((void *)(ISP_ADDR
+ 0x13C)));
689 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x144, ISP_RD32((void *)(ISP_ADDR
+ 0x144)));
690 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x148, ISP_RD32((void *)(ISP_ADDR
+ 0x148)));
691 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x14C, ISP_RD32((void *)(ISP_ADDR
+ 0x14C)));
692 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x204, ISP_RD32((void *)(ISP_ADDR
+ 0x204)));
693 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x20C, ISP_RD32((void *)(ISP_ADDR
+ 0x20C)));
694 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x22C, ISP_RD32((void *)(ISP_ADDR
+ 0x22C)));
695 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x230, ISP_RD32((void *)(ISP_ADDR
+ 0x230)));
696 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x234, ISP_RD32((void *)(ISP_ADDR
+ 0x234)));
697 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x238, ISP_RD32((void *)(ISP_ADDR
+ 0x238)));
698 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x23C, ISP_RD32((void *)(ISP_ADDR
+ 0x23C)));
699 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x240, ISP_RD32((void *)(ISP_ADDR
+ 0x240)));
700 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x244, ISP_RD32((void *)(ISP_ADDR
+ 0x244)));
701 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x258, ISP_RD32((void *)(ISP_ADDR
+ 0x258)));
702 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x260, ISP_RD32((void *)(ISP_ADDR
+ 0x260)));
703 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x26C, ISP_RD32((void *)(ISP_ADDR
+ 0x26C)));
704 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x270, ISP_RD32((void *)(ISP_ADDR
+ 0x270)));
705 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x27C, ISP_RD32((void *)(ISP_ADDR
+ 0x27C)));
706 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x298, ISP_RD32((void *)(ISP_ADDR
+ 0x298)));
707 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x2B4, ISP_RD32((void *)(ISP_ADDR
+ 0x2B4)));
708 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x2D0, ISP_RD32((void *)(ISP_ADDR
+ 0x2D0)));
709 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x2D4, ISP_RD32((void *)(ISP_ADDR
+ 0x2D4)));
710 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x2F0, ISP_RD32((void *)(ISP_ADDR
+ 0x2F0)));
711 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x2F4, ISP_RD32((void *)(ISP_ADDR
+ 0x2F4)));
712 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x300, ISP_RD32((void *)(ISP_ADDR
+ 0x300)));
713 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x304, ISP_RD32((void *)(ISP_ADDR
+ 0x304)));
714 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x308, ISP_RD32((void *)(ISP_ADDR
+ 0x308)));
715 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x30C, ISP_RD32((void *)(ISP_ADDR
+ 0x30C)));
716 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x310, ISP_RD32((void *)(ISP_ADDR
+ 0x310)));
717 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x314, ISP_RD32((void *)(ISP_ADDR
+ 0x314)));
718 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x318, ISP_RD32((void *)(ISP_ADDR
+ 0x318)));
719 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x31C, ISP_RD32((void *)(ISP_ADDR
+ 0x31C)));
720 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x328, ISP_RD32((void *)(ISP_ADDR
+ 0x328)));
721 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x32C, ISP_RD32((void *)(ISP_ADDR
+ 0x32C)));
722 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x330, ISP_RD32((void *)(ISP_ADDR
+ 0x330)));
723 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x334, ISP_RD32((void *)(ISP_ADDR
+ 0x334)));
724 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x338, ISP_RD32((void *)(ISP_ADDR
+ 0x338)));
725 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x33C, ISP_RD32((void *)(ISP_ADDR
+ 0x33C)));
726 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x350, ISP_RD32((void *)(ISP_ADDR
+ 0x350)));
727 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x37C, ISP_RD32((void *)(ISP_ADDR
+ 0x37C)));
728 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x398, ISP_RD32((void *)(ISP_ADDR
+ 0x398)));
729 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x410, ISP_RD32((void *)(ISP_ADDR
+ 0x410)));
730 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x414, ISP_RD32((void *)(ISP_ADDR
+ 0x414)));
731 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x418, ISP_RD32((void *)(ISP_ADDR
+ 0x418)));
732 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x41C, ISP_RD32((void *)(ISP_ADDR
+ 0x41C)));
733 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x420, ISP_RD32((void *)(ISP_ADDR
+ 0x420)));
734 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x448, ISP_RD32((void *)(ISP_ADDR
+ 0x448)));
735 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4B0, ISP_RD32((void *)(ISP_ADDR
+ 0x4B0)));
736 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4B4, ISP_RD32((void *)(ISP_ADDR
+ 0x4B4)));
737 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4B8, ISP_RD32((void *)(ISP_ADDR
+ 0x4B8)));
738 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4BC, ISP_RD32((void *)(ISP_ADDR
+ 0x4BC)));
739 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4E8, ISP_RD32((void *)(ISP_ADDR
+ 0x4E8)));
740 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x534, ISP_RD32((void *)(ISP_ADDR
+ 0x534)));
741 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x538, ISP_RD32((void *)(ISP_ADDR
+ 0x538)));
742 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x53C, ISP_RD32((void *)(ISP_ADDR
+ 0x53C)));
743 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x580, ISP_RD32((void *)(ISP_ADDR
+ 0x580)));
744 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x584, ISP_RD32((void *)(ISP_ADDR
+ 0x584)));
745 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x800, ISP_RD32((void *)(ISP_ADDR
+ 0x800)));
746 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x880, ISP_RD32((void *)(ISP_ADDR
+ 0x880)));
747 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x884, ISP_RD32((void *)(ISP_ADDR
+ 0x884)));
748 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x888, ISP_RD32((void *)(ISP_ADDR
+ 0x888)));
749 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x8A0, ISP_RD32((void *)(ISP_ADDR
+ 0x8A0)));
750 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x920, ISP_RD32((void *)(ISP_ADDR
+ 0x920)));
751 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x924, ISP_RD32((void *)(ISP_ADDR
+ 0x924)));
752 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x928, ISP_RD32((void *)(ISP_ADDR
+ 0x928)));
753 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x92C, ISP_RD32((void *)(ISP_ADDR
+ 0x92C)));
754 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x930, ISP_RD32((void *)(ISP_ADDR
+ 0x930)));
755 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x934, ISP_RD32((void *)(ISP_ADDR
+ 0x934)));
756 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x938, ISP_RD32((void *)(ISP_ADDR
+ 0x938)));
757 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x93C, ISP_RD32((void *)(ISP_ADDR
+ 0x93C)));
758 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x960, ISP_RD32((void *)(ISP_ADDR
+ 0x960)));
759 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x9C4, ISP_RD32((void *)(ISP_ADDR
+ 0x9C4)));
760 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x9E4, ISP_RD32((void *)(ISP_ADDR
+ 0x9E4)));
761 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x9E8, ISP_RD32((void *)(ISP_ADDR
+ 0x9E8)));
762 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x9EC, ISP_RD32((void *)(ISP_ADDR
+ 0x9EC)));
763 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xA00, ISP_RD32((void *)(ISP_ADDR
+ 0xA00)));
764 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xA04, ISP_RD32((void *)(ISP_ADDR
+ 0xA04)));
765 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xA08, ISP_RD32((void *)(ISP_ADDR
+ 0xA08)));
766 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xA0C, ISP_RD32((void *)(ISP_ADDR
+ 0xA0C)));
767 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xA10, ISP_RD32((void *)(ISP_ADDR
+ 0xA10)));
768 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xA14, ISP_RD32((void *)(ISP_ADDR
+ 0xA14)));
769 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xA20, ISP_RD32((void *)(ISP_ADDR
+ 0xA20)));
770 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xAA0, ISP_RD32((void *)(ISP_ADDR
+ 0xAA0)));
771 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xACC, ISP_RD32((void *)(ISP_ADDR
+ 0xACC)));
772 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xB00, ISP_RD32((void *)(ISP_ADDR
+ 0xB00)));
773 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xB04, ISP_RD32((void *)(ISP_ADDR
+ 0xB04)));
774 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xB08, ISP_RD32((void *)(ISP_ADDR
+ 0xB08)));
775 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xB0C, ISP_RD32((void *)(ISP_ADDR
+ 0xB0C)));
776 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xB10, ISP_RD32((void *)(ISP_ADDR
+ 0xB10)));
777 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xB14, ISP_RD32((void *)(ISP_ADDR
+ 0xB14)));
778 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xB18, ISP_RD32((void *)(ISP_ADDR
+ 0xB18)));
779 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xB1C, ISP_RD32((void *)(ISP_ADDR
+ 0xB1C)));
780 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xB20, ISP_RD32((void *)(ISP_ADDR
+ 0xB20)));
781 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xB44, ISP_RD32((void *)(ISP_ADDR
+ 0xB44)));
782 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xB48, ISP_RD32((void *)(ISP_ADDR
+ 0xB48)));
783 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xB4C, ISP_RD32((void *)(ISP_ADDR
+ 0xB4C)));
784 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xB50, ISP_RD32((void *)(ISP_ADDR
+ 0xB50)));
785 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xB54, ISP_RD32((void *)(ISP_ADDR
+ 0xB54)));
786 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xB58, ISP_RD32((void *)(ISP_ADDR
+ 0xB58)));
787 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xB5C, ISP_RD32((void *)(ISP_ADDR
+ 0xB5C)));
788 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xB60, ISP_RD32((void *)(ISP_ADDR
+ 0xB60)));
789 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xBA0, ISP_RD32((void *)(ISP_ADDR
+ 0xBA0)));
790 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xBA4, ISP_RD32((void *)(ISP_ADDR
+ 0xBA4)));
791 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xBA8, ISP_RD32((void *)(ISP_ADDR
+ 0xBA8)));
792 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xBAC, ISP_RD32((void *)(ISP_ADDR
+ 0xBAC)));
793 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xBB0, ISP_RD32((void *)(ISP_ADDR
+ 0xBB0)));
794 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xBB4, ISP_RD32((void *)(ISP_ADDR
+ 0xBB4)));
795 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xBB8, ISP_RD32((void *)(ISP_ADDR
+ 0xBB8)));
796 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xBBC, ISP_RD32((void *)(ISP_ADDR
+ 0xBBC)));
797 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xBC0, ISP_RD32((void *)(ISP_ADDR
+ 0xBC0)));
798 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xC20, ISP_RD32((void *)(ISP_ADDR
+ 0xC20)));
799 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xCC0, ISP_RD32((void *)(ISP_ADDR
+ 0xCC0)));
800 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xCE4, ISP_RD32((void *)(ISP_ADDR
+ 0xCE4)));
801 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xCE8, ISP_RD32((void *)(ISP_ADDR
+ 0xCE8)));
802 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xCEC, ISP_RD32((void *)(ISP_ADDR
+ 0xCEC)));
803 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xCF0, ISP_RD32((void *)(ISP_ADDR
+ 0xCF0)));
804 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xCF4, ISP_RD32((void *)(ISP_ADDR
+ 0xCF4)));
805 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xCF8, ISP_RD32((void *)(ISP_ADDR
+ 0xCF8)));
806 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xCFC, ISP_RD32((void *)(ISP_ADDR
+ 0xCFC)));
807 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xD24, ISP_RD32((void *)(ISP_ADDR
+ 0xD24)));
808 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xD28, ISP_RD32((void *)(ISP_ADDR
+ 0xD28)));
809 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xD2C, ISP_RD32((void *)(ISP_ADDR
+ 0xD2c)));
810 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xD40, ISP_RD32((void *)(ISP_ADDR
+ 0xD40)));
811 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xD64, ISP_RD32((void *)(ISP_ADDR
+ 0xD64)));
812 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xD68, ISP_RD32((void *)(ISP_ADDR
+ 0xD68)));
813 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xD6C, ISP_RD32((void *)(ISP_ADDR
+ 0xD6c)));
814 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xD70, ISP_RD32((void *)(ISP_ADDR
+ 0xD70)));
815 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xD74, ISP_RD32((void *)(ISP_ADDR
+ 0xD74)));
816 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xD78, ISP_RD32((void *)(ISP_ADDR
+ 0xD78)));
817 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xD7C, ISP_RD32((void *)(ISP_ADDR
+ 0xD7C)));
818 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xDA4, ISP_RD32((void *)(ISP_ADDR
+ 0xDA4)));
819 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xDA8, ISP_RD32((void *)(ISP_ADDR
+ 0xDA8)));
820 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0xDAC, ISP_RD32((void *)(ISP_ADDR
+ 0xDAC)));
821 ISP_WR32((void *)(ISP_ADDR
+ 0x4618), 0x0000FFFF);
822 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4010, ISP_RD32((void *)(ISP_ADDR
+ 0x4010)));
823 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4014, ISP_RD32((void *)(ISP_ADDR
+ 0x4014)));
824 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4018, ISP_RD32((void *)(ISP_ADDR
+ 0x4018)));
825 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x401C, ISP_RD32((void *)(ISP_ADDR
+ 0x401C)));
826 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4020, ISP_RD32((void *)(ISP_ADDR
+ 0x4020)));
827 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4024, ISP_RD32((void *)(ISP_ADDR
+ 0x4024)));
828 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4028, ISP_RD32((void *)(ISP_ADDR
+ 0x4028)));
829 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x402C, ISP_RD32((void *)(ISP_ADDR
+ 0x402C)));
830 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4100, ISP_RD32((void *)(ISP_ADDR
+ 0x4100)));
831 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4104, ISP_RD32((void *)(ISP_ADDR
+ 0x4104)));
832 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4108, ISP_RD32((void *)(ISP_ADDR
+ 0x4108)));
833 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x410C, ISP_RD32((void *)(ISP_ADDR
+ 0x410C)));
834 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4120, ISP_RD32((void *)(ISP_ADDR
+ 0x4120)));
835 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x412C, ISP_RD32((void *)(ISP_ADDR
+ 0x412C)));
836 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x420C, ISP_RD32((void *)(ISP_ADDR
+ 0x420C)));
837 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4234, ISP_RD32((void *)(ISP_ADDR
+ 0x4234)));
838 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4240, ISP_RD32((void *)(ISP_ADDR
+ 0x4240)));
839 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4300, ISP_RD32((void *)(ISP_ADDR
+ 0x4300)));
840 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4304, ISP_RD32((void *)(ISP_ADDR
+ 0x4304)));
841 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4600, ISP_RD32((void *)(ISP_ADDR
+ 0x4600)));
842 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4604, ISP_RD32((void *)(ISP_ADDR
+ 0x4604)));
843 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4608, ISP_RD32((void *)(ISP_ADDR
+ 0x4608)));
844 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x460C, ISP_RD32((void *)(ISP_ADDR
+ 0x460C)));
845 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4610, ISP_RD32((void *)(ISP_ADDR
+ 0x4610)));
846 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4614, ISP_RD32((void *)(ISP_ADDR
+ 0x4614)));
847 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4618, ISP_RD32((void *)(ISP_ADDR
+ 0x4618)));
848 ISP_WR32((void *)(ISP_ADDR
+ 0x461C), 0x10);
849 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x461C, ISP_RD32((void *)(ISP_ADDR
+ 0x461C)));
850 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4620, ISP_RD32((void *)(ISP_ADDR
+ 0x4620)));
851 ISP_WR32((void *)(ISP_ADDR
+ 0x461C), 0x11);
852 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x461C, ISP_RD32((void *)(ISP_ADDR
+ 0x461C)));
853 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4620, ISP_RD32((void *)(ISP_ADDR
+ 0x4620)));
854 ISP_WR32((void *)(ISP_ADDR
+ 0x461C), 0x12);
855 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x461C, ISP_RD32((void *)(ISP_ADDR
+ 0x461C)));
856 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4620, ISP_RD32((void *)(ISP_ADDR
+ 0x4620)));
857 ISP_WR32((void *)(ISP_ADDR
+ 0x461C), 0x10);
858 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x461C, ISP_RD32((void *)(ISP_ADDR
+ 0x461C)));
859 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4620, ISP_RD32((void *)(ISP_ADDR
+ 0x4620)));
860 ISP_WR32((void *)(ISP_ADDR
+ 0x461C), 0x11);
861 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x461C, ISP_RD32((void *)(ISP_ADDR
+ 0x461C)));
862 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4620, ISP_RD32((void *)(ISP_ADDR
+ 0x4620)));
863 ISP_WR32((void *)(ISP_ADDR
+ 0x461C), 0x12);
864 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x461C, ISP_RD32((void *)(ISP_ADDR
+ 0x461C)));
865 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4620, ISP_RD32((void *)(ISP_ADDR
+ 0x4620)));
866 ISP_WR32((void *)(ISP_ADDR
+ 0x461C), 0x10);
867 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x461C, ISP_RD32((void *)(ISP_ADDR
+ 0x461C)));
868 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4620, ISP_RD32((void *)(ISP_ADDR
+ 0x4620)));
869 ISP_WR32((void *)(ISP_ADDR
+ 0x461C), 0x11);
870 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x461C, ISP_RD32((void *)(ISP_ADDR
+ 0x461C)));
871 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4620, ISP_RD32((void *)(ISP_ADDR
+ 0x4620)));
872 ISP_WR32((void *)(ISP_ADDR
+ 0x461C), 0x12);
873 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x461C, ISP_RD32((void *)(ISP_ADDR
+ 0x461C)));
874 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4620, ISP_RD32((void *)(ISP_ADDR
+ 0x4620)));
876 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4618, ISP_RD32((void *)(ISP_ADDR
+ 0x4618)));
877 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4624, ISP_RD32((void *)(ISP_ADDR
+ 0x4624)));
878 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4628, ISP_RD32((void *)(ISP_ADDR
+ 0x4628)));
879 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x462C, ISP_RD32((void *)(ISP_ADDR
+ 0x462C)));
880 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x4630, ISP_RD32((void *)(ISP_ADDR
+ 0x4630)));
883 // for tpipe main end
886 for( i
= 0x44; i
<= 0x48; i
+= 4)
888 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ i
, ISP_RD32((void *)(ISP_ADDR
+ i
)));
892 for( i
= 0x248; i
<= 0x24C; i
+= 4)//IMGI
894 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ i
, ISP_RD32((void *)(ISP_ADDR
+ i
)));
896 for( i
= 0x280; i
<= 0x284; i
+= 4)//LSCI
898 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ i
, ISP_RD32((void *)(ISP_ADDR
+ i
)));
900 for( i
= 0x29C; i
<= 0x2A0; i
+= 4)//FLKI
902 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ i
, ISP_RD32((void *)(ISP_ADDR
+ i
)));
904 for( i
= 0x2D8; i
<= 0x2DC; i
+= 4)//VIPI
906 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ i
, ISP_RD32((void *)(ISP_ADDR
+ i
)));
908 for( i
= 0x2F8; i
<= 0x2FC; i
+= 4)//VIP2I
910 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ i
, ISP_RD32((void *)(ISP_ADDR
+ i
)));
912 for( i
= 0x300; i
<= 0x31C; i
+= 4)//IMGO
914 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ i
, ISP_RD32((void *)(ISP_ADDR
+ i
)));
916 for( i
= 0x334; i
<= 0x338; i
+= 4)//IMG2O
918 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ i
, ISP_RD32((void *)(ISP_ADDR
+ i
)));
920 for( i
= 0x380; i
<= 0x384; i
+= 4)//ESFKO
922 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ i
, ISP_RD32((void *)(ISP_ADDR
+ i
)));
924 for( i
= 0x39C; i
<= 0x3A0; i
+= 4)//ESFKO
926 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ i
, ISP_RD32((void *)(ISP_ADDR
+ i
)));
930 for( i
= 0x3A4; i
<= 0x3D8; i
+= 4)
932 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ i
, ISP_RD32((void *)(ISP_ADDR
+ i
)));
936 for( i
= 0x410; i
<= 0x44C; i
+= 4)
938 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ i
, ISP_RD32((void *)(ISP_ADDR
+ i
)));
942 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0xCC0, ISP_RD32((void *)(ISP_ADDR
+ 0xCC0)));
943 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0xD40, ISP_RD32((void *)(ISP_ADDR
+ 0xD40)));
946 for( i
= 0x4014; i
<= 0x4018; i
+= 4)
948 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ i
, ISP_RD32((void *)(ISP_ADDR
+ i
)));
951 LOG_DBG("0x%08X %08X ", ISP_ADDR_CAMINF
, ISP_RD32((void *)ISP_ADDR_CAMINF
));
952 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x150, ISP_RD32((void *)(ISP_ADDR
+ 0x150)));
956 1. Debug port information:
958 [30]:ultra-high is enable
960 ISP_WR32(ISP_ADDR
+ 0x160,0x94);
961 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x160, ISP_RD32(ISP_ADDR
+ 0x160));
962 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x164, ISP_RD32(ISP_ADDR
+ 0x164));
966 0x15004160 ] 0x00000011
968 Check bit 21 ->N dmadone_flag
969 Check bit [9:7] -> NFSM (idle =0)
971 ISP_WR32(ISP_ADDR
+ 0x160,0x00000011);
972 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x160, ISP_RD32(ISP_ADDR
+ 0x160));
973 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x164, ISP_RD32(ISP_ADDR
+ 0x164));
976 0x15004160 ] 0x00000021
978 Check bit 21 ->N dmadone_flag
979 Check bit [9:7] -> NFSM (idle =0)
981 ISP_WR32(ISP_ADDR
+ 0x160,0x00000021);
982 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x160, ISP_RD32(ISP_ADDR
+ 0x160));
983 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x164, ISP_RD32(ISP_ADDR
+ 0x164));
986 0x15004160 ] 0x00000031
988 Check bit 21 ->N dmadone_flag
989 Check bit [9:7] -> NFSM (idle =0)
991 ISP_WR32(ISP_ADDR
+ 0x160,0x00000031);
992 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x160, ISP_RD32(ISP_ADDR
+ 0x160));
993 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x164, ISP_RD32(ISP_ADDR
+ 0x164));
997 0x15004160 ] 0x00000051
999 Check bit 21 ->N dmadone_flag
1000 Check bit [9:7] -> NFSM (idle =0)
1002 ISP_WR32(ISP_ADDR
+ 0x160,0x00000051);
1003 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x160, ISP_RD32(ISP_ADDR
+ 0x160));
1004 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x164, ISP_RD32(ISP_ADDR
+ 0x164));
1008 0x15004160 ] 0x00000061
1010 Check bit 21 ->N dmadone_flag
1011 Check bit [9:7] -> NFSM (idle =0)
1013 ISP_WR32(ISP_ADDR
+ 0x160,0x00000061);
1014 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x160, ISP_RD32(ISP_ADDR
+ 0x160));
1015 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x164, ISP_RD32(ISP_ADDR
+ 0x164));
1018 0x15004160 ] 0x00000071
1020 Check bit 21 ->N dmadone_flag
1021 Check bit [9:7] -> NFSM (idle =0)
1023 ISP_WR32(ISP_ADDR
+ 0x160,0x00000071);
1024 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x160, ISP_RD32(ISP_ADDR
+ 0x160));
1025 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x164, ISP_RD32(ISP_ADDR
+ 0x164));
1028 0x15004160 ] 0x00000081
1030 Check bit 21 ->N dmadone_flag
1031 Check bit [9:7] -> NFSM (idle =0)
1033 ISP_WR32(ISP_ADDR
+ 0x160,0x00000081);
1034 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x160, ISP_RD32(ISP_ADDR
+ 0x160));
1035 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x164, ISP_RD32(ISP_ADDR
+ 0x164));
1038 0x15004160 ] 0x00000194
1040 Check bit [4:2] ->NFSM (idle =0)
1041 Check bit 23 -> Ndmasent_flag
1042 Check bit 22 -> N dmadone_flag
1044 ISP_WR32(ISP_ADDR
+ 0x160,0x00000194);
1045 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x160, ISP_RD32(ISP_ADDR
+ 0x160));
1046 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x164, ISP_RD32(ISP_ADDR
+ 0x164));
1049 0x15004160 ] 0x000001a4
1051 Check bit [4:2] ->NFSM (idle =0)
1052 Check bit 23 -> Ndmasent_flag
1053 Check bit 22 -> N dmadone_flag
1055 ISP_WR32(ISP_ADDR
+ 0x160,0x000001a4);
1056 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x160, ISP_RD32(ISP_ADDR
+ 0x160));
1057 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x164, ISP_RD32(ISP_ADDR
+ 0x164));
1061 0x15004160 ] 0x000001b4
1063 Check bit [4:2] ->NFSM (idle =0)
1064 Check bit 23 -> Ndmasent_flag
1065 Check bit 22 -> N dmadone_flag
1067 ISP_WR32(ISP_ADDR
+ 0x160,0x000001b4);
1068 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x160, ISP_RD32(ISP_ADDR
+ 0x160));
1069 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x164, ISP_RD32(ISP_ADDR
+ 0x164));
1073 0x15004160 ] 0x000001c4
1075 Check bit [4:2] ->NFSM (idle =0)
1076 Check bit 23 -> Ndmasent_flag
1077 Check bit 22 -> N dmadone_flag
1079 ISP_WR32(ISP_ADDR
+ 0x160,0x000001c4);
1080 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x160, ISP_RD32(ISP_ADDR
+ 0x160));
1081 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x164, ISP_RD32(ISP_ADDR
+ 0x164));
1084 0x15004160 ] 0x000001d4
1086 Check bit [4:2] ->NFSM (idle =0)
1087 Check bit 23 -> Ndmasent_flag
1088 Check bit 22 -> N dmadone_flag
1090 ISP_WR32(ISP_ADDR
+ 0x160,0x000001d4);
1091 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x160, ISP_RD32(ISP_ADDR
+ 0x160));
1092 LOG_DBG("0x%08X %08X ", ISP_ADDR
+ 0x164, ISP_RD32(ISP_ADDR
+ 0x164));
1098 //spin_unlock_irqrestore(&(g_IspInfo.SpinLock), flags);
1104 /*********************************************************************
1106 0x4160 = 0x9000, look 0x4164 , it is imgo status
1107 0x4160 = 0x9001, look 0x4164 , it is imgo line / pix cnt with sync
1108 0x4160 = 0x9002, look 0x4164 , it is imgo line / pix cnt without sync
1110 0x4160 = 0x9003, look 0x4164 , it is imgi status
1111 0x4160 = 0x9004, look 0x4164, it is imgi line / pix cnt with sync
1112 0x4160 = 0x9005, look 0x4164, it is imgi line / pix cnt without sync
1114 0x4160 = 0x9006, look 0x4164, it is raw_cfa status
1115 0x4160 = 0x9007, look 0x4164, it is raw_cfa line / pix cnt with sync
1116 0x4160 = 0x9008, look 0x4164, it is raw_cfa line / pix cnt without sync
1118 0x4160 = 0x9009, look 0x4164, it is rgb_yuv status
1119 0x4160 = 0x900a, look 0x4164, it is rgb_yuv a line / pix cnt with sync
1120 0x4160 = 0x900b, look 0x4164, it is rgb_yuv line / pix cnt without sync
1122 0x4160 = 0x900c, look 0x4164, it is yuv_out status
1123 0x4160 = 0x900d, look 0x4164, it is yuv_out line / pix cnt with sync
1124 0x4160 = 0x900e, look 0x4164, it is yuv_out line / pix cnt without sync
1127 Bit 31:28 ? {sot_reg, eol_reg, eot_reg, sof} , reg means status record
1128 Bit 27:24 ?{eot, eol,eot, req}
1131 Rdy should be 1 at idle or end of tile, if not 0, «Ü¥i¯à ¬Omdp ¨S¦^rdy
1132 Req should be 0 at idle or end of tile
1134 sot_reg, eol_reg, eot_reg should be 1 at idle or end of tile
1135 you can also line / pix cnt without sync , to check if
1137 line count : bit 31:16
1138 pix count : bit 15:0
1141 2. 0x4044 / 0x4048 status
1142 It is µL¶· enable,
1143 It is clear by 0x4020[31] write or read clear,
1144 It has many information on it,
1147 3. read CQ status status
1149 Dump 0x4164 full register
1150 Bit 3:0 : cq1 , 1 means idle
1151 Bit 7:4 : cq2 , 1 means idle
1152 Bit 11:8 : cq3 , 1 means idle
1153 Bit 13:12 : apb status , 1 means idle
1156 #define ISP_REG_ADDR_CTL_DBG_SET_IMGI_STS (0x9003)
1157 #define ISP_REG_ADDR_CTL_DBG_SET_IMGI_SYNC (0x9004)
1158 #define ISP_REG_ADDR_CTL_DBG_SET_IMGI_NO_SYNC (0x9005)
1160 #define ISP_REG_ADDR_CTL_DBG_SET_CFA_STS (0x9006)
1161 #define ISP_REG_ADDR_CTL_DBG_SET_CFA_SYNC (0x9007)
1162 #define ISP_REG_ADDR_CTL_DBG_SET_CFA_NO_SYNC (0x9008)
1164 #define ISP_REG_ADDR_CTL_DBG_SET_YUV_STS (0x9009)
1165 #define ISP_REG_ADDR_CTL_DBG_SET_YUV_SYNC (0x900a)
1166 #define ISP_REG_ADDR_CTL_DBG_SET_YUV_NO_SYNC (0x900b)
1168 #define ISP_REG_ADDR_CTL_DBG_SET_OUT_STS (0x900c)
1169 #define ISP_REG_ADDR_CTL_DBG_SET_OUT_SYNC (0x900d)
1170 #define ISP_REG_ADDR_CTL_DBG_SET_OUT_NO_SYNC (0x900e)
1171 *********************************************************************/
1172 static int ISPDbgPortDump(int params
)
1175 LOG_DBG("ISP DBG PORT DUMP >>");
1177 LOG_DBG("CQ STATUS:>");
1178 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),
1179 ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1180 LOG_DBG("IMGI STATUS:>");
1181 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, ISP_REG_ADDR_CTL_DBG_SET_IMGI_STS
);
1182 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),
1183 ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1184 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, ISP_REG_ADDR_CTL_DBG_SET_IMGI_SYNC
);
1185 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),
1186 ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1187 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, ISP_REG_ADDR_CTL_DBG_SET_IMGI_NO_SYNC
);
1188 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),
1189 ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1192 LOG_DBG("RAW_CFA STATUS:>");
1193 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, ISP_REG_ADDR_CTL_DBG_SET_CFA_STS
);
1194 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),
1195 ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1196 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, ISP_REG_ADDR_CTL_DBG_SET_CFA_SYNC
);
1197 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),
1198 ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1199 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, ISP_REG_ADDR_CTL_DBG_SET_CFA_NO_SYNC
);
1200 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),
1201 ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1204 LOG_DBG("RGB_YUV STATUS:>");
1205 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, ISP_REG_ADDR_CTL_DBG_SET_YUV_STS
);
1206 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),
1207 ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1208 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, ISP_REG_ADDR_CTL_DBG_SET_YUV_SYNC
);
1209 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),
1210 ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1211 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, ISP_REG_ADDR_CTL_DBG_SET_YUV_NO_SYNC
);
1212 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),
1213 ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1216 LOG_DBG("YUV_OUT STATUS:>");
1217 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, ISP_REG_ADDR_CTL_DBG_SET_OUT_STS
);
1218 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),
1219 ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1220 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, ISP_REG_ADDR_CTL_DBG_SET_OUT_SYNC
);
1221 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),
1222 ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));;
1223 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, ISP_REG_ADDR_CTL_DBG_SET_OUT_NO_SYNC
);
1224 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),
1225 ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1229 LOG_DBG("CQ STATUS RETURN:>");
1230 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, ISP_REG_ADDR_CTL_DBG_SET_CQ_STS
);
1231 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),
1232 ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1235 LOG_DBG("INT_STATUSX:>");
1236 LOG_DBG("(0x%08x 0x%08x)",ISP_REG_ADDR_INT_STATUSX
,
1237 ISP_RD32((void *)ISP_REG_ADDR_INT_STATUSX
) );
1239 LOG_DBG("DMA_INTX:>");
1240 LOG_DBG("(0x%08x 0x%08x)",ISP_REG_ADDR_DMA_INTX
,
1241 ISP_RD32((void *)ISP_REG_ADDR_DMA_INTX
) );
1245 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x5000);
1246 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),
1247 ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1251 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x5100);
1252 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),
1253 ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1256 LOG_DBG("MDPINF:>");
1257 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0xA000);
1258 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),
1259 ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1263 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x910F);
1264 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),
1265 ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1268 LOG_DBG("PASS2_DB_EN (~0x00000020):>");
1269 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x018, ISP_RD32((void *)(ISP_ADDR
+ 0x018)));
1272 LOG_DBG("TDR_EN (0x80000000):>");
1273 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x054, ISP_RD32((void *)(ISP_ADDR
+ 0x054)));
1277 LOG_DBG("TDR_BASE_ADDR :>");
1278 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x204, ISP_RD32((void *)(ISP_ADDR
+ 0x204)));
1282 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x230, ISP_RD32((void *)(ISP_ADDR
+ 0x230)));
1283 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x234, ISP_RD32((void *)(ISP_ADDR
+ 0x234)));
1284 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x238, ISP_RD32((void *)(ISP_ADDR
+ 0x238)));
1285 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x23C, ISP_RD32((void *)(ISP_ADDR
+ 0x23C)));
1286 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x240, ISP_RD32((void *)(ISP_ADDR
+ 0x240)));
1287 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x248, ISP_RD32((void *)(ISP_ADDR
+ 0x248)));
1288 LOG_DBG("0x%08X %08X", ISP_TPIPE_ADDR
+ 0x24C, ISP_RD32((void *)(ISP_ADDR
+ 0x24C)));
1290 LOG_DBG("<CDP_OUT STATUS:>");
1291 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x0000400d);
1292 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),
1293 ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1294 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x0000400e);
1295 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),
1296 ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1297 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x0000400f);
1298 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),
1299 ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1300 LOG_DBG("ISP DBG PORT DUMP <<");
1305 static void SeninfOverrunDump(void)
1307 static MINT32 debugFlag
= 0;
1309 LOG_DBG("(0xF0203108 0x%08x)",ISP_RD32((void *)0xF0203108));
1313 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x1100);
1314 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1316 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x1002);
1317 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1319 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x1102);
1320 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1322 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x1202);
1323 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1325 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x1302);
1326 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1328 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x1006);
1329 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1331 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x1106);
1332 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1334 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x110A);
1335 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1337 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x100B);
1338 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1340 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x110B);
1341 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1343 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x110C);
1344 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1346 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x1016);
1347 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1349 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x1017);
1350 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1352 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x1018);
1353 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1355 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x1019);
1356 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1358 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x101A);
1359 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1361 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x101B);
1362 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1364 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x9000);
1365 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1367 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x9001);
1368 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1370 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x9002);
1371 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1380 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x1100);
1381 g_seninfDebug
[idx
].regVal_1
= 0x1100;
1382 g_seninfDebug
[idx
].regVal_2
= ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
);
1385 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x1002);
1386 g_seninfDebug
[idx
].regVal_1
= 0x1002;
1387 g_seninfDebug
[idx
].regVal_2
= ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
);
1390 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x1102);
1391 g_seninfDebug
[idx
].regVal_1
= 0x1102;
1392 g_seninfDebug
[idx
].regVal_2
= ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
);
1395 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x1202);
1396 g_seninfDebug
[idx
].regVal_1
= 0x1202;
1397 g_seninfDebug
[idx
].regVal_2
= ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
);
1400 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x1302);
1401 g_seninfDebug
[idx
].regVal_1
= 0x1302;
1402 g_seninfDebug
[idx
].regVal_2
= ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
);
1405 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x1006);
1406 g_seninfDebug
[idx
].regVal_1
= 0x1006;
1407 g_seninfDebug
[idx
].regVal_2
= ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
);
1410 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x1106);
1411 g_seninfDebug
[idx
].regVal_1
= 0x1106;
1412 g_seninfDebug
[idx
].regVal_2
= ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
);
1415 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x110A);
1416 g_seninfDebug
[idx
].regVal_1
= 0x110A;
1417 g_seninfDebug
[idx
].regVal_2
= ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
);
1420 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x100B);
1421 g_seninfDebug
[idx
].regVal_1
= 0x100B;
1422 g_seninfDebug
[idx
].regVal_2
= ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
);
1425 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x110B);
1426 g_seninfDebug
[idx
].regVal_1
= 0x110B;
1427 g_seninfDebug
[idx
].regVal_2
= ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
);
1430 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x110C);
1431 g_seninfDebug
[idx
].regVal_1
= 0x110C;
1432 g_seninfDebug
[idx
].regVal_2
= ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
);
1435 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x1016);
1436 g_seninfDebug
[idx
].regVal_1
= 0x1016;
1437 g_seninfDebug
[idx
].regVal_2
= ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
);
1440 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x1017);
1441 g_seninfDebug
[idx
].regVal_1
= 0x1017;
1442 g_seninfDebug
[idx
].regVal_2
= ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
);
1445 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x1018);
1446 g_seninfDebug
[idx
].regVal_1
= 0x1018;
1447 g_seninfDebug
[idx
].regVal_2
= ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
);
1450 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x1019);
1451 g_seninfDebug
[idx
].regVal_1
= 0x1019;
1452 g_seninfDebug
[idx
].regVal_2
= ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
);
1455 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x101A);
1456 g_seninfDebug
[idx
].regVal_1
= 0x101A;
1457 g_seninfDebug
[idx
].regVal_2
= ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
);
1460 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x101B);
1461 g_seninfDebug
[idx
].regVal_1
= 0x101B;
1462 g_seninfDebug
[idx
].regVal_2
= ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
);
1465 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x9000);
1466 g_seninfDebug
[idx
].regVal_1
= 0x9000;
1467 g_seninfDebug
[idx
].regVal_2
= ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
);
1470 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x9001);
1471 g_seninfDebug
[idx
].regVal_1
= 0x9001;
1472 g_seninfDebug
[idx
].regVal_2
= ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
);
1475 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, 0x9002);
1476 g_seninfDebug
[idx
].regVal_1
= 0x9002;
1477 g_seninfDebug
[idx
].regVal_2
= ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
);
1488 int ISPRegDump(int params
)
1494 //spin_lock_irqsave(&(g_IspInfo.SpinLock), flags);
1496 //tile tool parse range
1497 //Joseph Hung (xa)#define ISP_ADDR_START 0x15004000
1498 // #define ISP_ADDR_END 0x15006000
1501 // for tpipe main start
1502 LOG_DBG("Camera_isp RegDump start");
1503 LOG_DBG("start MT");
1504 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0x000, ISP_RD32((void *)(ISP_ADDR
+ 0x000)));
1505 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0x004, ISP_RD32((void *)(ISP_ADDR
+ 0x004)));
1506 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0x008, ISP_RD32((void *)(ISP_ADDR
+ 0x008)));
1507 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0x00C, ISP_RD32((void *)(ISP_ADDR
+ 0x00C)));
1508 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0x010, ISP_RD32((void *)(ISP_ADDR
+ 0x010)));
1509 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0x018, ISP_RD32((void *)(ISP_ADDR
+ 0x018)));
1510 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0x01C, ISP_RD32((void *)(ISP_ADDR
+ 0x01C)));
1511 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0x050, ISP_RD32((void *)(ISP_ADDR
+ 0x050)));
1512 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0x054, ISP_RD32((void *)(ISP_ADDR
+ 0x054)));
1513 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0x078, ISP_RD32((void *)(ISP_ADDR
+ 0x078)));
1514 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0x110, ISP_RD32((void *)(ISP_ADDR
+ 0x110)));
1515 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0x114, ISP_RD32((void *)(ISP_ADDR
+ 0x114)));
1516 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0x22C, ISP_RD32((void *)(ISP_ADDR
+ 0x22C)));
1517 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0x240, ISP_RD32((void *)(ISP_ADDR
+ 0x240)));
1518 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0x27C, ISP_RD32((void *)(ISP_ADDR
+ 0x27C)));
1519 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0x2B4, ISP_RD32((void *)(ISP_ADDR
+ 0x2B4)));
1520 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0x308, ISP_RD32((void *)(ISP_ADDR
+ 0x308)));
1521 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0x30C, ISP_RD32((void *)(ISP_ADDR
+ 0x30C)));
1522 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0x310, ISP_RD32((void *)(ISP_ADDR
+ 0x310)));
1523 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0x31C, ISP_RD32((void *)(ISP_ADDR
+ 0x31C)));
1524 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0x328, ISP_RD32((void *)(ISP_ADDR
+ 0x328)));
1525 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0x32C, ISP_RD32((void *)(ISP_ADDR
+ 0x32C)));
1526 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0x330, ISP_RD32((void *)(ISP_ADDR
+ 0x330)));
1527 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0x33C, ISP_RD32((void *)(ISP_ADDR
+ 0x33C)));
1528 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0x3A8, ISP_RD32((void *)(ISP_ADDR
+ 0x3A8)));
1529 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0x534, ISP_RD32((void *)(ISP_ADDR
+ 0x534)));
1530 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0x538, ISP_RD32((void *)(ISP_ADDR
+ 0x538)));
1531 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0x53C, ISP_RD32((void *)(ISP_ADDR
+ 0x53C)));
1532 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0x800, ISP_RD32((void *)(ISP_ADDR
+ 0x800)));
1533 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0x8A0, ISP_RD32((void *)(ISP_ADDR
+ 0x8A0)));
1534 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0x9C4, ISP_RD32((void *)(ISP_ADDR
+ 0x9C4)));
1535 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0x9E4, ISP_RD32((void *)(ISP_ADDR
+ 0x9E4)));
1536 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0x9E8, ISP_RD32((void *)(ISP_ADDR
+ 0x9E8)));
1537 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0x9EC, ISP_RD32((void *)(ISP_ADDR
+ 0x9EC)));
1538 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0xA20, ISP_RD32((void *)(ISP_ADDR
+ 0xA20)));
1539 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0xACC, ISP_RD32((void *)(ISP_ADDR
+ 0xACC)));
1540 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0xB00, ISP_RD32((void *)(ISP_ADDR
+ 0xB00)));
1541 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0xB04, ISP_RD32((void *)(ISP_ADDR
+ 0xB04)));
1542 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0xB08, ISP_RD32((void *)(ISP_ADDR
+ 0xB08)));
1543 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0xB0C, ISP_RD32((void *)(ISP_ADDR
+ 0xB0C)));
1544 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0xB10, ISP_RD32((void *)(ISP_ADDR
+ 0xB10)));
1545 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0xB14, ISP_RD32((void *)(ISP_ADDR
+ 0xB14)));
1546 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0xB18, ISP_RD32((void *)(ISP_ADDR
+ 0xB18)));
1547 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0xB1C, ISP_RD32((void *)(ISP_ADDR
+ 0xB1C)));
1548 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0xB20, ISP_RD32((void *)(ISP_ADDR
+ 0xB20)));
1549 LOG_DBG("[ISP/MDP][TPIPE_DumpReg] 0x%08X = 0x%08X", ISP_TPIPE_ADDR
+ 0xF50, ISP_RD32((void *)(ISP_ADDR
+ 0xF50)));
1553 //spin_unlock_irqrestore(&(g_IspInfo.SpinLock), flags);
1556 ISPDbgPortDump(params
);
1559 static int ISPResetPass2(int params
)
1563 MINT32 m32RegEn2
= 0;
1564 MINT32 m32RegCropX
= 0;
1565 LOG_DBG("ISPResetPass2 >>");
1568 // LOG_DBG("CQ STATUS: bef");
1569 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),
1570 ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1573 LOG_DBG("ISP_REG_ADDR_CTL_EN2>: 0x%08x ", ISP_RD32((void *)ISP_REG_ADDR_CTL_EN2
));
1574 m32RegEn2
= ISP_RD32((void *)ISP_REG_ADDR_CTL_EN2
);
1575 ISP_WR32((void *)ISP_REG_ADDR_CTL_EN2
, m32RegEn2
&(~ISP_REG_ADDR_CTL_EN2_UV_CRSA_EN_BIT
));
1576 // LOG_DBG("ISP_REG_ADDR_CTL_EN2>>: 0x%08x ", ISP_RD32((void *)ISP_REG_ADDR_CTL_EN2));
1578 LOG_DBG("ISP_REG_ADDR_CTL_CROP_X>: 0x%08x ", ISP_RD32((void *)ISP_REG_ADDR_CTL_CROP_X
));
1579 m32RegCropX
= ISP_RD32((void *)ISP_REG_ADDR_CTL_CROP_X
);
1580 ISP_WR32((void *)ISP_REG_ADDR_CTL_CROP_X
, m32RegCropX
&(~ISP_REG_ADDR_CTL_CROP_X_MDP_CROP_EN_BIT
));
1581 // LOG_DBG("ISP_REG_ADDR_CTL_CROP_X>>: 0x%08x ", ISP_RD32((void *)ISP_REG_ADDR_CTL_CROP_X));
1583 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, ISP_REG_ADDR_CTL_DBG_SET_CQ_STS
);
1586 if((ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
)&0x11) == 0x11)
1591 LOG_DBG("i - %d ", i
);
1592 ISP_WR32((void *)ISP_REG_ADDR_CTL_EN2
, m32RegEn2
);
1593 // LOG_DBG("ISP_REG_ADDR_CTL_EN2>>>: 0x%08x ", ISP_RD32((void *)ISP_REG_ADDR_CTL_EN2));
1595 ISP_WR32((void *)ISP_REG_ADDR_CTL_CROP_X
, m32RegCropX
);
1596 // LOG_DBG("ISP_REG_ADDR_CTL_CROP_X>>>: 0x%08x ", ISP_RD32((void *)ISP_REG_ADDR_CTL_CROP_X));
1598 // LOG_DBG("CQ STATUS: aft");
1599 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),
1600 ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1603 LOG_DBG("ISPResetPass2 <<");
1607 int MDPReset_Process(int params
)
1609 LOG_DBG("\n\n\n MDP cmdqReset_cb Test %d\n\n\n", params
);
1610 ISPResetPass2(params
);
1613 /*******************************************************************************
1615 ********************************************************************************/
1616 static MVOID
ISP_EnableClock(MBOOL En
)
1618 #if 0 // using LDVT. Temp solution for LDVT
1620 LOG_INF("in LDVT,En(%d),g_EnableClkCnt(%d)", En
, g_EnableClkCnt
);
1622 ISP_WR32(CAMINF_BASE
, 0x00);
1624 #else // Not using LDVT
1626 LOG_INF("En(%d),g_EnableClkCnt(%d)", En
, g_EnableClkCnt
);
1628 if(En
) // enable clock.
1630 enable_clock(MT_CG_DISP0_SMI_COMMON
,"CAMERA"); //new for MT, confirm with Abrams
1631 enable_clock(MT_CG_IMAGE_CAM_SMI
, "CAMERA");
1632 enable_clock(MT_CG_IMAGE_CAM_CAM
, "CAMERA");
1633 enable_clock(MT_CG_IMAGE_SEN_TG
, "CAMERA");
1634 enable_clock(MT_CG_IMAGE_SEN_CAM
, "CAMERA");
1635 enable_clock(MT_CG_IMAGE_LARB2_SMI
, "CAMERA");
1637 LOG_DBG("Camera clock enbled. g_EnableClkCnt(%d)", g_EnableClkCnt
);
1639 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),
1640 ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1641 if(ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
)!=ISP_REG_ADDR_CTL_DBG_SET_CQ_STS
)
1643 // LOG_DBG("CQ STATUS RETURN:>");
1644 ISP_WR32((void *)ISP_REG_ADDR_CTL_DBG_SET
, ISP_REG_ADDR_CTL_DBG_SET_CQ_STS
);
1645 LOG_DBG("(0x%08x 0x%08x)",ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_SET
),
1646 ISP_RD32((void *)ISP_REG_ADDR_CTL_DBG_PORT
));
1650 else // disable clock.
1652 disable_clock(MT_CG_IMAGE_CAM_SMI
, "CAMERA");
1653 disable_clock(MT_CG_IMAGE_CAM_CAM
, "CAMERA");
1654 disable_clock(MT_CG_IMAGE_SEN_TG
, "CAMERA");
1655 disable_clock(MT_CG_IMAGE_SEN_CAM
, "CAMERA");
1656 disable_clock(MT_CG_IMAGE_LARB2_SMI
, "CAMERA");
1657 disable_clock(MT_CG_DISP0_SMI_COMMON
,"CAMERA"); //new for MT, confirm with Abrams
1659 LOG_DBG("Camera clock disabled. g_EnableClkCnt(%d)", g_EnableClkCnt
);
1666 /*******************************************************************************
1668 ********************************************************************************/
1669 static inline MVOID
ISP_Reset(MVOID
)
1671 // ensure the view finder is disabe. 0: take_picture
1672 //ISP_CLR_BIT(ISP_REG_ADDR_EN1, 0);
1675 unsigned long flags
;
1679 //TODO: MUST remove later
1681 //ISP_WR32(ISP_ADDR_CAMINF, 0);
1682 //ISP_EnableClock(MTRUE);
1683 LOG_DBG("isp gate clk(0x%x)",ISP_RD32((void *)ISP_ADDR_CAMINF
));
1685 //imgsys IMG_SW_RST -> reset HW register
1688 17 16 SENINF SENINF R/W 2'b00 "SENINF clock domain hw reset
1689 bit 0 : cam_tg hw domain hw reset,
1694 14 12 CAM_RST CAM_RST R/W 3'b000 " CAM W reset
1695 bit 0 : fsmi domain HW reset
1696 bit 1 : fmem domain HW reset
1697 bit 2 : faxi(cpu bus) dom HW reset
1701 // Reg = ISP_RD32(ISP_ADDR_CAMINF+0x0C);
1702 // ISP_WR32(ISP_ADDR_CAMINF+0x0C, (Reg|0x0003F000));
1704 // ISP_WR32(ISP_ADDR_CAMINF+0x0C, (Reg&(~0x0003F000)) );
1706 //js_test, remove later once IMGSYS is working. Now it's NOT working on FPGA.
1707 //remove temp solutionfor(i = 0; i <= 0x54; i += 4)
1709 //remove temp solution ISP_WR32((void *)(ISP_ADDR + i), 0x00 );
1712 LOG_DBG("remove 0x0~0x54 = 0x0");//remove temp solution
1714 //bandwidth limitor for TG
1715 Reg
= ISP_RD32((void *)(EMI_BASE
+ 0x120));
1718 ISP_WR32((void *)(EMI_BASE
+ 0x120), Reg
);
1719 ISP_WR32((void *)ISP_REG_ADDR_SW_CTL
, ISP_REG_SW_CTL_SW_RST_TRIG
);
1723 Reg = ISP_RD32(ISP_REG_ADDR_SW_CTL);
1724 if(Reg & ISP_REG_SW_CTL_SW_RST_STATUS)
1733 Reg
= ISP_RD32((void *)ISP_REG_ADDR_SW_CTL
);
1735 while((!Reg
) & ISP_REG_SW_CTL_SW_RST_STATUS
);
1737 ISP_WR32((void *)ISP_REG_ADDR_SW_CTL
, ISP_REG_SW_CTL_SW_RST_TRIG
|ISP_REG_SW_CTL_HW_RST
); //0x5
1738 ISP_WR32((void *)ISP_REG_ADDR_SW_CTL
, ISP_REG_SW_CTL_HW_RST
); //0x4
1739 ISP_WR32((void *)ISP_REG_ADDR_SW_CTL
, 0);
1741 spin_lock_irqsave(&(g_IspInfo
.SpinLockIrq
), flags
);
1743 for(i
= 0; i
< ISP_IRQ_TYPE_AMOUNT
; i
++)
1745 g_IspInfo
.IrqInfo
.Status
[i
] = 0;
1748 spin_unlock_irqrestore(&(g_IspInfo
.SpinLockIrq
), flags
);
1753 #if 0 //TODO:test code for SMI bandwidth control , remove later
1756 #define SMI_LARB_NUMBER 5
1757 for (i
=0; i
<SMI_LARB_NUMBER
; i
++) {
1760 LOG_DBG("+LARB in reset,BWL(0x%08X)/(0x%08X)/(0x%08X)/(0x%08X),220(0x%08X)/(0x%08X),0x14(0x%08X)/(0x%08X)/(0x%08X)/(0x%08X)/(0x%08X)", \
1761 ISP_RD32(0xF0202000+0x204), \
1762 ISP_RD32(0xF0202000+0x20c), \
1763 ISP_RD32(0xF0202000+0x210), \
1764 ISP_RD32(0xF0202000+0x214), \
1765 ISP_RD32(0xF0202000+0x220), \
1766 ISP_RD32(0xF0202000+0x230), \
1767 ISP_RD32(SMI_LARB0
+0x10), \
1768 ISP_RD32(SMI_LARB1
+0x10), \
1769 ISP_RD32(SMI_LARB2
+0x10), \
1770 ISP_RD32(SMI_LARB3
+0x10), \
1771 ISP_RD32(SMI_LARB4
+0x10));
1774 //SMI_COMMON_APB_BASE+0x204=0xb92 //larb0 venc
1775 //SMI_COMMON_APB_BASE+0x20c=0xa4b //larb2 disp
1776 //SMI_COMMON_APB_BASE+0x210=0x96d //larb3 cdp
1777 //SMI_COMMON_APB_BASE+0x214=0x9a7 //larb4 isp
1778 ISP_WR32(0xF0202000+0x204,0xb92);
1779 ISP_WR32(0xF0202000+0x20c,0xa4b);
1780 ISP_WR32(0xF0202000+0x210,0x96d);
1781 ISP_WR32(0xF0202000+0x214,0xfff);//pass1
1784 //Allocate larb->2 smi common
1785 //LARB2&3 use m4u#0, else use m4u#1
1786 //SMI_COMMON_APB_BASE+0x220=0x1505
1787 ISP_WR32(0xF0202000+0x220,0x1505);
1789 //SMI COMMON reduce command buffer
1790 //ISP_WR32(SMI_COMMON_APB_BASE+0x230,0x1560);
1791 ISP_WR32(0xF0202000+0x230,0x1560);
1793 //SMI LARB reduce command buffer
1794 ISP_WR32(SMI_LARB0
+0x14,0x400420);
1795 ISP_WR32(SMI_LARB1
+0x14,0x400420);
1796 ISP_WR32(SMI_LARB2
+0x14,0x400420);
1797 ISP_WR32(SMI_LARB3
+0x14,0x400420);//pass2
1798 //ISP_WR32(SMI_LARB4+0x14,0x400420);//pass1
1800 LOG_DBG("-LARB in reset,BWL(0x%08X)/(0x%08X)/(0x%08X)/(0x%08X),220(0x%08X)/(0x%08X),0x14(0x%08X)/(0x%08X)/(0x%08X)/(0x%08X)/(0x%08X)", \
1801 ISP_RD32(0xF0202000+0x204), \
1802 ISP_RD32(0xF0202000+0x20c), \
1803 ISP_RD32(0xF0202000+0x210), \
1804 ISP_RD32(0xF0202000+0x214), \
1805 ISP_RD32(0xF0202000+0x220), \
1806 ISP_RD32(0xF0202000+0x230), \
1807 ISP_RD32(SMI_LARB0
+0x10), \
1808 ISP_RD32(SMI_LARB1
+0x10), \
1809 ISP_RD32(SMI_LARB2
+0x10), \
1810 ISP_RD32(SMI_LARB3
+0x10), \
1811 ISP_RD32(SMI_LARB4
+0x10));
1813 for (i
=0; i
<SMI_LARB_NUMBER
; i
++) {
1821 /*******************************************************************************
1823 ********************************************************************************/
1824 static MINT32
ISP_ReadReg(ISP_REG_IO_STRUCT
*pRegIo
)
1826 MUINT32
*pData
= (MUINT32
*)pRegIo
->Data
;
1832 //====== Read Register ======
1834 for(i
= 0; i
< pRegIo
->Count
; i
++)
1836 if(0 != get_user(reg
.Addr
, pData
))
1838 LOG_ERR("get_user failed");
1843 if((ISP_ADDR_CAMINF
+ reg
.Addr
>= ISP_ADDR
) && (ISP_ADDR_CAMINF
+ reg
.Addr
< (ISP_ADDR_CAMINF
+ISP_RANGE
)))
1845 reg
.Val
= ISP_RD32((void *)(ISP_ADDR_CAMINF
+ reg
.Addr
));
1849 LOG_ERR("Wrong address(0x%x)",(unsigned int)(ISP_ADDR_CAMINF
+ reg
.Addr
));
1852 if(0 != put_user(reg
.Val
, pData
))
1854 LOG_ERR("put_user failed");
1865 /*******************************************************************************
1867 ********************************************************************************/
1868 static MINT32
ISP_WriteRegToHw(ISP_REG_STRUCT
*pReg
,MUINT32 Count
)
1873 if(g_IspInfo
.DebugMask
& ISP_DBG_WRITE_REG
)
1878 spin_lock(&(g_IspInfo
.SpinLockIsp
));
1879 for(i
= 0; i
< Count
; i
++)
1881 if(g_IspInfo
.DebugMask
& ISP_DBG_WRITE_REG
)
1883 LOG_DBG("Addr(0x%08X), Val(0x%08X)", (MUINT32
)(ISP_ADDR_CAMINF
+ pReg
[i
].Addr
), (MUINT32
)(pReg
[i
].Val
));
1885 if(((ISP_ADDR_CAMINF
+ pReg
[i
].Addr
) >= ISP_ADDR
) && ((ISP_ADDR_CAMINF
+ pReg
[i
].Addr
) < (ISP_ADDR_CAMINF
+ISP_RANGE
)))
1887 ISP_WR32((void *)(ISP_ADDR_CAMINF
+ pReg
[i
].Addr
), pReg
[i
].Val
);
1891 LOG_ERR("wrong address(0x%x)",(unsigned int)(ISP_ADDR_CAMINF
+ pReg
[i
].Addr
));
1894 spin_unlock(&(g_IspInfo
.SpinLockIsp
));
1899 /*******************************************************************************
1901 ********************************************************************************
1902 static void ISP_BufWrite_Init(void) //Vent@20121106: Marked to remove build warning: 'ISP_BufWrite_Init' defined but not used [-Wunused-function]
1906 if(g_IspInfo.DebugMask & ISP_DBG_BUF_WRITE)
1911 for(i=0; i<ISP_BUF_WRITE_AMOUNT; i++)
1913 g_IspInfo.BufInfo.Write[i].Status = ISP_BUF_STATUS_EMPTY;
1914 g_IspInfo.BufInfo.Write[i].Size = 0;
1915 g_IspInfo.BufInfo.Write[i].pData = NULL;
1919 *******************************************************************************
1921 ********************************************************************************/
1922 static MVOID
ISP_BufWrite_Dump(MVOID
)
1928 for(i
= 0; i
< ISP_BUF_WRITE_AMOUNT
; i
++)
1930 LOG_DBG("i(%d),Status(%d),Size(%d)",i
,g_IspInfo
.BufInfo
.Write
[i
].Status
,g_IspInfo
.BufInfo
.Write
[i
].Size
);
1931 g_IspInfo
.BufInfo
.Write
[i
].Status
= ISP_BUF_STATUS_EMPTY
;
1932 g_IspInfo
.BufInfo
.Write
[i
].Size
= 0;
1933 g_IspInfo
.BufInfo
.Write
[i
].pData
= NULL
;
1937 /*******************************************************************************
1939 ********************************************************************************/
1940 static MVOID
ISP_BufWrite_Free(MVOID
)
1944 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_WRITE
)
1949 for(i
= 0; i
< ISP_BUF_WRITE_AMOUNT
; i
++)
1951 g_IspInfo
.BufInfo
.Write
[i
].Status
= ISP_BUF_STATUS_EMPTY
;
1952 g_IspInfo
.BufInfo
.Write
[i
].Size
= 0;
1954 if(g_IspInfo
.BufInfo
.Write
[i
].pData
!= NULL
)
1956 kfree(g_IspInfo
.BufInfo
.Write
[i
].pData
);
1957 g_IspInfo
.BufInfo
.Write
[i
].pData
= NULL
;
1962 /*******************************************************************************
1964 ********************************************************************************/
1965 static MBOOL
ISP_BufWrite_Alloc(MVOID
)
1969 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_WRITE
)
1974 for(i
= 0; i
< ISP_BUF_WRITE_AMOUNT
; i
++)
1976 g_IspInfo
.BufInfo
.Write
[i
].Status
= ISP_BUF_STATUS_EMPTY
;
1977 g_IspInfo
.BufInfo
.Write
[i
].Size
= 0;
1978 g_IspInfo
.BufInfo
.Write
[i
].pData
= (MUINT8
*)kmalloc(ISP_BUF_SIZE_WRITE
, GFP_ATOMIC
);
1979 if(g_IspInfo
.BufInfo
.Write
[i
].pData
== NULL
)
1981 LOG_DBG("ERROR: i = %d, pData is NULL",i
);
1982 ISP_BufWrite_Free();
1990 /*******************************************************************************
1992 ********************************************************************************/
1993 static MVOID
ISP_BufWrite_Reset(MVOID
)
1997 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_WRITE
)
2002 for(i
= 0; i
< ISP_BUF_WRITE_AMOUNT
; i
++)
2004 g_IspInfo
.BufInfo
.Write
[i
].Status
= ISP_BUF_STATUS_EMPTY
;
2005 g_IspInfo
.BufInfo
.Write
[i
].Size
= 0;
2009 /*******************************************************************************
2011 ********************************************************************************/
2012 static __inline MUINT32
ISP_BufWrite_GetAmount(MVOID
)
2017 for(i
= 0; i
< ISP_BUF_WRITE_AMOUNT
; i
++)
2019 if(g_IspInfo
.BufInfo
.Write
[i
].Status
== ISP_BUF_STATUS_READY
)
2025 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_WRITE
)
2027 LOG_DBG("Count(%d)",Count
);
2033 /*******************************************************************************
2035 ********************************************************************************/
2036 static MBOOL
ISP_BufWrite_Add(MUINT32 Size
,MUINT8
*pData
)
2040 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_WRITE
)
2045 // write to hold buffer
2046 for(i
= 0; i
< ISP_BUF_WRITE_AMOUNT
; i
++)
2048 if(g_IspInfo
.BufInfo
.Write
[i
].Status
== ISP_BUF_STATUS_HOLD
)
2050 if((g_IspInfo
.BufInfo
.Write
[i
].Size
+ Size
) > ISP_BUF_SIZE_WRITE
)
2052 LOG_ERR("i(%d), BufWriteSize(%d) + Size(%d) > %d",i
,g_IspInfo
.BufInfo
.Write
[i
].Size
,Size
,ISP_BUF_SIZE_WRITE
);
2056 if(copy_from_user((MUINT8
*)(g_IspInfo
.BufInfo
.Write
[i
].pData
+g_IspInfo
.BufInfo
.Write
[i
].Size
), (MUINT8
*)pData
, Size
) != 0)
2058 LOG_ERR("copy_from_user failed");
2062 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_WRITE
)
2064 LOG_DBG("i(%d), BufSize(%d), Size(%d)",i
,g_IspInfo
.BufInfo
.Write
[i
].Size
,Size
);
2067 g_IspInfo
.BufInfo
.Write
[i
].Size
+= Size
;
2072 // write to empty buffer
2073 for(i
= 0; i
< ISP_BUF_WRITE_AMOUNT
; i
++)
2075 if(g_IspInfo
.BufInfo
.Write
[i
].Status
== ISP_BUF_STATUS_EMPTY
)
2077 if(Size
> ISP_BUF_SIZE_WRITE
)
2079 LOG_ERR("i(%d), Size(%d) > %d",i
,Size
,ISP_BUF_SIZE_WRITE
);
2083 if(copy_from_user((MUINT8
*)(g_IspInfo
.BufInfo
.Write
[i
].pData
), (MUINT8
*)pData
, Size
) != 0)
2085 LOG_ERR("copy_from_user failed");
2089 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_WRITE
)
2091 LOG_DBG("i = %d, Size = %d",i
,Size
);
2094 g_IspInfo
.BufInfo
.Write
[i
].Size
= Size
;
2095 g_IspInfo
.BufInfo
.Write
[i
].Status
= ISP_BUF_STATUS_HOLD
;
2101 LOG_ERR("All write buffer are full of data!");
2104 /*******************************************************************************
2106 ********************************************************************************/
2107 static MVOID
ISP_BufWrite_SetReady(MVOID
)
2111 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_WRITE
)
2116 for(i
= 0; i
< ISP_BUF_WRITE_AMOUNT
; i
++)
2118 if(g_IspInfo
.BufInfo
.Write
[i
].Status
== ISP_BUF_STATUS_HOLD
)
2120 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_WRITE
)
2122 LOG_DBG("i(%d), Size(%d)",i
,g_IspInfo
.BufInfo
.Write
[i
].Size
);
2124 g_IspInfo
.BufInfo
.Write
[i
].Status
= ISP_BUF_STATUS_READY
;
2129 /*******************************************************************************
2131 ********************************************************************************/
2132 static MBOOL
ISP_BufWrite_Get(
2139 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_WRITE
)
2144 for(i
= 0; i
< ISP_BUF_WRITE_AMOUNT
; i
++)
2146 if(g_IspInfo
.BufInfo
.Write
[i
].Status
== ISP_BUF_STATUS_READY
)
2148 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_WRITE
)
2150 LOG_DBG("i(%d), Size(%d)",i
,g_IspInfo
.BufInfo
.Write
[i
].Size
);
2154 *pSize
= g_IspInfo
.BufInfo
.Write
[i
].Size
;
2155 *ppData
= g_IspInfo
.BufInfo
.Write
[i
].pData
;
2161 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_WRITE
)
2163 LOG_DBG("No buf is ready!");
2168 /*******************************************************************************
2170 ********************************************************************************/
2171 static MBOOL
ISP_BufWrite_Clear(MUINT32 Index
)
2173 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_WRITE
)
2178 if(g_IspInfo
.BufInfo
.Write
[Index
].Status
== ISP_BUF_STATUS_READY
)
2180 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_WRITE
)
2182 LOG_DBG("Index(%d), Size(%d)",Index
,g_IspInfo
.BufInfo
.Write
[Index
].Size
);
2184 g_IspInfo
.BufInfo
.Write
[Index
].Size
= 0;
2185 g_IspInfo
.BufInfo
.Write
[Index
].Status
= ISP_BUF_STATUS_EMPTY
;
2191 LOG_DBG("WARNING: Index(%d) is not ready! Status(%d)",Index
,g_IspInfo
.BufInfo
.Write
[Index
].Status
);
2196 /*******************************************************************************
2198 ********************************************************************************/
2199 static MVOID
ISP_BufWrite_WriteToHw(MVOID
)
2202 MUINT32 Index
, BufSize
;
2206 spin_lock(&(g_IspInfo
.SpinLockHold
));
2208 while(ISP_BufWrite_Get(&Index
,&BufSize
,&pBuf
))
2210 if(g_IspInfo
.DebugMask
& ISP_DBG_TASKLET
)
2212 LOG_DBG("Index(%d), BufSize(%d)", Index
, BufSize
);
2215 ISP_WriteRegToHw((ISP_REG_STRUCT
*)pBuf
, BufSize
/sizeof(ISP_REG_STRUCT
));
2216 ISP_BufWrite_Clear(Index
);
2219 //LOG_DBG("No more buf.");
2220 atomic_set(&(g_IspInfo
.HoldInfo
.WriteEnable
), 0);
2221 wake_up_interruptible(&(g_IspInfo
.WaitQueueHead
));
2223 spin_unlock(&(g_IspInfo
.SpinLockHold
));
2227 /*******************************************************************************
2229 ********************************************************************************/
2230 MVOID
ISP_ScheduleWork_VD(struct work_struct
*data
)
2232 if(g_IspInfo
.DebugMask
& ISP_DBG_SCHEDULE_WORK
)
2237 g_IspInfo
.TimeLog
.WorkQueueVd
= ISP_JiffiesToMs(jiffies
);
2239 if(g_IspInfo
.Callback
[ISP_CALLBACK_WORKQUEUE_VD
].Func
!= NULL
)
2241 g_IspInfo
.Callback
[ISP_CALLBACK_WORKQUEUE_VD
].Func();
2245 /*******************************************************************************
2247 ********************************************************************************/
2248 MVOID
ISP_ScheduleWork_EXPDONE(struct work_struct
*data
)
2250 if(g_IspInfo
.DebugMask
& ISP_DBG_SCHEDULE_WORK
)
2255 g_IspInfo
.TimeLog
.WorkQueueExpdone
= ISP_JiffiesToMs(jiffies
);
2257 if(g_IspInfo
.Callback
[ISP_CALLBACK_WORKQUEUE_EXPDONE
].Func
!= NULL
)
2259 g_IspInfo
.Callback
[ISP_CALLBACK_WORKQUEUE_EXPDONE
].Func();
2263 /*******************************************************************************
2265 ********************************************************************************/
2266 MVOID
ISP_ScheduleWork_SENINF(struct work_struct
*data
)
2268 if(g_IspInfo
.DebugMask
& ISP_DBG_SCHEDULE_WORK
)
2273 g_IspInfo
.TimeLog
.WorkQueueSeninf
= ISP_JiffiesToMs(jiffies
);
2275 if(g_IspInfo
.Callback
[ISP_CALLBACK_WORKQUEUE_SENINF
].Func
!= NULL
)
2277 g_IspInfo
.Callback
[ISP_CALLBACK_WORKQUEUE_SENINF
].Func();
2282 /*******************************************************************************
2284 ********************************************************************************/
2285 MVOID
ISP_Tasklet_VD(unsigned long Param
)
2287 if(g_IspInfo
.DebugMask
& ISP_DBG_TASKLET
)
2292 g_IspInfo
.TimeLog
.TaskletVd
= ISP_JiffiesToMs(jiffies
);
2294 if(g_IspInfo
.Callback
[ISP_CALLBACK_TASKLET_VD
].Func
!= NULL
)
2296 g_IspInfo
.Callback
[ISP_CALLBACK_TASKLET_VD
].Func();
2299 if(g_IspInfo
.HoldInfo
.Time
== ISP_HOLD_TIME_VD
)
2301 ISP_BufWrite_WriteToHw();
2304 DECLARE_TASKLET(IspTaskletVD
, ISP_Tasklet_VD
, 0);
2306 /*******************************************************************************
2308 ********************************************************************************/
2309 void ISP_Tasklet_EXPDONE(unsigned long Param
)
2311 if(g_IspInfo
.DebugMask
& ISP_DBG_TASKLET
)
2316 g_IspInfo
.TimeLog
.TaskletExpdone
= ISP_JiffiesToMs(jiffies
);
2318 if(g_IspInfo
.Callback
[ISP_CALLBACK_TASKLET_EXPDONE
].Func
!= NULL
)
2320 g_IspInfo
.Callback
[ISP_CALLBACK_TASKLET_EXPDONE
].Func();
2323 if(g_IspInfo
.HoldInfo
.Time
== ISP_HOLD_TIME_EXPDONE
)
2325 ISP_BufWrite_WriteToHw();
2328 DECLARE_TASKLET(IspTaskletEXPDONE
, ISP_Tasklet_EXPDONE
, 0);
2330 /*******************************************************************************
2332 ********************************************************************************/
2333 void ISP_Tasklet_SENINF(unsigned long Param
)
2337 if(g_IspInfo
.DebugMask
& ISP_DBG_TASKLET
)
2342 g_IspInfo
.TimeLog
.TaskletSeninf
= ISP_JiffiesToMs(jiffies
);
2344 //SeninfOverrunDump();
2346 LOG_DBG("SENINF_OVERRUN\n");
2347 for(i
= 0; i
< 20; i
++)
2349 LOG_DBG("(0x%08x,0x%08x)\n",g_seninfDebug
[i
].regVal_1
,g_seninfDebug
[i
].regVal_2
);
2352 DECLARE_TASKLET(IspTaskletSENIF
, ISP_Tasklet_SENINF
, 0);
2355 /*******************************************************************************
2357 ********************************************************************************/
2358 static MINT32
ISP_WriteReg(ISP_REG_IO_STRUCT
*pRegIo
)
2362 MINT32 TimeExpdone
= 0;
2363 MINT32 TimeTasklet
= 0;
2364 MUINT8
*pData
= NULL
;
2366 if(g_IspInfo
.DebugMask
& ISP_DBG_WRITE_REG
)
2368 LOG_DBG("Data(0x%08X), Count(%d)", (MUINT32
)(pRegIo
->Data
), (MUINT32
)(pRegIo
->Count
));
2371 if(atomic_read(&(g_IspInfo
.HoldInfo
.HoldEnable
)))
2373 if(ISP_BufWrite_Add((pRegIo
->Count
)*sizeof(ISP_REG_STRUCT
), (MUINT8
*)(pRegIo
->Data
)))
2375 //LOG_DBG("Add write buffer OK");
2379 LOG_ERR("Add write buffer fail");
2381 TimeVd
= ISP_JiffiesToMs(jiffies
)-g_IspInfo
.TimeLog
.Vd
;
2382 TimeExpdone
= ISP_JiffiesToMs(jiffies
)-g_IspInfo
.TimeLog
.Expdone
;
2383 TimeTasklet
= ISP_JiffiesToMs(jiffies
)-g_IspInfo
.TimeLog
.TaskletExpdone
;
2385 LOG_ERR("HoldTime(%d),VD(%d ms),Expdone(%d ms),Tasklet(%d ms)",g_IspInfo
.HoldInfo
.Time
,TimeVd
,TimeExpdone
,TimeTasklet
);
2386 ISP_BufWrite_Dump();
2395 pData
= (MUINT8
*)kmalloc((pRegIo
->Count
)*sizeof(ISP_REG_STRUCT
), GFP_ATOMIC
);
2398 LOG_DBG("ERROR: kmalloc failed, (process, pid, tgid)=(%s, %d, %d)", current
->comm
, current
->pid
, current
->tgid
);
2401 if(copy_from_user(pData
, (MUINT8
*)(pRegIo
->Data
), pRegIo
->Count
*sizeof(ISP_REG_STRUCT
)) != 0)
2403 LOG_ERR("copy_from_user failed");
2408 Ret
= ISP_WriteRegToHw((ISP_REG_STRUCT
*)pData
,pRegIo
->Count
);
2421 /*******************************************************************************
2423 ********************************************************************************/
2424 static MINT32
ISP_SetHoldTime(ISP_HOLD_TIME_ENUM HoldTime
)
2426 LOG_DBG("HoldTime(%d)", HoldTime
);
2427 g_IspInfo
.HoldInfo
.Time
= HoldTime
;
2432 /*******************************************************************************
2434 ********************************************************************************/
2435 static MINT32
ISP_ResetBuf(MVOID
)
2437 LOG_DBG("hold_reg(%d), BufAmount(%d)", atomic_read(&(g_IspInfo
.HoldInfo
.HoldEnable
)), ISP_BufWrite_GetAmount());
2439 ISP_BufWrite_Reset();
2440 atomic_set(&(g_IspInfo
.HoldInfo
.HoldEnable
), 0);
2441 atomic_set(&(g_IspInfo
.HoldInfo
.WriteEnable
), 0);
2447 /*******************************************************************************
2449 ********************************************************************************/
2450 static MINT32
ISP_EnableHoldReg(MBOOL En
)
2453 MUINT32 BufAmount
= 0;
2455 if(g_IspInfo
.DebugMask
& ISP_DBG_HOLD_REG
)
2457 LOG_DBG("En(%d), HoldEnable(%d)", En
, atomic_read(&(g_IspInfo
.HoldInfo
.HoldEnable
)));
2460 if(!spin_trylock_bh(&(g_IspInfo
.SpinLockHold
)))
2462 // Should wait until tasklet done.
2466 if(g_IspInfo
.DebugMask
& ISP_DBG_TASKLET
)
2468 LOG_DBG("Start wait");
2471 Timeout
= wait_event_interruptible_timeout(g_IspInfo
.WaitQueueHead
,
2472 (IsLock
= spin_trylock_bh(&(g_IspInfo
.SpinLockHold
))),
2473 ISP_MsToJiffies(500));
2475 if(g_IspInfo
.DebugMask
& ISP_DBG_TASKLET
)
2477 LOG_DBG("End wait ");
2482 LOG_ERR("Should not happen, Timeout & IsLock is 0");
2488 // Here we get the lock.
2491 ISP_BufWrite_SetReady();
2492 BufAmount
= ISP_BufWrite_GetAmount();
2496 atomic_set(&(g_IspInfo
.HoldInfo
.WriteEnable
), 1);
2500 if(g_IspInfo
.DebugMask
& ISP_DBG_HOLD_REG
)
2502 LOG_DBG("En(%d), HoldEnable(%d), BufAmount(%d)", En
, atomic_read(&(g_IspInfo
.HoldInfo
.HoldEnable
)),BufAmount
);
2505 atomic_set(&(g_IspInfo
.HoldInfo
.HoldEnable
), En
);
2507 spin_unlock_bh(&(g_IspInfo
.SpinLockHold
));
2513 /*******************************************************************************
2515 ********************************************************************************/
2516 static long ISP_REF_CNT_CTRL_FUNC(MUINT32 Param
)
2519 ISP_REF_CNT_CTRL_STRUCT ref_cnt_ctrl
;
2520 MINT32 imem_ref_cnt
= 0;
2523 //spin_lock_irq(&(g_IspInfo.SpinLock));
2525 if(g_IspInfo
.DebugMask
& ISP_DBG_REF_CNT_CTRL
)
2530 if (NULL
== (void*)Param
)
2532 LOG_ERR("NULL Param");
2534 //spin_unlock_irqrestore(&(g_IspInfo.SpinLock), flags);
2539 if(copy_from_user(&ref_cnt_ctrl
, (void*)Param
, sizeof(ISP_REF_CNT_CTRL_STRUCT
)) == 0)
2541 if(g_IspInfo
.DebugMask
& ISP_DBG_REF_CNT_CTRL
)
2543 LOG_DBG("ctrl(%d),id(%d)",ref_cnt_ctrl
.ctrl
,ref_cnt_ctrl
.id
);
2546 if(ISP_REF_CNT_ID_MAX
> ref_cnt_ctrl
.id
)
2549 spin_lock(&(g_IspInfo
.SpinLockIspRef
));
2551 switch(ref_cnt_ctrl
.ctrl
)
2553 case ISP_REF_CNT_GET
:
2555 case ISP_REF_CNT_INC
:
2556 atomic_inc(&g_imem_ref_cnt
[ref_cnt_ctrl
.id
]);
2559 case ISP_REF_CNT_DEC
:
2560 case ISP_REF_CNT_DEC_AND_RESET_IF_LAST_ONE
:
2561 atomic_dec(&g_imem_ref_cnt
[ref_cnt_ctrl
.id
]);
2565 case ISP_REF_CNT_MAX
: // Add this to remove build warning.
2570 imem_ref_cnt
= (MINT32
)atomic_read(&g_imem_ref_cnt
[ref_cnt_ctrl
.id
]);
2571 LOG_DBG("g_imem_ref_cnt[%d]: %d.", ref_cnt_ctrl
.id
, imem_ref_cnt
);
2573 if((imem_ref_cnt
== 0) && (ref_cnt_ctrl
.ctrl
== ISP_REF_CNT_DEC_AND_RESET_IF_LAST_ONE
) ) // No user left and ctrl is RESET_IF_LAST_ONE, do ISP reset.
2576 LOG_DBG("ISP_REF_CNT_DEC_AND_RESET_IF_LAST_ONE. Do ISP_Reset");
2580 spin_unlock(&(g_IspInfo
.SpinLockIspRef
));
2582 if(g_IspInfo
.DebugMask
& ISP_DBG_REF_CNT_CTRL
)
2584 LOG_DBG("ref_cnt(%d)",imem_ref_cnt
);
2587 if(copy_to_user((void*)ref_cnt_ctrl
.data_ptr
, &imem_ref_cnt
, sizeof(MINT32
)) != 0)
2589 LOG_ERR("[GET]:copy_to_user failed");
2595 LOG_ERR("id(%d) exceed",ref_cnt_ctrl
.id
);
2601 LOG_ERR("copy_from_user failed");
2605 if(g_IspInfo
.DebugMask
& ISP_DBG_REF_CNT_CTRL
)
2611 //spin_unlock_irqrestore(&(g_IspInfo.SpinLock), flags);
2613 LOG_DBG("Ret(%d)", Ret
);
2617 /*******************************************************************************
2619 ********************************************************************************/
2620 static MINT32
ISP_RTBC_ENQUE(MINT32 dma
)
2623 MINT32 rt_dma
= dma
;
2624 MUINT32 buffer_exist
= 0;
2628 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_CTRL
)
2630 LOG_DBG("[rtbc][ENQUE]+");
2634 if(ISP_RT_BUF_SIZE
== g_pstRTBuf
->ring_buf
[rt_dma
].total_count
)
2636 LOG_ERR("[rtbc][ENQUE]:real time buffer number FULL:rt_dma(%d)",rt_dma
);
2640 //spin_lock_irqsave(&(g_IspInfo.SpinLockRTBC),g_Flash_SpinLock);
2643 //check if buffer exist
2644 for(i
= 0; i
< ISP_RT_BUF_SIZE
; i
++)
2646 if(g_pstRTBuf
->ring_buf
[rt_dma
].data
[i
].base_pAddr
== g_rt_buf_info
.base_pAddr
)
2652 if(g_pstRTBuf
->ring_buf
[rt_dma
].data
[i
].base_pAddr
== 0)
2661 if(ISP_RTBC_BUF_EMPTY
!= g_pstRTBuf
->ring_buf
[rt_dma
].data
[i
].bFilled
)
2663 g_pstRTBuf
->ring_buf
[rt_dma
].data
[i
].bFilled
= ISP_RTBC_BUF_EMPTY
;
2664 g_pstRTBuf
->ring_buf
[rt_dma
].empty_count
++;
2668 //if(g_IspInfo.DebugMask & ISP_DBG_BUF_CTRL)
2670 LOG_DBG("[rtbc][ENQUE]:buffer_exist(%d),i(%d),PA(0x%x),bFilled(%d),empty(%d)",buffer_exist
,
2672 g_rt_buf_info
.base_pAddr
,
2673 g_pstRTBuf
->ring_buf
[rt_dma
].data
[i
].bFilled
,
2674 g_pstRTBuf
->ring_buf
[rt_dma
].empty_count
);
2680 //overwrite oldest element if buffer is full
2681 if(g_pstRTBuf
->ring_buf
[rt_dma
].total_count
== ISP_RT_BUF_SIZE
)
2683 LOG_ERR("[rtbc][ENQUE]:buffer full(%d)",g_pstRTBuf
->ring_buf
[rt_dma
].total_count
);
2688 index
= g_pstRTBuf
->ring_buf
[rt_dma
].total_count
% ISP_RT_BUF_SIZE
;
2690 g_pstRTBuf
->ring_buf
[rt_dma
].data
[index
].memID
= g_rt_buf_info
.memID
;
2691 g_pstRTBuf
->ring_buf
[rt_dma
].data
[index
].size
= g_rt_buf_info
.size
;
2692 g_pstRTBuf
->ring_buf
[rt_dma
].data
[index
].base_vAddr
= g_rt_buf_info
.base_vAddr
;
2693 g_pstRTBuf
->ring_buf
[rt_dma
].data
[index
].base_pAddr
= g_rt_buf_info
.base_pAddr
;
2694 g_pstRTBuf
->ring_buf
[rt_dma
].data
[index
].bFilled
= ISP_RTBC_BUF_EMPTY
;
2696 g_pstRTBuf
->ring_buf
[rt_dma
].total_count
++;
2697 g_pstRTBuf
->ring_buf
[rt_dma
].empty_count
++;
2699 //if(g_IspInfo.DebugMask & ISP_DBG_BUF_CTRL)
2701 LOG_DBG("[rtbc][ENQUE]:dma(%d),index(%d),PA(0x%x),empty(%d),total(%d)",rt_dma
,
2703 g_pstRTBuf
->ring_buf
[rt_dma
].data
[index
].base_pAddr
,
2704 g_pstRTBuf
->ring_buf
[rt_dma
].empty_count
,
2705 g_pstRTBuf
->ring_buf
[rt_dma
].total_count
);
2710 //count ==1 means DMA stalled already or NOT start yet
2711 if(1 == g_pstRTBuf
->ring_buf
[rt_dma
].empty_count
)
2713 if(_imgo_
== rt_dma
)
2715 //set base_addr at beginning before VF_EN
2716 ISP_WR32((void *)ISP_REG_ADDR_IMGO_BASE_ADDR
,g_pstRTBuf
->ring_buf
[rt_dma
].data
[index
].base_pAddr
);
2720 //set base_addr at beginning before VF_EN
2721 ISP_WR32((void *)ISP_REG_ADDR_IMG2O_BASE_ADDR
,g_pstRTBuf
->ring_buf
[rt_dma
].data
[index
].base_pAddr
);
2724 //if(g_IspInfo.DebugMask & ISP_DBG_BUF_CTRL)
2726 LOG_DBG("[rtbc][ENQUE]:dma(%d),base_pAddr(0x%x),imgo(0x%x),img2o(0x%x),empty_count(%d)",rt_dma
,
2727 g_pstRTBuf
->ring_buf
[rt_dma
].data
[index
].base_pAddr
,
2728 ISP_RD32((void *)ISP_REG_ADDR_IMGO_BASE_ADDR
),
2729 ISP_RD32((void *)ISP_REG_ADDR_IMG2O_BASE_ADDR
),
2730 g_pstRTBuf
->ring_buf
[rt_dma
].empty_count
);
2733 #if defined(_rtbc_use_cq0c_)
2736 MUINT32 reg_val
= 0;
2738 //disable FBC control to go on download
2739 if(_imgo_
== rt_dma
)
2741 reg_val
= ISP_RD32(ISP_REG_ADDR_IMGO_FBC
);
2743 ISP_WR32(ISP_REG_ADDR_IMGO_FBC
,reg_val
);
2747 reg_val
= ISP_RD32(ISP_REG_ADDR_IMG2O_FBC
);
2749 ISP_WR32(ISP_REG_ADDR_IMG2O_FBC
,reg_val
);
2752 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_CTRL
)
2754 LOG_DBG("[rtbc][ENQUE]:dma(%d),disable fbc:IMGO(0x%x),IMG2O(0x%x)",rt_dma
,ISP_RD32(ISP_REG_ADDR_IMGO_FBC
),ISP_RD32(ISP_REG_ADDR_IMG2O_FBC
));
2758 g_pstRTBuf
->ring_buf
[rt_dma
].pre_empty_count
= g_pstRTBuf
->ring_buf
[rt_dma
].empty_count
;
2761 //spin_unlock_irqrestore(&(g_IspInfo.SpinLockRTBC),g_Flash_SpinLock);
2763 if(g_IspInfo
.DebugMask
& ISP_DBG_INT
)
2765 LOG_DBG("[rtbc][ENQUE]:dma:(%d),start(%d),index(%d),empty_count(%d),base_pAddr(0x%x)",rt_dma
,
2766 g_pstRTBuf
->ring_buf
[rt_dma
].start
,
2768 g_pstRTBuf
->ring_buf
[rt_dma
].empty_count
,
2769 g_pstRTBuf
->ring_buf
[rt_dma
].data
[index
].base_pAddr
);
2775 /*******************************************************************************
2777 ********************************************************************************/
2778 static MINT32
ISP_RTBC_DEQUE(MINT32 dma
)
2781 MINT32 rt_dma
= dma
;
2785 //spin_lock_irqsave(&(g_IspInfo.SpinLockRTBC),g_Flash_SpinLock);
2787 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_CTRL
)
2789 LOG_DBG("[rtbc][DEQUE]+");
2791 g_deque_buf
.count
= 0;
2793 //in SOF, "start" is next buffer index
2794 for(i
= 0; i
< g_pstRTBuf
->ring_buf
[rt_dma
].total_count
; i
++ )
2796 index
= ( g_pstRTBuf
->ring_buf
[rt_dma
].start
+ i
) % g_pstRTBuf
->ring_buf
[rt_dma
].total_count
;
2798 if(ISP_RTBC_BUF_FILLED
== g_pstRTBuf
->ring_buf
[rt_dma
].data
[index
].bFilled
)
2800 g_pstRTBuf
->ring_buf
[rt_dma
].data
[index
].bFilled
= ISP_RTBC_BUF_LOCKED
;
2801 g_deque_buf
.count
= 1;
2806 if(0 == g_deque_buf
.count
)
2808 //queue buffer status
2809 LOG_DBG("[rtbc][DEQUE]:dma(%d),start(%d),total(%d),empty(%d), g_deque_buf.count(%d)",rt_dma
,
2810 g_pstRTBuf
->ring_buf
[rt_dma
].start
,
2811 g_pstRTBuf
->ring_buf
[rt_dma
].total_count
,
2812 g_pstRTBuf
->ring_buf
[rt_dma
].empty_count
,
2815 for(i
= 0; i
<= g_pstRTBuf
->ring_buf
[rt_dma
].total_count
- 1; i
++)
2817 LOG_DBG("[rtbc][DEQUE]Buf List:i(%d),memID(%d),size(0x%x),VA(0x%x),PA(0x%x),bFilled(%d)",i
,
2818 g_pstRTBuf
->ring_buf
[rt_dma
].data
[i
].memID
,
2819 g_pstRTBuf
->ring_buf
[rt_dma
].data
[i
].size
,
2820 g_pstRTBuf
->ring_buf
[rt_dma
].data
[i
].base_vAddr
,
2821 g_pstRTBuf
->ring_buf
[rt_dma
].data
[i
].base_pAddr
,
2822 g_pstRTBuf
->ring_buf
[rt_dma
].data
[i
].bFilled
);
2826 if(g_deque_buf
.count
)
2829 //"start" is current working index
2830 if(g_IspInfo
.DebugMask
& ISP_DBG_INT
)
2832 LOG_DBG("[rtbc][DEQUE]:rt_dma(%d),index(%d),empty(%d),total(%d)",rt_dma
,
2834 g_pstRTBuf
->ring_buf
[rt_dma
].empty_count
,
2835 g_pstRTBuf
->ring_buf
[rt_dma
].total_count
);
2838 for(i
= 0; i
< g_deque_buf
.count
; i
++)
2840 g_deque_buf
.data
[i
].memID
= g_pstRTBuf
->ring_buf
[rt_dma
].data
[index
+i
].memID
;
2841 g_deque_buf
.data
[i
].size
= g_pstRTBuf
->ring_buf
[rt_dma
].data
[index
+i
].size
;
2842 g_deque_buf
.data
[i
].base_vAddr
= g_pstRTBuf
->ring_buf
[rt_dma
].data
[index
+i
].base_vAddr
;
2843 g_deque_buf
.data
[i
].base_pAddr
= g_pstRTBuf
->ring_buf
[rt_dma
].data
[index
+i
].base_pAddr
;
2844 g_deque_buf
.data
[i
].timeStampS
= g_pstRTBuf
->ring_buf
[rt_dma
].data
[index
+i
].timeStampS
;
2845 g_deque_buf
.data
[i
].timeStampUs
= g_pstRTBuf
->ring_buf
[rt_dma
].data
[index
+i
].timeStampUs
;
2847 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_CTRL
)
2849 LOG_DBG("[rtbc][DEQUE]:index(%d),PA(0x%x),memID(%d),size(0x%x),VA(0x%x)",index
+ i
,
2850 g_deque_buf
.data
[i
].base_pAddr
,
2851 g_deque_buf
.data
[i
].memID
,
2852 g_deque_buf
.data
[i
].size
,
2853 g_deque_buf
.data
[i
].base_vAddr
);
2858 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_CTRL
)
2860 LOG_DBG("[rtbc][DEQUE]-");
2863 //spin_unlock_irqrestore(&(g_IspInfo.SpinLockRTBC),g_Flash_SpinLock);
2867 //spin_unlock_irqrestore(&(g_IspInfo.SpinLockRTBC),g_Flash_SpinLock);
2868 LOG_ERR("[rtbc][DEQUE]:no filled buffer");
2875 /*******************************************************************************
2877 ********************************************************************************/
2878 static long ISP_Buf_CTRL_FUNC(MUINT32 Param
)
2882 MUINT32 reg_val
= 0;
2883 MUINT32 reg_val2
= 0;
2887 MUINT32 bWaitBufRdy
= 0;
2888 ISP_BUFFER_CTRL_STRUCT rt_buf_ctrl
;
2889 //MUINT32 buffer_exist = 0;
2891 #if defined(_rtbc_use_cq0c_) // fix compile warning
2893 CQ_RTBC_FBC imgo_fbc
;
2894 CQ_RTBC_FBC img2o_fbc
;
2895 volatile MUINT32 curr_pa
= 0;
2898 MINT32 Timeout
= 1000; //ms
2903 if(NULL
== g_pstRTBuf
)
2905 LOG_ERR("[rtbc]NULL g_pstRTBuf");
2909 if(copy_from_user(&rt_buf_ctrl
, (void*)Param
, sizeof(ISP_BUFFER_CTRL_STRUCT
)) == 0)
2911 rt_dma
= rt_buf_ctrl
.buf_id
;
2913 if(g_IspInfo
.DebugMask
& ISP_DBG_INT
)
2915 LOG_DBG("[rtbc]ctrl(0x%x),buf_id(0x%x),data_ptr(0x%x),ex_data_ptr(0x%x)",rt_buf_ctrl
.ctrl
,
2917 rt_buf_ctrl
.data_ptr
,
2918 rt_buf_ctrl
.ex_data_ptr
);
2921 if(_imgo_
!= rt_dma
&& _img2o_
!= rt_dma
)
2923 LOG_ERR("[rtbc]invalid dma channel(%d)",rt_dma
);
2927 #if defined(_rtbc_use_cq0c_)
2929 if((ISP_RT_BUF_CTRL_ENQUE
== rt_buf_ctrl
.ctrl
) || \
2930 (ISP_RT_BUF_CTRL_EXCHANGE_ENQUE
== rt_buf_ctrl
.ctrl
) || \
2931 (ISP_RT_BUF_CTRL_DEQUE
== rt_buf_ctrl
.ctrl
) || \
2932 (ISP_RT_BUF_CTRL_IS_RDY
== rt_buf_ctrl
.ctrl
))
2934 imgo_fbc
.Reg_val
= ISP_RD32((void *)ISP_REG_ADDR_IMGO_FBC
);
2935 img2o_fbc
.Reg_val
= ISP_RD32((void *)ISP_REG_ADDR_IMG2O_FBC
);
2937 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_CTRL
)
2939 LOG_DBG("[rtbc]:ctrl(%d),o(0x%x),2o(0x%x)",rt_buf_ctrl
.ctrl
,ISP_RD32((void *)ISP_REG_ADDR_IMGO_FBC
),ISP_RD32((void *)ISP_REG_ADDR_IMG2O_FBC
));
2944 switch(rt_buf_ctrl
.ctrl
)
2946 case ISP_RT_BUF_CTRL_ENQUE
:
2947 case ISP_RT_BUF_CTRL_EXCHANGE_ENQUE
:
2948 if(copy_from_user(&g_rt_buf_info
, (void*)rt_buf_ctrl
.data_ptr
, sizeof(ISP_RT_BUF_INFO_STRUCT
)) == 0)
2950 reg_val
= ISP_RD32((void *)ISP_REG_ADDR_TG_VF_CON
);
2951 //reg_val2 = ISP_RD32(ISP_REG_ADDR_TG2_VF_CON);
2954 if((reg_val
& 0x01) || (reg_val2
& 0x01))
2956 #if defined(_rtbc_use_cq0c_)
2958 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_CTRL
)
2960 LOG_DBG("[rtbc][ENQUE]:ex_data_ptr(0x%x)",rt_buf_ctrl
.ex_data_ptr
);
2963 if(0 != rt_buf_ctrl
.ex_data_ptr
)
2965 if(copy_from_user(&g_ex_rt_buf_info
, (void*)rt_buf_ctrl
.ex_data_ptr
, sizeof(ISP_RT_BUF_INFO_STRUCT
)) == 0)
2967 for(i
= 0; i
< ISP_RT_BUF_SIZE
; i
++)
2969 if(g_pstRTBuf
->ring_buf
[rt_dma
].data
[i
].base_pAddr
== g_rt_buf_info
.base_pAddr
)
2971 g_oldImgoAddr
= g_rt_buf_info
.base_pAddr
;
2972 LOG_DBG("[rtbc]dma(%d),old(%d),PA(0x%x),VA(0x%x)",rt_dma
,
2974 g_pstRTBuf
->ring_buf
[rt_dma
].data
[i
].base_pAddr
,
2975 g_pstRTBuf
->ring_buf
[rt_dma
].data
[i
].base_vAddr
);
2977 g_newImgoAddr
= g_ex_rt_buf_info
.base_pAddr
;
2978 g_pstRTBuf
->ring_buf
[rt_dma
].data
[i
].memID
= g_ex_rt_buf_info
.memID
;
2979 g_pstRTBuf
->ring_buf
[rt_dma
].data
[i
].size
= g_ex_rt_buf_info
.size
;
2980 g_pstRTBuf
->ring_buf
[rt_dma
].data
[i
].base_pAddr
= g_ex_rt_buf_info
.base_pAddr
;
2981 g_pstRTBuf
->ring_buf
[rt_dma
].data
[i
].base_vAddr
= g_ex_rt_buf_info
.base_vAddr
;
2983 LOG_DBG("[rtbc]dma(%d),new(%d),PA(0x%x),VA(0x%x)",rt_dma
,
2985 g_pstRTBuf
->ring_buf
[rt_dma
].data
[i
].base_pAddr
,
2986 g_pstRTBuf
->ring_buf
[rt_dma
].data
[i
].base_vAddr
);
2988 //set imgo exchange buffer address to HW
2989 if(rt_dma
== _imgo_
)
2991 curr_pa
= ISP_RD32((void *)ISP_REG_ADDR_IMGO_BASE_ADDR
);
2992 LOG_DBG("[rtbc][EXG]o,curr_pa(0x%x),old(0x%x)",curr_pa
,g_rt_buf_info
.base_pAddr
);
2993 LOG_DBG("[rtbc][EXG]o,NUM(0x%x),CNT(0x%x)",imgo_fbc
.Bits
.FB_NUM
,imgo_fbc
.Bits
.FBC_CNT
);
2995 if((curr_pa
== g_rt_buf_info
.base_pAddr
) &&
2996 (imgo_fbc
.Bits
.FB_NUM
!= 0) &&
2997 ((imgo_fbc
.Bits
.FB_NUM
== imgo_fbc
.Bits
.FBC_CNT
) || (imgo_fbc
.Bits
.FBC_CNT
== (imgo_fbc
.Bits
.FB_NUM
-1))))
2999 ISP_WR32((void *)ISP_REG_ADDR_IMGO_BASE_ADDR
,g_pstRTBuf
->ring_buf
[rt_dma
].data
[i
].base_pAddr
);
3001 else // timing issue
3003 g_oldImgoAddr
= g_rt_buf_info
.base_pAddr
;
3004 g_newImgoAddr
= g_pstRTBuf
->ring_buf
[rt_dma
].data
[i
].base_pAddr
;
3005 LOG_DBG("[rtbc][EXG]o,g_old(0x%x),g_new(0x%x)",g_oldImgoAddr
,g_newImgoAddr
);
3008 else if(rt_dma
== _img2o_
)
3010 curr_pa
= ISP_RD32((void *)ISP_REG_ADDR_IMG2O_BASE_ADDR
);
3011 LOG_DBG("[rtbc][EXG]2o,curr_pa(0x%x),old(0x%x)",curr_pa
,g_rt_buf_info
.base_pAddr
);
3012 LOG_DBG("[rtbc][EXG]2o,NUM(0x%x),CNT(0x%x)",img2o_fbc
.Bits
.FB_NUM
,img2o_fbc
.Bits
.FBC_CNT
);
3014 if((curr_pa
== g_rt_buf_info
.base_pAddr
) &&
3015 (img2o_fbc
.Bits
.FB_NUM
!= 0) &&
3016 ((img2o_fbc
.Bits
.FB_NUM
== img2o_fbc
.Bits
.FBC_CNT
) || (img2o_fbc
.Bits
.FBC_CNT
== (img2o_fbc
.Bits
.FB_NUM
-1))))
3018 ISP_WR32((void *)ISP_REG_ADDR_IMG2O_BASE_ADDR
,g_pstRTBuf
->ring_buf
[rt_dma
].data
[i
].base_pAddr
);
3020 else // timing issue
3022 g_oldImg2oAddr
= g_rt_buf_info
.base_pAddr
;
3023 g_newImg2oAddr
= g_pstRTBuf
->ring_buf
[rt_dma
].data
[i
].base_pAddr
;
3024 LOG_DBG("[rtbc][EXG]2o,g_old(0x%x),g_new(0x%x)",g_oldImg2oAddr
,g_newImg2oAddr
);
3037 if(_imgo_
== rt_dma
)
3039 imgo_fbc
.Bits
.RCNT_INC
= 1;
3040 ISP_WR32((void *)ISP_REG_ADDR_IMGO_FBC
,imgo_fbc
.Reg_val
);
3042 else if(_img2o_
== rt_dma
)
3044 img2o_fbc
.Bits
.RCNT_INC
= 1;
3045 ISP_WR32((void *)ISP_REG_ADDR_IMG2O_FBC
,img2o_fbc
.Reg_val
);
3048 //if(g_IspInfo.DebugMask & ISP_DBG_BUF_CTRL)
3050 LOG_DBG("[rtbc][ENQ]:dma(%d),P(0x%x),O(0x%x),2O(0x%x),fps(%d)us",rt_dma
,
3051 g_rt_buf_info
.base_pAddr
,
3052 ISP_RD32((void *)ISP_REG_ADDR_IMGO_BASE_ADDR
),
3053 ISP_RD32((void *)ISP_REG_ADDR_IMG2O_BASE_ADDR
),
3059 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_CTRL
)
3061 LOG_DBG("[rtbc][ENQUE]+:wait enque done.(0x%x)(0x%x)",reg_val
,reg_val2
);
3064 //wait till enq done in SOF
3065 g_rtbc_enq_dma
= rt_dma
;
3068 Timeout
= wait_event_interruptible_timeout(g_IspInfo
.WaitQueueHead
,
3070 ISP_MsToJiffies(Timeout
));
3074 LOG_ERR("[rtbc][ENQUE]:timeout(%d)",g_EnqBuf
);
3078 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_CTRL
)
3080 LOG_DBG("[rtbc][ENQUE]-:enque done");
3086 ISP_RTBC_ENQUE(rt_dma
);
3091 LOG_ERR("[rtbc][ENQUE]:copy_from_user fail");
3095 case ISP_RT_BUF_CTRL_DEQUE
:
3096 reg_val
= ISP_RD32((void *)ISP_REG_ADDR_TG_VF_CON
);
3097 //reg_val2 = ISP_RD32(ISP_REG_ADDR_TG2_VF_CON);
3100 if((reg_val
& 0x01) || (reg_val2
& 0x01))
3103 #if defined(_rtbc_use_cq0c_)
3105 g_deque_buf
.count
= 1;
3107 iBuf
= ( (_imgo_
==rt_dma
)?imgo_fbc
.Bits
.RCNT
:img2o_fbc
.Bits
.RCNT
) - 1; //RCNT = [1,2,3,...]
3109 for(i
= 0; i
< g_deque_buf
.count
; i
++)
3111 g_deque_buf
.data
[i
].memID
= g_pstRTBuf
->ring_buf
[rt_dma
].data
[iBuf
+i
].memID
;
3112 g_deque_buf
.data
[i
].size
= g_pstRTBuf
->ring_buf
[rt_dma
].data
[iBuf
+i
].size
;
3113 g_deque_buf
.data
[i
].base_vAddr
= g_pstRTBuf
->ring_buf
[rt_dma
].data
[iBuf
+i
].base_vAddr
;
3114 g_deque_buf
.data
[i
].base_pAddr
= g_pstRTBuf
->ring_buf
[rt_dma
].data
[iBuf
+i
].base_pAddr
;
3115 g_deque_buf
.data
[i
].timeStampS
= g_pstRTBuf
->ring_buf
[rt_dma
].data
[iBuf
+i
].timeStampS
;
3116 g_deque_buf
.data
[i
].timeStampUs
= g_pstRTBuf
->ring_buf
[rt_dma
].data
[iBuf
+i
].timeStampUs
;
3118 //if(g_IspInfo.DebugMask & ISP_DBG_BUF_CTRL)
3120 LOG_DBG("[rtbc][DEQ]:T\"%d.%06d\",co(0x%08x),c2o(0x%08x),i(%d),iBuf+i(%d),V(0x%x),P(0x%x),O(0x%x),2O(0x%x)", \
3121 g_deque_buf
.data
[i
].timeStampS
,
3122 g_deque_buf
.data
[i
].timeStampUs
,
3127 g_deque_buf
.data
[i
].base_vAddr
,
3128 g_deque_buf
.data
[i
].base_pAddr
,
3129 ISP_RD32((void *)ISP_REG_ADDR_IMGO_BASE_ADDR
),
3130 ISP_RD32((void *)ISP_REG_ADDR_IMG2O_BASE_ADDR
));
3133 //tstamp = g_deque_buf.data[i].timeStampS*1000000+g_deque_buf.data[i].timeStampUs;
3134 //if ( (0 != prv_tstamp) && (prv_tstamp >= tstamp) )
3136 if(0 != g_prv_tstamp_s
)
3138 if((g_prv_tstamp_s
> g_deque_buf
.data
[i
].timeStampS
) ||
3139 ((g_prv_tstamp_s
== g_deque_buf
.data
[i
].timeStampS
) && (g_prv_tstamp_us
>= g_deque_buf
.data
[i
].timeStampUs
)))
3141 LOG_ERR("[rtbc]TS rollback,prv\"%d.%06d\",cur\"%d.%06d\"",g_prv_tstamp_s
,
3143 g_deque_buf
.data
[i
].timeStampS
,
3144 g_deque_buf
.data
[i
].timeStampUs
);
3148 g_prv_tstamp_s
= g_deque_buf
.data
[i
].timeStampS
;
3149 g_prv_tstamp_us
= g_deque_buf
.data
[i
].timeStampUs
;
3154 LOG_DBG("+LARB in DEQUE,BWL(0x%08X)/(0x%08X)/(0x%08X)/(0x%08X),220(0x%08X)/(0x%08X),0x14(0x%08X)/(0x%08X)/(0x%08X)/(0x%08X)/(0x%08X)", \
3155 ISP_RD32(0xF0202000+0x204), \
3156 ISP_RD32(0xF0202000+0x20c), \
3157 ISP_RD32(0xF0202000+0x210), \
3158 ISP_RD32(0xF0202000+0x214), \
3159 ISP_RD32(0xF0202000+0x220), \
3160 ISP_RD32(0xF0202000+0x230), \
3161 ISP_RD32(SMI_LARB0
+0x10), \
3162 ISP_RD32(SMI_LARB1
+0x10), \
3163 ISP_RD32(SMI_LARB2
+0x10), \
3164 ISP_RD32(SMI_LARB3
+0x10), \
3165 ISP_RD32(SMI_LARB4
+0x10));
3170 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_CTRL
)
3172 LOG_DBG("[rtbc][DEQUE]+:wait deque done.(0x%x)(0x%x)",reg_val
,reg_val2
);
3175 //wait till deq done in SOF
3176 g_rtbc_deq_dma
= rt_dma
;
3179 Timeout
= wait_event_interruptible_timeout(g_IspInfo
.WaitQueueHead
,
3181 ISP_MsToJiffies(Timeout
));
3185 LOG_ERR("[rtbc][DEQUE]:timeout(%d)",g_DeqBuf
);
3186 LOG_ERR("ISP_IRQ_TYPE_INT:IrqStatus(0x%08X)",g_IspInfo
.IrqInfo
.Status
[ISP_IRQ_TYPE_INT
]);
3191 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_CTRL
)
3193 LOG_DBG("[rtbc][DEQUE]-:deque done");
3199 ISP_RTBC_DEQUE(rt_dma
);
3202 if(g_deque_buf
.count
)
3204 if(copy_to_user((void*)rt_buf_ctrl
.data_ptr
, &g_deque_buf
, sizeof(ISP_DEQUE_BUF_INFO_STRUCT
)) != 0)
3206 LOG_ERR("[rtbc][DEQUE]:copy_to_user failed");
3212 //spin_unlock_irqrestore(&(g_IspInfo.SpinLockRTBC),g_Flash_SpinLock);
3213 LOG_ERR("[rtbc][DEQUE]:no filled buffer");
3217 case ISP_RT_BUF_CTRL_IS_RDY
:
3218 //spin_lock_irqsave(&(g_IspInfo.SpinLockRTBC),g_Flash_SpinLock);
3222 #if defined(_rtbc_use_cq0c_)
3223 bWaitBufRdy
= ((_imgo_
== rt_dma
) ? (imgo_fbc
.Bits
.FBC_CNT
) : (img2o_fbc
.Bits
.FBC_CNT
)) ? 0 : 1;
3225 for(i
= 0; i
<= g_pstRTBuf
->ring_buf
[rt_dma
].total_count
; i
++)
3227 if(ISP_RTBC_BUF_FILLED
== g_pstRTBuf
->ring_buf
[rt_dma
].data
[i
].bFilled
)
3235 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_CTRL
)
3237 LOG_DBG("[rtbc][IS_RDY]:bWaitBufRdy(%d)",bWaitBufRdy
);
3241 //spin_unlock_irqrestore(&(g_IspInfo.SpinLockRTBC),g_Flash_SpinLock);
3243 if(copy_to_user((void*)rt_buf_ctrl
.data_ptr
, &bWaitBufRdy
, sizeof(MUINT32
)) != 0)
3245 LOG_ERR("[rtbc][IS_RDY]:copy_to_user failed");
3249 //spin_unlock_irqrestore(&(g_IspInfo.SpinLockRTBC), flags);
3251 case ISP_RT_BUF_CTRL_GET_SIZE
:
3252 size
= g_pstRTBuf
->ring_buf
[rt_dma
].total_count
;
3254 if(g_IspInfo
.DebugMask
& ISP_DBG_INT
)
3256 LOG_DBG("[rtbc][GET_SIZE]:rt_dma(%d)/size(%d)",rt_dma
,size
);
3259 if(copy_to_user((void*)rt_buf_ctrl
.data_ptr
, &size
, sizeof(MUINT32
)) != 0)
3261 LOG_ERR("[rtbc][GET_SIZE]:copy_to_user failed");
3265 case ISP_RT_BUF_CTRL_CLEAR
:
3267 //if(g_IspInfo.DebugMask & ISP_DBG_BUF_CTRL)
3269 LOG_DBG("[rtbc][CLEAR]:rt_dma(%d)",rt_dma
);
3273 g_pstRTBuf
->ring_buf
[rt_dma
].total_count
= 0;
3274 g_pstRTBuf
->ring_buf
[rt_dma
].start
= 0;
3275 g_pstRTBuf
->ring_buf
[rt_dma
].empty_count
= 0;
3276 g_pstRTBuf
->ring_buf
[rt_dma
].active
= 0;
3278 for (i
=0;i
<ISP_RT_BUF_SIZE
;i
++) {
3279 if ( g_pstRTBuf
->ring_buf
[rt_dma
].data
[i
].base_pAddr
== g_rt_buf_info
.base_pAddr
) {
3284 if ( g_pstRTBuf
->ring_buf
[rt_dma
].data
[i
].base_pAddr
== 0 ) {
3289 memset((char*)g_pstRTBuf
,0x00,sizeof(ISP_RT_BUF_STRUCT
));
3291 g_prv_tstamp_us
= 0;
3295 g_avg_frame_time
= 0;
3299 g_oldImgoAddr
= DEFAULT_PA
;
3300 g_newImgoAddr
= DEFAULT_PA
;
3301 g_oldImg2oAddr
= DEFAULT_PA
;
3302 g_newImg2oAddr
= DEFAULT_PA
;
3306 case ISP_RT_BUF_CTRL_MAX
: // Add this to remove build warning
3307 break; // Do nothing
3312 LOG_ERR("[rtbc]copy_from_user failed");
3319 /*******************************************************************************
3321 ********************************************************************************/
3322 static MINT32
ISP_SOF_Buf_Get(unsigned long long sec
,unsigned long usec
)
3324 #if defined(_rtbc_use_cq0c_)
3326 CQ_RTBC_FBC imgo_fbc
;
3327 CQ_RTBC_FBC img2o_fbc
;
3328 MUINT32 curr_imgo
= 0; //(imgo_fbc.Bits.WCNT+imgo_fbc.Bits.FB_NUM-1)%imgo_fbc.Bits.FB_NUM; //[0,1,2,...]
3329 MUINT32 curr_img2o
= 0; //(img2o_fbc.Bits.WCNT+img2o_fbc.Bits.FB_NUM-1)%img2o_fbc.Bits.FB_NUM; //[0,1,2,...]
3330 volatile MUINT32 curr_pa
= 0;
3333 //====== Read FBC Register Value ======
3335 imgo_fbc
.Reg_val
= ISP_RD32((void *)ISP_REG_ADDR_IMGO_FBC
);
3336 img2o_fbc
.Reg_val
= ISP_RD32((void *)ISP_REG_ADDR_IMG2O_FBC
);
3338 //====== Check Drop Frame Or Not ======
3340 if(imgo_fbc
.Bits
.FB_NUM
!= imgo_fbc
.Bits
.FBC_CNT
) //No drop
3342 g_pstRTBuf
->dropCnt
= 0;
3346 g_pstRTBuf
->dropCnt
= 1;
3349 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_CTRL
)
3351 LOG_DBG("[rtbc]dropCnt(%d)",g_pstRTBuf
->dropCnt
);
3355 if(0 == g_pstRTBuf
->dropCnt
)
3357 //verify write buffer
3358 curr_pa
= ISP_RD32((void *)ISP_REG_ADDR_IMGO_BASE_ADDR
);
3359 if(g_TempAddr
== curr_pa
)
3361 LOG_DBG("[WARNING]g_TempAddr:Last(0x%08X) == Cur(0x%08X)",g_TempAddr
,curr_pa
);
3365 g_TempAddr
= curr_pa
;
3367 //last update buffer index
3368 curr_imgo
= imgo_fbc
.Bits
.WCNT
- 1; //[0,1,2,...]
3369 //curr_img2o = img2o_fbc.Bits.WCNT - 1; //[0,1,2,...]
3370 curr_img2o
= curr_imgo
;
3374 //verify write buffer,once pass1_done lost, WCNT is untrustful.
3375 if(ISP_RT_CQ0C_BUF_SIZE
< g_pstRTBuf
->ring_buf
[_imgo_
].total_count
)
3377 LOG_ERR("[rtbc]buf cnt(%d)",g_pstRTBuf
->ring_buf
[_imgo_
].total_count
);
3378 g_pstRTBuf
->ring_buf
[_imgo_
].total_count
= ISP_RT_CQ0C_BUF_SIZE
;
3381 if(curr_pa
!= g_pstRTBuf
->ring_buf
[_imgo_
].data
[curr_imgo
].base_pAddr
)
3383 for(i
= 0; i
< g_pstRTBuf
->ring_buf
[_imgo_
].total_count
; i
++)
3385 if(curr_pa
== g_pstRTBuf
->ring_buf
[_imgo_
].data
[i
].base_pAddr
)
3387 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_CTRL
)
3389 LOG_DBG("[rtbc]curr:old/new(%d/%d)",curr_imgo
,i
);
3400 g_pstRTBuf
->ring_buf
[_imgo_
].data
[curr_imgo
].timeStampS
= sec
;
3401 g_pstRTBuf
->ring_buf
[_imgo_
].data
[curr_imgo
].timeStampUs
= usec
;
3402 g_pstRTBuf
->ring_buf
[_img2o_
].data
[curr_img2o
].timeStampS
= sec
;
3403 g_pstRTBuf
->ring_buf
[_img2o_
].data
[curr_img2o
].timeStampUs
= usec
;
3405 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_CTRL
)
3407 LOG_DBG("[rtbc]TStamp(%d.%06d),curr(%d),pa(0x%x/0x%x),o2o(0x%x/0x%x),fbc_o(0x%08x),fbc_2o(0x%08x),cq0c(0x%x)", \
3408 g_pstRTBuf
->ring_buf
[_imgo_
].data
[curr_imgo
].timeStampS
, \
3409 g_pstRTBuf
->ring_buf
[_imgo_
].data
[curr_imgo
].timeStampUs
, \
3411 g_pstRTBuf
->ring_buf
[_imgo_
].data
[curr_imgo
].base_pAddr
, \
3412 g_pstRTBuf
->ring_buf
[_img2o_
].data
[curr_imgo
].base_pAddr
, \
3413 ISP_RD32((void *)ISP_REG_ADDR_IMGO_BASE_ADDR
), \
3414 ISP_RD32((void *)ISP_REG_ADDR_IMG2O_BASE_ADDR
), \
3416 img2o_fbc
.Reg_val
, \
3417 ISP_RD32((void *)ISP_ADDR
+0xBC) );
3421 //frame time profile
3422 if(0 == g_sof_count
)
3424 g_start_time
= sec
*1000000+ usec
; //us
3427 //calc once per senond
3428 if(1000000 < ((sec
*1000000+ usec
)- g_start_time
))
3430 if(0 != g_sof_count
)
3432 g_avg_frame_time
= (sec
*1000000+ usec
)- g_start_time
;
3433 g_avg_frame_time
= (MUINT32
)(g_avg_frame_time
/ g_sof_count
) ;
3446 MUINT32 dma_base_addr
= 0;
3449 if(g_IspInfo
.DebugMask
& ISP_DBG_INT
)
3451 LOG_DBG("[rtbc]E:fbc(0x%x/0x%x)/g_rtbcAAA(%d)",ISP_RD32((void *)ISP_REG_ADDR_IMGO_FBC
),ISP_RD32((void *)ISP_REG_ADDR_IMG2O_FBC
),g_rtbcAAA
++);
3454 //spin_lock_irqsave(&(g_IspInfo.SpinLockRTBC),g_Flash_SpinLock);
3456 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_CTRL
)
3458 LOG_DBG("+:[rtbc]g_rtbcAAA(%d)",g_rtbcAAA
++);
3461 for(i
= 0; i
<= 1; i
++)
3463 i_dma
= (0 == i
) ? _imgo_
: _img2o_
;
3464 dma_base_addr
= (_imgo_
== i_dma
) ? ISP_REG_ADDR_IMGO_BASE_ADDR
: ISP_REG_ADDR_IMG2O_BASE_ADDR
;
3466 //queue buffer status
3467 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_CTRL
)
3469 LOG_DBG("[rtbc][SOF]:dma(%d),start(%d),total(%d),empty(%d) ", \
3471 g_pstRTBuf
->ring_buf
[i_dma
].start
,
3472 g_pstRTBuf
->ring_buf
[i_dma
].total_count
,
3473 g_pstRTBuf
->ring_buf
[i_dma
].empty_count
);
3475 for ( i
=0;i
<=g_pstRTBuf
->ring_buf
[i_dma
].total_count
-1;i
++ )
3477 LOG_DBG("[rtbc][SOF]Buf List:%d/%d/0x%x/0x%x/0x%x/%d/ ", \
3479 g_pstRTBuf
->ring_buf
[i_dma
].data
[i
].memID
, \
3480 g_pstRTBuf
->ring_buf
[i_dma
].data
[i
].size
, \
3481 g_pstRTBuf
->ring_buf
[i_dma
].data
[i
].base_vAddr
, \
3482 g_pstRTBuf
->ring_buf
[i_dma
].data
[i
].base_pAddr
, \
3483 g_pstRTBuf
->ring_buf
[i_dma
].data
[i
].bFilled
);
3487 //ring buffer get next buffer
3488 if( 0 == g_pstRTBuf
->ring_buf
[i_dma
].empty_count
)
3490 //once if buffer put into queue between SOF and ISP_DONE.
3491 g_pstRTBuf
->ring_buf
[i_dma
].active
= MFALSE
;
3493 if(g_IspInfo
.DebugMask
& ISP_DBG_INT
)
3495 LOG_DBG("[rtbc][SOF]:dma(%d)real time buffer number empty,start(%d) ",i_dma
,g_pstRTBuf
->ring_buf
[i_dma
].start
);
3500 if(2 <= g_pstRTBuf
->ring_buf
[i_dma
].empty_count
)
3503 next
= (g_pstRTBuf
->ring_buf
[i_dma
].start
+1)%g_pstRTBuf
->ring_buf
[i_dma
].total_count
;
3504 pAddr
= g_pstRTBuf
->ring_buf
[i_dma
].data
[next
].base_pAddr
;
3506 ISP_WR32(dma_base_addr
, pAddr
);
3508 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_CTRL
)
3510 LOG_DBG("[rtbc][SOF]:dma(%d),start(%d),empty(%d),next(%d),next_PA(0x%x) ", \
3512 g_pstRTBuf
->ring_buf
[i_dma
].start
,
3513 g_pstRTBuf
->ring_buf
[i_dma
].empty_count
,
3520 if(g_IspInfo
.DebugMask
& ISP_DBG_INT
)
3522 LOG_DBG("[rtbc][SOF]:dma(%d)real time buffer number is running out ",i_dma
);
3526 //once if buffer put into queue between SOF and ISP_DONE.
3527 g_pstRTBuf
->ring_buf
[i_dma
].active
= MTRUE
;
3533 ISP_RTBC_ENQUE(g_rtbc_enq_dma
);
3535 wake_up_interruptible(&g_IspInfo
.WaitQueueHead
);
3539 ISP_RTBC_DEQUE(g_rtbc_deq_dma
);
3541 wake_up_interruptible(&g_IspInfo
.WaitQueueHead
);
3544 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_CTRL
) {
3545 LOG_DBG("-:[rtbc]");
3548 g_pstRTBuf
->state
= ISP_RTBC_STATE_SOF
;
3550 //spin_unlock_irqrestore(&(g_IspInfo.SpinLockRTBC),g_Flash_SpinLock);
3556 /*******************************************************************************
3558 ********************************************************************************/
3559 #ifndef _rtbc_use_cq0c_
3560 static MINT32
ISP_DONE_Buf_Time(unsigned long long sec
,unsigned long usec
)
3565 MUINT32 reg_val
= 0;
3567 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_CTRL
)
3569 LOG_DBG("[rtbc]E:fbc(0x%x/0x%x)",ISP_RD32((void *)ISP_REG_ADDR_IMGO_FBC
),ISP_RD32((void *)ISP_REG_ADDR_IMG2O_FBC
));
3573 if ( spin_trylock_bh(&(g_IspInfo
.SpinLockRTBC
)) ) {
3574 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_CTRL
) {
3575 LOG_DBG("[rtbc]:unlock state");
3579 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_CTRL
) {
3580 LOG_DBG("[rtbc]:locked state");
3585 //spin_lock_irqsave(&(g_IspInfo.SpinLockRTBC),g_Flash_SpinLock);
3587 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_CTRL
)
3589 LOG_DBG("+:[rtbc]g_rtbcAAA(%d)",g_rtbcAAA
++);
3592 for(i
= 0; i
<= 1; i
++)
3594 i_dma
= (0 == i
) ? _imgo_
: _img2o_
;
3595 reg_fbc
= (_imgo_
== i_dma
) ? ISP_REG_ADDR_IMGO_FBC
: ISP_REG_ADDR_IMG2O_FBC
;
3597 if(0 == g_pstRTBuf
->ring_buf
[i_dma
].empty_count
)
3599 if(g_IspInfo
.DebugMask
& ISP_DBG_INT
)
3601 LOG_DBG("[rtbc][DONE]:dma(%d)real time buffer number empty,start(%d)",i_dma
,g_pstRTBuf
->ring_buf
[i_dma
].start
);
3607 //once if buffer put into queue between SOF and ISP_DONE.
3608 if(MFALSE
== g_pstRTBuf
->ring_buf
[i_dma
].active
)
3610 if(g_IspInfo
.DebugMask
& ISP_DBG_INT
)
3612 LOG_DBG("[rtbc][DONE] ERROR: missing SOF");
3620 MUINT32 loopCount
= 0;
3621 curr
= g_pstRTBuf
->ring_buf
[i_dma
].start
;
3623 if(g_IspInfo
.DebugMask
& ISP_DBG_INT
)
3625 LOG_DBG("i_dma(%d),curr(%d),bFilled(%d)",i_dma
,
3627 g_pstRTBuf
->ring_buf
[i_dma
].data
[curr
].bFilled
);
3630 if(g_pstRTBuf
->ring_buf
[i_dma
].data
[curr
].bFilled
== ISP_RTBC_BUF_EMPTY
)
3632 g_pstRTBuf
->ring_buf
[i_dma
].data
[curr
].bFilled
= ISP_RTBC_BUF_FILLED
;
3635 g_pstRTBuf
->ring_buf
[i_dma
].start
= (curr
+ 1) % g_pstRTBuf
->ring_buf
[i_dma
].total_count
;
3636 g_pstRTBuf
->ring_buf
[i_dma
].empty_count
--;
3641 if(g_IspInfo
.DebugMask
& ISP_DBG_INT
)
3643 LOG_DBG("i_dma(%d),curr(%d),bFilled(%d) != ISP_RTBC_BUF_EMPTY",i_dma
,
3645 g_pstRTBuf
->ring_buf
[i_dma
].data
[curr
].bFilled
);
3649 g_pstRTBuf
->ring_buf
[i_dma
].start
= (curr
+ 1) % g_pstRTBuf
->ring_buf
[i_dma
].total_count
;
3653 if(loopCount
> g_pstRTBuf
->ring_buf
[i_dma
].total_count
)
3655 LOG_ERR("Can't find empty dma(%d) buf in total_count(%d)",i_dma
,g_pstRTBuf
->ring_buf
[i_dma
].total_count
);
3660 //enable fbc to stall DMA
3661 if(0 == g_pstRTBuf
->ring_buf
[i_dma
].empty_count
)
3665 reg_val
= ISP_RD32((void *)ISP_REG_ADDR_IMGO_FBC
);
3667 //ISP_WR32(ISP_REG_ADDR_IMGO_FBC,reg_val);
3671 reg_val
= ISP_RD32((void *)ISP_REG_ADDR_IMG2O_FBC
);
3673 //ISP_WR32(ISP_REG_ADDR_IMG2O_FBC,reg_val);
3676 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_CTRL
)
3678 LOG_DBG("[rtbc][DONE]:dma(%d),en fbc(0x%x) stalled DMA out",i_dma
,ISP_RD32((void *)reg_fbc
));
3682 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_CTRL
)
3684 LOG_DBG("[rtbc][DONE]:dma(%d),start(%d),empty(%d)",i_dma
,
3685 g_pstRTBuf
->ring_buf
[i_dma
].start
,
3686 g_pstRTBuf
->ring_buf
[i_dma
].empty_count
);
3689 g_pstRTBuf
->ring_buf
[i_dma
].data
[curr
].timeStampS
= sec
;
3690 g_pstRTBuf
->ring_buf
[i_dma
].data
[curr
].timeStampUs
= usec
;
3692 if(g_IspInfo
.DebugMask
& ISP_DBG_INT
)
3694 LOG_DBG("[rtbc][DONE]:dma(%d),curr(%d),sec(%lld),usec(%ld) ", i_dma
, curr
, sec
, usec
);
3698 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_CTRL
)
3700 LOG_DBG("-:[rtbc]");
3703 g_pstRTBuf
->state
= ISP_RTBC_STATE_DONE
;
3705 //spin_unlock_irqrestore(&(g_IspInfo.SpinLockRTBC),g_Flash_SpinLock);
3712 /*******************************************************************************
3714 ********************************************************************************/
3715 static MINT32
ISP_WaitIrq(ISP_WAIT_IRQ_STRUCT WaitIrq
)
3717 MINT32 Ret
= 0, Timeout
= WaitIrq
.Timeout
;
3719 unsigned long flags
;
3720 MUINT32 startTimeS
= 0, startTimeUS
= 0;
3721 MUINT32 endTimeS
= 0, endTimeUS
= 0;
3723 if(g_IspInfo
.DebugMask
& ISP_DBG_INT
)
3725 LOG_DBG("Clear(%d),Type(%d),Status(0x%08X),Timeout(%d)",WaitIrq
.Clear
,
3731 if(WaitIrq
.Clear
== ISP_IRQ_CLEAR_WAIT
)
3733 spin_lock_irqsave(&(g_IspInfo
.SpinLockIrq
), flags
);
3734 if(g_IspInfo
.IrqInfo
.Status
[WaitIrq
.Type
] & WaitIrq
.Status
)
3736 LOG_DBG("WARNING: Clear(%d), Type(%d): IrqStatus(0x%08X) has been cleared",WaitIrq
.Clear
,WaitIrq
.Type
,g_IspInfo
.IrqInfo
.Status
[WaitIrq
.Type
] & WaitIrq
.Status
);
3737 g_IspInfo
.IrqInfo
.Status
[WaitIrq
.Type
] &= (~WaitIrq
.Status
);
3739 spin_unlock_irqrestore(&(g_IspInfo
.SpinLockIrq
), flags
);
3741 else if(WaitIrq
.Clear
== ISP_IRQ_CLEAR_ALL
)
3743 spin_lock_irqsave(&(g_IspInfo
.SpinLockIrq
), flags
);
3744 LOG_DBG("WARNING: Clear(%d), Type(%d): IrqStatus(0x%08X) has been cleared",WaitIrq
.Clear
,WaitIrq
.Type
,g_IspInfo
.IrqInfo
.Status
[WaitIrq
.Type
]);
3745 g_IspInfo
.IrqInfo
.Status
[WaitIrq
.Type
] = 0;
3746 spin_unlock_irqrestore(&(g_IspInfo
.SpinLockIrq
), flags
);
3751 ISP_IRQ_TYPE_ENUM IrqStatus
[ISP_IRQ_TYPE_AMOUNT
];
3755 IrqStatus
[ISP_IRQ_TYPE_INT
] = (ISP_RD32((void *)ISP_REG_ADDR_INT_STATUS
) & (g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_INT
] | g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_INT
]));
3756 IrqStatus
[ISP_IRQ_TYPE_DMA
] = (ISP_RD32((void *)ISP_REG_ADDR_DMA_INT
) & (g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_DMA
] | g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_DMA
]));
3757 IrqStatus
[ISP_IRQ_TYPE_INTB
] = (ISP_RD32((void *)ISP_REG_ADDR_INTB_STATUS
) & (g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_INTB
] | g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_INTB
]));
3758 IrqStatus
[ISP_IRQ_TYPE_DMAB
] = (ISP_RD32((void *)ISP_REG_ADDR_DMAB_INT
) & (g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_DMAB
] | g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_DMAB
]));
3759 IrqStatus
[ISP_IRQ_TYPE_INTC
] = (ISP_RD32((void *)ISP_REG_ADDR_INTC_STATUS
) & (g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_INTC
] | g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_INTC
]));
3760 IrqStatus
[ISP_IRQ_TYPE_DMAC
] = (ISP_RD32((void *)ISP_REG_ADDR_DMAC_INT
) & (g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_DMAC
] | g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_DMAC
]));
3761 IrqStatus
[ISP_IRQ_TYPE_INTX
] = (ISP_RD32((void *)ISP_REG_ADDR_INT_STATUSX
) & (g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_INTX
] | g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_INTX
]));
3762 IrqStatus
[ISP_IRQ_TYPE_DMAX
] = (ISP_RD32((void *)ISP_REG_ADDR_DMA_INTX
) & (g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_DMAX
] | g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_DMAX
]));
3764 for(i
= 0; i
< ISP_IRQ_TYPE_AMOUNT
; i
++)
3766 if(g_IspInfo
.IrqInfo
.ErrMask
[i
] & IrqStatus
[i
])
3768 //LOG_ERR("Error IRQ, Type(%d), Status(0x%08X)",i,g_IspInfo.IrqInfo.ErrMask[i] & IrqStatus[i]);
3769 //TODO: Add error handler...
3772 if(g_IspInfo
.DebugMask
& ISP_DBG_INT
)
3774 LOG_DBG("Type(%d), IrqStatus(0x%08X | 0x%08X)",i
,g_IspInfo
.IrqInfo
.Status
[i
], IrqStatus
[i
]);
3775 //LOG_DBG("Mask(0x%08X), ErrMask(0x%08X)",g_IspInfo.IrqInfo.Mask[i], g_IspInfo.IrqInfo.ErrMask[i]);
3777 g_IspInfo
.IrqInfo
.Status
[i
] |= (IrqStatus
[i
] & g_IspInfo
.IrqInfo
.Mask
[i
]);
3780 if((g_IspInfo
.IrqInfo
.Status
[WaitIrq
.Type
] & WaitIrq
.Status
) == WaitIrq
.Status
|| Timeout
== 0)
3791 ISP_GetTime(&startTimeS
, &startTimeUS
);
3793 Timeout
= wait_event_interruptible_timeout(g_IspInfo
.WaitQueueHead
,
3794 ISP_GetIRQState(WaitIrq
.Type
, WaitIrq
.Status
),
3795 ISP_MsToJiffies(WaitIrq
.Timeout
));
3800 ISP_GetTime(&endTimeS
, &endTimeUS
);
3802 LOG_ERR("start(%u.%06u),end(%u.%06u)",startTimeS
,startTimeUS
,endTimeS
,endTimeUS
);
3803 LOG_ERR("Clear(%d),Type(%d),IrqStatus(0x%08X),WaitStatus(0x%08X),Timeout(%d)",WaitIrq
.Clear
,
3805 g_IspInfo
.IrqInfo
.Status
[WaitIrq
.Type
],
3809 if(WaitIrq
.Type
== ISP_IRQ_TYPE_INT
&& WaitIrq
.Status
== ISP_IRQ_INT_STATUS_AF_DON_ST
)
3822 spin_lock_irqsave(&(g_IspInfo
.SpinLockIrq
), flags
);
3824 if(g_IspInfo
.DebugMask
& ISP_DBG_INT
)
3826 for(i
= 0; i
< ISP_IRQ_TYPE_AMOUNT
; i
++)
3828 LOG_DBG("Type(%d), IrqStatus(0x%08X)",i
,g_IspInfo
.IrqInfo
.Status
[i
]);
3832 g_IspInfo
.IrqInfo
.Status
[WaitIrq
.Type
] &= (~WaitIrq
.Status
);
3834 spin_unlock_irqrestore(&(g_IspInfo
.SpinLockIrq
), flags
);
3836 //check CQ status, when pass2, pass2b, pass2c done
3837 if( WaitIrq
.Status
== ISP_IRQ_INT_STATUS_PASS2_DON_ST
||
3838 WaitIrq
.Status
== ISP_IRQ_INTB_STATUS_PASS2_DON_ST
||
3839 WaitIrq
.Status
== ISP_IRQ_INTC_STATUS_PASS2_DON_ST
)
3842 if(ISP_RD32((void *)(CAMINF_BASE
+ 0x4160))!=ISP_REG_ADDR_CTL_DBG_SET_CQ_STS
)
3844 LOG_WRN("0x4160 != 0x6000 !!!(0x%8x)",ISP_RD32((void *)(CAMINF_BASE
+ 0x4160)));
3845 ISP_WR32((void *)(CAMINF_BASE
+ 0x4160), 0x6000) ;
3848 CQ_status
= ISP_RD32((void *)(CAMINF_BASE
+ 0x4164));
3850 switch(WaitIrq
.Type
)
3852 case ISP_IRQ_TYPE_INT
:
3853 if((CQ_status
& 0x0000000F) != 0x001)
3855 LOG_ERR("CQ1 not idle dbg(0x%08x 0x%08x)",ISP_RD32((void *)(CAMINF_BASE
+ 0x4160)), CQ_status
);
3858 case ISP_IRQ_TYPE_INTB
:
3859 if((CQ_status
& 0x000000F0) != 0x010)
3861 LOG_ERR("CQ2 not idle dbg(0x%08x 0x%08x)",ISP_RD32((void *)(CAMINF_BASE
+ 0x4160)), CQ_status
);
3864 case ISP_IRQ_TYPE_INTC
:
3865 if((CQ_status
& 0x00000F00) != 0x100)
3867 LOG_ERR("CQ3 not idle dbg(0x%08x 0x%08x)",ISP_RD32((void *)(CAMINF_BASE
+ 0x4160)), CQ_status
);
3879 #define _debug_dma_err_
3880 #if defined(_debug_dma_err_)
3882 #define bit(x) (0x1<<(x))
3884 MUINT32 DMA_ERR
[3*12] = {
3885 bit(1) , 0xF50043A8, 0x00000011, //IMGI
3886 bit(2) , 0xF50043AC, 0x00000021, //IMGCI
3887 bit(4) , 0xF50043B0, 0x00000031, //LSCI
3888 bit(5) , 0xF50043B4, 0x00000051, //FLKI
3889 bit(6) , 0xF50043B8, 0x00000061, //LCEI
3890 bit(7) , 0xF50043BC, 0x00000071, //VIPI
3891 bit(8) , 0xF50043C0, 0x00000081, //VIP2I
3892 bit(9) , 0xF50043C4, 0x00000194, //IMGO
3893 bit(10), 0xF50043C8, 0x000001a4, //IMG2O
3894 bit(11), 0xF50043CC, 0x000001b4, //LCSO
3895 bit(12), 0xF50043D0, 0x000001c4, //ESFKO
3896 bit(13), 0xF50043D4, 0x000001d4, //AAO
3899 static void DMAErrHandler(void)
3902 MUINT32 err_ctrl
= ISP_RD32(0xF50043A4);
3903 MUINT32
*pErr
= DMA_ERR
;
3905 LOG_DBG("err_ctrl(0x%08x)", err_ctrl
);
3907 for(i
= 0; i
< 12; i
++)
3911 if(err_ctrl
& (*pErr
))
3913 ISP_WR32(0xF5004160, pErr
[2]);
3915 LOG_DBG("(0x%08x,0x%08x),dbg(0x%08x, 0x%08x)",addr
, ISP_RD32(addr
),ISP_RD32(0xF5004160), ISP_RD32(0xF5004164));
3919 MUINT32 status
= ISP_RD32( addr
);
3921 if( status
& 0x0000FFFF )
3923 ISP_WR32(0xF5004160, pErr
[2]);
3926 LOG_DBG("(0x%08x, 0x%08x), dbg(0x%08x, 0x%08x)",
3928 ISP_RD32(0xF5004160), ISP_RD32(0xF5004164));
3936 /*******************************************************************************
3938 ********************************************************************************/
3939 static __tcmfunc irqreturn_t
ISP_Irq(MINT32 Irq
, MVOID
*DeviceId
)
3943 MUINT32 IrqStatus
[ISP_IRQ_TYPE_AMOUNT
];
3944 MUINT32 IrqStatus_fbc_int
;
3945 volatile MUINT32 tg_pa
= 0;
3946 volatile MUINT32 sof_pa
= 0;
3947 MUINT32 senifIntStA
= 0, regVal
= 0;
3948 CQ_RTBC_FBC imgo_fbc
;
3949 CQ_RTBC_FBC img2o_fbc
;
3952 IrqStatus
[ISP_IRQ_TYPE_INT
] = (ISP_RD32((void *)ISP_REG_ADDR_INT_STATUS
) & (g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_INT
] | g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_INT
]));
3953 IrqStatus
[ISP_IRQ_TYPE_DMA
] = (ISP_RD32((void *)ISP_REG_ADDR_DMA_INT
) & (g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_DMA
] | g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_DMA
]));
3954 IrqStatus
[ISP_IRQ_TYPE_INTB
] = (ISP_RD32((void *)ISP_REG_ADDR_INTB_STATUS
) & (g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_INTB
] | g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_INTB
]));
3955 IrqStatus
[ISP_IRQ_TYPE_DMAB
] = (ISP_RD32((void *)ISP_REG_ADDR_DMAB_INT
) & (g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_DMAB
] | g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_DMAB
]));
3956 IrqStatus
[ISP_IRQ_TYPE_INTC
] = (ISP_RD32((void *)ISP_REG_ADDR_INTC_STATUS
) & (g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_INTC
] | g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_INTC
]));
3957 IrqStatus
[ISP_IRQ_TYPE_DMAC
] = (ISP_RD32((void *)ISP_REG_ADDR_DMAC_INT
) & (g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_DMAC
] | g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_DMAC
]));
3959 //below may need to read elsewhere
3960 IrqStatus
[ISP_IRQ_TYPE_INTX
] = (ISP_RD32((void *)ISP_REG_ADDR_INT_STATUSX
) & (g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_INTX
] | g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_INTX
]));
3961 IrqStatus
[ISP_IRQ_TYPE_DMAX
] = (ISP_RD32((void *)ISP_REG_ADDR_DMA_INTX
) & (g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_DMAX
] | g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_DMAX
]));
3962 IrqStatus_fbc_int
= ISP_RD32((void *)(ISP_ADDR
+ 0xFC));
3964 spin_lock(&(g_IspInfo
.SpinLockIrq
));
3966 for(i
= 0; i
< ISP_IRQ_TYPE_AMOUNT
; i
++)
3968 if(g_IspInfo
.IrqInfo
.ErrMask
[i
] & IrqStatus
[i
])
3970 // ISP_IRQ_INTX_STATUS_IMGO_ERR_ST: on-the-fly imgo error, not really overrun
3971 if(i
!= ISP_IRQ_TYPE_INTX
|| ( g_IspInfo
.IrqInfo
.ErrMask
[i
] & IrqStatus
[i
] & (~ISP_IRQ_INTX_STATUS_IMGO_ERR_ST
)))
3973 if(i
!= ISP_IRQ_TYPE_INTX
) //to reduce isp log
3975 LOG_DBG("Error IRQ, Type(%d), Status(0x%08X)",i
,g_IspInfo
.IrqInfo
.ErrMask
[i
] & IrqStatus
[i
]);
3977 //TODO: Add error handler...
3981 if(g_IspInfo
.DebugMask
& ISP_DBG_INT
)
3983 LOG_DBG("Type(%d), IrqStatus(0x%08X | 0x%08X)",i
,g_IspInfo
.IrqInfo
.Status
[i
], IrqStatus
[i
]);
3985 g_IspInfo
.IrqInfo
.Status
[i
] |= (IrqStatus
[i
] & g_IspInfo
.IrqInfo
.Mask
[i
]);
3989 #if defined(OVERRUN_AEE_WARNING)
3991 if(IrqStatus
[ISP_IRQ_TYPE_INT
] & ISP_IRQ_INT_STATUS_TG1_ERR_ST
)
3993 senifIntStA
= ISP_RD32((void *)(ISP_ADDR
+ 0x4018));
3994 if(senifIntStA
& 0x01)
3996 regVal
= ISP_RD32((void *)(ISP_ADDR
+ 0x414));
3999 LOG_DBG("sensor overrun,4024(0x%08x),8018(0x%08x)",IrqStatus
[ISP_IRQ_TYPE_INT
],senifIntStA
);
4001 LOG_DBG("8014(0x%08x),8018(0x%08x)",ISP_RD32((void *)(ISP_ADDR
+ 0x4014)),ISP_RD32((void *)(ISP_ADDR
+ 0x4018)));
4002 LOG_DBG("4004(0x%08x),4008(0x%08x)",ISP_RD32((void *)(ISP_ADDR
+ 0x4)),ISP_RD32((void *)(ISP_ADDR
+ 0x8)));
4003 LOG_DBG("400C(0x%08x),4414(0x%08x)",ISP_RD32((void *)(ISP_ADDR
+ 0xC)),ISP_RD32((void *)(ISP_ADDR
+ 0x414)));
4004 LOG_DBG("4020(0x%08x),4024(0x%08x)",ISP_RD32((void *)(ISP_ADDR
+ 0x20)),ISP_RD32((void *)(ISP_ADDR
+ 0x24))); // 0x4024 is read clear
4007 SeninfOverrunDump();
4009 schedule_work(&g_IspInfo
.ScheduleWorkSENINF
);
4010 tasklet_schedule(&IspTaskletSENIF
);
4012 aee_kernel_warning_api(__FILE__
, __LINE__
, DB_OPT_DEFAULT
, "CAMERA", "SENIF FIFO overrun/underrun");
4018 //[MT]ToDo: Need to Check
4019 /*if ( IrqStatus[ISP_IRQ_TYPE_INTX]&ISP_IRQ_INTX_STATUS_DMA_ERR_ST ) {
4021 #if defined(_debug_dma_err_)
4022 LOG_ERR("[rtbc]StatusX(0x%08X), DMA_ERR",IrqStatus[ISP_IRQ_TYPE_INTX]); //IMGO may overrun before setting smi regs
4027 LOG_DBG("ERR (8018 0x%08x)(8024 0x%08x)(802C 0x%08x)(4440 0x%08x) (810C 0x%08x)",
4028 ISP_RD32(0xF5008018),
4029 ISP_RD32(0xF5008024),
4030 ISP_RD32(0xF500802C),
4031 ISP_RD32(0xF5004440),
4032 ISP_RD32(0xF500810C));
4037 //if ( IrqStatus[ISP_IRQ_TYPE_INT]&ISP_IRQ_INT_STATUS_TG1_ERR_ST ||
4038 // IrqStatus[ISP_IRQ_TYPE_INT]&ISP_IRQ_INT_STATUS_TG2_ERR_ST ) {
4039 // LOG_ERR("[rtbc]Status(0x%08X), TG_ERR",IrqStatus[ISP_IRQ_TYPE_INT]);
4042 //if (IrqStatus_fbc_int) {
4043 // LOG_ERR("[rtbc]dropframe st(0x%08X),co(0x%08X),c2o(0x%08X)",IrqStatus_fbc_int,ISP_RD32(ISP_REG_ADDR_IMGO_FBC),ISP_RD32(ISP_REG_ADDR_IMG2O_FBC));
4046 spin_unlock(&(g_IspInfo
.SpinLockIrq
));
4048 //service pass1_done first once if SOF/PASS1_DONE are coming together.
4050 //push hw filled buffer to sw list
4051 if(IrqStatus
[ISP_IRQ_TYPE_INT
] & ISP_IRQ_INT_STATUS_PASS1_TG1_DON_ST
)
4053 #if defined(_rtbc_use_cq0c_)
4055 if(g_IspInfo
.DebugMask
& ISP_DBG_BUF_CTRL
)
4057 LOG_DBG("[rtbc]:PASS1_TG1_DON");
4060 //set imgo exchange buffer address to HW
4061 imgo_fbc
.Reg_val
= ISP_RD32((void *)ISP_REG_ADDR_IMGO_FBC
);
4062 tg_pa
= ISP_RD32((void *)ISP_REG_ADDR_IMGO_BASE_ADDR
);
4064 if( g_newImgoAddr
!= DEFAULT_PA
&&
4065 (tg_pa
== g_oldImgoAddr
) &&
4066 (imgo_fbc
.Bits
.FB_NUM
!= 0) &&
4067 ((imgo_fbc
.Bits
.FB_NUM
== imgo_fbc
.Bits
.FBC_CNT
) || (imgo_fbc
.Bits
.FBC_CNT
== (imgo_fbc
.Bits
.FB_NUM
-1))))
4069 LOG_DBG("[rtbc][TG1_DON]o,tg_pa(0x%x),old(0x%x)",tg_pa
,g_oldImgoAddr
);
4070 LOG_DBG("[rtbc][TG1_DON]o,NUM(0x%x),CNT(0x%x)",imgo_fbc
.Bits
.FB_NUM
,imgo_fbc
.Bits
.FBC_CNT
);
4071 LOG_DBG("[rtbc][TG1_DON]o,new(0x%x)",g_newImgoAddr
);
4072 ISP_WR32((void *)ISP_REG_ADDR_IMGO_BASE_ADDR
,g_newImgoAddr
);
4073 g_oldImgoAddr
= DEFAULT_PA
;
4074 g_newImgoAddr
= DEFAULT_PA
;
4077 img2o_fbc
.Reg_val
= ISP_RD32((void *)ISP_REG_ADDR_IMG2O_FBC
);
4078 tg_pa
= ISP_RD32((void *)ISP_REG_ADDR_IMG2O_BASE_ADDR
);
4080 if(g_newImg2oAddr
!= DEFAULT_PA
&&
4081 (tg_pa
== g_oldImg2oAddr
) &&
4082 (img2o_fbc
.Bits
.FB_NUM
!= 0) &&
4083 ((img2o_fbc
.Bits
.FB_NUM
== img2o_fbc
.Bits
.FBC_CNT
) || (img2o_fbc
.Bits
.FBC_CNT
== (img2o_fbc
.Bits
.FB_NUM
-1))))
4085 LOG_DBG("[rtbc][TG1_DON]2o,tg_pa(0x%x),old(0x%x)",tg_pa
,g_oldImg2oAddr
);
4086 LOG_DBG("[rtbc][TG1_DON]2o,NUM(0x%x),CNT(0x%x)",img2o_fbc
.Bits
.FB_NUM
,img2o_fbc
.Bits
.FBC_CNT
);
4087 LOG_DBG("[rtbc][TG1_DON]2o,new(0x%x)",g_newImg2oAddr
);
4088 ISP_WR32((void *)ISP_REG_ADDR_IMG2O_BASE_ADDR
,g_newImg2oAddr
);
4089 g_oldImg2oAddr
= DEFAULT_PA
;
4090 g_newImg2oAddr
= DEFAULT_PA
;
4093 //LOG_DBG("[k_js_test]Pass1_done(0x%x)",IrqStatus[ISP_IRQ_TYPE_INT]);
4094 unsigned long long sec
;
4097 sec
= cpu_clock(0); //ns
4098 do_div( sec
, 1000 ); //usec
4099 usec
= do_div( sec
, 1000000); //sec and usec
4101 ISP_DONE_Buf_Time(sec
,usec
);
4102 /*Check Timesamp reverse*/
4106 g_sof_pass1done
= 0;
4109 //switch pass1 WDMA buffer
4110 //fill time stamp for cq0c
4111 if(IrqStatus
[ISP_IRQ_TYPE_INT
] & ISP_IRQ_INT_STATUS_SOF1_INT_ST
)
4113 unsigned long long sec
;
4117 time
= ktime_get(); //ns
4120 sec
= cpu_clock(0); //ns
4123 //set imgo exchange buffer address to HW
4124 imgo_fbc
.Reg_val
= ISP_RD32((void *)ISP_REG_ADDR_IMGO_FBC
);
4125 sof_pa
= ISP_RD32((void *)ISP_REG_ADDR_IMGO_BASE_ADDR
);
4127 if((sof_pa
!= 0) && (sof_pa
== g_oldImgoAddr
) && g_newImgoAddr
!= DEFAULT_PA
&&
4128 (imgo_fbc
.Bits
.FB_NUM
!= 0) &&
4129 ((imgo_fbc
.Bits
.FB_NUM
== imgo_fbc
.Bits
.FBC_CNT
) || (imgo_fbc
.Bits
.FBC_CNT
== (imgo_fbc
.Bits
.FB_NUM
-1))))
4131 LOG_DBG("[rtbc][SOF]o,sof_pa(0x%x),old(0x%x)",sof_pa
,g_oldImgoAddr
);
4132 LOG_DBG("[rtbc][SOF]o,NUM(0x%x),CNT(0x%x)",imgo_fbc
.Bits
.FB_NUM
,imgo_fbc
.Bits
.FBC_CNT
);
4133 LOG_DBG("[rtbc][SOF]o,new(0x%x)",g_newImgoAddr
);
4135 ISP_WR32((void *)ISP_REG_ADDR_IMGO_BASE_ADDR
,g_newImgoAddr
);
4136 g_oldImgoAddr
= DEFAULT_PA
;
4137 g_newImgoAddr
= DEFAULT_PA
;
4140 img2o_fbc
.Reg_val
= ISP_RD32((void *)ISP_REG_ADDR_IMG2O_FBC
);
4141 sof_pa
= ISP_RD32((void *)ISP_REG_ADDR_IMG2O_BASE_ADDR
);
4143 if((sof_pa
!= 0) && (sof_pa
== g_oldImg2oAddr
) && g_newImg2oAddr
!= DEFAULT_PA
&&
4144 (img2o_fbc
.Bits
.FB_NUM
!= 0) &&
4145 ((img2o_fbc
.Bits
.FB_NUM
== img2o_fbc
.Bits
.FBC_CNT
) || (img2o_fbc
.Bits
.FBC_CNT
== (img2o_fbc
.Bits
.FB_NUM
-1))))
4147 LOG_DBG("[rtbc][SOF]2o,sof_pa(0x%x),old(0x%x)",sof_pa
,g_oldImg2oAddr
);
4148 LOG_DBG("[rtbc][SOF]2o,NUM(0x%x),CNT(0x%x)",img2o_fbc
.Bits
.FB_NUM
,img2o_fbc
.Bits
.FBC_CNT
);
4149 LOG_DBG("[rtbc][SOF]2o,new(0x%x)",sof_pa
,g_newImg2oAddr
);
4151 ISP_WR32((void *)ISP_REG_ADDR_IMG2O_BASE_ADDR
,g_newImg2oAddr
);
4152 g_oldImg2oAddr
= DEFAULT_PA
;
4153 g_newImg2oAddr
= DEFAULT_PA
;
4156 do_div( sec
, 1000 ); //usec
4157 usec
= do_div( sec
, 1000000); //sec and usec
4159 ISP_SOF_Buf_Get(sec
,usec
);
4161 if( g_sof_pass1done
== 1 )
4163 LOG_DBG("Lost pass1 done");
4165 g_sof_pass1done
= 1;
4168 wake_up_interruptible(&g_IspInfo
.WaitQueueHead
);
4170 //Work queue. It is interruptible, so there can be "Sleep" in work queue function.
4171 if(IrqStatus
[ISP_IRQ_TYPE_INT
] & (ISP_IRQ_INT_STATUS_VS1_ST
))//|ISP_IRQ_INT_STATUS_VS2_ST))
4173 g_IspInfo
.TimeLog
.Vd
= ISP_JiffiesToMs(jiffies
);
4174 schedule_work(&g_IspInfo
.ScheduleWorkVD
);
4175 tasklet_schedule(&IspTaskletVD
);
4178 //Tasklet. It is uninterrupted, so there can NOT be "Sleep" in tasklet function.
4179 if(IrqStatus
[ISP_IRQ_TYPE_INT
] & (ISP_IRQ_INT_STATUS_EXPDON1_ST
))//|ISP_IRQ_INT_STATUS_EXPDON2_ST))
4181 g_IspInfo
.TimeLog
.Expdone
= ISP_JiffiesToMs(jiffies
);
4182 schedule_work(&g_IspInfo
.ScheduleWorkEXPDONE
);
4183 tasklet_schedule(&IspTaskletEXPDONE
);
4191 /*******************************************************************************
4193 ********************************************************************************/
4194 static long ISP_ioctl(struct file
*pFile
,MUINT32 Cmd
,unsigned long Param
)
4197 MBOOL HoldEnable
= MFALSE
;
4198 unsigned long flags
;
4199 MUINT32 DebugFlag
= 0,pid
= 0;
4200 ISP_REG_IO_STRUCT RegIo
;
4201 ISP_HOLD_TIME_ENUM HoldTime
;
4202 ISP_WAIT_IRQ_STRUCT WaitIrq
;
4203 ISP_READ_IRQ_STRUCT ReadIrq
;
4204 ISP_CLEAR_IRQ_STRUCT ClearIrq
;
4205 ISP_USER_INFO_STRUCT
* pUserInfo
;
4207 if(pFile
->private_data
== NULL
)
4209 LOG_WRN("private_data is NULL,(process, pid, tgid)=(%s, %d, %d)",current
->comm
,current
->pid
,current
->tgid
);
4213 pUserInfo
= (ISP_USER_INFO_STRUCT
*)(pFile
->private_data
);
4219 spin_lock(&(g_IspInfo
.SpinLockIsp
));
4221 spin_unlock(&(g_IspInfo
.SpinLockIsp
));
4226 spin_lock_bh(&(g_IspInfo
.SpinLockHold
));
4228 spin_unlock_bh(&(g_IspInfo
.SpinLockHold
));
4231 case ISP_READ_REGISTER
:
4233 if(copy_from_user(&RegIo
, (void*)Param
, sizeof(ISP_REG_IO_STRUCT
)) == 0)
4235 Ret
= ISP_ReadReg(&RegIo
);
4239 LOG_ERR("copy_from_user failed");
4244 case ISP_WRITE_REGISTER
:
4246 if(copy_from_user(&RegIo
, (void*)Param
, sizeof(ISP_REG_IO_STRUCT
)) == 0)
4248 Ret
= ISP_WriteReg(&RegIo
);
4252 LOG_ERR("copy_from_user failed");
4257 case ISP_HOLD_REG_TIME
:
4259 if(copy_from_user(&HoldTime
, (void*)Param
, sizeof(ISP_HOLD_TIME_ENUM
)) == 0)
4261 spin_lock(&(g_IspInfo
.SpinLockIsp
));
4262 Ret
= ISP_SetHoldTime(HoldTime
);
4263 spin_unlock(&(g_IspInfo
.SpinLockIsp
));
4267 LOG_ERR("copy_from_user failed");
4274 if(copy_from_user(&HoldEnable
, (void*)Param
, sizeof(MBOOL
)) == 0)
4276 Ret
= ISP_EnableHoldReg(HoldEnable
);
4280 LOG_ERR("copy_from_user failed");
4287 if(copy_from_user(&WaitIrq
, (void*)Param
, sizeof(ISP_WAIT_IRQ_STRUCT
)) == 0)
4289 if((WaitIrq
.Type
>= ISP_IRQ_TYPE_AMOUNT
) ||(WaitIrq
.Type
<0))
4292 LOG_ERR("invalid type(%d)",WaitIrq
.Type
);
4295 Ret
= ISP_WaitIrq(WaitIrq
);
4299 LOG_ERR("copy_from_user failed");
4306 if(copy_from_user(&ReadIrq
, (void*)Param
, sizeof(ISP_READ_IRQ_STRUCT
)) == 0)
4308 LOG_DBG("ISP_READ_IRQ Type(%d)",ReadIrq
.Type
);
4310 if((ReadIrq
.Type
>= ISP_IRQ_TYPE_AMOUNT
) ||(ReadIrq
.Type
<0))
4313 LOG_ERR("invalid type(%d)",ReadIrq
.Type
);
4319 spin_lock_irqsave(&(g_IspInfo
.SpinLockIrq
), flags
);
4321 ISP_IRQ_TYPE_ENUM IrqStatus
[ISP_IRQ_TYPE_AMOUNT
];
4323 IrqStatus
[ISP_IRQ_TYPE_INT
] = (ISP_RD32((void *)ISP_REG_ADDR_INT_STATUS
) & (g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_INT
] | g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_INT
]));
4324 IrqStatus
[ISP_IRQ_TYPE_DMA
] = (ISP_RD32((void *)ISP_REG_ADDR_DMA_INT
) & (g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_DMA
] | g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_DMA
]));
4325 IrqStatus
[ISP_IRQ_TYPE_INTB
] = (ISP_RD32((void *)ISP_REG_ADDR_INTB_STATUS
) & (g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_INTB
] | g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_INTB
]));
4326 IrqStatus
[ISP_IRQ_TYPE_DMAB
] = (ISP_RD32((void *)ISP_REG_ADDR_DMAB_INT
) & (g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_DMAB
] | g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_DMAB
]));
4327 IrqStatus
[ISP_IRQ_TYPE_INTC
] = (ISP_RD32((void *)ISP_REG_ADDR_INTC_STATUS
) & (g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_INTC
] | g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_INTC
]));
4328 IrqStatus
[ISP_IRQ_TYPE_DMAC
] = (ISP_RD32((void *)ISP_REG_ADDR_DMAC_INT
) & (g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_DMAC
] | g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_DMAC
]));
4329 IrqStatus
[ISP_IRQ_TYPE_INTX
] = (ISP_RD32((void *)ISP_REG_ADDR_INT_STATUSX
) & (g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_INTX
] | g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_INTX
]));
4330 IrqStatus
[ISP_IRQ_TYPE_DMAX
] = (ISP_RD32((void *)ISP_REG_ADDR_DMA_INTX
) & (g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_DMAX
] | g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_DMAX
]));
4332 for(i
= 0; i
< ISP_IRQ_TYPE_AMOUNT
; i
++)
4334 g_IspInfo
.IrqInfo
.Status
[i
] |= (IrqStatus
[i
] & g_IspInfo
.IrqInfo
.Mask
[i
]);
4337 spin_unlock_irqrestore(&(g_IspInfo
.SpinLockIrq
), flags
);
4341 ReadIrq
.Status
= g_IspInfo
.IrqInfo
.Status
[ReadIrq
.Type
];
4343 if(copy_to_user((void*)Param
, &ReadIrq
, sizeof(ISP_READ_IRQ_STRUCT
)) != 0)
4345 LOG_ERR("copy_to_user failed");
4351 LOG_ERR("copy_from_user failed");
4358 if(copy_from_user(&ClearIrq
, (void*)Param
, sizeof(ISP_CLEAR_IRQ_STRUCT
)) == 0)
4360 LOG_DBG("ISP_CLEAR_IRQ Type(%d)",ClearIrq
.Type
);
4362 if((ClearIrq
.Type
>= ISP_IRQ_TYPE_AMOUNT
) ||(ClearIrq
.Type
<0))
4365 LOG_ERR("invalid type(%d)",ClearIrq
.Type
);
4369 spin_lock_irqsave(&(g_IspInfo
.SpinLockIrq
), flags
);
4373 ISP_IRQ_TYPE_ENUM IrqStatus
[ISP_IRQ_TYPE_AMOUNT
];
4375 IrqStatus
[ISP_IRQ_TYPE_INT
] = (ISP_RD32((void *)ISP_REG_ADDR_INT_STATUS
) & (g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_INT
] | g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_INT
]));
4376 IrqStatus
[ISP_IRQ_TYPE_DMA
] = (ISP_RD32((void *)ISP_REG_ADDR_DMA_INT
) & (g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_DMA
] | g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_DMA
]));
4377 IrqStatus
[ISP_IRQ_TYPE_INTB
] = (ISP_RD32((void *)ISP_REG_ADDR_INTB_STATUS
) & (g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_INTB
] | g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_INTB
]));
4378 IrqStatus
[ISP_IRQ_TYPE_DMAB
] = (ISP_RD32((void *)ISP_REG_ADDR_DMAB_INT
) & (g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_DMAB
] | g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_DMAB
]));
4379 IrqStatus
[ISP_IRQ_TYPE_INTC
] = (ISP_RD32((void *)ISP_REG_ADDR_INTC_STATUS
) & (g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_INTC
] | g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_INTC
]));
4380 IrqStatus
[ISP_IRQ_TYPE_DMAC
] = (ISP_RD32((void *)ISP_REG_ADDR_DMAC_INT
) & (g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_DMAC
] | g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_DMAC
]));
4381 IrqStatus
[ISP_IRQ_TYPE_INTX
] = (ISP_RD32((void *)ISP_REG_ADDR_INT_STATUSX
) & (g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_INTX
] | g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_INTX
]));
4382 IrqStatus
[ISP_IRQ_TYPE_DMAX
] = (ISP_RD32((void *)ISP_REG_ADDR_DMA_INTX
) & (g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_DMAX
] | g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_DMAX
]));
4384 for(i
= 0; i
< ISP_IRQ_TYPE_AMOUNT
; i
++)
4386 g_IspInfo
.IrqInfo
.Status
[i
] |= (IrqStatus
[i
] & g_IspInfo
.IrqInfo
.Mask
[i
]);
4391 LOG_DBG("ISP_CLEAR_IRQ:Type(%d),Status(0x%08X),IrqStatus(0x%08X)",ClearIrq
.Type
,ClearIrq
.Status
,g_IspInfo
.IrqInfo
.Status
[ClearIrq
.Type
]);
4393 g_IspInfo
.IrqInfo
.Status
[ClearIrq
.Type
] &= (~ClearIrq
.Status
);
4395 spin_unlock_irqrestore(&(g_IspInfo
.SpinLockIrq
), flags
);
4399 LOG_ERR("copy_from_user failed");
4406 Ret
= ISP_DumpReg();
4409 case ISP_DEBUG_FLAG
:
4411 if(copy_from_user(&DebugFlag
, (void*)Param
, sizeof(MUINT32
)) == 0)
4413 spin_lock_irqsave(&(g_IspInfo
.SpinLockIrq
), flags
);
4414 g_IspInfo
.DebugMask
= DebugFlag
;
4415 spin_unlock_irqrestore(&(g_IspInfo
.SpinLockIrq
), flags
);
4419 LOG_ERR("copy_from_user failed");
4424 case ISP_SENSOR_FREQ_CTRL
:
4426 MUINT32 senFreq
= 0;
4427 if(copy_from_user(&senFreq
, (void*)Param
, sizeof(MUINT32
)) == 0)
4429 LOG_DBG("senFreq=%u",senFreq
);
4430 clkmux_sel(MT_MUX_CAMTG
, senFreq
, "CAMERA_SENSOR");
4434 LOG_ERR("senFreq copy_from_user failed");
4439 #ifdef ISP_KERNEL_MOTIFY_SINGAL_TEST
4441 case ISP_SET_USER_PID
:
4443 if(copy_from_user(&pid
, (void*)Param
, sizeof(MUINT32
)) == 0)
4445 spin_lock(&(g_IspInfo
.SpinLockIsp
));
4446 getTaskInfo( (pid_t
) pid
);
4450 LOG_DBG("[ISP_KERNEL_MOTIFY_SINGAL_TEST]:0x08%x ",pid
);
4451 spin_unlock(&(g_IspInfo
.SpinLockIsp
));
4455 LOG_ERR("copy_from_user failed");
4462 case ISP_BUFFER_CTRL
:
4463 Ret
= ISP_Buf_CTRL_FUNC(Param
);
4465 case ISP_REF_CNT_CTRL
:
4466 Ret
= ISP_REF_CNT_CTRL_FUNC(Param
);
4470 LOG_ERR("Unknown Cmd(%d)",Cmd
);
4478 LOG_ERR("Fail, Cmd(%d), Pid(%d), (process, pid, tgid)=(%s, %d, %d)",Cmd
, pUserInfo
->Pid
, current
->comm
, current
->pid
, current
->tgid
);
4484 /*******************************************************************************
4486 ********************************************************************************/
4487 static MINT32
ISP_open(struct inode
*pInode
, struct file
*pFile
)
4491 ISP_USER_INFO_STRUCT
* pUserInfo
;
4493 LOG_DBG("+,UserCount(%d)", g_IspInfo
.UserCount
);
4495 spin_lock(&(g_IspInfo
.SpinLockIspRef
));
4497 //LOG_DBG("UserCount(%d)",g_IspInfo.UserCount);
4499 pFile
->private_data
= NULL
;
4500 pFile
->private_data
= kmalloc(sizeof(ISP_USER_INFO_STRUCT
) , GFP_ATOMIC
);
4501 if(pFile
->private_data
== NULL
)
4503 LOG_DBG("ERROR: kmalloc failed, (process, pid, tgid)=(%s, %d, %d)",current
->comm
,current
->pid
,current
->tgid
);
4508 pUserInfo
= (ISP_USER_INFO_STRUCT
*)pFile
->private_data
;
4509 pUserInfo
->Pid
= current
->pid
;
4510 pUserInfo
->Tid
= current
->tgid
;
4513 if(g_IspInfo
.UserCount
> 0)
4515 g_IspInfo
.UserCount
++;
4516 LOG_DBG("Curr UserCount(%d), (process, pid, tgid)=(%s, %d, %d), users exist",g_IspInfo
.UserCount
,current
->comm
,current
->pid
,current
->tgid
);
4520 g_IspInfo
.BufInfo
.Read
.pData
= (MUINT8
*) kmalloc(ISP_BUF_SIZE
, GFP_ATOMIC
);
4521 g_IspInfo
.BufInfo
.Read
.Size
= ISP_BUF_SIZE
;
4522 g_IspInfo
.BufInfo
.Read
.Status
= ISP_BUF_STATUS_EMPTY
;
4523 if(g_IspInfo
.BufInfo
.Read
.pData
== NULL
)
4525 LOG_DBG("ERROR: BufRead kmalloc failed");
4530 if(!ISP_BufWrite_Alloc())
4532 LOG_DBG("ERROR: BufWrite kmalloc failed");
4537 atomic_set(&(g_IspInfo
.HoldInfo
.HoldEnable
), 0);
4538 atomic_set(&(g_IspInfo
.HoldInfo
.WriteEnable
), 0);
4539 for(i
= 0; i
< ISP_REF_CNT_ID_MAX
; i
++)
4541 atomic_set(&g_imem_ref_cnt
[i
],0);
4545 ISP_EnableClock(MTRUE
);
4547 for(i
= 0; i
< ISP_IRQ_TYPE_AMOUNT
; i
++)
4549 g_IspInfo
.IrqInfo
.Status
[i
] = 0;
4552 for(i
= 0; i
< ISP_CALLBACK_AMOUNT
; i
++)
4554 g_IspInfo
.Callback
[i
].Func
= NULL
;
4557 g_IspInfo
.UserCount
++;
4559 LOG_DBG("Curr UserCount(%d), (process, pid, tgid)=(%s, %d, %d), first user",g_IspInfo
.UserCount
,current
->comm
,current
->pid
,current
->tgid
);
4562 //g_IspInfo.DebugMask = ISP_DBG_BUF_CTRL;
4568 if(g_IspInfo
.BufInfo
.Read
.pData
!= NULL
)
4570 kfree(g_IspInfo
.BufInfo
.Read
.pData
);
4571 g_IspInfo
.BufInfo
.Read
.pData
= NULL
;
4574 ISP_BufWrite_Free();
4577 spin_unlock(&(g_IspInfo
.SpinLockIspRef
));
4579 //LOG_DBG("Before spm_disable_sodi().");
4580 // Disable sodi (Multi-Core Deep Idle).
4581 //spm_disable_sodi();
4583 LOG_DBG("-,Ret(%d),UserCount(%d)", Ret
, g_IspInfo
.UserCount
);
4588 /*******************************************************************************
4590 ********************************************************************************/
4591 static MINT32
ISP_release(struct inode
*pInode
, struct file
*pFile
)
4593 ISP_USER_INFO_STRUCT
* pUserInfo
;
4595 LOG_DBG("+,UserCount(%d)", g_IspInfo
.UserCount
);
4597 spin_lock(&(g_IspInfo
.SpinLockIspRef
));
4599 //LOG_DBG("UserCount(%d)",g_IspInfo.UserCount);
4601 if(pFile
->private_data
!= NULL
)
4603 pUserInfo
= (ISP_USER_INFO_STRUCT
*)pFile
->private_data
;
4604 kfree(pFile
->private_data
);
4605 pFile
->private_data
= NULL
;
4608 g_IspInfo
.UserCount
--;
4609 if(g_IspInfo
.UserCount
> 0)
4611 LOG_DBG("Curr UserCount(%d), (process, pid, tgid)=(%s, %d, %d), users exist",g_IspInfo
.UserCount
,current
->comm
, current
->pid
, current
->tgid
);
4615 LOG_DBG("Curr UserCount(%d), (process, pid, tgid)=(%s, %d, %d), last user",g_IspInfo
.UserCount
,current
->comm
, current
->pid
, current
->tgid
);
4618 ISP_EnableClock(MFALSE
);
4620 if(g_IspInfo
.BufInfo
.Read
.pData
!= NULL
)
4622 kfree(g_IspInfo
.BufInfo
.Read
.pData
);
4623 g_IspInfo
.BufInfo
.Read
.pData
= NULL
;
4624 g_IspInfo
.BufInfo
.Read
.Size
= 0;
4625 g_IspInfo
.BufInfo
.Read
.Status
= ISP_BUF_STATUS_EMPTY
;
4628 ISP_BufWrite_Free();
4632 spin_unlock(&(g_IspInfo
.SpinLockIspRef
));
4634 //LOG_DBG("Before spm_enable_sodi().");
4635 // Enable sodi (Multi-Core Deep Idle).
4636 //spm_enable_sodi();
4638 LOG_DBG("-,UserCount(%d)", g_IspInfo
.UserCount
);
4642 /*******************************************************************************
4643 * helper function, mmap's the kmalloc'd area which is physically contiguous
4644 ********************************************************************************/
4645 static MINT32
mmap_kmem(struct file
*filp
, struct vm_area_struct
*vma
)
4649 length
=(long)(vma
->vm_end
- vma
->vm_start
);
4651 // check length - do not allow larger mappings than the number of pages allocated
4652 if(length
> RT_BUF_TBL_NPAGES
* PAGE_SIZE
)
4657 // map the whole physically contiguous area in one piece
4658 LOG_INF("Vma->vm_pgoff(0x%x),Vma->vm_start(0x%x),Vma->vm_end(0x%x),length(0x%x)",\
4659 vma
->vm_pgoff
,vma
->vm_start
,vma
->vm_end
,length
);
4660 if(length
>ISP_RTBUF_REG_RANGE
)
4662 LOG_ERR("mmap range error! : length(0x%x),ISP_RTBUF_REG_RANGE(0x%x)!",length
,ISP_RTBUF_REG_RANGE
);
4665 if((ret
= remap_pfn_range(vma
,
4667 virt_to_phys((void *)g_pTbl_RTBuf
) >> PAGE_SHIFT
,
4669 vma
->vm_page_prot
)) < 0)
4677 /*******************************************************************************
4679 ********************************************************************************/
4680 static MINT32
ISP_mmap(struct file
*pFile
, struct vm_area_struct
*pVma
)
4685 length
= (long)(pVma
->vm_end
- pVma
->vm_start
);
4686 // at offset RT_BUF_TBL_NPAGES we map the kmalloc'd area
4687 if(pVma
->vm_pgoff
== RT_BUF_TBL_NPAGES
)
4689 return mmap_kmem(pFile
, pVma
);
4693 pVma
->vm_page_prot
= pgprot_noncached(pVma
->vm_page_prot
);
4694 LOG_INF("pVma->vm_pgoff(0x%x),phy(0x%x),pVmapVma->vm_start(0x%x),pVma->vm_end(0x%x),length(0x%x)",\
4695 pVma
->vm_pgoff
,pVma
->vm_pgoff
<<PAGE_SHIFT
,pVma
->vm_start
,pVma
->vm_end
,length
);
4696 pfn
=pVma
->vm_pgoff
<<PAGE_SHIFT
;//page from number, physical address of kernel memory
4699 case IMGSYS_BASE_ADDR
: //imgsys
4700 if(length
>ISP_REG_RANGE
)
4702 LOG_ERR("mmap range error : length(0x%x),ISP_REG_RANGE(0x%x)!",length
,ISP_REG_RANGE
);
4706 case SENINF_BASE_ADDR
:
4707 if(length
>SENINF_REG_RANGE
)
4709 LOG_ERR("mmap range error : length(0x%x),SENINF_REG_RANGE(0x%x)!",length
,SENINF_REG_RANGE
);
4714 if(length
>PLL_RANGE
)
4716 LOG_ERR("mmap range error : length(0x%x),PLL_RANGE(0x%x)!",length
,PLL_RANGE
);
4720 case MIPIRX_CONFIG_ADDR
:
4721 if(length
>MIPIRX_CONFIG_RANGE
)
4723 LOG_ERR("mmap range error : length(0x%x),MIPIRX_CONFIG_RANGE(0x%x)!",length
,MIPIRX_CONFIG_RANGE
);
4727 case MIPIRX_ANALOG_ADDR
:
4728 if(length
>MIPIRX_ANALOG_RANGE
)
4730 LOG_ERR("mmap range error : length(0x%x),MIPIRX_ANALOG_RANGE(0x%x)!",length
,MIPIRX_ANALOG_RANGE
);
4734 case GPIO_BASE_ADDR
:
4735 if(length
>GPIO_RANGE
)
4737 LOG_ERR("mmap range error : length(0x%x),GPIO_RANGE(0x%x)!",length
,GPIO_RANGE
);
4741 case EFUSE_BASE_ADDR
:
4742 if(length
>EFUSE_RANGE
)
4744 LOG_ERR("mmap range error : length(0x%x),EFUSE_RANGE(0x%x)!",length
,EFUSE_RANGE
);
4749 LOG_ERR("Illegal starting HW addr for mmap!");
4753 if(remap_pfn_range(pVma
, pVma
->vm_start
, pVma
->vm_pgoff
,pVma
->vm_end
- pVma
->vm_start
, pVma
->vm_page_prot
))
4762 /*******************************************************************************
4764 ********************************************************************************/
4765 static const struct file_operations g_IspFileOper
=
4767 .owner
= THIS_MODULE
,
4769 .release
= ISP_release
,
4770 //.flush = mt_isp_flush,
4772 .unlocked_ioctl
= ISP_ioctl
4775 /*******************************************************************************
4777 ********************************************************************************/
4778 inline static MVOID
ISP_UnregCharDev(MVOID
)
4782 //Release char driver
4783 if(g_pIspCharDrv
!= NULL
)
4785 cdev_del(g_pIspCharDrv
);
4786 g_pIspCharDrv
= NULL
;
4789 unregister_chrdev_region(g_IspDevNo
, 1);
4792 /*******************************************************************************
4794 ********************************************************************************/
4795 inline static MINT32
ISP_RegCharDev(MVOID
)
4801 if((Ret
= alloc_chrdev_region(&g_IspDevNo
, 0, 1, ISP_DEV_NAME
)) < 0)
4803 LOG_ERR("alloc_chrdev_region failed, %d", Ret
);
4808 g_pIspCharDrv
= cdev_alloc();
4809 if(g_pIspCharDrv
== NULL
)
4811 LOG_ERR("cdev_alloc failed");
4816 //Attatch file operation.
4817 cdev_init(g_pIspCharDrv
, &g_IspFileOper
);
4819 g_pIspCharDrv
->owner
= THIS_MODULE
;
4822 if((Ret
= cdev_add(g_pIspCharDrv
, g_IspDevNo
, 1)) < 0)
4824 LOG_ERR("Attatch file operation failed, %d", Ret
);
4839 /*******************************************************************************
4841 ********************************************************************************/
4842 static MINT32
ISP_probe(struct platform_device
*pDev
)
4845 struct resource
*pRes
= NULL
;
4850 // Check platform_device parameters
4853 dev_err(&pDev
->dev
, "pDev is NULL");
4857 // Register char driver
4858 if((Ret
= ISP_RegCharDev()))
4860 dev_err(&pDev
->dev
, "register char failed");
4864 // Mapping CAM_REGISTERS
4865 for(i
= 0; i
< 1; i
++) // NEED_TUNING_BY_CHIP. 1: Only one IORESOURCE_MEM type resource in kernel\mt_devs.c\mt_resource_isp[].
4867 LOG_DBG("Mapping CAM_REGISTERS. i: %d.", i
);
4869 pRes
= platform_get_resource(pDev
, IORESOURCE_MEM
, i
);
4872 dev_err(&pDev
->dev
, "platform_get_resource failed");
4877 pRes
= request_mem_region(pRes
->start
, pRes
->end
- pRes
->start
+ 1, pDev
->name
);
4880 dev_err(&pDev
->dev
, "request_mem_region failed");
4886 // Create class register
4887 g_pIspClass
= class_create(THIS_MODULE
, "ispdrv");
4888 if(IS_ERR(g_pIspClass
))
4890 Ret
= PTR_ERR(g_pIspClass
);
4891 LOG_ERR("Unable to create class, err = %d", Ret
);
4895 // FIXME: error handling
4896 device_create(g_pIspClass
, NULL
, g_IspDevNo
, NULL
, ISP_DEV_NAME
);
4898 init_waitqueue_head(&g_IspInfo
.WaitQueueHead
);
4900 INIT_WORK(&g_IspInfo
.ScheduleWorkVD
, ISP_ScheduleWork_VD
);
4901 INIT_WORK(&g_IspInfo
.ScheduleWorkEXPDONE
, ISP_ScheduleWork_EXPDONE
);
4902 INIT_WORK(&g_IspInfo
.ScheduleWorkSENINF
, ISP_ScheduleWork_SENINF
);
4904 spin_lock_init(&(g_IspInfo
.SpinLockIspRef
));
4905 spin_lock_init(&(g_IspInfo
.SpinLockIsp
));
4906 spin_lock_init(&(g_IspInfo
.SpinLockIrq
));
4907 spin_lock_init(&(g_IspInfo
.SpinLockHold
));
4908 spin_lock_init(&(g_IspInfo
.SpinLockRTBC
));
4910 g_IspInfo
.UserCount
= 0;
4911 g_IspInfo
.HoldInfo
.Time
= ISP_HOLD_TIME_EXPDONE
;
4913 g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_INT
] = ISP_REG_MASK_INT_STATUS
;
4914 g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_DMA
] = ISP_REG_MASK_DMA_INT
;
4915 g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_INTB
] = ISP_REG_MASK_INTB_STATUS
;
4916 g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_DMAB
] = ISP_REG_MASK_DMAB_INT
;
4917 g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_INTC
] = ISP_REG_MASK_INTC_STATUS
;
4918 g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_DMAC
] = ISP_REG_MASK_DMAC_INT
;
4919 g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_INTX
] = ISP_REG_MASK_INTX_STATUS
;
4920 g_IspInfo
.IrqInfo
.Mask
[ISP_IRQ_TYPE_DMAX
] = ISP_REG_MASK_DMAX_INT
;
4922 g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_INT
] = ISP_REG_MASK_INT_STATUS_ERR
;
4923 g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_DMA
] = ISP_REG_MASK_DMA_INT_ERR
;
4924 g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_INTB
] = ISP_REG_MASK_INTB_STATUS_ERR
;
4925 //g_IspInfo.IrqInfo.ErrMask[ISP_IRQ_TYPE_DMAB] = ISP_REG_MASK_DMAB_INT_ERR;
4926 g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_INTC
] = ISP_REG_MASK_INTC_STATUS_ERR
;
4927 //g_IspInfo.IrqInfo.ErrMask[ISP_IRQ_TYPE_DMAC] = ISP_REG_MASK_DMAC_INT_ERR;
4928 g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_INTX
] = ISP_REG_MASK_INTX_STATUS_ERR
;
4929 g_IspInfo
.IrqInfo
.ErrMask
[ISP_IRQ_TYPE_DMAX
] = ISP_REG_MASK_DMAX_INT_ERR
;
4931 // Request CAM_ISP IRQ
4933 if (request_irq(CAMERA_ISP_IRQ0_ID
, (irq_handler_t
)ISP_Irq
, IRQF_TRIGGER_LOW
, "isp", NULL
))
4934 // if (request_irq(CAMERA_ISP_IRQ0_ID, (irq_handler_t)ISP_Irq, IRQF_TRIGGER_HIGH, "isp", NULL))
4936 LOG_ERR("MT_CAM_IRQ_LINE IRQ LINE NOT AVAILABLE!!");
4939 //mt_irq_unmask(CAMERA_ISP_IRQ0_ID);
4942 cmdqRegisterCallback(cbISP
, ISPRegDump
,MDPReset_Process
);
4955 /*******************************************************************************
4956 * Called when the device is being detached from the driver
4957 ********************************************************************************/
4958 static MINT32
ISP_remove(struct platform_device
*pDev
)
4960 struct resource
*pRes
;
4966 // unregister char driver.
4969 // unmaping ISP CAM_REGISTER registers
4970 for(i
= 0; i
< 2; i
++)
4972 pRes
= platform_get_resource(pDev
, IORESOURCE_MEM
, 0);
4973 release_mem_region(pRes
->start
, (pRes
->end
- pRes
->start
+ 1));
4977 disable_irq(g_IspInfo
.IrqNum
);
4978 IrqNum
= platform_get_irq(pDev
, 0);
4979 free_irq(IrqNum
, NULL
);
4981 device_destroy(g_pIspClass
, g_IspDevNo
);
4983 class_destroy(g_pIspClass
);
4989 /*******************************************************************************
4991 ********************************************************************************/
4992 static MINT32
ISP_suspend(struct platform_device
*pDev
,pm_message_t Mesg
)
4994 // TG_VF_CON[0] (0x15004414[0]): VFDATA_EN. TG1 Take Picture Request.
4995 MUINT32 regTG1Val
= ISP_RD32((void *)(ISP_ADDR
+ 0x414));
4997 LOG_DBG("g_bPass1_On_In_Resume_TG1(%d),regTG1Val(0x%08x)", g_bPass1_On_In_Resume_TG1
, regTG1Val
);
4999 g_bPass1_On_In_Resume_TG1
= 0;
5000 if(regTG1Val
& 0x01 ) // For TG1 Main sensor.
5002 g_bPass1_On_In_Resume_TG1
= 1;
5003 ISP_WR32((void *)(ISP_ADDR
+ 0x414), (regTG1Val
&(~0x01)) );
5009 /*******************************************************************************
5011 ********************************************************************************/
5012 static MINT32
ISP_resume(struct platform_device
*pDev
)
5014 // TG_VF_CON[0] (0x15004414[0]): VFDATA_EN. TG1 Take Picture Request.
5015 MUINT32 regTG1Val
= ISP_RD32((void *)(ISP_ADDR
+ 0x414));
5017 LOG_DBG("g_bPass1_On_In_Resume_TG1(%d),regTG1Val(0x%x)", g_bPass1_On_In_Resume_TG1
, regTG1Val
);
5019 if(g_bPass1_On_In_Resume_TG1
)
5021 g_bPass1_On_In_Resume_TG1
= 0;
5022 ISP_WR32((void *)(ISP_ADDR
+ 0x414), (regTG1Val
|0x01) ); // For TG1 Main sensor.
5028 /*******************************************************************************
5030 ********************************************************************************/
5032 MINT32
ISP_pm_suspend(struct device
*device
)
5034 struct platform_device
*pdev
= to_platform_device(device
);
5035 BUG_ON(pdev
== NULL
);
5037 pr_debug("calling %s()\n", __func__
);
5039 return ISP_suspend(pdev
, PMSG_SUSPEND
);
5042 MINT32
ISP_pm_resume(struct device
*device
)
5044 struct platform_device
*pdev
= to_platform_device(device
);
5045 BUG_ON(pdev
== NULL
);
5047 pr_debug("calling %s()\n", __func__
);
5049 return ISP_resume(pdev
);
5052 extern MVOID
mt_irq_set_sens(MUINT32 irq
, MUINT32 sens
);
5053 extern MVOID
mt_irq_set_polarity(MUINT32 irq
, MUINT32 polarity
);
5054 MINT32
ISP_pm_restore_noirq(struct device
*device
)
5056 pr_debug("calling %s()\n", __func__
);
5058 mt_irq_set_sens(CAMERA_ISP_IRQ0_ID
, MT_LEVEL_SENSITIVE
);
5059 mt_irq_set_polarity(CAMERA_ISP_IRQ0_ID
, MT_POLARITY_LOW
);
5067 #define ISP_pm_suspend NULL
5068 #define ISP_pm_resume NULL
5069 #define ISP_pm_restore_noirq NULL
5071 #endif /*CONFIG_PM*/
5073 struct dev_pm_ops ISP_pm_ops
= {
5074 .suspend
= ISP_pm_suspend
,
5075 .resume
= ISP_pm_resume
,
5076 .freeze
= ISP_pm_suspend
,
5077 .thaw
= ISP_pm_resume
,
5078 .poweroff
= ISP_pm_suspend
,
5079 .restore
= ISP_pm_resume
,
5080 .restore_noirq
= ISP_pm_restore_noirq
,
5083 /*******************************************************************************
5085 ********************************************************************************/
5086 static struct platform_driver IspDriver
=
5089 .remove
= ISP_remove
,
5090 .suspend
= ISP_suspend
,
5091 .resume
= ISP_resume
,
5093 .name
= ISP_DEV_NAME
,
5094 .owner
= THIS_MODULE
,
5101 /*******************************************************************************
5103 ********************************************************************************/
5104 static MINT32
ISP_DumpRegToProc(
5117 LOG_DBG("pPage(0x%08x),off(%d),Count(%d)", (MUINT32
)pPage
, (MUINT32
)off
, Count
);
5119 p
+= sprintf(p
, " MT ISP Register\n");
5120 p
+= sprintf(p
, "====== top ====\n");
5122 for(i
= 0x0; i
<= 0x1AC; i
+= 4)
5124 p
+= sprintf(p
,"+0x%08x 0x%08x\n", ISP_ADDR
+ i
, ISP_RD32((void *)(ISP_ADDR
+ i
)));
5127 p
+= sprintf(p
,"====== dma ====\n");
5128 for(i
= 0x200; i
<= 0x3D8; i
+= 4)
5130 p
+= sprintf(p
,"+0x%08x 0x%08x\n\r", ISP_ADDR
+ i
, ISP_RD32((void *)(ISP_ADDR
+ i
)));
5133 p
+= sprintf(p
,"====== tg ====\n");
5134 for(i
= 0x400; i
<= 0x4EC; i
+= 4)
5136 p
+= sprintf(p
,"+0x%08x 0x%08x\n", ISP_ADDR
+ i
, ISP_RD32((void *)(ISP_ADDR
+ i
)));
5139 p
+= sprintf(p
,"====== cdp (including EIS) ====\n");
5140 for(i
= 0xB00; i
<= 0xDE0; i
+= 4)
5142 p
+= sprintf(p
,"+0x%08x 0x%08x\n", ISP_ADDR
+ i
, ISP_RD32((void *)(ISP_ADDR
+ i
)));
5145 p
+= sprintf(p
,"====== seninf ====\n");
5146 for(i
= 0x4000; i
<= 0x40C0; i
+= 4)
5148 p
+= sprintf(p
,"+0x%08x 0x%08x\n", ISP_ADDR
+ i
, ISP_RD32((void *)(ISP_ADDR
+ i
)));
5151 for(i
= 0x4100; i
<= 0x41BC; i
+= 4)
5153 p
+= sprintf(p
,"+0x%08x 0x%08x\n", ISP_ADDR
+ i
, ISP_RD32((void *)(ISP_ADDR
+ i
)));
5156 for(i
= 0x4300; i
<= 0x4310; i
+= 4)
5158 p
+= sprintf(p
,"+0x%08x 0x%08x\n", ISP_ADDR
+ i
, ISP_RD32((void *)(ISP_ADDR
+ i
)));
5161 for(i
= 0x43A0; i
<= 0x43B0; i
+= 4)
5163 p
+= sprintf(p
,"+0x%08x 0x%08x\n", ISP_ADDR
+ i
, ISP_RD32((void *)(ISP_ADDR
+ i
)));
5166 for(i
= 0x4400; i
<= 0x4424; i
+= 4)
5168 p
+= sprintf(p
,"+0x%08x 0x%08x\n", ISP_ADDR
+ i
, ISP_RD32((void *)(ISP_ADDR
+ i
)));
5171 for(i
= 0x4500; i
<= 0x4520; i
+= 4)
5173 p
+= sprintf(p
,"+0x%08x 0x%08x\n", ISP_ADDR
+ i
, ISP_RD32((void *)(ISP_ADDR
+ i
)));
5176 p
+= sprintf(p
,"====== 3DNR ====\n");
5177 for(i
= 0x4F00; i
<= 0x4F38; i
+= 4)
5179 p
+= sprintf(p
,"+0x%08x 0x%08x\n", ISP_ADDR
+ i
, ISP_RD32((void *)(ISP_ADDR
+ i
)));
5182 *ppStart
= pPage
+ off
;
5194 ret
= Length
< Count
? Length
: Count
;
5196 LOG_DBG("ret(%d)", ret
);
5200 /*******************************************************************************
5202 ********************************************************************************/
5203 static MINT32
ISP_RegDebug(
5205 const char *pBuffer
,
5206 unsigned long Count
,
5210 MUINT32 CopyBufSize
= (Count
< (sizeof(RegBuf
) - 1)) ? (Count
) : (sizeof(RegBuf
) - 1);
5214 LOG_DBG("pFile(0x%08x),pBuffer(0x%08x),Count(%d)", (MUINT32
)pFile
, (MUINT32
)pBuffer
, (MINT32
)Count
);
5216 if(copy_from_user(RegBuf
, pBuffer
, CopyBufSize
))
5218 LOG_ERR("copy_from_user() fail.");
5222 if(sscanf(RegBuf
, "%x %x", &Addr
, &Data
) == 2)
5224 ISP_WR32((void *)(ISP_ADDR_CAMINF
+ Addr
), Data
);
5225 LOG_ERR("Write => Addr: 0x%08X, Write Data: 0x%08X. Read Data: 0x%08X.", ISP_ADDR_CAMINF
+ Addr
, Data
, ioread32((void *)(ISP_ADDR_CAMINF
+ Addr
)));
5227 else if (sscanf(RegBuf
, "%x", &Addr
) == 1)
5229 LOG_ERR("Read => Addr: 0x%08X, Read Data: 0x%08X.", ISP_ADDR_CAMINF
+ Addr
, ioread32((void *)(ISP_ADDR_CAMINF
+ Addr
)));
5232 LOG_DBG("Count(%d)", (MINT32
)Count
);
5236 static MUINT32 proc_regOfst
= 0;
5237 static MINT32
CAMIO_DumpRegToProc(
5249 LOG_DBG("pPage(0x%08x),off(%d),Count(%d)", (MUINT32
)pPage
, (MINT32
)off
, Count
);
5251 p
+= sprintf(p
,"reg_0x%08X = 0x%X \n", ISP_ADDR_CAMINF
+ proc_regOfst
, ioread32((void *)(ISP_ADDR_CAMINF
+ proc_regOfst
)));
5253 *ppStart
= pPage
+ off
;
5266 ret
= Length
< Count
? Length
: Count
;
5268 LOG_DBG("ret(%d)", ret
);
5272 /*******************************************************************************
5274 ********************************************************************************/
5275 static MINT32
CAMIO_RegDebug(
5277 const char *pBuffer
,
5278 unsigned long Count
,
5282 MUINT32 CopyBufSize
= (Count
< (sizeof(RegBuf
) - 1)) ? (Count
) : (sizeof(RegBuf
) - 1);
5286 LOG_DBG("pFile(0x%08x),pBuffer(0x%08x),Count(%d)", (MUINT32
)pFile
, (MUINT32
)pBuffer
, (MINT32
)Count
);
5288 if(copy_from_user(RegBuf
, pBuffer
, CopyBufSize
))
5290 LOG_ERR("copy_from_user() fail.");
5294 if(sscanf(RegBuf
, "%x %x", &Addr
, &Data
) == 2)
5296 proc_regOfst
= Addr
;
5297 ISP_WR32((void *)(GPIO_BASE
+ Addr
), Data
);
5298 LOG_ERR("Write => Addr: 0x%08X, Write Data: 0x%08X. Read Data: 0x%08X.", GPIO_BASE
+ Addr
, Data
, ioread32((void *)(GPIO_BASE
+ Addr
)));
5300 else if (sscanf(RegBuf
, "%x", &Addr
) == 1)
5302 proc_regOfst
= Addr
;
5303 LOG_ERR("Read => Addr: 0x%08X, Read Data: 0x%08X.", GPIO_BASE
+ Addr
, ioread32((void *)(GPIO_BASE
+ Addr
)));
5306 LOG_DBG("Count(%d)", (MINT32
)Count
);
5310 /*******************************************************************************
5312 ********************************************************************************/
5313 static const struct file_operations fcameraisp_proc_fops
= {
5314 .read
= ISP_DumpRegToProc
,
5315 .write
= ISP_RegDebug
,
5317 static const struct file_operations fcameraio_proc_fops
= {
5318 .read
= CAMIO_DumpRegToProc
,
5319 .write
= CAMIO_RegDebug
,
5322 /*******************************************************************************
5324 ********************************************************************************/
5325 #define GPIO_BASE_ADDR 0xF0005000
5327 static MINT32
CAM_CLK_DumpRegToProc(
5338 int setPCLKDrivingCurrent(unsigned long ioDrivingCurrent
)
5344 MUINT32 DataTmp
= 0;
5346 DataTmp
= ISP_RD32(GPIO_BASE_ADDR
+ Addr
);
5347 Data
= DataTmp
&0xFFFF0FFF;
5348 ISP_WR32(GPIO_BASE_ADDR
+ Addr
,Data
);
5350 DataTmp
= ISP_RD32(GPIO_BASE_ADDR
+ Addr
);
5351 Data
= DataTmp
|ioDrivingCurrent
;
5352 ISP_WR32(GPIO_BASE_ADDR
+ Addr
, Data
);
5354 LOG_GPIO_REG("Write => Addr: 0x%08X, Write Data: 0x%08X. Read Data: 0x%08X.", GPIO_BASE_ADDR
+ Addr
, Data
, ioread32(GPIO_BASE_ADDR
+ Addr
));
5359 int setMCLKDrivingCurrent(unsigned long ioDrivingCurrent
)
5365 MUINT32 DataTmp
= 0;
5367 DataTmp
= ISP_RD32(GPIO_BASE_ADDR
+ Addr
);
5368 Data
= DataTmp
&0xFFFF0FFF;
5369 ISP_WR32(GPIO_BASE_ADDR
+ Addr
,Data
);
5371 DataTmp
= ISP_RD32(GPIO_BASE_ADDR
+ Addr
);
5372 Data
= DataTmp
|ioDrivingCurrent
;
5373 ISP_WR32(GPIO_BASE_ADDR
+ Addr
, Data
);
5375 LOG_GPIO_REG("Write => Addr: 0x%08X, Write Data: 0x%08X. Read Data: 0x%08X.", GPIO_BASE_ADDR
+ Addr
, Data
, ioread32(GPIO_BASE_ADDR
+ Addr
));
5381 static MINT32
CAM_CLK_RegDebug(
5383 const char* pBuffer
,
5384 unsigned long Count
,
5388 MUINT32 CopyBufSize
= (Count
< (sizeof(RegBuf
) - 1)) ? (Count
) : (sizeof(RegBuf
) - 1);
5391 MUINT32 DataTmp
= 0;
5392 MINT32 ioDrivingCurrent
= 0;
5394 LOG_GPIO_REG("- E. pFile: 0x%08x. pBuffer: 0x%08x. Count: %d.", (unsigned int)pFile
, (unsigned int)pBuffer
, (int)Count
);
5396 if(copy_from_user(RegBuf
, pBuffer
, CopyBufSize
))
5398 LOG_GPIO_REG("copy_from_user() fail.");
5403 if (sscanf(RegBuf
, "MCLK=%x", &Data
) == 1)
5408 ioDrivingCurrent
= 0x0000;
5411 ioDrivingCurrent
= 0x2000;
5414 ioDrivingCurrent
= 0x4000;
5417 ioDrivingCurrent
= 0x6000;
5420 LOG_GPIO_REG("The driving current value is wrong\n");
5424 setMCLKDrivingCurrent(ioDrivingCurrent
);
5427 else if(sscanf(RegBuf
, "PCLK=%x", &Data
) == 1)
5432 ioDrivingCurrent
= 0x0000;
5435 ioDrivingCurrent
= 0x2000;
5438 ioDrivingCurrent
= 0x4000;
5441 ioDrivingCurrent
= 0x6000;
5444 LOG_GPIO_REG("The driving current value is wrong\n");
5447 setPCLKDrivingCurrent(ioDrivingCurrent
);
5451 LOG_GPIO_REG("- X. Count: %d.", (int)Count
);
5458 /*******************************************************************************
5460 ********************************************************************************/
5461 static MINT32 __init
ISP_Init(MVOID
)
5465 struct proc_dir_entry
* pEntry
;
5469 if((Ret
= platform_driver_register(&IspDriver
)) < 0)
5471 LOG_ERR("platform_driver_register fail");
5474 #if 1 //linux-3.10 procfs API changed
5475 proc_create("driver/isp_reg",0,NULL
,&fcameraisp_proc_fops
);
5476 proc_create("driver/camio_reg",0,NULL
,&fcameraio_proc_fops
);
5478 pEntry
= create_proc_entry("driver/isp_reg", 0, NULL
);
5481 pEntry
->read_proc
= ISP_DumpRegToProc
;
5482 pEntry
->write_proc
= ISP_RegDebug
;
5486 LOG_ERR("add /proc/driver/isp_reg entry fail");
5489 pEntry
= create_proc_entry("driver/camio_reg", 0, NULL
);
5492 pEntry
->read_proc
= CAMIO_DumpRegToProc
;
5493 pEntry
->write_proc
= CAMIO_RegDebug
;
5497 LOG_ERR("add /proc/driver/camio_reg entry fail");
5500 // allocate a memory area with kmalloc. Will be rounded up to a page boundary
5501 //RT_BUF_TBL_NPAGES*4096(1page) = 64k Bytes
5502 if((g_pBuf_kmalloc
= kmalloc((RT_BUF_TBL_NPAGES
+ 2) * PAGE_SIZE
, GFP_KERNEL
)) == NULL
)
5508 memset(g_pBuf_kmalloc
,0x00,RT_BUF_TBL_NPAGES
* PAGE_SIZE
);
5510 // round it up to the page bondary
5511 g_pTbl_RTBuf
= (MINT32
*)((((unsigned long)g_pBuf_kmalloc
) + PAGE_SIZE
- 1) & PAGE_MASK
);
5512 g_pstRTBuf
= (ISP_RT_BUF_STRUCT
*)g_pTbl_RTBuf
;
5513 g_pstRTBuf
->state
= ISP_RTBC_STATE_INIT
;
5515 // mark the pages reserved
5516 for (i
= 0; i
< RT_BUF_TBL_NPAGES
* PAGE_SIZE
; i
+= PAGE_SIZE
)
5518 SetPageReserved(virt_to_page(((unsigned long)g_pTbl_RTBuf
) + i
));
5521 LOG_DBG("Ret(%d)", Ret
);
5525 /*******************************************************************************
5527 ********************************************************************************/
5528 static MVOID __exit
ISP_Exit(MVOID
)
5533 platform_driver_unregister(&IspDriver
);
5535 // unreserve the pages
5536 for (i
= 0; i
< RT_BUF_TBL_NPAGES
* PAGE_SIZE
; i
+= PAGE_SIZE
)
5538 SetPageReserved(virt_to_page(((unsigned long)g_pTbl_RTBuf
) + i
));
5541 // free the memory areas
5542 kfree(g_pBuf_kmalloc
);
5545 /*******************************************************************************
5547 ********************************************************************************/
5548 bool ISP_RegCallback(ISP_CALLBACK_STRUCT
*pCallback
)
5550 if(pCallback
== NULL
)
5552 LOG_ERR("pCallback is null");
5556 if(pCallback
->Func
== NULL
)
5558 LOG_ERR("Func is null");
5562 LOG_DBG("Type(%d)",pCallback
->Type
);
5563 g_IspInfo
.Callback
[pCallback
->Type
].Func
= pCallback
->Func
;
5568 /*******************************************************************************
5570 ********************************************************************************/
5571 bool ISP_UnregCallback(ISP_CALLBACK_ENUM Type
)
5573 if(Type
> ISP_CALLBACK_AMOUNT
)
5575 LOG_ERR("Type(%d) must smaller than %d",Type
,ISP_CALLBACK_AMOUNT
);
5579 LOG_DBG("Type(%d)",Type
);
5580 g_IspInfo
.Callback
[Type
].Func
= NULL
;
5585 /*******************************************************************************
5587 ********************************************************************************/
5588 void ISP_MCLK1_EN(bool En
)
5591 temp
= ISP_RD32((void *)(ISP_ADDR
+ 0x4300));
5596 ISP_WR32((void *)(ISP_ADDR
+ 0x4300),temp
);
5601 ISP_WR32((void *)(ISP_ADDR
+ 0x4300),temp
);
5605 int m4u_reclaim_mva_callback_CAM(int moduleID
, unsigned int va
, unsigned int size
, unsigned int mva
)
5607 if(CAM_IMGI
== moduleID
)
5609 LOG_DBG("warning on Release MVA!"); // ISP need Release before M4U Release
5610 if(g_IspInfo
.UserCount
> 0)
5612 LOG_DBG("UserCnt(%d),(pro, pid, tgid)=(%s, %d, %d)",g_IspInfo
.UserCount
,current
->comm
, current
->pid
, current
->tgid
);
5617 /*******************************************************************************
5619 ********************************************************************************/
5620 module_init(ISP_Init
);
5621 module_exit(ISP_Exit
);
5622 MODULE_DESCRIPTION("Camera ISP driver");
5623 MODULE_AUTHOR("ME3");
5624 MODULE_LICENSE("GPL");
5625 EXPORT_SYMBOL(ISP_RegCallback
);
5626 EXPORT_SYMBOL(ISP_UnregCallback
);
5627 EXPORT_SYMBOL(ISP_MCLK1_EN
);