📄 linux8305.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 + -