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

📄 linux8305.h

📁 zebra测试源代码用于 SOCKET 通信
💻 H
字号:
/*****************/
#ifndef __KERNEL__
#define __KERNEL__
#include <sys/mman.h>
#include <fcntl.h>
#include <stdio.h>
#include <linux/types.h>
#include <linux/ps2esdi.h>
#include <asm/8xx_immap.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

#define MEM_FILE             "/dev/mem"
/* CPU base address defination */
#define IMMAP_BASE  0xff000000
#define IMMAP_LENTH 0x60000

#define SDC	1<<(15-5)			/*PD[5]*/
#define SDIO 1<<(15-4)		/*PD[4]*/

#define SetBit(x, y) ((x) |= (y))
#define ClrBit(x, y) ((x) &= ~(y))
#define TestBit(x, y) ((x) & (y))

//#define CFG_IMMR		0xFF000000

//#define IOPORT_6993 *PDDAT(immrVal)
#define IOPORT_6993 immrVal->im_ioport.iop_pddat

#define WRITE_6993	((immrVal->im_ioport.iop_pddir) |= SDIO)

#define READ_6993	((immrVal->im_ioport.iop_pddir) &= ~(SDIO))

#define COUNTER_RESET_6993		0x19


int OpenMemFile()
{
	int fd;
	if((fd = open(MEM_FILE, O_RDWR)) == -1)
	{
		printf("open the mem file error.\n");
		return -1;
	}
	else
		return fd;
}

void CloseMenFile(int fd)
{
	close(fd);	
}

void* MemMap(int fd)
{
	void *start;
/*
	struct stat sb;

	if(fstat(fd, &sb) < 0)
	{
		printf(" fstat error !\n");
		return -1;
	}
*/
//printf("here fd is %d\n", fd);
	start = mmap(NULL, IMMAP_LENTH, PROT_READ|PROT_WRITE, 
		MAP_SHARED|MAP_FILE, fd, IMMAP_BASE);
	if(start == MAP_FAILED)
	{
		printf("mmap immr error.\n");
		return (void*)-1;
	}
	else
	{
//		printf("start1 is %d\n", start);
		return start;
	}
}

int MenUmap(volatile immap_t *immrVal)
{
	int stats;

//printf("sunleisunlei here\n");
	if ((stats = munmap((void *)immrVal, IMMAP_LENTH)) == -1)
	{
		printf(" unmmap File error.\n");
	}
	
	return stats;
}
	
int InitSerialInterface()
{
	int fd;
	void* start;
	volatile immap_t *immrVal;
	
	if((fd = OpenMemFile()) < 0)
	{
		return -1;
	}
//	printf("fd is %d\n", fd);
	if((start = MemMap(fd)) < 0)
	{
		return -1;
	}
	else
	{
//		printf("sunlei here %d\n", start);
		immrVal = (volatile immap_t *)start;
	}

	(immrVal->im_ioport.iop_pdpar) &= ~(SDC|SDIO) ; /*GPIO Pin*/
	(immrVal->im_ioport.iop_pddir) |= SDC;		/*SMDC output*/

	if (MenUmap(immrVal) == -1)
	{
        	return -1;
	}
	CloseMenFile(fd);

//	printf("Initiate Ok!!!\n");
	return 0;
}	
	
void SerialDelay(int dly_count)
{
	    while((dly_count--) != 0);
}
	
int SerialPulse(volatile immap_t *immrVal)
{
		SetBit(IOPORT_6993,SDC);		/*SDC = 1*/
		SerialDelay(2);
		ClrBit(IOPORT_6993,SDC);		/*SDC = 0*/
		SerialDelay(2);		
		return 0;
}
	
u_int16_t SMIRead (u_int8_t phyAddr, u_int8_t regAddr)
{
	int counter, i;
	int fd=0;
	void* start;
	u_int8_t StartBit,OPCode,TABit;
	u_int16_t readData;
	volatile immap_t *immrVal;

	if((fd = OpenMemFile()) < 0)
	{
		return -1;
	}
	
	if((start = MemMap(fd)) < 0)
	{
		return -1;
	}
	else
	{
		immrVal = (volatile immap_t *)start;
	}
	    
	WRITE_6993;	/*SDIO output*/	
	ClrBit(IOPORT_6993,SDC);
	ClrBit(IOPORT_6993,SDIO);
	SerialDelay(2);

		
	/* PRE Bit 32Bit */ 
	for (counter = 0 ; counter <35 ; counter++ )
	{
		SetBit(IOPORT_6993,SDIO);			
		SerialPulse(immrVal);
	} 
	
	/* START BIT 2Bit  
	Start Data 0x01*/ 
	StartBit = 0x01;
	for (counter = 0 ; counter < 2 ; counter++ )
	{
		TestBit(StartBit<<counter, 0x02) ? SetBit(IOPORT_6993, SDIO) : ClrBit(IOPORT_6993, SDIO);
		SerialPulse(immrVal);
	}	    		
	    
	/* OPCode  BIT: READ  10 
		Write   01 */ 
	OPCode = 0x02;
	for (counter = 0 ; counter < 2 ; counter++ )
	{
		TestBit(OPCode<<counter, 0x02) ? SetBit(IOPORT_6993, SDIO) : ClrBit(IOPORT_6993, SDIO);
		SerialPulse(immrVal);
	}
		
	/*PHY Addr 5bit*/
	for(i = 0; i < 5; i++)
    	{
		if((phyAddr& 0x10) == 0)
		{
			ClrBit(IOPORT_6993, SDIO);
		}
		else
		{
			SetBit(IOPORT_6993, SDIO); 
		}
			SerialPulse(immrVal);
			phyAddr <<= 1;
	}
	
	/*REG Addr 5bit*/
	for(i = 0; i < 5; i++)
	{
    		if((regAddr & 0x10) == 0)
		{
			ClrBit(IOPORT_6993, SDIO);
		}
    		else
		{
			SetBit(IOPORT_6993, SDIO); 
		}
    			SerialPulse(immrVal);

			regAddr<<= 1;
	}
		

	TABit = 0x02;
	for (counter = 0 ; counter < 1 ; counter++ )
	{
		TestBit(TABit<<counter, 0x02) ? SetBit(IOPORT_6993, SDIO) : ClrBit(IOPORT_6993, SDIO);
		SerialPulse(immrVal);
	}
		
	SerialDelay(100);

	readData = 0;
		
	/* latch Data from Serial Management SDIO pin 
	latch Data from IC  DO pin */

	READ_6993;
		
	for ( counter = 0 ; counter < 16 ; counter++ )
	{				
		SetBit(IOPORT_6993, SDC);	
		SerialDelay(2);

		if ( TestBit(IOPORT_6993,SDIO) )	
		{
			readData = readData | 0x0001;
		}
		if ( counter < (16 - 1) )
		{
			readData = readData << 1;
		}
	       	
		ClrBit(IOPORT_6993, SDC);	
		SerialDelay(2);				   		
	}		 
				
 	SerialPulse(immrVal);
		
	if (MenUmap(immrVal) == -1)
	{
        	return -1;
	}
	CloseMenFile(fd);
	
	   	return (readData);    
}

int SMIWrite (u_int8_t phyAddr,u_int8_t regAddr,u_int16_t data)
{
	int counter,i;
	u_int8_t StartBit,OPCode,TABit;
	int fd;
	void* start;
	volatile immap_t *immrVal;
	
	if((fd = OpenMemFile()) < 0)
	{
		return -1;
	}
	
	if((start = MemMap(fd)) < 0)
	{
		return -1;
	}
	else
	{
		immrVal = (volatile immap_t *)start;
	}
			
	WRITE_6993;	/*SDIO output*/	
	ClrBit(IOPORT_6993,SDC);
	ClrBit(IOPORT_6993,SDIO);
	SerialDelay(2);
		
	/* PRE Bit 32Bit */ 
	for (counter = 0 ; counter <35 ; counter++ )
	{
		SetBit(IOPORT_6993,SDIO);			
		SerialPulse(immrVal);
	} 
	
	/* START BIT 2Bit  
	Start Data 0x01*/ 
	StartBit = 0x01;
	for (counter = 0 ; counter < 2 ; counter++ )
	{
		TestBit(StartBit<<counter, 0x02) ? SetBit(IOPORT_6993, SDIO) : ClrBit(IOPORT_6993, SDIO);
		SerialPulse(immrVal);
	}	    		
	    
	/* OPCode  BIT: READ  10 
	Write   01 */ 
	OPCode = 0x01;
	for (counter = 0 ; counter < 2 ; counter++ )
	{
		TestBit(OPCode<<counter, 0x02) ? SetBit(IOPORT_6993, SDIO) : ClrBit(IOPORT_6993, SDIO);
		SerialPulse(immrVal);
	}
		
	/*PHY Addr 5bit*/
	for(i = 0; i < 5; i++)
	{
    		if((phyAddr& 0x10) == 0)
		{
			ClrBit(IOPORT_6993, SDIO);
		}
    		else
		{
			SetBit(IOPORT_6993, SDIO); 
		}
    		SerialPulse(immrVal);

		phyAddr <<= 1;
	}

	/*REG Addr 5bit*/
	for(i = 0; i < 5; i++)
	{
		if((regAddr & 0x10) == 0)
		{
			ClrBit(IOPORT_6993, SDIO);
		}
    		else
		{
			SetBit(IOPORT_6993, SDIO); 
		}
    		SerialPulse(immrVal);

		regAddr<<= 1;
	}
	
	/* TA 2 BIT */ 
	TABit = 0x02;
	for (counter = 0 ; counter < 2 ; counter++ )
	{
		TestBit(TABit<<counter, 0x02) ? SetBit(IOPORT_6993, SDIO) : ClrBit(IOPORT_6993, SDIO);
		SerialPulse(immrVal);
	}

	/*
	SerialPulse(immrVal);
	*/
		
	SerialDelay(100);
		
	for(counter = 0;counter<16;counter++)
	{
		TestBit(data<<counter, 0x8000) ? SetBit(IOPORT_6993, SDIO) : ClrBit(IOPORT_6993, SDIO);
		SerialPulse(immrVal);
				
	}

	if (MenUmap(immrVal) == -1)
	{
        	return -1;
	}
	CloseMenFile(fd);
printf("write %d is ok!\n", data);	
	return 0;
}


int RTL8305_Reg_Display()
{	
	int ret = 0;
	u_int16_t data_read;

	/*Init Pin*/
//	printf("ooooooooooooooo\n");
	InitSerialInterface();

	if((ret = SMIWrite(0, 4, 0x520)) == -1)
	{
		printf("Writing is error!!!\n");
		return -1;
	}
	data_read= SMIRead(0, 4);
	printf("read the data is %d\n", data_read);
	
//	printf("kkkkkkkkkkkkk\n");
        
        return 0;
}


#endif /* __KERNEL__ */

⌨️ 快捷键说明

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