s3c6410 开发板Linux系统支持 K9GAG08U0E的方法(第一篇)
?? ? 由于NandFlash硬件升級比較快,公司去年一直在使用三星的K9GAG08U0D,現在MLC NandFlash 升級到了第二代,K9GAG08U0D 很快就會處在停產的狀態,未雨綢繆,公司選型了K9GAG08U0E 來替代原有的NandFlash芯片。起初。本以為把新Nandflash ID信息增加到Uboot 和 Linux內核的NandFlash ID 列表文件中即可,也就是Uboot 和Linux源碼中的nand_ids.c 文件中,但是仔細看了?K9GAG08U0E 的DataSheet,發現自己的想法錯了。
下面記錄了NandFlash更換時面臨的幾個問題,及解決方法:
第一個問題:ID 沖突
??K9GAG08U0E 的 Product ID與?K9GAG08U0D 的Product ID 是相同的,都是 0xd5,而在Uboot 代碼和Linux內核代碼中,是根據ID信息來獲取或者計算NandFlash的頁大小和塊大小這些關鍵信息的。
?現在這兩款的 Flash ID相同,而Page,OOB ,Block大小都是不同的。 K9GAG08U0D ?Page,OOB,Block 關鍵參數:
?
而K9GAG08U0E 的?Page,OOB,Block ?關鍵參數:
可見他們是不同的,U0E 每頁大小是U0D的兩倍。
針對相同ID的兩款不同Flash是怎樣區分的呢?仔細看DataSheet,發現了可以快速區分兩種設備的方法:
U0D Page=4K,U0D Page=8K,我們只需判斷Read第四個字節的第0位和第1位即可。
下面列出關鍵代碼段:
? ? ?//這里必須有下面兩行代碼,因為U0E的DataSheet要求系統上電后第一條指令必須是NAND_CMD_RESET,而U0D沒有這要求,如果不發送這條指令是無法讀取到NandFlash的任何信息的,因為這個問題查找了很長時間,在這里提醒給大家。
? ? ?// K9GAG08U0E must add below codes ? ??
? ? ? ?{
? ? ? ? ? s3c_nand_hwcontrol(0, NAND_CMD_RESET, NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
? ? ? ? ? s3c_nand_device_ready(0);
? ? ? ? }
? ? ? ? s3c_nand_hwcontrol(0, NAND_CMD_READID, NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
? ? ? ? s3c_nand_hwcontrol(0, 0x00, NAND_CTRL_CHANGE | NAND_NCE | NAND_ALE);
? ? ? ? s3c_nand_hwcontrol(0, 0x00, NAND_NCE | NAND_ALE);
? ? ? ? s3c_nand_hwcontrol(0, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE);
? ? ? ? s3c_nand_device_ready(0);
? ? ? ?tmp = readb(nand->IO_ADDR_R); /* Maf. ID */
? ? ? // ?printf("Manufactor ID:%x\n",tmp);
? ? ? ?tmp = dev_id = readb(nand->IO_ADDR_R); /* Device ID */
? ? ? ? //printf("dev_id ID:%x \n",dev_id);
? ? ?for (i = 0; nand_flash_ids[i].name != NULL; i++)?
? ? ?{
? ? ? ? if (tmp == nand_flash_ids[i].id) {
? ? ? ? type = &nand_flash_ids[i];
? ? ? ?break;
? ? }
? ? ? nand->cellinfo = readb(nand->IO_ADDR_R);/* 3rd byte */
? ? ?tmp = readb(nand->IO_ADDR_R);/* 4th byte */
? ???int childType=tmp & 0x03; //Page size
? ? ?// ?printf("dev_id=%x,childType=%x \n",dev_id,childType);
? ??if(dev_id == 0xd5 && childType==0x01) //U0D
? ??{ ??
? ? }else ?if(dev_id == 0xd5 && childType==0x02) //U0E
? ?{
? ? }
這樣針對不同的NandFlash做不同的初始化了,以上代碼來自uboot1.1.6/cpu/s3c64xx/nand.c 文件中的void board_nand_init(struct nand_chip *nand) 函數。
?
總結
以上是生活随笔為你收集整理的s3c6410 开发板Linux系统支持 K9GAG08U0E的方法(第一篇)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: arm嵌入式系统C语言代码,ARM嵌入式
- 下一篇: linux如何关闭netbios服务,S