DIMM Programming 2015.10.19 21:25

DIMM

Mag V DIMM configuration rev 21 Hynix DWS 141205.xlsx

 

 

 

getdumpsM5.zip

 

 

IpcCmd.exe

 

AUX INTERLOCK Programming 2015.09.04 14:33

#include "tester.h"

//============================================================================
// AUX Supply checker code
int get_auxsupply_state( int apb ) {

 CString cmd;
 cmd.Format( "pccmd.exe -t apb%d -b \"get auxsupply_state\"", apb );
 char state[1024] = {0};

 SECURITY_ATTRIBUTES sa = {0};
 sa.nLength = sizeof(SECURITY_ATTRIBUTES);
 sa.bInheritHandle = TRUE;

 int maxtrys = 3;// Max number of times to retry on failure
 int timeout = 5;// Delay between retrys in seconds
 static int trys = 0;// Retry counter

 //Syslog mysyslog;

 HANDLE rp, wp;
 if( CreatePipe( &rp, &wp, &sa, 0 ) ) { // Last 0 means use default buffer size

  SetHandleInformation(rp, HANDLE_FLAG_INHERIT, 0);

  STARTUPINFO si = { 0 };
  PROCESS_INFORMATION pi = { 0 };
  si.cb = sizeof( STARTUPINFO );
  si.dwFlags |=  STARTF_USESTDHANDLES;
  si.hStdOutput = wp;
  si.hStdError = wp;

  CreateProcess( NULL, cmd.GetBuffer( cmd.GetLength() ), NULL, NULL, TRUE, CREATE_NO_WINDOW|DETACHED_PROCESS, NULL, NULL, &si, &pi );
  CloseHandle( pi.hThread );
  CloseHandle( pi.hProcess );
  CloseHandle( wp );

  DWORD br;
  ReadFile( rp, state, sizeof(state), &br, NULL );
  CloseHandle( rp );

  if ( state[0] != '0' && state[0] != '1' ) {
   warning( state );
   if ( ++trys <= maxtrys ) {
    warning( "Retry %d of %d...", trys, maxtrys );
    Delay( timeout );
    return get_auxsupply_state( apb );
   }
   else {
    warning( "Failed to communicate with ABP%d after %d retrys.", apb, maxtrys );
    warning( "Please verify APB%d operation and try again.", apb );
   }
  }
 }

 // Reset retry counter
 trys = 0;

 // This will return zero when the value of status is '0'
 // AND when the value of status cannot be converted to
 // an int, such as when pccmd.exe returns an error message
 // or cannot be found.
 return atoi( state );
}

VOID_VARIABLE( Aux_Supply_Checker, "" )
{
 output( "Executing Aux_Supply_Checker" );

 int aux1 = get_auxsupply_state( 1 );
 int aux2 = get_auxsupply_state( 2 );

 if ( aux1 == 0 || aux2 == 0 ) {
  CString warnMsg = vFormat( "APB%s AUX supplies have power faulted.\n\n", aux1 + aux2 == 0 ? "1 and APB2" : aux1 == 0 ? "1" : "2" );
  warnMsg += "Check the loadboard and/or probecard for problems.\n\n";
  warnMsg += "Also check that the APB is responding and operating normally.\n\n";
  warnMsg += "Finally, check that the MPC has not faulted which can result in AUX power down.\n\n";
  warnMsg += "When ready, please press the Green Site Power button in HostMonView to reset the AUX supplies.\n\n";
  warnMsg += "Then either press Retry to continue or Cancel to unload the program.";
  warning( warnMsg );
  if ( message_box ( MB_RETRYCANCEL, warnMsg ) == IDCANCEL )
   remote_set( "ui_Close", 0, -1, TRUE, INFINITE );
 }

 output( "APB1 AUX Supply reports AUXSUPPLY_STATE is %d", aux1 );
 output( "APB2 AUX Supply reports AUXSUPPLY_STATE is %d", aux2 );
}

INITIALIZATION_HOOK( Suppress_Aux_Supply_Checker_timeout )
{
 struct local {
  static int message_box_interceptor( LPCTSTR text, UINT type ) { return IDRETRY; }
 };
 intercept_message_box( local::message_box_interceptor );

 remote_set( "ui_AddInterceptedDialogRegexp", "Aux_Supply_Checker", -1, TRUE, INFINITE );
}

/*
AFTER_TESTING_BLOCK( Wait_for_Aux_Supply_Checker )
{
 if ( site_num() == 1 ) {
  //DUT_DefaultState();
  remote_set( Aux_Supply_Checker, 0, 0, TRUE, INFINITE );
 }
}
*/


//#############################################################################
//#############################################################################
//#############################################################################
//#############################################################################
//#############################################################################
//#############################################################################
// NEW CODE!!!!
//#############################################################################
//#############################################################################
//#############################################################################
//#############################################################################
//#############################################################################
BOOL_VARIABLE(PGM_UNLOADED, TRUE, "") {}
VOID_VARIABLE(AUX_CHECKER_LOOP, "")
{
 PGM_UNLOADED = FALSE;
 while(!PGM_UNLOADED)
 {
  remote_set( Aux_Supply_Checker, 0, 0, TRUE, INFINITE );
  Sleep(10 * 1000);  // 10 secs
 }
 output("EXIT AUX_CHECKER_LOOP!!");
}

VOID_VARIABLE(ui_ProgLoaded, "")
{
 remote_set(AUX_CHECKER_LOOP, 0, 0, TRUE);
}

VOID_VARIABLE(ui_ProgUnLoaded, "")
{
 PGM_UNLOADED = TRUE;
}

 


// dialog IPC(memory share)

mapHandle = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE, FALSE, "oitool");

if (!mapHandle)

{

log("IPC map OpenFileMapping failed.");

output("IPC map OpenFileMapping failed\n");

AfxMessageBox("Map initialize failed(OpenFileMapping)");

Exit();

return;

}

else

{

mapData = (CData*)MapViewOfFile(mapHandle, FILE_MAP_WRITE | FILE_MAP_READ, 0, 0, 0);

if (!mapData)

{

log("IPC map MapViewOfFile failed.");

output("IPC map MapViewOfFile error");

AfxMessageBox("Map initialize failed(MapViewOfFile)");

Exit();

return;

}

else

{

para = mapData->para;

lot_no = mapData->lotno;

ini_manager.SetPath(mapData->programPath);

}

}



http://th30z.netsons.org/2008/08/123/
doxygen 변환 툴 Programming 2010.08.29 14:26
1. doxygen 다운로드 후 설치

2. 아래와 같이 설정

3. Run 탭에서 Run Doxygen 버튼 투른후 Show HTML 클릭하면 페이지로 이동한다.
  1    2    3    4    5    6   -   1    2     3   4     5     6      7   (주민등록번호)
  2    3    4    5    6    7       8    9     2    3     4     5          (승수)
 n1  n2   n3  n4  n5  n6      n7  n8   n9  n10  n11  n12

각 자릿수에 지정된 승수를 더한 값을 N 이라고 하면,

N = n1 + n2 + n3 + ... +n12

N을 11로 나눈 나머지를 11에서 뺀 수가 주민등록번호 마지막 자릿수와 일치하면
정상적인 주민등록번호이다.

11 - (N%11) = 마지막 자릿수

N의 값이 11로 나누어 떨어지거나 나머지가 1이라면 위 식의 값을 10 또는 11이 된다.
마지막 자릿수는 1자리이기 때문에 이런 경우에는 비교할때 같이 않은 것으로
처리되기 때문에 위 식을 다시 한번 10으로 나누어 그 나머지를 취하여
마지막 자릿수와 비교해야한다. 

(11 - (N%11)) % 10  = 마지막 자릿수
프로그래머란? Programming 2009.09.28 18:36
프로그래머는 다른 사람도 이해할 수 있도록 자신의 작업을 문서로

만들려고 노력하고, 다른 사람들이 자신이 한 것을 바탕으로 또

다른 것을 만들 수 있도록 자신의 작업을 설계하려고 노력한다.

이뿐이 아니라, 프로그래머는 쉬지 않고 똑딱대는 프로젝트 일정

시계의 초침에 굴하지 않고도 이 모든 일들을 해내기 위해 노력한다.

프로그래머는 매일매일 작은 기적을 만드는 것이다.

참 어려운 직업이다.

- in 실용주의 프로그래머.. -