(Was subscribed to digest at first so missing Message-id from this post will probably make a new thread.) On Fri, 25 Feb 2005 Patrick Boettcher wrote: > On Fri, 25 Feb 2005 samuli at tuomola.net wrote: > > > Hi, just wanted to know where the b2c2-usb driver development is going > > nowadays? Made an impulse buy of the Technisat AirStar box (rev 2.1 > > with FlexCop III and TDTC9251DH01C (mt352)) a month ago and would now > > like to use it in linux, so I'd be very intrested to see it supported. > > Hi, > > I currently rewrite the dma stuff and pci initialization of the > pci-bus-driver. As you can see in the README, the adapting of the > existing > usb driver is the step afterwards. > > I want to stick to this order, because there will some changes in the > flexcop-part, that will require changes in the usb-part as well. > > Maybe this weekend I'll find the time to create a first working usb > driver. That'd be awesome :). I would like to do something, but can't really help with the pci driver not having the hardware and all, so getting even a workable basis of the usb driver would be great. > > I realize the b2c2-directory under dvb-kernel in cvs is temporary and > > dvb-kernel/b2c2 is compatible with dvb-kernel/build-2.6 > > ie. make in build-2.6, make in b2c2, run ./in.sh in b2c2 is the way to > go. I see, yeah should probably use the drivers from cvs in case there's changes versus the ones in distribution kernel. > > So still quite useless, but at least it loads :). > > Unfortunately your patch is non-unified, so hard to read for me. Can you > send me a 'cvs diff -u' privately. I then have a look, what I can use > from. > > Thanks so far. Oops didn't even notice, was running late from a lunch, new one attached. Although I fear there's not much anything to use, actually just wanted to see something happening here (guess it worked :). > > Btw, would the specs referred to here > > http://pvrguide.no-ip.com/bbs-old/viewtopic.php?t=16643 be available > > from somewhere? > > They are not public, sorry. Oh well, the important thing is that at least someone who makes use of them has them. Later, -samuli -------------- next part -------------- Index: Makefile =================================================================== RCS file: /cvs/linuxtv/dvb-kernel/b2c2/Makefile,v retrieving revision 1.7 diff -u -r1.7 Makefile --- Makefile 16 Feb 2005 20:40:15 -0000 1.7 +++ Makefile 25 Feb 2005 17:14:45 -0000 @@ -1,10 +1,10 @@ b2c2-flexcop-objs = flexcop.o flexcop-fe-tuner.o flexcop-i2c.o flexcop-sram.o flexcop-eeprom.o flexcop-misc.o flexcop-hw-filter.o -obj-$(CONFIG_B2C2_FLEXCOP) += b2c2-flexcop.o +obj-$(CONFIG_DVB_B2C2_SKYSTAR) += b2c2-flexcop.o b2c2-flexcop-pci-objs = flexcop-pci.o obj-$(CONFIG_B2C2_FLEXCOP_PCI) += b2c2-flexcop-pci.o -#b2c2-flexcop-usb-objs = flexcop-usb.o -#obj-$(CONFIG_B2C2_FLEXCOP_USB) += b2c2-flexcop-usb.o +b2c2-flexcop-usb-objs = flexcop-usb.o +obj-$(CONFIG_DVB_B2C2_USB) += b2c2-flexcop-usb.o EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends/ Index: flexcop-common.h =================================================================== RCS file: /cvs/linuxtv/dvb-kernel/b2c2/flexcop-common.h,v retrieving revision 1.11 diff -u -r1.11 flexcop-common.h --- flexcop-common.h 22 Feb 2005 22:17:52 -0000 1.11 +++ flexcop-common.h 25 Feb 2005 17:14:45 -0000 @@ -73,6 +73,7 @@ int flexcop_device_initialize(struct flexcop_device*); void flexcop_device_uninitialize(struct flexcop_device*); +void flexcop_reset(struct flexcop_device *fc); /* the PCI uses this a i2c_request callback, whereas the usb part has its own * one. We have it in flexcop-i2c.c, because it is going via the actual Index: flexcop-usb.c =================================================================== RCS file: /cvs/linuxtv/dvb-kernel/b2c2/flexcop-usb.c,v retrieving revision 1.4 diff -u -r1.4 flexcop-usb.c --- flexcop-usb.c 22 Feb 2005 22:17:52 -0000 1.4 +++ flexcop-usb.c 25 Feb 2005 17:14:45 -0000 @@ -6,7 +6,7 @@ * see flexcop.c for copyright information. */ #include <linux/usb.h> -#include "flexcop-common.h" +#include "flexcop.h" static int debug; module_param(debug, int, 0644); @@ -28,31 +28,6 @@ #define B2C2_USB_CTRL_PIPE_OUT usb_sndctrlpipe(b2c2->udev,0) #define B2C2_USB_DATA_PIPE usb_rcvisocpipe(b2c2->udev,0x81) -/* debug */ -#define dprintk(level,args...) \ - do { if ((debug & level)) { printk(args); } } while (0) -#define debug_dump(b,l) if (debug) {\ - int i; deb_xfer("%s: %d > ",__FUNCTION__,l); \ - for (i = 0; i < l; i++) deb_xfer("%02x ", b[i]); \ - deb_xfer("\n");\ -} - -#define deb_info(args...) dprintk(0x01,args) -#define deb_ts(args...) dprintk(0x02,args) -#define deb_ctrl(args...) dprintk(0x04,args) -#define deb_i2c(args...) dprintk(0x08,args) - -struct usb_b2c2_usb { - struct usb_device *udev; - struct usb_interface *uintf; - - u8 *iso_buffer; - int buffer_size; - dma_addr_t iso_dma_handle; - struct urb *iso_urb[B2C2_USB_NUM_ISO_URB]; -}; - - /* * USB * 10 90 34 12 78 56 04 00 @@ -147,6 +122,18 @@ UTILITY_SRAM_TESTVERIFY = 0x16, } b2c2_usb_utility_function_t; +struct usb_b2c2_usb { + struct usb_device *udev; + struct usb_interface *uintf; + + u8 *iso_buffer; + int buffer_size; + dma_addr_t iso_dma_handle; + struct urb *iso_urb[B2C2_USB_NUM_ISO_URB]; + /* just a hack to retain the flexcop_device i2c callback structure */ + b2c2_usb_request_t i2c_req; +}; + #define B2C2_WAIT_FOR_OPERATION_RW 1 /* 1 s */ #define B2C2_WAIT_FOR_OPERATION_RDW 3 /* 3 s */ #define B2C2_WAIT_FOR_OPERATION_WDW 1 /* 1 s */ @@ -167,6 +154,9 @@ #define B2C2_FLEX_PCIOFFSET_TO_INTERNALADDR(usPCI) (u8) (((usPCI >> 2) & 0x07) + ((usPCI >> 4) & 0x70)) #define B2C2_FLEX_INTERNALADDR_TO_PCIOFFSET(ucAddr) (u16) (((ucAddr & 0x07) << 2) + ((ucAddr & 0x70) << 4)) +/* common */ +int b2c2_flexcop_debug; + /* * DKT 020228 * - forget about this VENDOR_BUFFER_SIZE, read and write register @@ -176,7 +166,7 @@ * and force this to write only 4 bytes at a time. * NOTE: this should work with all the firmware from 1.00 and newer */ -static int b2c2_usb_readwrite_dw(struct b2c2_device *card, u16 wRegOffsPCI, u32 *val, u8 read) +static int b2c2_usb_readwrite_dw(struct flexcop_device *card, u16 wRegOffsPCI, u32 *val, u8 read) { struct usb_b2c2_usb *b2c2 = card->bus_specific; u8 request = read ? B2C2_USB_READ_REG : B2C2_USB_WRITE_REG; @@ -194,7 +184,7 @@ B2C2_WAIT_FOR_OPERATION_RDW * HZ); if (len != sizeof(u32)) { - b2c2_err("error while %s dword from %d (%d).",read ? "reading" : "writing", + deb_info("error while %s dword from %d (%d).",read ? "reading" : "writing", wAddress,wRegOffsPCI); return -EIO; } @@ -277,17 +267,17 @@ (dwAddress & V8_MEMORY_PAGE_MASK) ) -static int b2c2_usb_memory_raw_req(struct b2c2_device *b2c2,u8 req,u32 dwAddr,u8 *buf,u16 len) +static int b2c2_usb_memory_raw_req(struct flexcop_device *b2c2,u8 req,u32 dwAddr,u8 *buf,u16 len) { return b2c2_usb_v8_memory_req(b2c2->bus_specific,req, (u8) (dwAddr >> 16), (u16) (dwAddr & 0xFFFF), len, buf); } -static int b2c2_usb_memory_req(struct b2c2_device *b2c2,u8 req,u8 dwAddress,void *pvData, u32 len) +static int b2c2_usb_memory_req(struct flexcop_device *b2c2,u8 req,u8 dwAddress,void *pvData, u32 len) { int ret = 0; - u16 wMax; + u16 wMax = 0; u32 dwExtEnable = dwAddress & V8_MEMORY_EXT_ENABLE; u8 *data = (u8 *) pvData; u32 dwFlatAddr = v8FlatAddr(dwAddress); @@ -326,7 +316,7 @@ #define b2c2_usb_memory_writeb(b2c2,dwAddress,bData) \ b2c2_usb_memory_req(b2c2,B2C2_USB_WRITE_V8_MEM,dwAddress,&bData,1) -u8 b2c2_usb_memory_readb(struct b2c2_device *b2c2, u32 dwAddress) +u8 b2c2_usb_memory_readb(struct flexcop_device *b2c2, u32 dwAddress) { u8 b; b2c2_usb_memory_req(b2c2,B2C2_USB_READ_V8_MEM,dwAddress,&b,1); @@ -356,6 +346,10 @@ * } */ +#if 0 +/* How is this going to be done? flexcop-sram at least isn't very compatible + * with the current usb code. + */ static int b2c2_usb_utility_req(struct usb_b2c2_usb *b2c2, int set, b2c2_usb_utility_function_t func, u8 extra, u16 wIndex, @@ -380,12 +374,18 @@ nWaitTime * HZ); return len == buflen ? 0 : -EIO; } +#endif -/* usb i2c stuff */ +/* usb i2c stuff static int b2c2_usb_i2c_req(struct usb_b2c2_usb *b2c2, b2c2_usb_request_t req, b2c2_usb_i2c_function_t func, u8 port, u8 chipaddr, u8 addr, u8 buflen, u8 *buf) + */ +static int b2c2_usb_i2c_req(struct flexcop_device *fc, + flexcop_access_op_t func, flexcop_i2c_port_t port, + u8 chipaddr, u8 addr, u8 *buf, u16 buflen) { + struct usb_b2c2_usb *b2c2 = fc->bus_specific; u16 wValue, wIndex; int nWaitTime,pipe,len; // u8 dwRequestType; @@ -416,8 +416,9 @@ wValue = (func << 8 ) | port; wIndex = (chipaddr << 8 ) | addr; - len = usb_control_msg(b2c2->udev,pipe, - req, + len = usb_control_msg(b2c2->udev, + pipe, + b2c2->i2c_req, request_type, wValue, wIndex, @@ -428,20 +429,8 @@ return len == buflen ? 0 : -EREMOTEIO; } -static u32 b2c2_usb_read_dw_old(struct b2c2_device *card, u16 wRegOffsPCI) -{ - err("do not use this functions. "); - return -EINVAL; -} - -static int b2c2_usb_write_dw_old(struct b2c2_device *card, u16 wRegOffsPCI, u32 val) -{ - err("do not use this functions. "); - return -EINVAL; -} - /* actual bus specific access functions, make sure prototype are/will be equal to pci */ -static flexcop_ibi_value b2c2_usb_read_ibi_reg(struct b2c2_device *card, flexcop_ibi_register reg) +static flexcop_ibi_value b2c2_usb_read_ibi_reg(struct flexcop_device *card, flexcop_ibi_register reg) { flexcop_ibi_value val; val.raw = 0; @@ -449,51 +438,62 @@ return val; } -static int b2c2_usb_write_ibi_reg(struct b2c2_device *card, flexcop_ibi_register reg, flexcop_ibi_value val) +static int b2c2_usb_write_ibi_reg(struct flexcop_device *card, flexcop_ibi_register reg, flexcop_ibi_value val) { return b2c2_usb_readwrite_dw(card,reg, &val.raw, 0); } -static int b2c2_usb_i2c_read(struct b2c2_device *card, u8 port, u8 chipaddr, u8 addr, u8 *buf, u16 len) +/* I guess these are no longer used? +static int b2c2_usb_i2c_read(struct flexcop_device *card, u8 port, u8 chipaddr, u8 addr, u8 *buf, u16 len) { return b2c2_usb_i2c_req(card->bus_specific,B2C2_USB_I2C_REQUEST, USB_FUNC_I2C_READ, port, chipaddr, addr, len, buf) == 0 ? len : 0; } -static int b2c2_usb_i2c_write(struct b2c2_device *card, u8 port, u8 chipaddr, u8 addr, u8 *buf, u16 len) +static int b2c2_usb_i2c_write(struct flexcop_device *card, u8 port, u8 chipaddr, u8 addr, u8 *buf, u16 len) { return b2c2_usb_i2c_req(card->bus_specific,B2C2_USB_I2C_REQUEST, USB_FUNC_I2C_WRITE, port, chipaddr, addr, len, buf) == 0 ? len : 0; } - -static void b2c2_dumpfourreg(struct b2c2_device *card, u16 offs) +*/ + +static void b2c2_dumpfourreg(struct flexcop_device *card, u16 offs) { flexcop_ibi_value r0,r1,r2,r3; r0 = b2c2_usb_read_ibi_reg(card, offs); r1 = b2c2_usb_read_ibi_reg(card, offs + 0x04); r2 = b2c2_usb_read_ibi_reg(card, offs + 0x08); r3 = b2c2_usb_read_ibi_reg(card, offs + 0x0c); - deb_ctrl("dump: offset: %03x, %08x, %08x, %08x, %08x\n",offs,r0.raw,r1.raw,r2.raw,r3.raw); + deb_info("dump: offset: %03x, %08x, %08x, %08x, %08x\n",offs,r0.raw,r1.raw,r2.raw,r3.raw); } static void b2c2_urb_complete(struct urb *urb, struct pt_regs *ptregs) { - struct usb_b2c2_usb *b2c2 = urb->context; +// struct usb_b2c2_usb *b2c2 = urb->context; deb_ts("urb completed, bufsize: %d actlen; %d\n",urb->transfer_buffer_length, urb->actual_length); // usb_submit_urb(urb,GFP_ATOMIC); // enable for real action } -static void open_stream_usb(struct b2c2_device *card, u16 pid) +static void open_stream_usb(struct flexcop_device *card) { /* TODO */ } -static void close_stream_usb(struct b2c2_device *card, u16 pid) +static void close_stream_usb(struct flexcop_device *card) { /* TODO */ } +static int stream_control(struct flexcop_device *fc, int onoff) +{ + if (onoff) + open_stream_usb(fc); + else + close_stream_usb(fc); + return 0; +} + static void b2c2_exit_usb(struct usb_b2c2_usb *b2c2) { int i; @@ -555,7 +555,7 @@ } if ((ret = usb_submit_urb(b2c2->iso_urb[i],GFP_ATOMIC))) { - b2c2_err("submitting urb %d failed with %d.",i,ret); + deb_info("submitting urb %d failed with %d.",i,ret); goto urb_error; } deb_info("submitted urb no. %d.\n",i); @@ -574,27 +574,27 @@ { struct usb_device *udev = interface_to_usbdev(intf); struct usb_b2c2_usb *b2c2 = NULL; - struct b2c2_device *card = NULL; + struct flexcop_device *card = NULL; int ret; switch (udev->speed) { case USB_SPEED_LOW: - b2c2_err("cannot handle USB speed because it is to sLOW."); + deb_info("cannot handle USB speed because it is to sLOW."); break; case USB_SPEED_FULL: - b2c2_info("running at FULL speed."); + deb_info("running at FULL speed."); break; case USB_SPEED_HIGH: - b2c2_info("running at HIGH speed."); + deb_info("running at HIGH speed."); break; case USB_SPEED_UNKNOWN: /* fall through */ default: - b2c2_err("cannot handle USB speed because it is unkown."); + deb_info("cannot handle USB speed because it is unkown."); ret = -EPROTO; goto usb_init_error; } - card = b2c2_device_kmalloc(sizeof(struct usb_b2c2_usb)); + card = flexcop_device_kmalloc(sizeof(struct usb_b2c2_usb)); if (card == NULL) { return -ENOMEM; } @@ -603,26 +603,27 @@ b2c2->udev = udev; b2c2->uintf = intf; - +/* card->read_dw_old = b2c2_usb_read_dw_old; card->write_dw_old = b2c2_usb_write_dw_old; - +*/ card->read_ibi_reg = b2c2_usb_read_ibi_reg; card->write_ibi_reg = b2c2_usb_write_ibi_reg; - card->i2c_read = b2c2_usb_i2c_read; - card->i2c_write = b2c2_usb_i2c_write; - card->open_stream = open_stream_usb; - card->close_stream = close_stream_usb; + card->i2c_request = b2c2_usb_i2c_req; + + card->stream_control = stream_control; /* Copy some info data from device specific to device independant */ + card->pid_filtering = enable_hw_filters; + /* card->debug = debug; - card->enable_hw_filters = enable_hw_filters; card->dev_vendor = udev->descriptor.idVendor; card->dev_device = udev->descriptor.idProduct; card->dev_subsystem_vendor = 0; card->dev_subsystem_device = 0; - + */ + /* use the alternate setting with the larges buffer */ usb_set_interface(udev,0,1); @@ -636,15 +637,15 @@ b2c2_dumpfourreg(card, 0x400); b2c2_dumpfourreg(card, 0x700); - b2c2_flexcop_reset(card); - ret = b2c2_initialize(card); + flexcop_reset(card); + ret = flexcop_device_initialize(card); if (ret != 0) { - b2c2_info("%s error while loading driver (%d)",DRIVER_DESC,ret); + deb_info("%s error while loading driver (%d)",DRIVER_DESC,ret); goto usb_init_error; } - b2c2_info("%s successfully initialized and connected.",DRIVER_DESC); + deb_info("%s successfully initialized and connected.",DRIVER_DESC); ret = 0; goto success; @@ -657,15 +658,18 @@ static void b2c2_usb_disconnect(struct usb_interface *intf) { - struct b2c2_device *card = usb_get_intfdata(intf); + struct flexcop_device *card = usb_get_intfdata(intf); usb_set_intfdata(intf,NULL); if (card != NULL) { + close_stream_usb(card); + /* b2c2_uninitialize(card); b2c2_exit_usb(card->bus_specific); + */ kfree(card->bus_specific); kfree(card); } - b2c2_info("%s successfully deinitialized and disconnected.",DRIVER_DESC); + deb_info("%s successfully deinitialized and disconnected.",DRIVER_DESC); } static struct usb_device_id b2c2_usb_table [] = { @@ -686,7 +690,7 @@ { int result; if ((result = usb_register(&b2c2_usb_driver))) { - b2c2_err("usb_register failed. Error number %d",result); + deb_info("usb_register failed. Error number %d",result); return result; } Index: flexcop.c =================================================================== RCS file: /cvs/linuxtv/dvb-kernel/b2c2/flexcop.c,v retrieving revision 1.8 diff -u -r1.8 flexcop.c --- flexcop.c 22 Feb 2005 22:17:52 -0000 1.8 +++ flexcop.c 25 Feb 2005 17:14:45 -0000 @@ -155,7 +155,7 @@ } EXPORT_SYMBOL(flexcop_pass_dmx_data); -static void flexcop_reset(struct flexcop_device *fc) +void flexcop_reset(struct flexcop_device *fc) { flexcop_ibi_value v210,v208; fc->write_ibi_reg(fc,ctrl_208,ibi_zero); @@ -169,6 +169,7 @@ v208.ctrl_208.Null_filter_sig = 1; fc->write_ibi_reg(fc,ctrl_208,v208); } +EXPORT_SYMBOL(flexcop_reset); struct flexcop_device *flexcop_device_kmalloc(size_t bus_specific_len) {