@@ -2425,7 +2425,7 @@ static inline u32 __VISetRegs(void)
24252425 return 1 ;
24262426}
24272427
2428- static void __VIDisplayPositionToXY (s32 xpos ,s32 ypos ,s32 * px ,s32 * py )
2428+ static void __VIDisplayPositionToXY (u32 xpos ,u32 ypos ,s16 * px ,s16 * py )
24292429{
24302430 u32 hpos ,vpos ;
24312431 u32 hline ,val ;
@@ -2434,25 +2434,25 @@ static void __VIDisplayPositionToXY(s32 xpos,s32 ypos,s32 *px,s32 *py)
24342434 vpos = (ypos - 1 );
24352435 hline = ((vpos <<1 )+ (hpos /currTiming -> hlw ));
24362436
2437- * px = (s32 )hpos ;
2437+ * px = (s16 )hpos ;
24382438 if (HorVer .nonInter == VI_INTERLACE ) {
24392439 if (hline < currTiming -> nhlines ) {
2440- val = currTiming -> prbOdd + ( currTiming -> equ * 3 );
2440+ val = (( currTiming -> equ * 3 ) + currTiming -> prbOdd );
24412441 if (hline >=val ) {
24422442 val = (currTiming -> nhlines - currTiming -> psbOdd );
24432443 if (hline < val ) {
2444- * py = (s32 )((( hline - (currTiming -> equ * 3 )) - currTiming -> prbOdd )& ~ 0x01 );
2444+ * py = (s16 )((hline - (( currTiming -> equ * 3 )+ currTiming -> prbOdd )) & ~ 1 );
24452445 } else
24462446 * py = -1 ;
24472447 } else
24482448 * py = -1 ;
24492449 } else {
24502450 hline -= currTiming -> nhlines ;
2451- val = (currTiming -> prbEven + (currTiming -> equ * 3 ));
2451+ val = ((currTiming -> equ * 3 )+ currTiming -> prbEven );
24522452 if (hline >=val ) {
24532453 val = (currTiming -> nhlines - currTiming -> psbEven );
24542454 if (hline < val ) {
2455- * py = (s32 )(((( hline - (currTiming -> equ * 3 )) - currTiming -> prbEven )& ~ 0x01 )+ 1 );
2455+ * py = (s16 )(((hline - (( currTiming -> equ * 3 )+ currTiming -> prbEven )) & ~ 1 )+ 1 );
24562456 } else
24572457 * py = -1 ;
24582458 } else
@@ -2461,46 +2461,36 @@ static void __VIDisplayPositionToXY(s32 xpos,s32 ypos,s32 *px,s32 *py)
24612461 } else if (HorVer .nonInter == VI_NON_INTERLACE ) {
24622462 if (hline >=currTiming -> nhlines ) hline -= currTiming -> nhlines ;
24632463
2464- val = (currTiming -> prbOdd + (currTiming -> equ * 3 ));
2464+ val = ((currTiming -> equ * 3 )+ currTiming -> prbOdd );
24652465 if (hline >=val ) {
24662466 val = (currTiming -> nhlines - currTiming -> psbOdd );
24672467 if (hline < val ) {
2468- * py = (s32 )((( hline - (currTiming -> equ * 3 )) - currTiming -> prbOdd )& ~ 0x01 );
2468+ * py = (s16 )((hline - (( currTiming -> equ * 3 )+ currTiming -> prbOdd )) & ~ 1 );
24692469 } else
24702470 * py = -1 ;
24712471 } else
24722472 * py = -1 ;
24732473 } else if (HorVer .nonInter == VI_PROGRESSIVE || HorVer .nonInter == VI_3D ) {
2474- if (hline < currTiming -> nhlines ) {
2475- val = currTiming -> prbOdd + (currTiming -> equ * 3 );
2476- if (hline >=val ) {
2477- val = (currTiming -> nhlines - currTiming -> psbOdd );
2478- if (hline < val ) {
2479- * py = (s32 )((hline - (currTiming -> equ * 3 ))- currTiming -> prbOdd );
2480- } else
2481- * py = -1 ;
2482- } else
2483- * py = -1 ;
2484- } else {
2485- hline -= currTiming -> nhlines ;
2486- val = (currTiming -> prbEven + (currTiming -> equ * 3 ));
2487- if (hline >=val ) {
2488- val = (currTiming -> nhlines - currTiming -> psbEven );
2489- if (hline < val ) {
2490- * py = (s32 )(((hline - (currTiming -> equ * 3 ))- currTiming -> prbEven )& ~0x01 );
2491- } else
2492- * py = -1 ;
2474+ if (hline >=currTiming -> nhlines ) hline -= currTiming -> nhlines ;
2475+
2476+ val = ((currTiming -> equ * 3 )+ currTiming -> prbOdd );
2477+ if (hline >=val ) {
2478+ val = (currTiming -> nhlines - currTiming -> psbOdd );
2479+ if (hline < val ) {
2480+ * py = (s16 )((hline - ((currTiming -> equ * 3 )+ currTiming -> prbOdd ))>>1 );
24932481 } else
24942482 * py = -1 ;
2495- }
2496- }
2483+ } else
2484+ * py = -1 ;
2485+ } else
2486+ * py = -1 ;
24972487}
24982488
2499- static inline void __VIGetCurrentPosition (s32 * px ,s32 * py )
2489+ static inline void __VIGetCurrentPosition (s16 * px ,s16 * py )
25002490{
2501- s32 xpos ,ypos ;
2491+ u32 xpos ,ypos ;
25022492
2503- __getCurrentDisplayPosition (( u32 * ) & xpos ,( u32 * ) & ypos );
2493+ __getCurrentDisplayPosition (& xpos ,& ypos );
25042494 __VIDisplayPositionToXY (xpos ,ypos ,px ,py );
25052495}
25062496
@@ -2511,7 +2501,7 @@ static void __VIRetraceHandler(u32 nIrq,frame_context *pCtx)
25112501#endif
25122502 u32 ret = 0 ;
25132503 u32 intr ;
2514- s32 xpos ,ypos ;
2504+ s16 xpos ,ypos ;
25152505
25162506 intr = _viReg [24 ];
25172507 if (intr & 0x8000 ) {
@@ -2539,7 +2529,7 @@ static void __VIRetraceHandler(u32 nIrq,frame_context *pCtx)
25392529
25402530 intr = _viReg [30 ];
25412531 if (ret & 0x04 || ret & 0x08 ) {
2542- if (positionCB != NULL ) {
2532+ if (positionCB ) {
25432533 __VIGetCurrentPosition (& xpos ,& ypos );
25442534 positionCB (xpos ,ypos );
25452535 }
@@ -3177,14 +3167,14 @@ u32 VIDEO_HaveComponentCable(void)
31773167 return dtv ;
31783168}
31793169
3180- void VIDEO_SetAdjustingValues (s16 hor ,s16 ver )
3170+ void VIDEO_SetAdjustingValues (s16 posX ,s16 posY )
31813171{
31823172 u32 level ;
31833173 const struct _timing * curtiming ;
31843174
31853175 _CPU_ISR_Disable (level );
3186- displayOffsetH = hor ;
3187- displayOffsetV = ver ;
3176+ displayOffsetH = posX ;
3177+ displayOffsetV = posY ;
31883178
31893179 curtiming = HorVer .timing ;
31903180 __adjustPosition (curtiming -> acv );
@@ -3196,12 +3186,62 @@ void VIDEO_SetAdjustingValues(s16 hor,s16 ver)
31963186 _CPU_ISR_Restore (level );
31973187}
31983188
3199- void VIDEO_GetAdjustingValues (s16 * hor ,s16 * ver )
3189+ void VIDEO_GetAdjustingValues (s16 * posX ,s16 * posY )
32003190{
32013191 u32 level ;
32023192
32033193 _CPU_ISR_Disable (level );
3204- * hor = displayOffsetH ;
3205- * ver = displayOffsetV ;
3194+ * posX = displayOffsetH ;
3195+ * posY = displayOffsetV ;
32063196 _CPU_ISR_Restore (level );
32073197}
3198+
3199+ void VIDEO_EnablePositionInterrupt (s16 posX ,s16 posY ,VIPositionCallback callback )
3200+ {
3201+ u32 level ,hline ;
3202+
3203+ _CPU_ISR_Disable (level );
3204+ if (HorVer .nonInter == VI_INTERLACE ) {
3205+ if (posY %2 ) {
3206+ hline = (currTiming -> nhlines + ((currTiming -> equ * 3 )+ currTiming -> prbEven ));
3207+ _viReg [30 ] = 0x1000 |((hline /2 )+ ((posY /2 )+ 1 ));
3208+ _viReg [31 ] = posX + 1 ;
3209+ } else {
3210+ hline = ((currTiming -> equ * 3 )+ currTiming -> prbOdd );
3211+ _viReg [28 ] = 0x1000 |((hline /2 )+ ((posY /2 )+ 1 ));
3212+ _viReg [29 ] = posX + 1 ;
3213+ }
3214+ } else if (HorVer .nonInter == VI_NON_INTERLACE ) {
3215+ hline = ((currTiming -> equ * 3 )+ currTiming -> prbOdd );
3216+ _viReg [28 ] = 0x1000 |((hline /2 )+ ((posY /2 )+ 1 ));
3217+ _viReg [29 ] = posX + 1 ;
3218+
3219+ hline += currTiming -> nhlines ;
3220+ _viReg [30 ] = 0x1000 |((hline /2 )+ ((posY /2 )+ 1 ));
3221+ _viReg [31 ] = posX + 1 ;
3222+ } else if (HorVer .nonInter == VI_PROGRESSIVE || HorVer .nonInter == VI_3D ) {
3223+ hline = ((currTiming -> equ * 3 )+ currTiming -> prbOdd );
3224+ _viReg [28 ] = 0x1000 |((hline /2 )+ (posY + 1 ));
3225+ _viReg [29 ] = posX + 1 ;
3226+
3227+ hline += currTiming -> nhlines ;
3228+ _viReg [30 ] = 0x1000 |((hline /2 )+ (posY + 1 ));
3229+ _viReg [31 ] = posX + 1 ;
3230+ }
3231+ positionCB = callback ;
3232+ _CPU_ISR_Restore (level );
3233+ }
3234+
3235+ VIPositionCallback VIDEO_DisablePositionInterrupt (void )
3236+ {
3237+ u32 level ;
3238+ VIPositionCallback old ;
3239+
3240+ _CPU_ISR_Disable (level );
3241+ _viReg [28 ] = 0x0000 ;
3242+ _viReg [30 ] = 0x0000 ;
3243+ old = positionCB ;
3244+ positionCB = NULL ;
3245+ _CPU_ISR_Restore (level );
3246+ return old ;
3247+ }
0 commit comments