Karta nie wyszukuje kanałów? Z tą kartą nie działa DVB-S2 na Linux. Na Raspbian działa jedynie DVB-S z powodu odrzucenia poprawka jądra przez twórców Linuksa. Oznacza to, że nie odbierzemy transmisji, czyli nie odbierzemy MUX, opartego na DVB-S2 (czyli większości na współczesnych satelitach np. HotBird 13E), bo karta telewizji satelitarnej ich nie wykryje. Identyfikatory urządzenia to 14f7:0001, wg. strony Linux TV (link w dziale specyfikacja) sterownik dla urządzenia o rewizji 2 dla VID 14f7 i PID 0002 jest identyczny. Zostanie przedstawiona instrukcja wykonania modyfikacji jądra systemu Raspbian 32 bit dla Raspberry Pi 4B na systemie Ubuntu 20.04 LTS.

Galeria

Pobranie jądra Linux i narzędzi (kompilacja w Ubuntu)

sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev
git clone --branch rpi-5.10.y https://github.com/raspberrypi/linux
cd ./linux
KERNEL=kernel7l # RPi 4B 32 bit
make bcm2711_defconfig # RPi 4B 32 bit
sudo apt install crossbuild-essential-armhf

Poprawka jądra dla sterownika DVB-S SkyStar USB HD CI

Zastosowałem znany patch sterownika zgłoszony do jądra Linux (link w dziale specyfikacja), trochę zmodyfikowany do najnowszego jądra Raspbian. Źródło diff -u patch dla jądra w wersji 5.10.52:

--- /home/cooltronic/linux/drivers/media/dvb-frontends/stb0899_drv.c	2021-07-26 06:50:00.988552591 -0700
+++ /home/cooltronic/linux/drivers/media/dvb-frontends/stb0899_drv_PATCHED_RASPBIAN_5.1.c	2021-07-30 14:33:40.375139265 -0700
@@ -294,19 +294,19 @@
 		.len	= 6
 	};
 
-	struct i2c_msg msg_1 = {
-		.addr	= state->config->demod_address,
-		.flags	= 0,
-		.buf	= buf_1,
-		.len	= 2
-	};
-
-	struct i2c_msg msg_r = {
-		.addr	= state->config->demod_address,
-		.flags	= I2C_M_RD,
-		.buf	= buf,
-		.len	= 4
-	};
+       struct i2c_msg msg[] = {
+               {
+                       .addr   = state->config->demod_address,
+                       .flags  = 0,
+                       .buf    = buf_1,
+                       .len    = 2
+               }, {
+                       .addr   = state->config->demod_address,
+                       .flags  = I2C_M_RD,
+                       .buf    = buf,
+                       .len    = 4
+               }
+       };
 
 	tmpaddr = stb0899_reg_offset & 0xff00;
 	if (!(stb0899_reg_offset & 0x8))
@@ -325,28 +325,17 @@
 	}
 
 	/* Dummy	*/
-	status = i2c_transfer(state->i2c, &msg_1, 1);
-	if (status < 1)
-		goto err;
-
-	status = i2c_transfer(state->i2c, &msg_r, 1);
-	if (status < 1)
+       status = i2c_transfer(state->i2c, msg, 2);
+       if (status < 2)
 		goto err;
 
 	buf_1[0] = GETBYTE(stb0899_reg_offset, BYTE1);
 	buf_1[1] = GETBYTE(stb0899_reg_offset, BYTE0);
 
 	/* Actual	*/
-	status = i2c_transfer(state->i2c, &msg_1, 1);
-	if (status < 1) {
-		if (status != -ERESTARTSYS)
-			printk(KERN_ERR "%s ERR(2), Device=[0x%04x], Base address=[0x%08x], Offset=[0x%04x], Status=%d\n",
-			       __func__, stb0899_i2cdev, stb0899_base_addr, stb0899_reg_offset, status);
-		goto err;
-	}
+       status = i2c_transfer(state->i2c, msg, 2);
+       if (status < 2) {
 
-	status = i2c_transfer(state->i2c, &msg_r, 1);
-	if (status < 1) {
 		if (status != -ERESTARTSYS)
 			printk(KERN_ERR "%s ERR(3), Device=[0x%04x], Base address=[0x%08x], Offset=[0x%04x], Status=%d\n",
 			       __func__, stb0899_i2cdev, stb0899_base_addr, stb0899_reg_offset, status);
@@ -473,8 +462,15 @@
 	    (((reg & 0xff00) == 0xf200) || ((reg & 0xff00) == 0xf600)))
 		_stb0899_read_reg(state, (reg | 0x00ff));
 
-	dprintk(state->verbose, FE_DEBUGREG, 1,
-		"%s [0x%04x]: %*ph", __func__, reg, count, buf);
+	if (unlikely(*state->verbose >= FE_DEBUGREG)) {
+               int i;
+
+               printk(KERN_DEBUG "%s [0x%04x]:", __func__, reg);
+               for (i = 0; i < count; i++) {
+                       printk(" %02x", buf[i]);
+               }
+               printk("\n");
+       }
 
 	return 0;
 err:
@@ -503,8 +499,15 @@
 	buf[1] = reg & 0xff;
 	memcpy(&buf[2], data, count);
 
-	dprintk(state->verbose, FE_DEBUGREG, 1,
-		"%s [0x%04x]: %*ph", __func__, reg, count, data);
+       if (unlikely(*state->verbose >= FE_DEBUGREG)) {
+               int i;
+
+               printk(KERN_DEBUG "%s [0x%04x]:", __func__, reg);
+               for (i = 0; i < count; i++)
+                       printk(" %02x", data[i]);
+               printk("\n");
+       }
+
 	ret = i2c_transfer(state->i2c, &i2c_msg, 1);
 
 	/*
@@ -590,19 +593,13 @@
 	return 0;
 }
 
-static void stb0899_detach(struct dvb_frontend *fe)
-{
-	struct stb0899_state *state = fe->demodulator_priv;
-
-	/* post process event */
-	stb0899_postproc(state, STB0899_POSTPROC_GPIO_POWER, 0);
-}
-
 static void stb0899_release(struct dvb_frontend *fe)
 {
 	struct stb0899_state *state = fe->demodulator_priv;
 
 	dprintk(state->verbose, FE_DEBUG, 1, "Release Frontend");
+	/* post process event */
+       stb0899_postproc(state, STB0899_POSTPROC_GPIO_POWER, 0);
 	kfree(state);
 }
 
@@ -1568,7 +1565,7 @@
 	return DVBFE_ALGO_CUSTOM;
 }
 
-static const struct dvb_frontend_ops stb0899_ops = {
+static struct dvb_frontend_ops stb0899_ops = {
 	.delsys = { SYS_DVBS, SYS_DVBS2, SYS_DSS },
 	.info = {
 		.name			= "STB0899 Multistandard",
@@ -1583,7 +1580,7 @@
 					  FE_CAN_QPSK
 	},
 
-	.detach				= stb0899_detach,
+
 	.release			= stb0899_release,
 	.init				= stb0899_init,
 	.sleep				= stb0899_sleep,

Poniżej zamieszczam link do patch do aktualnego kernel Debian / Raspbian działającego z kernelem 5.10. Poniższą komendę należy uruchomić w katalogu /drivers/media/dvb-frontends po skopiowaniu tam pliku.

Pobierz patch

 

Komenda:

patch -p1 -i stb0899_drv.patch

Kompilacja i instalacja

Proces patchowania przebiegł bez większych problemów. Następnie, wyjmujemy kartę micro SD z Raspberry Pi, podłączając ją do Ubuntu. Instalujemy nowy kernel następującymi instrukcjami:

KERNEL=kernel7l
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2711_defconfig # RPi 32 bit 4B
make -j12 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs
mkdir mnt #musi być zamontowana karta micro sd raspberry
mkdir mnt/fat32
mkdir mnt/ext4
sudo mount /dev/sdb1 mnt/fat32 #partycja boot Raspbian
sudo mount /dev/sdb2 mnt/ext4 #partycja systemowa Raspbian - domyślne ścieżki
sudo env PATH=$PATH make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/ext4 modules_install
sudo cp mnt/fat32/$KERNEL.img mnt/fat32/$KERNEL-backup.img
sudo cp arch/arm/boot/zImage mnt/fat32/$KERNEL.img
sudo cp arch/arm/boot/dts/*.dtb mnt/fat32/
sudo cp arch/arm/boot/dts/overlays/*.dtb* mnt/fat32/overlays/
sudo cp arch/arm/boot/dts/overlays/README mnt/fat32/overlays/
sudo umount mnt/fat32
sudo umount mnt/ext4

Musimy jeszcze skopiować plik dvb-usb-az6027-03.fw do folderu /lib/firmware partycji systemowej (ext4) systemu Raspbian

Teraz, po ponownym uruchomieniu, cieszymy się teraz w pełni funkcjonalnym DVB-S2 na Technisat SkyStar USB 2 CI w Linux Raspbian na Raspbberry Pi.

Specyfikacja urządzenia

Kod ProducentaSkyStar USB 2 HD CI
NazwaTechniSat SkyStar USB 2 HD CI
Typ tuneraZewnętrzny
InterfejsUSB 2.0
ProcesorSTMicroelectronics STB0899 multistandard demodulator (DVB-S i DVB-S2).
RozdzielczośćZależna od nadawanego programu. Obsługuje HDTV i 4K.
Tuner radiowy i TV cyfrowy satelitarny DVB-S, DVB-S2Tak. DVB-S2 na Linux wymaga modyfikacji kernel.
System wizjiFormat MPEG 2. HDTV MPEG-4-/H.264
System foniiStereo, AC, Dolby
TelegazetaProgramowa
Format zapisuMPEG2
Gniazda karty: wejściaAntena LNB, Port na moduł dostępu warunkowego CI, port zasilania 12V
Zdalne sterowaniePilot
SterownikiWindows 2000, XP, 2003 Serwer, Vista, 7, Windows 10 działa przy podłączeniu do portu USB2 starszych kontrolerów, Linux przez skopiowanie pliku dvb-usb-az6027-03.fw, a dla DVB-S2 modyfikacja jądra do odbioru (plik stb0899_drv.c)
Wspierane oprogramowanieDVB Viewer TE (Technisat Edition), tvheadend, vdr
Inne funkcjeTimeshift, nagrywanie
WyposażeniePilot
VID Vendor ID14f7
PID Product ID0001 lub 0002
wwwLink na stronę opisu technicznego, link do strony specyfikacji Linux, link modyfikacji jądra