mkv210 image c檔案詳解

2021-08-10 12:42:09 字數 2245 閱讀 2723

第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;

}