OpenWrt SONY NCP-HG100 

編集中
:flag_jp: Japanese notation
![OpenWrt_icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3412833/8f30539f-4a3b-b92b-6da3-8b64d955bd59.png)

# はじめに
::: note
### 初心者対応構成
- Windowsからの導入手順
- スクリプトでの自動設定
- [UCI (ttyd)](https://openwrt.org/docs/guide-user/base-system/uci)、[Webコンソール (LuCi)](https://openwrt.org/docs/guide-user/luci/start)、[ファイラー (SFTP)](https://openwrt.org/docs/guide-user/services/nas/sftp.server)にて比較作業がおススメ:exclamation:
:::

::: note
### デバイスアクセス
#### [PowerShell](https://learn.microsoft.com/ja-jp/powershell/scripting/what-is-windows-powershell?view=powershell-7.4)の開始
- キー入力：**`Win`+`x` > `a` > `はい`**

#### [UCI（SSH）アクセス](https://openwrt.org/docs/guide-quick-start/sshadministration)
```powershell:powershell:初期設定用
ssh -o StrictHostKeyChecking=no root@192.168.1.1
```
- root@192.168.1.1's password:`初期値：パスワード無し`

<details><summary>OpenSSHのインストールが無い場合:exclamation:</summary>

- 機能の確認
※Windows 10 Fall Creators Update(1709)以降標準搭載
```powershell:powershell
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
```
- 機能のインストール
```powershell:powershell
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
```
---

:::

::: note
### 前提条件
- 接続方法: シリアル接続

:::

# ファームウェアについて
:::note
### [OpenWrt Project へようこそ](https://openwrt.org/start)
![320.logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3412833/b680feca-c6f1-4b68-4516-7001887217f7.png)

- [The UCI system](https://openwrt.org/docs/guide-user/base-system/uci)

![uci.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3412833/93de2a19-2021-81b1-5b5f-2302ed00d2ae.png)

- [LuCI web interface](https://openwrt.org/docs/guide-user/luci/start)

![100_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3412833/4e2d3d66-d678-3e65-bee6-093edc09af91.png)
![100_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3412833/ad6978b1-783e-9ba9-a87e-f3ed2a5f7415.png)


- [projects / openwrt / openwrt.git / commitdiff](https://git.openwrt.org/?p=openwrt/openwrt.git;a=commitdiff;h=c34f071972474fbe5fcfca6fbb397a355216c221)

:::

# デバイスについて
:::note
### [NCP-HG100/Cellular](https://iot.sonynetwork.co.jp/service/homegateway/detail.html)
![ncp-hg100.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3412833/369c4aaa-af2c-67d9-a6dd-462c2fe7fdd8.png)

<details><summary>ハードウェア仕様</summary>

- SoC                   : Qualcomm IPQ4019
- RAM                   : DDR3 512 MiB (H5TC4G63EFR)
- Flash                 : eMMC 4 GiB (THGBMNG5D1LBAIT)
- WLAN                  : 2.4/5 GHz 2T2R (IPQ4019)
- Ethernet              : 10/100/1000 Mbps x2
  - Transceiver         : Qualcomm QCA8072
- WWAN                  : Telit LN940A9
- Z-Wave                : Silicon Labs ZM5101
- Bluetooth             : Qualcomm CSR8811
- Audio DAC             : Realtek ALC5629
- Audio Amp.            : Realtek ALC1304
- Voice Input Processor : Conexant CX20924
- Micro Controller Unit : Nuvoton MINI54FDE
  - RGB LED, Fan, Temp. sensors
- Touch Sensor          : Cypress CY8C4014LQI
- RGB LED driver        : TI LP55231 (2x)
- LEDs/Keys             : 11x, 6x
- UART                  : through-hole on PCB
  - J1: 3.3V, TX, RX, GND from tri-angle marking
  - 115200n8
- Power                 : 12 VDC, 2.5 A

---

</details>

<details><summary>ソースコード配布サービス</summary>

[NCP-HG100 Ver.1.4.46](https://oss.sony.net/Products/Linux/Others/NCP-HG100_v1446.html)

[NCP-HG100 Ver.1.4.42.3](https://oss.sony.net/Products/Linux/Others/NCP-HG100_v14423.html)

---

</details>
:::

# OpenWrt化手順
::: note
### 参考手順
- [大破ログ](https://taiha.hatenablog.jp/entry/2022/10/10/sony-ncp-hg100-cellular/)

<details><summary>USBインストール</summary>

- [NCP-HG100/CellularにOpenWRTを入れてUSBメモリからブートする(令和版)](https://www2.hatenadiary.jp/entry/2024/03/14/ncp-hg100-cellular-usb-boot)
- [Sony NCP-HG100/CellularにOpenWrtを入れる](https://labs.hottunalabs.net/2021/11/sony-ncp-hg100-cellular%E3%81%ABopenwrt%E3%82%92%E5%85%A5%E3%82%8C%E3%82%8B/)

---

</details>

<details><summary>ROOT化のみ ※殻割等参考</summary>

- 楽天モバイル利用
  - [MANOMA NCP-HG100 で遊ぶ](https://qiita.com/himalock/items/b863a92ed43baf8d85fb)
  - [【楽天モバイル】NCP-HG100でバンド3固定をする](https://blog2.k05.biz/2022/01/ncp-hg100-band.html)
  - [NCP-HG100 を 楽天モバイル Band3 に固定する](https://atooshi-note.com/ncp-hg100-band3/)
  - [楽天モバイルを固定回線化 SONY NCP-HG100使用して光回線を解約する](https://www.metabanium.com/repair-maintenance/post-7170/)

---

</details>

:::

::: note

### 事前準備

<details><summary>シリアルコンバータモジュール USB to TTL（変換アダプター）</summary>

CH340モジュール
![ch340.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3412833/9dc45957-322e-cbbc-9c2a-2bc3d69bdbf5.png)

---

</details>

<details><summary>テストワイヤー</summary>

スノーホール用
![pin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3412833/0b638e56-9af0-f6e4-8889-b7b2d6088fce.png)

---

</details>

<details><summary>クライアントPC用（Windows）ダウンロード</summary>

- [TeraTerm](https://teratermproject.github.io/)
- [Serva_Community](https://www.vercot.com/~serva/download.html)

---

</details>

<details><summary>デバイス用のOpenWrtファームウェアをダウンロード</summary>

- [KERNEL](https://firmware-selector.openwrt.org/?version=23.05.3&target=ipq40xx%2Fgeneric&id=sony_ncp-hg100-cellular)

---

</details>

:::

::: note
### OpenWrt化

<details><summary>クライアントPC(Windows)設定</summary>

- デバイスマネージャー > ポート(COMとLPT) `確認`
- 有線LAN設定 > `192.168.132.100`
- デバイスとクライアントPCに有線LAN接続

---

</details>

<details><summary>テストワイヤー接続</summary>

- 電圧：3.3V
- `GND` <- GND
- `TX` <- **RX**
- `RX` <- **TX**

※RX、TX、クロス接続
※デバイスはまだ通電させない

![pin1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3412833/75709f70-f412-3b42-5a33-dfb2888eafd9.png)


- デバイスとクライアントPCにシリアル接続
※テストワイヤーは先にデバイスへ挿す事

---

</details>

<details><summary>シリアル設定</summary>
 
- TeraTerm起動
  - COMポート：ポート(COMとLPT) `確認した値`
  - スピード：`115200`

---

</details>

<details><summary>シリアル通信</summary>

- デバイス通電（アダプター接続）
- TeraTermでシリアル接続
Hit any key to stop autoboot: `何かキーを押しブートを停止させる`
- ブート変更
```
setenv bootcmd "mmc read 0x84000000 0x2e22 0x4000 && bootm 0x84000000"
saveenv

```

---

</details>

<details><summary>KERNELリネーム</summary>

- openwrt-ipq40xx-generic-sony_ncp-hg100-cellular-initramfs-fit-uImage.itb > `C0A88401.img`

---

</details>

<details><summary>TFTP接続</summary>

- Serva64起動 ※7秒待つ
  - Serva64設定 ※左上のアイコンをダブルクリック
    - TFTPタブ
      - TFTPサーバ `チェック`
      - TFTP Server IP address `192.168.132.100`
      - TFTP Server root directory `C0A88401.img`を格納したディレクトリ

---

</details>

<details><summary>U-Boot</summary>

```
tftpboot && bootm

```
![boot11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3412833/531ab6ee-e9e0-f061-fb23-aaaea5346404.png)

- 自動でリブート
- Serva64終了

<details><summary>SFTPサーバーにファイルを取りに行かない場合</summary>

```
set ipaddr 192.168.132.1
set serverip 192.168.132.100
set bootfile C0A88401.img
printenv
saveenv
```

---

</details>

</details>

<details><summary>TCP/IP通信</summary>

- デバイスをインターネット接続しているルーター等へ接続（WANポート）
- クライアントPCのIPアドレス変更 `DHCP`
- TeraTermをIP接続で新たに起動
  - TCP/IP ホスト `192.168.1.1`
    - ユーザー名 `root`

</details>

<details><summary>OpenWrtインストール</summary>

- [SYSUPGRADE](https://firmware-selector.openwrt.org/?version=23.05.3&target=ipq40xx%2Fgeneric&id=sony_ncp-hg100-cellular)
```sh:23.05.3
wget --no-check-certificate -O /tmp/openwrt-ipq40xx-generic-sony_ncp-hg100-cellular-squashfs-sysupgrade.bin https://downloads.openwrt.org/releases/23.05.3/targets/ipq40xx/generic/openwrt-23.05.3-ipq40xx-generic-sony_ncp-hg100-cellular-squashfs-sysupgrade.bin
sysupgrade -n /tmp/openwrt-ipq40xx-generic-sony_ncp-hg100-cellular-squashfs-sysupgrade.bin

```
- 自動でリブート

- LuCi：http://openwrt.lan/

---

</details>

:::

::: note
### [ストレージの拡張](https://openwrt.org/toh/google/wifi#expanding_storage_optional)

<details><summary>設定</summary>

```
opkg update && opkg install cfdisk resize2fs
cfdisk /dev/mmcblk0
```
`/dev/mmcblk0p17`

`Rsize`
New size: 3.4G

`Write`
Are you sure you want to write the partition table to disk?

`yes`

`Quit`

```sh
reboot

```

```sh
resize2fs /dev/mmcblk0p17

```

---

</details>

:::

::: note
### ベンチマーク

<details><summary>設定</summary>

#### [CPUパフォーマンス](https://romanrm.net/router-cpu-performance)
```sh
time sh -c 'dd if=/dev/zero bs=1M count=100 | md5sum'

```
100+0 records in
100+0 records out
2f282b84e7e608d5852449ed940bfc51  -
real    0m 0.58s
user    0m 0.50s
sys     0m 0.20s

#### hdparm
```sh
opkg update && opkg install hdparm
hdparm -t --direct /dev/mmcblk0p17

```
---

</details>

:::

# [新規設定用 オールインワンスクリプト 初心者対応](https://qiita.com/site_u/items/c6a50aa6dea965b5a774)
::: note
### [オールインワンスクリプト](https://qiita.com/site_u/items/c6a50aa6dea965b5a774#%E6%96%B0%E8%A6%8F%E8%A8%AD%E5%AE%9A%E7%94%A8-%E3%82%AA%E3%83%BC%E3%83%AB%E3%82%A4%E3%83%B3%E3%83%AF%E3%83%B3%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88-%E5%88%9D%E5%BF%83%E8%80%85%E5%AF%BE%E5%BF%9C)

![config.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3412833/ebcf1227-8809-3fad-ba47-5e44a04ccac6.png)

:::

# 固有設定

::: note
### 設定

<details><summary>レジスタ</summary>

```sh
opkg update
opkg install i2c-tools

```

```sh
i2cdetect -l
# i2c-1   i2c             QUP I2C adapter                         I2C adapter

```

```sh
i2cdetect -y 1
# Warning: Can't use SMBus Quick Write command, will skip some addresses
#      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
# 00:                                                 
# 10:                                                 
# 20:                                                 
# 30: -- -- UU UU -- -- -- --                         
# 40:                                                 
# 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
# 60:                                                 
# 70:

```

---

</details>

<details><summary>タッチセンサー</summary>

```sh
i2cset -y 1 0x14 0xf 1

```

---

</details>

<details><summary>外周LED</summary>

- [NCP-HG100 MCUレジスタメモ](https://memo205.wordpress.com/2021/02/13/ncp-hg100-mcu%E3%83%AC%E3%82%B8%E3%82%B9%E3%82%BF%E3%83%A1%E3%83%A2/)
```sh
# (nop?, 分岐引っ掛かっても無さげ)
i2cset -y 1 0x15 0x00 0x00
# 波: blue+lightblue
i2cset -y 1 0x15 0x00 0x10
# 特殊ワイプ (中): blue->lightblue
i2cset -y 1 0x15 0x00 0x20
# ワイプ (速): blue->lightblue
i2cset -y 1 0x15 0x00 0x30
# 交互 (速): blue->lightblue
i2cset -y 1 0x15 0x00 0x40
# 点灯: yellow->blue
i2cset -y 1 0x15 0x00 0x50 
# 点滅: yellow
i2cset -y 1 0x15 0x00 0x60
# 点灯: red
i2cset -y 1 0x15 0x00 0x70
# 点灯: yellow
i2cset -y 1 0x15 0x00 0x80
# 点滅 (遅): blue 
i2cset -y 1 0x15 0x00 0x90
# 点灯:blue
i2cset -y 1 0x15 0x00 0xa0
# 消灯
i2cset -y 1 0x15 0x00 0xB0
# 点滅 (速): white 
i2cset -y 1 0x15 0x00 0xC0
# 点滅 (速): red 
i2cset -y 1 0x15 0x00 0xD0
# 交互: white->lightblue
i2cset -y 1 0x15 0x00 0xE0
# (nop?, 分岐引っ掛かっても無さげ)
i2cset -y 1 0x15 0x00 0xF0

```

---

</details>

### 参考設定

<details><summary>外周LED色確認ツール</summary>

```sh
#! /bin/sh
{
while :
do
    echo -e " \033[1;37mi2cset -y 1 0x15 0x00\033[0;39m"
    echo -e " \033[1;37mLED Register Value --------------------------\033[0;39m"
    echo -e " \033[0;37m[0]\033[0;39m 0xb0 Off"
    echo -e " \033[7;40m[l]\033[0;39m 0xc0 Flash: white"
    echo -e " \033[0;44m[2]\033[0;39m 0xa0 Light:blue"
    echo -e " \033[5;44m[3]\033[0;39m 0x90 Flash: blue"
    echo -e " \033[0;44m[4]\033[0;39m 0x50 Light: yellow->blue"
    echo -e " \033[0;43m[5]\033[0;39m 0x80 Light:yellow"
    echo -e " \033[5;43m[6]\033[0;39m 0x60 Flash: yellow"
    echo -e " \033[0;41m[7]\033[0;39m 0x70 Light: red"
    echo -e " \033[5;41m[8]\033[0;39m 0xd0 Flash: red"
    echo -e " \033[4;46m[9]\033[0;39m 0x20 Special Wipe: blue->lightblue"
    echo -e " \033[7;40m[a]\033[0;39m 0xe0 Alternate: white<>lightblue"
    echo -e " \033[4;46m[b]\033[0;39m 0x10 Wave: lightblue<>blue"
    echo -e " \033[4;46m[c]\033[0;39m 0x30 Wipe: blue<>lightblue"
    echo -e " \033[4;46m[d]\033[0;39m 0x40 Alternate: blue<>lightblue"
    echo -e " \033[7;36m[q]\033[0;39m Quit"
    echo -e " \033[1;37m-----------------------------------------------------\033[0;39m"
  read -p " Please select key: " num
  case "${num}" in
    "0" ) i2cset -y 1 0x15 0x00 0xb0 ;;
    "1" ) i2cset -y 1 0x15 0x00 0xc0 ;;
    "2" ) i2cset -y 1 0x15 0x00 0xa0 ;;
    "3" ) i2cset -y 1 0x15 0x00 0x90 ;;
    "4" ) i2cset -y 1 0x15 0x00 0x50 ;;
    "5" ) i2cset -y 1 0x15 0x00 0x80 ;;
    "6" ) i2cset -y 1 0x15 0x00 0x60 ;;
    "7" ) i2cset -y 1 0x15 0x00 0x70 ;;
    "8" ) i2cset -y 1 0x15 0x00 0xd0 ;;
    "9" ) i2cset -y 1 0x15 0x00 0x20 ;;
    "a" ) i2cset -y 1 0x15 0x00 0xe0 ;;
    "b" ) i2cset -y 1 0x15 0x00 0x10 ;;
    "c" ) i2cset -y 1 0x15 0x00 0x30 ;;
    "d" ) i2cset -y 1 0x15 0x00 0x40 ;;
    "q" ) exit 0 ;;
  esac
 done
}
 ```

 ---

 </details>

<details><summary>外周LED時間連動スクリプト</summary>

- 外周LEDをスタートアップ及びスケジュールと連動して変更する
※時報機能あり

`i2cset -y 1 0x15 0x00 0xb0 off`
`i2cset -y 1 0x15 0x00 0xc0 flash_white`
`i2cset -y 1 0x15 0x00 0xa0 blue`
`i2cset -y 1 0x15 0x00 0x90 flash_blue`
`i2cset -y 1 0x15 0x00 0x50 yellow_to_blue`
`i2cset -y 1 0x15 0x00 0x80 yellow`
`i2cset -y 1 0x15 0x00 0x60 flash_yellow`
`i2cset -y 1 0x15 0x00 0x70 red`
`i2cset -y 1 0x15 0x00 0xd0 flash_red`
`i2cset -y 1 0x15 0x00 0x20 skyblue`
`i2cset -y 1 0x15 0x00 0xe0 alternate_white_lightblue`
`i2cset -y 1 0x15 0x00 0x10 wave_lightblue_blue`
`i2cset -y 1 0x15 0x00 0x30 wipe_blue_lightblue`
`i2cset -y 1 0x15 0x00 0x40 alternate_blue_lightblue`
```sh
#!/bin/sh

cat >> /etc/crontabs/root << 'EOF'
0 * * * * /etc/config-software/led_timer.sh # 時報
# 0 0 1 1 * /etc/config-software/led_timer.sh # サンプル
1 0 * * * /etc/config-software/led_color.sh off
1 8 * * * /etc/config-software/led_color.sh blue
1 12 * * * /etc/config-software/led_color.sh skyblue
1 16 * * * /etc/config-software/led_color.sh yellow
1 20 * * * /etc/config-software/led_color.sh red
# 43 21 * * * /etc/config-software/led_color.sh wave_lightblue_blue  # TEST
EOF
/etc/init.d/cron enable
/etc/init.d/cron restart

mkdir -p /etc/config-software

cat > /etc/config-software/led_timer.sh << 'EOF'
#!/bin/sh

i2cset -y 1 0x15 0x00 0xc0  # 例: 白色のフラッシュ
sleep 60
/etc/config-software/led_color.sh
EOF
chmod +x /etc/config-software/led_timer.sh

cat > /etc/config-software/led_color.sh << 'EOF'
#!/bin/sh

/etc/init.d/cron restart

get_color_code() {
    case "$1" in
        "off") echo "0xb0" ;;
        "flash_white") echo "0xc0" ;;
        "blue") echo "0xa0" ;;
        "flash_blue") echo "0x90" ;;
        "yellow_to_blue") echo "0x50" ;;
        "yellow") echo "0x80" ;;
        "flash_yellow") echo "0x60" ;;
        "red") echo "0x70" ;;
        "flash_red") echo "0xd0" ;;
        "skyblue") echo "0x20" ;;
        "alternate_white_lightblue") echo "0xe0" ;;
        "wave_lightblue_blue") echo "0x10" ;;
        "wipe_blue_lightblue") echo "0x30" ;;
        "alternate_blue_lightblue") echo "0x40" ;;
        *) echo "0xb0" ;;
    esac
}

get_crontab_schedule() {
    awk '!/^#/ && /\/etc\/config-software\/led_color.sh/ {print $1,$2,$7}' /etc/crontabs/root
}

current_hour=$(date +'%H' | sed 's/^0//')
current_minute=$(date +'%M' | sed 's/^0//')
current_time=$((current_hour * 60 + current_minute))

schedules=$(get_crontab_schedule)
LED_COLOR="0xb0"

while IFS=' ' read -r minute hour color_name; do
    hour=$(echo "$hour" | sed 's/^0//')
    minute=$(echo "$minute" | sed 's/^0//')
    schedule_time=$((hour * 60 + minute))
    
    if [ "$current_time" -ge "$schedule_time" ]; then
        color_code=$(get_color_code "$color_name")
        if [ -n "$color_code" ]; then
            LED_COLOR="$color_code"
        fi
    fi
done <<END
$schedules
END

if ! i2cset -y 1 0x15 0x00 "$LED_COLOR"; then
    echo "Failed to set LED color to $LED_COLOR at $(date)" >> /var/log/led_color_errors.log
    i2cset -y 1 0x15 0x00 0xd0  # エラー通知
fi
EOF
chmod +x /etc/config-software/led_color.sh

cat > /etc/init.d/led_outer << 'EOF'
#!/bin/sh /etc/rc.common

START=96
STOP=10

send_led_command() {
    local color=$1
    i2cset -y 1 0x15 0x00 "$color"
    sleep 3
}

start() {
    send_led_command 0x90
    /etc/config-software/led_color.sh
}

restart() {
    send_led_command 0x60
    /etc/config-software/led_color.sh
}

stop() {
    send_led_command 0xd0
    send_led_command 0xb0
}

EOF
chmod +x /etc/init.d/led_outer

/etc/init.d/led_outer enable
/etc/init.d/led_outer start
```

### サービス開始及び停止
```sh
# 有効
service led_outer enable
# 開始
service led_outer start
# 停止
service led_outer stop
# 無効
service led_outer disable
```

### スクリプト実行時間計測
```sh
time sh /etc/config-software/led_color.sh
```

### 削除
```sh
service led_outer stop
service led_outer disable
rm -rf /etc/config-software/led_color.sh
rm -rf /etc/config-software/led_timer.sh
rm -rf /var/log/led_color_errors.log
rm -rf /etc/init.d/led_outer
```

### CRONTABテストジョブ
- 1分ごとログ
```sh
* * * * * echo "Cron test executed at $(date)" >> /tmp/test_cron.log
```
- ログ確認
```sh
cat /tmp/test_cron.log
```

---

</details>

<details><summary>ZZDFS</summary>

- [ZZDFS](https://qiita.com/site_u/items/f42be7c0953187b9428a#zzdfs)

```sh
#! /bin/ash

cat << "EOF" > /etc/init.d/zzdfs
#! /bin/sh

cat << "EOF" > /etc/init.d/zzdfs
#!/bin/sh /etc/rc.common

INTERVAL=5    # check interval (min)
FB_BAND=40    # fallback band
FB_CHANNEL=36 # fallback channel

START=99
STOP=01
     
start() {
    sleep 1m 15s
    mkdir -p /tmp/config-software/
    RADIO=`uci show wireless | grep "band='5g'" | cut -d'.' -f2 | awk '{ print $1 }'`
    CHS=`echo ${RADIO} | wc -w`
    if [ ${CHS} = 2 ];then
        RADIO=`echo ${RADIO}| awk '{print $2}'`
    fi
    CH=`echo ${RADIO} | grep -o "[0-9]*"`
    echo $(iw dev | awk '/Interface/{print $2}' | grep ${CH}) > /tmp/config-software/dev
    echo ${INTERVAL} > /tmp/config-software/interval
    echo ${RADIO} > /tmp/config-software/radio
    echo ${FB_BAND} > /tmp/config-software/fb_band
    echo ${FB_CHANNEL} > /tmp/config-software/fb_channel
    logger "ZZDFS: Start"
    sed -i "/zzdfs.sh/d" /etc/crontabs/root
    echo "*/${INTERVAL} * * * * sh /etc/config-software/zzdfs.sh # ZZDFS" >> /etc/crontabs/root
    service cron restart
    exit 0
}
restart() {
    exit 0
}
stop() {
    logger "ZZDFS: Stop"
    sed -i "/zzdfs.sh/d" /etc/crontabs/root
    service cron restart
    rm -rf /tmp/config-software
    exit 0
}
EOF
chmod +x /etc/init.d/zzdfs


mkdir -p /etc/config-software/
cat << "EOF" > /etc/config-software/zzdfs.sh
#! /bin/sh

read DEV < /tmp/config-software/dev
iwinfo ${DEV} info 2>&1 | grep -q 'No such wireless device'
if [ $? = 0 ]; then
    read RADIO < /tmp/config-software/radio
    WIFI=`uci get wireless.${RADIO}.disabled`
    if [ "${WIFI}" != 1 ]; then 
        logger "ZZDFS: ZZDFS_On"
        sed -i "/zzdfs.sh/d" /etc/crontabs/root
        /etc/init.d/cron restart
        read INTERVAL < /tmp/config-software/interval
        read FB_CHANNEL < /tmp/config-software/fb_channel
        read FB_BAND < /tmp/config-software/fb_band
        CHANNEL=$(uci get wireless.${RADIO}.channel | tee /tmp/config-software/channel)
        HTMODE=$(uci get wireless.${RADIO}.htmode | tee /tmp/config-software/htmode)
        MODE=`echo ${HTMODE} | grep -o "[A-Z]*"`
        uci set wireless.${RADIO}.channel=${FB_CHANNEL}
        uci set wireless.${RADIO}.htmode=${MODE}${FB_BAND}
        uci commit wireless
        wifi reload ${RADIO}
        i2cset -y 1 0x15 0x00 0xe0
        sleep 30m
        logger "ZZDFS: ZZDFS_Off"
        uci set wireless.${RADIO}.channel=${CHANNEL}
        uci set wireless.${RADIO}.htmode=${HTMODE}
        uci commit wireless
        wifi reload  ${RADIO}
        sleep 1m 10s
        echo "*/${INTERVAL} * * * * sh /etc/config-software/zzdfs.sh # ZZDFS" >> /etc/crontabs/root
        service cron restart
        service led_p_new start
    else
        logger "ZZDFS: ${RADIO}_Disable"
    fi
fi    
EOF


cat <<"EOF" > /usr/bin/zzdfst
#! /bin/sh
read INTERVAL < /tmp/config-software/interval
if [ -n "$1" ]; then
    logger "ZZDFS: Interval_Change"
	description_INTERVAL="$1"
	sed -i -e "s/INTERVAL=${INTERVAL}/INTERVAL=${description_INTERVAL}/g" /etc/init.d/zzdfs
    echo ${description_INTERVAL} > /tmp/config-software/interval
    sed -i "/zzdfs.sh/d" /etc/crontabs/root
    echo "*/${description_INTERVAL} * * * * sh /etc/config-software/zzdfs.sh # DFS ZZDFS" >> /etc/crontabs/root
    service cron restart
    echo " Set time: ${description_INTERVAL} min"
	exit 0
else
	while :
	do
        logger "ZZDFS: Interval_Change"
		echo -e " \033[1;37mInterval time setting\033[0;39m"
        echo -e " \033[1;37mNow Interval: ${INTERVAL} min\033[0;39m"
        read -p " Interval time change (y or q): " input_CHANGE
        if [ "${input_CHANGE}" = "q" ]; then
            exit 0
        fi
		read -p " Interval time (min): " input_INTERVAL
		read -p " Please select key [y or q]: " num
		case "${num}" in
		"y" ) sed -i -e "s/INTERVAL=${INTERVAL}/INTERVAL=${input_INTERVAL}/g" /etc/init.d/zzdfs
              echo ${input_INTERVAL} > /tmp/config-software/interval
              sed -i "/zzdfs.sh/d" /etc/crontabs/root
              echo "*/${input_INTERVAL} * * * * sh /etc/config-software/zzdfs.sh # ZZDFS" >> /etc/crontabs/root
              service cron restart
			  echo " Set time: ${input_INTERVAL} min"
		      exit 0 ;;
	    "q" ) exit 0 ;;
	    esac
    done
fi
EOF
chmod +x /usr/bin/zzdfst


cat <<"EOF" > /usr/bin/zzdfsl
#!/bin/sh
echo -e "\033[1;36mZZDFS\033[0;39m"
echo -e "\033[1;36mLOG ------------------------------------\033[0;39m"
echo -e "\033[1;37mLOG:\033[0;39m"
exec logread | grep "ZZDFS" | awk '{ print $1,$2,$3,$4,$5,$9 }' | tail -n 10
echo -e "\033[1;37mDISABLED:\033[0;39m"
exec logread | grep "DFS->disabled" | awk '{ print $1,$2,$3,$4,$5,$11 }' | tail -n 1
echo -e "\033[1;37mENABLED:\033[0;39m"
exec logread | grep "DFS->ENABLED" | awk '{ print $1,$2,$3,$4,$5,$11 }' | tail -n 1
echo -e "\033[1;36mINFORMATION ----------------------------\033[0;39m"
read INTERVAL < /tmp/config-software/interval
echo -e "\033[1;37mInterval: ${INTERVAL}min\033[0;39m"
read FB_BAND < /tmp/config-software/fb_band
read FB_CHANNEL < /tmp/config-software/fb_channel
read RADIO < /tmp/config-software/radio
HTMODE=$(uci get wireless.${RADIO}.htmode)
MODE=`echo ${HTMODE} | grep -o "[A-Z]*"`
read RADIO < /tmp/config-software/radio
CHANNEL=$(uci get wireless.${RADIO}.channel)
HTMODE=$(uci get wireless.${RADIO}.htmode)
WIFI=`uci get wireless.${RADIO}.disabled` 2>/dev/null
if [ "${WIFI}" != 1 ]; then
    echo -e "\033[1;37mWi-Fi 5G ${RADIO} ENABLE\033[0;39m"   
else
    echo -e "\033[1;37mWi-Fi 5G ${RADIO} DISABLE\033[0;39m"
fi
echo -e "\033[1;37mWi-Fi 5G Channel/ Htmode: ${CHANNEL}Ch/ ${HTMODE}\033[0;39m"
echo -e "\033[1;37mFALLBACK Channel/ Htmode: ${FB_CHANNEL}Ch/ ${MODE}${FB_BAND}\033[0;39m"
echo -e "\033[1;36m----------------------------------------\033[0;39m"
EOF
chmod +x /usr/bin/zzdfsl


service zzdfs enable
service zzdfs start

zzdfsl

```
---

</details>

::: 

::: note
### モデムモジュール

- [WAN 接続に QMI モードで LTE モデムを使用する方法](https://openwrt.org/docs/guide-user/network/wan/wwan/ltedongle)

<details><summary>モデム用LuCi</summary>

[luci-app-3ginfo-lite](https://github.com/4IceG/luci-app-3ginfo-lite?tab=readme-ov-file)
[luci-app-modemband](https://github.com/4IceG/luci-app-modemband)
[uci-app-sms-tool-js](https://github.com/4IceG/luci-app-sms-tool-js)
[internet-detector-mod-modem-restart](https://github.com/gSpotx2f/luci-app-internet-detector?tab=readme-ov-file#modem-restart-module-internet-detector-mod-modem-restart)

---


</details>

<details><summary>キャリア基地局</summary>

キャリアバンド
- NTTドコモ: 1,3,19,21,28
- au (沖縄セルラー、UQ WiMAX含む): 1,11,18,26,28,41
- ソフトバンク (旧ワイモバイル、WCP含む): 1,3,8,41 (※WCP)

キャリア基地局
- [cellmapper](https://www.cellmapper.net/map)
  - 左サイドバーを展開 > Providerにjapanと入力 > 該当キャリア選択

---

</details>

<details><summary>モデムモジュール設定</summary>

- [HP LT4220のSetmode0スタックの解決](https://radenku.com/mengatasi-hp-lt4220-stuck-setmode-0/)
- [LN940A9シリーズマニュアル](https://www.manualslib.com/products/Telit-Wireless-Solutions-Ln940a9-Series-9244074.html)
- [Telit LN940シリーズセルラーモジュールの初期診断データを収集するにはどうすればよいですか?](https://techship.com/faq/how-to-collect-initial-diagnostics-data-for-telit-ln940-series-cellular-modules-when-requesting-technical-support/)
- [collectd-Telit-LN940-wwan](https://github.com/Neelakurinji123/collectd-Telit-LN940-wwan)
- [Linux で libmbim とドライバー cdc_mbim を使用して、MBIM インターフェイス経由で簡単なデータ接続をセットアップするにはどうすればよいですか?](https://techship.com/faq/how-to-set-up-a-simple-data-connection-over-the-mbim-interface-using-libmbim-and-driver-cdc-mbim-in-linux/)
#### インストール

```sh
#! /bin/sh
grep -q IceG_repo /etc/opkg/customfeeds.conf || echo 'src/gz IceG_repo https://github.com/4IceG/Modem-extras/raw/main/myrepo' >> /etc/opkg/customfeeds.conf
wget https://github.com/4IceG/Modem-extras/raw/main/myrepo/IceG-repo.pub -O /tmp/IceG-repo.pub
opkg-key add /tmp/IceG-repo.pub
opkg update
opkg install kmod-usb-serial
opkg install kmod-usb-serial-option
opkg install kmod-usb-net-cdc-ether
opkg install kmod-usb-net-qmi-wwan
# opkg install kmod-usb-net-cdc-mbim # 排他利用
opkg install usbutils
opkg install qmi-utils
# opkg install mbim-utils
opkg install uqmi
# opkg install umbim
opkg install screen
# opkg install minicom
# opkg install picocom 
opkg install modemmanager
opkg install luci-proto-modemmanager
# opkg install luci-proto-qmi
# opkg install luci-proto-mbim
# opkg install usb-modeswitch
opkg install luci-app-3ginfo-lite
opkg install luci-app-modemband
opkg install sms-tool
opkg install luci-app-sms-tool	
opkg install luci-app-sms-tool-js
reboot

```
※luci-app-sms-toolがうまく入らない時はリムーブし再起動後入れなおす

- カスタムフィード
※カスタムフィードに関し、配布元の構成変更が頻繁にある為、インストール出来ない事場合、適弁コマンドを修正下さい
また依頼あれば対応します
```sh
#!/bin/sh

# パッケージリストを取得して更新
opkg update

# 作業用ディレクトリ作成
mkdir -p /tmp/config-software

# パッケージリストをダウンロード
wget --no-check-certificate -O /tmp/config-software/package_list https://github.com/gSpotx2f/packages-openwrt/raw/master/current/

# パッケージのURLを抽出
PACKAGE_LIST=$(cat /tmp/config-software/package_list | sed -ne '/ <script type/,/<\/script>/p' | sed -e 's/<[^>]*>//g')

# パッケージ名を抽出する関数
extract_package() {
    local keyword="$1"
    echo ${PACKAGE_LIST} | awk -v keyword="$keyword" '{print substr($0,index($0,keyword),60)}' | awk '{sub(".ipk.*$",""); print $0;}'
}

# 必要なパッケージ名を抽出
INTERNET_DETECTOR=$(extract_package "current/internet-detector_")
INTERNET_DETECTOR_A=$(extract_package "current/luci-app-internet-detector")
INTERNET_DETECTOR_MODEM=$(extract_package "current/internet-detector-mod-modem")
INTERNET_DETECTOR_EMAIL=$(extract_package "current/internet-detector-mod-email")

# パッケージを順にダウンロードしてインストールする関数
download_and_install() {
    local URL="$1"
    local FILE="$2"
    echo "Downloading: $URL"
    wget --no-check-certificate -O /tmp/$FILE $URL
    if [ $? -eq 0 ]; then
        opkg install /tmp/$FILE
        rm /tmp/$FILE
        echo "Installed: $FILE"
    else
        echo "Error downloading $URL"
    fi
}

# /var/lock ディレクトリが存在しない場合、作成する
if [ ! -d /var/lock ]; then
    echo "/var/lock directory not found. Creating it now."
    mkdir -p /var/lock
    chmod 755 /var/lock  # 適切な権限を設定
fi

# パッケージのダウンロードとインストール
download_and_install "https://github.com/gSpotx2f/packages-openwrt/raw/master/${INTERNET_DETECTOR}.ipk" "internet-detector_all.ipk"
download_and_install "https://github.com/gSpotx2f/packages-openwrt/raw/master/${INTERNET_DETECTOR_A}.ipk" "luci-app-internet-detector_all.ipk"
download_and_install "https://github.com/gSpotx2f/packages-openwrt/raw/master/${INTERNET_DETECTOR_MODEM}.ipk" "internet-detector-mod-modem-restart_all.ipk"
download_and_install "https://github.com/gSpotx2f/packages-openwrt/raw/master/${INTERNET_DETECTOR_EMAIL}.ipk" "internet-detector-mod-email_all.ipk"

# サービスの再起動と有効化
/etc/init.d/internet-detector restart
/etc/init.d/internet-detector enable

# クリーンアップ
rm -rf /tmp/config-software
```


#### デバイス
- 検出
```sh
grep 1bc7 /sys/bus/usb/devices/*/idVendor
echo 1 > /sys/bus/usb/devices/2-1/bConfigurationValue
# echo "1bc7 1901" > /sys/bus/usb-serial/drivers/option1/new_id

```

- 確認
```sh
lsusb && lsusb -t

```
![lsusb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3412833/c5075768-aa85-319d-f451-e606e54e1d81.png)

```sh
ls -l /dev/cdc-wdm0

```

- リリース
※デバイス検出に失敗した時はリリースしてやり直す
```sh
echo -n "2-1" > /sys/bus/usb/drivers/usb/unbind

```

- ネットワークインターフェイス制御チャンネル確認
```sh
qmicli --device=/dev/cdc-wdm0 --device-open-proxy --wda-get-data-format

```

#### IPタイプ
- 確認
```sh
qmicli --device=/dev/cdc-wdm0 --get-expected-data-format

```
- IPタイプがRaw-IPではない場合
※Raw-IP を使用するように qmi_wwan ドライバーを変更
```sh
# ネットワーク インターフェイスを無効
ip link set dev wwan0 down
sleep 2
# Raw-IP サポートをトリガー
echo Y > /sys/class/net/wwan0/qmi/raw_ip
sleep 2
# ネットワーク インターフェイスを再度有効
ip link set dev wwan0 up

```
#### ATコマンド
- 開始
```sh:AT
screen /dev/ttyUSB2 115200

```
screen :
開始: `screen /dev/ttyUSB2 115200`
終了: `Ctrl`+`a`　`k`　`y`
minicom:
開始: `minicom -D /dev/ttyUSB2`
終了: `Ctrl`+`a` `q`
picocom:
開始: `picocom -b 115200 /dev/ttyUSB2` 
終了: `Ctrl`+`a` `Ctrl`+`x`

- エコーバック有効化
※大文字入力
```sh:AT
ATE1

```

- 各情報取得
```sh:AT
ATI

```

- バージョン確認
```sh:AT
AT^VERSION?

```

- USBタイプ確認
```SH
AT^USBTYPE?

```

#### モード
- 確認
```sh:AT
AT^SETMODE?

```
Telit Ln940 (Foxconn T77W676):
　Normal Mode=0 (1bc7:1900) MBIM
　Extension Mode=1 (1bc7:1901) MBIM + Serial port
　Legacy Mode=2	(1bc7:1900) QMI + Serial port
HP Lt4220:
　Normal Mode=0 (03f0:0857) MBIM
　Extension Mode=1 (03f0:0a57) MBIM + Serial port
　Legacy Mode=2 (03f0:0857) QMI + Serial port
 

- モード2変更 QMI + Serial port
```sh:AT
AT^SETMODE= 2

```
※モード変更した場合、デバイスの電源を入れなおす

- キャリアデータ確認
※10秒以上かかる
```sh
AT+COPS=?

```

- キャリアデータ設定 (docomo)
```sh
AT+COPS=0,2,"44010",7

```
au: `AT+COPS=0,2,"44051",7`
SoftBank: `AT+COPS=0,2,"44020",7`
Rakuten: `AT+COPS=0,2,"44110",7`
UQ: `AT+COPS=0,2,"44110",7`

- 自局電話番号確認
```sh
AT+CNUM

```

- ATコマンド終了
`Ctrl`+`a`　`k`　`y`

#### プロファイル
- 登録キャリアデータ確認
```sh
qmicli -d /dev/cdc-wdm0 --pdc-list-configs=software

```

- 登録キャリアデータ変更 (docomo)
```sh
CARRIERDATA='F3D782~'
qmicli -p -d /dev/cdc-wdm0 --pdc-activate-config="software,${CARRIERDATA}"

```

- 登録プロファイル確認
```sh
qmicli -d /dev/cdc-wdm0 --wds-get-profile-list=3gpp

```

- プロファイル登録 (docomo)
```sh
qmicli -d /dev/cdc-wdm0 --wds-modify-profile=3gpp,1,apn=spmode.ne.jp,pdp-type=IPV4V6,auth=CHAP,username=spmode,password=spmode,no-roaming=yes

```
Rakuten: `qmicli -d /dev/cdc-wdm0 --wds-modify-profile=3gpp,1,apn=rakuten.jp,pdp-type=IPV4V6,auth=CHAP,username=,password=,no-roaming=yes`

UQ: `qmicli -d /dev/cdc-wdm0 --wds-modify-profile=3gpp,1,apn=uqmobile.jp,pdp-type=IP,auth=CHAP,username=uq@uqmobile.jp,password=uq`

削除 (リスト1): `qmicli -d /dev/cdc-wdm0 --wds-delete-profile=3gpp,1`
削除 (リスト2): `qmicli -d /dev/cdc-wdm0 --wds-delete-profile=3gpp,2`

```sh
reboot

```

#### インターフェース
参考：docomo
```sh
WWAN="lte"
ZOON_NO='1'
uci set network.lte=interface
uci set network.lte.proto='modemmanager'
uci set network.lte.device='/sys/devices/platform/soc/8af8800.usb3/8a00000.dwc3/xhci-uci set hcd.0.auto/usb2/2-1'
uci set network.${wwan}.apn='spmode.ne.jp'
uci set network.${wwan}.auth='chap'
uci set network.${wwan}.allowedmode='4g'
uci set network.${wwan}.username='spmode'
uci set network.${wwan}.password='spmode'
uci set network.${wwan}.iptype='ipv4v6'
uci set network.${wwan}.loglevel='ERR'
uci set network.${wwan}.auto='0' #ブート時に開始されていません
uci set network.lte.defaultroute='0'
uci del_list firewall.@zone[${ZOON_NO}].network='wwan'
uci add_list firewall.@zone[${ZOON_NO}].network='wwan'
uci commit network
uci commit firewall

# 3ginfo
uci set 3ginfo.@3ginfo[0]=3ginfo
uci set 3ginfo.@3ginfo[0].network='wwan'
uci set 3ginfo.@3ginfo[0].device='/dev/ttyUSB2'
uci commit 3ginfo

# modemband
MODEM_ID="1bc7:1900" #モード1の場合: 1bc71901
uci set modemband.@modemband[0]=modemband
uci set modemband.@modemband[0].iface='wwan'
uci set modemband.@modemband[0].modemid=${MODEM_ID} #モデムID
uci set modemband.@modemband[0].set_port='/dev/ttyUSB2'
uci commit modemband

# sms_tool
PNUMBER='81'
uci set sms_tool_js.@sms_tool_js[0]=sms_tool_js
uci set sms_tool_js.@sms_tool_js[0].pnumber=${PNUMBER}
uci set sms_tool_js.@sms_tool_js[0].readport='/dev/ttyUSB2'
uci set sms_tool_js.@sms_tool_js[0].sendport='/dev/ttyUSB2'
uci set sms_tool_js.@sms_tool_js[0].ussdport='/dev/ttyUSB2'
uci set sms_tool_js.@sms_tool_js[0].atport='/dev/ttyUSB2'
uci commit sms_tool_js

 reboot
 
```

- 接続確認
```sh
ifconfig wwan0

```

#### QMI
- Device IDs retrieved
```sh
qmicli -d /dev/cdc-wdm0 -p --dms-get-ids

```

```sh
qmicli -d /dev/cdc-wdm0 --nas-get-system-selection-preference

```
- card status
```sh
qmicli -d /dev/cdc-wdm0 --device-open-proxy --uim-get-card-status

```

```sh
qmicli -d /dev/cdc-wdm0 --nas-get-rf-band-info

```

```sh
qmicli -d /dev/cdc-wdm0 --wds-get-current-settings

```

```sh
qmicli -d /dev/cdc-wdm0 --wds-get-packet-statistics

```

#### [MBIM](https://techship.com/support/faq/how-to-set-up-a-simple-data-connection-over-the-mbim-interface-using-libmbim-and-driver-cdc-mbim-in-linux/)

- 使用可能なすべてのオプション
```sh
mbimcli --help-all

```
- バージョン確認
```sh
mbimcli --version

```

- デバイスの機能と情報 (ファームウェアと IMEI コードなど) 
```sh
mbimcli --device=/dev/cdc-wdm0 --device-open-proxy --query-device-caps

```
- SIM カード情報
```sh
mbimcli -d /dev/cdc-wdm0 -p --query-subscriber-ready-status

```
- ネットワーク登録状態
```sh
mbimcli -d /dev/cdc-wdm0 -p --query-registration-state

```
- 接続 IP 情報
```sh
mbimcli -d /dev/cdc-wdm0 -p --query-ip-configuration=0

```

#### 確認
- SMS
```sh
sms_tool -d /dev/ttyUSB2 -j recv

```
- PING IPV4
```sh
ping -4 -I wwan0 one.one.one.one

```
- PING IPV6
```sh
ping -6 -I wwan0 one.one.one.one

```


### トラブル
- 要LTE/ 4G専用アンテナ (強度が低いと認証せず)
- wwanインターフェイスを再作成
- [スタートアップモデムリセット](https://openwrt.org/docs/guide-user/network/wan/wwan/ltedongle#troubleshooting)
```sh
sed -i "/exit 0/d" /etc/rc.local
echo "/sbin/uqmi -d /dev/cdc-wdm0 --set-device-operating-mode offline" >> /etc/rc.local 
echo "/sbin/uqmi -d /dev/cdc-wdm0 --set-device-operating-mode reset" >> /etc/rc.local 
echo "/bin/sleep 20" >> /etc/rc.local 
echo "/sbin/uqmi -d /dev/cdc-wdm0 --set-device-operating-mode online" >> /etc/rc.local 
echo "/sbin/uqmi -d /dev/cdc-wdm0 --set-autoconnect enabled" >> /etc/rc.local 
echo "/sbin/uqmi -d /dev/cdc-wdm0 --network-register" >> /etc/rc.local 
echo "exit 0" >> /etc/rc.local 

```

- opkg updateエラー対策
```sh
# wget-nossl削除
opkg remove wget-nossl

```

---

</details>

Interface
　MODEMMANAGER
 ![modemmanager.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3412833/6ab9caf7-fcb5-65df-c8bb-9156bbb79381.png)

3ginfo-lite
![3ginfo1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3412833/c1943e43-15b1-a456-9451-52126f2d3c63.png)
LTE Bands Configuration
![band.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3412833/cbbc272a-3072-ed7a-3ac7-f641826562a8.png)
ブロードバンドスピードテスト
![wwan3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3412833/df792c15-f23e-16ff-74fa-90894bd62e04.png)

:::

:::note
### デバイス更新

<details><summary>設定</summary>

[ダウンロードサイト](https://firmware-selector.openwrt.org/?version=23.05.2&target=ipq40xx%2Fgeneric&id=sony_ncp-hg100-cellular)
- [SYSUPGRADE](https://downloads.openwrt.org/releases/23.05.2/targets/ipq40xx/generic/openwrt-23.05.2-ipq40xx-generic-sony_ncp-hg100-cellular-squashfs-sysupgrade.bin)
```sh:SSH
wget /tmp/openwrt-23.05.2-ipq40xx-generic-sony_ncp-hg100-cellular-squashfs-sysupgrade.bin https://downloads.openwrt.org/releases/23.05.2/targets/ipq40xx/generic/openwrt-23.05.2-ipq40xx-generic-sony_ncp-hg100-cellular-squashfs-sysupgrade.bin
sysupgrade -v /tmp/openwrt-23.05.2-ipq40xx-generic-sony_ncp-hg100-cellular-squashfs-sysupgrade.bin

```

- [Attended Sysupgrade](https://openwrt.org/docs/guide-user/installation/attended.sysupgrade)
```sh
opkg update
luci-app-attendedsysupgrade

```

---


</details>

:::

::: note warn
### リカバリ

<details><summary>設定</summary>

[OW_sony_ncp-hg100_helios](https://github.com/himalock/OW_sony_ncp-hg100_helios?tab=readme-ov-file#%E5%BE%A9%E6%97%A7%E6%96%B9%E6%B3%95)
```sh
#!/bin/sh
echo -en '\x00' | dd of=/dev/mmcblk0p2 bs=1 count=1 seek=28 conv=notrunc
echo -en '\x00' | dd of=/dev/mmcblk0p2 bs=1 count=1 seek=48 conv=notrunc
echo -en '\x00' | dd of=/dev/mmcblk0p2 bs=1 count=1 seek=68 conv=notrunc
echo -en '\x00' | dd of=/dev/mmcblk0p2 bs=1 count=1 seek=88 conv=notrunc
echo -en '\x00' | dd of=/dev/mmcblk0p2 bs=1 count=1 seek=108 conv=notrunc
echo -en '\x00' | dd of=/dev/mmcblk0p7 bs=1 count=1 seek=28 conv=notrunc
echo -en '\x00' | dd of=/dev/mmcblk0p7 bs=1 count=1 seek=48 conv=notrunc
echo -en '\x00' | dd of=/dev/mmcblk0p7 bs=1 count=1 seek=68 conv=notrunc
echo -en '\x00' | dd of=/dev/mmcblk0p7 bs=1 count=1 seek=88 conv=notrunc
echo -en '\x00' | dd of=/dev/mmcblk0p7 bs=1 count=1 seek=108 conv=notrunc

```

---

</details>

:::

::: note alert
### トラブル

<details><summary>詳細</summary>

[デバイスは OpenWRT を USB から起動しますが、eMMC からは起動しません / ネットワーク インターフェイスが起動しません](https://openwrt.org/inbox/toh/google/onhub_tp-link_tgr1900#device_will_boot_openwrt_from_usb_but_not_from_emmcnetwork_interface_never_comes_up)
```
dd if=/dev/zero bs=512 seek=7552991 of=/dev/mmcblk0 count=33
dd if=/dev/zero bs=1M of=/dev/mmcblk0

```
- [bootm使用時はbootargs-append使ってくれなくて罠るので適宜書き換えか消したほうがいい](https://himahima.ldblog.jp/archives/57666526.html)

- タッチセンサーの配線を外すとこうなる
![sony.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3412833/626b8839-a9b5-39a7-8c85-e0d7551b3ce2.png)

---

</details>

:::

# 参考
:::note
### U-BOOT

<details><summary>設定</summary>

U-BOOT確認
```
printenv
```

初期値
```
set bootcmd bootipq
set ipaddr 192.168.132.1
set serverip 192.168.132.100
saveenv
```

消去
```
setenv bootargs 
setenv bootcmd
setenv ipaddr
setenv serverip
setenv bootfile
saveenv
```
[ブートローダー (U-Boot) 仕様](https://manual.atmark-techno.com/armadillo-610/armadillo-610_product_manual_ja-1.3.0/ch09.html)
[U-BOOTユーザーズマニュアル](http://www.mlb.co.jp/u-boot/files/mini-itx/u-boot-0229.pdf)
[U-Boot コマンドの使用](http://www.u-boot.jp/download/Documents/uboot-commands.pdf)
[NCP-HG100 調査中](https://ohayoyogi.hatenablog.com/entry/2020/12/05/132313)

---

</details>

:::
::: note
### USB2.0化

<details><summary>設定</summary>

[NCP-HG100 LTEモデムクラッシュのソフト的な対処](https://firejp.com/2021/08/24/post-665/)
- [ncp-hg100_hs_patch](https://firejp.com/wp-content/uploads/2021/08/ncp-hg100_hs_patch.zip)

```sh
echo -n "2-1" > /sys/bus/usb/drivers/usb/unbind
devmem 0x08a0c2c0 32 0x830E0002

```

---

</details>

:::

::: note
### [URoad-Home2+にLTEモジュール(T77W676)を搭載してみた](https://unagidojyou.com/2024/03-12/setting_up_t77w676_with_uroad-home2/)
T77W676の流用でこんな面白い事をしている方が居ました

:::

:::note
### SDカードスロットRAID（モデム排他交換）

<details><summary>設定</summary>

- デバイスID: 058f:6465
製造元: Alcor Micro Corp.
USB 2.0接続(多分)

![61xjW5A1EoL._AC_SL1500_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3412833/5d58be95-3cc4-5cca-b241-c780ee7d5283.jpeg)

![IMG_4077.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3412833/63eb8a72-526e-3754-b550-3c20729ed75f.jpeg)

※カードの幅がほんの少しモデムカードより広いので、モデムカバーのガイドレールを引っ剥がす（マイナスドライバーなどでこじると剥がせる）

### RAID

SAMBA4
![CrystalDiskMark_20250122224904.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3412833/778f1681-8544-997e-6757-d79571482cf0.png)

```sh
opkg update
opkg install kmod-usb-storage
opkg install mount-utils
opkg install kmod-scsi-core
opkg install kmod-scsi-generic
opkg install parted
opkg install e2fsprogs
opkg install kmod-fs-ext4
opkg install mdadm
# opkg install hdparm
```

```sh
ls /dev/sd*
```

sdaとsdbをフォーマット及びマウント
```sh
SD=a
parted /dev/sd${SD}
```
```sh
mklabel gpt
```
```sh
mkpart ext4 0% 100%
```
```sh
set 1 raid on
```
```sh
p
```
```sh
q
```
md0をRAID1でマウント
```sh
mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1
```
確認
```sh
mdadm --detail /dev/md0
```
```sh
mkfs.ext4 /dev/md0
```
```sh
mount -t ext4 /dev/md0 /mnt/md0
```
同期確認
```sh
cat /proc/mdstat
```
速度測定
```sh
hdparm -tT /dev/md0
```

---

</details>

:::

# あとがき
先輩方の記事で十分事足りるので、正直だいぶ手抜きな備忘録となった
未使用品も格安で手に入る
シリアル接続は初心者の方には少し敷居が高いと感じるかもしれませんが、
初めてチャレンジしたが、一度やってみると思った程難しくは無かった

安定稼働中

~~検証（遊び）でRAIDを組んでみたが、なんか遅い・・・~~ << 同期中だった

# 参考資料（感謝:relaxed:）
### [OpenWRTでmdadmを使用したソフトウェアRAIDを組む](https://unagidojyou.com/2023/12-04/mdadm_on_openwrt/)