📄 1125279671-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 + -