[linux-dvb] [PATCH] scan-s2: tone setting when moving rotor

Hans Werner HWerner4 at gmx.de
Sun Jan 25 17:41:56 CET 2009


Hi Alex,

here's a patch for scan-s2.

I found with one card (VP-1041) that I needed to be careful to 
turn off the tone before making the DiSEqC 1.2 rotor command.
Kaffeine does this too so guess it is generally necessary. Also
we can rotate faster by selecting the higher LNB voltage (18v).

Regards,
Hans

Signed-off-by: Hans Werner <hwerner4 at gmx.de>


diff -r 06fb47f19e1c diseqc.c
--- a/diseqc.c
+++ b/diseqc.c
@@ -77,7 +77,15 @@ int rotor_command( int frontend_fd, int 
 	return err;
 }
 
-int rotate_rotor (int frontend_fd, int from_rotor_pos, int to_rotor_pos, int voltage_18){
+static inline void msleep(uint32_t msec)
+{
+	struct timespec req = { msec / 1000, 1000000 * (msec % 1000) };
+
+	while (nanosleep(&req, &req))
+		;
+}
+
+int rotate_rotor (int frontend_fd, int from_rotor_pos, int to_rotor_pos, int voltage_18, int hiband){
 	/* Rotate a DiSEqC 1.2 rotor from position from_rotor_pos to position to_rotor_pos */
 	/* Uses Goto nn (command 9) */
 	float rotor_wait_time; //seconds
@@ -97,8 +105,17 @@ int rotate_rotor (int frontend_fd, int f
 				a2 = rotor_angle(from_rotor_pos);
 				degreesmoved = abs(a1-a2);
 				if (degreesmoved>180) degreesmoved=360-degreesmoved;
-				rotor_wait_time = degreesmoved / (voltage_18 ? speed_18V : speed_13V);
+				rotor_wait_time = degreesmoved / speed_18V;
 			}
+
+			//switch tone off
+			if (err = ioctl(frontend_fd, FE_SET_TONE, SEC_TONE_OFF))
+				return err;
+			msleep(15);
+			// high voltage for high speed rotation
+			if (err = ioctl(frontend_fd, FE_SET_VOLTAGE, SEC_VOLTAGE_18))
+				return err;
+			msleep(15);
 			err = rotor_command(frontend_fd, 9, to_rotor_pos, 0, 0);
 			if (err) {
 				info("Rotor move error!\n");
@@ -111,20 +128,22 @@ int rotate_rotor (int frontend_fd, int f
 				}
 				info("completed.\n");
 			}
+
 		} else {
 			info("Rotor already at position %i\n", from_rotor_pos);
 		}
+
+		// correct tone and voltage
+		if (err = ioctl(frontend_fd, FE_SET_TONE, hiband ? SEC_TONE_ON : SEC_TONE_OFF))
+                        return err;
+		msleep(15);
+		if (err = ioctl(frontend_fd, FE_SET_VOLTAGE, voltage_18))
+			return err;
+		msleep(15);
 	}
 	return err;
 }
 
-static inline void msleep(uint32_t msec)
-{
-	struct timespec req = { msec / 1000, 1000000 * (msec % 1000) };
-
-	while (nanosleep(&req, &req))
-		;
-}
 
 int diseqc_send_msg (int fd, fe_sec_voltage_t v, struct diseqc_cmd **cmd,
 					 fe_sec_tone_mode_t t, fe_sec_mini_cmd_t b)
diff -r 06fb47f19e1c diseqc.h
--- a/diseqc.h
+++ b/diseqc.h
@@ -17,7 +17,7 @@ extern int diseqc_send_msg (int fd, fe_s
 *   set up the switch to position/voltage/tone
 */
 extern int setup_switch (int frontend_fd, int switch_pos, int voltage_18, int freq, int uncommitted_switch_pos);
-extern int rotate_rotor (int frontend_fd, int from_rotor_pos, int to_rotor_pos, int voltage_18);
+extern int rotate_rotor (int frontend_fd, int from_rotor_pos, int to_rotor_pos, int voltage_18, int hiband);
 
 #endif
 
diff -r 06fb47f19e1c scan.c
--- a/scan.c
+++ b/scan.c
@@ -1076,7 +1076,7 @@ static void parse_nit (struct section_bu
 				// New DVB-S transponder
 				t = alloc_transponder(tn.frequency);
 
-				// For sattelites add both DVB-S and DVB-S2 transopnders since we don't know what should be used
+				// For satellites add both DVB-S and DVB-S2 transponders since we don't know what should be used
 				if(current_tp->delivery_system == SYS_DVBS || current_tp->delivery_system == SYS_DVBS2) {
 					tn.delivery_system = SYS_DVBS;
 					copy_transponder(t, &tn);
@@ -1705,6 +1705,7 @@ static int __tune_to_transponder (int fr
 	uint32_t if_freq = 0;
 	uint32_t bandwidth_hz = 0;
 	current_tp = t;
+	int hiband = 0;
 
 	struct dtv_property p_clear[] = {
 		{ .cmd = DTV_CLEAR },
@@ -1735,7 +1736,7 @@ static int __tune_to_transponder (int fr
 		if (lnb_type.high_val) {
 			if (lnb_type.switch_val) {
 				/* Voltage-controlled switch */
-				int hiband = 0;
+				hiband = 0;
 
 				if (t->frequency >= lnb_type.switch_val)
 					hiband = 1;
@@ -1770,9 +1771,10 @@ static int __tune_to_transponder (int fr
 			if (t->orbital_pos!=0) rotor_pos = rotor_nn(t->orbital_pos, t->we_flag);
 			int err;
 			err = rotate_rotor(	frontend_fd,
-				curr_rotor_pos, 
-				rotor_pos,
-				t->polarisation == POLARISATION_VERTICAL ? 0 : 1);
+						curr_rotor_pos, 
+						rotor_pos,
+						t->polarisation == POLARISATION_VERTICAL ? 0 : 1,
+						hiband);
 			if (err)
 				error("Error in rotate_rotor err=%i\n",err); 
 			else
@@ -1798,14 +1800,14 @@ static int __tune_to_transponder (int fr
 		}
 		break;
 
-	case SYS_DVBC_ANNEX_B:
-	case SYS_DVBC_ANNEX_AC:
-		if_freq = t->frequency;
-
-		if (verbosity >= 2){
-			dprintf(1,"DVB-C frequency is %d\n", if_freq);
-		}
-		break;
+	case SYS_DVBC_ANNEX_B:
+	case SYS_DVBC_ANNEX_AC:
+		if_freq = t->frequency;
+
+		if (verbosity >= 2){
+			dprintf(1,"DVB-C frequency is %d\n", if_freq);
+		}
+		break;
 	}
 
 	struct dvb_frontend_event ev;
@@ -1825,7 +1827,7 @@ static int __tune_to_transponder (int fr
 		.num = 10,
 		.props = p_tune
 	};
-
+	
 	/* discard stale QPSK events */
 	while (1) {
 		if (ioctl(frontend_fd, FE_GET_EVENT, &ev) == -1)
@@ -2723,8 +2725,8 @@ static const char *usage = "\n"
 "	-5	multiply all filter timeouts by factor 5\n"
 "		for non-DVB-compliant section repitition rates\n"
 "	-O pos	Orbital position override 'S4W', 'S19.2E' - good for VDR output\n"
-"	-k cnt	Skip count, will skip every first specified\n"
-"		messages for every message type (default 0)\n"
+"	-k cnt	Skip count: skip the first cnt \n"
+"		messages of each message type (default 0)\n"
 "	-I cnt	Scan iterations count (default 10).\n"
 "		Larger number will make scan longer on every channel\n"
 "	-o fmt	output format: 'vdr' (default) or 'zap'\n"

-- 
Release early, release often.

NUR NOCH BIS 31.01.! GMX FreeDSL - Telefonanschluss + DSL 
für nur 16,37 EURO/mtl.!* http://dsl.gmx.de/?ac=OM.AD.PD003K11308T4569a



More information about the linux-dvb mailing list