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

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

?? dpram.c

?? linux下雙口RAM idt7026驅動源碼
?? C
字號:
/*******************************************************************************************
文件名	: 1MW風力發電CPU模塊_雙口RAM驅動程序DPRAM.c
作者 	: 王堅,劉志亮
日期	: 2008.10.25
備注	: 雙口ram :IDT70261S驅動程序,處理器:at91rm9200,OS:zimagev2
********************************************************************************************/
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/mm.h>
#include <linux/init.h>
#include <linux/string.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <asm/mach/map.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/cdev.h>

#include "DPRAM.h"

#define DEBUG 1
#define DEBUG_MSG 1
char part;	//分區號
// 在調試模式如果發生的錯誤,則顯示錯誤信息并掛起程序,否則程序繼續
#ifdef DEBUG
	inline void handle_error(char *s)
	{
		printk("Error:%s\n",s);
		while(1);
	}
	#define ASSERT(k,s) { (!k) ? 0 : handle_error(s);}
#else
	#define ASSERT(k,s)
#endif

//顯示調試信息
#ifdef DEBUG_MSG
	#define	PDEBUG(s) printk("DEBUG:%s\n",(s))
#else
	#define	PDEBUG(s)
#endif

#define	out_w(v, a)	    (*(volatile char *)(a) = (v))
#define in_w(a)         (*(volatile int *)(a))

unsigned char get_semaphorer(unsigned char partition)
{
	unsigned int a=0,i;
	char *semaphorer = (char *)semaphorer_logic_address;
	partition*=2;//wj
	semaphorer += partition;
	out_w(0x00,semaphorer);	

	while((*semaphorer)!=0)
		{
			a++;
	//		usleep(200);
			if(a>10000)
			{
	//			printk("dpram busy\n");		
				out_w(0x01,semaphorer);
//				a = 0;
				return 1;
	//			break;
			}
	//	  for(a=0;a<5000;a++)
		}		  
		
//	}
	return 0;
#if 0
	if(a >= 5000)
	{
	 	 a = 0;
	  	return 1;
   	 }	
	else
	{
		  return 0;	
	}
#endif
}

/*
 * 釋放相應分區的信號量
 */
static void put_semaphorer(unsigned char partition)
{
	char *semaphorer = (char *)semaphorer_logic_address;
	partition*=2;
	semaphorer += partition;
	out_w(0x01,semaphorer);
}

/********************************************************************************************
名稱 :	ioctl
功能 :	選擇雙口ram分區
輸入 :	inod:未使用;f:雙口ram的文件描述符;arg1:分區號;arg2:未使用
輸出 : 返回值0;
備注 :
**********************************************************************************************/
int dualram_ioctl(struct inode *inod,struct file *f,unsigned int arg1,unsigned char arg2)
{ 
	switch (arg1)
	{
       		case 1  :  	part = 0;
                		break;
           	case 2  :  	part = 1;
                		break;
           	case 3  :  	part = 2;
                		break;
           	case 4  :	part = 3;
				break;
           	default :  	printk("wrong part\n");
				break;
	}
 	return 0;
}

/*********************************************************************************************
名稱 : dualram_read(struct file *file, char __user *buf,ssize_t count, loff_t* ppos)
功能 : 讀雙口ram
輸入 : file:雙口ram的文件描述符;buf:讀緩沖區;	count:讀字節數;ppos:分區偏移量
輸出 : 返回值實際讀字節數;
備注 :
*********************************************************************************************/
static long dualram_read(struct file *file, char __user *buf,ssize_t count, loff_t* ppos)
{	
	ssize_t num;
	unsigned long offset=*ppos;

//	printk("sem logic addr=%x\n",semaphorer_logic_address);
//	printk("mem addr=%x\n",memory_logic_address);
	if(1==get_semaphorer(part))
		{
			printk("dpram read busy,part=%x\n",part+1);	//wj
//			put_semaphorer(part);
			return 0;
		}
//	printk("read got\n");
	num=copy_to_user(buf,(unsigned char *)( partition_data_start(part)+offset),count);
	put_semaphorer(part);//wj
//	printk("read put\n");
	return num;
}

/********************************************************************************************
名稱 : dualram_write(struct file *file,  char __user *buf,size_t count, loff_t *ppos)
功能 : 讀雙口ram
輸入 : file:雙口ram的文件描述符;buf:寫緩沖區;	count:寫字節數;ppos:分區偏移量
輸出 : 返回值實際讀字節數;
備注 :
**********************************************************************************************/
static  long dualram_write(struct file *file,  char __user *buf,size_t count, loff_t *ppos)
{	
	ssize_t num;
	unsigned long offset=*ppos;
	if(1==get_semaphorer(part))
		{
			printk("dpram write busy\n");	//wj
//			put_semaphorer(part);
			return 0;
		}//wj
	num=copy_from_user((unsigned char *)(partition_data_start(part)+offset), buf, count);
	put_semaphorer(part);//wj
	return num;
}

/********************************************************************************************
名稱 :	dualram_open(struct inode *inode, struct file *file)
功能 :	打開雙口ram時由系統調用
輸入 :	
輸出 :
備注 : 保留
**********************************************************************************************/
static int dualram_open(struct inode *inode, struct file *file)
{
	//PDEBUG("dualram open");
	return 0;
}

/********************************************************************************************
名稱 :	dualram_release(struct inode *inode, struct file *file)
功能 :	關閉雙口ram時由系統調用
輸入 :	
輸出 :
備注 : 保留
**********************************************************************************************/
static int dualram_release(struct inode *inode, struct file *file)
{
	PDEBUG("dualram close");
	return 0;
}
//注冊驅動函數
static struct file_operations dualram_fops = 
{
	.owner	 =	THIS_MODULE,
	.open	 =	dualram_open,
	.ioctl	 =	dualram_ioctl,
	.release =	dualram_release,
	.read	 =	dualram_read,
	.write	 =	dualram_write,
};

/********************************************************************************************
名稱 : dual_mem_bank_init(void)
功能 : 初始化雙口ram,配置處理器寄存器
輸入 :	
輸出 :
備注 :
**********************************************************************************************/
static int __init dual_mem_bank_init(void)
{
	long *ncs,*ncs5,*ebi_csa,*ebi_cfgr;
    	void *config_addr = ioremap_nocache(0xfffff000, 0xfff);

	ncs  = (long *)(config_addr + 0xf80);
    	ncs5 = (long *)(config_addr + 0xf84);
    	ebi_csa = (long *)(config_addr + 0xf60);
    	ebi_cfgr = (long *)(config_addr + 0xf64);
    	*ebi_csa &= 0x0000000f;
    	*ebi_cfgr = 0x00000000;
    	*ncs = 0x00003284;
    	*ncs5 = 0x00003284;
    	return 0;
}

/********************************************************************************************
名稱:	dualram_map_to_kernel(void)
功能:	將雙口中RAM的地址映射到內核空間,雙口RAM的物理地址分別分0x5000 0000,要映射成無緩存的
輸入:	
輸出:
備注:
**********************************************************************************************/
static int __init dualram_map_to_kernel(void)
{
	/* 映射雙口RAM內存到內核空間 */
	memory_logic_address = (unsigned long) ioremap(DUAL_MEM_PHYS, DUAL_RAM_SIZE);
	if(!memory_logic_address)
	{
		printk(KERN_ERR"Can't remap dual ram memory");
		return -1;
	}
	/* 映射雙口RAM信號量到內核空間 */
	semaphorer_logic_address = (unsigned long) ioremap_nocache(DUAL_SEMAPHORER_PHYS, DUAL_SEMAPHORER_SIZE);//物理地址為偶數,可能有問題
	if(!semaphorer_logic_address)
	{
		iounmap((void *)memory_logic_address);
		printk(KERN_ERR"Can't remap dual semaphorer memory");
		return -1;
	}
	return 0;
}

#define MAJOR_NUMBER	253

static int major_nr=MAJOR_NUMBER,minor_nr=0;//主設備號,次設備號,根據實際情況改動
const char device_name[] = "dualram";
struct cdev *dualram_cdev = NULL;
dev_t dualram_dev = 0;

/********************************************************************************************
名稱:	dualram_init(void)
功能:	初始化,將雙口RAM的內在映射到內核空間
輸入:	
輸出:
備注:加載模塊時,系統調用
**********************************************************************************************/

int __init dualram_init(void)
{
	int err ;
	if((err = dual_mem_bank_init()))//硬件配置
	{
		printk(KERN_ERR"dual memory bank initial error");
		return err;
	}

	if(dualram_map_to_kernel())//將雙口RAM映射到內核空間
		return -1;
  
	err = register_chrdev(major_nr,"dualram",&dualram_fops);//設備注冊到內核
	if(err<0)
	{
		printk(KERN_DEBUG"register char device error\n");
		iounmap((void *)memory_logic_address);
		iounmap((void *)semaphorer_logic_address);
	}
	return 0;
}
/********************************************************************************************
名稱:	dualram_cleanup(void)
功能:	釋放申請的資源
輸入:	
輸出:
備注:卸載模塊時,系統調用
**********************************************************************************************/
static void __exit dualram_cleanup(void)
{
	int err=0;
	err=unregister_chrdev(253,"dualram");
	if(err<0)
  	{
    		printk("<1>UnRegister Fail!\n");
  		return;
  	}
	iounmap((void *)memory_logic_address);
	iounmap((void *)semaphorer_logic_address);
  	PDEBUG("GOOD-bye!\n");
}

module_init(dualram_init);
module_exit(dualram_cleanup);

MODULE_AUTHOR("UESTC");
MODULE_DESCRIPTION("Dual port ram used in at91rm9200");
MODULE_LICENSE("GPL");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美色图免费看| 成人一区二区三区视频| 国产精品乱码妇女bbbb| 欧美v国产在线一区二区三区| 欧美美女一区二区| 精品视频资源站| 欧美综合天天夜夜久久| 91福利社在线观看| 欧美撒尿777hd撒尿| 欧美美女bb生活片| 欧美成人video| 久久精子c满五个校花| 国产欧美一区二区三区沐欲 | 亚洲男同1069视频| 亚洲婷婷在线视频| 久久激情综合网| 黑人巨大精品欧美黑白配亚洲| 国产麻豆精品在线| www.成人在线| 欧美日韩亚洲综合一区| 7777精品伊人久久久大香线蕉经典版下载 | 91久久精品一区二区三区| 欧美三级午夜理伦三级中视频| 欧美伊人精品成人久久综合97 | 欧美一卡2卡三卡4卡5免费| 精品女同一区二区| 国产精品久久久久影院| 亚洲高清在线视频| 国产成人精品免费一区二区| 成人黄色777网| 欧美久久婷婷综合色| 欧美tk丨vk视频| 亚洲欧洲精品一区二区精品久久久| 一区二区三区精密机械公司| 日本91福利区| 93久久精品日日躁夜夜躁欧美| 欧美日韩卡一卡二| 国产欧美日韩三级| 性做久久久久久免费观看欧美| 国产在线视视频有精品| 在线观看91精品国产入口| 亚洲精品在线电影| 亚洲午夜激情网站| 国产成人亚洲综合色影视| 欧美三级中文字| 国产精品久线在线观看| 精品一区二区三区视频| 欧美亚洲国产一区在线观看网站| 久久亚洲捆绑美女| 天天色天天操综合| 色婷婷av一区二区三区gif| 久久噜噜亚洲综合| 日韩vs国产vs欧美| 色老汉av一区二区三区| 久久久蜜桃精品| 日本视频一区二区| 91国产福利在线| 中文字幕亚洲精品在线观看| 极品销魂美女一区二区三区| 欧美视频日韩视频在线观看| 国产精品久久久久久久久果冻传媒| 麻豆精品在线播放| 欧美一卡2卡三卡4卡5免费| 亚洲网友自拍偷拍| 色综合天天天天做夜夜夜夜做| 国产肉丝袜一区二区| 极品美女销魂一区二区三区| 国产人久久人人人人爽| 国产在线精品国自产拍免费| 91精品国产综合久久久久久| 亚洲成av人片在线| 欧美精品三级日韩久久| 亚洲综合久久久| 精品视频色一区| 亚洲尤物视频在线| 欧美人妖巨大在线| 日日夜夜精品视频免费| 欧美日韩免费电影| 日韩国产欧美在线视频| 91精品婷婷国产综合久久 | 日韩久久久久久| 精品一区二区三区香蕉蜜桃| 日韩欧美国产1| 国产综合一区二区| 国产亚洲成年网址在线观看| 国产成人亚洲综合a∨婷婷| 久久免费午夜影院| 成a人片亚洲日本久久| 亚洲视频在线一区观看| 欧美少妇xxx| 日韩国产高清影视| 久久亚洲欧美国产精品乐播 | 亚洲精品伦理在线| 欧美色窝79yyyycom| 日本欧美在线看| 久久久久久久精| 波多野结衣亚洲| 伊人夜夜躁av伊人久久| 91精品麻豆日日躁夜夜躁| 久国产精品韩国三级视频| 久久久蜜臀国产一区二区| 97久久超碰国产精品电影| 亚洲一级片在线观看| 欧美xxxx老人做受| 97精品电影院| 久久精品国产精品青草| 中文成人综合网| 中文字幕亚洲一区二区av在线 | 亚洲日本乱码在线观看| 欧美亚洲日本国产| 国产一区在线观看视频| 日韩理论片在线| 日韩视频免费直播| 99久久国产综合精品麻豆| 天天综合色天天| 欧美韩日一区二区三区四区| 欧美乱熟臀69xxxxxx| 成人免费黄色大片| 人禽交欧美网站| 亚洲女同ⅹxx女同tv| 精品美女在线观看| 欧美日韩五月天| 成人免费看黄yyy456| 美女在线视频一区| 亚洲综合区在线| 国产精品视频麻豆| 91精品国产综合久久精品图片| caoporm超碰国产精品| 欧美午夜片在线看| 成人午夜视频网站| 免费久久精品视频| 亚洲一区二区av电影| 国产精品久久看| 久久久综合网站| 日韩午夜精品视频| 91麻豆精品国产91久久久更新时间| 99re成人精品视频| 国产成a人亚洲| 国产资源在线一区| 日韩国产精品久久久久久亚洲| 亚洲精品视频在线观看网站| 中文在线免费一区三区高中清不卡 | 高清久久久久久| 青椒成人免费视频| 视频精品一区二区| 亚洲一卡二卡三卡四卡五卡| 亚洲精品国产成人久久av盗摄| 久久婷婷色综合| 欧美va日韩va| 久久综合九色欧美综合狠狠| 91精品国产综合久久香蕉麻豆 | 东方欧美亚洲色图在线| 麻豆91免费看| 久久成人18免费观看| 日本女优在线视频一区二区| 亚洲一区在线视频| 亚洲电影第三页| 亚洲丰满少妇videoshd| 亚洲一区二区三区四区在线免费观看| 成人欧美一区二区三区视频网页 | 午夜视频一区二区| 日一区二区三区| 美女脱光内衣内裤视频久久网站 | 精品视频全国免费看| 欧美日韩免费在线视频| 欧美精品一二三区| 日韩欧美成人一区二区| 久久久亚洲精品一区二区三区| 国产日韩亚洲欧美综合| 亚洲国产精品成人综合色在线婷婷 | 91视频一区二区| 91国产丝袜在线播放| 欧美日韩国产系列| 欧美一级夜夜爽| 国产无遮挡一区二区三区毛片日本| 国产亚洲一本大道中文在线| 国产精品久久久久影院老司| 亚洲图片欧美一区| 国产在线精品免费| 色狠狠一区二区三区香蕉| 制服丝袜激情欧洲亚洲| 精品粉嫩aⅴ一区二区三区四区 | 91国偷自产一区二区三区成为亚洲经典 | 日韩电影一区二区三区四区| 极品少妇xxxx精品少妇偷拍| 91香蕉视频mp4| 欧美一级专区免费大片| 国产精品情趣视频| 亚洲成人一区二区| 懂色av噜噜一区二区三区av| 欧美色爱综合网| 国产午夜亚洲精品理论片色戒| 亚洲精品成人在线| 国产麻豆视频精品| 欧美日韩精品电影| 欧美激情一区二区三区蜜桃视频| 丝袜亚洲精品中文字幕一区| 国产自产高清不卡| 欧美区视频在线观看| 国产精品你懂的在线欣赏|