회원 및 비회원 모두 열람이 가능합니다. 최대 업로드 가능한 용량은 20MB 입니다.

안녕하세요. 오드로이드에서 사용하고 있는 2GByte짜리 micro-SD에 raw데이터를 써넣는 부분을

읽어보기 위해서 USB MultiCardReader에 micro-SD를 연결하여 윈도우에서 인식시킨 후

윈도우API프로그램에서 USB로인식된 L: 드라이브를 아래와같이 열어서 읽어보고있습니다.

 

질문1)

SetFilePointer(hStorage,0,NULL,FILE_BEGIN); 0번 섹터에서 2000000까지는 값이 나오는데요..

그이후부터는 아무런값이 안나와서요.. 제가 접근하는 방법이 맞는지 정확한 판단이 안서네요..

micro-SD끝에서부터 9KB정도를 읽어보고 싶어서 그러는데요 잘 안되네요..

 혹시 고수님중 아래와 같은 경험을 해보신 분 계시면 조언부탁드립니다...(아래에코드가있습니다)

 

 

질문2)

S5PC100데이터 시트에 보면 internal Rom에있는 BL0가 OM핀 선택에 따른 장치에 있는 BL1을 internal RAM에 올리고

secure booting이 enable되어있으면 secure boot key값에 따라 BL1의 integrity를 체크한다고 되어있습니다.

만약 integrity check이 통과하면 0x34010으로 점프한다고 되어있네요..

 

그런데 오드로이드는 SD/MMC로 OM핀을 선택한 경우이므로 BL0코드가 micro-SD의 끝에서 9KB를 복사해서

0x34000에 올려놓고 점프하는 것으로 판단됩니다.

그래서 제생각에는 오드로이드 2GB짜리 micro-SD에 하드커널쪽에서 0x34000에서 돌아가는 작은부트로더를

micro-SD맨끝에서 9KB정도 위치에 써넣는 것으로 생각됩니다만... 제가생각하고있는것이 맞는지 고수님들

조언부탁드립니다.  만약 맞다면 그 코드는 하드커널에서 제공하는지 궁금합니다.

 

 

hStorage=CreateFile(\\.\L:, GENERIC_READ|GENERIC_WRITE,//desired access
        FILE_SHARE_READ|FILE_SHARE_WRITE,
        NULL,//
        OPEN_EXISTING,
        FILE_FLAG_NO_BUFFERING|FILE_FLAG_WRITE_THROUGH,
        NULL);
  bStatus=DeviceIoControl(hStorage,
  FSCTL_LOCK_VOLUME,
  NULL,
  0,
  NULL,
  0,
  &nBytesReturned,
  NULL);
 

 bStatus=DeviceIoControl(hStorage,
  FSCTL_DISMOUNT_VOLUME,
  NULL,
  0,
  NULL,
  0,
  &nBytesReturned,
  NULL);
 

 sector_start=0;

 SetFilePointer(hStorage,512*sector_start,NULL,FILE_BEGIN);

 

 if(!ReadFile(hStorage,g512Buffer,512,&nBytesReturned,NULL))
 {
  //Failed

 }

 

 bStatus=DeviceIoControl(hStorage,
  FSCTL_UNLOCK_VOLUME,
  NULL,
  0,
  NULL,
  0,
  &nBytesReturned,
  NULL);

 CloseHandle(hStorage);


이제현

2011.02.17 06:35:34
*.90.137.102

답변 1) 저는 Win32 API에 있는 SetFilePointer 대신에 SetFilePointerEx를 사용하였습니다.

또한 디스크를 열때도 PhysicalDrive로 열어야 전체 섹터를 억세스 할수 있습니다.


답변 2) 아래에 있는 Odroid S5PC100 WiKi를 보시면 됩니다.

http://dev.odroid.com/projects/uboot/#s-8

liky

2011.02.17 06:45:40
*.194.234.114

답변주셔서 감사합니다. 빨리해봐야겠네요^^

liky

2011.02.17 23:35:33
*.194.234.114

말씀하신대로 하니까 값을 제대로 읽어오네요.. 감사합니다.

 

저같은 경우에는 visual studio 6.0으로 작업을 했고요 선언되어있지 않은

IOControl코드를 찾는데 많은 시간을 보냈습니다.

 

혹시나 다른분이 저와 같이 시행착오를 경험하지 않기위해 소스코드를 붙여넣었습니다.

 

typedef struct _DISK_EXTENT

      DWORD DiskNumber; 
      LARGE_INTEGER StartingOffset; 
      LARGE_INTEGER ExtentLength;
} DISK_EXTENT,  *PDISK_EXTENT;

typedef struct _VOLUME_DISK_EXTENTS

      DWORD NumberOfDiskExtents; 
      DISK_EXTENT Extents[ANYSIZE_ARRAY];
} VOLUME_DISK_EXTENTS,  *PVOLUME_DISK_EXTENTS;

#define IOCTL_VOLUME_BASE   ((DWORD)'V')
#define IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS
                  CTL_CODE(IOCTL_VOLUME_BASE, 0, 
                  METHOD_BUFFERED, FILE_ANY_ACCESS)

/* Declaration of IOCTL_DISK_GET_DRIVE_GEOMETRY_EX */
#ifndef IOCTL_DISK_GET_DRIVE_GEOMETRY_EX

#define IOCTL_DISK_GET_DRIVE_GEOMETRY_EX CTL_CODE(IOCTL_DISK_BASE, 0x0028, METHOD_BUFFERED, FILE_ANY_ACCESS)

typedef struct _DISK_GEOMETRY_EX {
      DISK_GEOMETRY Geometry;
      LARGE_INTEGER DiskSize;
      BYTE Data[1];
} DISK_GEOMETRY_EX;

#endif

 

//driveLetter는 C, D, E, F문자 한개이고요..

//return값은 물리번호 입니다, 0, 1, 2, 3 등등..

//아래 함수는 스토리지장치를 인식시키신후에 윈도우에서 생기는 문자를 입력하면 물리번호를 찾는 함수입니다.

int GetDrivePhysicalNum(char driveLetter)
{
 HANDLE hStorage=INVALID_HANDLE_VALUE;
 char temp[15];
 memset(temp,0,15);
 sprintf(temp,"\\.\%c:",driveLetter);
 hStorage=CreateFile(temp,//\.x
        GENERIC_READ,//desired access
        FILE_SHARE_READ|FILE_SHARE_WRITE,
        NULL,//
        OPEN_EXISTING,
        FILE_FLAG_NO_BUFFERING|FILE_FLAG_WRITE_THROUGH,
        NULL);
 if(hStorage==INVALID_HANDLE_VALUE)
 {
  MessageBox(NULL,"Can not open Storage Device","",MB_OK);
  return -1;
 }
 
 VOLUME_DISK_EXTENTS volumeDiskExtent;
 memset(&volumeDiskExtent,0,sizeof(VOLUME_DISK_EXTENTS));

 BOOL bStatus;
 DWORD nBytesReturned;
 bStatus=DeviceIoControl(hStorage,         // handle to device
  IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,    // dwIoControlCode
  NULL,                                    // lpInBuffer
  0,                                       // nInBufferSize
  &volumeDiskExtent,                    // output buffer
  sizeof(VOLUME_DISK_EXTENTS),                  // size of output buffer
  &nBytesReturned,               // number of bytes returned
  NULL// OVERLAPPED structure
  );

 if(bStatus==0)
 {
  MessageBox(NULL,"IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS failed","",MB_OK);
  CloseHandle(hStorage);
  return -1;
 }

 if(volumeDiskExtent.NumberOfDiskExtents<1)
 {
  MessageBox(NULL,"if(volumeDiskExtent.NumberOfDiskExtents<1) failed","",MB_OK);
  CloseHandle(hStorage);
  return -1;
 }

 CloseHandle(hStorage);
 return volumeDiskExtent.Extents[0].DiskNumber;
}


//drivePhysicalNum: 위함수에서 얻은 물리번호를 입력받습니다.

//pDiskGeometry : 물리디스크의 용량정보를 얻어옵니다.

//아래함수는 위에서 얻은 물리번호로 파일을 연후 디스크 정보를 얻어오는 함수입니다.

int GetDriveGeometry(int drivePhysicalNum,DISK_GEOMETRY_EX * pDiskGeometry)
{
 HANDLE hStorage=INVALID_HANDLE_VALUE;
 char temp[25];
 BOOL bStatus;
 DWORD nBytesReturned;

 memset(temp,0,25);
 sprintf(temp,"\\.\PhysicalDrive%d",drivePhysicalNum);

 hStorage=CreateFile(temp,
        GENERIC_READ,//desired access
        FILE_SHARE_READ|FILE_SHARE_WRITE,
        NULL,//
        OPEN_EXISTING,
        FILE_FLAG_NO_BUFFERING|FILE_FLAG_WRITE_THROUGH,
        NULL);
 if(hStorage==INVALID_HANDLE_VALUE)
 {
  MessageBox(NULL,"Can not open Storage Device","",MB_OK);
  return -1;
 }

 
 bStatus=DeviceIoControl(hStorage,         // handle to device
  IOCTL_DISK_GET_DRIVE_GEOMETRY_EX,    // dwIoControlCode
  NULL,                                    // lpInBuffer
  0,                                       // nInBufferSize
  pDiskGeometry,                    // output buffer
  sizeof(DISK_GEOMETRY_EX),                  // size of output buffer
  &nBytesReturned,               // number of bytes returned
  NULL// OVERLAPPED structure
  );

 if(bStatus==0)
 {
  MessageBox(NULL,"IOCTL_DISK_GET_DRIVE_GEOMETRY failed","",MB_OK);
  CloseHandle(hStorage);
  return -1;
 }

 CloseHandle(hStorage);
 return 0;
}

 

아래는 섹터를 읽을 때 위치를 옮기는 부분입니다.64bit처리부분입니다.

아쉽게도 visual studio 6.0에서 SetFilePointerEx 를 사용할 수없어서 (아마sdk설치해야할것같아서..)

그냥 SetFilePointer함수에서 highPart를 살려봤습니다.

LARGE_INTEGER distanceToMove;
 distanceToMove.QuadPart=sectorStart*512;

 

DWORD dwPtrLow = SetFilePointer( hStorage,distanceToMove.LowPart,
                                   &distanceToMove.HighPart,
                                   FILE_BEGIN );

 

그리고 ReadFile, WriteFile을 사용해서 섹터사이즈 배수만큼씩 원하는대로 읽고 쓰시면

될것 같습니다. 감사합니다.

liky

2011.03.07 23:48:14
*.165.72.80

리눅스에서 작업하니까 정말로 간단하네요..

일단 컴파일된 u-boot.bin중에서 앞부분 8kb만 짤라서 u-boot-8kb.bin으로 만든후에

dd if=u-boot.bin of=u-boot-8kb.bin bs=512 count=16

USB카드리더기를 노트북에 삽입합니다... dmesg로 하드디스크 로 할당된

논리적인 장치이름을 알아냅니다. 저같은경우는 /dev/sdf로 나왔습니다.

dd if=u-boot-8kb.bin of=/dev/sdf bs=512 seek=3862510

명령을 내리면 u-boot-8kb.bin이 micro-SD의 3862510블럭부터 쓰여집니다.

리눅스가 정말로 유용하고 대단하네요..혹시참고하시어 저와같이 윈도우프로그램

만드는 삽질을 하지 마시라고 올려드립니다.^^

유형목

2011.03.08 00:40:21
*.200.239.234

dd 프로그램의 마법(?)을 익히셨군요. ^^;

 

간단하면서도 여러모로 쓸모도 많고, 놀라운 프로그램이죠.

 

윈도우와 리눅스를 각각 다른 파티션에 깔아놓고 윈도우쪽 파티션을 dd를 써서 백업해 놓는 방식으로  많이 썼던 기억이 납니다.

 

liky

2011.03.08 02:48:34
*.165.72.80

예^^ 이번에 리눅스가 좋다는 것을 점차 느껴가고 있습니다.

그리고 예전에 유형목님강의 들었던 학생입니다.

요즘 건강은 괜찮으신지 모르겠네요. 건강하시고요 앞으로도 많은 관심부탁드립니다.

유형목

2011.03.08 07:33:15
*.131.99.183

오우 이런..제 강의를 들으셨다니..^^; 이거 기분이 으쓱해지는군요. 허허..


dd 를 저정도로 쓸줄 안다면 그동안 상당한 내공을 익히셨네요.

아마도 프로젝트에서 좋은 결과 있으실겁니다.


제 병은 좀 어려운 난치병이라, 획기적인 치료수단이 나오지 않는 이상 아마도 죽을때 까지 약을 먹고 살아야 될듯 . 그렇다고 뭐 금방 일찍 죽는 병도 아니기 때문에..^^; 이젠 그려러니 하고 삽니다.

걱정해주셔서 고맙습니다.


List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 교육 홍보 및 광고는 "교육 및 세미나 홍보" 게시판을 이용해 ... 관리자 2010-07-15 108051
1510 드뎌 Nexus-S 구입/사용하기 시작했습니다....ㅎ [9] 고도리 2011-03-06 5286
1509 ODROD-T 하드웨어 문의 김한태 2011-03-04 3466
1508 하드커널에 전언..? [2] TKNemo 2011-03-04 4923
1507 히힛^^ 아이패드 건졋네요.. [5] 카자류 2011-03-03 3772
1506 LG가 AP를???? [4] 고도리 2011-03-03 4326
1505 MIPI 전용칩 문의 드립니다. [2] 이성휘 2011-02-25 5129
1504 세계 최대 임베디드 전시회에 나갑니다. [4] 이제현 2011-02-22 4254
» ODROID용 microSD에 raw데이터 정보읽기 문제점에관한 문의 [7] liky 2011-02-17 4909
1502 ODROID-A 개발 보드 소개 file [23] 이제현 2011-02-15 7781
1501 갤럭시 S2 및 갤럭시탭2 발표. [1] 유형목 2011-02-14 3932
1500 [Android] HoneyComb 맘에 드네요. 고도리 2011-02-14 4253
1499 삼성 Cortex-A9 Dual core 이름이 변경되었네요... [6] 이제현 2011-02-12 5818
1498 하드커널 홈페이지가 확 달라졌군요. ㅎㅎ [1] 김장균 2011-02-11 4703
1497 “뭐? 또 새 안드로이드 OS?” [2] 장석원 2011-02-10 3739
1496 삼드로이드 sdk 변경 관련 ?? max 2011-02-09 3663
1495 이솝 2440 2차보드 관련 자료 문의 [1] cain9 2011-02-08 3026
1494 이솝6410보드 전원 아답터 사양이 어떻게 되는지요? [1] 공정표 2011-02-07 2966
1493 [질문] 데이터시트 관리, 어떻게들 하시나요? [3] TKNemo 2011-02-04 3522
1492 [aesop-v210: Torbreck] Android 2.3 gingerbread kernel p... 고도리 2011-02-02 6303
1491 CPU 선정하기 위한 성능테스트 결과 공유제안 file [14] 카보 2011-01-30 4950

사용자 로그인