mirror of
				https://github.com/DigitalDevices/dddvb.git
				synced 2025-03-01 10:35:23 +00:00 
			
		
		
		
	Compare commits
	
		
			44 Commits
		
	
	
		
			0.9.38-pre
			...
			0.9.38
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 979cb7a237 | ||
|  | 7ce5232cd7 | ||
|  | 3f296bef62 | ||
|  | ad01e9f508 | ||
|  | e312df576c | ||
|  | 4b5cd433f9 | ||
|  | 6c068c0cc3 | ||
|  | 1488f326d0 | ||
|  | c86cb59638 | ||
|  | c78905d4a2 | ||
|  | 31589952a8 | ||
|  | 7eb5c6e658 | ||
|  | 172c6c93ba | ||
|  | f125fd503c | ||
|  | 0dd4f106ab | ||
|  | 60426304db | ||
|  | 00b0036b33 | ||
|  | 177e71d62a | ||
|  | 83a6dc3a1d | ||
|  | cc03d96de2 | ||
|  | 6336bd3689 | ||
|  | be79cec76e | ||
|  | 24801ab41a | ||
|  | 390f67c03b | ||
|  | fa4e3331d8 | ||
|  | 29cc552a6b | ||
|  | 42a0b65235 | ||
|  | b8abf46d06 | ||
|  | ce06e50881 | ||
|  | 22ffb0ecac | ||
|  | 92f2132d79 | ||
|  | 727fba48be | ||
|  | 09e8a15d78 | ||
|  | 45c9f076bd | ||
|  | 5c2757d581 | ||
|  | 817a464f4a | ||
|  | d627e6995f | ||
|  | ab4b0c8306 | ||
|  | c8c1ee1835 | ||
|  | 002f39787a | ||
|  | 871821d6a0 | ||
|  | 2a88d220e4 | ||
|  | e0539d5074 | ||
|  | 457cb550bb | 
							
								
								
									
										4
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								Makefile
									
									
									
									
									
								
							| @@ -1,4 +1,5 @@ | |||||||
| kernelver ?= $(shell uname -r) | kernelver ?= $(shell uname -r) | ||||||
|  | MDIR	?= | ||||||
| KDIR	?= /lib/modules/$(kernelver)/build | KDIR	?= /lib/modules/$(kernelver)/build | ||||||
| PWD	:= $(shell pwd) | PWD	:= $(shell pwd) | ||||||
|  |  | ||||||
| @@ -29,10 +30,11 @@ dep: | |||||||
| 	DIR=`pwd`; (cd $(TOPDIR); make KBUILD_EXTMOD=$$DIR dep) | 	DIR=`pwd`; (cd $(TOPDIR); make KBUILD_EXTMOD=$$DIR dep) | ||||||
|  |  | ||||||
| install: all | install: all | ||||||
| 	$(MAKE) -C $(KDIR) KBUILD_EXTMOD=$(PWD) modules_install | 	$(MAKE) -C $(KDIR) KBUILD_EXTMOD=$(PWD) INSTALL_MOD_PATH=$(MDIR) modules_install | ||||||
| 	depmod $(kernelver) | 	depmod $(kernelver) | ||||||
|  |  | ||||||
| clean: | clean: | ||||||
| 	rm -rf */.*.o.d */*.o */*.ko */*.mod.c */.*.cmd .tmp_versions Module* modules* | 	rm -rf */.*.o.d */*.o */*.ko */*.mod.c */.*.cmd .tmp_versions Module* modules* | ||||||
|  | 	$(MAKE) -C apps clean | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,4 +1,20 @@ | |||||||
| all: cit citin flashprog modt ddtest setmod ddflash setmod2 pls setmod3 modconfig ddinfo getiq | TARGETS = cit citin flashprog modt ddtest setmod ddflash setmod2 pls setmod3 modconfig ddinfo getiq modtest | ||||||
|  |  | ||||||
|  | all: $(TARGETS)  | ||||||
|  |  | ||||||
|  | CFLAGS =  -g -Wall -Wno-unused  -Wno-format | ||||||
|  | FFMPEG := $(shell command -v ffmpeg 2> /dev/null) | ||||||
|  |  | ||||||
|  | modtest: modtest.c | ||||||
|  | 	$(CC) -o modtest modtest.c -I../include/ -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE | ||||||
|  |  | ||||||
|  | test.ts: | ||||||
|  | ifndef FFMPEG | ||||||
|  | 	$(error "ffmpeg is not available please install to create test.ts") | ||||||
|  | endif | ||||||
|  | 	ffmpeg -f lavfi -i testsrc=duration=10:size=1280x720:rate=30  \ | ||||||
|  | 	-f lavfi -i sine=f=440:b=4  -shortest   -metadata \ | ||||||
|  | 	service_provider="DD"      -metadata service_name="Test" test.ts | ||||||
|  |  | ||||||
| cit: cit.c | cit: cit.c | ||||||
| 	$(CC) -o cit cit.c -lpthread | 	$(CC) -o cit cit.c -lpthread | ||||||
| @@ -18,9 +34,19 @@ setmod3: setmod3.c | |||||||
| modconfig: modconfig.c | modconfig: modconfig.c | ||||||
| 	$(CC) -o modconfig modconfig.c -I../include/ | 	$(CC) -o modconfig modconfig.c -I../include/ | ||||||
|  |  | ||||||
|  | clean: | ||||||
|  | 	rm cit citin flashprog modt ddtest setmod ddflash setmod2 pls setmod3 modconfig ddinfo getiq | ||||||
|  |  | ||||||
| %: %.c | %: %.c | ||||||
| 	$(CC) $(CFLAGS) -I../ddbridge  -I../include/ $< -o $@ | 	$(CC) $(CFLAGS) -I../ddbridge  -I../include/ $< -o $@ | ||||||
|  |  | ||||||
| %.o: %.c | %.o: %.c | ||||||
| 	$(CC) $(CFLAGS) -I../ddbridge -o $@ $< | 	$(CC) $(CFLAGS) -I../ddbridge -o $@ $< | ||||||
|  |  | ||||||
|  |  | ||||||
|  | clean: | ||||||
|  | 	for f in $(TARGETS) *.o *~ ; do \ | ||||||
|  | 		if [ -e "$$f" ]; then \ | ||||||
|  | 			rm "$$f" || exit 1; \ | ||||||
|  | 		fi \ | ||||||
|  | 	done | ||||||
|   | |||||||
| @@ -276,10 +276,10 @@ int mci_cmd(int dev, struct mci_command *cmd) | |||||||
| 	memset(&msg, 0, sizeof(msg)); | 	memset(&msg, 0, sizeof(msg)); | ||||||
| 	msg.link = 0; | 	msg.link = 0; | ||||||
| 	memcpy(&msg.cmd, cmd, sizeof(msg.cmd)); | 	memcpy(&msg.cmd, cmd, sizeof(msg.cmd)); | ||||||
| 	//dump((uint8_t *) &msg.cmd, sizeof(msg.cmd)); | 	//dump((const uint8_t *) &msg.cmd, sizeof(msg.cmd)); | ||||||
| 	ret = ioctl(dev, IOCTL_DDB_MCI_CMD, &msg); | 	ret = ioctl(dev, IOCTL_DDB_MCI_CMD, &msg); | ||||||
| 	if (ret < 0) { | 	if (ret < 0) { | ||||||
| 		dprintf(2, "mci_cmd error %d\n", errno); | 	    dprintf(2, "mci_cmd error %d (%s)\n", errno, strerror(errno)); | ||||||
| 		return ret; | 		return ret; | ||||||
| 	} | 	} | ||||||
| 	status = msg.res.status; | 	status = msg.res.status; | ||||||
| @@ -458,7 +458,7 @@ int mci_lic(int dev) | |||||||
| 		printf("MATYPE1: %02x\n", res->bb_header.matype_1); | 		printf("MATYPE1: %02x\n", res->bb_header.matype_1); | ||||||
| 		printf("MATYPE2: %02x\n", res->bb_header.matype_2); | 		printf("MATYPE2: %02x\n", res->bb_header.matype_2); | ||||||
| 	} | 	} | ||||||
| 	dump(&res->license, sizeof(res->license)); | 	dump((const uint8_t *)&res->license, sizeof(res->license)); | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										1313
									
								
								apps/modtest.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1313
									
								
								apps/modtest.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -147,7 +147,7 @@ int main(int argc, char **argv) | |||||||
| 	if (gold != 0xffffffff) { | 	if (gold != 0xffffffff) { | ||||||
| 		if (gold < 0x3ffff) { | 		if (gold < 0x3ffff) { | ||||||
| 			root = gold2root(gold); | 			root = gold2root(gold); | ||||||
| 			printf("gold = %llu (0x%05x)   root = %llu (0x%05x)\n", | 			printf("gold = %u (0x%05x)   root = %u (0x%05x)\n", | ||||||
| 			       gold, gold, root, root); | 			       gold, gold, root, root); | ||||||
| 		} else | 		} else | ||||||
| 			printf("Invalid gold code specified.\n"); | 			printf("Invalid gold code specified.\n"); | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ | |||||||
| # | # | ||||||
|  |  | ||||||
| ddbridge-objs = ddbridge-main.o ddbridge-hw.o ddbridge-i2c.o ddbridge-ns.o ddbridge-modulator.o ddbridge-core.o ddbridge-io.o ddbridge-ci.o ddbridge-max.o ddbridge-mci.o ddbridge-sx8.o ddbridge-m4.o dvb_netstream.o | ddbridge-objs = ddbridge-main.o ddbridge-hw.o ddbridge-i2c.o ddbridge-ns.o ddbridge-modulator.o ddbridge-core.o ddbridge-io.o ddbridge-ci.o ddbridge-max.o ddbridge-mci.o ddbridge-sx8.o ddbridge-m4.o dvb_netstream.o | ||||||
| octonet-objs = octonet-main.o ddbridge-hw.o ddbridge-i2c.o ddbridge-ns.o ddbridge-modulator.o ddbridge-core.o ddbridge-io.o ddbridge-ci.o ddbridge-max.o ddbridge-mci.o ddbridge-sx8.o ddbridge-m4.o dvb_netstream.o | octonet-objs = octonet-main.o ddbridge-hw.o ddbridge-i2c.o ddbridge-ns.o ddbridge-core.o ddbridge-io.o ddbridge-ci.o ddbridge-max.o ddbridge-mci.o ddbridge-sx8.o ddbridge-m4.o dvb_netstream.o | ||||||
|  |  | ||||||
| obj-$(CONFIG_DVB_DDBRIDGE) += ddbridge.o | obj-$(CONFIG_DVB_DDBRIDGE) += ddbridge.o | ||||||
| obj-$(CONFIG_DVB_OCTONET) += octonet.o | obj-$(CONFIG_DVB_OCTONET) += octonet.o | ||||||
|   | |||||||
| @@ -370,7 +370,7 @@ static int dma_alloc(struct pci_dev *pdev, struct ddb_dma *dma, int dir) | |||||||
| 			if (!dma->vbuf[i]) | 			if (!dma->vbuf[i]) | ||||||
| 				return -ENOMEM; | 				return -ENOMEM; | ||||||
| 		} | 		} | ||||||
| 		if (((u64)dma->vbuf[i] & 0xfff)) | 		if (((uintptr_t) dma->vbuf[i] & 0xfff)) | ||||||
| 			dev_err(&pdev->dev, "DMA memory at %px not aligned!\n", dma->vbuf[i]); | 			dev_err(&pdev->dev, "DMA memory at %px not aligned!\n", dma->vbuf[i]); | ||||||
| 	} | 	} | ||||||
| 	return 0; | 	return 0; | ||||||
| @@ -534,7 +534,9 @@ static int ddb_output_start_unlocked(struct ddb_output *output) | |||||||
| 		ddbwritel(dev, 0, DMA_BUFFER_CONTROL(output->dma)); | 		ddbwritel(dev, 0, DMA_BUFFER_CONTROL(output->dma)); | ||||||
| 	} | 	} | ||||||
| 	if (output->port->class == DDB_PORT_MOD) { | 	if (output->port->class == DDB_PORT_MOD) { | ||||||
|  | #ifndef CONFIG_MACH_OCTONET | ||||||
| 		err = ddbridge_mod_output_start(output); | 		err = ddbridge_mod_output_start(output); | ||||||
|  | #endif | ||||||
| 	} else { | 	} else { | ||||||
| 		if (output->port->input[0]->port->class == DDB_PORT_LOOP) | 		if (output->port->input[0]->port->class == DDB_PORT_LOOP) | ||||||
| 			con = (1UL << 13) | 0x14; | 			con = (1UL << 13) | 0x14; | ||||||
| @@ -578,9 +580,11 @@ static void ddb_output_stop_unlocked(struct ddb_output *output) | |||||||
| { | { | ||||||
| 	struct ddb *dev = output->port->dev; | 	struct ddb *dev = output->port->dev; | ||||||
|  |  | ||||||
|  | #ifndef CONFIG_MACH_OCTONET | ||||||
| 	if (output->port->class == DDB_PORT_MOD) | 	if (output->port->class == DDB_PORT_MOD) | ||||||
| 		ddbridge_mod_output_stop(output); | 		ddbridge_mod_output_stop(output); | ||||||
| 	else | 	else | ||||||
|  | #endif | ||||||
| 		ddbwritel(dev, 0, TS_CONTROL(output)); | 		ddbwritel(dev, 0, TS_CONTROL(output)); | ||||||
| 	if (output->dma) { | 	if (output->dma) { | ||||||
| 		ddbwritel(dev, 0, DMA_BUFFER_CONTROL(output->dma)); | 		ddbwritel(dev, 0, DMA_BUFFER_CONTROL(output->dma)); | ||||||
| @@ -622,12 +626,14 @@ static void ddb_input_stop_unlocked(struct ddb_input *input) | |||||||
| 		input->dma->running = 0; | 		input->dma->running = 0; | ||||||
| 		if (input->dma->stall_count) | 		if (input->dma->stall_count) | ||||||
| 			dev_warn(input->port->dev->dev, | 			dev_warn(input->port->dev->dev, | ||||||
| 				 "DMA stalled %u times!\n", | 				 "l%ui%u: DMA stalled %u times!\n", | ||||||
|  | 				 input->port->lnr, input->nr, | ||||||
| 				 input->dma->stall_count); | 				 input->dma->stall_count); | ||||||
| 		update_loss(input->dma); | 		update_loss(input->dma); | ||||||
| 		if (input->dma->packet_loss > 1) | 		if (input->dma->packet_loss > 1) | ||||||
| 			dev_warn(input->port->dev->dev, | 			dev_warn(input->port->dev->dev, | ||||||
| 				 "%u packets lost due to low DMA performance!\n", | 				 "l%ui%u: %u packets lost due to low DMA performance!\n", | ||||||
|  | 				 input->port->lnr, input->nr, | ||||||
| 				 input->dma->packet_loss); | 				 input->dma->packet_loss); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| @@ -1062,8 +1068,12 @@ static struct dvb_device dvbdev_ci = { | |||||||
| static long mod_ioctl(struct file *file, | static long mod_ioctl(struct file *file, | ||||||
| 		      unsigned int cmd, unsigned long arg) | 		      unsigned int cmd, unsigned long arg) | ||||||
| { | { | ||||||
|  | #ifndef CONFIG_MACH_OCTONET | ||||||
| 	return ddb_dvb_usercopy(file, cmd, arg, ddbridge_mod_do_ioctl); | 	return ddb_dvb_usercopy(file, cmd, arg, ddbridge_mod_do_ioctl); | ||||||
| } | #else | ||||||
|  | 	return 0; | ||||||
|  | #endif | ||||||
|  | 	} | ||||||
|  |  | ||||||
| static const struct file_operations mod_fops = { | static const struct file_operations mod_fops = { | ||||||
| 	.owner   = THIS_MODULE, | 	.owner   = THIS_MODULE, | ||||||
| @@ -1114,13 +1124,19 @@ static void dummy_release(struct dvb_frontend *fe) | |||||||
| 	kfree(fe); | 	kfree(fe); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static enum dvbfe_algo dummy_algo(struct dvb_frontend *fe) | ||||||
|  | { | ||||||
|  | 	return DVBFE_ALGO_HW; | ||||||
|  | } | ||||||
|  |  | ||||||
| static struct dvb_frontend_ops dummy_ops = { | static struct dvb_frontend_ops dummy_ops = { | ||||||
| 	.delsys = { SYS_DVBC_ANNEX_A, SYS_DVBS, SYS_DVBS2 }, | 	.delsys = { SYS_DVBC_ANNEX_A }, | ||||||
| 	.info = { | 	.info = { | ||||||
| 		.name = "DUMMY DVB-C/C2 DVB-T/T2", | 		.name = "DUMMY DVB-C", | ||||||
| 		.frequency_stepsize_hz = 166667,	/* DVB-T only */ | 		.frequency_stepsize_hz = 0, | ||||||
| 		.frequency_min_hz = 47000000,	/* DVB-T: 47125000 */ | 		.frequency_tolerance_hz	= 0, | ||||||
| 		.frequency_max_hz = 865000000,	/* DVB-C: 862000000 */ | 		.frequency_min_hz = 47000000, | ||||||
|  | 		.frequency_max_hz = 865000000, | ||||||
| 		.symbol_rate_min = 870000, | 		.symbol_rate_min = 870000, | ||||||
| 		.symbol_rate_max = 11700000, | 		.symbol_rate_max = 11700000, | ||||||
| 		.caps = FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_32 | | 		.caps = FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_32 | | ||||||
| @@ -1133,6 +1149,7 @@ static struct dvb_frontend_ops dummy_ops = { | |||||||
| 		FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_HIERARCHY_AUTO | | 		FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_HIERARCHY_AUTO | | ||||||
| 		FE_CAN_RECOVER | FE_CAN_MUTE_TS | FE_CAN_2G_MODULATION | 		FE_CAN_RECOVER | FE_CAN_MUTE_TS | FE_CAN_2G_MODULATION | ||||||
| 	}, | 	}, | ||||||
|  | 	.get_frontend_algo = dummy_algo, | ||||||
| 	.release = dummy_release, | 	.release = dummy_release, | ||||||
| 	.read_status = dummy_read_status, | 	.read_status = dummy_read_status, | ||||||
| }; | }; | ||||||
| @@ -1228,6 +1245,7 @@ static int demod_attach_stv0367dd(struct ddb_input *input) | |||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #ifdef CONFIG_DVB_DRXK | ||||||
| static int tuner_attach_tda18271(struct ddb_input *input) | static int tuner_attach_tda18271(struct ddb_input *input) | ||||||
| { | { | ||||||
| 	struct i2c_adapter *i2c = &input->port->i2c->adap; | 	struct i2c_adapter *i2c = &input->port->i2c->adap; | ||||||
| @@ -1246,6 +1264,7 @@ static int tuner_attach_tda18271(struct ddb_input *input) | |||||||
| 	} | 	} | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
| static int tuner_attach_tda18212dd(struct ddb_input *input) | static int tuner_attach_tda18212dd(struct ddb_input *input) | ||||||
| { | { | ||||||
| @@ -1530,7 +1549,9 @@ static void dvb_input_detach(struct ddb_input *input) | |||||||
| 			dvb_netstream_release(&dvb->dvbns); | 			dvb_netstream_release(&dvb->dvbns); | ||||||
| 		fallthrough; | 		fallthrough; | ||||||
| 	case 0x20: | 	case 0x20: | ||||||
|  | #ifdef CONFIG_DVB_NET | ||||||
| 		dvb_net_release(&dvb->dvbnet); | 		dvb_net_release(&dvb->dvbnet); | ||||||
|  | #endif | ||||||
| 		fallthrough; | 		fallthrough; | ||||||
| 	case 0x12: | 	case 0x12: | ||||||
| 		dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, | 		dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, | ||||||
| @@ -1709,9 +1730,11 @@ static int dvb_input_attach(struct ddb_input *input) | |||||||
| 		return ret; | 		return ret; | ||||||
| 	dvb->attached = 0x12; | 	dvb->attached = 0x12; | ||||||
|  |  | ||||||
|  | #ifdef CONFIG_DVB_NET | ||||||
| 	ret = dvb_net_init(adap, &dvb->dvbnet, dvb->dmxdev.demux); | 	ret = dvb_net_init(adap, &dvb->dvbnet, dvb->dmxdev.demux); | ||||||
| 	if (ret < 0) | 	if (ret < 0) | ||||||
| 		return ret; | 		return ret; | ||||||
|  | #endif | ||||||
| 	dvb->attached = 0x20; | 	dvb->attached = 0x20; | ||||||
|  |  | ||||||
| 	if (input->port->dev->ns_num) { | 	if (input->port->dev->ns_num) { | ||||||
| @@ -2648,10 +2671,6 @@ static void ddb_ports_init(struct ddb *dev) | |||||||
| 		if (!rm) | 		if (!rm) | ||||||
| 			continue; | 			continue; | ||||||
| 		ports = info->port_num; | 		ports = info->port_num; | ||||||
| 		if ((l == 0) && (info->type == DDB_MOD) && |  | ||||||
| 		    (dev->link[0].ids.revision == 1)) { |  | ||||||
| 			ports = ddbreadl(dev, 0x260) >> 24; |  | ||||||
| 		} |  | ||||||
| 		for (i = 0; i < ports; i++, p++) { | 		for (i = 0; i < ports; i++, p++) { | ||||||
| 			port = &dev->port[p]; | 			port = &dev->port[p]; | ||||||
| 			port->dev = dev; | 			port->dev = dev; | ||||||
| @@ -2720,10 +2739,12 @@ static void ddb_ports_init(struct ddb *dev) | |||||||
| 				ddb_input_init(port, 2 * i + 1, 1, 2 * p + 1); | 				ddb_input_init(port, 2 * i + 1, 1, 2 * p + 1); | ||||||
| 				break; | 				break; | ||||||
| 			case DDB_MOD: | 			case DDB_MOD: | ||||||
|  | #ifndef CONFIG_MACH_OCTONET | ||||||
| 				ddb_output_init(port, i); | 				ddb_output_init(port, i); | ||||||
| 				ddb_irq_set(dev, 0, i + rm->irq_base_rate, | 				ddb_irq_set(dev, 0, i + rm->irq_base_rate, | ||||||
| 					    &ddbridge_mod_rate_handler, | 					    &ddbridge_mod_rate_handler, | ||||||
| 					    &dev->output[i]); | 					    &dev->output[i]); | ||||||
|  | #endif | ||||||
| 				break; | 				break; | ||||||
| 			default: | 			default: | ||||||
| 				break; | 				break; | ||||||
| @@ -4429,6 +4450,41 @@ static int ddb_init_boards(struct ddb *dev) | |||||||
| 			     (link->ids.revision == 1))) | 			     (link->ids.revision == 1))) | ||||||
| 				mci_init(link); | 				mci_init(link); | ||||||
| 		} | 		} | ||||||
|  | 		if (l) | ||||||
|  | 			continue; | ||||||
|  | 		if (dev->link[0].info->type == DDB_MOD && | ||||||
|  | 		    dev->link[0].info->version == 2) { | ||||||
|  | 			u32 lic = ddbreadl(dev, 0x1c) & 7; | ||||||
|  |  | ||||||
|  | 			if (dev->link[0].ids.revision == 1) | ||||||
|  | 				lic = ddbreadl(dev, 0x260) >> 24; | ||||||
|  |  | ||||||
|  | 			switch (lic) { | ||||||
|  | 			case 0: | ||||||
|  | 			case 4: | ||||||
|  | 				dev->link[0].info = | ||||||
|  | 					get_ddb_info(0xdd01, 0x0210, 0xdd01, 0x0000); | ||||||
|  | 				break; | ||||||
|  | 			case 1: | ||||||
|  | 			case 8: | ||||||
|  | 				dev->link[0].info = | ||||||
|  | 					get_ddb_info(0xdd01, 0x0210, 0xdd01, 0x0003); | ||||||
|  | 				break; | ||||||
|  | 			case 2: | ||||||
|  | 			case 24: | ||||||
|  | 				dev->link[0].info = | ||||||
|  | 					get_ddb_info(0xdd01, 0x0210, 0xdd01, 0x0001); | ||||||
|  | 				break; | ||||||
|  | 			case 3: | ||||||
|  | 			case 16: | ||||||
|  | 				dev->link[0].info = | ||||||
|  | 					get_ddb_info(0xdd01, 0x0210, 0xdd01, 0x0002); | ||||||
|  | 				break; | ||||||
|  | 			default: | ||||||
|  | 				break; | ||||||
|  | 			} | ||||||
|  | 			dev_info(dev->dev, "Modulator channels: %u\n", dev->link[0].info->port_num); | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| @@ -4455,8 +4511,10 @@ int ddb_init(struct ddb *dev) | |||||||
| 	if (ddb_i2c_init(dev) < 0) | 	if (ddb_i2c_init(dev) < 0) | ||||||
| 		goto fail; | 		goto fail; | ||||||
| 	ddb_ports_init(dev); | 	ddb_ports_init(dev); | ||||||
|  | #ifndef CONFIG_MACH_OCTONET | ||||||
| 	if (dev->link[0].info->type == DDB_MOD) | 	if (dev->link[0].info->type == DDB_MOD) | ||||||
| 		ddbridge_mod_init(dev); | 		ddbridge_mod_init(dev); | ||||||
|  | #endif | ||||||
| 	if (ddb_buffers_alloc(dev) < 0) { | 	if (ddb_buffers_alloc(dev) < 0) { | ||||||
| 		dev_info(dev->dev, | 		dev_info(dev->dev, | ||||||
| 			 "Could not allocate buffer memory\n"); | 			 "Could not allocate buffer memory\n"); | ||||||
|   | |||||||
| @@ -570,6 +570,17 @@ static const struct ddb_info ddb_mod_fsm_4 = { | |||||||
| 	.lostlock_irq = 9, | 	.lostlock_irq = 9, | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | static const struct ddb_info ddb_mod_fsm = { | ||||||
|  | 	.type     = DDB_MOD, | ||||||
|  | 	.name     = "Digital Devices DVB-C FSM", | ||||||
|  | 	.version  = 2, | ||||||
|  | 	.regmap   = &octopus_mod_2_map, | ||||||
|  | 	.port_num = 0, | ||||||
|  | 	.temp_num = 1, | ||||||
|  | 	.tempmon_irq = 8, | ||||||
|  | 	.lostlock_irq = 9, | ||||||
|  | }; | ||||||
|  |  | ||||||
| static const struct ddb_info ddb_sdr_atv = { | static const struct ddb_info ddb_sdr_atv = { | ||||||
| 	.type     = DDB_MOD, | 	.type     = DDB_MOD, | ||||||
| 	.name     = "Digital Devices SDR ATV", | 	.name     = "Digital Devices SDR ATV", | ||||||
| @@ -873,6 +884,7 @@ static const struct ddb_device_id ddb_device_ids[] = { | |||||||
| 	DDB_DEVID(0x0201, 0x0002, ddb_mod), | 	DDB_DEVID(0x0201, 0x0002, ddb_mod), | ||||||
| 	DDB_DEVID(0x0201, 0x0004, ddb_mod_4),  /* dummy entry ! */ | 	DDB_DEVID(0x0201, 0x0004, ddb_mod_4),  /* dummy entry ! */ | ||||||
| 	DDB_DEVID(0x0203, 0x0001, ddb_mod), | 	DDB_DEVID(0x0203, 0x0001, ddb_mod), | ||||||
|  | 	DDB_DEVID(0x0210, 0x0004, ddb_mod_fsm), /* dummy entry ! */ | ||||||
| 	DDB_DEVID(0x0210, 0x0000, ddb_mod_fsm_4), /* dummy entry ! */ | 	DDB_DEVID(0x0210, 0x0000, ddb_mod_fsm_4), /* dummy entry ! */ | ||||||
| 	DDB_DEVID(0x0210, 0x0001, ddb_mod_fsm_24), | 	DDB_DEVID(0x0210, 0x0001, ddb_mod_fsm_24), | ||||||
| 	DDB_DEVID(0x0210, 0x0002, ddb_mod_fsm_16), | 	DDB_DEVID(0x0210, 0x0002, ddb_mod_fsm_16), | ||||||
|   | |||||||
| @@ -84,7 +84,7 @@ int pci_irq_vector(struct pci_dev *dev, unsigned int nr) | |||||||
| /****************************************************************************/ | /****************************************************************************/ | ||||||
| /****************************************************************************/ | /****************************************************************************/ | ||||||
|  |  | ||||||
| static void __devexit ddb_irq_disable(struct ddb *dev) | static void ddb_irq_disable(struct ddb *dev) | ||||||
| { | { | ||||||
| 	if (dev->link[0].info->regmap->irq_version == 2) { | 	if (dev->link[0].info->regmap->irq_version == 2) { | ||||||
| 		ddbwritel(dev, 0x00000000, INTERRUPT_V2_CONTROL); | 		ddbwritel(dev, 0x00000000, INTERRUPT_V2_CONTROL); | ||||||
| @@ -114,7 +114,7 @@ static void __devexit ddb_msi_exit(struct ddb *dev) | |||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| static void __devexit ddb_irq_exit(struct ddb *dev) | static void ddb_irq_exit(struct ddb *dev) | ||||||
| { | { | ||||||
| 	ddb_irq_disable(dev); | 	ddb_irq_disable(dev); | ||||||
| 	if (dev->msi == 2) | 	if (dev->msi == 2) | ||||||
| @@ -283,11 +283,17 @@ static int __devinit ddb_probe(struct pci_dev *pdev, | |||||||
|  |  | ||||||
| 	pci_set_master(pdev); | 	pci_set_master(pdev); | ||||||
|  |  | ||||||
|  | #if (KERNEL_VERSION(5, 18, 0) <= LINUX_VERSION_CODE) | ||||||
|  | 	if (dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64))) | ||||||
|  | 		if (dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32))) | ||||||
|  | #else | ||||||
| 	if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) { | 	if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) { | ||||||
| 		pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)); | 		pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)); | ||||||
| 	} else if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) { | 	} else if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) { | ||||||
| 		pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32)); | 		pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32)); | ||||||
| 	} else return -ENODEV; | 	} else | ||||||
|  | #endif | ||||||
|  | 		return -ENODEV; | ||||||
|  |  | ||||||
| 	dev = vzalloc(sizeof(*dev)); | 	dev = vzalloc(sizeof(*dev)); | ||||||
| 	if (!dev) | 	if (!dev) | ||||||
| @@ -344,45 +350,22 @@ static int __devinit ddb_probe(struct pci_dev *pdev, | |||||||
| 	if (dev->link[0].info->type != DDB_MOD) | 	if (dev->link[0].info->type != DDB_MOD) | ||||||
| 		ddbwritel(dev, 0, DMA_BASE_WRITE); | 		ddbwritel(dev, 0, DMA_BASE_WRITE); | ||||||
|  |  | ||||||
| 	if (dev->link[0].info->type == DDB_MOD | 	if (dev->link[0].info->type == DDB_MOD && | ||||||
| 	    && dev->link[0].info->version <= 1) { | 	    dev->link[0].info->version <= 1) { | ||||||
| 		if (ddbreadl(dev, 0x1c) == 4) | 		if (ddbreadl(dev, 0x1c) == 4) | ||||||
| 			dev->link[0].info = | 			dev->link[0].info = | ||||||
| 				get_ddb_info(0xdd01, 0x0201, 0xdd01, 0x0004); | 				get_ddb_info(0xdd01, 0x0201, 0xdd01, 0x0004); | ||||||
| 	} | 	} | ||||||
| 	if (dev->link[0].info->type == DDB_MOD |  | ||||||
| 	    && dev->link[0].info->version == 2) { |  | ||||||
| 		u32 lic = ddbreadl(dev, 0x1c) & 7; |  | ||||||
|  |  | ||||||
|  | 	if (dev->link[0].info->type == DDB_MOD && | ||||||
|  | 	    dev->link[0].info->version == 2) { | ||||||
| 		if (dev->link[0].ids.revision == 1) | 		if (dev->link[0].ids.revision == 1) | ||||||
| 			lic = ddbreadl(dev, 0x260) >> 24; | 			dev->link[0].info = get_ddb_info(0xdd01, 0x0210, 0xdd01, 0x0004); | ||||||
|  | 		else if ((ddbreadl(dev, 0x1c) & 7) != 7) | ||||||
|  | 			dev->link[0].info = get_ddb_info(0xdd01, 0x0210, 0xdd01, 0x0004); | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 		switch (lic) { | 	dev_info(dev->dev, "%s\n", dev->link[0].info->name); | ||||||
| 		case 0: |  | ||||||
| 		case 4: |  | ||||||
| 			dev->link[0].info = |  | ||||||
| 				get_ddb_info(0xdd01, 0x0210, 0xdd01, 0x0000); |  | ||||||
| 			break; |  | ||||||
| 		case 1: |  | ||||||
| 		case 8: |  | ||||||
| 			dev->link[0].info = |  | ||||||
| 				get_ddb_info(0xdd01, 0x0210, 0xdd01, 0x0003); |  | ||||||
| 			break; |  | ||||||
| 		case 2: |  | ||||||
| 		case 24: |  | ||||||
| 			dev->link[0].info = |  | ||||||
| 				get_ddb_info(0xdd01, 0x0210, 0xdd01, 0x0001); |  | ||||||
| 			break; |  | ||||||
| 		case 3: |  | ||||||
| 		case 16: |  | ||||||
| 			dev->link[0].info = |  | ||||||
| 				get_ddb_info(0xdd01, 0x0210, 0xdd01, 0x0002); |  | ||||||
| 			break; |  | ||||||
| 		default: |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	dev_info(dev->dev, "device name: %s\n", dev->link[0].info->name); |  | ||||||
| 	dev_info(dev->dev, "HW %08x REGMAP %08x FW %u.%u\n", | 	dev_info(dev->dev, "HW %08x REGMAP %08x FW %u.%u\n", | ||||||
| 		 dev->link[0].ids.hwid, dev->link[0].ids.regmapid, | 		 dev->link[0].ids.hwid, dev->link[0].ids.regmapid, | ||||||
| 		 (dev->link[0].ids.hwid & 0xff0000) >> 16, | 		 (dev->link[0].ids.hwid & 0xff0000) >> 16, | ||||||
| @@ -452,7 +435,6 @@ static const struct pci_device_id ddb_id_table[] __devinitconst = { | |||||||
| }; | }; | ||||||
| MODULE_DEVICE_TABLE(pci, ddb_id_table); | MODULE_DEVICE_TABLE(pci, ddb_id_table); | ||||||
|  |  | ||||||
|  |  | ||||||
| static pci_ers_result_t ddb_pci_slot_reset(struct pci_dev *dev) | static pci_ers_result_t ddb_pci_slot_reset(struct pci_dev *dev) | ||||||
| { | { | ||||||
| 	pr_info("pci_slot_reset\n"); | 	pr_info("pci_slot_reset\n"); | ||||||
| @@ -492,7 +474,6 @@ static const struct pci_error_handlers ddb_error = { | |||||||
| 	.resume = ddb_pci_resume, | 	.resume = ddb_pci_resume, | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
| static struct pci_driver ddb_pci_driver = { | static struct pci_driver ddb_pci_driver = { | ||||||
| 	.name        = "ddbridge", | 	.name        = "ddbridge", | ||||||
| 	.id_table    = ddb_id_table, | 	.id_table    = ddb_id_table, | ||||||
|   | |||||||
| @@ -134,6 +134,8 @@ int ddb_mci_cmd_link(struct ddb_link *link, | |||||||
| 	struct mci_result res; | 	struct mci_result res; | ||||||
| 	int stat; | 	int stat; | ||||||
|  |  | ||||||
|  | 	if (!link->mci_ok) | ||||||
|  | 		return -EFAULT; | ||||||
| 	if (!result) | 	if (!result) | ||||||
| 		result = &res; | 		result = &res; | ||||||
| 	mutex_lock(&link->mci_lock); | 	mutex_lock(&link->mci_lock); | ||||||
| @@ -294,6 +296,8 @@ void ddb_mci_proc_info(struct mci *mci, struct dtv_frontend_properties *p) | |||||||
|  |  | ||||||
| 	p->frequency = | 	p->frequency = | ||||||
| 		mci->signal_info.dvbs2_signal_info.frequency; | 		mci->signal_info.dvbs2_signal_info.frequency; | ||||||
|  | 	p->symbol_rate = | ||||||
|  | 		mci->signal_info.dvbs2_signal_info.symbol_rate; | ||||||
| 	switch (p->delivery_system) { | 	switch (p->delivery_system) { | ||||||
| 	default: | 	default: | ||||||
| 	case SYS_DVBS: | 	case SYS_DVBS: | ||||||
| @@ -338,6 +342,8 @@ void ddb_mci_proc_info(struct mci *mci, struct dtv_frontend_properties *p) | |||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
| 	case SYS_DVBC_ANNEX_A: | 	case SYS_DVBC_ANNEX_A: | ||||||
|  | 		p->modulation = | ||||||
|  | 			mci->signal_info.dvbc_signal_info.constellation + 1; | ||||||
| 		break; | 		break; | ||||||
| 	case SYS_DVBT: | 	case SYS_DVBT: | ||||||
| 		break; | 		break; | ||||||
|   | |||||||
| @@ -101,6 +101,8 @@ | |||||||
|  |  | ||||||
| #define MCI_STATUS_OK                 (0x00) | #define MCI_STATUS_OK                 (0x00) | ||||||
| #define MCI_STATUS_UNSUPPORTED        (0x80) | #define MCI_STATUS_UNSUPPORTED        (0x80) | ||||||
|  | #define MCI_STATUS_BUSY               (0xFA) | ||||||
|  | #define MCI_STATUS_HARDWARE_ERROR     (0xFB) | ||||||
| #define MCI_STATUS_INVALID_PARAMETER  (0xFC) | #define MCI_STATUS_INVALID_PARAMETER  (0xFC) | ||||||
| #define MCI_STATUS_RETRY              (0xFD) | #define MCI_STATUS_RETRY              (0xFD) | ||||||
| #define MCI_STATUS_NOT_READY          (0xFE) | #define MCI_STATUS_NOT_READY          (0xFE) | ||||||
|   | |||||||
| @@ -195,6 +195,48 @@ static int mod_calc_obitrate(struct ddb_mod *mod) | |||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static int mod_set_stream(struct ddb_output *output) | ||||||
|  | { | ||||||
|  | 	struct ddb *dev = output->port->dev; | ||||||
|  | 	u32 stream = output->nr; | ||||||
|  | 	struct ddb_mod *mod = &dev->mod[output->nr]; | ||||||
|  | 	struct ddb_link *link = &dev->link[0]; | ||||||
|  | 	struct mci_result res; | ||||||
|  | 	u32 channel; | ||||||
|  | 	struct mci_command cmd = { | ||||||
|  | 		.mod_command = MOD_SETUP_STREAM, | ||||||
|  | 		.mod_channel = stream, | ||||||
|  | 		.mod_stream = stream, | ||||||
|  | 		.mod_setup_stream = { | ||||||
|  | 			.standard = MOD_STANDARD_DVBC_8, | ||||||
|  | 			.symbol_rate = mod->symbolrate, | ||||||
|  | 			.qam = { | ||||||
|  | 				.modulation = mod->modulation - 1, | ||||||
|  | 				.rolloff = 13, | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 	}; | ||||||
|  | 	if (dev->link[0].info->version != 2) | ||||||
|  | 		return 0; | ||||||
|  | 	if (dev->link[0].ids.revision != 1) | ||||||
|  | 		return 0; | ||||||
|  | 	if ((dev->link[0].ids.hwid & 0xffffff) < 9065) | ||||||
|  | 		return 0; | ||||||
|  | 	if (!mod->frequency && !mod->symbolrate && !mod->modulation) | ||||||
|  | 		return 0; | ||||||
|  |  | ||||||
|  | 	if (mod->frequency) | ||||||
|  | 		channel = (mod->frequency - 114000000) / 8000000; | ||||||
|  | 	if (!mod->symbolrate) | ||||||
|  | 		mod->symbolrate = 6900000; | ||||||
|  | 	if (!mod->modulation) | ||||||
|  | 		mod->modulation = 5; | ||||||
|  | 	cmd.mod_channel = channel; | ||||||
|  | 	cmd.mod_setup_stream.symbol_rate = mod->symbolrate; | ||||||
|  | 	cmd.mod_setup_stream.qam.modulation = mod->modulation - 1; | ||||||
|  | 	return ddb_mci_cmd_link(link, &cmd, &res); | ||||||
|  | } | ||||||
|  |  | ||||||
| static int mod_set_symbolrate(struct ddb_mod *mod, u32 srate) | static int mod_set_symbolrate(struct ddb_mod *mod, u32 srate) | ||||||
| { | { | ||||||
| 	struct ddb *dev = mod->port->dev; | 	struct ddb *dev = mod->port->dev; | ||||||
| @@ -210,6 +252,7 @@ static int mod_set_symbolrate(struct ddb_mod *mod, u32 srate) | |||||||
| 	} | 	} | ||||||
| 	mod->symbolrate = srate; | 	mod->symbolrate = srate; | ||||||
| 	mod_calc_obitrate(mod); | 	mod_calc_obitrate(mod); | ||||||
|  | 	mod_set_stream(mod->port->output); | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -227,6 +270,7 @@ static int mod_set_modulation(struct ddb_mod *mod, | |||||||
| 		ddbwritel(dev, qamtab[modulation], | 		ddbwritel(dev, qamtab[modulation], | ||||||
| 			  CHANNEL_SETTINGS(mod->port->nr)); | 			  CHANNEL_SETTINGS(mod->port->nr)); | ||||||
| 	mod_calc_obitrate(mod); | 	mod_calc_obitrate(mod); | ||||||
|  | 	mod_set_stream(mod->port->output); | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -241,6 +285,7 @@ static int mod_set_frequency(struct ddb_mod *mod, u32 frequency) | |||||||
| 	if ((freq < 114) || (freq > 874)) | 	if ((freq < 114) || (freq > 874)) | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
| 	mod->frequency = frequency; | 	mod->frequency = frequency; | ||||||
|  | 	mod_set_stream(mod->port->output); | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -330,13 +375,19 @@ int ddbridge_mod_output_start(struct ddb_output *output) | |||||||
| 		u32 LF = 9000000UL; | 		u32 LF = 9000000UL; | ||||||
| 		u32 d = gcd(KF, LF); | 		u32 d = gcd(KF, LF); | ||||||
| 		u32 checkLF; | 		u32 checkLF; | ||||||
| #if 0 |  | ||||||
| 		if (dev->link[0].ids.revision == 1) { | 		if ((dev->link[0].ids.revision == 1)) { | ||||||
|  | 			if ((dev->link[0].info->version == 2)) { | ||||||
|  | 				if ((dev->link[0].ids.hwid & 0xffffff) >= 9065) { | ||||||
| 					mod->Control |= CHANNEL_CONTROL_ENABLE_DVB; | 					mod->Control |= CHANNEL_CONTROL_ENABLE_DVB; | ||||||
| 				return -EINVAL; |  | ||||||
| 					break; | 					break; | ||||||
| 				} | 				} | ||||||
| #endif | 			} else { | ||||||
|  | 				mod->Control |= CHANNEL_CONTROL_ENABLE_DVB; | ||||||
|  | 				break; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		ddbwritel(dev, mod->modulation - 1, CHANNEL_SETTINGS(Channel)); | 		ddbwritel(dev, mod->modulation - 1, CHANNEL_SETTINGS(Channel)); | ||||||
| 		ddbwritel(dev, Output, CHANNEL_SETTINGS2(Channel)); | 		ddbwritel(dev, Output, CHANNEL_SETTINGS2(Channel)); | ||||||
|  |  | ||||||
| @@ -643,7 +694,7 @@ static int mod_set_attenuator(struct ddb *dev, u32 Value) | |||||||
| 			.mod_stream = 0, | 			.mod_stream = 0, | ||||||
| 			.mod_setup_output = { | 			.mod_setup_output = { | ||||||
| 				.connector = MOD_CONNECTOR_F, | 				.connector = MOD_CONNECTOR_F, | ||||||
| 				.num_channels = 24, | 				.num_channels = dev->link[0].info->port_num, | ||||||
| 				.unit = MOD_UNIT_DBUV, | 				.unit = MOD_UNIT_DBUV, | ||||||
| 				.channel_power = 9000 - Value * 100, | 				.channel_power = 9000 - Value * 100, | ||||||
| 			}, | 			}, | ||||||
| @@ -1787,7 +1838,8 @@ int ddbridge_mod_do_ioctl(struct file *file, unsigned int cmd, void *parg) | |||||||
| 		(struct dtv_properties __user *) parg; | 		(struct dtv_properties __user *) parg; | ||||||
| 	int i, ret = 0; | 	int i, ret = 0; | ||||||
|  |  | ||||||
| 	if (dev->link[0].info->version >= 16 && cmd != FE_SET_PROPERTY) | 	if (dev->link[0].info->version >= 16 && | ||||||
|  | 	    (cmd != FE_SET_PROPERTY && cmd != IOCTL_DDB_MCI_CMD)) | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
| 	mutex_lock(&dev->ioctl_mutex); | 	mutex_lock(&dev->ioctl_mutex); | ||||||
| 	switch (cmd) { | 	switch (cmd) { | ||||||
| @@ -2124,6 +2176,8 @@ int ddbridge_mod_init(struct ddb *dev) | |||||||
| 		case 1: | 		case 1: | ||||||
| 			return mod_init_1(dev, 722000000); | 			return mod_init_1(dev, 722000000); | ||||||
| 		case 2: /* FSM */ | 		case 2: /* FSM */ | ||||||
|  | 			if ((dev->link[0].ids.hwid & 0xffffff) >= 9065) | ||||||
|  | 				return mod_init_2_1(dev, 114000000); | ||||||
| 			return mod_init_2(dev, 114000000); | 			return mod_init_2(dev, 114000000); | ||||||
| 		case 16: /* PAL */ | 		case 16: /* PAL */ | ||||||
| 			return mod_init_3(dev, 503250000); | 			return mod_init_3(dev, 503250000); | ||||||
|   | |||||||
| @@ -260,8 +260,8 @@ | |||||||
| #define LNB_CMD_DISEQC 6 | #define LNB_CMD_DISEQC 6 | ||||||
| #define LNB_CMD_SCIF   7 | #define LNB_CMD_SCIF   7 | ||||||
|  |  | ||||||
| #define LNB_BUSY  BIT_ULL(4) | #define LNB_BUSY  (1ULL << 4) | ||||||
| #define LNB_TONE  BIT_ULL(15) | #define LNB_TONE  (1ULL << 15) | ||||||
|  |  | ||||||
| #define LNB_INTERRUPT_BASE      4 | #define LNB_INTERRUPT_BASE      4 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -479,6 +479,9 @@ static int dvb_dmxdev_ts_callback(const u8 *buffer1, size_t buffer1_len, | |||||||
| 				       u32 *buffer_flags) | 				       u32 *buffer_flags) | ||||||
| { | { | ||||||
| 	struct dmxdev_filter *dmxdevfilter = feed->priv; | 	struct dmxdev_filter *dmxdevfilter = feed->priv; | ||||||
|  | #ifdef CONFIG_DVB_MMAP | ||||||
|  | 	struct dvb_vb2_ctx *ctx; | ||||||
|  | #endif | ||||||
| 	struct dvb_ringbuffer *buffer; | 	struct dvb_ringbuffer *buffer; | ||||||
| 	int ret; | 	int ret; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1282,8 +1282,11 @@ static int dvb_net_set_mac (struct net_device *dev, void *p) | |||||||
| 	struct dvb_net_priv *priv = netdev_priv(dev); | 	struct dvb_net_priv *priv = netdev_priv(dev); | ||||||
| 	struct sockaddr *addr=p; | 	struct sockaddr *addr=p; | ||||||
|  |  | ||||||
|  | #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 17, 0)) | ||||||
| 	memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); | 	memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); | ||||||
|  | #else | ||||||
|  | 	eth_hw_addr_set(dev, addr->sa_data); | ||||||
|  | #endif | ||||||
| 	if (netif_running(dev)) | 	if (netif_running(dev)) | ||||||
| 		schedule_work(&priv->restart_net_feed_wq); | 		schedule_work(&priv->restart_net_feed_wq); | ||||||
|  |  | ||||||
| @@ -1381,8 +1384,11 @@ static int dvb_net_add_if(struct dvb_net *dvbnet, u16 pid, u8 feedtype) | |||||||
| 			 dvbnet->dvbdev->adapter->num, if_num); | 			 dvbnet->dvbdev->adapter->num, if_num); | ||||||
|  |  | ||||||
| 	net->addr_len = 6; | 	net->addr_len = 6; | ||||||
|  | #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 17, 0)) | ||||||
| 	memcpy(net->dev_addr, dvbnet->dvbdev->adapter->proposed_mac, 6); | 	memcpy(net->dev_addr, dvbnet->dvbdev->adapter->proposed_mac, 6); | ||||||
|  | #else | ||||||
|  | 	eth_hw_addr_set(net, dvbnet->dvbdev->adapter->proposed_mac); | ||||||
|  | #endif | ||||||
| 	dvbnet->device[if_num] = net; | 	dvbnet->device[if_num] = net; | ||||||
|  |  | ||||||
| 	priv = netdev_priv(net); | 	priv = netdev_priv(net); | ||||||
|   | |||||||
| @@ -391,7 +391,9 @@ ssize_t dvb_ringbuffer_pkt_next(struct dvb_ringbuffer *rbuf, size_t idx, size_t* | |||||||
| 		idx = (idx + curpktlen + DVB_RINGBUFFER_PKTHDRSIZE) % rbuf->size; | 		idx = (idx + curpktlen + DVB_RINGBUFFER_PKTHDRSIZE) % rbuf->size; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	consumed = (idx - rbuf->pread) % rbuf->size; | 	consumed = idx - rbuf->pread; | ||||||
|  | 	if (consumed < 0) | ||||||
|  | 		consumed += rbuf->size; | ||||||
|  |  | ||||||
| 	while((dvb_ringbuffer_avail(rbuf) - consumed) > DVB_RINGBUFFER_PKTHDRSIZE) { | 	while((dvb_ringbuffer_avail(rbuf) - consumed) > DVB_RINGBUFFER_PKTHDRSIZE) { | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,3 +1,11 @@ | |||||||
|  | #include <linux/version.h> | ||||||
|  |  | ||||||
|  | #if (KERNEL_VERSION(3, 8, 0) <= LINUX_VERSION_CODE) | ||||||
|  | #define __devexit | ||||||
|  | #define __devinit | ||||||
|  | #define __devinitconst | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #ifndef __has_attribute | #ifndef __has_attribute | ||||||
| #define __has_attribute(x) 0 | #define __has_attribute(x) 0 | ||||||
| #endif | #endif | ||||||
|   | |||||||
| @@ -182,6 +182,15 @@ static int diseqc(int fd, int sat, int hor, int band) | |||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static int set_vol_tone(int fd, int hor, int band) | ||||||
|  | { | ||||||
|  | 	if (ioctl(fd, FE_SET_TONE, band ? SEC_TONE_ON : SEC_TONE_OFF)) | ||||||
|  | 		perror("FE_SET_TONE failed"); | ||||||
|  | 	if (ioctl(fd, FE_SET_VOLTAGE, hor ? SEC_VOLTAGE_18 : SEC_VOLTAGE_13) == -1) | ||||||
|  | 		perror("FE_SET_VOLTAGE failed"); | ||||||
|  | 	dbgprintf(DEBUG_DVB, "set_vol_tone hor=%u, band=%u\n", hor, band); | ||||||
|  | } | ||||||
|  |  | ||||||
| static int set_en50494(struct dddvb_fe *fe, uint32_t freq_khz, uint32_t sr,  | static int set_en50494(struct dddvb_fe *fe, uint32_t freq_khz, uint32_t sr,  | ||||||
| 		       int sat, int hor, int band,  | 		       int sat, int hor, int band,  | ||||||
| 		       uint32_t slot, uint32_t ubfreq, | 		       uint32_t slot, uint32_t ubfreq, | ||||||
| @@ -337,9 +346,11 @@ static int tune_sat(struct dddvb_fe *fe) | |||||||
| 			dbgprintf(DEBUG_DVB, "input = %u\n", input); | 			dbgprintf(DEBUG_DVB, "input = %u\n", input); | ||||||
| 			set_property(fe->fd, DTV_INPUT, input); | 			set_property(fe->fd, DTV_INPUT, input); | ||||||
| 		} | 		} | ||||||
|  | 		if (fe->scif_type == 3) | ||||||
|  | 			set_vol_tone(fe->fd, fe->param.param[PARAM_POL], hi); | ||||||
|  | 		else | ||||||
| 			diseqc(fe->fd, lnb, fe->param.param[PARAM_POL], hi); | 			diseqc(fe->fd, lnb, fe->param.param[PARAM_POL], hi); | ||||||
| 		set_fe_input(fe, freq, fe->param.param[PARAM_SR], ds, input); | 		set_fe_input(fe, freq, fe->param.param[PARAM_SR], ds, input); | ||||||
| 		//set_fe_input(fe, freq, fe->param.param[PARAM_SR], ds, DDDVB_UNDEF); |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -329,7 +329,7 @@ static void calc_lq(struct dddvb_fe *fe) | |||||||
| { | { | ||||||
| 	struct dtv_fe_stats st; | 	struct dtv_fe_stats st; | ||||||
| 	int64_t str, snr; | 	int64_t str, snr; | ||||||
| 	uint32_t mod, fec, ber_num, ber_den, trans, pilot = 0, quality = 0, freq; | 	uint32_t mod, fec, ber_num, ber_den, trans, pilot = 0, quality = 0, freq, rate; | ||||||
| 	 | 	 | ||||||
| 	get_property(fe->fd, DTV_TRANSMISSION_MODE, &fe->pls_code); | 	get_property(fe->fd, DTV_TRANSMISSION_MODE, &fe->pls_code); | ||||||
| 	dbgprintf(DEBUG_DVB, "fe%d: pls=0x%02x\n", fe->nr, fe->pls_code); | 	dbgprintf(DEBUG_DVB, "fe%d: pls=0x%02x\n", fe->nr, fe->pls_code); | ||||||
| @@ -362,15 +362,15 @@ static void calc_lq(struct dddvb_fe *fe) | |||||||
| 	dbgprintf(DEBUG_DVB, "fe%d: snr=%lld ber=%llu/%llu\n", | 	dbgprintf(DEBUG_DVB, "fe%d: snr=%lld ber=%llu/%llu\n", | ||||||
| 		  fe->nr, snr, ber_num, ber_den); | 		  fe->nr, snr, ber_num, ber_den); | ||||||
| 	dbgprintf(DEBUG_DVB, "fe%d: fec=%u mod=%u\n", fe->nr, fec, mod); | 	dbgprintf(DEBUG_DVB, "fe%d: fec=%u mod=%u\n", fe->nr, fec, mod); | ||||||
| 	switch (fe->n_param.param[PARAM_MSYS]) { |  | ||||||
| 	case SYS_DVBS: |  | ||||||
| 	get_property(fe->fd, DTV_FREQUENCY, &freq); | 	get_property(fe->fd, DTV_FREQUENCY, &freq); | ||||||
| 	dbgprintf(DEBUG_DVB, "fe%d: actual frequency=%u\n", fe->nr, freq); | 	dbgprintf(DEBUG_DVB, "fe%d: actual frequency=%u\n", fe->nr, freq); | ||||||
|  | 	get_property(fe->fd, DTV_SYMBOL_RATE, &rate); | ||||||
|  | 	dbgprintf(DEBUG_DVB, "fe%d: actual symbol rate=%u\n", fe->nr, rate); | ||||||
|  | 	switch (fe->n_param.param[PARAM_MSYS]) { | ||||||
|  | 	case SYS_DVBS: | ||||||
| 		quality = dvbsq(snr, fec, ber_num, ber_den); | 		quality = dvbsq(snr, fec, ber_num, ber_den); | ||||||
| 		break; | 		break; | ||||||
| 	case SYS_DVBS2: | 	case SYS_DVBS2: | ||||||
| 		get_property(fe->fd, DTV_FREQUENCY, &freq); |  | ||||||
| 		dbgprintf(DEBUG_DVB, "fe%d: actual frequency=%u\n", fe->nr, freq); |  | ||||||
| 		quality = dvbs2q(snr, fec, mod, ber_num, ber_den); | 		quality = dvbs2q(snr, fec, mod, ber_num, ber_den); | ||||||
| 		break; | 		break; | ||||||
| 	case SYS_DVBC_ANNEX_A: | 	case SYS_DVBC_ANNEX_A: | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user