?? gpio.c
字號:
/*
Motorola LTE General Purpose Input Output Driver
----------------------------
(c) motoprogger 2008
*/
#include "../libs/motolibs.h"
#include "gpio.h"
#define GPIO_BASE 0x24841000
typedef struct
{
word config0;
word config1;
word DataDir;
word IntMask;
word IntCtl;
word AltIn;
} GPIO_PORT_CONTROL;
#define GPIO_PORT_CTL_REGS ((volatile GPIO_PORT_CONTROL * ) (void * ) GPIO_BASE)
#define GPIO_INTERRUPT_SELECT_REG word_ptr(GPIO_BASE+0x78)
#define GPIO_INTERRUPT_STATUS_REG word_ptr(GPIO_BASE+0x7C)
#define GPIO_DATA_REGS ((word * ) (void * ) (GPIO_BASE+0x80))
void gpio_config(byte port, byte pin, byte dir, byte chan)
{
volatile GPIO_PORT_CONTROL * port_ctl;
word gpio_dir;
word gpio_cfg;
port_ctl=GPIO_PORT_CTL_REGS+port;
if (dir==GPIO_DIR_IN)
{
gpio_cfg=port_ctl->AltIn&(~(3<<(2*pin)));
port_ctl->AltIn=gpio_cfg|(chan<<(2*pin));
}
else if (dir==GPIO_DIR_OUT)
{
if (pin<10)
{
gpio_cfg=port_ctl->config0&(~(7<<(3*pin)));
port_ctl->config0=gpio_cfg|(chan<<(3*pin));
}
else {
gpio_cfg=port_ctl->config1&(~(7<<(3*(pin-10))));
port_ctl->config1=gpio_cfg|(chan<<(3*(pin-10)));
}
}
else return;
gpio_dir=port_ctl->DataDir&(~(1<<pin));
port_ctl->DataDir=gpio_dir|(dir<<pin);
}
void gpio_write(byte port, byte pin, byte val)
{
word gpio_data;
gpio_data=GPIO_DATA_REGS[port]&(~(1<<pin));
GPIO_DATA_REGS[port]=gpio_data|(val<<pin);
}
byte gpio_read(byte port, byte pin)
{
return (GPIO_DATA_REGS[port]>>pin)&1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -