add cortex-v7a support
How To Run: see TencentOS-tiny\board\ALPHA_I.MX_emmc_256ddr\README.md TODO Next: 1. VFP support 2. fault diagnosis support 3. qemu vexpress ca9 support 4. raspberry pi support 5. SMP support
This commit is contained in:
153
board/ALPHA_I.MX_emmc_256ddr/bsp/gpio/bsp_gpio.c
Normal file
153
board/ALPHA_I.MX_emmc_256ddr/bsp/gpio/bsp_gpio.c
Normal file
@@ -0,0 +1,153 @@
|
||||
#include "bsp_gpio.h"
|
||||
/***************************************************************
|
||||
Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
|
||||
文件名 : bsp_gpio.h
|
||||
作者 : 左忠凯
|
||||
版本 : V1.0
|
||||
描述 : GPIO操作文件。
|
||||
其他 : 无
|
||||
论坛 : www.openedv.com
|
||||
日志 : 初版V1.0 2019/1/4 左忠凯创建
|
||||
V2.0 2019/1/4 左忠凯修改:
|
||||
修改gpio_init()函数,支持中断配置.
|
||||
添加gpio_intconfig()函数,初始化中断
|
||||
添加gpio_enableint()函数,使能中断
|
||||
添加gpio_clearintflags()函数,清除中断标志位
|
||||
|
||||
***************************************************************/
|
||||
|
||||
/*
|
||||
* @description : GPIO初始化。
|
||||
* @param - base : 要初始化的GPIO组。
|
||||
* @param - pin : 要初始化GPIO在组内的编号。
|
||||
* @param - config : GPIO配置结构体。
|
||||
* @return : 无
|
||||
*/
|
||||
void gpio_init(GPIO_Type *base, int pin, gpio_pin_config_t *config)
|
||||
{
|
||||
base->IMR &= ~(1U << pin);
|
||||
|
||||
if(config->direction == kGPIO_DigitalInput) /* GPIO作为输入 */
|
||||
{
|
||||
base->GDIR &= ~( 1 << pin);
|
||||
}
|
||||
else /* 输出 */
|
||||
{
|
||||
base->GDIR |= 1 << pin;
|
||||
gpio_pinwrite(base,pin, config->outputLogic); /* 设置默认输出电平 */
|
||||
}
|
||||
gpio_intconfig(base, pin, config->interruptMode); /* 中断功能配置 */
|
||||
}
|
||||
|
||||
/*
|
||||
* @description : 读取指定GPIO的电平值 。
|
||||
* @param - base : 要读取的GPIO组。
|
||||
* @param - pin : 要读取的GPIO脚号。
|
||||
* @return : 无
|
||||
*/
|
||||
int gpio_pinread(GPIO_Type *base, int pin)
|
||||
{
|
||||
return (((base->DR) >> pin) & 0x1);
|
||||
}
|
||||
|
||||
/*
|
||||
* @description : 指定GPIO输出高或者低电平 。
|
||||
* @param - base : 要输出的的GPIO组。
|
||||
* @param - pin : 要输出的GPIO脚号。
|
||||
* @param - value : 要输出的电平,1 输出高电平, 0 输出低低电平
|
||||
* @return : 无
|
||||
*/
|
||||
void gpio_pinwrite(GPIO_Type *base, int pin, int value)
|
||||
{
|
||||
if (value == 0U)
|
||||
{
|
||||
base->DR &= ~(1U << pin); /* 输出低电平 */
|
||||
}
|
||||
else
|
||||
{
|
||||
base->DR |= (1U << pin); /* 输出高电平 */
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* @description : 设置GPIO的中断配置功能
|
||||
* @param - base : 要配置的IO所在的GPIO组。
|
||||
* @param - pin : 要配置的GPIO脚号。
|
||||
* @param - pinInterruptMode: 中断模式,参考枚举类型gpio_interrupt_mode_t
|
||||
* @return : 无
|
||||
*/
|
||||
void gpio_intconfig(GPIO_Type* base, unsigned int pin, gpio_interrupt_mode_t pin_int_mode)
|
||||
{
|
||||
volatile uint32_t *icr;
|
||||
uint32_t icrShift;
|
||||
|
||||
icrShift = pin;
|
||||
|
||||
base->EDGE_SEL &= ~(1U << pin);
|
||||
|
||||
if(pin < 16) /* 低16位 */
|
||||
{
|
||||
icr = &(base->ICR1);
|
||||
}
|
||||
else /* 高16位 */
|
||||
{
|
||||
icr = &(base->ICR2);
|
||||
icrShift -= 16;
|
||||
}
|
||||
switch(pin_int_mode)
|
||||
{
|
||||
case(kGPIO_IntLowLevel):
|
||||
*icr &= ~(3U << (2 * icrShift));
|
||||
break;
|
||||
case(kGPIO_IntHighLevel):
|
||||
*icr = (*icr & (~(3U << (2 * icrShift)))) | (1U << (2 * icrShift));
|
||||
break;
|
||||
case(kGPIO_IntRisingEdge):
|
||||
*icr = (*icr & (~(3U << (2 * icrShift)))) | (2U << (2 * icrShift));
|
||||
break;
|
||||
case(kGPIO_IntFallingEdge):
|
||||
*icr |= (3U << (2 * icrShift));
|
||||
break;
|
||||
case(kGPIO_IntRisingOrFallingEdge):
|
||||
base->EDGE_SEL |= (1U << pin);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @description : 使能GPIO的中断功能
|
||||
* @param - base : 要使能的IO所在的GPIO组。
|
||||
* @param - pin : 要使能的GPIO在组内的编号。
|
||||
* @return : 无
|
||||
*/
|
||||
void gpio_enableint(GPIO_Type* base, unsigned int pin)
|
||||
{
|
||||
base->IMR |= (1 << pin);
|
||||
}
|
||||
|
||||
/*
|
||||
* @description : 禁止GPIO的中断功能
|
||||
* @param - base : 要禁止的IO所在的GPIO组。
|
||||
* @param - pin : 要禁止的GPIO在组内的编号。
|
||||
* @return : 无
|
||||
*/
|
||||
void gpio_disableint(GPIO_Type* base, unsigned int pin)
|
||||
{
|
||||
base->IMR &= ~(1 << pin);
|
||||
}
|
||||
|
||||
/*
|
||||
* @description : 清除中断标志位(写1清除)
|
||||
* @param - base : 要清除的IO所在的GPIO组。
|
||||
* @param - pin : 要清除的GPIO掩码。
|
||||
* @return : 无
|
||||
*/
|
||||
void gpio_clearintflags(GPIO_Type* base, unsigned int pin)
|
||||
{
|
||||
base->ISR |= (1 << pin);
|
||||
}
|
||||
|
||||
|
61
board/ALPHA_I.MX_emmc_256ddr/bsp/gpio/bsp_gpio.h
Normal file
61
board/ALPHA_I.MX_emmc_256ddr/bsp/gpio/bsp_gpio.h
Normal file
@@ -0,0 +1,61 @@
|
||||
#ifndef _BSP_GPIO_H
|
||||
#define _BSP_GPIO_H
|
||||
#define _BSP_KEY_H
|
||||
#include "bsp.h"
|
||||
/***************************************************************
|
||||
Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
|
||||
文件名 : bsp_gpio.h
|
||||
作者 : 左忠凯
|
||||
版本 : V1.0
|
||||
描述 : GPIO操作文件头文件。
|
||||
其他 : 无
|
||||
论坛 : www.openedv.com
|
||||
日志 : 初版V1.0 2019/1/4 左忠凯创建
|
||||
V2.0 2019/1/4 左忠凯修改
|
||||
添加GPIO中断相关定义
|
||||
|
||||
***************************************************************/
|
||||
|
||||
/*
|
||||
* 枚举类型和结构体定义
|
||||
*/
|
||||
typedef enum _gpio_pin_direction
|
||||
{
|
||||
kGPIO_DigitalInput = 0U, /* 输入 */
|
||||
kGPIO_DigitalOutput = 1U, /* 输出 */
|
||||
} gpio_pin_direction_t;
|
||||
|
||||
/*
|
||||
* GPIO中断触发类型枚举
|
||||
*/
|
||||
typedef enum _gpio_interrupt_mode
|
||||
{
|
||||
kGPIO_NoIntmode = 0U, /* 无中断功能 */
|
||||
kGPIO_IntLowLevel = 1U, /* 低电平触发 */
|
||||
kGPIO_IntHighLevel = 2U, /* 高电平触发 */
|
||||
kGPIO_IntRisingEdge = 3U, /* 上升沿触发 */
|
||||
kGPIO_IntFallingEdge = 4U, /* 下降沿触发 */
|
||||
kGPIO_IntRisingOrFallingEdge = 5U, /* 上升沿和下降沿都触发 */
|
||||
} gpio_interrupt_mode_t;
|
||||
|
||||
/*
|
||||
* GPIO配置结构体
|
||||
*/
|
||||
typedef struct _gpio_pin_config
|
||||
{
|
||||
gpio_pin_direction_t direction; /* GPIO方向:输入还是输出 */
|
||||
uint8_t outputLogic; /* 如果是输出的话,默认输出电平 */
|
||||
gpio_interrupt_mode_t interruptMode; /* 中断方式 */
|
||||
} gpio_pin_config_t;
|
||||
|
||||
|
||||
/* 函数声明 */
|
||||
void gpio_init(GPIO_Type *base, int pin, gpio_pin_config_t *config);
|
||||
int gpio_pinread(GPIO_Type *base, int pin);
|
||||
void gpio_pinwrite(GPIO_Type *base, int pin, int value);
|
||||
void gpio_intconfig(GPIO_Type* base, unsigned int pin, gpio_interrupt_mode_t pinInterruptMode);
|
||||
void gpio_enableint(GPIO_Type* base, unsigned int pin);
|
||||
void gpio_disableint(GPIO_Type* base, unsigned int pin);
|
||||
void gpio_clearintflags(GPIO_Type* base, unsigned int pin);
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user