Skip to content

Commit

Permalink
Merge pull request #9 from tsukumijima/isdb2056n-test
Browse files Browse the repository at this point in the history
Digibest ISDB2056N に対応 (Close #8)
  • Loading branch information
tsukumijima authored Jul 2, 2024
2 parents f96562f + 1b16109 commit d0617f0
Show file tree
Hide file tree
Showing 6 changed files with 97 additions and 19 deletions.
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"

0 comments on commit d0617f0

Please sign in to comment.