cx88-core.c

来自「优龙2410linux2.6.8内核源代码」· C语言 代码 · 共 601 行 · 第 1/2 页

C
601
字号
		.name       = "video v",		.cmds_start = 0x1800c0,		.ctrl_start = 0x180540,	        .cdt        = 0x180540 + 64,		.fifo_start = 0x183c00,		.fifo_size  = 0x000800,		.ptr1_reg   = MO_DMA23_PTR1,		.ptr2_reg   = MO_DMA23_PTR2,		.cnt1_reg   = MO_DMA23_CNT1,		.cnt2_reg   = MO_DMA23_CNT2,	},	[SRAM_CH24] = {		.name       = "vbi",		.cmds_start = 0x180100,		.ctrl_start = 0x1805e0,	        .cdt        = 0x1805e0 + 64,		.fifo_start = 0x184400,		.fifo_size  = 0x001000,		.ptr1_reg   = MO_DMA24_PTR1,		.ptr2_reg   = MO_DMA24_PTR2,		.cnt1_reg   = MO_DMA24_CNT1,		.cnt2_reg   = MO_DMA24_CNT2,	},	[SRAM_CH25] = {		.name       = "audio from",		.cmds_start = 0x180140,		.ctrl_start = 0x180680,	        .cdt        = 0x180680 + 64,		.fifo_start = 0x185400,		.fifo_size  = 0x000200,		.ptr1_reg   = MO_DMA25_PTR1,		.ptr2_reg   = MO_DMA25_PTR2,		.cnt1_reg   = MO_DMA25_CNT1,		.cnt2_reg   = MO_DMA25_CNT2,	},	[SRAM_CH26] = {		.name       = "audio to",		.cmds_start = 0x180180,		.ctrl_start = 0x180720,	        .cdt        = 0x180680 + 64,  /* same as audio IN */		.fifo_start = 0x185400,       /* same as audio IN */		.fifo_size  = 0x000200,       /* same as audio IN */		.ptr1_reg   = MO_DMA26_PTR1,		.ptr2_reg   = MO_DMA26_PTR2,		.cnt1_reg   = MO_DMA26_CNT1,		.cnt2_reg   = MO_DMA26_CNT2,	},};int cx88_sram_channel_setup(struct cx8800_dev *dev,			    struct sram_channel *ch,			    unsigned int bpl, u32 risc){	unsigned int i,lines;	u32 cdt;	bpl   = (bpl + 7) & ~7; /* alignment */	cdt   = ch->cdt;	lines = ch->fifo_size / bpl;	if (lines > 6)		lines = 6;	BUG_ON(lines < 2);	/* write CDT */	for (i = 0; i < lines; i++)		cx_write(cdt + 16*i, ch->fifo_start + bpl*i);	/* write CMDS */	cx_write(ch->cmds_start +  0, risc);	cx_write(ch->cmds_start +  4, cdt);	cx_write(ch->cmds_start +  8, (lines*16) >> 3);	cx_write(ch->cmds_start + 12, ch->ctrl_start);	cx_write(ch->cmds_start + 16, 64 >> 2);	for (i = 20; i < 64; i += 4)		cx_write(ch->cmds_start + i, 0);	/* fill registers */	cx_write(ch->ptr1_reg, ch->fifo_start);	cx_write(ch->ptr2_reg, cdt);	cx_write(ch->cnt1_reg, bpl >> 3);	cx_write(ch->cnt2_reg, (lines*16) >> 3);	dprintk("sram setup %s: bpl=%d lines=%d\n", ch->name, bpl, lines);	return 0;}/* ------------------------------------------------------------------ *//* debug helper code                                                  */int cx88_risc_decode(u32 risc){	static char *instr[16] = {		[ RISC_SYNC    >> 28 ] = "sync",		[ RISC_WRITE   >> 28 ] = "write",		[ RISC_WRITEC  >> 28 ] = "writec",		[ RISC_READ    >> 28 ] = "read",		[ RISC_READC   >> 28 ] = "readc",		[ RISC_JUMP    >> 28 ] = "jump",		[ RISC_SKIP    >> 28 ] = "skip",		[ RISC_WRITERM >> 28 ] = "writerm",		[ RISC_WRITECM >> 28 ] = "writecm",		[ RISC_WRITECR >> 28 ] = "writecr",	};	static int incr[16] = {		[ RISC_WRITE   >> 28 ] = 2,		[ RISC_JUMP    >> 28 ] = 2,		[ RISC_WRITERM >> 28 ] = 3,		[ RISC_WRITECM >> 28 ] = 3,		[ RISC_WRITECR >> 28 ] = 4,	};	static char *bits[] = {		"12",   "13",   "14",   "resync",		"cnt0", "cnt1", "18",   "19",		"20",   "21",   "22",   "23",		"irq1", "irq2", "eol",  "sol",	};	int i;	printk("0x%08x [ %s", risc,	       instr[risc >> 28] ? instr[risc >> 28] : "INVALID");	for (i = ARRAY_SIZE(bits)-1; i >= 0; i--)		if (risc & (1 << (i + 12)))			printk(" %s",bits[i]);	printk(" count=%d ]\n", risc & 0xfff);	return incr[risc >> 28] ? incr[risc >> 28] : 1;}void cx88_risc_disasm(struct cx8800_dev *dev,		      struct btcx_riscmem *risc){	unsigned int i,j,n;		printk("%s: risc disasm: %p [dma=0x%08lx]\n",	       dev->name, risc->cpu, (unsigned long)risc->dma);	for (i = 0; i < (risc->size >> 2); i += n) {		printk("%s:   %04d: ", dev->name, i);		n = cx88_risc_decode(risc->cpu[i]);		for (j = 1; j < n; j++)			printk("%s:   %04d: 0x%08x [ arg #%d ]\n",			       dev->name, i+j, risc->cpu[i+j], j);		if (risc->cpu[i] == RISC_JUMP)			break;	}}void cx88_sram_channel_dump(struct cx8800_dev *dev,			    struct sram_channel *ch){	static char *name[] = {		"initial risc",		"cdt base",		"cdt size",		"iq base",		"iq size",		"risc pc",		"iq wr ptr",		"iq rd ptr",		"cdt current",		"pci target",		"line / byte",	};	u32 risc;	unsigned int i,j,n;	printk("%s: %s - dma channel status dump\n",dev->name,ch->name);	for (i = 0; i < ARRAY_SIZE(name); i++)		printk("%s:   cmds: %-12s: 0x%08x\n",		       dev->name,name[i],		       cx_read(ch->cmds_start + 4*i));	for (i = 0; i < 4; i++) {		risc = cx_read(ch->cmds_start + 4 * (i+11));		printk("%s:   risc%d: ", dev->name, i);		cx88_risc_decode(risc);	}	for (i = 0; i < 16; i += n) {		risc = cx_read(ch->ctrl_start + 4 * i);		printk("%s:   iq %x: ", dev->name, i);		n = cx88_risc_decode(risc);		for (j = 1; j < n; j++) {			risc = cx_read(ch->ctrl_start + 4 * (i+j));			printk("%s:   iq %x: 0x%08x [ arg #%d ]\n",			       dev->name, i+j, risc, j);		}	}	printk("%s: fifo: 0x%08x -> 0x%x\n",	       dev->name, ch->fifo_start, ch->fifo_start+ch->fifo_size);	printk("%s: ctrl: 0x%08x -> 0x%x\n",	       dev->name, ch->ctrl_start, ch->ctrl_start+6*16);	printk("%s:   ptr1_reg: 0x%08x\n",	       dev->name,cx_read(ch->ptr1_reg));	printk("%s:   ptr2_reg: 0x%08x\n",	       dev->name,cx_read(ch->ptr2_reg));	printk("%s:   cnt1_reg: 0x%08x\n",	       dev->name,cx_read(ch->cnt1_reg));	printk("%s:   cnt2_reg: 0x%08x\n",	       dev->name,cx_read(ch->cnt2_reg));}char *cx88_pci_irqs[32] = {	"vid", "aud", "ts", "vip", "hst", "5", "6", "tm1", 	"src_dma", "dst_dma", "risc_rd_err", "risc_wr_err",	"brdg_err", "src_dma_err", "dst_dma_err", "ipb_dma_err",	"i2c", "i2c_rack", "ir_smp", "gpio0", "gpio1"};char *cx88_vid_irqs[32] = {	"y_risci1", "u_risci1", "v_risci1", "vbi_risc1", 	"y_risci2", "u_risci2", "v_risci2", "vbi_risc2",	"y_oflow",  "u_oflow",  "v_oflow",  "vbi_oflow",	"y_sync",   "u_sync",   "v_sync",   "vbi_sync",	"opc_err",  "par_err",  "rip_err",  "pci_abort",};void cx88_print_irqbits(char *name, char *tag, char **strings,			u32 bits, u32 mask){	unsigned int i;	printk(KERN_DEBUG "%s: %s [0x%x]", name, tag, bits);	for (i = 0; i < 32; i++) {		if (!(bits & (1 << i)))			continue;		printk(" %s",strings[i]);		if (!(mask & (1 << i)))			continue;		printk("*");	}	printk("\n");}/* ------------------------------------------------------------------ */int cx88_pci_quirks(char *name, struct pci_dev *pci, unsigned int *latency){	u8 ctrl = 0;	u8 value;	if (0 == pci_pci_problems)		return 0;	if (pci_pci_problems & PCIPCI_TRITON) {		printk(KERN_INFO "%s: quirk: PCIPCI_TRITON -- set TBFX\n",		       name);		ctrl |= CX88X_EN_TBFX;	}	if (pci_pci_problems & PCIPCI_NATOMA) {		printk(KERN_INFO "%s: quirk: PCIPCI_NATOMA -- set TBFX\n",		       name);		ctrl |= CX88X_EN_TBFX;	}	if (pci_pci_problems & PCIPCI_VIAETBF) {		printk(KERN_INFO "%s: quirk: PCIPCI_VIAETBF -- set TBFX\n",		       name);		ctrl |= CX88X_EN_TBFX;	}	if (pci_pci_problems & PCIPCI_VSFX) {		printk(KERN_INFO "%s: quirk: PCIPCI_VSFX -- set VSFX\n",		       name);		ctrl |= CX88X_EN_VSFX;	}#ifdef PCIPCI_ALIMAGIK	if (pci_pci_problems & PCIPCI_ALIMAGIK) {		printk(KERN_INFO "%s: quirk: PCIPCI_ALIMAGIK -- latency fixup\n",		       name);		*latency = 0x0A;	}#endif	if (ctrl) {		pci_read_config_byte(pci, CX88X_DEVCTRL, &value);		value |= ctrl;		pci_write_config_byte(pci, CX88X_DEVCTRL, value);	}	return 0;}/* ------------------------------------------------------------------ */EXPORT_SYMBOL(cx88_print_ioctl);EXPORT_SYMBOL(cx88_pci_irqs);EXPORT_SYMBOL(cx88_vid_irqs);EXPORT_SYMBOL(cx88_print_irqbits);EXPORT_SYMBOL(cx88_risc_buffer);EXPORT_SYMBOL(cx88_risc_stopper);EXPORT_SYMBOL(cx88_free_buffer);EXPORT_SYMBOL(cx88_risc_disasm);EXPORT_SYMBOL(cx88_sram_channels);EXPORT_SYMBOL(cx88_sram_channel_setup);EXPORT_SYMBOL(cx88_sram_channel_dump);EXPORT_SYMBOL(cx88_pci_quirks);/* * Local variables: * c-basic-offset: 8 * End: */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?