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

📄 gpio.c

📁 在潜入市linux 下烧写vivi的原代码 arm上成功执行
💻 C
字号:
/* ./gpio.c*  
*Copyright(C) 2005 yuxiaohu 
*Modify by suney 2005.9.15
*Gpio read and write due to the baseAddr and the shiftAddr
*we put the gpio on the banker 1 of the arm ,so the default BaseAddr is 
*0xfa000000(0x08000000) ,if the bank changed,we can select the banker 
*/
/******************************dpram communication register*****************/

#include "gpio.h"
#include "Macro.h"
#include <stdio.h>
#include <stdlib.h>
unsigned short int GpioRead(unsigned int shiftAddr)
{
   unsigned short int a;
   a=*(volatile unsigned short int*)(BaseAddr+shiftAddr);
   return a;
}
unsigned short int GpioWrite(unsigned int shiftAddr,unsigned short int data)
{ *(volatile unsigned short int *)(BaseAddr+shiftAddr)=data;
   return data;
}
unsigned int GpioBaseAddrSet(unsigned int bankerAddr)
{
      BaseAddr=bankerAddr;
      return BaseAddr;
}
/*
shiftAddr:source
a:aim
size of byte:size
*/
unsigned int ISARead8(unsigned int shiftAddr,unsigned char *a,unsigned int size)
{
 unsigned int i;
 for(i=0;i<size;i++)
    a[i]=*(volatile unsigned char*)(BaseAddr+shiftAddr+i);
 return 1;
}
/*
shiftAddr:aim
a:source
size of byte:size

*/
unsigned char ISAWrite8(unsigned int shiftAddr,unsigned char *a,unsigned int size)
{
  unsigned int i;
  for(i=0;i<size;i++)
    *(volatile unsigned char*)(BaseAddr+shiftAddr+i)=a[i];
  return 1;
  
}

unsigned short int ISARead16(unsigned int shiftAddr,unsigned short int *a,unsigned int size)
{
  unsigned int i;
  for(i=0;i<size;i++)
     a[i]=*(volatile unsigned short int*)(BaseAddr+shiftAddr+i*sizeof(short int));
  return 1;

}

unsigned short int ISAWrite16(unsigned int shiftAddr,unsigned short int *a,unsigned int size)
{
  unsigned int i;
  for(i=0;i<size;i++)
    *(volatile unsigned short int*)(BaseAddr+shiftAddr+i*sizeof(short int))=a[i];
  return 1;

}
/*
num:need translate num
port: translate port
offset:pin num of port
return value:
0:translate error
1:translate ok
*/
int Num_to_Port(int num,int *port,int *offset)
{
  int i;
  int tmp=0;
  if(num<0)
  	return 0;
  for(i=0;i<group_num;i++)
  {
  	if(num<tmp+Port[i])
  	{
  		*port=i;
  		*offset=num-tmp;
  		break;
  	}
	tmp+=Port[i];
  }
  return 1;
}
/*
set gpio port attribute
return value:
0:error
1:ok    
*/
int set_gpio(int portnum,int value)
{
	int port,offset;
	if(!Num_to_Port(portnum,&port,&offset))
	  return 0;
	value&=0x3;  
	*(volatile unsigned int*)gpio_BaseAddr[port]&=~(3<<2*offset);
	*(volatile unsigned int*)gpio_BaseAddr[port]|=(value<<2*offset);
	return 1;
}
/*
return value:
0:error
1:ok
*/
int write_gpio(int portnum,unsigned short int value)
{
	int port,offset;
	if(!Num_to_Port(portnum,&port,&offset))
	  return 0;
	if(value&0x1)
	   *(volatile unsigned int*)(gpio_BaseAddr[port]+4)|=(1<<offset);
     	else
	   *(volatile unsigned int *)(gpio_BaseAddr[port]+4)&=~(1<<offset);
	return 1;
}
/*#define JTAG_TCK        GPE(11)
#define JTAG_TDI        GPG(2)
#define JTAG_TMS        GPG(6)
#define JTAG_TDO        GPG(5)*/
int Jtag_write_gpio(int portnum,unsigned short int value)
{
	int port,offset;
	switch(portnum)
	{
	case JTAG_TCK:
		port=4;
		offset=11;
		break;
	case JTAG_TDI:
		port=6;
		offset=2;
		break;
	case JTAG_TMS:
		port=6;
		offset=6;
		break;
	default:break;
	}
	if(value&0x1)
	   *(volatile unsigned int*)(gpio_BaseAddr[port]+4)|=(1<<offset);
     	else
	   *(volatile unsigned int *)(gpio_BaseAddr[port]+4)&=~(1<<offset);
	return 1;
}
/*
return value:
gpio state
*/
int read_gpio(int portnum)
{
	int port,offset;
	unsigned int tmp;
	if(!Num_to_Port(portnum,&port,&offset))
	  return -1;
	tmp=*(volatile unsigned int*)(gpio_BaseAddr[port]+4);
	tmp>>=offset;
	return (tmp&0x1);
}
int Jtag_read_gpio(int portnum)
{
	int port,offset;
	unsigned int tmp;
	if(JTAG_TDO==portnum)
	{
		port=6;
		offset=5;
	}
	else return -1;
	tmp=*(volatile unsigned int*)(gpio_BaseAddr[port]+4);
	tmp>>=offset;
	return (tmp&0x1);
}

int LCD_parsetup()
{
	set_gpio( LCD_VD0, 1 );
	set_gpio( LCD_VD1, 1 );
	set_gpio( LCD_VD2, 1 );
	set_gpio( LCD_VD3, 1 );
	set_gpio( LCD_VD4, 1 );
	set_gpio( LCD_VD5, 1 );
	set_gpio( LCD_VD6, 1 );
	set_gpio( LCD_VD7, 1 );
	set_gpio( LCD_VD8, 1 );
	set_gpio( LCD_VD9, 1 );
	set_gpio( LCD_VD10, 1 );
	set_gpio( LCD_VD11, 1 );
	set_gpio( LCD_VD12, 1 );
	set_gpio( LCD_VD13, 1 );
	set_gpio( LCD_VD14, 1 );
	set_gpio( LCD_VD15, 1 );
	set_gpio( LCD_VD16, 1 );
	set_gpio( LCD_VD17, 1 );
	set_gpio( LCD_VD18, 1 );
	set_gpio( LCD_VD19, 1 );
	set_gpio( LCD_VD20, 1 );
	set_gpio( LCD_VD21, 1 );
	set_gpio( LCD_VD22, 1 );
	set_gpio( LCD_VD23, 1 );
	set_gpio( LCD_VCLK, 1 );
	set_gpio( LCD_VLINE, 1 );
	set_gpio( LCD_VM, 1 );
	set_gpio( LCD_VFRAME, 1 );
	return 1;       
}
int LPT_parsetup()
{
	set_gpio( LPT_IO0_O , 1 );
	set_gpio( LPT_IO1_O , 1 );
	set_gpio( LPT_IO2_O , 1 );
	set_gpio( LPT_IO3_O , 1 );
	set_gpio( LPT_IO4_O , 1 );
	set_gpio( LPT_IO5_O , 1 );
	set_gpio( LPT_IO6_O , 1 );
	set_gpio( LPT_IO7_O , 1 );
	set_gpio( LPT_IO8_O , 1 );
	set_gpio( LPT_IO9_I , 0 );
	set_gpio( LPT_IO10_I , 0 );
	set_gpio( LPT_IO11_I , 0 );
	set_gpio( LPT_IO12_I , 0 );
	set_gpio( LPT_IO13_O , 1 );
	set_gpio( LPT_IO14_I , 0 );
	set_gpio( LPT_IO15_O , 1 );
	set_gpio( LPT_IO16_O , 1 );
	
	return 1;
}
int JTAG_Set(void)
{
        set_gpio(JTAG_TDI,1);
        set_gpio(JTAG_TMS,1);
        set_gpio(JTAG_TCK,1);
        set_gpio(JTAG_TDO,0);
        return 1;
}
/*
LCD_outport  write data to lcd port as gpio
lcd is devided to two port
first port include signals:  VD0-VD15                        16Bit
second port include signals:VD16-VD23,VCLK,VLINE,VM,VFRAME   12Bit
portnum: port number,0 or 1
num:the data that need to output
*/
int  LCD_outport(int portnum,int num)
{ 
     int a=num;
     int b=portnum;
     if(VD1==b)//lcd 0 port
     {
      write_gpio(LCD_VD0,a&0x1);
      write_gpio(LCD_VD1,(a>>1)&0x1);
      write_gpio(LCD_VD2,(a>>2)&0x1); 
      write_gpio(LCD_VD3,(a>>3)&0x1);
      write_gpio(LCD_VD4,(a>>4)&0x1); 
      write_gpio(LCD_VD5,(a>>5)&0x1);
      write_gpio(LCD_VD6,(a>>6)&0x1);
      write_gpio(LCD_VD7,(a>>7)&0x1);
      write_gpio(LCD_VD8,(a>>8)&0x1);
      write_gpio(LCD_VD9,(a>>9)&0x1);
      write_gpio(LCD_VD10,(a>>10)&0x1); 
      write_gpio(LCD_VD11,(a>>11)&0x1);
      write_gpio(LCD_VD12,(a>>12)&0x1);
      write_gpio(LCD_VD13,(a>>13)&0x1);
      write_gpio(LCD_VD14,(a>>14)&0x1);
      write_gpio(LCD_VD15,(a>>15)&0x1); 
     }
     else if(VD2==portnum)
     {
      write_gpio(LCD_VD16,a&0x1);
      write_gpio(LCD_VD17,(a>>1)&0x1);
      write_gpio(LCD_VD18,(a>>2)&0x1); 
      write_gpio(LCD_VD19,(a>>3)&0x1);
      write_gpio(LCD_VD20,(a>>4)&0x1); 
      write_gpio(LCD_VD21,(a>>5)&0x1);
      write_gpio(LCD_VD22,(a>>6)&0x1);
      write_gpio(LCD_VD23,(a>>7)&0x1);
      write_gpio(LCD_VCLK,(a>>8)&0x1);
      write_gpio(LCD_VLINE,(a>>9)&0x1);
      write_gpio(LCD_VM,(a>>10)&0x1); 
      write_gpio(LCD_VFRAME,(a>>11)&0x1);
     }//lcd 1 port
     else printf("port num error\n");
     return 1;
}

unsigned short int  LPT_outport(unsigned short int num)
{
    unsigned short int a=num;
 
    write_gpio(LPT_IO0_O,a&0x1);
    write_gpio(LPT_IO1_O,(a>>1)&0x1);
    write_gpio(LPT_IO2_O,(a>>2)&0x1); 
    write_gpio(LPT_IO3_O,(a>>3)&0x1);
    write_gpio(LPT_IO4_O,(a>>4)&0x1); 
    write_gpio(LPT_IO5_O,(a>>5)&0x1);
    write_gpio(LPT_IO6_O,(a>>6)&0x1);
    write_gpio(LPT_IO7_O,(a>>7)&0x1);
    write_gpio(LPT_IO8_O,(a>>8)&0x1);
    write_gpio(LPT_IO13_O,(a>>9)&0x1);
    write_gpio(LPT_IO15_O,(a>>10)&0x1); 
    write_gpio(LPT_IO16_O,(a>>11)&0x1); 
    return a;
}
/*
return value:
1:ok
*/
unsigned short int LPT_inport(unsigned short int* num)
{
    int  a=0;
    a+=read_gpio(LPT_IO9_I);
    a+=(read_gpio(LPT_IO10_I)<<1);
    a+=(read_gpio(LPT_IO11_I)<<2);
    a+=(read_gpio(LPT_IO12_I)<<3);
    a+=(read_gpio(LPT_IO14_I)<<4);
    *num=(unsigned short int)a;
    return 1;
}
unsigned short int SetLed(unsigned short int ledid)
{
    *(unsigned short int*)(BaseAddr+IO_BASE+LED_OUT)=ledid;
     return ledid;
}
/*if we test the module only,we just compile the module,if we use it in other the main function,
we should define the macro _NOMODULE_DEBUG_*/
/*#ifndef  _MODULE_DEBUG_
int main(int argc,char **argv)
{ unsigned char a=0;
  unsigned short int  b=0;
  char c;
  if(argc==2)
    {
      printf("input s to stop,enter to continue\n");
      while(1)
      { 
        c=getchar();
        GpioWrite(IO_BASE+LPTO,1<<b); 
       // b=*(unsigned short int*)(0xfa000000+IO_BASE+LPTI);
        printf("lpt out value is %d\n",1<<b);
        b++;
        if(5==b)break;
      }
     return 0;
    }
  LPT_parsetup();
    // LCD_parsetup();
  while(1)
  { 
    getchar();
    LPT_inport(&b);
   // printf("GpioRead is:%d\n",GpioRead(LPTI+IO_BASE));
   // LCD_outport(LPTO,1<<b);
    printf("input data is %d\n",b);
   // b++;
   // if(5==b)break;
 
  }
//printf("GpioRead is:%x\n",GpioBaseAddrSet(3));
  return 0;
}
#endif*/

⌨️ 快捷键说明

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