#ifndef _DEV_FIREWIRE_FWCAM_H_
#define _DEV_FIREWIRE_FWCAM_H_
#define IIDC_INITIALIZE 0x000
#define IIDC_V_FORMAT_INQ 0x100
#define IIDC_V_MODE_INQ(f) (0x180 + (f) * 4)
#define IIDC_V_RATE_INQ(f, m) (0x200 + (f) * 0x20 + (m) * 4)
#define IIDC_BASIC_FUNC_INQ 0x400
#define IIDC_FEATURE_HI_INQ 0x404
#define IIDC_FEATURE_LO_INQ 0x408
#define IIDC_BRIGHTNESS_INQ 0x500
#define IIDC_AUTO_EXPOSURE_INQ 0x504
#define IIDC_SHARPNESS_INQ 0x508
#define IIDC_WHITE_BAL_INQ 0x50C
#define IIDC_HUE_INQ 0x510
#define IIDC_SATURATION_INQ 0x514
#define IIDC_GAMMA_INQ 0x518
#define IIDC_SHUTTER_INQ 0x51C
#define IIDC_GAIN_INQ 0x520
#define IIDC_IRIS_INQ 0x524
#define IIDC_FOCUS_INQ 0x528
#define IIDC_TEMPERATURE_INQ 0x52C
#define IIDC_TRIGGER_INQ 0x530
#define IIDC_CUR_V_FRM_RATE 0x600
#define IIDC_CUR_V_MODE 0x604
#define IIDC_CUR_V_FORMAT 0x608
#define IIDC_ISO_CHANNEL 0x60C
#define IIDC_CAMERA_POWER 0x610
#define IIDC_ISO_EN 0x614
#define IIDC_MEMORY_SAVE 0x618
#define IIDC_ONE_SHOT 0x61C
#define IIDC_MEM_SAVE_CH 0x620
#define IIDC_CUR_MEM_CH 0x624
#define IIDC_VMODE_ERR_STATUS 0x628
#define IIDC_CUR_V_SHIFT 29
#define IIDC_VMODE_ERROR (1 << 31)
#define IIDC_BRIGHTNESS 0x800
#define IIDC_AUTO_EXPOSURE 0x804
#define IIDC_SHARPNESS 0x808
#define IIDC_WHITE_BALANCE 0x80C
#define IIDC_HUE 0x810
#define IIDC_SATURATION 0x814
#define IIDC_GAMMA 0x818
#define IIDC_SHUTTER 0x81C
#define IIDC_GAIN 0x820
#define IIDC_IRIS 0x824
#define IIDC_FOCUS 0x828
#define IIDC_TEMPERATURE 0x82C
#define IIDC_TRIGGER_MODE 0x830
#define IIDC_ZOOM 0x880
#define IIDC_PAN 0x884
#define IIDC_TILT 0x888
#define IIDC_FMT_VGA 0
#define IIDC_FMT_SVGA1 1
#define IIDC_FMT_SVGA2 2
#define IIDC_FMT_STILL 6
#define IIDC_FMT_PARTIAL 7
#define IIDC_FORMAT_VGA (1 << 31)
#define IIDC_FORMAT_SVGA1 (1 << 30)
#define IIDC_FORMAT_SVGA2 (1 << 29)
#define IIDC_FORMAT_STILL (1 << 25)
#define IIDC_FORMAT_PARTIAL (1 << 24)
#define IIDC_ISO_CH_MASK 0xf0000000
#define IIDC_ISO_CH_SHIFT 28
#define IIDC_ISO_SPEED_MASK 0x03000000
#define IIDC_ISO_SPEED_SHIFT 24
#define IIDC_POWER_ON (1 << 31)
#define IIDC_ISO_EN_ON (1 << 31)
#define IIDC_ADV_FEATURE_INQ (1 << 31)
#define IIDC_CAM_POWER_CTRL (1 << 15)
#define IIDC_ONE_SHOT_INQ (1 << 12)
#define IIDC_MULTI_SHOT_INQ (1 << 11)
#define IIDC_HAS_BRIGHTNESS (1 << 31)
#define IIDC_HAS_AUTO_EXPOSURE (1 << 30)
#define IIDC_HAS_SHARPNESS (1 << 29)
#define IIDC_HAS_WHITE_BALANCE (1 << 28)
#define IIDC_HAS_HUE (1 << 27)
#define IIDC_HAS_SATURATION (1 << 26)
#define IIDC_HAS_GAMMA (1 << 25)
#define IIDC_HAS_SHUTTER (1 << 24)
#define IIDC_HAS_GAIN (1 << 23)
#define IIDC_HAS_IRIS (1 << 22)
#define IIDC_HAS_FOCUS (1 << 21)
#define IIDC_HAS_TEMPERATURE (1 << 20)
#define IIDC_HAS_TRIGGER (1 << 19)
#define IIDC_CROM_CMD_BASE (CSRTYPE_C | 0x00)
struct fwcam_mode {
uint8_t format;
uint8_t mode;
uint8_t framerate;
uint8_t _pad;
uint32_t frame_size;
};
struct fwcam_feature {
uint32_t id;
uint32_t flags;
uint32_t min;
uint32_t max;
uint32_t value;
uint32_t value2;
};
#define FWCAM_FEAT_BRIGHTNESS 0
#define FWCAM_FEAT_AUTO_EXPOSURE 1
#define FWCAM_FEAT_SHARPNESS 2
#define FWCAM_FEAT_WHITE_BALANCE 3
#define FWCAM_FEAT_HUE 4
#define FWCAM_FEAT_SATURATION 5
#define FWCAM_FEAT_GAMMA 6
#define FWCAM_FEAT_SHUTTER 7
#define FWCAM_FEAT_GAIN 8
#define FWCAM_FEAT_IRIS 9
#define FWCAM_FEAT_FOCUS 10
#define FWCAM_FEAT_TEMPERATURE 11
#define FWCAM_FEAT_TRIGGER 12
#define FWCAM_FEAT_ZOOM 13
#define FWCAM_FEAT_PAN 14
#define FWCAM_FEAT_TILT 15
#define FWCAM_FEAT_MAX 16
#define FWCAM_FEATF_PRESENT (1 << 0)
#define FWCAM_FEATF_ONOFF (1 << 1)
#define FWCAM_FEATF_AUTO (1 << 2)
#define FWCAM_FEATF_MANUAL (1 << 3)
struct fwcam_info {
uint32_t formats;
uint32_t basic_func;
uint32_t features_hi;
uint32_t features_lo;
uint8_t cur_format;
uint8_t cur_mode;
uint8_t cur_framerate;
uint8_t state;
uint32_t frame_size;
uint32_t frame_dropped;
uint8_t iso_channel;
uint8_t _pad[3];
};
#define FWCAM_GMODE _IOR('C', 1, struct fwcam_mode)
#define FWCAM_SMODE _IOWR('C', 2, struct fwcam_mode)
#define FWCAM_GFEAT _IOWR('C', 3, struct fwcam_feature)
#define FWCAM_SFEAT _IOW('C', 4, struct fwcam_feature)
#define FWCAM_GINFO _IOR('C', 5, struct fwcam_info)
#define FWCAM_STATE_IDLE 0
#define FWCAM_STATE_PROBING 1
#define FWCAM_STATE_PROBED 2
#define FWCAM_STATE_STREAMING 3
#define FWCAM_STATE_DETACHING 4
#define FWCAM_FMT_NMAX 8
#define FWCAM_RATE_NMAX 8
static const char * const fwcam_fmt_names[FWCAM_FMT_NMAX] = {
"VGA (Format_0)",
"Super VGA 1 (Format_1)",
"Super VGA 2 (Format_2)",
"Reserved",
"Reserved",
"Reserved",
"Still Image (Format_6)",
"Partial Image (Format_7)",
};
static const char * const fwcam_rate_names[FWCAM_RATE_NMAX] = {
"1.875 fps", "3.75 fps", "7.5 fps", "15 fps",
"30 fps", "60 fps", "120 fps", "240 fps",
};
static const char * const fwcam_feat_names[FWCAM_FEAT_MAX] = {
[FWCAM_FEAT_BRIGHTNESS] = "brightness",
[FWCAM_FEAT_AUTO_EXPOSURE] = "auto_exposure",
[FWCAM_FEAT_SHARPNESS] = "sharpness",
[FWCAM_FEAT_WHITE_BALANCE] = "white_balance",
[FWCAM_FEAT_HUE] = "hue",
[FWCAM_FEAT_SATURATION] = "saturation",
[FWCAM_FEAT_GAMMA] = "gamma",
[FWCAM_FEAT_SHUTTER] = "shutter",
[FWCAM_FEAT_GAIN] = "gain",
[FWCAM_FEAT_IRIS] = "iris",
[FWCAM_FEAT_FOCUS] = "focus",
[FWCAM_FEAT_TEMPERATURE] = "temperature",
[FWCAM_FEAT_TRIGGER] = "trigger",
[FWCAM_FEAT_ZOOM] = "zoom",
[FWCAM_FEAT_PAN] = "pan",
[FWCAM_FEAT_TILT] = "tilt",
};
static const char * const fwcam_state_names[] = {
[FWCAM_STATE_IDLE] = "idle",
[FWCAM_STATE_PROBING] = "probing",
[FWCAM_STATE_PROBED] = "probed",
[FWCAM_STATE_STREAMING] = "streaming",
[FWCAM_STATE_DETACHING] = "detaching",
};
struct fwcam_fmt0_mode {
int w, h;
const char *pixfmt;
};
#define FWCAM_FMT0_NMODES 7
static const struct fwcam_fmt0_mode fwcam_fmt0_modes[FWCAM_FMT0_NMODES] = {
{ 160, 120, "YUV444" },
{ 320, 240, "YUV422" },
{ 640, 480, "YUV411" },
{ 640, 480, "YUV422" },
{ 640, 480, "RGB8" },
{ 640, 480, "Mono8" },
{ 640, 480, "Mono16" },
};
#define FWCAM_MAX_FRAME_SIZE (640 * 480 * 3)
#define FWCAM_ISO_NCHUNK 256
#define FWCAM_ISO_PKTSIZE 2048
#ifdef _KERNEL
struct fwcam_softc {
struct firewire_dev_comm fd;
struct mtx mtx;
struct cdev *cdev;
struct fw_device *fwdev;
uint16_t cmd_hi;
uint32_t cmd_lo;
uint32_t formats;
uint32_t basic_func;
uint32_t features_hi;
uint32_t features_lo;
uint32_t modes[8];
uint32_t rates[8][8];
uint8_t cur_format;
uint8_t cur_mode;
uint8_t cur_framerate;
uint8_t iso_channel;
uint8_t iso_speed;
struct task probe_task;
int dma_ch;
int iso_active;
uint8_t *frame_buf;
uint8_t *read_buf;
uint32_t frame_size;
uint32_t frame_offset;
int frame_ready;
int read_in_progress;
int frame_dropped;
int open_count;
struct selinfo rsel;
int state;
};
#define FWCAM_LOCK(sc) mtx_lock(&(sc)->mtx)
#define FWCAM_UNLOCK(sc) mtx_unlock(&(sc)->mtx)
#endif
#endif