회원 및 비회원 모두 열람이 가능합니다. 최대 업로드 가능한 용량은 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
번호 제목 글쓴이 날짜 조회 수sort
공지 교육 홍보 및 광고는 "교육 및 세미나 홍보" 게시판을 이용해 ... 관리자 2010-07-15 108026

Ubuntu 12.04 on ODROID-X Exynos-4412 file [11]

안드로이드 부팅 시간이 1초 라는 동영상입니다 [4]

  • 시안
  • 2010-09-10
  • 조회 수 5019

FFMPEG 라이센스 위반 예 ...

진저브레드 SDK에 있는 갤럭시탭 에뮬 file

안드로이드 에뮬2.0에서 Market 실행

Exynos 4210(V310) OrigenBoard 해외에 press release 되었습...

[Exynos5250] Arndale board 커널 작업 3.7-rc5

[뻔뻔] XDA 사이트가 문을 닫는다고 하네요. (ㅠ.ㅠ) file [5]

임베디드 분야는 원래 이런건가요..ㅜ [4]

CPU 선정하기 위한 성능테스트 결과 공유제안 file [14]

  • 카보
  • 2011-01-30
  • 조회 수 4950

NOR FLASH에 부팅 펌웨어 넣는 방법 [4]

  • 딱지
  • 2011-12-30
  • 조회 수 4949

요즘 센서는 어디 제품을 많이 사용하시나요? [2]

oDroid-T 에서 usb memory mount 하기 [2]

나이텍 교육공고??? [2]

[ODROID-T/ S5PC110 보드] 공지 : 진행 상황 및 배송 일... file [16]

하드커널에 전언..? [2]

  • TKNemo
  • 2011-03-04
  • 조회 수 4923

[뻔뻔] 안드로이드 마켓 App 드디어 10만 돌파!!! file

ODROID용 microSD에 raw데이터 정보읽기 문제점에관한 문의 [7]

  • liky
  • 2011-02-17
  • 조회 수 4909

Multimedia solution(ex.PMP)에 대한 박영학님의 글에 대한 의... [3]

하하하, 오드로이드 센스쟁이; [1]

사용자 로그인