📄 tm6000.c
字号:
} ret = tm6000_snd_control_msg(tm6000_dev, 0x03, 0x0101, 0x01, 0x0, 0x0); if(ret < 0) { goto i2c_err; } ret = tm6000_snd_control_msg(tm6000_dev, 0x03, 0x0101, 0x00, 0x0, 0x0); if(ret < 0) { goto i2c_err; } data = kzalloc(10*sizeof(__u8), GFP_KERNEL); data[0]=0x00; data[1]=0x0a; data[2]=0x4d; data[3]=0x8c; data[4]=0xf2; data[5]=0xd8; data[6]=0xcf; data[7]=0x30; data[8]=0x79; data[9]=0x9f; ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x06c2, 0x00, data, 0xa); kfree(data); if(ret < 0) { goto i2c_err; } ret = tm6000_snd_control_msg(tm6000_dev, 0x03, 0x0101, 0x01, 0x0, 0x0); if(ret < 0) { goto i2c_err; } ret = tm6000_snd_control_msg(tm6000_dev, 0x03, 0x0101, 0x00, 0x0, 0x0); if(ret < 0) { goto i2c_err; } data = kzalloc(3*sizeof(__u8), GFP_KERNEL); data[0]=0x0d; data[1]=0xa4; data[2]=0x6c; ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x0bc2, 0x00, data, 0x3); kfree(data); if(ret < 0) { goto i2c_err; } ret = tm6000_snd_control_msg(tm6000_dev, 0x03, 0x0101, 0x01, 0x0, 0x0); if(ret < 0) { goto i2c_err; } ret = tm6000_snd_control_msg(tm6000_dev, 0x03, 0x0101, 0x00, 0x0, 0x0); if(ret < 0) { goto i2c_err; } data = kzalloc(14*sizeof(__u8), GFP_KERNEL); data[0]=0x01; data[1]=0x67; data[2]=0x24; data[3]=0x40; data[4]=0x08; data[5]=0xc3; data[6]=0x20; data[7]=0x10; data[8]=0x64; data[9]=0x3c; data[10]=0xfa; data[11]= 0xf7; data[12]= 0xe1; data[13]= 0x0c; ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x0ac2, 0x00, data, 0xe); kfree(data); if(ret < 0) { goto i2c_err; } data = kzalloc(1*sizeof(__u8), GFP_KERNEL); data[0]=0x2c; ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x0ac2, 0x00, data, 0x1); kfree(data); if(ret < 0) { goto i2c_err; } ret = tm6000_snd_control_msg(tm6000_dev, 0x03, 0x0101, 0x01, 0x0, 0x0); if(ret < 0) { goto i2c_err; } ret = tm6000_snd_control_msg(tm6000_dev, 0x03, 0x0101, 0x00, 0x0, 0x0); if(ret < 0) { goto i2c_err; } data = kzalloc(1*sizeof(__u8), GFP_KERNEL); data[0]=0x0b; ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x09c2, 0x00, data, 0x1); kfree(data); if(ret < 0) { goto i2c_err; } ret = tm6000_snd_control_msg(tm6000_dev, 0x03, 0x0101, 0x01, 0x0, 0x0); if(ret < 0) { goto i2c_err; } ret = tm6000_snd_control_msg(tm6000_dev, 0x03, 0x0101, 0x00, 0x0, 0x0); if(ret < 0) { goto i2c_err; } data = kzalloc(1*sizeof(__u8), GFP_KERNEL); data[0]=0x13; ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x10c2, 0x00, data, 0x1); kfree(data); if(ret < 0) { goto i2c_err; } ret = tm6000_snd_control_msg(tm6000_dev, 0x03, 0x0101, 0x01, 0x0, 0x0); if(ret < 0) { goto i2c_err; } ret = tm6000_snd_control_msg(tm6000_dev, 0x03, 0x0101, 0x00, 0x0, 0x0); if(ret < 0) { goto i2c_err; } data = kzalloc(1*sizeof(__u8), GFP_KERNEL); data[0]=0x12; ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x16c2, 0x00, data, 0x1); kfree(data); if(ret < 0) { goto i2c_err; } ret = tm6000_snd_control_msg(tm6000_dev, 0x03, 0x0101, 0x01, 0x0, 0x0); if(ret < 0) { goto i2c_err; } ret = tm6000_snd_control_msg(tm6000_dev, 0x03, 0x0101, 0x00, 0x0, 0x0); if(ret < 0) { goto i2c_err; } data = kzalloc(1*sizeof(__u8), GFP_KERNEL); data[0]=0x02; ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x1fc2, 0x00, data, 0x1); kfree(data); if(ret < 0) { goto i2c_err; } ret = tm6000_snd_control_msg(tm6000_dev, 0x03, 0x0101, 0x01, 0x0, 0x0); if(ret < 0) { goto i2c_err; } ret = tm6000_snd_control_msg(tm6000_dev, 0x03, 0x0101, 0x00, 0x0, 0x0); if(ret < 0) { goto i2c_err; } data = kzalloc(1*sizeof(__u8), GFP_KERNEL); data[0]=0x02; ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x21c2, 0x00, data, 0x1); kfree(data); if(ret < 0) { goto i2c_err; } ret = tm6000_snd_control_msg(tm6000_dev, 0x03, 0x0101, 0x01, 0x0, 0x0); if(ret < 0) { goto i2c_err; } ret = tm6000_snd_control_msg(tm6000_dev, 0x03, 0x0101, 0x00, 0x0, 0x0); if(ret < 0) { goto i2c_err; } data = kzalloc(1*sizeof(__u8), GFP_KERNEL); data[0]=0x02; ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x01c2, 0x00, data, 0x1); kfree(data); if(ret < 0) { goto i2c_err; } ret = tm6000_snd_control_msg(tm6000_dev, 0x03, 0x0101, 0x01, 0x0, 0x0); if(ret < 0) { goto i2c_err; } ret = tm6000_snd_control_msg(tm6000_dev, 0x03, 0x0101, 0x00, 0x0, 0x0); if(ret < 0) { goto i2c_err; } data = kzalloc(1*sizeof(__u8), GFP_KERNEL); data[0]=0x10; ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x2bc2, 0x00, data, 0x1); kfree(data); if(ret < 0) { goto i2c_err; } ret = tm6000_snd_control_msg(tm6000_dev, 0x03, 0x0101, 0x01, 0x0, 0x0); if(ret < 0) { goto i2c_err; } ret = tm6000_snd_control_msg(tm6000_dev, 0x03, 0x0101, 0x00, 0x0, 0x0); if(ret < 0) { goto i2c_err; } data = kzalloc(1*sizeof(__u8), GFP_KERNEL); data[0]=0x02; ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x02c2, 0x00, data, 0x1); kfree(data); if(ret < 0) { goto i2c_err; } ret = tm6000_snd_control_msg(tm6000_dev, 0x03, 0x0101, 0x01, 0x0, 0x0); if(ret < 0) { goto i2c_err; } ret = tm6000_snd_control_msg(tm6000_dev, 0x03, 0x0101, 0x00, 0x0, 0x0); if(ret < 0) { goto i2c_err; } data = kzalloc(1*sizeof(__u8), GFP_KERNEL); data[0]=0x03; ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x02c2, 0x00, data, 0x1); kfree(data); ret = tm6000_snd_control_msg(tm6000_dev, 0x03, 0x0101, 0x01, 0x0, 0x0); if(ret < 0) { goto i2c_err; } ret = tm6000_snd_control_msg(tm6000_dev, 0x03, 0x0101, 0x00, 0x0, 0x0); if(ret < 0) { goto i2c_err; } data = kzalloc(1*sizeof(__u8), GFP_KERNEL); data[0]=0x8c; ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0xc2, 0x00, data, 0x1); kfree(data); if(ret < 0) { goto i2c_err; } ret = tm6000_snd_control_msg(tm6000_dev, 0x03, 0x0101, 0x01, 0x0, 0x0); if(ret < 0) { goto i2c_err; } ret = tm6000_snd_control_msg(tm6000_dev, 0x03, 0x0101, 0x00, 0x0, 0x0); if(ret < 0) { goto i2c_err; } ret = tm6000_snd_control_msg(tm6000_dev, 0x04, 0x002, 0x00, 0x0, 0x0); if(ret < 0) { goto i2c_err; } ret = tm6000_snd_control_msg(tm6000_dev, 0x03, 0x0101, 0x01, 0x0, 0x0); if(ret < 0) { goto i2c_err; } ret = tm6000_snd_control_msg(tm6000_dev, 0x03, 0x0101, 0x00, 0x0, 0x0); if(ret < 0) { goto i2c_err; } tm6000_dev->dvb_frontend = zl10353_attach(&zl10353_config, &tm6000_dev->zl10353_i2c_adapter); if(!tm6000_dev->dvb_frontend) { printk("tm6000: couldn't attach zl10353\n"); goto i2c_err; } tm6000_dev->dvb_frontend->ops.set_frontend = tm6000_set_frontend;// tm6000_dev->dvb_frontend->ops.init = tm6000_zl103530_init; tm6000_dev->dvb_frontend->ops.init = NULL; tm6000_dev->dvb_frontend->ops.sleep = NULL;// tm6000_dev->dvb_frontend->ops.read_snr = tm6000_read_snr; tm6000_dev->dvb_frontend->ops.read_signal_strength = NULL; tm6000_dev->dvb_frontend->ops.read_status = zl10353_read_status; (tm6000_dev->dvb_frontend)->ops.tuner_ops.get_frequency = tm6000_get_frequency;// (tm6000_dev->dvb_frontend)->ops.tuner_ops.set_frequency = tm6000_set_frequency;// (tm6000_dev->dvb_frontend)->ops.tuner_ops.set_params = tm6000_set_frontend; ret = dvb_register_adapter (&tm6000_dev->dvb_adapter, "Trident TVMaster 6000 DVB-T", THIS_MODULE, &dev->dev); tm6000_dev->dvb_adapter.priv = tm6000_dev; if(tm6000_dev->dvb_frontend) { ret = dvb_register_frontend(&tm6000_dev->dvb_adapter, tm6000_dev->dvb_frontend); if(ret < 0) { printk("tm6000: couldn't register frontend\n"); goto i2c_err; } } else { printk("tm6000: no frontend found\n"); } tm6000_dev->dvb_demux.dmx.capabilities = DMX_TS_FILTERING | DMX_SECTION_FILTERING | DMX_MEMORY_BASED_FILTERING; tm6000_dev->dvb_demux.priv = tm6000_dev; tm6000_dev->dvb_demux.filternum = 256; tm6000_dev->dvb_demux.feednum = 256; tm6000_dev->dvb_demux.start_feed = tm6000_start_feed; tm6000_dev->dvb_demux.stop_feed = tm6000_stop_feed; tm6000_dev->dvb_demux.write_to_decoder = NULL; ret = dvb_dmx_init(&tm6000_dev->dvb_demux); if(ret < 0) { printk("tm6000: dvb_dmx_init failed (errno = %d)\n", ret); goto i2c_err; } tm6000_dev->dmxdev.filternum = tm6000_dev->dvb_demux.filternum; tm6000_dev->dmxdev.demux = &tm6000_dev->dvb_demux.dmx; tm6000_dev->dmxdev.capabilities = 0; ret = dvb_dmxdev_init(&tm6000_dev->dmxdev, &tm6000_dev->dvb_adapter); if(ret < 0) { printk("tm6000: dvb_dmxdev_init failed (errno = %d)\n", ret); goto dvb_dmx_err; } // init remote polling// INIT_WORK(&tm6000_dev->remote_work_struct, tm6000_poll_remote, tm6000_dev);// schedule_delayed_work(&tm6000_dev->remote_work_struct, msecs_to_jiffies(30)); // we want to deal with this interface on the device return 0;dvb_dmx_err: dvb_dmx_release(&tm6000_dev->dvb_demux);i2c_err: i2c_del_adapter(&tm6000_dev->xc3028_i2c_adapter);i2c_err2: i2c_del_adapter(&tm6000_dev->zl10353_i2c_adapter);intf_err: usb_put_dev(dev); mutex_destroy(&tm6000_dev->mutex); kfree(tm6000_dev);err: return -1;}void disconnect(struct usb_interface *intf){ struct tm6000_device *tm6000_dev = usb_get_intfdata(intf); if(tm6000_dev == NULL) { return; }// cancel_delayed_work(&tm6000_dev->remote_work_struct);// flush_scheduled_work(); mutex_lock(&tm6000_driver.open_close_mutex); if(tm6000_dev->urb != NULL) { usb_unlink_urb(tm6000_dev->urb); usb_free_urb(tm6000_dev->urb); } if(tm6000_dev->transfer_buffer != NULL) { kfree(tm6000_dev->transfer_buffer); } if(tm6000_dev->dvb_frontend) { dvb_unregister_frontend(tm6000_dev->dvb_frontend); } dvb_dmxdev_release(&tm6000_dev->dmxdev); dvb_dmx_release(&tm6000_dev->dvb_demux); dvb_unregister_adapter (&tm6000_dev->dvb_adapter); i2c_del_adapter(&tm6000_dev->xc3028_i2c_adapter); i2c_del_adapter(&tm6000_dev->zl10353_i2c_adapter); usb_put_dev(tm6000_dev->usb_device); usb_set_intfdata(intf, NULL); mutex_unlock(&tm6000_driver.open_close_mutex); kfree(tm6000_dev);}int init_module(void){ request_module("firmware_class"); request_module("dvb_core"); request_module("zl10353"); INIT_LIST_HEAD(&tm6000_driver.devices); mutex_init(&tm6000_driver.open_close_mutex); usb_register(&tm6000_driver.driver); return 0;}void cleanup_module(void){ usb_deregister(&tm6000_driver.driver); mutex_destroy(&tm6000_driver.open_close_mutex);} EXPORT_SYMBOL(tm6000_snd_control_msg);EXPORT_SYMBOL(tm6000_rcv_control_msg);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -