2025年5月16日 星期五

SD 卡測試

在網路上購買的便宜裸裝 TF 卡,容量 32GB,一片只要 50元,大約是便宜的威剛同容量的 TF 卡的一半價格。


nexby,沒聽過的品牌,made in Taiwan,好像還不錯。

但是先前曾在淘寶買便宜的 TF卡,結果根本不能用。這次只敢買 3片,湊成免運。等確定可用再多買。

測試軟體,F3 (Fight Flash Fraud or Fight Fake Flash) ,可參考 f3read 及 f3write 指令說明。

安裝

-----------
$
 yay -Ss f3 
aur/f3 9.0-1 (+119 1.49) 
    Simple tool that tests flash cards capacity and performance to see if they live up to claimed specifications

$ yay -S f3
-----------

測試

-----------
# f3write /mnt/sd
F3 write 9.0
Copyright (C) 2010 Digirati Internet LTDA.
This is free software; see the source for copying conditions.

Free space: 28.49 GB
Creating file 1.h2w ... OK!                         
Creating file 2.h2w ... 5.93% -- 17.63 MB/s -- 42:07
.....
Creating file 28.h2w ... OK!                         
Creating file 29.h2w ... OK!                        
Free space: 16.00 MB
Average writing speed: 12.23 MB/s

# f3read /mnt/sd
F3 read 9.0
Copyright (C) 2010 Digirati Internet LTDA.
This is free software; see the source for copying conditions.

                  SECTORS      ok/corrupted/changed/overwritten
Validating file 1.h2w ... 2097152/        0/      0/      0
Validating file 2.h2w ... 2097152/        0/      0/      0
Validating file 3.h2w ... 7.50% -- 18.15 MB/s -- 24:26
....Validating file 27.h2w ... 2097152/        0/      0/      0
Validating file 28.h2w ... 2097152/        0/      0/      0
Validating file 29.h2w ...  999072/        0/      0/      0

  Data OK: 28.48 GB (59719328 sectors)
Data LOST: 0.00 Byte (0 sectors)
       Corrupted: 0.00 Byte (0 sectors)
Slightly changed: 0.00 Byte (0 sectors)
     Overwritten: 0.00 Byte (0 sectors)
Average reading speed: 18.30 MB/s

-----------

測試結果比較 (2025年 5月)

1) 二手 innodisk 宜鼎工程用 8GB MLC長效記憶卡 
  => Average writing speed: 6.87 MB/s,Average reading speed: 15.66 MB/s

2) ADATA 32GB,A1 / V10
Average writing speed: 10.96 MB/s,Average reading speed: 17.09 MB/s

3) 無名 nexby 32GB,U1
Average writing speed: 12.23 MB/s,Average reading speed: 18.30 MB/s

看來便宜的無名 SD 卡表現不錯,至於工程卡,終究是早期的產品,有點慢。


2025年4月10日 星期四

Orange Pi One / Zero3 接 ILI9488 / ST7796 LCD

Linux 的 fb-tft 對 ILI9341 有完整的支援,但是解析度只有 320x240。KlipperScreen 要求的最低解析度是 480x320,若解析度低於這要求,雖然還是可以執行,但字跡會變模糊不清。

在淘寶可以找到較多人使用,480x320 的 SPI 界面 LCD,其控制晶片為 ILI9488/9486,另外則是 ST7796。因為搜尋 SPI LCD 的方案,大多會找到 ILI9488 相關的,因此先買 ILI9488 / ILI9486 來測試。很辛苦的改驅動,編譯 kernel module,最後是成功了。但是系統一更新,又變得改的程式都不能用了。

經過交叉測試,發現 Fly PI 的 LCD,使用 ST7796 控制器,用 fb_ili9341 的 driver,竟然能夠點亮,雖然顯示不正常,但可以看到在 320x240 的範圍內,正常顯示。

這表示 ST7796 可以使用 RGB565 的格式,經測試,只要把 fb_ili9341 的驅動程式的解析度改成 480x320 即可使用,幾乎完全不用改到程式的其他部分。

淘寶買 ili9488 的 LCD,用 fb_ili9341 的驅動程式來改,只會一片白屏。使用 fb_ili9486.c 來改,若 PIXEL_FORMAT 是 0x55,顯示一片白屏。將 PIXEL_FORMAT 是 0x66,會輸出雜亂的顯示。再加上轉換的 function,則可以成功驅動。

這類控制晶片透過 SPI 界面串列的傳送視訊資料,為了減少資料量,一個畫素 (pixel) 通常用 RGB565 或 RGB666 的格式。RGB565 為 R: 5bits, G: 6bits, B:5bits,共 16bits,傳送時,一個畫素佔 2bytes。RGB666 為 R: 6bits, G: 6bits, B:6bits,共 18bits ,傳送時,一個畫素佔 3bytes。相同的頻寬,後者可傳送的資料量只剩 2/3。

ILI9488 / ILI 9486,確定只能使用 RGB666 的格式。因此,較佳的選擇是買 ST7796 控制的 LCD。但 ILI9488 的 LCD,有較小的 3.5" 螢幕的選擇,價格更低。

參考連結

能夠找到的資訊,有的有點過時,或者,更新後,OS 版本太新,舊的方式不能用。因此雜亂地收集了一堆可能用得到的參考,等確定作法,再將沒用的刪除。

升級至最近的 kernel 6.12.30 之後,可以使用 tiny drm 的 panel-mipi-dbi-spi 模組,不用自行編譯 kernel module 了,方便很多。

SDO 和 T_DO 併聯問題

LCD 的 SDO 和觸控的 T_DO 都是接到 host 的 MISO。這兩支腳都是輸出,若將這兩支腳短路,可能會使得觸控不能運作。

將這兩支腳短路,在 ILI9341 的板子上沒問題,在 ILI9486 或 ILI9488 上,卻使得觸控不能運作。經過不斷的測試,花了好久的時間,才確認問題。

要同時驅動 LCD 和觸控,照著 ILI9341 測試成功的作法,將 SCK, SDO, SDI 三支腳都短路,然後 ILI9486 和 ILI9488 的觸控一直都沒反應。

先前因為 ads7846 驅動的設定改變,花了不少時間才解決。因而一開始也懷疑是 DTS 設定問題,或是某些 MCU 的接腳不能用。把手邊各種不同的 LCD 都拿來測試,包括 Fly Pi 的螢幕。改變各種設定,還是不能動作。

只能懷疑是 IC 壞掉,或是電阻膜被我弄壞。拿一塊新的 ILI9488,還沒把接腳短路,單獨測觸控功能,正常。但將接腳一短路,就掛了。

準備去買幾顆 IC 來換,發現 ILI9341 板子上的觸控 IC 是 XPT2046,ILI9488 板子上的觸控 IC 是 HR2046,是相容的 IC,才懷疑可能是 IC 的輸出短路造成問題。將 SDO 的短路線剪掉,測試觸控功能,OK。

LCD 沒用到 SDO,那就不要將這支腳短路吧,這樣 LCD 和觸控都正常了。

不能用的 pin

在 Orange PI Zero3,6.6.75-current-sunxi64,PC9 接腳不能用。

overlay 的改變

開始測試時,kernel 版本是 6.6.75,測試成功後。升級後,kernel 版本變 6.12.30,又變成不能驅動 LCD 了,會出現  "cannot register SPI host" 的錯誤。

---------
[    1.551842] ili9341@0 enforce active low on GPIO handle
[    1.551871] sun6i-spi 5011000.spi: cannot register SPI host
------------

經過好久,終於撈到解答。

/dts-v1/;
/plugin/;

/ {
    compatible = "xunlong,orangepi-zero3", "allwinner,sun50i-h616";

    fragment@0 {
        target = <&spi1>;
        __overlay__ {
            status = "okay";
            pinctrl-names = "default"; // new for linux 6.12
            pinctrl-0 = <&spi1_pins>;  // new for linux 6.12
            cs-gpios = <&pio 2 7 0>;  /* PC7 */

            st7796s: st7796s@0 {
                compatible = "sitronix,st7796s";
                reg = <0>;  /* Chip Select 0 */
		#spi-cs-high;
                spi-max-frequency = <40000000>;
                rotate = <180>;
                bgr = <0>;
                fps = <30>;
		width = <480>;
		height = <320>;
                buswidth = <8>;
                reset-gpios = <&pio 2 6 1>; /*RESET=PC6*/
                dc-gpios = <&pio 2 5 0>; /*DC_RS=PC5*/
                led-gpios = <&pio 2 8 0>; /*LED=PC8*/
                debug = <4>;
            };

        };
    };
};

要加上 pinctrl-names = "default"; 和 pinctrl-0 = <&spi1_pins>;





2025年4月8日 星期二

Rapide Lite 200 改 Klipper

 在網路上收的二手機。



建立及燒錄 Firmware

$ cd klipper
$ make menuconfig

[*] Enable extra low-level configuration options
    Micro-controller Architecture (Atmega AVR)
    Processor model (atmega2560)

$ make
  Creating symbolic link out/board
  Building out/autoconf.h
  Compiling out/src/sched.o
  .................
  Compiling out/src/generic/serial_irq.o
  Building out/compile_time_request.o
Version: v0.12.0-458-gd886c1761
  Linking out/klipper.elf
  Creating hex file out/klipper.elf.hex
$ make
$ make flash FLASH_DEVICE=/dev/serial/by-id/usb-RRD__www.ru_RUMBA_-_ATmega_2560_co_55437333437351B0A120-if00 

重新啟動系統。

2025年2月21日 星期五

LCD debug

9341 正常的訊息 

-----------
[    1.664021] ili9341@0 enforce active low on GPIO handle
[    6.580043] fb_ili9341: module is from the staging directory, the quality is 
unknown, you have been warned.
[    6.580648] fb_ili9341 spi0.0: fbtft_property_value: width = 240
[    6.580674] fb_ili9341 spi0.0: fbtft_property_value: height = 320
[    6.580685] fb_ili9341 spi0.0: fbtft_property_value: buswidth = 8
[    6.580697] fb_ili9341 spi0.0: fbtft_property_value: debug = 4
[    6.580706] fb_ili9341 spi0.0: fbtft_property_value: rotate = 90
[    6.580716] fb_ili9341 spi0.0: fbtft_property_value: fps = 30
[    6.580973] fb_ili9341 spi0.0: fbtft_request_one_gpio: 'reset' GPIO
[    6.581032] fb_ili9341 spi0.0: fbtft_request_one_gpio: 'dc' GPIO
[    6.581067] fb_ili9341 spi0.0: fbtft_request_one_gpio: 'rd' GPIO
 ........... 一直重複 -----------
[    6.581590] fb_ili9341 spi0.0: fbtft_request_one_gpio: 'db' GPIO
...
[    6.887247] fb_ili9341 spi0.0: Display update: 3837 kB/s, fps=0
[    6.888155] Console: switching to colour frame buffer device 40x30
[    6.888772] graphics fb0: fb_ili9341 frame buffer, 320x240, 150 KiB video memory, 16 KiB buffer memory, fps=31, spi0.0 at 40 MHz
[    6.999727] systemd[1]: Starting systemd-backlight@backlight:fb_ili9341.service - Load/Save Screen Backlight Brightness of backlight:fb_ili9341...
[    7.003913] systemd[1]: Finished systemd-binfmt.service - Set Up Additional Binary Formats.
[    7.023356] usb 2-1: Firmware revision 11.1 (signature 0x88e1)
[    7.080231] systemd[1]: Finished systemd-backlight@backlight:fb_ili9341.service - Load/Save Screen Backlight Brightness of backlight:fb_ili9341.

--------------

使用 lsmod 

-------------
Module                  Size  Used by
fb_ili9341             12288  1
fbtft                  36864  1 fb_ili9341
-------------


https://mjmwired.net/kernel/Documentation/devicetree/bindings/display/ilitek,ili9486.yaml

參考 Using GPIO from a Linux Shell

--------------
$ dmesg | grep -i ads
[    7.067079] ads7846 spi0.1: supply vcc not found, using dummy regulator
[    7.072789] ads7846 spi0.1: touchscreen, irq 47
[    7.073534] input: ADS7846 Touchscreen as /devices/platform/soc/1c68000.spi/spi_master/spi0/spi0.1/input/input1

$ cat /proc/interrupts | grep ads
 47:         22          0          0          0  sunxi_pio_edge   6 Edge      ads7846

$ sudo gpiodetect
gpiochip0 [1c20800.pinctrl] (224 lines)
gpiochip1 [1f02c00.pinctrl] (32 lines)

$ sudo gpioinfo
gpiochip0 - 224 lines:
line   0:      unnamed       unused   input  active-high 
.....
line   5:      unnamed       unused   input  active-high 
line   6:      unnamed    "pendown"   input   active-low [used]
line   7:      unnamed        "led"  output  active-high [used]
line   8:      unnamed         "dc"  output  active-high [used]
line   9:      unnamed      "reset"  output   active-low [used]
line  10:      unnamed   "spi0 CS0"  output   active-low [used]
line  11:      unnamed       unused   input  active-high 
line  12:      unnamed       unused   input  active-high 
line  13:      unnamed       unused   input  active-high 
line  14:      unnamed       unused   input  active-high 
line  15:      unnamed "orangepi:red:status" output active-high [used]
line  16:      unnamed       unused   input  active-high 
.....
line  20:      unnamed   "spi0 CS1"  output  active-high [used]
.....
line 165:      unnamed       unused   input  active-high 
line 166:      unnamed         "cd"   input   active-low [used]
        ..... 
line 204:      unnamed "usb0_id_det" input active-high [used]
line 205:      unnamed       unused   input  active-high 

--------------

https://www.kernel.org/doc/Documentation/devicetree/bindings/input/touchscreen/ads7846.txt

https://github.com/raspberrypi/linux/pull/6029 (Mar 13, 2024)

The driver has been converted to use gpiod, which will normalise polarity based on DT.

The piscreen overlay (and others) incorrectly defines the pendown GPIO as being ACTIVE_HIGH (0), althought triggering on the high-low edge for pen down. It therefore tries reading the pen position when not being touched, and stops when it is touched.

Tested with piscreen and ads7846 overlays. Also fixed on others where the interrupt says high->low but the polarity was ACTIVE_HIGH.


ADS7846 Touch controller does not work anymore after upgrade to the latest kernel 6.6.20 on 64-bit Raspberry Pi OS Bookworm. It works well with the older kernel 6.1.0.

https://github.com/raspberrypi/linux/blob/rpi-6.6.y/arch/arm/boot/dts/overlays/ads7846-overlay.dts

-----------
pendown-gpio = <&pio 0 19 0>;
line  19:      unnamed    "pendown"   input  active-high [used]

pendown-gpio = <&pio 0 19 1>;
line  19:      unnamed    "pendown"   input   active-low [used]
---------------






2025年2月16日 星期日

在 Klipper 中使用 Fly 3D 的 D5

以前買來就直接使用。最近,怎麼都連不上。比較裝置的代碼,才發現不同

 /dev/serial/by-id/usb-katapult_stm32f072xb_MELLOW-if00

燒了 Klipper 的 firmware,應是

/dev/serial/by-id/usb-Klipper_stm32f072xb_3C0029000557465036383420-if00

原來,在2024年9月1号之后出厂的D5已经刷好Katapult固件。 

照著它的文件,就可以重新設定和 build 映像檔了。

https://mellow.klipper.cn/docs/ProductDoc/MainBoard/fly-d/fly-d5/flash/usb

燒入的指令

~/katapult/scripts$ python3 flashtool.py -d  /dev/serial/by-id/usb-katapult_stm32f072xb_MELLOW-if00

喇叭要關掉,要設 default 值。


網誌存檔