Hello everybody reading this, as outline attachment I send: A. the unfinished driver called cx878, to be implied into the current mercurial tree instead of /drivers/media/dvb/bt8xx it should be: /drivers/media/dvb/cx878 (cx878.tar.bz2). Makefile and Kconfig need to be changed then. B. a dummy driver to show how to enhance the pci_probe function (dummy.c) C. a kern.log with the two modules (i. e. cx878_core and cx878_budget) loaded with verbose=5. This will give you some hints about what function works and what function does not work. D. a console.txt that shows that the I2C bus part, working on the video controller part (i. e. device=0x036e) works excellently fine (i. e. FRONTEND LOCKED, proved by using szap) There do exist two alternatives on how to finish / complete that project: Alternative A: 1. Using the dummy.c example to extend the capabilities of pci_probe (i. e. probe TWO devices instead of ONE) Alternative B: 2. Generating a separate module for the audio controller (i. e. the RISC DMA engine) with a separate header file Right now, the pci_probe function is only used to probe seven different bt8xx-based cards to ensure that the adequate frontend is loaded. But this is not enough to make the whole driver work fine. Excerpt of cx878_budget.c shows that: static struct pci_device_id cx878_budget_pci_table[] = { MAKE_ENTRY(0x11bd, 0x001c, &cx878_pctvsat_config), /* Pinnacle Sat */ MAKE_ENTRY(0x1461, 0x0761, &cx878_aver761_config), /* Avermedia 761 */ MAKE_ENTRY(0x1461, 0x0771, &cx878_aver771_config), /* Avermedia 771 */ MAKE_ENTRY(0x0071, 0x0101, &cx878_nebula_dtv_config), /* Nebula DigiTV */ MAKE_ENTRY(0x18ac, 0xdb10, &cx878_dvico_dvbt_config), /* DViCO Fusion DVB-T */ MAKE_ENTRY(0x18ac, 0xd500, &cx878_dvico_hdtv_config), /* DViCO Fusion HDTV5 */ MAKE_ENTRY(0x7063, 0x2000, &cx878_pchdtv_config), /* PCHDTV-2000 */ }; MODULE_DEVICE_TABLE(pci, cx878_budget_pci_table); static struct pci_driver cx878_budget_pci_driver = { .name = "CX878 Budget", .id_table = cx878_budget_pci_table, .probe = cx878_budget_pci_probe, .remove = cx878_budget_pci_remove, }; Excerpt of cx878_common.h shows that also: #define MAKE_ENTRY(subven, subdev, configptr) { \ .vendor = 0x109e, \ .device = 0x036e, \ .subvendor = (subven), \ .subdevice = (subdev), \ .driver_data = (unsigned long) (configptr) \ } Please note: As stated in dummy.c, all seven cards have a common video controller address (device=0x036e - I2C bus) and a common audio controller address (device=0x0878 - RISC DMA engine). So please where is the appropriate solution? Is it Alternative A or Alternative B? If this is being finished or even can be finished there will be a driver for bt8xx-based DVB cards consuming less than 2 / 7 of RAM in comparison to the existing driver being dependent of some GPIO and I2C functions (derived from the traditional bttv concept which provides a lot of RAM-wasting dependency-nonsense) who AFAICS do work fine in the existing cx878 model. The only decisive question is how to imply the DMA RISC engine (i. e. audio controller - device=0x0878) under the same roof without conflicts and thus getting out video and audio streams, which is not possible at the current development state. As I said already: Everybody's help is deeply appreciated. Cheers everybody and thanks for reading this Uwe
brian:~# szap -r ZDF reading channels from file '/root/.szap/channels.conf' zapping to 7 'ZDF': sat 0, frequency = 11953 MHz H, symbolrate 27500000, vpid = 0x006e, apid = 0x0078 using '/dev/dvb/adapter0/frontend0' and '/dev/dvb/adapter0/demux0' status 03 | signal 9797 | snr 0000 | ber 00000000 | unc 0000f8b4 | status 1f | signal 9797 | snr 1c9c | ber 00007ce0 | unc 00000000 | FE_HAS_LOCK status 1f | signal 9797 | snr 1d5b | ber 0000779d | unc 00000000 | FE_HAS_LOCK status 1f | signal 9797 | snr 1e4e | ber 000084d7 | unc 00000000 | FE_HAS_LOCK status 1f | signal 9797 | snr 1db9 | ber 0000828a | unc 00000000 | FE_HAS_LOCK status 1f | signal 9797 | snr 1dd6 | ber 000086c7 | unc 00000000 | FE_HAS_LOCK status 1f | signal 9797 | snr 1e8a | ber 000083cf | unc 00000000 | FE_HAS_LOCK status 1f | signal 9797 | snr 1d13 | ber 00008009 | unc 00000000 | FE_HAS_LOCK status 1f | signal 9797 | snr 1cc6 | ber 00007ad5 | unc 00000000 | FE_HAS_LOCK status 1f | signal 9797 | snr 1dc4 | ber 00007f08 | unc 00000000 | FE_HAS_LOCK status 1f | signal 9797 | snr 1f17 | ber 00008d54 | unc 00000000 | FE_HAS_LOCK status 1f | signal 9797 | snr 1e63 | ber 00008757 | unc 00000000 | FE_HAS_LOCK status 1f | signal 9797 | snr 1dc3 | ber 00007dc9 | unc 00000000 | FE_HAS_LOCK status 1f | signal 9797 | snr 1f49 | ber 00008b64 | unc 00000000 | FE_HAS_LOCK status 1f | signal 9797 | snr 1e28 | ber 000083fe | unc 00000000 | FE_HAS_LOCK
Attachment:
cx878.tar.bz2
Description: application/tbz
#include <linux/pci.h> #include <linux/init.h> #include <linux/slab.h> static LIST_HEAD(cx878_pci_list); static DEFINE_MUTEX(cx878_pci_list_lock); struct pci_cx878_data { int cx878_counter; int id; struct list_head cx878_list; }; // Pinnacle PCTVSAT, Avermedia AverTV DVB-T 771 and 761, TT 1.6 DVB-S FF, TwinHan DST and clones, all other bt8xx-based DVB cards equally static struct pci_device_id pci_cx878_ids[]={ { 0x109e, 0x036e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, // function 0, video controller (I2C bus) { 0x109e, 0x0878, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, // function 1, audio controller (RISC DMA engine) {} }; static int __devinit pci_cx878_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id) { struct list_head *list = NULL; struct pci_cx878_data *h = NULL, *dev = NULL; int id; id = (pdev->bus->number<<8) | PCI_SLOT(pdev->devfn); printk("ID: %04x\n",id); mutex_lock(&cx878_pci_list_lock); list_for_each(list, &cx878_pci_list) { h = list_entry(list, struct pci_cx878_data, cx878_list); if (h->id == id) dev=h; } if (h != NULL) { dev->cx878_counter++; printk("found cx878 list (ID: %04x)! : %d\n",dev->id,dev->cx878_counter); } else { h=kmalloc(sizeof(struct pci_cx878_data), GFP_KERNEL); h->cx878_counter=5; h->id=id; list_add_tail(&h->cx878_list, &cx878_pci_list); printk("no list available initializing new one (id: %04x): %d\n",h->id, h->cx878_counter); } mutex_unlock(&cx878_pci_list_lock); return 0; } static struct pci_driver driver = { .name = "cx878", .id_table = pci_cx878_ids, .probe = pci_cx878_probe, }; static int __init pci_driver_init(void) { printk("=============== LOADING MODULE ===============\n"); return pci_register_driver(&driver); } static void __exit pci_driver_exit(void) { pci_unregister_driver(&driver); } module_init(pci_driver_init); module_exit(pci_driver_exit);
Attachment:
kern.log.bz2
Description: BZip2 compressed data
_______________________________________________ linux-dvb mailing list linux-dvb@xxxxxxxxxxx http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb