Sterownik | SkyStar 2 USB HD CI | Patch kernel (poprawka jądra)
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.
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 Producenta | SkyStar USB 2 HD CI |
Nazwa | TechniSat SkyStar USB 2 HD CI |
Typ tunera | Zewnętrzny |
Interfejs | USB 2.0 |
Procesor | STMicroelectronics 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-S2 | Tak. DVB-S2 na Linux wymaga modyfikacji kernel. |
System wizji | Format MPEG 2. HDTV MPEG-4-/H.264 |
System fonii | Stereo, AC, Dolby |
Telegazeta | Programowa |
Format zapisu | MPEG2 |
Gniazda karty: wejścia | Antena LNB, Port na moduł dostępu warunkowego CI, port zasilania 12V |
Zdalne sterowanie | Pilot |
Sterowniki | Windows 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 oprogramowanie | DVB Viewer TE (Technisat Edition), tvheadend, vdr |
Inne funkcje | Timeshift, nagrywanie |
Wyposażenie | Pilot |
VID Vendor ID | 14f7 |
PID Product ID | 0001 lub 0002 |
www | Link na stronę opisu technicznego, link do strony specyfikacji Linux, link modyfikacji jądra |
Change language – Zmień język
Kategorie bloga
- Automatyka (3)
- Ciekawostki (6)
- Grafika (2)
- Komputery (9)
- Oprogramowanie (8)