77 lines
1.6 KiB
C
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);
|
|
}
|
|
|