Files
OpenTXW81X/sdk/driver/of/hgof.c
T
2025-08-27 09:51:58 +01:00

77 lines
1.6 KiB
C

#include "typesdef.h"
#include "errno.h"
#include "osal/irq.h"
#include "devid.h"
#include "dev/of/hgof.h"
#include "osal/string.h"
struct hgof_hw
{
__IO uint32 CTL;
__IO uint32 ADDR0;
__IO uint32 ADDR1;
__IO uint32 ACC;
__IO uint32 INFO;
};
static int32 hgof_ioctl(struct of_device *p_of, enum of_ioctl_cmd ioctl_cmd, uint32 param1, uint32 param2){
int32 ret_val = RET_OK;
struct hgof *of_hw = (struct hgof*)p_of;
struct hgof_hw *hw = (struct hgof_hw *)of_hw->hw;
switch(ioctl_cmd){
case OF_INSTR_MODE:
hw->CTL &= ~(3<<19);
hw->CTL |= (param1<<19);
break;
case CAL_PIXEL_NUM:
hw->CTL &= ~(3<<17);
hw->CTL |= (param1<<17);
break;
case CAL_ROW_NUM:
hw->CTL &= ~(0x1f<<12);
hw->CTL |= (param1<<12);
break;
case SET_ROW_SIZE:
hw->CTL &= ~(0xfff<<0);
hw->CTL |= (param1<<0);
break;
case SET_OF_ADDR:
hw->ADDR0 = param1;
hw->ADDR1 = param2;
break;
case GET_CAL_ACC:
ret_val = hw->ACC;
break;
default:
os_printf("NO OF IOCTL:%d\r\n",ioctl_cmd);
ret_val = -ENOTSUPP;
break;
}
return ret_val;
}
static int32 hgof_init(struct of_device *p_of){
int32 ret_val = RET_OK;
struct hgof *of_hw = (struct hgof*)p_of;
struct hgof_hw *hw = (struct hgof_hw *)of_hw->hw;
hw->CTL = 0;
hw->ADDR0 = 0;
hw->ADDR1 = 0;
return ret_val;
}
static const struct of_hal_ops dev_ops = {
.init = hgof_init,
.ioctl = hgof_ioctl,
};
void hgof_attach(uint32 dev_id, struct hgof *of)
{
of->dev.dev.ops = (const struct devobj_ops *)&dev_ops;
irq_disable(of->irq_num);
dev_register(dev_id, (struct dev_obj *)of);
}