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

📄 1125279671-at24c64.c

📁 这是ep9315单板计算机的at24c64的驱动程序源代码
💻 C
字号:
#include <linux/config.h>#include <linux/utsname.h>#include <linux/kernel.h>#include <linux/major.h>#include <linux/string.h>#include <linux/fcntl.h>#include <linux/malloc.h>#include <linux/timer.h>#include <linux/module.h>#include <linux/init.h>#include <linux/poll.h>#include <asm/irq.h>#include <linux/delay.h>#define AT24C64_IRQ_NUM		6#define AT24C64_MAJOR		58static short Ready;static unsigned short AdcValue;static DECLARE_WAIT_QUEUE_HEAD(AT24C64Wait);#define IO_BASE_VIRT        0xFF000000     // Virtual address of IO #define EP93XX_APB_BASE (IO_BASE_VIRT | 0x00800000)#define GPIO_OFFSET              0x040000#define GPIO_BASE                (EP93XX_APB_BASE|GPIO_OFFSET)#define GPIO_PADR                (GPIO_BASE+0x00)#define GPIO_PBDR                (GPIO_BASE+0x04)#define GPIO_PBDDR               (GPIO_BASE+0x14)#define SYSCON_OFFSET           0x130000#define SYSCON_BASE             (EP93XX_APB_BASE|SYSCON_OFFSET)#define SYSCON_DEVCFG           (SYSCON_BASE+0x0080)#define SYSCON_DEVCFG_D1onG 0x40000000#define SYSCON_DEVCFG_D0onG 0x20000000/*WINCE OS memory map*/#if		0#define GPIO_PBDR			    0xb0840004#define GPIO_PBDDR			0xb0840014#endiftypedef unsigned int ULONG;typedef struct tPBDRRegisters{    union    {        struct        {            unsigned char EGPIO8:1;                    unsigned char EGPIO9:1;                    unsigned char EGPIO10:1;                  unsigned char EGPIO11:1;                  unsigned char EGPIO12:1;                  unsigned char EGPIO13:1;                  unsigned char EGPIO14:1;                   unsigned char EGPIO15:1;                   unsigned long  _RSVD:24;         }Field;        unsigned long  Value;    }_PBDR;                             // 00}PBREGISTERS;static PBREGISTERS volatile * const PBD_Regs = (PBREGISTERS *) GPIO_PBDR;#define Cirrus_SMC_CMDVCC				 PBD_Regs->_PBDR.Field.EGPIO8#define Cirrus_SMC_SDA				 PBD_Regs->_PBDR.Field.EGPIO10#define Cirrus_SMC_SC				 PBD_Regs->_PBDR.Field.EGPIO13#define Cirrus_SMC_RSTIN				 PBD_Regs->_PBDR.Field.EGPIO11#define uchar				unsigned char#define bit					unsigned int       typedef struct         {            unsigned char mcu;    	     unsigned char mcu_read;			     unsigned int AT24C64_address;	     unsigned int count;         }inputparameter;	inputparameter  parm1;	bit   Cirrus_SMC_Start(void);void  Cirrus_SMC_Stop(void);void  Cirrus_SMC_Ack(void);void  Cirrus_SMC_Nack(void);bit   Cirrus_SMC_Send_Byte( uchar);uchar Cirrus_SMC_Receive_Byte(void);void  AT24C64_R(uchar *mcu_address,uint AT24C64_address,uint count);void  AT24C64_W(uchar *mcu_address,uint AT24C64_address,uint count);//****************************************************************************// GetSystemTimeInMsec//****************************************************************************// void delay(int n){	int i, j;	for(i = 0; i < 1000; i++)		for(j = 0; j < n; j++)			;}void Cirrus_SMC_TDA8004Init(void){		Cirrus_SMC_RSTIN = 0;		Cirrus_SMC_SC =0;				Cirrus_SMC_CMDVCC = 1;		udelay(1);		Cirrus_SMC_CMDVCC = 0;		udelay(250);		Cirrus_SMC_RSTIN = 1;		udelay(200);		Cirrus_SMC_RSTIN = 0;}bit Cirrus_SMC_Start(void){Cirrus_SMC_TDA8004Init();Cirrus_SMC_SC =1;udelay(1);//udelay(1); Cirrus_SMC_SDA =0; udelay(1); if ( Cirrus_SMC_SDA == 0) return 0;//  if (  Cirrus_SMC_SCK == 0) return 0; Cirrus_SMC_SDA = 1;udelay(10); Cirrus_SMC_SC = 1;udelay(10);#if		0 Cirrus_SMC_SC =1;udelay(1);//udelay(1); Cirrus_SMC_SDA =1; udelay(1); if ( Cirrus_SMC_SDA == 0) return 0;//  if (  Cirrus_SMC_SCK == 0) return 0; Cirrus_SMC_SDA = 0;udelay(10); Cirrus_SMC_SC = 0;udelay(10);#endif return 1;}void  Cirrus_SMC_Stop(void){unsigned long Value_PBDR;Cirrus_SMC_TDA8004Init();udelay(10);Value_PBDR = * ((unsigned long *)GPIO_PBDR);// printk(1,(TEXT(" Cirrus_SMC_Stop GPIO_PBDR is 0x%x    17:32_1  \r\n"), Value_PBDR)); Cirrus_SMC_SDA = 0;udelay(10); Value_PBDR = * ((unsigned long *)GPIO_PBDR); 	// printk(1,(TEXT(" Cirrus_SMC_Stop GPIO_PBDR is 0x%x   17:32_2 \r\n"), Value_PBDR)); Cirrus_SMC_SC = 1;udelay(10); Cirrus_SMC_SDA = 1;udelay(10); Value_PBDR = * ((unsigned long *)GPIO_PBDR); 	// printk(1,(TEXT(" Cirrus_SMC_Stop GPIO_PBDR is 0x%x  17:32_3\r\n"), Value_PBDR));}void Cirrus_SMC_Ack(void){Cirrus_SMC_TDA8004Init();udelay(10); Cirrus_SMC_SDA=0;udelay(10); Cirrus_SMC_SC=1;udelay(10); Cirrus_SMC_SC=0;udelay(10);}void Cirrus_SMC_Nack(void){Cirrus_SMC_TDA8004Init();udelay(10); Cirrus_SMC_SDA=1;udelay(10); Cirrus_SMC_SC=1;udelay(10); Cirrus_SMC_SC=0;udelay(10);}bit Cirrus_SMC_Send_Byte( uchar d){ uchar i = 8; bit bit_ack;Cirrus_SMC_TDA8004Init(); // printk(1,(TEXT(" Cirrus_SMC_Send_Byte_1 d is 0x%x in sending \r\n"), d));  while( i-- ) { //// printk(1,(TEXT(" Cirrus_SMC_Send_Byte_2 d is 0x%x in sending \r\n"), d)); Cirrus_SMC_TDA8004Init(); udelay(10);  if ( d &0x80 )   Cirrus_SMC_SDA =1;  else             Cirrus_SMC_SDA =0;// printk(1,(TEXT(" Cirrus_SMC_Send_Byte_2 Cirrus_SMC_SDA at 19:42 is 0x%x in sending \r\n"), Cirrus_SMC_SDA)); udelay(10);  Cirrus_SMC_SC = 1; udelay(2);  Cirrus_SMC_SC = 0;   udelay(2);  d = d << 1;//  // printk(1,(TEXT(" Cirrus_SMC_Send_Byte_3 d is 0x%x in sending \r\n"), d)); }udelay(10); Cirrus_SMC_SDA = 1;udelay(10); Cirrus_SMC_SC = 1;udelay(2); * ((unsigned long *)GPIO_PBDDR) &= ~0x04; bit_ack = Cirrus_SMC_SDA; * ((unsigned long *)GPIO_PBDDR) |= 0x04;//udelay(10); Cirrus_SMC_SC =0;udelay(2);// printk(1,(TEXT(" Cirrus_SMC_Send_Byte_2 bit_ack at 20:25 is 0x%x in sending \r\n"), bit_ack)); return bit_ack; }uchar Cirrus_SMC_Receive_Byte(void){ uchar i = 8, d = 0xff;udelay(10); Cirrus_SMC_SDA = 1; Cirrus_SMC_TDA8004Init();  while ( i--) { Cirrus_SMC_TDA8004Init();  d = d << 1;  // printk(1,(TEXT(" Cirrus_SMC_Receive_Byte d is 0x%x in receiving 18:16 \r\n"), d)); udelay(10);  * ((unsigned long *)GPIO_PBDDR) &= ~0x04;  Cirrus_SMC_SC =1;    // printk(1,(TEXT(" Cirrus_SMC_Receive_Byte Cirrus_SMC_SDA is 0x%x in receiving \r\n"), Cirrus_SMC_SDA));  if ( Cirrus_SMC_SDA ) d++; udelay(10);  Cirrus_SMC_SC =0; } * ((unsigned long *)GPIO_PBDDR) |= 0x04; return d;}void AT24C64_W(uchar *mcu_address,uint AT24C64_address,uint count){Cirrus_SMC_TDA8004Init();//  DOG_WDI=!DOG_WDI;//  DOGTIME=0; while(count--) { Cirrus_SMC_TDA8004Init();   Cirrus_SMC_Start();  /*Cirrus_SMC_Send_Byte( 0xa0 + AT24C64_address /256 *2);*/  /* 24C16  USE */  Cirrus_SMC_Send_Byte( 0xa0 );  Cirrus_SMC_Send_Byte(  AT24C64_address/256 );  Cirrus_SMC_Send_Byte( AT24C64_address %256 );  // printk(1,(TEXT(" AT24C64_W mcu is 0x%x in wrting \r\n"), *(uchar*)mcu_address));  Cirrus_SMC_Send_Byte( *(uchar*)mcu_address );  Cirrus_SMC_Stop();  mdelay(10);//   Delay_N_mS(10);       /* waiting for write cycle to be completed */  ((uchar*)mcu_address)++;  AT24C64_address++; }}void AT24C64_R(uchar *mcu_address,uint AT24C64_address,uint count){Cirrus_SMC_TDA8004Init();// DOG_WDI=!DOG_WDI;// DOGTIME=0; while(count--) {Cirrus_SMC_TDA8004Init();		  Cirrus_SMC_Start();  /*Cirrus_SMC_Send_Byte( 0xa0 + AT24C64_address / 256 *2 );*/   /* 24C16 USE */  Cirrus_SMC_Send_Byte( 0xa0 );  Cirrus_SMC_Send_Byte( AT24C64_address/256 );  Cirrus_SMC_Send_Byte( AT24C64_address % 256 );  Cirrus_SMC_Start();  /*Cirrus_SMC_Send_Byte( 0xa1 + AT24C64_address /256 *2 );*/  Cirrus_SMC_Send_Byte( 0xa1 );  *(uchar*)mcu_address = Cirrus_SMC_Receive_Byte();    // printk(1,(TEXT(" AT24C64_R mcu is 0x%x in reading \r\n"), *(uchar*)mcu_address));  Cirrus_SMC_Nack();  Cirrus_SMC_Stop();  ((uchar*)mcu_address)++;  AT24C64_address++; }}int GPIO_Init(void){	ULONG _SYSCON_DEVCFG;	ULONG Value_PBDR;	ULONG Value_PBDDR;		//RETAILMSG(1,(TEXT(" SmartcardInitialize Oliver is here! 11:33 !!!!!!!!!!!!- \r\n")));	/*Setup SYSCON_DEVCFG */	_SYSCON_DEVCFG = *((unsigned long *)SYSCON_DEVCFG) ;//	RETAILMSG(1,(TEXT(" SmartcardInitialize SYSCON_DEVCFG is 0x%x \r\n"), _SYSCON_DEVCFG));	*((unsigned long *)SYSCON_DEVCFG) &=(~SYSCON_DEVCFG_D1onG); 	*((unsigned long *)SYSCON_DEVCFG) &=(~SYSCON_DEVCFG_D0onG); 		_SYSCON_DEVCFG = *((unsigned long *)SYSCON_DEVCFG) ;	//RETAILMSG(1,(TEXT(" SmartcardInitialize SYSCON_DEVCFG is 0x%x \r\n"), _SYSCON_DEVCFG));	/*Setup GPIO_PB*/	* ((unsigned long *)GPIO_PBDDR) = 0xFD;	Value_PBDDR = * ((unsigned long *)GPIO_PBDDR);	Value_PBDR = * ((unsigned long *)GPIO_PBDR);//	RETAILMSG(1,(TEXT(" SmartcardInitialize GPIO_PBDR is 0x%x \r\n"), Value_PBDR));//	RETAILMSG(1,(TEXT(" SmartcardInitialize GPIO_PBDDR is 0x%x \r\n"), Value_PBDDR));	return	0;}int AT24C64_test(void){	unsigned char mcu  = 0xAA;	unsigned char mcu_read  = 0x00;		GPIO_Init();	// printk(1,(TEXT(" AT24C64_test Oliver is here!01 11:34 !!!!!!!!!!!!- \r\n")));			Cirrus_SMC_RSTIN = 0;		Cirrus_SMC_SC =0;				Cirrus_SMC_CMDVCC = 1;		udelay(1);		Cirrus_SMC_CMDVCC = 0;		udelay(250);		Cirrus_SMC_RSTIN = 1;		udelay(200);		Cirrus_SMC_RSTIN = 0;					Cirrus_SMC_SC =1;	udelay(10);		//udelay(10);	Cirrus_SMC_SC =0;	udelay(10);		//udelay(10);	Cirrus_SMC_SC =1;	udelay(10);		//udelay(10);       Cirrus_SMC_SC =0;	udelay(10);		//udelay(10);       Cirrus_SMC_SC =1;	udelay(10);		//udelay(10);	Cirrus_SMC_SC =0;	udelay(10);		//udelay(10);	Cirrus_SMC_SC =1;	udelay(10);		//udelay(10);       Cirrus_SMC_SC =0;	udelay(10);		//udelay(10);       Cirrus_SMC_SC =1;	udelay(10);		//udelay(10);	Cirrus_SMC_SC =0;	udelay(10);		//udelay(10);	Cirrus_SMC_SC =1;	udelay(10);		//udelay(10);       Cirrus_SMC_SC =0;	udelay(10);		//udelay(10);       Cirrus_SMC_SC =1;	udelay(10);		//udelay(10);	Cirrus_SMC_SC =0;	udelay(10);		//udelay(10);	Cirrus_SMC_SC =1;	udelay(10);		//udelay(10);       Cirrus_SMC_SC =0;	udelay(10);		//udelay(10);		printk(" AT24C64_test Wrote mcu  is 0x%x \r\n", mcu);	AT24C64_W(&mcu, 0x0, 1);	AT24C64_R(&mcu_read, 0x0, 1);	printk(" AT24C64_test Read mcu_read  is 0x%x \r\n", mcu_read);	return 	0;	}static int AT24C64Close(struct inode * inode, struct file * file){	return 0;}static int AT24C64Open(struct inode * inode, struct file * file){        Ready = 0;	return 0;}static int AT24C64Read(struct file * file, char * buf, size_t count, loff_t *ppos){#if		0	char Value;//	printk("enter kernel AT24C64 read.....\n");	*(unsigned long *)0xfc000000 = 0x0;	Value = *(unsigned char *)0xfc000000;//	printk("0x20000000 : 0x%02x\n", Value);	printk("value : 0x%02x\n", Value);	delay(2000);	copy_to_user(buf, &Value, sizeof Value);#endif	return 0;}/* * select for mouse input */static unsigned int AT24C64Select(	struct file *file, 	struct poll_table_struct *wait){    	if (Ready)		return 1;	poll_wait(file, &AT24C64Wait, wait);	return 0;}static int AT24C64Ioctl(        struct inode *inode,        struct file *file,        unsigned int cmd,        unsigned long arg){	int i;	uchar test_mcu = 0x55;	uchar test_mcu_read = 0;		parm1 = *((inputparameter *)arg);	        switch(cmd) {		case 0:		{			#if		0//			printk("enter ioctl 0......\n");		GPIO_Init();	// printk(1,(TEXT(" AT24C64_test Oliver is here!01 11:34 !!!!!!!!!!!!- \r\n")));			Cirrus_SMC_RSTIN = 0;		Cirrus_SMC_SC =0;				Cirrus_SMC_CMDVCC = 1;		udelay(1);		Cirrus_SMC_CMDVCC = 0;		udelay(250);		Cirrus_SMC_RSTIN = 1;		udelay(200);		Cirrus_SMC_RSTIN = 0;					Cirrus_SMC_SC =1;	udelay(10);		//udelay(10);	Cirrus_SMC_SC =0;	udelay(10);		//udelay(10);	Cirrus_SMC_SC =1;	udelay(10);		//udelay(10);       Cirrus_SMC_SC =0;	udelay(10);		//udelay(10);       Cirrus_SMC_SC =1;	udelay(10);		//udelay(10);	Cirrus_SMC_SC =0;	udelay(10);		//udelay(10);	Cirrus_SMC_SC =1;	udelay(10);		//udelay(10);       Cirrus_SMC_SC =0;	udelay(10);		//udelay(10);       Cirrus_SMC_SC =1;	udelay(10);		//udelay(10);	Cirrus_SMC_SC =0;	udelay(10);		//udelay(10);	Cirrus_SMC_SC =1;	udelay(10);		//udelay(10);       Cirrus_SMC_SC =0;	udelay(10);		//udelay(10);       Cirrus_SMC_SC =1;	udelay(10);		//udelay(10);	Cirrus_SMC_SC =0;	udelay(10);		//udelay(10);	Cirrus_SMC_SC =1;	udelay(10);		//udelay(10);       Cirrus_SMC_SC =0;	udelay(10);		//udelay(10);	//			printk(" AT24C64_test before Writing mcu  is 0x%x \r\n", parm1.mcu);//			AT24C64_W(&(parm1.mcu), 0x0, 1);			AT24C64_W(&test_mcu, 0x0, 1);			printk(" AT24C64_test Wrote mcu  is 0x%x \r\n", test_mcu);//			printk(" AT24C64_test Wrote mcu  is 0x%x \r\n", parm1.mcu);//		 	printk(" AT24C64_test Oliver is here! 16:48 !!!!!!!!!!!!- \r\n");//			printk(" AT24C64_test before Reading mcu_read  is 0x%x \r\n", parm1.mcu_read);//			AT24C64_R(&(parm1.mcu_read), 0x0, 1);			AT24C64_R(&test_mcu_read, 0x0, 1);//			printk(" AT24C64_test Read mcu_read  is 0x%x \r\n", parm1.mcu_read);			printk(" AT24C64_test Read mcu_read  is 0x%x \r\n", test_mcu_read);			#endif						AT24C64_test();				return i;		}				case 1:		{#if		0			static long val2;				while(1)		{			*(unsigned long *)0xfc000000 = 0x0;			delay(100);			val2 = *(unsigned long *)0xfc000000;			printk("0x20000000 : 0x%08x\n", val2);			delay(1000);		}	#endif					}        default:                return -EINVAL;        }}struct file_operations AT24C64_fops = {	read:	AT24C64Read,	poll:	AT24C64Select, 	/* select */	open:	AT24C64Open,	ioctl:	AT24C64Ioctl,	release:	AT24C64Close,};int AT24C64Init(void){        int     rc;	long val;	unsigned char status;        Ready = 0;	 printk("!!!!!!!!!!!!!!!!!!Oliver is here AT24C64............Support\n");        rc = register_chrdev(AT24C64_MAJOR, "AT24C64", &AT24C64_fops);        if (rc < 0) {                printk(KERN_WARNING "AT24C64: can't get Major %d\n",                        AT24C64_MAJOR);                return rc;         }        printk("AT24C64............Support\n");			AT24C64_test();		return 0;}

⌨️ 快捷键说明

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