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