第1步:檢驗使用者傳參是不是3個。
第2步:分配16k bbuffer並且填充為0.
第3步:·········
(1)main函式兩個形參的作用
(2)glibc讀寫檔案介面
(3)校驗和的計算方法
/*
* mkv210_image.c的主要作用就是由usb啟動時使用的led.bin製作得到由sd卡啟動的映象210.bin
* * 本檔案來自於友善之臂的裸機教程,據友善之臂的文件中講述,本檔案是乙個熱心網友提供,在此表示感謝。
*//* 在bl0階段,irom內固化的**讀取nandflash或sd卡前16k的內容,
* 並比對前16位元組中的校驗和(下面的**就是計算校驗和的,但對比是bl0來實現,與此**無關)是否正確,正確則繼續,錯誤則停止。
*/#include #include #include #define bufsize (16*1024)
#define img_size (16*1024)
#define spl_header_size 16
//#define spl_header "s5pc110 header "
#define spl_header "****************"
int main (int argc, char *argv)
// 2. 分配16k的buffer
buflen = bufsize;
buf = (char *)malloc(buflen);
if (!buf)
memset(buf, 0x00, buflen);
// 3. 讀源bin到buffer
// 3.1 開啟源bin
fp = fopen(argv[1], "rb");
if( fp == null)
// 3.2 獲取源bin長度
fseek(fp, 0l, seek_end); // 定位到檔案尾
filelen = ftell(fp); // 得到檔案長度
fseek(fp, 0l, seek_set); // 再次定位到檔案頭
// 3.3 源bin長度不得超過16k-16byte
count = (filelen < (img_size - spl_header_size))
? filelen : (img_size - spl_header_size);
// 3.4 buffer[0~15]存放"s5pc110 header "
memcpy(&buf[0], spl_header, spl_header_size);
// 3.5 讀源bin到buffer[16]
nbytes = fread(buf + spl_header_size, 1, count, fp);
if ( nbytes != count )
fclose(fp);
// 4. 計算校驗和
// 4.1 從第16byte開始統計buffer中共有幾個1
// 4.1 從第16byte開始計算,把buffer中所有的位元組資料加和起來得到的結果
a = buf + spl_header_size;
for(i = 0, checksum = 0; i < img_size - spl_header_size; i++)
checksum += (0x000000ff) & *a++;
// 4.2 將校驗和儲存在buffer[8~15]
a = buf + 8; // buf是210.bin的起始位址,+8表示向後位移2個字,也就是說寫入到第3個字
*( (unsigned int *)a ) = checksum;
// 5. 拷貝buffer中的內容到目的bin
// 5.1 開啟目的bin
fp = fopen(argv[2], "wb");
if (fp == null)
// 5.2 將16k的buffer拷貝到目的bin中
a = buf;
nbytes = fwrite( a, 1, buflen, fp);
if ( nbytes != buflen )
free(buf);
fclose(fp);
return 0;
}