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

📄 hardware.c

📁 microwindows移植到S3C44B0的源码
💻 C
字号:
/* *  linux/arch/m68knommu/platform/68VZ328/dragonixvz/hardware.c * *  (C)  2002 by      Daniel Haensse <daniel.haensse@alumni.ethz.ch> *  Use it under GPL *//* Common functions */#include <asm/MC68VZ328.h>void putC (char ch){	UTX_TXDATA = ch;	while (!(UTX & 0x2000));}void putS (char * str){	while (*str) putC (*(str++));}void printhex (unsigned long n){unsigned long	i;	if ((i = n / 16)) printhex (i);	if (n % 16 > 9) putC (n % 16 + '7');	else putC (n % 16 + '0');}void uwait(unsigned long x){ int loop; while(x>0) {  for(loop=0;loop<10;loop++);  x--; }}/* SPI functions */#define NONE 0#define PEN  1#define CLK  2unsigned long SPIIO(unsigned char chip, unsigned long shifts, unsigned long out){ int loop; unsigned long in=0; *(volatile unsigned  char *)0x4000103=(chip&0x03); uwait(5); for(loop=shifts;loop>0;loop--) {  *(volatile unsigned  char *)0x4000103= (((out&(1<<(loop-1)))!=0 ? 0x10 : 0x00) | (chip&0x03));        /* data out */  uwait(1);  *(volatile unsigned  char *)0x4000103= (((out&(1<<(loop-1)))!=0 ? 0x10 : 0x00) | (chip&0x03) | 0x04); /* clk */  uwait(5);  in=(in<<1) | (((*(volatile unsigned  char *)0x4000103)&0x10)>>4);  uwait(5);  *(volatile unsigned  char *)0x4000103= (((out&(1<<(loop-1)))!=0 ? 0x10 : 0x00) | (chip&0x03));        /* data out */  uwait(5); } *(volatile unsigned  char *)0x4000103=0; /* deselect all */ return(in);}/* I2C Functions */unsigned char I2CStart(){ *(volatile unsigned  char *)0x4000102= 0x0f; /* SDA=1 , SCL =1 */ uwait(5); *(volatile unsigned  char *)0x4000102= 0x0b; /* SDA=0 , SCL =1 */ uwait(5); *(volatile unsigned  char *)0x4000102= 0x0a; /* SDA=0 , SCL =0 */ uwait(5);}void I2CACK(){ *(volatile unsigned  char *)0x4000102= 0x0b; /* SDA=0 , SCL =1 */ uwait(5); *(volatile unsigned  char *)0x4000102= 0x0a; /* SDA=0 , SCL =0 */ uwait(5);}void I2CNACK(){ *(volatile unsigned  char *)0x4000102= 0x0f; /* SDA=1 , SCL =1 */ uwait(5); *(volatile unsigned  char *)0x4000102= 0x0e; /* SDA=1 , SCL =0 */ uwait(5);}unsigned char I2CSendByte(unsigned char data){ int loop; for(loop=0;loop<8;loop++) {  if(data&0x80)  {   *(volatile unsigned  char *)0x4000102= 0x0e; /* SDA=1 , SCL =0 */   uwait(1);   *(volatile unsigned  char *)0x4000102= 0x0f; /* SDA=1 , SCL =1 */   uwait(5);   *(volatile unsigned  char *)0x4000102= 0x0e; /* SDA=1 , SCL =0 */   uwait(5);  }  else  {   *(volatile unsigned  char *)0x4000102= 0x0a; /* SDA=0 , SCL =0 */   uwait(1);   *(volatile unsigned  char *)0x4000102= 0x0b; /* SDA=0 , SCL =1 */   uwait(5);   *(volatile unsigned  char *)0x4000102= 0x0a; /* SDA=0 , SCL =0 */   if(loop!=7)   {    uwait(5);   }  }  data=data<<1; } *(volatile unsigned  char *)0x4000102= 0x02; /* SDA=Z , SCL =0 */ uwait(5); *(volatile unsigned  char *)0x4000102= 0x03; /* SDA=Z , SCL =1 */ uwait(5); loop=((*(volatile unsigned  char *)0x4000102) & 0x04)>>2; uwait(5); *(volatile unsigned  char *)0x4000102= 0x0e; /* SDA=1 , SCL =0 */ uwait(5);}unsigned char I2CGetByte(){ int loop; unsigned char data=0; for(loop=0;loop<8;loop++) {  *(volatile unsigned  char *)0x4000102= 0x02; /* SDA=Z , SCL =0 */  uwait(5);  *(volatile unsigned  char *)0x4000102= 0x03; /* SDA=Z , SCL =1 */  uwait(5);  data|=((*(volatile unsigned  char *)0x4000102) & 0x04)<<5;  uwait(5);  *(volatile unsigned  char *)0x4000102= 0x02; /* SDA=Z , SCL =0 */ } *(volatile unsigned  char *)0x4000102= 0x0a; /* SDA=0 , SCL =0 */ uwait(5); return(data);}unsigned char I2CStop(){ *(volatile unsigned  char *)0x4000102= 0x0a; /* SDA=0 , SCL =0 */ uwait(5); *(volatile unsigned  char *)0x4000102= 0x0b; /* SDA=0 , SCL =1 */ uwait(5); *(volatile unsigned  char *)0x4000102= 0x0f; /* SDA=1 , SCL =1 */ uwait(5);}/* Abstract functions, please keep the functions untouched when we improve the functionality of the FPGA */unsigned char BCD_TO_BIN(unsigned char val){        return( ((val)&15) + ((val)>>4)*10 );}/* Read Real Time Clock Location */unsigned char RTCRead(unsigned int addr){ return( SPIIO(CLK,16,addr<<8) &0xff );}/* Write Real Time Clock Location */void RTCWrite(unsigned int addr,unsigned char data){ SPIIO(CLK,16,(addr<<8)|0x8000 | data);}/* Set Contrast Voltage, see pdf for table */void SetContrast(unsigned char data){ I2CStart();                                          /* Send start bit */ I2CSendByte(0x58); I2CSendByte(data); I2CStop();}/* Backlight */void BacklightOn(){ *(volatile unsigned  char *) 0xfffff409 &=~0x80;}void BacklightOff(){ *(volatile unsigned  char *) 0xfffff409 |=0x80;}/* We use the following mapping of the cmos ram *//*        0x20 xor crc of memory 0x21 to 0x7F        0x21 lcdcontrast        0x22,0x23,0x24,0x25,0x26,0x27 mac address 1        0x28,0x29,0x2a,0x2b,0x2c,0x2d mac address 2        0x2e and following are unused*/unsigned char rtccmosinvalid(){ unsigned char crccalc=0,crc; unsigned int addr; crc=RTCRead(0x20); for(addr=0x21;addr<0x80;addr++)  crccalc^=RTCRead(addr); if(crc!=crccalc) { /* Folks if you use a display that needs a voltage,    change this otherwise it will be destroyed  */        RTCWrite(0x0f,0x00);    /* Remove write protection */        RTCWrite(0x21,0x00);    /* Switch contrast off */        RTCWrite(0x22,0x00);    /* Mac 1 */        RTCWrite(0x23,0x08);        RTCWrite(0x24,0x9D);        RTCWrite(0x25,0x00);        RTCWrite(0x26,0x00);        RTCWrite(0x27,0x00);        RTCWrite(0x28,0x00);    /* Mac 2 */        RTCWrite(0x29,0x08);        RTCWrite(0x2a,0x9D);        RTCWrite(0x2b,0x00);        RTCWrite(0x2c,0x00);        RTCWrite(0x2d,0x01);        crccalc=0;        for(addr=0x21;addr<0x80;addr++)  crccalc^=RTCRead(addr);        RTCWrite(0x20,crccalc); /* Revalidate CMOS, leave time unchanged */        RTCWrite(0x0f,0x40);    /* Enable write protection */        return(0x01); } else        return(0x00);}/* Charge Lithium Battery */void rtcchargebattery(){ RTCWrite(0x0f,0x00);    /* Remove write protection */ RTCWrite(0x11,0xa5);    /* 3.9-0.7V = 3.2V Zenervoltage sourced over 200R resistor and 2k serie resistor */ RTCWrite(0x0f,0x40);    /* Enable write protection */}void rtcgettod(int *yearp, int *monp, int *dayp, int *hourp, int *minp, int *secp){	*secp   =       BCD_TO_BIN(RTCRead(0x00));	*minp   =       BCD_TO_BIN(RTCRead(0x01));	*hourp  =       BCD_TO_BIN(RTCRead(0x02));	*dayp   =       BCD_TO_BIN(RTCRead(0x04));	*monp   =       BCD_TO_BIN(RTCRead(0x05));	*yearp  =       BCD_TO_BIN(RTCRead(0x06));}/* LCD contrast */unsigned char lcdsetcontrast(){ unsigned char contr=RTCRead(0x21); SetContrast(contr); return(contr);}/* Get hardware address */void gethwaddr(unsigned char dev, unsigned char *addr){ unsigned char i; if(dev==0) // Mac 1 {  for(i=0;i<6;i++)  {   addr[i]=RTCRead(0x22+i);  } } else // Mac 2 {  for(i=0;i<6;i++)  {   addr[i]=RTCRead(0x28+i);  } }}/* Copy date from external to internal RTC */void rtcgetintern(){ /* We must run the RTC in 24 hour mode!!! *//* RTCTIME=BCD_TO_BIN(RTCRead(0x00))        |(BCD_TO_BIN(RTCRead(0x01))<<16)        |(BCD_TO_BIN(RTCRead(0x02))<<24);  */}

⌨️ 快捷键说明

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