526 lines
12 KiB
C
526 lines
12 KiB
C
#include "KC.h"
|
||
#include "de_dev.h"
|
||
#include "de_demo.h"
|
||
|
||
static bool KC_SetGPIO(struct KC_pdata* self);
|
||
static bool KC_ReSetGPIO(struct KC_pdata* self);
|
||
static enum KC_state KC_ReadState(struct KC_pdata* self);
|
||
|
||
void KC12_GPIO_INIT(struct driver *self);
|
||
void KC_GPIO_INIT(struct driver *self);
|
||
void KC_GPIO_INIT_High(struct driver *self);
|
||
void KC_UP_input(struct driver *self);
|
||
void KC_FLOATING_input(struct driver *self);
|
||
struct KC_OPS KC_type1 = {
|
||
.Set_GPIO = KC_SetGPIO,
|
||
.Reset_GPIO = KC_ReSetGPIO,
|
||
.Read_KC_State = KC_ReadState,
|
||
|
||
};
|
||
|
||
|
||
struct KC_pdata KC_array[KC_MaxNum] ={
|
||
|
||
{.GPIO_Group = GPIOB,.GPIO_NUM = GPIO_Pin_3, .KC_This_State = KC_Close},//KC1
|
||
{.GPIO_Group = GPIOB,.GPIO_NUM = GPIO_Pin_0, .KC_This_State = KC_Close},//KC2
|
||
{.GPIO_Group = GPIOB,.GPIO_NUM = GPIO_Pin_1, .KC_This_State = KC_Close},//KC3
|
||
{.GPIO_Group = GPIOB,.GPIO_NUM = GPIO_Pin_15, .KC_This_State = KC_Close},//KC5
|
||
{.GPIO_Group = GPIOA,.GPIO_NUM = GPIO_Pin_6, .KC_This_State = KC_Close},//KC8
|
||
{.GPIO_Group = GPIOB,.GPIO_NUM = GPIO_Pin_14, .KC_This_State = KC_Close},//KC9
|
||
|
||
{.GPIO_Group = GPIOA,.GPIO_NUM = GPIO_Pin_10, .KC_This_State = KC_Close},//5V电源域
|
||
{.GPIO_Group = GPIOA,.GPIO_NUM = GPIO_Pin_9, .KC_This_State = KC_Close},//运行指示灯
|
||
{.GPIO_Group = GPIOC,.GPIO_NUM = GPIO_Pin_15, .KC_This_State = Floating_input},//交流反馈信号
|
||
{.GPIO_Group = GPIOC,.GPIO_NUM = GPIO_Pin_14, .KC_This_State = Floating_input},//直流反馈信号
|
||
|
||
{.GPIO_Group = GPIOB,.GPIO_NUM = GPIO_Pin_9, .KC_This_State = KC_Close},//蓝牙灯,pwr3.3V控制
|
||
{.GPIO_Group = GPIOB,.GPIO_NUM = GPIO_Pin_4, .KC_This_State = KC_Open},//CAN2 1043 STB
|
||
{.GPIO_Group = GPIOC,.GPIO_NUM = GPIO_Pin_8, .KC_This_State = KC_Open},//CAN2 1043 EN
|
||
{.GPIO_Group = GPIOC,.GPIO_NUM = GPIO_Pin_9, .KC_This_State = KC_Close},//ELS-ON
|
||
{.GPIO_Group = GPIOA,.GPIO_NUM = GPIO_Pin_8, .KC_This_State = KC_Close},//ELS-OFF
|
||
{.GPIO_Group = GPIOB,.GPIO_NUM = GPIO_Pin_5, .KC_This_State = KC_Close},//CAN_STB
|
||
|
||
{.GPIO_Group = GPIOC,.GPIO_NUM = GPIO_Pin_2, .KC_This_State = Floating_input},//高压互锁检测信号
|
||
{.GPIO_Group = GPIOC,.GPIO_NUM = GPIO_Pin_6, .KC_This_State = Floating_input},//高压互锁检测信号
|
||
{.GPIO_Group = GPIOD,.GPIO_NUM = GPIO_Pin_2, .KC_This_State = KC_Close},//CONG_RX 18
|
||
{.GPIO_Group = GPIOC,.GPIO_NUM = GPIO_Pin_12, .KC_This_State = KC_Close},//CONG_TX 19
|
||
|
||
{.GPIO_Group = GPIOC,.GPIO_NUM = GPIO_Pin_1, .KC_This_State = KC_Close},//KC4
|
||
};
|
||
|
||
/************从这里开始声明变量***********/
|
||
|
||
U_BOOT_DRIVER(KC1) = {
|
||
.pdata = (void*)&KC_array[0],
|
||
.Init = KC12_GPIO_INIT,
|
||
.ops = &KC_type1
|
||
};
|
||
U_BOOT_DEVICE(KC1) = {
|
||
.name = "KC1",
|
||
.driver = &GetDRIVER_Name(KC1),
|
||
};
|
||
|
||
|
||
U_BOOT_DRIVER(KC2) = {
|
||
.pdata = (void*)&KC_array[1],
|
||
.Init = KC_GPIO_INIT,
|
||
.ops = &KC_type1
|
||
};
|
||
U_BOOT_DEVICE(KC2) = {
|
||
.name = "KC2",
|
||
.driver = &GetDRIVER_Name(KC2),
|
||
};
|
||
|
||
|
||
U_BOOT_DRIVER(KC3) = {
|
||
.pdata = (void*)&KC_array[2],
|
||
.Init = KC_GPIO_INIT,
|
||
.ops = &KC_type1
|
||
};
|
||
U_BOOT_DEVICE(KC3) = {
|
||
.name = "KC3",
|
||
.driver = &GetDRIVER_Name(KC3),
|
||
};
|
||
|
||
U_BOOT_DRIVER(KC5) = {
|
||
.pdata = (void*)&KC_array[3],
|
||
.Init = KC_GPIO_INIT,
|
||
.ops = &KC_type1
|
||
};
|
||
U_BOOT_DEVICE(KC5) = {
|
||
.name = "KC5",
|
||
.driver = &GetDRIVER_Name(KC5),
|
||
};
|
||
|
||
U_BOOT_DRIVER(KC8) = {
|
||
.pdata = (void*)&KC_array[4],
|
||
.Init = KC_GPIO_INIT,
|
||
.ops = &KC_type1
|
||
};
|
||
U_BOOT_DEVICE(KC8) = {
|
||
.name = "KC8",
|
||
.driver = &GetDRIVER_Name(KC8),
|
||
};
|
||
|
||
|
||
U_BOOT_DRIVER(KC9) = {
|
||
.pdata = (void*)&KC_array[5],
|
||
.Init = KC_GPIO_INIT,
|
||
.ops = &KC_type1
|
||
};
|
||
U_BOOT_DEVICE(KC9) = {
|
||
.name = "KC9",
|
||
.driver = &GetDRIVER_Name(KC9),
|
||
};
|
||
|
||
U_BOOT_DRIVER(PW5V) = {
|
||
.pdata = (void*)&KC_array[6],
|
||
.Init = KC_GPIO_INIT,
|
||
.ops = &KC_type1
|
||
};
|
||
U_BOOT_DEVICE(PW5V) = {
|
||
.name = "PW5V",
|
||
.driver = &GetDRIVER_Name(PW5V),
|
||
};
|
||
|
||
U_BOOT_DRIVER(MCU_RUN) = {
|
||
.pdata = (void*)&KC_array[7],
|
||
.Init = KC_GPIO_INIT_High,
|
||
.ops = &KC_type1
|
||
};
|
||
U_BOOT_DEVICE(MCU_RUN) = {
|
||
.name = "MCU_RUN",
|
||
.driver = &GetDRIVER_Name(MCU_RUN),
|
||
};
|
||
|
||
|
||
U_BOOT_DRIVER(YX1) = {
|
||
.pdata = (void*)&KC_array[8],
|
||
.Init = KC_UP_input,
|
||
.ops = &KC_type1
|
||
};
|
||
U_BOOT_DEVICE(YX1) = {
|
||
.name = "YX1",
|
||
.driver = &GetDRIVER_Name(YX1),
|
||
};
|
||
|
||
|
||
U_BOOT_DRIVER(YX2) = {
|
||
.pdata = (void*)&KC_array[9],
|
||
.Init = KC_UP_input,
|
||
.ops = &KC_type1
|
||
};
|
||
U_BOOT_DEVICE(YX2) = {
|
||
.name = "YX2",
|
||
.driver = &GetDRIVER_Name(YX2),
|
||
};
|
||
|
||
|
||
U_BOOT_DRIVER(PW3_3V) = {
|
||
.pdata = (void*)&KC_array[10],
|
||
.Init = KC_GPIO_INIT,
|
||
.ops = &KC_type1
|
||
};
|
||
U_BOOT_DEVICE(PW3_3V) = {
|
||
.name = "PW3_3V",
|
||
.driver = &GetDRIVER_Name(PW3_3V),
|
||
};
|
||
|
||
|
||
U_BOOT_DRIVER(CAN2_STB) = {
|
||
.pdata = (void*)&KC_array[11],
|
||
.Init = KC_GPIO_INIT,
|
||
.ops = &KC_type1
|
||
};
|
||
U_BOOT_DEVICE(CAN2_STB) = {
|
||
.name = "CAN2_STB",
|
||
.driver = &GetDRIVER_Name(CAN2_STB),
|
||
};
|
||
|
||
U_BOOT_DRIVER(CAN2_EN) = {
|
||
.pdata = (void*)&KC_array[12],
|
||
.Init = KC_GPIO_INIT,
|
||
.ops = &KC_type1
|
||
};
|
||
U_BOOT_DEVICE(CAN2_EN) = {
|
||
.name = "CAN2_EN",
|
||
.driver = &GetDRIVER_Name(CAN2_EN),
|
||
};
|
||
|
||
U_BOOT_DRIVER(ELS_ON) = {
|
||
.pdata = (void*)&KC_array[13],
|
||
.Init = KC_GPIO_INIT,
|
||
.ops = &KC_type1
|
||
};
|
||
U_BOOT_DEVICE(ELS_ON) = {
|
||
.name = "ELS_ON",
|
||
.driver = &GetDRIVER_Name(ELS_ON),
|
||
};
|
||
|
||
U_BOOT_DRIVER(ELS_OFF) = {
|
||
.pdata = (void*)&KC_array[14],
|
||
.Init = KC_GPIO_INIT,
|
||
.ops = &KC_type1
|
||
};
|
||
U_BOOT_DEVICE(ELS_OFF) = {
|
||
.name = "ELS_OFF",
|
||
.driver = &GetDRIVER_Name(ELS_OFF),
|
||
};
|
||
|
||
U_BOOT_DRIVER(CAN_STB) = {
|
||
.pdata = (void*)&KC_array[15],
|
||
.Init = KC_GPIO_INIT,
|
||
.ops = &KC_type1
|
||
};
|
||
U_BOOT_DEVICE(CAN_STB) = {
|
||
.name = "CAN1_STB",
|
||
.driver = &GetDRIVER_Name(CAN_STB),
|
||
};
|
||
|
||
U_BOOT_DRIVER(HV_DSG_CHECJ) = {
|
||
.pdata = (void*)&KC_array[16],
|
||
.Init = KC_FLOATING_input,
|
||
.ops = &KC_type1
|
||
};
|
||
U_BOOT_DEVICE(HV_DSG_CHECJ) = {
|
||
.name = "HV_DSG_CHECJ",
|
||
.driver = &GetDRIVER_Name(HV_DSG_CHECJ),
|
||
};
|
||
|
||
U_BOOT_DRIVER(HV_DSG_CHECJ_2) = {
|
||
.pdata = (void*)&KC_array[17],
|
||
.Init = KC_FLOATING_input,
|
||
.ops = &KC_type1
|
||
};
|
||
U_BOOT_DEVICE(HV_DSG_CHECJ_2) = {
|
||
.name = "HV_DSG_CHECJ_2",
|
||
.driver = &GetDRIVER_Name(HV_DSG_CHECJ_2),
|
||
};
|
||
|
||
U_BOOT_DRIVER(CONG_RX) = {
|
||
.pdata = (void*)&KC_array[18],
|
||
.Init = KC_GPIO_INIT,
|
||
.ops = &KC_type1
|
||
};
|
||
U_BOOT_DEVICE(CONG_RX) = {
|
||
.name = "CONG_RX",
|
||
.driver = &GetDRIVER_Name(CONG_RX),
|
||
};
|
||
|
||
U_BOOT_DRIVER(CONG_TX) = {
|
||
.pdata = (void*)&KC_array[19],
|
||
.Init = KC_GPIO_INIT,
|
||
.ops = &KC_type1
|
||
};
|
||
U_BOOT_DEVICE(CONG_TX) = {
|
||
.name = "CONG_TX",
|
||
.driver = &GetDRIVER_Name(CONG_TX),
|
||
};
|
||
|
||
U_BOOT_DRIVER(KC4) = {
|
||
.pdata = (void*)&KC_array[20],
|
||
.Init = KC_GPIO_INIT,
|
||
.ops = &KC_type1
|
||
};
|
||
U_BOOT_DEVICE(KC4) = {
|
||
.name = "KC4",
|
||
.driver = &GetDRIVER_Name(KC4),
|
||
};
|
||
|
||
/************声明变量 END****************/
|
||
|
||
void KC12_GPIO_INIT(struct driver *self)
|
||
{
|
||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE); //使能PB,PE,PD端口时钟
|
||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//复用引脚
|
||
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//禁用JTAGD开启SWD,PB3,PB4,PA15用作普通IO
|
||
|
||
struct KC_pdata *ops = PDATA_Name(self);
|
||
|
||
if (!ops)
|
||
{
|
||
/*空指针*/
|
||
printf("OPS is NULL\r\n");
|
||
return;
|
||
}
|
||
GPIO_InitTypeDef GPIO_InitStructure;
|
||
|
||
GPIO_InitStructure.GPIO_Pin = ops->GPIO_NUM;
|
||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
|
||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
|
||
|
||
GPIO_Init(ops->GPIO_Group,&GPIO_InitStructure);
|
||
|
||
if(ops->KC_This_State == KC_Open)
|
||
{
|
||
GPIO_SetBits(ops->GPIO_Group,ops->GPIO_NUM);
|
||
}
|
||
else if(ops->KC_This_State == KC_Close)
|
||
{
|
||
GPIO_ResetBits(ops->GPIO_Group,ops->GPIO_NUM);
|
||
}
|
||
else
|
||
{
|
||
|
||
}
|
||
|
||
}
|
||
|
||
void KC_GPIO_INIT(struct driver *self)
|
||
{
|
||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE); //使能PB,PE,PD端口时钟
|
||
|
||
struct KC_pdata *ops = PDATA_Name(self);
|
||
|
||
if (!ops)
|
||
{
|
||
/*空指针*/
|
||
printf("OPS is NULL\r\n");
|
||
return;
|
||
}
|
||
GPIO_InitTypeDef GPIO_InitStructure;
|
||
|
||
GPIO_InitStructure.GPIO_Pin = ops->GPIO_NUM;
|
||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
|
||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
|
||
|
||
GPIO_Init(ops->GPIO_Group,&GPIO_InitStructure);
|
||
|
||
if(ops->KC_This_State == KC_Open)
|
||
{
|
||
GPIO_SetBits(ops->GPIO_Group,ops->GPIO_NUM);
|
||
}
|
||
else if(ops->KC_This_State == KC_Close)
|
||
{
|
||
GPIO_ResetBits(ops->GPIO_Group,ops->GPIO_NUM);
|
||
}
|
||
else
|
||
{
|
||
|
||
}
|
||
|
||
}
|
||
|
||
void KC_GPIO_INIT_High(struct driver *self)
|
||
{
|
||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
|
||
struct KC_pdata *ops = PDATA_Name(self);
|
||
|
||
if (!ops)
|
||
{
|
||
/*空指针*/
|
||
return;
|
||
}
|
||
GPIO_InitTypeDef GPIO_InitStructure;
|
||
|
||
GPIO_InitStructure.GPIO_Pin = ops->GPIO_NUM;
|
||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
|
||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
||
|
||
GPIO_Init(ops->GPIO_Group,&GPIO_InitStructure);
|
||
|
||
if(ops->KC_This_State == KC_Open)
|
||
{
|
||
GPIO_SetBits(ops->GPIO_Group,ops->GPIO_NUM);
|
||
}
|
||
else if(ops->KC_This_State == KC_Close)
|
||
{
|
||
GPIO_ResetBits(ops->GPIO_Group,ops->GPIO_NUM);
|
||
}
|
||
else
|
||
{
|
||
|
||
}
|
||
|
||
}
|
||
//上拉输入
|
||
void KC_UP_input(struct driver *self)
|
||
{
|
||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
|
||
struct KC_pdata *ops = PDATA_Name(self);
|
||
|
||
if (!ops)
|
||
{
|
||
/*空指针*/
|
||
return;
|
||
}
|
||
GPIO_InitTypeDef GPIO_InitStructure;
|
||
|
||
GPIO_InitStructure.GPIO_Pin = ops->GPIO_NUM;
|
||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
|
||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
||
|
||
GPIO_Init(ops->GPIO_Group,&GPIO_InitStructure);
|
||
|
||
}
|
||
|
||
//浮空输入
|
||
void KC_FLOATING_input(struct driver *self)
|
||
{
|
||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
|
||
struct KC_pdata *ops = PDATA_Name(self);
|
||
|
||
if (!ops)
|
||
{
|
||
/*空指针*/
|
||
return;
|
||
}
|
||
GPIO_InitTypeDef GPIO_InitStructure;
|
||
|
||
GPIO_InitStructure.GPIO_Pin = ops->GPIO_NUM;
|
||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
|
||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
||
|
||
GPIO_Init(ops->GPIO_Group,&GPIO_InitStructure);
|
||
|
||
}
|
||
|
||
void KC_GPIO_DEVICE_INIT(struct udevice* self)
|
||
{
|
||
struct driver* Init_ops = (struct driver*)self->driver;
|
||
|
||
if(!Init_ops->Init)
|
||
return;
|
||
|
||
Init_ops->Init(Init_ops);
|
||
|
||
}
|
||
|
||
|
||
bool KC_Set_GPIO(struct udevice* dev)
|
||
{
|
||
struct KC_OPS* USERops = (struct KC_OPS*)device_get_ops(dev);
|
||
|
||
if(!USERops->Set_GPIO)
|
||
return false;
|
||
|
||
|
||
USERops->Set_GPIO((struct KC_pdata*)dev->driver->pdata);
|
||
return true;
|
||
|
||
}
|
||
bool KC_ReSet_GPIO(struct udevice* dev)
|
||
{
|
||
struct KC_OPS* USERops = (struct KC_OPS*)device_get_ops(dev);
|
||
if(!USERops->Reset_GPIO)
|
||
return false;
|
||
|
||
USERops->Reset_GPIO((struct KC_pdata*)dev->driver->pdata);
|
||
return true;
|
||
}
|
||
|
||
enum KC_state KC_Read_GPIO(struct udevice* dev)
|
||
{
|
||
struct KC_OPS* USERops = (struct KC_OPS*)device_get_ops(dev);
|
||
if(!USERops->Read_KC_State)
|
||
return ERR;
|
||
|
||
return USERops->Read_KC_State((struct KC_pdata*)(dev->driver->pdata));
|
||
|
||
}
|
||
|
||
|
||
|
||
static bool KC_SetGPIO(struct KC_pdata* self)
|
||
{
|
||
|
||
GPIO_SetBits(self->GPIO_Group,self->GPIO_NUM);
|
||
|
||
self->KC_This_State = KC_Open;
|
||
// printf("self->KC_This_State OPEN is %d\r\n",self->KC_This_State);
|
||
return true;
|
||
}
|
||
|
||
|
||
|
||
static bool KC_ReSetGPIO(struct KC_pdata* self)
|
||
{
|
||
GPIO_ResetBits(self->GPIO_Group,self->GPIO_NUM);
|
||
|
||
self->KC_This_State = KC_Close;
|
||
|
||
return true;
|
||
}
|
||
|
||
static enum KC_state KC_ReadState(struct KC_pdata* self)
|
||
{
|
||
// printf("self->KC_This_State is %d\r\n",self->KC_This_State);
|
||
return GPIO_ReadInputDataBit(self->GPIO_Group,self->GPIO_NUM);
|
||
|
||
}
|
||
|
||
|
||
void Init_KC_GPIO(void)
|
||
{
|
||
KC_GPIO_DEVICE_INIT(&GetDEVICE_Name(KC1));
|
||
KC_GPIO_DEVICE_INIT(&GetDEVICE_Name(KC2));
|
||
KC_GPIO_DEVICE_INIT(&GetDEVICE_Name(KC3));
|
||
KC_GPIO_DEVICE_INIT(&GetDEVICE_Name(KC4));
|
||
KC_GPIO_DEVICE_INIT(&GetDEVICE_Name(KC5));
|
||
KC_GPIO_DEVICE_INIT(&GetDEVICE_Name(KC8));
|
||
KC_GPIO_DEVICE_INIT(&GetDEVICE_Name(KC9));
|
||
|
||
KC_GPIO_DEVICE_INIT(&GetDEVICE_Name(PW5V));
|
||
KC_GPIO_DEVICE_INIT(&GetDEVICE_Name(MCU_RUN));
|
||
|
||
KC_GPIO_DEVICE_INIT(&GetDEVICE_Name(YX1));
|
||
KC_GPIO_DEVICE_INIT(&GetDEVICE_Name(YX2));
|
||
KC_GPIO_DEVICE_INIT(&GetDEVICE_Name(PW3_3V));
|
||
KC_GPIO_DEVICE_INIT(&GetDEVICE_Name(CAN2_STB));
|
||
|
||
KC_GPIO_DEVICE_INIT(&GetDEVICE_Name(CAN2_EN));
|
||
KC_GPIO_DEVICE_INIT(&GetDEVICE_Name(ELS_ON));
|
||
KC_GPIO_DEVICE_INIT(&GetDEVICE_Name(ELS_OFF));
|
||
KC_GPIO_DEVICE_INIT(&GetDEVICE_Name(CAN_STB));
|
||
|
||
KC_GPIO_DEVICE_INIT(&GetDEVICE_Name(HV_DSG_CHECJ));
|
||
KC_GPIO_DEVICE_INIT(&GetDEVICE_Name(HV_DSG_CHECJ_2));
|
||
|
||
KC_GPIO_DEVICE_INIT(&GetDEVICE_Name(CONG_RX));
|
||
KC_GPIO_DEVICE_INIT(&GetDEVICE_Name(CONG_TX));
|
||
|
||
}
|
||
|
||
|
||
|