📄 dib0700_devices.c
字号:
if (desc->idVendor == cpu_to_le16(USB_VID_PINNACLE) && desc->idProduct == cpu_to_le16(USB_PID_PINNACLE_EXPRESSCARD_320CX)) dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); else dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); msleep(20); dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1); dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1); dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); msleep(10); dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); msleep(20); dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); msleep(10); dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18, &stk7700ph_dib7700_xc3028_config); adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, &stk7700ph_dib7700_xc3028_config); return adap->fe == NULL ? -ENODEV : 0;}static int stk7700ph_tuner_attach(struct dvb_usb_adapter *adap){ struct i2c_adapter *tun_i2c; tun_i2c = dib7000p_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1); stk7700ph_xc3028_config.i2c_adap = tun_i2c; /* FIXME: generalize & move to common area */ adap->fe->callback = stk7700ph_xc3028_callback; return dvb_attach(xc2028_attach, adap->fe, &stk7700ph_xc3028_config) == NULL ? -ENODEV : 0;}#define DEFAULT_RC_INTERVAL 150static u8 rc_request[] = { REQUEST_POLL_RC, 0 };/* Number of keypresses to ignore before start repeating */#define RC_REPEAT_DELAY 2static int dib0700_rc_query(struct dvb_usb_device *d, u32 *event, int *state){ u8 key[4]; int i; struct dvb_usb_rc_key *keymap = d->props.rc_key_map; struct dib0700_state *st = d->priv; *event = 0; *state = REMOTE_NO_KEY_PRESSED; i=dib0700_ctrl_rd(d,rc_request,2,key,4); if (i<=0) { err("RC Query Failed"); return -1; } /* losing half of KEY_0 events from Philipps rc5 remotes.. */ if (key[0]==0 && key[1]==0 && key[2]==0 && key[3]==0) return 0; /* info("%d: %2X %2X %2X %2X",dvb_usb_dib0700_ir_proto,(int)key[3-2],(int)key[3-3],(int)key[3-1],(int)key[3]); */ dib0700_rc_setup(d); /* reset ir sensor data to prevent false events */ switch (dvb_usb_dib0700_ir_proto) { case 0: { /* NEC protocol sends repeat code as 0 0 0 FF */ if ((key[3-2] == 0x00) && (key[3-3] == 0x00) && (key[3] == 0xFF)) { st->rc_counter++; if (st->rc_counter > RC_REPEAT_DELAY) { *event = d->last_event; *state = REMOTE_KEY_PRESSED; st->rc_counter = RC_REPEAT_DELAY; } return 0; } for (i=0;i<d->props.rc_key_map_size; i++) { if (keymap[i].custom == key[3-2] && keymap[i].data == key[3-3]) { st->rc_counter = 0; *event = keymap[i].event; *state = REMOTE_KEY_PRESSED; d->last_event = keymap[i].event; return 0; } } break; } default: { /* RC-5 protocol changes toggle bit on new keypress */ for (i = 0; i < d->props.rc_key_map_size; i++) { if (keymap[i].custom == key[3-2] && keymap[i].data == key[3-3]) { if (d->last_event == keymap[i].event && key[3-1] == st->rc_toggle) { st->rc_counter++; /* prevents unwanted double hits */ if (st->rc_counter > RC_REPEAT_DELAY) { *event = d->last_event; *state = REMOTE_KEY_PRESSED; st->rc_counter = RC_REPEAT_DELAY; } return 0; } st->rc_counter = 0; *event = keymap[i].event; *state = REMOTE_KEY_PRESSED; st->rc_toggle = key[3-1]; d->last_event = keymap[i].event; return 0; } } break; } } err("Unknown remote controller key: %2X %2X %2X %2X", (int) key[3-2], (int) key[3-3], (int) key[3-1], (int) key[3]); d->last_event = 0; return 0;}static struct dvb_usb_rc_key dib0700_rc_keys[] = { /* Key codes for the tiny Pinnacle remote*/ { 0x07, 0x00, KEY_MUTE }, { 0x07, 0x01, KEY_MENU }, // Pinnacle logo { 0x07, 0x39, KEY_POWER }, { 0x07, 0x03, KEY_VOLUMEUP }, { 0x07, 0x09, KEY_VOLUMEDOWN }, { 0x07, 0x06, KEY_CHANNELUP }, { 0x07, 0x0c, KEY_CHANNELDOWN }, { 0x07, 0x0f, KEY_1 }, { 0x07, 0x15, KEY_2 }, { 0x07, 0x10, KEY_3 }, { 0x07, 0x18, KEY_4 }, { 0x07, 0x1b, KEY_5 }, { 0x07, 0x1e, KEY_6 }, { 0x07, 0x11, KEY_7 }, { 0x07, 0x21, KEY_8 }, { 0x07, 0x12, KEY_9 }, { 0x07, 0x27, KEY_0 }, { 0x07, 0x24, KEY_SCREEN }, // 'Square' key { 0x07, 0x2a, KEY_TEXT }, // 'T' key { 0x07, 0x2d, KEY_REWIND }, { 0x07, 0x30, KEY_PLAY }, { 0x07, 0x33, KEY_FASTFORWARD }, { 0x07, 0x36, KEY_RECORD }, { 0x07, 0x3c, KEY_STOP }, { 0x07, 0x3f, KEY_CANCEL }, // '?' key /* Key codes for the Terratec Cinergy DT XS Diversity, similar to cinergyT2.c */ { 0xeb, 0x01, KEY_POWER }, { 0xeb, 0x02, KEY_1 }, { 0xeb, 0x03, KEY_2 }, { 0xeb, 0x04, KEY_3 }, { 0xeb, 0x05, KEY_4 }, { 0xeb, 0x06, KEY_5 }, { 0xeb, 0x07, KEY_6 }, { 0xeb, 0x08, KEY_7 }, { 0xeb, 0x09, KEY_8 }, { 0xeb, 0x0a, KEY_9 }, { 0xeb, 0x0b, KEY_VIDEO }, { 0xeb, 0x0c, KEY_0 }, { 0xeb, 0x0d, KEY_REFRESH }, { 0xeb, 0x0f, KEY_EPG }, { 0xeb, 0x10, KEY_UP }, { 0xeb, 0x11, KEY_LEFT }, { 0xeb, 0x12, KEY_OK }, { 0xeb, 0x13, KEY_RIGHT }, { 0xeb, 0x14, KEY_DOWN }, { 0xeb, 0x16, KEY_INFO }, { 0xeb, 0x17, KEY_RED }, { 0xeb, 0x18, KEY_GREEN }, { 0xeb, 0x19, KEY_YELLOW }, { 0xeb, 0x1a, KEY_BLUE }, { 0xeb, 0x1b, KEY_CHANNELUP }, { 0xeb, 0x1c, KEY_VOLUMEUP }, { 0xeb, 0x1d, KEY_MUTE }, { 0xeb, 0x1e, KEY_VOLUMEDOWN }, { 0xeb, 0x1f, KEY_CHANNELDOWN }, { 0xeb, 0x40, KEY_PAUSE }, { 0xeb, 0x41, KEY_HOME }, { 0xeb, 0x42, KEY_MENU }, /* DVD Menu */ { 0xeb, 0x43, KEY_SUBTITLE }, { 0xeb, 0x44, KEY_TEXT }, /* Teletext */ { 0xeb, 0x45, KEY_DELETE }, { 0xeb, 0x46, KEY_TV }, { 0xeb, 0x47, KEY_DVD }, { 0xeb, 0x48, KEY_STOP }, { 0xeb, 0x49, KEY_VIDEO }, { 0xeb, 0x4a, KEY_AUDIO }, /* Music */ { 0xeb, 0x4b, KEY_SCREEN }, /* Pic */ { 0xeb, 0x4c, KEY_PLAY }, { 0xeb, 0x4d, KEY_BACK }, { 0xeb, 0x4e, KEY_REWIND }, { 0xeb, 0x4f, KEY_FASTFORWARD }, { 0xeb, 0x54, KEY_PREVIOUS }, { 0xeb, 0x58, KEY_RECORD }, { 0xeb, 0x5c, KEY_NEXT }, /* Key codes for the Haupauge WinTV Nova-TD, copied from nova-t-usb2.c (Nova-T USB2) */ { 0x1e, 0x00, KEY_0 }, { 0x1e, 0x01, KEY_1 }, { 0x1e, 0x02, KEY_2 }, { 0x1e, 0x03, KEY_3 }, { 0x1e, 0x04, KEY_4 }, { 0x1e, 0x05, KEY_5 }, { 0x1e, 0x06, KEY_6 }, { 0x1e, 0x07, KEY_7 }, { 0x1e, 0x08, KEY_8 }, { 0x1e, 0x09, KEY_9 }, { 0x1e, 0x0a, KEY_KPASTERISK }, { 0x1e, 0x0b, KEY_RED }, { 0x1e, 0x0c, KEY_RADIO }, { 0x1e, 0x0d, KEY_MENU }, { 0x1e, 0x0e, KEY_GRAVE }, /* # */ { 0x1e, 0x0f, KEY_MUTE }, { 0x1e, 0x10, KEY_VOLUMEUP }, { 0x1e, 0x11, KEY_VOLUMEDOWN }, { 0x1e, 0x12, KEY_CHANNEL }, { 0x1e, 0x14, KEY_UP }, { 0x1e, 0x15, KEY_DOWN }, { 0x1e, 0x16, KEY_LEFT }, { 0x1e, 0x17, KEY_RIGHT }, { 0x1e, 0x18, KEY_VIDEO }, { 0x1e, 0x19, KEY_AUDIO }, { 0x1e, 0x1a, KEY_MEDIA }, { 0x1e, 0x1b, KEY_EPG }, { 0x1e, 0x1c, KEY_TV }, { 0x1e, 0x1e, KEY_NEXT }, { 0x1e, 0x1f, KEY_BACK }, { 0x1e, 0x20, KEY_CHANNELUP }, { 0x1e, 0x21, KEY_CHANNELDOWN }, { 0x1e, 0x24, KEY_LAST }, /* Skip backwards */ { 0x1e, 0x25, KEY_OK }, { 0x1e, 0x29, KEY_BLUE}, { 0x1e, 0x2e, KEY_GREEN }, { 0x1e, 0x30, KEY_PAUSE }, { 0x1e, 0x32, KEY_REWIND }, { 0x1e, 0x34, KEY_FASTFORWARD }, { 0x1e, 0x35, KEY_PLAY }, { 0x1e, 0x36, KEY_STOP }, { 0x1e, 0x37, KEY_RECORD }, { 0x1e, 0x38, KEY_YELLOW }, { 0x1e, 0x3b, KEY_GOTO }, { 0x1e, 0x3d, KEY_POWER }, /* Key codes for the Leadtek Winfast DTV Dongle */ { 0x00, 0x42, KEY_POWER }, { 0x07, 0x7c, KEY_TUNER }, { 0x0f, 0x4e, KEY_PRINT }, /* PREVIEW */ { 0x08, 0x40, KEY_SCREEN }, /* full screen toggle*/ { 0x0f, 0x71, KEY_DOT }, /* frequency */ { 0x07, 0x43, KEY_0 }, { 0x0c, 0x41, KEY_1 }, { 0x04, 0x43, KEY_2 }, { 0x0b, 0x7f, KEY_3 }, { 0x0e, 0x41, KEY_4 }, { 0x06, 0x43, KEY_5 }, { 0x09, 0x7f, KEY_6 }, { 0x0d, 0x7e, KEY_7 }, { 0x05, 0x7c, KEY_8 }, { 0x0a, 0x40, KEY_9 }, { 0x0e, 0x4e, KEY_CLEAR }, { 0x04, 0x7c, KEY_CHANNEL }, /* show channel number */ { 0x0f, 0x41, KEY_LAST }, /* recall */ { 0x03, 0x42, KEY_MUTE }, { 0x06, 0x4c, KEY_RESERVED }, /* PIP button*/ { 0x01, 0x72, KEY_SHUFFLE }, /* SNAPSHOT */ { 0x0c, 0x4e, KEY_PLAYPAUSE }, /* TIMESHIFT */ { 0x0b, 0x70, KEY_RECORD }, { 0x03, 0x7d, KEY_VOLUMEUP }, { 0x01, 0x7d, KEY_VOLUMEDOWN }, { 0x02, 0x42, KEY_CHANNELUP }, { 0x00, 0x7d, KEY_CHANNELDOWN }, /* Key codes for Nova-TD "credit card" remote control. */ { 0x1d, 0x00, KEY_0 }, { 0x1d, 0x01, KEY_1 }, { 0x1d, 0x02, KEY_2 }, { 0x1d, 0x03, KEY_3 }, { 0x1d, 0x04, KEY_4 }, { 0x1d, 0x05, KEY_5 }, { 0x1d, 0x06, KEY_6 }, { 0x1d, 0x07, KEY_7 }, { 0x1d, 0x08, KEY_8 }, { 0x1d, 0x09, KEY_9 }, { 0x1d, 0x0a, KEY_TEXT }, { 0x1d, 0x0d, KEY_MENU }, { 0x1d, 0x0f, KEY_MUTE }, { 0x1d, 0x10, KEY_VOLUMEUP }, { 0x1d, 0x11, KEY_VOLUMEDOWN }, { 0x1d, 0x12, KEY_CHANNEL }, { 0x1d, 0x14, KEY_UP }, { 0x1d, 0x15, KEY_DOWN }, { 0x1d, 0x16, KEY_LEFT }, { 0x1d, 0x17, KEY_RIGHT }, { 0x1d, 0x1c, KEY_TV }, { 0x1d, 0x1e, KEY_NEXT }, { 0x1d, 0x1f, KEY_BACK }, { 0x1d, 0x20, KEY_CHANNELUP }, { 0x1d, 0x21, KEY_CHANNELDOWN }, { 0x1d, 0x24, KEY_LAST }, { 0x1d, 0x25, KEY_OK }, { 0x1d, 0x30, KEY_PAUSE }, { 0x1d, 0x32, KEY_REWIND }, { 0x1d, 0x34, KEY_FASTFORWARD }, { 0x1d, 0x35, KEY_PLAY }, { 0x1d, 0x36, KEY_STOP }, { 0x1d, 0x37, KEY_RECORD }, { 0x1d, 0x3b, KEY_GOTO }, { 0x1d, 0x3d, KEY_POWER },};/* STK7700P: Hauppauge Nova-T Stick, AVerMedia Volar */static struct dibx000_agc_config stk7700p_7000m_mt2060_agc_config = { BAND_UHF | BAND_VHF, // band_caps /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=5, P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */ (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), // setup 712, // inv_gain 41, // time_stabiliz 0, // alpha_level 118, // thlock 0, // wbd_inv 4095, // wbd_ref 0, // wbd_sel 0, // wbd_alpha 42598, // agc1_max 17694, // agc1_min 45875, // agc2_max 2621, // agc2_min 0, // agc1_pt1 76, // agc1_pt2 139, // agc1_pt3 52, // agc1_slope1 59, // agc1_slope2 107, // agc2_pt1 172, // agc2_pt2 57, // agc2_slope1 70, // agc2_slope2 21, // alpha_mant 25, // alpha_exp 28, // beta_mant 48, // beta_exp 1, // perform_agc_softsplit { 0, // split_min 107, // split_max 51800, // global_split_min 24700 // global_split_max },};static struct dibx000_agc_config stk7700p_7000p_mt2060_agc_config = { BAND_UHF | BAND_VHF, /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=5, P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */ (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), // setup 712, // inv_gain 41, // time_stabiliz 0, // alpha_level 118, // thlock 0, // wbd_inv 4095, // wbd_ref 0, // wbd_sel 0, // wbd_alpha 42598, // agc1_max 16384, // agc1_min 42598, // agc2_max 0, // agc2_min 0, // agc1_pt1 137, // agc1_pt2 255, // agc1_pt3 0, // agc1_slope1 255, // agc1_slope2 0, // agc2_pt1 0, // agc2_pt2 0, // agc2_slope1 41, // agc2_slope2 15, // alpha_mant 25, // alpha_exp 28, // beta_mant 48, // beta_exp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -