闲来无事,发两个小程序玩玩
利用HI_MPI_SYS_SetReg、HI_MPI_SYS_GetReg实现GPIO驱动程序
源码:
#include
/*
#define GPIO_IR_CUT (0x201C0000 + 0x400) //GPIO8_0 0x00
#define GPIO_CDSADC (0x201B0000 + 0x400) //GPIO7_6 0x40
#define GPIO_INFRARED (0x201C0000 + 0x400) //GPIO8_1 0x01
#define GPIO_LIGHTBOARD_LED (0x20180000 + 0x400) //GPIO4_2 0x04
#define GPIO_ONBOARD_LED (0x20150000 + 0x400) //GPIO1_7 0x80
#define GPIO_RESER (0x20180000 + 0x400) //GPIO4_6 0x40
#define GPIO_WIFI_EN (0x20140000 + 0x400) //GPIO0_3 0x08
#define GPIO_SPEAKER (0x20180000 + 0x400) //GPIO4_0 0x00
*/
#define GPIO_DATA(gpio_group_reg_base, gpio_offset) IO_ADDRESS(((gpio_group_reg_base) + 0x000) + (1 << ((gpio_offset) + 2)))
#define GPIO_DIR(gpio_group_reg_base) IO_ADDRESS((gpio_group_reg_base) + 0x400)
int h_gpio_group_reg_base = {
0x20140000, //GPIO0
0x20150000, //GPIO1
0x20160000, //GPIO2
0x20170000, //GPIO3
0x20180000, //GPIO4
0x20190000, //GPIO5
0x201A0000, //GPIO6
0x201B0000, //GPIO7
0x201C0000, //GPIO8
};
int hal_hi3518ev200_gpio_dir_config(unsigned char gpio_group, unsigned char gpio_offset, unsigned char flag)
{
unsigned int val = 0;
unsigned int addr = 0;
addr = GPIO_DIR(h_gpio_group_reg_base[gpio_group]);
if( 0 == HI_MPI_SYS_GetReg(addr,val) )
{
if(flag)
{
val |= 1 << gpio_offset;
}
else
{
val &= ~(1 << gpio_offset);
}
if( 0 == HI_MPI_SYS_SetReg(addr,val) )
{
printf("HI_MPI_SYS_SetReg success! val: %d\n",val);
return 0;
}
else
{
printf("HI_MPI_SYS_SetReg Error! val: %d\n",val);
return -1;
}
}
else
{
printf("HI_MPI_SYS_GetReg Error! val: %d\n",val);
return -1;
}
}
int gpio_write(unsigned char gpio_group, unsigned char gpio_offset, unsigned char flag)
{
unsigned int val = 0;
unsigned int addr = 0;
addr = GPIO_DATA(h_gpio_group_reg_base[gpio_group], gpio_offset);
if(flag)
{
val = 1 << gpio_offset;
}
else
{
val = 0;
}
if( 0 == HI_MPI_SYS_SetReg(addr,val) )
{
printf("HI_MPI_SYS_SetReg success! val: %d\n",val);
return 0;
}
else
{
printf("HI_MPI_SYS_SetReg Error! val: %d\n",val);
return -1;
}
}
int gpio_read(unsigned char gpio_group, unsigned char gpio_offset)
{
unsigned int val = 0;
unsigned int addr = 0;
addr = GPIO_DATA(h_gpio_group_reg_base[gpio_group], gpio_offset);
if( 0 == HI_MPI_SYS_GetReg(addr,val) )
{
if(val & (1 << gpio_offset))
{
val = 1;
}
else
{
val = 0;
}
printf("HI_MPI_SYS_GetReg Error! val: %d\n",val);
return val;
}
else
{
printf("HI_MPI_SYS_GetReg Error! val: %d\n",val);
return -1;
}
}
int hal_hi3518ev200_gpio_init(void) //gpio初始化函数
{
hal_hi3518ev200_gpio_dir_config(4,0,1); //GPIO_SPEAKER,设置GPIO4_0输出模式
hal_hi3518ev200_gpio_dir_config(0,3,1); //GPIO_WIFI_EN,设置GPIO0_3输出模式
hal_hi3518ev200_gpio_dir_config(4,6,0); //GPIO_RESER,设置GPIO4_6输入模式
hal_hi3518ev200_gpio_dir_config(1,7,1); //GPIO_ONBOARD_LED,设置GPIO1_7输出模式
hal_hi3518ev200_gpio_dir_config(4,2,1); //GPIO_LIGHTBOARD_LED,设置GPIO4_2输出模式
hal_hi3518ev200_gpio_dir_config(8,1,1); //GPIO_INFRARED,设置GPIO8_1输出模式
hal_hi3518ev200_gpio_dir_config(7,6,0); //GPIO_CDSADC,设置GPIO7_6输入模式
hal_hi3518ev200_gpio_dir_config(8,0,1); //GPIO_CDSADC,设置GPIO8_0输出模式
return 0;
}
int hal_hi3518ev200_speaker_enable(void) //使能喇叭
{
gpio_write(4,0,0); //输出0开启扬声器
return 0;
}
int hal_hi3518ev200_speaker_disable(void) //关闭喇叭
{
gpio_write(4,0,0); //输出1关闭扬声器
return 0;
}
int hal_hi3518ev200_wifi_poweron(void) //使能wifi供电
{
gpio_write(0,3,1); //输出1打开wifi供电
return 0;
}
int hal_hi3518ev200_wifi_powerdown(void) //关闭wifi供电
{
gpio_write(0,3,0); //输出0关闭wifi供电
return 0;
}
int hal_hi3518ev200_check_reset(void) //复位按键 >>>返回 1 按下, 返回 0 没按
{
int reset_value;
reset_value = gpio_read(4,6); //获取复位按键键值
return reset_value;
}
int hal_hi3518ev200_led_control(int led_index ,int value) //led控制 led_index 0:板载LED;1:灯板LED || value 1:亮 0:灭
{
if(led_index == 0)
{
gpio_write(1,7,~value)) //板载LED
}
else
{
gpio_write(4,2,~value)) //灯板LED
}
return 0;
}
int hal_hi3518ev200_get_cds_value(void) //光敏 1白天 0 夜晚
{
int reset_value;
reset_value = gpio_read(7,6); //获取复位按键键值
return reset_value;
}
int hal_hi3518ev200_set_ircut_value(int value) //icut 0/1 切换
{
gpio_write(8,0,value)) //板载LED
return 0;
}
int main(void)
{
hal_hi3518ev200_gpio_init();
return 0;
}
当然,对于复杂一点的GPIO操作的话,驱动肯定是不能这样写的了,还是老老实实写成module的模式。