파일 합치는 부분 코드.

필요한 부분은 주석으로 달아놓았고, 파일을 읽고 쓰는 방법에 대해 대략적인 이해는 할 수 있을 것으로 생각된다.

 

먼저 변수 선언부이다.

var
NandBC : TFileStream;
RAMBC : TFileStream;
MergeBC : TFileStream;
Buffer : Char;
iForLoop : integer;

 

소스코드 내용이다.

NandBootcodeMerger 에서는 두 파일을 합치는데 낸드 부트 코드는 2 Kbyte 이하이기때문에 파일 크기를 검사한다.

그리고 낸드 부트 코드가 0번 블럭에 쓰여지고 램 부트가 1 번 블럭에 쓰여져야 하는데 한 블럭이 16 KByte 이고, 낸드 부트코드는 16KByte 가 안되기 때문에 강제로 0xFF값을 채워 16 KByte 를 만든다.

Jtag 으로 합쳐진 파일을 낸드플래시에 0 번 블럭을 라이팅 시작 번지로 지정하여  라이팅하면 2 KByte 가 약간 안되는 낸드부트코드 들어간 뒤 자연히 0xFF 값이 1 번 블럭 직전까지 쓰이고, 1 번 블럭이 시작하는 부분부터 램 부트코드가 자연히 라이팅이 되는 것이다.

 

NandBC := TFileStream.Create([낸드 부트 파일의 경로], fmOpenRead); // 읽기 모드로 파일을 연다.
if (NandBC.Size > 2048) then // 2048 Byte = 2 KByte 이다. 2 KByte 이하인지 확인한다.
begin
ShowMessage(‘Size Error.’ + #13#10#13#10+ ‘NandBootCode Size is 2048 Byte and less.’);
MergeBC.Free;
exit;
end;

if not (FileExists([램 부트  파일의 경로])) then // 이 파트가 낸드 부트 파일을 열기 전에 있어야 하는데 빠졌다. 파일이 존재하는지 검사한다.
begin
ShowMessage(‘Check Ram Bootcode Path!’);
MergeBC.Free;
exit;
end;

RAMBC := TFileStream.Create([램 부트 파일의 경로], fmOpenRead); //위와 동일하게 파일을 읽기 모드로 연다.
MergeBC := TFileStream.Create([합쳐질 파일의 경로], fmCreate);  // 합쳐진 파일을 저장할 경로(파일명 포함)를 넣으며 새로 만들어지는 파일이므로 생성모드로 연다.

while (NandBC.Read(Buffer, 1) = 1) do // 1 바이트씩 읽어 1 바이트씩 쓴다. 리턴값이 읽은 바이트 수이므로 0 일 경우는 파일 끝에 도달했다고 보면 된다. 만약 10 바이트씩 읽고싶다면 Read 함수의 두번째 파라미터를 10 으로 수정하면 된다.
begin
MergeBC.Write(Buffer, 1); // 읽은 데이터를 쓴다.
end;

Buffer := Chr(255);
for iForLoop := 0 to (16384 – NandBC.Size – 1) do // 낸드 부트가 들어간 위치 이후로 16KByte 직전 위치까지 0xFF 로 채운다.
begin
MergeBC.Write(Buffer, 1);
end;

while (RAMBC.Read(Buffer, 1) = 1) do // 램 부트 코드를 채운다.
begin
MergeBC.Write(Buffer, 1);
end;

MergeBC.Free; // 작업이 끝났으니 파일 스트림을 모두 닫는다.
NandBC.Free;
RAMBC.Free;

 

여기서 쓰인 함수들은 F1 키로 도움말을 열어 참고하기 바란다.

그리고 파일 제어에 대해서는 C 언어 책에서 파일 I/O 파트를 보면 큰 도움이 될 것이다.