삽질기행/잡다정보2008. 5. 23. 01:07

두가지 컴포넌트가 포함된 project의 sdk가 필요로 할 수 있다.
AYG Shell 과 Network..뭐더라 -_-

Standard SDK 소스와 custom sdk를 비교해 봤을 땐 거의 무조건 있어야 되는 것으로 보인다.

AYG Shell 은 라이센스가 Professional 라서 Core를 쓰고자 한다면 골치가 좀 아플 듯.


Windows Embedded CE 6.0 부터는 아예 MFC 컴포넌트가 제외되어서 직접 라이브러리를 추가해야하는 걸로 봐선...

마소에서 '이제 MFC 그만 좀 쓰셈!' 하는 것으로 보인다. (MFC 좋은데... 우쒸... 버그가 꽤 있어서 그렇지..)

그런데 확실히 .net 의 퍼포먼스가 많이 좋아졌다.(컴퓨터가 좋아진건가?) 쉽고. 편하고.

.Net Micro Framework 도 써보고픈데..

보드 안사고 회사 보드에서 써볼라믄 이거 또 내가 포팅해야될까봐서리... 시간도 없는데 귀찮아서 -_-;

Posted by freezn
삽질기행/잡다정보2008. 5. 23. 01:01

Windows 에서 Wide Character 는 UNICODE 를 의미한다.

--------------------------------

매크로
_T("ABC")
TEXT("ABC")

"ABC" 대신 위에 것들을 쓰자.
UNICODE로 컴파일하면 UNICODE문자열로, ASCII로 컴파일하면 ASCII 문자열로 인식한다.

--------------------------------

windows (ce포함)용 c/c++의 string 처리에서 알아두면 좋은 거.

문자열의 길이를 재는 함수라면?
strlen() : ASCII용 문자열 길이 쟤는 함수
wcslen() : UNICODE용 문자열 길이 쟤는 함수
_tcslen() : 환경에 맞추어지는 매크로

뭐 일단 _mcslen() 도 있긴하다. (MB환경에서 strlen을 호출하면 이쪽으로 연결할걸?)

다른 함수들도 마찬가지다.

strXXXX() 함수들이 wcsXXXX()로, tcsXXXX() 로 바꾸어 쓰면 된다.

strtol : ASCII 문자열에서 long 값으로 변환 (atoi와 비슷하지만 진수 지정 가능)
wcstol : UNICODE ~~~
_tcstol : 환경 ~~~

-------------------------------

그럼 다 지원하려면 가장 깔끔한 방법은?
tcsXXXX() 시리즈를, char 대신 매크로 TCHAR 쓰는거.

물론 덕분에 골치아픈 문제도 가끔 발생한다는거..

-------------------------------

WideCharToMultiByte() : UNICODE -> ASCII

MultiByteToWideChar() : ASCII -> UNICODE

--------------------------------

char : ASCII
wchar_t : UNICODE
TCHAR : 환경 따라가는 매크로

--------------------------------

CString은 내용이 wchar일 수 도, char일 수 도 있음에 유의할 것.

--------------------------------

eVC++ 이나 SmartDevice(WinCE)용으로 사용하는 Visual Studio 시리즈는 기본설정이 UNICODE 환경으로 되어있다.
ASCII를 쓰고 싶다면 컴파일설정 (프로젝트 속성?) 을 바꾸어 주어야한다.

--------------------------------

아... Windows Embedded CE 6.0 부터는 기존 문자열 함수들에 문제가 있을 수 있다고 해서...
safe 시리즈를 선보였다. 젠장.

예를들어 strcpy 라면 strcpy_s 이런식이었던 듯...
대충 봤을 때 문자열 종료 문자 '\0'가 문제가 있다고 파악한 모양이다.

Posted by freezn
익스플로러 외에 브라우져의 접근이 차단되어있거나 세션등으로 막은 경우 헤더조작이 까다로울 수 있습니다.

저 같은 경우 첫페이지에서 세션에 어떤 값을 넣어 첫페이지를 접근한 후 접속한 것이 아닌 사용자를 차단하는 사이트에서 소스를 얻을 필요가 있었는데요.

빨리 테스트해봐야해서 C#으로 웹브라우져 컴포넌트를 동원해서 작업하는 등 별 삽질을 다 했었습니다.

그.런.데

PHP에서 COM을 이용할 수 있는 함수가 있음을 알고 좌절했습니다. OTL

간단히 함수로 정리했습니다.
자... 보시죠(...)


예제 :
function getHTMLSrc( $url ) {
    // alloc COM (IE)
    $ie = new COM("InternetExplorer.Application");
    $ie->Visible = false;

    $ie->Navigate($url);
    while($ie->readyState!=4); // Loading Complete 확인
   
    $srcHTML = $ie->Document->documentElement->outerHTML;

    // free object
    $ie->Quit();
    unset($ie);

    return $srcHTML;
}


필요사항은

PHP5 이상 Windows version.
.Net 컴포넌트는 PHP5 와 .Net runtime.

뭐 결국 윈도우에 PHP5를 깔고 닷넷컴포넌트는 닷넷프레임워크만 깔아주면 된다는 거죠.

VB나 C#에서 사용하는 것이나 진배없는 속성들에 심하게 당황했습니다. PHP개발자들 대단하네요 -_-;;

COM클래스를 사용하게 되면...
MS Word, MS Excel, mdb 을 비롯한 상용 COM등 COM으로 만들어진 대부분의 처리가 가능한 것 같습니다 OTL

----------------------

예전에 써놨던 포스팅을 이사하면서 실수로 날렸었는데 "체리필터"님의 블로그에서 발견하고 역수입 -_-;;

다만 경험상 저렇게 ie object를 가져다 쓰고 해제해버리면 apache를 restart 시킬때까지 다시 살아나질 않았었다.
해서 최대한 해제하지 않고 한번 생성해서 우려먹었던 기억이...
Posted by freezn
관련 함수
OALArgsQuery

관련 구조체
BSP_ARGS

관련 상수
IMAGE_SHARE_ARGS_ 시리즈 : 부트로더와 커널이 공유할 메모리(램) 영역의 주소
BSP_ARGS_QUERY_ 시리즈 : OALArgsQuery 에 넘겨줄 인자. BSP_ARGS 구조체의 내용에서 선택할 항목

버전
Windows Embedded CE 6.0 (R2아님)

----------------
작업 사유:
이더넷 칩셋에 보드마다 고유의 MAC Address 를 부여해야함.
하지만 eep rom이 달려있지 않음. (있어야 하는데 -_-)
사용 중인 플래시는 NAND.

고민1 : '그러면 이더넷 드라이버에 NAND에 엑세스 하는 라이브러리의 내용을 추가해야할까?'
(NOR였다면 별다른 고민을 하지 않았겠지만,)
거부 사유1-1 : '작업할 게 너무 많아진다.'
거부 사유1-2 : '이더넷 드라이버의 최종 사이즈가 너무 커진다.'

고민2 : '그러면 어차피 부트로더에서 세팅하는 mac addr을 바로 커널에게 전달해주면?'
- 오.. 이거 될 것 같다.
- 리눅스에서는 "부트파라미터"로 사용한다고 함.
- 플래시에는 부트로더에서 기록하고 부팅시에 부트로더가 읽어놓은 내용을 커널로 전달하게 된다.

----------------

작업 내용:
- BSP_ARGS_QUERY_ 시리즈가 있는 헤더파일을 찾아서, 상수 BSP_ARGS_QUERY_ETHMAC 를 추가
- BSP_ARGS 구조체를 찾아서 저장할 내용 변수 추가. (ex. unsigned char   ethMac[6]; )
- OALArgsQuery 함수 구현부를 찾아서 switch case 내용에 BSP_ARGS_QUERY_ETHMAC 항목을 추가.
  case BSP_ARGS_QUERY_ETHMAC:
   pData = &pArgs->ethMac;
- 부트로더 main.c 에서 전역변수 unsigned char g_ethMac; 추가.
   OEMPlatformInit 함수에 g_ethMac = (unsigned char *)OALArgsQuery( BSP_ARGS_QUERY_ETHMAC); 추가
   OEMLaunch 에서 g_ethMac[0]~[5] 에 mac 저장
- 이더넷 드라이버
   #include <bsp_args.h>
   #include <image_cfg.h>
   #include "Oal_args.h"
- init 에서
   = BSP_ARGS *pArgs = (BSP_ARGS*)IMAGE_SHARE_ARGS_UA_START;
   = unsigned char* pMac = (unsigned char*)&pArgs->ethMac;
   = 이더넷 칩의 mac addr 레지스터에 pMac 의 값 기록.

- 끝 -


도움받은 곳 : W.E.E.G. http://cafe.naver.com/wincepro/12019

Posted by freezn
http://blog.naver.com/wizard412.do?Redirect=Log&logNo=140048570456

일단 wizard412님의 방법으로 올리니 간단... (한걸 한참 헤멨다 OTL)

레퍼런스보드에 PowerButton과 인터럽트가 공유되는 문제가 있다...
이더넷 인터럽트를 쓰던 파워버튼 인터럽트를 쓰던 둘중 하나만 된다.

nand에서 부트로더에서 지정한 맥어드레스 사용하도록 수정 중...

작업 끝나면 마저 정리해서 올려야겠다.

이놈에 건 PXA시리즈랑 뭐 이리 다른 건지 -_-;

역시 디버깅은 printf, fprintf, retailmsg 등등이 짱!
Posted by freezn
삽질기행/잡다정보2008. 5. 13. 19:59

platform : BSP
project : BSP로 만들어낸 project

bib
TAB name : MODULES

;   Name              Path                                    Memory Type
;   --------------    ----------------------------------  -----------
cs8900.dll    $(_FLATRELEASEDIR)\cs8900.dll   NK SHK


Name : 파일명.
커널의 Windows 디렉토리에 이 파일명으로 적재된다.

Path : 가져올 파일
$(_FLATRELEASEDIR) 은
(your workspace)\~~\RelDir\~~_Release 이다. (혹은 Debug)


Memory Type : 타입
NK : 커널에 적재함
S : 뭐더라?
H : Hidden (파일이 안보인다.)
K : 커널모드 (권한이 커널 권한이 필요한 드라이버나.. 그런 거...)


dat
파일을 배치한다.

Directory("\Windows\LOC_DESKTOP_DIR"):-Directory("Example")
 
"\Windows\바탕 화면"에 "Demo" 디렉토리를 만든다.
여기서 LOC_DESKTOP_DIR 는?
"바탕 화면"을 말하는 locale 단어들. 영문판이라면 Desktop

Directory("\Windows\LOC_DESKTOP_DIR\Example"):-File("Test1.lnk","\Windows\Test1.lnk")
\Windows\Test1.lnk 파일을 \Windows\LOC_DESKTOP_DIR\Example 에 Test1.lnk 라는 이름으로 배치한다.

Posted by freezn


 BITMAPFILEHEADER bmFileHeader;
 BITMAPINFOHEADER bmInfoHeader;

 // BMP 헤더
 bmFileHeader.bfSize  = sizeof(BITMAPFILEHEADER);
 bmFileHeader.bfType  = 0x4D42;
 bmFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
 
 bmInfoHeader.biSize    = sizeof(BITMAPINFOHEADER);
 bmInfoHeader.biWidth   = 320; // 너비
 bmInfoHeader.biHeight   = 240; // 높이
 bmInfoHeader.biPlanes   = 1;
 bmInfoHeader.biBitCount   = 24; // 색상 비트
 bmInfoHeader.biCompression = 0;
 bmInfoHeader.biSizeImage = bmInfoHeader.biWidth * bmInfoHeader.biHeight * (bmInfoHeader.biBitCount/8);

 bmInfoHeader.biXPelsPerMeter = 0;
 bmInfoHeader.biYPelsPerMeter = 0;
 bmInfoHeader.biClrUsed = 0;
 bmInfoHeader.biClrImportant = 0;

 // BMP는 아래에서 위로 저장되는 형식이기 때문에 순서대로 저장하면 뒤집히므로 파일로 저장할 데이터를 뒤집기
 SPixel* rgbTemp = new SPixel[BUFSIZE]; // 파일저장할 데이터를 보관할 임시공간
 for(int i=0; i<BUFSIZE; i++) {
  rgbTemp[i].r = g_rgb[BUFSIZE-1-i].r;
  rgbTemp[i].g = g_rgb[BUFSIZE-1-i].g;
  rgbTemp[i].b = g_rgb[BUFSIZE-1-i].b;
 }

 // 파일로 저장
 CFile file;
 file.Open(_T("파일명"), CFile::modeNoTruncate | CFile::modeCreate | CFile::modeReadWrite );
 file.Write(&bmFileHeader, sizeof(BITMAPFILEHEADER));
 file.Write(&bmInfoHeader, sizeof(BITMAPINFOHEADER));
 file.Write(rgbTemp, bmInfoHeader.biSizeImage);
 file.Close();
 
 delete rgbTemp;

 AfxMessageBox(strFilename + _T("\nwas saved"));

Posted by freezn

void Conv16bit565_TO_24bitRGB(USHORT rgb565, BYTE *r, BYTE *g, BYTE *b)
{
 // 16비트로 RGB를 표현하는 RGB 565에서 R,G,B값을 각각 분리해낸다.
 // 각 비트를보면 다음과 같이 되어있다.
 // RRRRRGGGGGGBBBBB (R: Red, G: Green, B: Blue)

 BYTE red = (rgb565 & 0xF800) >> 11;
 BYTE green = (rgb565 & 0x7E0) >> 5;
 BYTE blue = (rgb565 & 0x1F);

 *r = red << 3;
 *g = green << 2;
 *b = blue << 3;
}

그러므로 24bit -> 16bit -> 24bit 식으로 변환해보면 red, green, blue에서 각각 3,2,3 비트씩 손실이 일어나는 것임을 알 수 있다.
(이렇게 단순히 비트를 죽이는 방법 말고 다른 방법을 쓴다면 조금 더 살릴 수 있을 진 모르겠다.)
RRRRRRRRGGGGGGGGBBBBBBBB 에서
XXXRRRRRXXGGGGGGXXXBBBBB 으로


16bit rgb 555 에서는?

XRRRRRGGGGGBBBBB 이렇게 16bit를 구성 (X는 더미비트)

32bit XRGB 에서는?
XXXXXXXXRRRRRRRRGGGGGGGGBBBBBBBB

Posted by freezn
삽질기행/잡다정보2008. 4. 19. 12:22

GPLR (Level)
Read Only
해당 핀의 High/Low 상태 확인 (해당 비트가 1이면 High)

GPDR (Direction)
Read/Write
핀의 경로 설정. 0이면 Input, 1이면 Output.

GPSR (Set) / GPCR (Clear)
Write Only (Read도 되던가?ㅡ.ㅡ;)
GPSR - 핀에 High를 Set함(1로 만듬), GPCR의 반대 기능
GPCR - 핀을 Low로 떨어뜨림(0으로 만듬), GPSR의 반대 기능

GRER (Rising Edge) / GFER (Falling Edge)
Write Only (Read도 되던가?ㅡ.ㅡ;)
핀 레벨엣지 감시. GRER의 해당 비트를 1로 만들면 Rising을, GFER의 해당 비트를 1로 만들면 Falling을 감시한다. 검출된 결과는 GEDR의 해당 비트가 1로 됨으로 써 알 수 있다.

사용자 삽입 이미지

GEDR (Edge Detect)
Read/Write
GRER/GFER에서 지정한 핀에서 Edge가 확인하면 해당 비트가 1로 바뀐다.
해당 핀의 비트에 1을 주면 Edge가 검출되었다고 1로 세팅되었던 비트가 0으로 clear된다.

GAFR (Alternate Function)
Write Only
이놈만 한 핀당 2비트다.
회로 설계에 따라 어찌할지 정해야한다.
(초짜 SW쟁이라 잘 모르겠다 -_-; 그냥 HW팀에서 해달라는대로 해줬다.)

00 : General Purpose I/O
01 : alternate function 1
10 : alternate function 2
11 : alternate function 3


---------------------------------------------
example.

GPIO핀 하나에 LED를 물렸다.
이 LED를 켜려면?

GPDR의 해당 비트는 1로 되어있어야한다.
그리고 해당 GPSR에 1을 준다.
끄려면?
GPDR의 해당 비트는 1로 되어있어야한다.
그리고 해당 GPCR에 0을 준다.

장치로부터 Level Edge 인터럽트를 받고자 하며, Rising과 Falling 둘다 필요한데 상황에 따라 처리할 내용이 다르다. 구분은 어떻게?
일단 GRER과 GFER을 모두 세팅해놓는다.
GEDR 감시로 인터럽트 발생을 확인한다.
Edge가 발생되면 GPLR로 핀레벨을 확인하여 확인된 Edge가 Rising인지 Falling인지 알 수 있다.

---------------------------------------------

오늘의 잡템.

사용자 삽입 이미지

급조한거지만 비트를 한 눈으로 못읽는 나같은 이들을 위해 만든(사실을 나를 위해-_-;)
2가지 기능을 가진 잡템 -_-;

(GPLR을 예로 들면 GPLR0은 0~31, GPLR1은 32~63을 담당한다.)
핀번호 넣고 gen을 눌러주면 된다.

현재 세팅하는 값을 알기 위한 기능으로 Reg2GPIO -_-;;
GPLR2에서 읽힌 값이 0x80000000 이었다면 이게 몇번 핀들을 의미하는지 알기 위한 기능 ㅡ.ㅡ;;

invalid-file

GPIO Bit 계산기


나말고 다른 사람에게 쓸모가 있을지는 모르겠다 -_-;

----------------------------

아래는 내가 쓰려고 대충 만든것보다 좋아뵈는거 있어서 퍼왔다. ㅎㅎ




(1)해당 비트에 마우스를 가져다가 클릭해 보세요. 값이 변화를 보일 것입니다.
(2)직접 값을 입력하고 싶을 때는 HEX 창이나 DEC창에 값을 입력 한 이후 TEST 버튼을 눌러보세요.
(3)해당 값의 반전(NOT) 을 취하고 싶을 경우 해당 버튼을 누르세요
(4)해당 값을 원하는 수만큼 쉬프트 시키고 싶을 경우 쉬프트 할 비트수를 입력하고 좌/우 화살표(<<, >>)을 눌러 보세요.
(5)두개의 이진값을 &(AND), |(OR), ^(XOR) 합니다.
(6)To Result 버튼은 연산의 결과를 (1)번의 비트표시창으로 연동시켜 줍니다. 눌러보세요. 1번 윈도우의 비트값이 변화를 보일 것입니다.
(7)어드레스 베이스 값에 원하는 오프셋값을 더하고 빼는 것을 도와 줍니다.
(8)연산의 바로 직전 값을 확인 할 수 있도록 해 줍니다.
(9)Mapping Bits 버튼은 비트 값을 파일로 만들어서 INPUT 시킬 수 있는 기능 인데 사용법을 모르겠습니다.

http://www.hongikcom.com/zb/view.php?id=technote&page=2&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=28

Posted by freezn
삽질기행/잡다정보2008. 4. 19. 11:43
A 알파(alpa)
B 브라보(bravo)
C 찰리(charlie)
D 델타(delta)
E 에코(echo)
F 폭스트롯(foxtrot)
G 골프(golf)
H 호텔(hotel)
I 인디아(india)
J 줄리엣(juliett)
K 킬로(kilo)
L 리마(lima)
M 마이크(mike)
N 노벰버(november)
O 오스카(oscar)
P 파파(papa)
Q 퀘백(quebec)
R 로미오(romeo)
S 세라또는 시에라(sierra)
T 탱고(tango)
U 유니폼(uniform)
V 빅터(victor)
W 위스키(whiskey)
X 엑스레이(x-ray)
Y 양키(yangkee)
Z 줄루(zulu)
Posted by freezn