亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? hycnc_nand.c

?? 在PXA255下用做擴展NAND Flash芯片的程序源代碼
?? C
字號:
/* *  drivers/mtd/nand/hycnc_nand0.c * */#include <linux/module.h>#include <linux/mtd/mtd.h>#include <linux/mtd/nand.h>#include <linux/slab.h>#include <linux/mtd/partitions.h>#include <asm/io.h>#include <asm/arch/hardware.h>#include <asm/sizes.h>#include <linux/delay.h>#include <linux/init.h>#include <asm/errno.h>#define NAND0_DATA_CS           (0xEA000000)#define NAND1_DATA_CS           (0xEA200000)#define _NAND_CMD_CS0           (0xEA400000)#define NAND_CMD_CS0            (*(volatile unsigned char *)(_NAND_CMD_CS0))#define NAND0_NCE               (1<<0)#define NAND0_CLE               (1<<1)#define NAND0_ALE               (1<<2)#define NAND0_NWP               (1<<3)#define NAND1_NCE               (1<<4)#define NAND1_CLE               (1<<5)#define NAND1_ALE               (1<<6)#define NAND1_NWP               (1<<7)/* * MTD structure for hycnc board */static struct mtd_info *hycnc_mtd0 = NULL;static struct mtd_info *hycnc_mtd1 = NULL;/* * Define partitions for flash devices */static struct mtd_partition partition_info16k0[] = {	{ name: "hycnc_Nand_Flash_A_16K",	offset:  0,	size:    16 * SZ_1M },	{ name: "hycnc_Nand_Flash A_2_16K",	offset:  0 * SZ_1M,	size:    0 * SZ_1M },};static struct mtd_partition partition_info32k0[] = {	{ name: "hycnc_Nand_Flash_A_32K",	offset:  0,	size:   32 * SZ_1M },	{ name: "hycnc_Nand_Flash_A_2_32K",	offset: 0 * SZ_1M,	size:   0 * SZ_1M },};static struct mtd_partition partition_info64k0[] = {	{ name: "hycnc_Nand_Flash_A_64K",	offset: 0,	size:   64 * SZ_1M },	{ name: "hycnc_Nand_Flash_A_2_64K",	offset: 0 * SZ_1M,	size:   0 * SZ_1M },};static struct mtd_partition partition_info128k0[] = {	{ name: "hycnc_Nand_Flash_A_128K",	offset: 0,	size:   128 * SZ_1M },	{ name: "hycnc_Nand_Flash_A_2_128K",	offset: 0 * SZ_1M,	size:   0 * SZ_1M },};#define NUM_PARTITIONS16K0 1#define NUM_PARTITIONS32K0 1#define NUM_PARTITIONS64K0 1#define NUM_PARTITIONS128K0 1static struct mtd_partition partition_info16k1[] = {	{ name: "hycnc_Nand_Flash_B_16K",	offset:  0,	size:    16 * SZ_1M },	{ name: "hycnc_Nand_Flash_B_2_16K",	offset:  0 * SZ_1M,	size:    0 * SZ_1M },};static struct mtd_partition partition_info32k1[] = {	{ name: "hycnc_Nand_Flash_B_32K",	offset:  0,	size:   32 * SZ_1M },	{ name: "hycnc_Nand_Flash_B_2_32K",	offset: 0 * SZ_1M,	size:   0 * SZ_1M },};static struct mtd_partition partition_info64k1[] = {	{ name: "hycnc_Nand_Flash_B_64K",	offset: 0,	size:   64 * SZ_1M },	{ name: "hycnc_Nand_Flash_B_2_64K",	offset: 0 * SZ_1M,	size:   0 * SZ_1M },};static struct mtd_partition partition_info128k1[] = {	{ name: "hycnc_Nand_Flash_B_128K",	offset: 0,	size:   128 * SZ_1M },	{ name: "hycnc_Nand_Flash_B_2_128K",	offset: 0 * SZ_1M,	size:   0 * SZ_1M },};#define NUM_PARTITIONS16K1 1#define NUM_PARTITIONS32K1 1#define NUM_PARTITIONS64K1 1#define NUM_PARTITIONS128K1 1/* *  hardware specific access to control-lines*/static unsigned char nand_ctrl0 = ( NAND0_NCE | NAND0_NWP | NAND1_NCE | NAND1_NWP );static void hycnc_hwcontrol0(struct mtd_info *mtd, int cmd){    	switch(cmd)	{    		case NAND_CTL_SETCLE:				nand_ctrl0 |=  NAND0_CLE;				NAND_CMD_CS0 = nand_ctrl0;				break;    		case NAND_CTL_CLRCLE:				nand_ctrl0 &= ~NAND0_CLE;				NAND_CMD_CS0 = nand_ctrl0;				break;    		case NAND_CTL_SETALE:				nand_ctrl0 |=  NAND0_ALE;				NAND_CMD_CS0 = nand_ctrl0;				break;    		case NAND_CTL_CLRALE:				nand_ctrl0 &= ~NAND0_ALE;				NAND_CMD_CS0 = nand_ctrl0;				break;    		case NAND_CTL_SETNCE:				nand_ctrl0 &= ~NAND0_NCE;				NAND_CMD_CS0 = nand_ctrl0;				break;    		case NAND_CTL_CLRNCE:				nand_ctrl0 |=  NAND0_NCE;				NAND_CMD_CS0 = nand_ctrl0;				break;	}}static void hycnc_hwcontrol1(struct mtd_info *mtd, int cmd){    	switch(cmd)	{    		case NAND_CTL_SETCLE:				nand_ctrl0 |=  NAND1_CLE;				NAND_CMD_CS0 = nand_ctrl0;				break;    		case NAND_CTL_CLRCLE:				nand_ctrl0 &= ~NAND1_CLE;				NAND_CMD_CS0 = nand_ctrl0;				break;    		case NAND_CTL_SETALE:				nand_ctrl0 |=  NAND1_ALE;				NAND_CMD_CS0 = nand_ctrl0;				break;    		case NAND_CTL_CLRALE:				nand_ctrl0 &= ~NAND1_ALE;				NAND_CMD_CS0 = nand_ctrl0;				break;    		case NAND_CTL_SETNCE:				nand_ctrl0 &= ~NAND1_NCE;				NAND_CMD_CS0 = nand_ctrl0;				break;    		case NAND_CTL_CLRNCE:				nand_ctrl0 |=  NAND1_NCE;				NAND_CMD_CS0 = nand_ctrl0;				break;	}}/**   read device ready pin*/int hycnc_device_ready0(void){	return ( RNB_CS & NAND0_RNB ) ? 1 : 0;}int hycnc_device_ready1(void){	return ( RNB_CS & NAND1_RNB ) ? 1 : 0;}int hycnc_nand_delay = 20;/* * Main initialization routine */int __init hycnc_nand_init (void){    	struct nand_chip *this;    	int err = 0;	printk ("Initialising HYCNC NAND MTD devices.\n");	/* Allocate memory for MTD device structure and private data */    	hycnc_mtd0 = kmalloc (sizeof(struct mtd_info) + sizeof (struct nand_chip),			GFP_KERNEL);    	if (!hycnc_mtd0) {		printk ("Unable to allocate hycnc NAND MTD device structure.\n");		err = -ENOMEM;		goto out;    	}    	/* Get pointer to private data */    	this = (struct nand_chip *) (&hycnc_mtd0[1]);    	/* Initialize structures */    	memset((char *) hycnc_mtd0, 0, sizeof(struct mtd_info));    	memset((char *) this, 0, sizeof(struct nand_chip));	/* Link the private data with the MTD structure */    	hycnc_mtd0->priv = this;    	/* Set address of NAND IO lines */    	this->IO_ADDR_R = NAND0_DATA_CS;//弊成 例措林家藹父 霖促.    	this->IO_ADDR_W = NAND0_DATA_CS;//弊成 例措林家藹父 霖促.    	this->hwcontrol = hycnc_hwcontrol0;    	//this->dev_ready = hycnc_device_ready0; //nand on board	this->dev_ready = NULL;	    	/* 20 us command delay time */    	this->chip_delay = hycnc_nand_delay;	this->eccmode = NAND_ECC_SOFT;	/* Scan to find existance of the device */    	if (nand_scan (hycnc_mtd0, 1)) {		printk ("Unable to find First HYCNC NAND device.\n");		err = -ENXIO;		kfree (hycnc_mtd0);	 	goto out;    	}    	/* Allocate memory for internal data buffer */    	this->data_buf = kmalloc (sizeof(u_char) * (hycnc_mtd0->oobblock + hycnc_mtd0->oobsize), GFP_KERNEL);    	if (!this->data_buf) {		printk ("Unable to allocate First NAND data buffer for hycnc.\n");		err = -ENOMEM;		kfree (hycnc_mtd0);		goto out;    	}    	/* Register the partitions */    	switch(hycnc_mtd0->size)	{		case SZ_16M:			add_mtd_partitions(hycnc_mtd0, partition_info16k0, NUM_PARTITIONS16K0);			break;		case SZ_32M:			add_mtd_partitions(hycnc_mtd0, partition_info32k0, NUM_PARTITIONS32K0);			break;		case SZ_64M:			add_mtd_partitions(hycnc_mtd0, partition_info64k0, NUM_PARTITIONS64K0);			break;		case SZ_128M:			add_mtd_partitions(hycnc_mtd0, partition_info128k0, NUM_PARTITIONS128K0);			break;		default: 			{				printk ("Unsupported First Nand Size\n");				err = -ENXIO;				goto out;			}    	}	//printk ("Initialising of First HYCNC NAND MTD was successful.\n");	/* Allocate memory for MTD device structure and private data */    	hycnc_mtd1 = kmalloc (sizeof(struct mtd_info) + sizeof (struct nand_chip),			GFP_KERNEL);    	if (!hycnc_mtd1) {		printk ("Unable to allocate Second HYCNC NAND MTD device structure.\n");		err = -ENOMEM;		goto out;    	}    	/* Get pointer to private data */    	this = (struct nand_chip *) (&hycnc_mtd1[1]);    	/* Initialize structures */    	memset((char *) hycnc_mtd1, 0, sizeof(struct mtd_info));    	memset((char *) this, 0, sizeof(struct nand_chip));	/* Link the private data with the MTD structure */    	hycnc_mtd1->priv = this;    	/* Set address of NAND IO lines */    	this->IO_ADDR_R = NAND1_DATA_CS;//弊成 例措林家藹父 霖促.    	this->IO_ADDR_W = NAND1_DATA_CS;//弊成 例措林家藹父 霖促.    	this->hwcontrol = hycnc_hwcontrol1;    	//this->dev_ready = hycnc_device_ready1; //nand on board	this->dev_ready = NULL;    	/* 20 us command delay time */    	this->chip_delay = hycnc_nand_delay;	this->eccmode = NAND_ECC_SOFT;	/* Scan to find existance of the device */    	if (nand_scan (hycnc_mtd1, 1)) {		printk ("Unable to Second HYCNC NAND device.\n");		err = -ENXIO;		kfree (hycnc_mtd1);	 	goto out;    	}    	/* Allocate memory for internal data buffer */    	this->data_buf = kmalloc (sizeof(u_char) * (hycnc_mtd1->oobblock + hycnc_mtd1->oobsize), GFP_KERNEL);    	if (!this->data_buf) {		printk ("Unable to allocate Second NAND data buffer for hycnc.\n");		err = -ENOMEM;		kfree (hycnc_mtd1);		goto out;    	}    	/* Register the partitions */    	switch(hycnc_mtd1->size)	{		case SZ_16M:			add_mtd_partitions(hycnc_mtd1, partition_info16k1, NUM_PARTITIONS16K1);			break;		case SZ_32M:			add_mtd_partitions(hycnc_mtd1, partition_info32k1, NUM_PARTITIONS32K1);			break;		case SZ_64M:			add_mtd_partitions(hycnc_mtd1, partition_info64k1, NUM_PARTITIONS64K1);			break;		case SZ_128M:			add_mtd_partitions(hycnc_mtd1, partition_info128k1, NUM_PARTITIONS128K1);			break;		default: 			{				printk ("Unsupported Second Nand Size\n");				err = -ENXIO;				goto out;			}    	}	//printk ("Initialising of Second HYCNC NAND MTD was successful.\n");	return 0;out:	kfree (this->data_buf);    	return err;}module_init(hycnc_nand_init);/* * Clean up routine */#ifdef MODULEstatic void __exit hycnc_cleanup (void){    	struct nand_chip *this;    	this = (struct nand_chip *) &hycnc_mtd0[1];    	/* Unregister partitions */    	del_mtd_partitions(hycnc_mtd0);    	/* Unregister the device */    	del_mtd_device (hycnc_mtd0);    	/* Free internal data buffers */    	kfree (this->data_buf);    	/* Free the MTD device structure */    	kfree (hycnc_mtd0);    	this = (struct nand_chip *) &hycnc_mtd1[1];    	/* Unregister partitions */    	del_mtd_partitions(hycnc_mtd1);    	/* Unregister the device */    	del_mtd_device (hycnc_mtd1);    	/* Free internal data buffers */    	kfree (this->data_buf);    	/* Free the MTD device structure */    	kfree (hycnc_mtd1);}module_exit(hycnc_cleanup);#endifMODULE_LICENSE("GPL");MODULE_AUTHOR("newboder <newboder@hybus.net>");MODULE_DESCRIPTION("Glue layer for Nand");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美性生活久久| 中文字幕五月欧美| 一区二区欧美精品| 成人一区在线观看| 国产精品视频在线看| 精品制服美女丁香| 日韩精品一区二区三区swag| 亚洲18色成人| 3d成人动漫网站| 免费看日韩精品| 欧美一区二区黄| 卡一卡二国产精品| 久久久精品影视| 国产黄色成人av| 中文字幕在线不卡一区二区三区| 精品制服美女丁香| 久久精品亚洲精品国产欧美| 国产·精品毛片| 国产精品国产三级国产aⅴ中文| 成人免费视频免费观看| 国产精品毛片大码女人| 91污片在线观看| 午夜免费久久看| 色国产综合视频| 亚洲大片免费看| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 美女视频一区在线观看| 日韩一级完整毛片| 国产一区二区91| 亚洲国产精品欧美一二99| 欧美成人高清电影在线| 99视频一区二区| 麻豆一区二区三区| 亚洲精品日产精品乱码不卡| 欧美xingq一区二区| 91丨porny丨户外露出| 韩国视频一区二区| 亚洲一区二区视频在线| 国产日本欧美一区二区| 正在播放亚洲一区| 色综合网站在线| 国产精品亚洲а∨天堂免在线| 午夜视频一区二区三区| 综合久久久久综合| 久久久久久久久久久电影| 欧美日韩国产乱码电影| 成人国产亚洲欧美成人综合网| 麻豆一区二区三| 同产精品九九九| 一区二区三区在线观看国产 | 国产欧美一区二区三区鸳鸯浴 | 欧日韩精品视频| 国产精品乡下勾搭老头1| 日韩国产精品久久久久久亚洲| 国产精品伦理在线| 久久免费午夜影院| 精品国产一区二区亚洲人成毛片| 欧美在线播放高清精品| 成人小视频免费观看| 国模无码大尺度一区二区三区| 夜夜嗨av一区二区三区| 中文字幕日韩精品一区| 中文字幕巨乱亚洲| 国产区在线观看成人精品| 久久久久久久一区| 精品久久国产字幕高潮| 91麻豆精品国产91久久久更新时间| 91国内精品野花午夜精品| 99视频在线观看一区三区| 成人精品视频一区二区三区尤物| 国产精品18久久久久久久久| 国产一区二区三区高清播放| 国产一区二区福利视频| 狠狠色丁香九九婷婷综合五月| 久久精品国产成人一区二区三区| 蜜桃av一区二区| 麻豆精品新av中文字幕| 欧美96一区二区免费视频| 日韩成人伦理电影在线观看| 日韩精品欧美精品| 免费成人av在线| 蜜桃精品视频在线观看| 国产在线精品一区二区| 国产91丝袜在线观看| 成人高清视频免费观看| 99视频国产精品| 91黄色小视频| 欧美日韩免费观看一区三区| 欧美一区二区三区影视| 日韩欧美二区三区| 欧美精彩视频一区二区三区| 国产精品国产三级国产普通话99| 亚洲乱码国产乱码精品精的特点| 亚洲一区二区综合| 日本不卡不码高清免费观看| 久色婷婷小香蕉久久| 高清av一区二区| 日本韩国欧美一区| 欧美一区二区三区四区视频| 欧美精品一区二区三区蜜桃视频| 国产欧美日韩精品一区| 亚洲激情图片一区| 日本女人一区二区三区| 国产剧情在线观看一区二区| 99国产精品99久久久久久| 欧美日韩精品系列| 久久久无码精品亚洲日韩按摩| 国产精品久久久久久久久快鸭| 亚洲超丰满肉感bbw| 国产一区二区美女| 亚洲第一会所有码转帖| 不卡av在线免费观看| 色8久久精品久久久久久蜜| 欧美久久一区二区| 国产婷婷色一区二区三区四区 | 亚洲色图制服诱惑| 日韩国产高清影视| 国产成人精品亚洲日本在线桃色| 在线看国产一区二区| 精品久久久三级丝袜| 亚洲激情图片小说视频| 国产一区二区日韩精品| 欧美偷拍一区二区| 久久精品人人做人人爽人人| 亚洲一区二区三区在线看| 国产伦精品一区二区三区免费迷| 91国产免费看| 国产亚洲女人久久久久毛片| 亚洲一区二区三区四区不卡| 国产suv精品一区二区6| 91麻豆精品国产91久久久久 | 久久99精品国产91久久来源| 91年精品国产| 精品国产91乱码一区二区三区| 亚洲一区二区在线免费观看视频 | 日韩精品一区二区三区中文不卡| 国产精品天美传媒沈樵| 麻豆精品视频在线观看视频| 在线观看国产一区二区| 国产精品三级视频| 美国精品在线观看| 欧美伦理视频网站| 一区二区三区日韩欧美精品| 国产成人一区二区精品非洲| 欧美电视剧在线看免费| 亚洲成人在线网站| 色视频成人在线观看免| 亚洲欧美在线高清| 国产电影一区二区三区| 欧美www视频| 久久精品久久综合| 7777精品伊人久久久大香线蕉 | av在线播放不卡| 欧美国产精品久久| 国产一区二区三区免费在线观看| 欧美福利视频一区| 午夜成人在线视频| 欧美日韩电影在线| 午夜精品福利一区二区蜜股av| 一本一道综合狠狠老| 亚洲精品日日夜夜| 欧美怡红院视频| 亚洲美女屁股眼交| 色综合视频一区二区三区高清| 亚洲日本在线视频观看| 99精品视频在线观看免费| 日韩理论片网站| 91麻豆视频网站| 亚洲国产欧美另类丝袜| 欧美日韩一级黄| 美女国产一区二区三区| 欧美tickling网站挠脚心| 国产在线麻豆精品观看| 久久精品视频免费观看| 成人综合激情网| 亚洲人精品一区| 欧美综合一区二区| 天天av天天翘天天综合网| 日韩午夜激情视频| 国产河南妇女毛片精品久久久| 国产欧美一区二区精品婷婷| 成人99免费视频| 夜夜嗨av一区二区三区中文字幕| 欧美日韩国产片| 久88久久88久久久| 国产网站一区二区三区| 色综合久久88色综合天天| 午夜久久久久久| 精品福利av导航| av一区二区久久| 午夜伦欧美伦电影理论片| 精品国偷自产国产一区| 成人伦理片在线| 亚洲成人免费看| 精品处破学生在线二十三| 99精品国产一区二区三区不卡| 亚洲sss视频在线视频| 欧美大片拔萝卜| 91丝袜高跟美女视频| 日本aⅴ亚洲精品中文乱码|