⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 at91_nand.c

📁 at91rm9200的256M bytes Nand flash的Ads12测试代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	 /* Send the command for reading device ID *///	 this->cmdfunc (mtd, NAND_CMD_READID, 0x00, -1);	 ST_CMD(NAND_CMD_READID, 0);	 ST_CMD(0x00, 1);	 	 /* Read manufacturer and device IDs */	 	 nand_maf_id = readb (this_IO_ADDR_R);	 nand_dev_id = readb (this_IO_ADDR_R); 	 /* Print and store flash device information */	 for (i = 0; nand_flash_ids[i].name != NULL; i++) {		 if (nand_dev_id == nand_flash_ids[i].id ) {			 /* Try to identify manufacturer */			 for (i = 0; nand_manuf_ids[i].id != 0x0; i++) 			 {				 if (nand_manuf_ids[i].id == nand_maf_id)	 break;			 }	 			 AT91F_DBGU_Printk ("NAND device: Manufacture ID:\n\r");			 break;		 }	 } 	 /* Return happy */	 return 0; }/* * Main initialization routine *///	static int __init at91_init (void)int  at91_init (void){	int err = 0x30,i;//,ok=0,error=0;	this_IO_ADDR_R=AT91_SMARTMEDIA_BASE;	at91_fio_base=AT91_SMARTMEDIA_BASE;	for(i=0;i<PAGE_DATA_MAX;i++)	{		if(err>0x43) err=0x30;		buff1[i]=err;		err++;	}	for(i=0;i<30;i++)	{		buff2[i]=0x32;	}	//	at91_fio_base = (unsigned long) ioremap(AT91_SMARTMEDIA_BASE, SZ_256M);//hqc 20070801 modify		//* Setup MEMC to support CS3=nand Flash	//	AT91C_BASE_EBI->EBI_CSA |= AT91C_EBI_CS3A_SMC_SmartMedia;	//	AT91C_BASE_EBI->EBI_CFGR = (AT91C_EBI_DBPUC & 0x00) | (AT91C_EBI_EBSEN & 0x00);		(*AT91C_EBI_CSA)|= AT91C_EBI_CS3A_SMC_SmartMedia;//		AT91_SYS->EBI_CFGR = (AT91C_EBI_DBPUC & 0x00) | (AT91C_EBI_EBSEN & 0x00);//	(*(volatile u8 *)0xffffff60) |= AT91C_EBI_CS3A_SMC_SmartMedia;//	(*(volatile u8 *)0xffffff64) = (AT91C_EBI_DBPUC & 0x00) | (AT91C_EBI_EBSEN & 0x00);			/* set the bus interface characteristics based on			   tDS Data Set up Time 30 - ns			   tDH Data Hold Time 20 - ns			   tALS ALE Set up Time 20 - ns			   16ns at 60 MHz ~= 3	*/#define AT91C_SM_ID_RWH	(5 << 28)		/* orig = 5 */#define AT91C_SM_RWH	(1 << 28)		/* orig = 1 */#define AT91C_SM_RWS	(0 << 24)		/* orig = 0 */#define AT91C_SM_TDF	(1 << 8)		/* orig = 1 */#define AT91C_SM_NWS	(5)				/* orig = 3 */#define AT91C_SMC2_CSR3  ((AT91_REG *) 	0xFFFFFF7C)		(*AT91C_SMC2_CSR3)=	( AT91C_SM_RWH | AT91C_SM_RWS |							 AT91C_SMC2_ACSS_STANDARD |							 AT91C_SMC2_DBW_8 | AT91C_SM_TDF |							 AT91C_SMC2_WSEN | AT91C_SM_NWS);		AT91_CfgPIO_SmartMedia();	nand_scan();////nand flash erase,write,read test	Erase_Block(0,1);	for(i=0;i<15;i++)	{		delay();	}	Erase_Block(1,1);	for(i=0;i<15;i++)	{		delay();	}for(i=0;i<100;i++){		Program_Page(i,1);	delay();	delay();	delay();	delay();	delay();	Read_Page(i,1);		for(err=0;err<30;err++)	{		if(buff2[err]!=buff1[err])break;	}	if(err==30)		{		AT91F_DBGU_Printk ("NAND device: read ok \n\r");		}	else		{		AT91F_DBGU_Printk ("NAND device: read error \n\r");		}			for(err=0;err<30;err++)	{		buff2[err]=0x32;	}	err=0;	delay();	delay();	}	AT91F_DBGU_Printk ("NAND device: ok  ok\n\r");	return err;}#if 0/* * drivers/mtd/nand/at91_nand.c * *  Copyright (C) 2003 Rick Bronson * *  Derived from drivers/mtd/nand/autcpu12.c *  Copyright (c) 2001 Thomas Gleixner (gleixner@autronix.de) * *  Derived from drivers/mtd/spia.c *  Copyright (C) 2000 Steven J. Hill (sjhill@cotw.com) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * */#include <linux/slab.h>#include <linux/module.h>#include <linux/platform_device.h>#include <linux/mtd/mtd.h>#include <linux/mtd/nand.h>#include <linux/mtd/partitions.h>#include <asm/io.h>#include <asm/sizes.h>#include <asm/hardware.h>#include <asm/arch/board.h>#include <asm/arch/gpio.h>struct at91_nand_host { struct nand_chip nand_chip; struct mtd_info  mtd; void __iomem  *io_base; struct at91_nand_data *board;};/* * Hardware specific access to control-lines */static void at91_nand_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl){ struct nand_chip *nand_chip = mtd->priv; struct at91_nand_host *host = nand_chip->priv; if (cmd == NAND_CMD_NONE)  return; if (ctrl & NAND_CLE)  writeb(cmd, host->io_base + (1 << host->board->cle)); else  writeb(cmd, host->io_base + (1 << host->board->ale));}/* * Read the Device Ready pin. */static int at91_nand_device_ready(struct mtd_info *mtd){ struct nand_chip *nand_chip = mtd->priv; struct at91_nand_host *host = nand_chip->priv; return at91_get_gpio_value(host->board->rdy_pin);}/* * Enable NAND. */static void at91_nand_enable(struct at91_nand_host *host){ if (host->board->enable_pin)  at91_set_gpio_value(host->board->enable_pin, 0);}/* * Disable NAND. */static void at91_nand_disable(struct at91_nand_host *host){ if (host->board->enable_pin)  at91_set_gpio_value(host->board->enable_pin, 1);}/* * Probe for the NAND device. */static int __init at91_nand_probe(struct platform_device *pdev){ struct at91_nand_host *host; struct mtd_info *mtd; struct nand_chip *nand_chip; int res;#ifdef CONFIG_MTD_PARTITIONS struct mtd_partition *partitions = NULL; int num_partitions = 0;#endif /* Allocate memory for the device structure (and zero it) */ host = kzalloc(sizeof(struct at91_nand_host), GFP_KERNEL); if (!host) {  printk(KERN_ERR "at91_nand: failed to allocate device structure.\n");  return -ENOMEM; } host->io_base = ioremap(pdev->resource[0].start,    pdev->resource[0].end - pdev->resource[0].start + 1); if (host->io_base == NULL) {  printk(KERN_ERR "at91_nand: ioremap failed\n");  kfree(host);  return -EIO; } mtd = &host->mtd; nand_chip = &host->nand_chip; host->board = pdev->dev.platform_data; nand_chip->priv = host;  /* link the private data structures */ mtd->priv = nand_chip; mtd->owner = THIS_MODULE; /* Set address of NAND IO lines */ nand_chip->IO_ADDR_R = host->io_base; nand_chip->IO_ADDR_W = host->io_base; nand_chip->cmd_ctrl = at91_nand_cmd_ctrl; nand_chip->dev_ready = at91_nand_device_ready; nand_chip->ecc.mode = NAND_ECC_SOFT; /* enable ECC */ nand_chip->chip_delay = 20;  /* 20us command delay time */ if (host->board->bus_width_16)  /* 16-bit bus width */  nand_chip->options |= NAND_BUSWIDTH_16; platform_set_drvdata(pdev, host); at91_nand_enable(host); if (host->board->det_pin) {  if (at91_get_gpio_value(host->board->det_pin)) {   printk ("No SmartMedia card inserted.\n");   res = ENXIO;   goto out;  } } /* Scan to find existance of the device */ if (nand_scan(mtd, 1)) {  res = -ENXIO;  goto out; }#ifdef CONFIG_MTD_PARTITIONS if (host->board->partition_info)  partitions = host->board->partition_info(mtd->size, &num_partitions); if ((!partitions) || (num_partitions == 0)) {  printk(KERN_ERR "at91_nand: No parititions defined, or unsupported device.\n");  res = ENXIO;  goto release; } res = add_mtd_partitions(mtd, partitions, num_partitions);#else res = add_mtd_device(mtd);#endif if (!res)  return res;release: nand_release(mtd);out: at91_nand_disable(host); platform_set_drvdata(pdev, NULL); iounmap(host->io_base); kfree(host); return res;}/* * Remove a NAND device. */static int __devexit at91_nand_remove(struct platform_device *pdev){ struct at91_nand_host *host = platform_get_drvdata(pdev); struct mtd_info *mtd = &host->mtd; nand_release(mtd); at91_nand_disable(host); iounmap(host->io_base); kfree(host); return 0;}static struct platform_driver at91_nand_driver = { .probe  = at91_nand_probe, .remove  = at91_nand_remove, .driver  = {  .name = "at91_nand",  .owner = THIS_MODULE, },};static int __init at91_nand_init(void){ return platform_driver_register(&at91_nand_driver);}static void __exit at91_nand_exit(void){ platform_driver_unregister(&at91_nand_driver);}module_init(at91_nand_init);module_exit(at91_nand_exit);MODULE_LICENSE("GPL");MODULE_AUTHOR("Rick Bronson");MODULE_DESCRIPTION("NAND/SmartMedia driver for AT91RM9200");#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -