Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Digibest ISDB2056N に対応 (Close #8) #9

Merged
merged 7 commits into from
Jul 2, 2024
17 changes: 12 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ PLEX 社の [Webサイト](http://plex-net.co.jp) にて配布されている公

動作確認は Ubuntu 20.04 LTS (x64) で行っています。

- チップ構成が一部変更された、ロット番号 2309 (2023年9月) 以降の DTV02A-1T1S-U に対応
- [otya 氏のフォーク](/~https://github.com/otya128/px4_drv) での更新を取り込み安定性と互換性を改善
- [techmadot 氏のフォーク](/~https://github.com/techmadot/px4_drv) の内容を取り込み PX-M1UR / PX-S1UR に対応 (実験的)
- [kznrluk 氏のフォーク](/~https://github.com/kznrluk/px4_drv) の内容を取り込み Linux カーネル 6.4 系以降の API 変更に対応
Expand Down Expand Up @@ -62,6 +63,8 @@ PLEX 社の [Webサイト](http://plex-net.co.jp) にて配布されている公

- DTV02-1T1S-U (実験的・Windows 非対応)
- DTV02A-1T1S-U (Windows 非対応)
- チップ構成が一部変更された、ロット番号 2309 (2023年9月) 以降の DTV02A-1T1S-U にも対応しています。
手元の実機では問題なく動作していますが、長期間の動作テストは行えていないため、未知の不具合があるかもしれません。
- DTV02A-4TS-P

## インストール (Windows)
Expand Down Expand Up @@ -175,7 +178,7 @@ gcc, make, カーネルソース/ヘッダ, dkms がインストールされて

それでもカーネルモジュールが正常にロードされない場合は、インストールから再度やり直してください。

> [!IMPORTANT]
> [!IMPORTANT]
> **px4_drv や Linux カーネルの更新後、px4_drv は自動再ロードされない場合があります。**
> **px4_drv や Linux カーネルを更新した際は、可能な限りすぐに PC を再起動することを強く推奨します。**
> すぐに再起動ができない状況では、必ず `sudo modprobe px4_drv` を実行してください。
Expand Down Expand Up @@ -239,6 +242,10 @@ gcc, make, カーネルソース/ヘッダ, dkms がインストールされて

すべてのチューナーにおいて、ISDB-T と ISDB-S のどちらも受信可能です。

> [!NOTE]
> ロット番号 2309 以降の DTV02A-1T1S-U を接続した場合も、デバイスファイル名は `/dev/isdb2056video*` となります。
> `/dev/isdb2056nvideo*` ではないので注意してください。

##### e-Better DTV02A-4TS-P を接続した場合

$ ls /dev/isdb6014video*
Expand Down Expand Up @@ -299,7 +306,7 @@ BonDriver は専用のものが必要になるため、公式 (Jacky版) BonDriv
recpt1 や [BonDriverProxy_Linux](/~https://github.com/u-n-k-n-o-w-n/BonDriverProxy_Linux) 等の PT シリーズ用 chardev ドライバに対応したソフトウェアを使用することで、TS データを受信することが可能です。
recpt1 は、PLEX 社より配布されているものを使用する必要はありません。

BonDriverProxy_Linux と、PLEX PX-MLT5PEやe-Better DTV02A-1T1S-U などのデバイスファイル1つで ISDB-T と ISDB-S のどちらも受信可能なチューナーを組み合わせて使用する場合は、BonDriver として BonDriverProxy_Linux に同梱されている BonDriver_LinuxPT の代わりに、[BonDriver_LinuxPTX](/~https://github.com/nns779/BonDriver_LinuxPTX) を使用してください。
BonDriverProxy_Linux と、PLEX PX-MLT5PE や e-Better DTV02A-1T1S-U などのデバイスファイル1つで ISDB-T と ISDB-S のどちらも受信可能なチューナーを組み合わせて使用する場合は、BonDriver として BonDriverProxy_Linux に同梱されている BonDriver_LinuxPT の代わりに、[BonDriver_LinuxPTX](/~https://github.com/nns779/BonDriver_LinuxPTX) を使用してください。

## LNB電源の出力

Expand Down Expand Up @@ -395,17 +402,17 @@ PX-MLT8PE は、同一基板上に PX-MLT5PE 相当のデバイスと、3チャ

DTV02-1T1S-U/DTV02A-1T1S-U は、ISDB-T 側の TS シリアル出力を ISDB-S 側と共有しています。そのため、同時に受信できるチャンネル数は1チャンネルのみです。

- DTV02-1T1S-U/DTV02A-1T1S-U (Digibest ISDB2056)
- DTV02-1T1S-U/DTV02A-1T1S-U (ロット番号 2309 以前: Digibest ISDB2056)

- USB Bridge: ITE IT9303FN
- ISDB-T/S Demodulator: Toshiba TC90532XBG
- Terrestrial Tuner: RafaelMicro R850
- Satellite Tuner: RafaelMicro RT710

DTV02A-1T1S-U の 2023年9月以降のロットでは、ISDB-T/S Demodulator IC が TC90532XBG (ISDB-T×1TS + ISDB-S×1TS) から TC90522XBG (ISDB-T×2TS + ISDB-S×2TS) に変更されています。([詳細](https://web.archive.org/web/20130513083035/http://www.semicon.toshiba.co.jp/product/new_products/assp/1275558_37644.html))
ロット番号 2309 (2023年9月) 以降の DTV02A-1T1S-U では、ISDB-T/S Demodulator IC が TC90532XBG (ISDB-T×1TS + ISDB-S×1TS) から TC90522XBG (ISDB-T×2TS + ISDB-S×2TS) に変更されています。([詳細](https://web.archive.org/web/20130513083035/http://www.semicon.toshiba.co.jp/product/new_products/assp/1275558_37644.html))
この変更に伴い、内部名称が ISDB2056 から ISDB2056N に変更されています。

- DTV02A-1T1S-U (2023年9月以降ロット: Digibest ISDB2056N)
- DTV02A-1T1S-U (ロット番号 2309 以降: Digibest ISDB2056N)

- USB Bridge: ITE IT9303FN
- ISDB-T/S Demodulator: Toshiba TC90522XBG (TC90532XBG -> TC90522XBG)
Expand Down
51 changes: 47 additions & 4 deletions driver/isdb2056_device.c
Original file line number Diff line number Diff line change
Expand Up @@ -514,11 +514,33 @@ static int isdb2056_chrdev_tune(struct ptx_chrdev *chrdev,
break;
}

ret = tc90522_write_reg(&chrdev2056->tc90522_s, 0x07, 0x77);
switch (isdb2056->isdb2056_model) {
case ISDB2056_MODEL:
ret = tc90522_write_reg(&chrdev2056->tc90522_s, 0x07, 0x77);
break;
case ISDB2056N_MODEL:
ret = tc90522_write_reg(&chrdev2056->tc90522_s0, 0x07, 0x77);
break;
default:
dev_err(isdb2056->dev, "isdb2056_chrdev_tune: undefined model (model: %d)\n", isdb2056->isdb2056_model);
ret = -EINVAL;
break;
}
if (ret)
break;

ret = tc90522_write_reg(&chrdev2056->tc90522_s, 0x08, 0x10);
switch (isdb2056->isdb2056_model) {
case ISDB2056_MODEL:
ret = tc90522_write_reg(&chrdev2056->tc90522_s, 0x08, 0x10);
break;
case ISDB2056N_MODEL:
ret = tc90522_write_reg(&chrdev2056->tc90522_s0, 0x08, 0x37);
break;
default:
dev_err(isdb2056->dev, "isdb2056_chrdev_tune: undefined model (model: %d)\n", isdb2056->isdb2056_model);
ret = -EINVAL;
break;
}
if (ret)
break;

Expand Down Expand Up @@ -885,10 +907,29 @@ static int isdb2056_device_load_config(struct isdb2056_device *isdb2056,
chrdev2056->tc90522_t.i2c_addr = 0x10;
chrdev2056->tc90522_t.is_secondary = false;

// This structure (tc90522_s0) is only required by ISDB2056N, but it is initialized in common just to be safe
chrdev2056->tc90522_s0.dev = dev;
chrdev2056->tc90522_s0.i2c = &it930x->i2c_master[2];
chrdev2056->tc90522_s0.i2c_addr = 0x11;
chrdev2056->tc90522_s0.is_secondary = false;

chrdev2056->tc90522_s.dev = dev;
chrdev2056->tc90522_s.i2c = &it930x->i2c_master[2];
chrdev2056->tc90522_s.i2c_addr = 0x11;
chrdev2056->tc90522_s.is_secondary = false;
switch (isdb2056->isdb2056_model) {
case ISDB2056_MODEL:
// ISDB2056 TS demodulator: Toshiba TC90532XBG
chrdev2056->tc90522_s.i2c_addr = 0x11;
chrdev2056->tc90522_s.is_secondary = false;
break;
case ISDB2056N_MODEL:
// ISDB2056N TS demodulator: Toshiba TC90522XBG
chrdev2056->tc90522_s.i2c_addr = 0x13;
chrdev2056->tc90522_s.is_secondary = true;
break;
default:
dev_err(dev, "isdb2056_device_load_config: undefined model (model: %d)\n", isdb2056->isdb2056_model);
return -EINVAL;
}

chrdev2056->r850.dev = dev;
chrdev2056->r850.i2c = &chrdev2056->tc90522_t.i2c_master;
Expand Down Expand Up @@ -920,6 +961,7 @@ static int isdb2056_device_load_config(struct isdb2056_device *isdb2056,
}

int isdb2056_device_init(struct isdb2056_device *isdb2056, struct device *dev,
enum isdb2056_model isdb2056_model,
struct ptx_chrdev_context *chrdev_ctx,
struct completion *quit_completion)
{
Expand All @@ -940,6 +982,7 @@ int isdb2056_device_init(struct isdb2056_device *isdb2056, struct device *dev,

kref_init(&isdb2056->kref);
isdb2056->dev = dev;
isdb2056->isdb2056_model = isdb2056_model;
isdb2056->quit_completion = quit_completion;

stream_ctx = kzalloc(sizeof(*stream_ctx), GFP_KERNEL);
Expand Down
8 changes: 8 additions & 0 deletions driver/isdb2056_device.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,16 @@

#define ISDB2056_CHRDEV_NUM 1

enum isdb2056_model {
ISDB2056_MODEL = 0,
ISDB2056N_MODEL,
};

struct isdb2056_chrdev {
struct ptx_chrdev *chrdev;
struct tc90522_demod tc90522_t;
struct tc90522_demod tc90522_s;
struct tc90522_demod tc90522_s0;
struct r850_tuner r850;
struct rt710_tuner rt710;
};
Expand All @@ -34,6 +40,7 @@ struct isdb2056_device {
struct kref kref;
atomic_t available;
struct device *dev;
enum isdb2056_model isdb2056_model;
struct completion *quit_completion;
struct ptx_chrdev_group *chrdev_group;
struct isdb2056_chrdev chrdev2056;
Expand All @@ -42,6 +49,7 @@ struct isdb2056_device {
};

int isdb2056_device_init(struct isdb2056_device *isdb2056, struct device *dev,
enum isdb2056_model isdb2056_model,
struct ptx_chrdev_context *chrdev_ctx,
struct completion *quit_completion);
void isdb2056_device_term(struct isdb2056_device *isdb2056);
Expand Down
20 changes: 20 additions & 0 deletions driver/ptx_chrdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

#include "print_format.h"
#include "ptx_chrdev.h"
#include "isdb2056_device.h"

#include <linux/kernel.h>
#include <linux/slab.h>
Expand Down Expand Up @@ -894,6 +895,25 @@ int ptx_chrdev_context_add_group(struct ptx_chrdev_context *chrdev_ctx,

for (i = 0; i < num; i++) {
dev_info(dev, "/dev/%s%u\n", chrdev_ctx->devname, base + i);
if (strncmp(chrdev_ctx->devname, "isdb2056", 8) == 0) {
// If the device is ISDB2056 or ISDB2056N, print the model name
struct ptx_chrdev *chrdev = &group->chrdev[i];
struct isdb2056_chrdev *chrdev2056 = chrdev->priv;
struct isdb2056_device *isdb2056 = container_of(chrdev2056, struct isdb2056_device, chrdev2056);
const char *model_name;
switch (isdb2056->isdb2056_model) {
case ISDB2056_MODEL:
model_name = "ISDB2056";
break;
case ISDB2056N_MODEL:
model_name = "ISDB2056N";
break;
default:
model_name = "Unknown";
break;
}
dev_info(dev, "/dev/%s%u: Digibest %s\n", chrdev_ctx->devname, base + i, model_name);
}
device_create(chrdev_ctx->class, dev,
MKDEV(MAJOR(chrdev_ctx->dev_base),
group->minor_base + i),
Expand Down
14 changes: 7 additions & 7 deletions driver/px4_usb.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,12 +54,12 @@
#ifndef PXM1UR_USB_MAX_DEVICE
#define PXM1UR_USB_MAX_DEVICE 64
#endif
#define PXM1UR_USB_MAX_CHRDEV (PXM1UR_USB_MAX_DEVICE * ISDB2056_CHRDEV_NUM)
#define PXM1UR_USB_MAX_CHRDEV (PXM1UR_USB_MAX_DEVICE * M1UR_CHRDEV_NUM)

#ifndef PXS1UR_USB_MAX_DEVICE
#define PXS1UR_USB_MAX_DEVICE 64
#endif
#define PXS1UR_USB_MAX_CHRDEV (PXS1UR_USB_MAX_DEVICE * ISDB2056_CHRDEV_NUM)
#define PXS1UR_USB_MAX_CHRDEV (PXS1UR_USB_MAX_DEVICE * S1UR_CHRDEV_NUM)


struct px4_usb_context {
Expand All @@ -69,8 +69,8 @@ struct px4_usb_context {
struct px4_device px4;
struct pxmlt_device pxmlt;
struct isdb2056_device isdb2056;
struct s1ur_device s1ur;
struct m1ur_device m1ur;
struct s1ur_device s1ur;
} ctx;
};

Expand Down Expand Up @@ -187,7 +187,7 @@ static int px4_usb_probe(struct usb_interface *intf,
break;

ctx->type = ISDB2056_USB_DEVICE;
ret = isdb2056_device_init(&ctx->ctx.isdb2056, dev,
ret = isdb2056_device_init(&ctx->ctx.isdb2056, dev, ISDB2056_MODEL,
px4_usb_chrdev_ctx[ISDB2056_USB_DEVICE],
&ctx->quit_completion);
break;
Expand All @@ -199,7 +199,7 @@ static int px4_usb_probe(struct usb_interface *intf,
break;

ctx->type = ISDB2056_USB_DEVICE;
ret = isdb2056_device_init(&ctx->ctx.isdb2056, dev,
ret = isdb2056_device_init(&ctx->ctx.isdb2056, dev, ISDB2056N_MODEL,
px4_usb_chrdev_ctx[ISDB2056_USB_DEVICE],
&ctx->quit_completion);
break;
Expand All @@ -218,7 +218,7 @@ static int px4_usb_probe(struct usb_interface *intf,

case USB_PID_PX_M1UR:
ret = px4_usb_init_bridge(dev, usb_dev,
&ctx->ctx.isdb2056.it930x);
&ctx->ctx.m1ur.it930x);
if (ret)
break;

Expand All @@ -230,7 +230,7 @@ static int px4_usb_probe(struct usb_interface *intf,

case USB_PID_PX_S1UR:
ret = px4_usb_init_bridge(dev, usb_dev,
&ctx->ctx.s1ur.it930x);
&ctx->ctx.s1ur.it930x);
if (ret)
break;

Expand Down
6 changes: 3 additions & 3 deletions etc/99-px4video.rules
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@ KERNEL=="px4video*", GROUP="video", MODE="0664"
KERNEL=="pxmlt5video*", GROUP="video", MODE="0664"
KERNEL=="pxmlt8video*", GROUP="video", MODE="0664"
KERNEL=="isdb2056video*", GROUP="video", MODE="0664"
KERNEL=="isdb6014video*", GROUP="video", MODE="0644"
KERNEL=="pxm1urvideo*", GROUP="video", MODE="0644"
KERNEL=="pxs1urvideo*", GROUP="video", MODE="0644"
KERNEL=="isdb6014video*", GROUP="video", MODE="0664"
KERNEL=="pxm1urvideo*", GROUP="video", MODE="0664"
KERNEL=="pxs1urvideo*", GROUP="video", MODE="0664"