亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? smt.c

?? GM5621原代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
   $Workfile:   smt.c  $
   $Revision:   1.1  $
   $Date:   May 17 2006 01:58:46  $
*/

//******************************************************************
//
//    Copyright (C) 2003.  GENESIS MICROCHIP INC.
// All rights reserved.  No part of this program may be reproduced
//
// Genesis Microchip Inc., 165 Commerce Valley Dr. West
//    Thornhill, Ontario, Canada, L3T 7V8
//
//================================================================
//
// MODULE:      smt.c
//
//******************************************************************

#include "inc\all.h"
#include "system\mcu186.h"

#if USE_SMT

#if DEBUG_MSG

#define  DEBUG_APPTEST           0
#define  DEBUG_APPTEST_EXTENDED  1

#include <stdlib.h>
#include <embedded.h>
#include <mem.h>
#include ".\AppsTest\appstest.h"


#if DEBUG_APPTEST && DEBUG_MSG
   #define  msg(a,b) gm_Print((const char far *)a,b)
#else
   #define msg(a,b)
#endif

//NOTE: do not use gm_Print to debug SMT is serial handler is used for SMT
// Support SMT
#if DEBUG_SMT && DEBUG_MSG
	#define	msgs(a,b)	gm_Print((const char far *)a,b)
#else
	#define	msgs(a,b)
#endif


#if DEBUG_SMT
BYTE SMTDebug[100]; 	// TODO: WHY 100 ??
BYTE SMTCnt=0;

BYTE SMTCNT(void)
{
 	SMTCnt++;
   if (SMTCnt > 100)	// TODO: WHY 100 ??
   	SMTCnt = 0;
   return SMTCnt;
}
#else
BYTE	tmpSMTDebug; //to achieve code consistence, waste 1 byte if DEBUG_SMT is not turned on
#endif

SMT_TransactionStruct_t SMT_TransArray[MAX_TRANSACTION_NUMBER];
gmt_MsgStruct  OutMsg;
BYTE OldEvOdd = 0xFF;

//******************************************************************************
//    Sample of Hi-Lewel SMT function:
//******************************************************************************
//
// FUNCTION     :   void RamWrite(BYTE CurrentTransNumber, BYTE msgpkt[], BYTE comm_use,
//                                  BYTE EvOdd, BYTE YesNoMoreData, BYTE MsgLen)
// USAGE        :   This function recieve data from PC, copy it to RAM amd send response to PC
//
// INPUT        :   BYTE CurrentTransNumber = number of current transaction in the
//                       transaction array SMT_TransArray[]
//                  BYTE msgpkt[] = msgpkt array from SMT message
//                       contains: in the first message of RAM_WRITE command:
//                       BYTES
//                            0 = low byte of command (== 0xB)
//                            1 = hi byte of command (== 0)
//                            2 = low byte of address (Start address of RAM)
//                            3 = hi byte of address  (Start address of RAM)
//                            4 = low byte of Data Size
//                            6 = hi byte of Data Size
//                            7.. = Data
//                       This only for first message!!!
//                       For other messages: 0,1,.. - Data bytes!
//                  BYTE comm_use  = SERIAL_USE or DDC2BI_USE
//                  BYTE EvOdd = Even/Odd message count
//                  BYTE YesNoMoreData = More Data Pending flag from first byte of
//                       SMT message header
//                  BYTE MsgLen = Length of current message
// OUTPUT       :   None
//
//******************************************************************************
void RamWrite(BYTE CurrentTransNumber, BYTE msgpkt[], BYTE comm_use, BYTE EvOdd, BYTE YesNoMoreData, BYTE MsgLen)
{
   BYTE  B_Count;
   BYTE  B_DataStart;

   msgs("RamWrite()",0);

   if(SMT_TransArray[CurrentTransNumber].B_CurCmd == IDLE_CMD)
   {
      SMT_TransArray[CurrentTransNumber].B_CurCmd = RAM_WRITE_CMD;
      SMT_TransArray[CurrentTransNumber].Bp_Buff = (BYTE far *)(DWORD)((msgpkt[3] << 8) | msgpkt[2]);
      SMT_TransArray[CurrentTransNumber].BuffSize = (msgpkt[5] << 8) | msgpkt[4];
      SMT_TransArray[CurrentTransNumber].W_Count = 0;

      msgs("RamWrite() Bp_Buff  0x%x (Address)",(WORD) SMT_TransArray[CurrentTransNumber].Bp_Buff);
      msgs("RamWrite() BuffSize %d bytes",SMT_TransArray[CurrentTransNumber].BuffSize);
      msgs("RamWrite() Recieved %d bytes",SMT_TransArray[CurrentTransNumber].W_Count);

      B_DataStart = 6;
   }
   else
   {
      B_DataStart = 0;
   }

   for(B_Count = B_DataStart; B_Count < (MsgLen - 5); B_Count++)
   {
      SMT_TransArray[CurrentTransNumber].Bp_Buff[SMT_TransArray[CurrentTransNumber].W_Count] = msgpkt[B_Count];
      msgs("RamWrite() Byte = 0x%X ",msgpkt[B_Count]);
      SMT_TransArray[CurrentTransNumber].W_Count++;
   }
   msgs("RamWrite() Recieved %d bytes",SMT_TransArray[CurrentTransNumber].W_Count);

   if(YesNoMoreData != YES_NO_MORE_DATA)
   {
      if(SMT_TransArray[CurrentTransNumber].W_Count != SMT_TransArray[CurrentTransNumber].BuffSize)
      {
         SMT_SendReTransmit(SMT_TransArray[CurrentTransNumber].ID, comm_use, EvOdd, 100);
         msgs("ERROR: Recived %d bytes. It is != that must be recived.",SMT_TransArray[CurrentTransNumber].W_Count);
         return;
      }
      else
      {
         msgs("Recieve completed TransID = %d ",SMT_TransArray[CurrentTransNumber].ID);
      }
      SMT_TransArray[CurrentTransNumber].B_CurCmd = IDLE_CMD;
   }

   // Sending response:
   OutMsg.len = 6;
   OutMsg.cmd = SMT_Message;
   OutMsg.BUF[0] = EvOdd;
   OutMsg.BUF[1] = SMT_TransArray[CurrentTransNumber].ID;
   OutMsg.BUF[2] = ACK;        // I use ACK for example.

   gm_CommsSendReply((gmt_MsgStruct far*)&OutMsg, comm_use);
}

//******************************************************************************
//    Sample of Hi-Lewel SMT function:
//******************************************************************************
//
// FUNCTION     :   void RamRead(BYTE CurrentTransNumber, BYTE msgpkt[], BYTE comm_use, BYTE EvOdd)
// USAGE        :   This function read data from RAM and send it to PC
//
// INPUT        :   BYTE CurrentTransNumber = number of current transaction in the
//                       transaction array SMT_TransArray[]
//                  BYTE msgpkt[] = msgpkt array from SMT message
//                       contains: in the first message of RAM_WRITE command:
//                       BYTES
//                            0 = low byte of command (== 0xC)
//                            1 = hi byte of command (== 0)
//                            2 = low byte of address (Start address of RAM)
//                            3 = hi byte of address  (Start address of RAM)
//                            4 = low byte of Data Size
//                            6 = hi byte of Data Size
//                       This only for first message!!!
//                       For other messages: None!
//                  BYTE comm_use  = SERIAL_USE or DDC2BI_USE
//                  BYTE EvOdd = Even/Odd message count
// OUTPUT       :   None
//
//******************************************************************************
void RamRead(BYTE CurrentTransNumber, BYTE msgpkt[], BYTE comm_use, BYTE EvOdd)
{
   BYTE  B_Count;
   BYTE  B_CurrentMaxLen;
   BYTE  B_YesNoMoreData = 0;
   BYTE  B_MsgLen;

   msgs("RamRead()",0);

   if(comm_use == SERIAL_USE)
      B_CurrentMaxLen = 255;
   else
      B_CurrentMaxLen = 10; // 120;

   if(SMT_TransArray[CurrentTransNumber].B_CurCmd == IDLE_CMD)
   {
      SMT_TransArray[CurrentTransNumber].B_CurCmd = RAM_READ_CMD;
      SMT_TransArray[CurrentTransNumber].Bp_Buff = (BYTE far *)(DWORD)((msgpkt[3] << 8) | msgpkt[2]);
      SMT_TransArray[CurrentTransNumber].BuffSize = (msgpkt[5] << 8) | msgpkt[4];
      SMT_TransArray[CurrentTransNumber].W_Count = 0;

      if(SMT_TransArray[CurrentTransNumber].BuffSize < (B_CurrentMaxLen - 5))
      {
         B_MsgLen = SMT_TransArray[CurrentTransNumber].BuffSize + 5;
      }
      else
      {
         B_MsgLen = B_CurrentMaxLen;
         B_YesNoMoreData = YES_NO_MORE_DATA;
      }

      msgs("Bp_Buff: 0x%x", (WORD) SMT_TransArray[CurrentTransNumber].Bp_Buff);
      msgs("BuffSize: 0x%x", SMT_TransArray[CurrentTransNumber].BuffSize);

   }
   else
   {
      if((SMT_TransArray[CurrentTransNumber].BuffSize - SMT_TransArray[CurrentTransNumber].W_Count) < (B_CurrentMaxLen - 5))
      {
         B_MsgLen = (SMT_TransArray[CurrentTransNumber].BuffSize - SMT_TransArray[CurrentTransNumber].W_Count) + 5;
      }
      else
      {
         B_MsgLen = B_CurrentMaxLen;
         B_YesNoMoreData = YES_NO_MORE_DATA;
      }
   }

   // Sending response:
   OutMsg.len = B_MsgLen;
   OutMsg.cmd = SMT_Message;
   OutMsg.BUF[0] = EvOdd | B_YesNoMoreData;
   OutMsg.BUF[1] = SMT_TransArray[CurrentTransNumber].ID;

   for(B_Count = 2; B_Count < (B_MsgLen - 3); B_Count++)
   {
      OutMsg.BUF[B_Count] = SMT_TransArray[CurrentTransNumber].Bp_Buff[(SMT_TransArray[CurrentTransNumber].W_Count + B_Count - 2)];
      //msg("Sended byte = 0x%X",OutMsg.BUF[B_Count]);
   }

   SMT_TransArray[CurrentTransNumber].W_Count += B_Count - 2;

   gm_CommsSendReply((gmt_MsgStruct far*)&OutMsg, comm_use);

   if(B_YesNoMoreData != YES_NO_MORE_DATA)
   {
      SMT_TransArray[CurrentTransNumber].B_CurCmd = IDLE_CMD;
      msgs("RamRead Completed",0);
   }
   else
   {
      msgs("RamRead continue",0);
   }
}

//******************************************************************************
//    Sample of Hi-Lewel SMT function:
//******************************************************************************
//
// FUNCTION     :   void RegisterRead(BYTE CurrentTransNumber, BYTE msgpkt[], BYTE comm_use, BYTE EvOdd)
// USAGE        :   This function read data from register and send it to PC
//
// INPUT        :   BYTE CurrentTransNumber = number of current transaction in the
//                       transaction array SMT_TransArray[]
//                  BYTE msgpkt[] = msgpkt array from SMT message
//                       contains: in the first message of RAM_WRITE command:
//                       BYTES
//                            0 = low byte of command (== 0xD)
//                            1 = hi byte of command (== 0)
//                            2 = low byte of address (Register address)
//                            3 = hi byte of address  (Register address)
//                  BYTE comm_use  = SERIAL_USE or DDC2BI_USE
//                  BYTE EvOdd = Even/Odd message count
// OUTPUT       :   None
//
//******************************************************************************
void RegisterRead(BYTE CurrentTransNumber, BYTE msgpkt[], BYTE comm_use, BYTE EvOdd)
{
   WORD  W_RegAddr;
   BYTE  B_RegData;


   W_RegAddr = (msgpkt[3] << 8) | msgpkt[2];
   B_RegData = gm_ReadRegByte(W_RegAddr);

   msgs("RegisterRead()  Addr = 0x%X ",W_RegAddr);
   msgs("RegisterRead()  Data = 0x%X",B_RegData);

   // Sending response:
   OutMsg.len = 7;
   OutMsg.cmd = SMT_Message;
   OutMsg.BUF[0] = EvOdd;
   OutMsg.BUF[1] = SMT_TransArray[CurrentTransNumber].ID;
   OutMsg.BUF[2] = B_RegData;  //& 0xFF
//   OutMsg.BUF[3] = (B_RegData >> 8) & 0xFF;

   gm_CommsSendReply((gmt_MsgStruct far*)&OutMsg, comm_use);
}

//******************************************************************************
//    Sample of Hi-Lewel SMT function:
//******************************************************************************
//
// FUNCTION     :   void RegisterWrite(BYTE CurrentTransNumber, BYTE msgpkt[], BYTE comm_use, BYTE EvOdd)
// USAGE        :   This function recieve data from PC write it to register and
//                  response send it to PC
//
// INPUT        :   BYTE CurrentTransNumber = number of current transaction in the
//                       transaction array SMT_TransArray[]
//                  BYTE msgpkt[] = msgpkt array from SMT message
//                       contains: in the first message of RAM_WRITE command:
//                       BYTES
//                            0 = low byte of command (== 0xD)
//                            1 = hi byte of command (== 0)
//                            2 = low byte of address (Register address)
//                            3 = hi byte of address  (Register address)
//                            4 = low byte of Data
//                            5 = hi byte of Data
//                  BYTE comm_use  = SERIAL_USE or DDC2BI_USE
//                  BYTE EvOdd = Even/Odd message count
// OUTPUT       :   None
//
//******************************************************************************
void RegisterWrite(BYTE CurrentTransNumber, BYTE msgpkt[], BYTE comm_use, BYTE EvOdd)
{
   WORD  W_RegAddr;
   WORD  B_RegData;


   W_RegAddr = (msgpkt[3] << 8) | msgpkt[2];
   B_RegData = msgpkt[4]; //(msgpkt[5] << 8) | msgpkt[4];
   gm_WriteRegByte(W_RegAddr, B_RegData);

   msgs("RegisterWrite()  Addr = 0x%X ", W_RegAddr);
   msgs("RegisterWrite()  Data = 0x%X",B_RegData);

   // Sending response:
   OutMsg.len = 5;
   OutMsg.cmd = SMT_Message;
   OutMsg.BUF[0] = EvOdd;
   OutMsg.BUF[1] = SMT_TransArray[CurrentTransNumber].ID;

   gm_CommsSendReply((gmt_MsgStruct far*)&OutMsg, comm_use);
}

//******************************************************************************
// SMT functions:
//******************************************************************************
//******************************************************************************
//
// FUNCTION     :   void SMT_OpenTransaction(BYTE msgpkt[], BYTE comm_use, BYTE EvOdd)
// USAGE        :   This function open transaction and send response to PC
//
// INPUT        :   BYTE msgpkt[] = msgpkt array from SMT message
//                  BYTE comm_use  = SERIAL_USE or DDC2BI_USE
//                  BYTE EvOdd = Even/Odd message count
// OUTPUT       :   None
//
//******************************************************************************
void SMT_OpenTransaction(BYTE msgpkt[], BYTE comm_use, BYTE EvOdd)
{
   WORD W_Port;
   WORD W_Index;
   BYTE CurrentTransNumber;
   BYTE B_Count;
   static BYTE B_LastId = 0xFF;

	//Initiate SMT_TransArray if it is first transaction.
    //TODO: Initiator must be modified if more possible transaction statuses are added
	if((SMT_TransArray[0].B_Status!=TRANSACTION_CLOSED) &&
	   (SMT_TransArray[0].B_Status!=TRANSACTION_OPENED))
	{
		for(B_Count =0; B_Count <MAX_TRANSACTION_NUMBER; B_Count++)
		{
			SMT_TransArray[B_Count].ID = 0xFF;
			SMT_TransArray[B_Count].B_Status = TRANSACTION_CLOSED;
		}
	}		

	// Look for vacant transaction context
   for(B_Count =0; B_Count <MAX_TRANSACTION_NUMBER; B_Count++)
   {
      if(SMT_TransArray[B_Count].B_Status == TRANSACTION_CLOSED)	//.ID == 0)
      {
         CurrentTransNumber = B_Count;
         break;
      }
   }
   // Handle no vacant context situation
   if(B_Count == MAX_TRANSACTION_NUMBER)
   {
      // Send Failed
      msgs("ERROR: No Vacant Transaction",0);
      SMT_SendFailed(comm_use, EvOdd, GENERIC_ER);
      return;
   }

	//extract port number from received packet
	//and check port's valdidity
   W_Port = ((WORD)msgpkt[0] << 8) | (WORD)msgpkt[1];       // orginal setting
//   W_Port = ((WORD)msgpkt[1] << 8) | (WORD)msgpkt[0];       // for testing only

	if(W_Port >= MAX_SMTPORT)
	{
		msgs("Port 0x%X is invalid ",W_Port);
		SMT_SendFailed(comm_use, EvOdd, GENERIC_ER);
		return;
	}
	
	//look for port entry in the handlers LUT 
	for(W_Index =0; SMT_Port2HandlerTable[W_Index].PortID != MAX_SMTPORT; W_Index++)
	{
		if(SMT_Port2HandlerTable[W_Index].PortID == W_Port) 
		{
			if(SMT_Port2HandlerTable[W_Index].Fp_SMT_MsgHandler != NULL_PTR)
			{
				msgs("Port 0x%X is supported",W_Port);
				break;
			}
			else
			{
				msgs("Port 0x%X is not supported",W_Port);
				SMT_SendFailed(comm_use, EvOdd, GENERIC_ER);
				return;
			}
		}
	}

	if(W_Index == MAX_SMTPORT)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品电影一区二区三区| 欧美怡红院视频| 久久色.com| 五月天欧美精品| 91丨九色porny丨蝌蚪| 综合久久久久久久| 91精品国产乱码| 欧美军同video69gay| 亚洲国产你懂的| 欧美一区二区三区在线电影| 美女在线视频一区| 久久影院午夜片一区| zzijzzij亚洲日本少妇熟睡| 亚洲免费资源在线播放| 欧美色视频在线观看| 日本午夜一本久久久综合| 成人精品电影在线观看| 亚洲私人影院在线观看| 欧美日韩极品在线观看一区| 久久精品久久综合| 91同城在线观看| 亚洲国产精品一区二区久久| 日韩欧美一卡二卡| 成人午夜短视频| 三级亚洲高清视频| 99久久久国产精品| 丝袜亚洲精品中文字幕一区| 精品国产91洋老外米糕| 99re这里只有精品首页| 青娱乐精品在线视频| 久久夜色精品国产噜噜av| 91丨九色porny丨蝌蚪| av电影在线观看一区| 欧美极品aⅴ影院| 欧美视频你懂的| 国产福利一区二区三区| 亚洲成人动漫在线免费观看| 国产日韩精品视频一区| 在线亚洲一区二区| 国产一区二区免费视频| 亚洲一区二区成人在线观看| 久久先锋影音av鲁色资源| 色婷婷久久一区二区三区麻豆| 国产精品88av| 欧美久久高跟鞋激| 波波电影院一区二区三区| 日本中文字幕不卡| 亚洲综合av网| 国产精品伦一区二区三级视频| 91.成人天堂一区| 亚洲国产日日夜夜| 国产精品久久久久久亚洲伦| 精品国产亚洲一区二区三区在线观看| 91色九色蝌蚪| 国产69精品久久久久毛片| 免费国产亚洲视频| 一区二区国产视频| 国产精品看片你懂得| 精品久久国产97色综合| 欧美三级视频在线| 色呦呦网站一区| 成人午夜视频免费看| 国产在线麻豆精品观看| 精品一区二区三区影院在线午夜| 亚洲一区二区三区四区在线免费观看| 国产欧美精品一区二区三区四区| 日韩视频在线永久播放| 欧美日韩中文字幕精品| 青青草精品视频| 日韩av电影免费观看高清完整版| 亚洲一区二区三区四区在线| 1024成人网色www| 国产精品久久久久久户外露出 | 国产一区二三区| 午夜影院在线观看欧美| 一级女性全黄久久生活片免费| 成人免费在线视频观看| 欧美日韩亚洲不卡| 欧美偷拍一区二区| 欧美在线一二三四区| 在线观看成人免费视频| 色一情一乱一乱一91av| 国产精品护士白丝一区av| 国产欧美一区二区三区鸳鸯浴| 久久久亚洲高清| 国产校园另类小说区| 日韩精品一区二区三区视频播放| 日韩女优制服丝袜电影| 精品久久久久久久一区二区蜜臀| 欧美大度的电影原声| 日韩丝袜情趣美女图片| 久久综合狠狠综合| 国产三级精品在线| 亚洲人成电影网站色mp4| 国产99久久久国产精品潘金| 亚洲精品va在线观看| 亚洲大片免费看| 美女诱惑一区二区| 国产真实乱子伦精品视频| 国产激情91久久精品导航 | xnxx国产精品| 国产欧美一区二区三区鸳鸯浴 | 国产精品1区2区| 99国内精品久久| 欧美日韩中文另类| 精品国产一区二区三区av性色| 国产欧美精品区一区二区三区| 亚洲男同性视频| 亚洲二区在线观看| 久久久不卡影院| 亚洲欧美激情一区二区| 日韩不卡手机在线v区| 韩国成人在线视频| 99久久综合99久久综合网站| 在线观看日产精品| 日韩一卡二卡三卡四卡| 欧美国产激情二区三区| 亚洲一区精品在线| 亚洲综合免费观看高清完整版| 亚洲成人黄色小说| 国产精一区二区三区| 91丨九色丨国产丨porny| 欧美一三区三区四区免费在线看| 久久久国产综合精品女国产盗摄| 亚洲成人av免费| 国产91丝袜在线观看| 欧美日韩成人一区二区| 国产欧美精品国产国产专区| 亚洲成av人影院| 成人免费av在线| 日韩精品最新网址| 日韩毛片高清在线播放| 久久国产福利国产秒拍| 日本福利一区二区| 国产喷白浆一区二区三区| 亚洲大片在线观看| 99久久婷婷国产综合精品电影| 国产精品一区二区果冻传媒| 欧美男男青年gay1069videost| 欧美国产乱子伦| 日本不卡123| 欧美三级电影在线观看| 中文字幕一区二区三区在线播放 | 视频精品一区二区| 色综合一区二区三区| av毛片久久久久**hd| 久久久久久久性| 另类成人小视频在线| 欧美伦理电影网| 亚洲精品一二三区| 国产99久久久国产精品| 精品国产乱码久久久久久牛牛| 午夜日韩在线电影| 在线视频欧美精品| 亚洲免费观看高清完整版在线观看熊| 国产乱码精品一区二区三| 日韩午夜在线观看| 五月天激情综合| 欧美日韩精品系列| 亚洲国产成人av网| 在线观看中文字幕不卡| 夜夜亚洲天天久久| 欧美一二三四在线| 777午夜精品视频在线播放| 一二三区精品视频| 色88888久久久久久影院按摩| 一区在线播放视频| 9i在线看片成人免费| 久久久久久久久久久99999| 看电影不卡的网站| 欧美α欧美αv大片| 另类小说综合欧美亚洲| 91精品国产色综合久久不卡电影| 日韩激情一区二区| 日韩美女在线视频| 国产一区二区福利| 久久九九影视网| 国产精品亚洲视频| 中文字幕亚洲区| 色先锋aa成人| 亚洲午夜在线电影| 欧美一级片免费看| 久久国产乱子精品免费女| 久久综合色天天久久综合图片| 国产午夜精品美女毛片视频| 成人丝袜18视频在线观看| 亚洲天堂久久久久久久| 日本二三区不卡| 日韩激情视频网站| 久久久久久99久久久精品网站| 国产99久久久国产精品潘金 | 99热99精品| 精品福利av导航| 国产成人精品一区二区三区四区 | 国产不卡一区视频| 亚洲天堂免费看| 91精品国产91久久久久久一区二区| 极品美女销魂一区二区三区免费| 国产网红主播福利一区二区| 色婷婷亚洲综合|