gpio.c

来自「A few drivers for the Motorola C380 s ce」· C语言 代码 · 共 66 行

C
66
字号
/*
   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 + =
减小字号Ctrl + -
显示快捷键?