国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

【分享】飛凌S3C6410 NAND Flash驅動程序 WindowsCE版

發布時間:2010-8-6 13:03    發布者:死亡天使
關鍵詞: Flash , NAND , WindowsCE , 程序 , 飛凌
這段時間一直在研究S3C6410 NAND驅動,把找到的一些源碼發出來,希望對正在做這部分的朋友有
所幫助。
    由于內容比較長,受字數和篇幅限制,詳細代碼可以在附件中下載。

本文轉引自 飛凌嵌入式 ARM11 OK6410討論區 www.witech.com.cn

// Copyright (c) Microsoft Corporation.  All rights reserved.
//
#include
#include
#include
// BSP Configuration Files
#include "bsp_cfg.h"
#include "bsp_base_reg_cfg.h"
// Base Definitions
#include "s3c6410_base_regs.h"
#include "s3c6410_nand.h"
#include "s3c6410_syscon.h"
//#include
#include "Cfnand.h"
//#include
//#define SYNC_OP
#define CHECK_SPAREECC    (1)
#define NAND_DEBUG        (0)
#define NAND_BASE        (0xB0200000)    // PA:0x70200000
#define SYSCON_BASE        (0xB2A0F000)    // PA:0x7E00F000
#ifdef    SYNC_OP
CRITICAL_SECTION    g_csNandFlash;
#endif
static volatile S3C6410_NAND_REG *g_pNFConReg = NULL;
static volatile S3C6410_SYSCON_REG *g_pSysConReg = NULL;

NANDDeviceInfo GetNandInfo(void) { return stDeviceInfo; }
static DWORD ReadFlashID(void)
{
    BYTE Mfg, Dev;
    int i;
    NF_nFCE_L();                // Deselect the flash chip.
    NF_CMD(CMD_READID);        // Send flash ID read command.
    NF_ADDR(0);
    for (i=0; i<10; i++)
    {
        Mfg    = NF_RDDATA_BYTE();
        if (Mfg == 0xEC || Mfg == 0x98) break;
    }
    Dev    = NF_RDDATA_BYTE();
    NF_nFCE_H();
    return ((DWORD)(Mfg<<8)+Dev);
}
PVOID FMD_Init(LPCTSTR lpActiveReg, PPCI_REG_INFO pRegIn, PPCI_REG_INFO pRegOut)
{
    volatile DWORD nNandID;
    UINT8 nMID, nDID;
    UINT32 nCnt;
    BOOL bNandExt = FALSE;
    RETAILMSG(1, (TEXT("[FMD] ++FMD_Init() ****\r\n")));


    if (pRegIn && pRegIn->MemBase.Num && pRegIn->MemBase.Reg[0])
    {
        g_pNFConReg = (S3C6410_NAND_REG *)(pRegIn->MemBase.Reg[0]);
    }
    else
    {
        g_pNFConReg = (S3C6410_NAND_REG *)NAND_BASE;
    }
    g_pSysConReg = (S3C6410_SYSCON_REG *)SYSCON_BASE;
#ifdef    SYNC_OP
    InitializeCriticalSection(&g_csNandFlash);
    EnterCriticalSection(&g_csNandFlash);
#endif

    if (!bNandExt)
    {
        RETAILMSG(1, (TEXT("[FMD:ERR] FMD_Init() : Unknown ID = 0x%08x\n"), nNandID));
        return NULL;
    }
    NUM_OF_BLOCKS = astNandSpec[nCnt].nNumOfBlks;
    PAGES_PER_BLOCK = astNandSpec[nCnt].nPgsPerBlk;
    SECTORS_PER_PAGE = astNandSpec[nCnt].nSctsPerPg;
    RETAILMSG(1, (TEXT("[FMD] --FMD_Init()\n")));
    return((PVOID)g_pNFConReg);
}

BOOL FMD_ReadSector(SECTOR_ADDR startSectorAddr, LPBYTE pSectorBuff, PSectorInfo
pSectorInfoBuff, DWORD dwNumSectors)
{
    BOOL bRet;
    //RETAILMSG(1, (TEXT("[R:0x%08x] \n"), startSectorAddr));
#if (NAND_DEBUG)
    RETAILMSG(1, (TEXT("[FMD] ++FMD_ReadSector(0x%08x) \n"), startSectorAddr));
#endif
#ifdef    SYNC_OP
    EnterCriticalSection(&g_csNandFlash);
#endif
    if ( IS_LB )
    {
        bRet = FMD_LB_ReadSector(startSectorAddr, pSectorBuff, pSectorInfoBuff,
dwNumSectors, USE_NFCE);
    }
    else
    {
        bRet = FMD_SB_ReadSector(startSectorAddr, pSectorBuff, pSectorInfoBuff,
dwNumSectors, USE_NFCE);
    }
#ifdef    SYNC_OP
    LeaveCriticalSection(&g_csNandFlash);
#endif
#if (NAND_DEBUG)
    RETAILMSG(1, (TEXT("[FMD] --FMD_ReadSector()\n")));
#endif
    return bRet;
}

BOOL FMD_EraseBlock(BLOCK_ID blockID)
{
    BOOL    bRet = TRUE;
#if (NAND_DEBUG)
    RETAILMSG(1, (TEXT("[FMD] ++FMD_EraseBlock(0x%08x) \n"), blockID));
#endif
#ifdef    SYNC_OP
    EnterCriticalSection(&g_csNandFlash);
#endif
    if ( IS_LB )
    {
        bRet = FMD_LB_EraseBlock(blockID, USE_NFCE);
    }
    else
    {
        bRet = FMD_SB_EraseBlock(blockID, USE_NFCE);
    }
#ifdef    SYNC_OP
    LeaveCriticalSection(&g_csNandFlash);
#endif
#if (NAND_DEBUG)
    RETAILMSG(1, (TEXT("[FMD] --FMD_EraseBlock()\n")));
#endif
    return bRet;
}

BOOL FMD_WriteSector(SECTOR_ADDR startSectorAddr, LPBYTE pSectorBuff, PSectorInfo
pSectorInfoBuff, DWORD dwNumSectors)
{
    BOOL    bRet = TRUE;
#if (NAND_DEBUG)
    RETAILMSG(1, (TEXT("[FMD] ++FMD_WriteSector(0x%08x) \n"), startSectorAddr));
#endif
#ifdef    SYNC_OP
    EnterCriticalSection(&g_csNandFlash);
#endif
    if ( IS_LB )
    {
        bRet = FMD_LB_WriteSector(startSectorAddr, pSectorBuff, pSectorInfoBuff,
dwNumSectors, USE_NFCE);
    }
    else
    {
        bRet = FMD_SB_WriteSector(startSectorAddr, pSectorBuff, pSectorInfoBuff,
dwNumSectors, USE_NFCE);
    }
#ifdef    SYNC_OP
    LeaveCriticalSection(&g_csNandFlash);
#endif
#if (NAND_DEBUG)
    RETAILMSG(1, (TEXT("[FMD] --FMD_WriteSector()\n")));
#endif
    return bRet;
}

VOID FMD_PowerUp(VOID)
{
#if (NAND_DEBUG)
    RETAILMSG(1, (TEXT("[FMD] FMD_PowerUp() \n")));
#endif
    // Set up initial flash controller configuration.
    g_pNFConReg->NFCONF = (TACLS<<12) | (TWRPH0<<8) | (TWRPH1<<4);
    g_pNFConReg->NFCONT = (0<<17)|(0<<16)|(0<<10)|(0<<9)|(0<<8)|(1<<7)|(1<<6)|(1<<5)|
(1<<4)|(0x3<<1)|(1<<0);
    g_pNFConReg->NFSTAT = (1<<4);
}

VOID FMD_PowerDown(VOID)
本文地址:http://m.qingdxww.cn/thread-19717-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
youyou_zh 發表于 2011-5-24 21:19:08
kanbudong
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 使用SAM-IoT Wx v2開發板演示AWS IoT Core應用程序
  • 使用Harmony3加速TCP/IP應用的開發培訓教程
  • 集成高級模擬外設的PIC18F-Q71家族介紹培訓教程
  • 探索PIC16F13145 MCU系列——快速概覽
  • 貿澤電子(Mouser)專區

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人精品视频在线观看播放 | 日韩欧美成人免费中文字幕 | 亚洲欧美日本在线观看 | 老潮湿影院免费体验区 | 国产性生活视频 | 日本道在线| 大又大又粗又爽女人毛片 | 一级毛片大全免费播放 | 1024在线观看国产天堂 | 日本jizz强视频69视频 | 91精品国产色综合久久 | 欧美xxxxx九色视频免费观看 | 亚洲视频在线观看免费视频 | 亚洲一区中文字幕 | 成人午夜影视全部免费看 | 一区二区三区免费观看 | 亚洲色图在线播放 | 国产一级一国产一级毛片 | 日韩欧美在线免费观看 | 老司机精品视频在线 | 精品久久免费观看 | 亚洲欧洲综合在线 | 国产高清在线观看视频 | 天天影视欧美 | 国产女人综合久久精品视 | 侠盗高飞在线观看免费完整版 | 日本色黄视频 | 欧美日韩国产一区二区 | 国产极品视频 | 欧美日韩一级黄色片 | 麻豆日韩| 2021国内精品久久久久久影院 | 在线精品国产成人综合第一页 | 久久99精品综合国产首页 | 国产精品手机在线观看 | 久热re在线视频精品免费 | 4438x成人网最大色成网站 | 国产真实乱了在线播放 | 日本高清中文字幕一区二区三区 | 婷婷五月在线视频 | 奇淫三国|