- Với mục tiêu tạo ra một chiếc máy tính tối giản có thể tự lắp ráp tại nhà, hệ thống 8MB RAM và hiệu năng cỡ 1 MIPS chạy được Debian Linux, vi, gcc và make đã được hiện thực chỉ bằng các linh kiện 8 chân
- Bo mạch hoàn chỉnh gồm STM32G031, 8MB SPI PSRAM và cầu nối USB-serial PL2303GL, tổng cộng 3 chip; do giới hạn gói 8 chân nên chỉ dùng được 6 chân I/O
- Thiếu chân là bài toán khó cốt lõi của thiết kế: RAM dùng SPI thường, thẻ SD dùng 1-bit SDIO chia sẻ chân với RAM, còn truyền UART được xử lý bằng bit-banging
- Phần mềm tái sử dụng trình giả lập MIPS hiện có viết bằng hợp ngữ ARMv6M, và bootloader 8KB cập nhật firmware từ tệp FIRMWARE.BIN trong hệ thống tệp FAT trên thẻ SD
- STM32G031 được ép xung vượt mức 64MHz chính thức bằng thiết lập VOS0; với CPU chủ 148MHz, máy đạt mức tương đương MIPS R3000 khoảng 1.65MHz và khởi động Debian trong khoảng 1 phút
Máy tính Linux tối giản làm chỉ bằng chip 8 chân
- Mục tiêu là tạo ra một máy tính hiện đại dạng kit có thể dễ dàng tự lắp ở nhà chỉ bằng các chip 8 chân
- Tiêu chí tối thiểu của một máy tính hiện đại được đặt là có thể chạy Debian Linux, vi, gcc và make
- Dựa trên các thử nghiệm trước đó, cấu hình tối thiểu để chạy Linux được xác định là 8MB RAM và CPU 1 MIPS
- Thiết bị lưu trữ dùng thẻ SD, còn kết nối console dùng USB-serial
- Bo mạch có dạng tròn nhỏ, phía trên có đầu nối USB-C ở cạnh bo
- Số lượng linh kiện và số chân được giảm để cả người gần như không có kinh nghiệm hàn cũng có thể lắp bằng mỏ hàn 45W
Lựa chọn linh kiện
- PL2303GL được chọn cho kết nối USB
- Đây là cầu nối USB-serial hoạt động không cần linh kiện ngoài, đồng thời cung cấp đầu ra ổn áp 3.3V 100mA
- Có driver cho các hệ điều hành phổ biến, còn trên macOS cần cài từ App Store
- Một phương án khác là triển khai USB bằng ATTINYx5 và V-USB
- Theo đặc tả, USB low-speed không được dùng bulk endpoint, nhưng các hệ điều hành lớn không ép buộc điều này nên việc triển khai cổng serial ACM vẫn hoạt động
- V-USB tiêu tốn nhiều thời gian CPU, flash và RAM nên là gánh nặng cho dự án này
- RAM dùng SPI PSRAM dạng SOIC-8
- ISSI, APMEMORY, Vilsion và một số hãng khác có sản xuất linh kiện liên quan, còn loại 8MB có thể mua từ các kênh phân phối thông thường
- Chip 16MB từng được nhiều hãng hứa hẹn nhưng được đánh giá là chưa thực sự có nguồn cung
- Vi điều khiển được so sánh giữa các dòng PIC16F, RL78, PSoC1, eZ8, S08CPUv2, STM8, MSP430, AVR, PSoC4, MSPM0C, CH32V003, CH570E và STM32G0
- Lựa chọn cuối cùng là dòng STM32G031J4M6/STM32G031
- Cung cấp lõi Cortex-M0+, xung chính thức 64MHz, 32KB flash và 8KB RAM
- Trong gói 8 chân, nó có lợi thế hơn các ứng viên khác về hiệu năng và bộ nhớ
- Dù chất lượng tài liệu errata của chip STM gây lo ngại, thiết kế này hầu như không dùng ngoại vi on-chip nên vẫn có thể chọn
Thiết kế phần cứng nhét vào 6 chân I/O
-
UART console
- UART RX và TX khó kết hợp với chức năng khác
- Nếu chia sẻ RX, dữ liệu nhận có thể bị bỏ lỡ khi đang thực hiện tác vụ khác; nếu chia sẻ TX, ngay cả xung low ngắn cũng có thể bị PC hiểu thành ký tự
- Vì vậy, 2 trong 6 chân I/O được dành cho UART console
- Ở bố trí chân cuối cùng, chân 8 được dùng làm USART2 RX, còn chân 7 truyền UART bằng bit-banging
- Trong lúc truyền UART, toàn bộ việc thực thi bị dừng nên tốc độ 115,200bps nhanh nhất có thể đã được dùng
- Mỗi ký tự mất khoảng 87 micro giây để truyền, và vì bo mạch không xuất dữ liệu trong phần lớn thời gian nên cách này được xem là chấp nhận được
-
Kết nối RAM
- SPI PSRAM hỗ trợ QSPI, nhưng QSPI cần 6 chân nên không thể dùng
- dual-SPI có thể nhanh gấp đôi SPI thường mà không cần thêm chân, nhưng STM32G031 không hỗ trợ dual-SPI
- Ngay cả khi bit-bang dual-SPI bằng CPU, cũng khó vượt qua được tổ hợp SPI phần cứng và DMA
- Kết quả là RAM được nối bằng SPI thường, và riêng kết nối này đã dùng hết 4 chân còn lại
-
Kết nối thẻ SD
- Nếu dùng thẻ SD ở chế độ SPI thì cần thêm một chân chip select, nhưng không còn chân trống
- Cách đảo RAM nCS bằng inverter để dùng làm SD card nCS gặp lỗi với một số thẻ và còn cần thêm linh kiện
- Cách chia sẻ chân UART TX làm SD card nCS kèm bộ lọc thông thấp cũng đã được xem xét, nhưng sẽ cần UART dưới 300bps và dễ lỗi khi thẻ SD chậm
- Giải pháp cuối cùng là tự triển khai giao thức 1-bit SDIO của thẻ SD
- RAM nCS được chia sẻ làm SD CLK, RAM CLK thành SD CMD, và RAM MOSI thành SD DAT
- Truy cập RAM trông như trạng thái 1 bit idle đối với thẻ SD, còn truy cập SD thì với RAM chỉ như việc lặp lại chọn và bỏ chọn nên hoạt động an toàn
- Tuy nhiên, không thể xen truy cập RAM vào giữa giao dịch SD, nên không thể dùng đọc/ghi multi-block
- Do bố trí chân của STM32G031 không cho phép dùng phần cứng SDIO, toàn bộ truy cập SD đều được bit-bang
- Bản triển khai bằng hợp ngữ đạt thông lượng khoảng 14 chu kỳ CPU/bit
Bootloader và luồng khởi động Linux
-
Trình giả lập
- Tái sử dụng trình giả lập MIPS từ dự án LinuxCard
- Trình giả lập được viết bằng hợp ngữ ARMv6M và có thể khởi động Linux
- Để chạy nhanh hơn, một JIT MIPS-to-ARMv6M cũng đã được viết, nhưng kích thước mã lên tới 46KB nên quá lớn, và lợi ích tốc độ từ bộ nhớ đệm chuyển đổi 6KB cũng không đủ nên không dùng
- 32KB flash của STM32G031 được chia thành bootloader 8KB và mã chính 24KB
-
Bootloader cập nhật firmware
- Vì không thể chừa chân debug nên cần một bootloader cập nhật firmware từ thẻ SD
- Bootloader chứa driver SDIO, driver hệ thống tệp FAT, mã ghi flash, logging và mã truyền UART bit-banging
- Kích thước thực tế khoảng 6.5KB nhưng do đơn vị khối flash nên dùng vùng 8KB
- Nó tìm FIRMWARE.BIN trên thẻ SD và áp dụng cập nhật khi vượt qua kiểm tra cơ bản và thỏa điều kiện tăng phiên bản
- Từ word tại offset 16 của ảnh ứng dụng được dùng làm số phiên bản
- Byte tại offset 8 của bootloader là phiên bản bootloader, ngoài việc hiển thị khi khởi động ứng dụng chính thì không được dùng cho việc khác
- Bootloader cũng tìm tệp hoặc thư mục trong hệ thống FAT có tên bắt đầu bằng CLOCK
- Phần số theo sau được dùng làm xung nhịp cho ứng dụng chính; nếu không có giá trị hoặc nằm ngoài dải 32–200MHz thì dùng 132MHz
-
Phân vùng thẻ và nạp kernel
- Luồng khởi động được tổ chức tương tự quá trình khởi động PC
- Sector đầu tiên của thẻ SD được đọc vào đầu RAM rồi nhảy tới đó
- Mã giai đoạn đầu tìm phân vùng kiểu 0xBB, nạp nó vào 0x80001000 rồi nhảy tiếp
- Bootloader giai đoạn hai mount phân vùng được đánh dấu active dưới dạng FAT16 và nạp tệp VMLINUX dưới dạng ELF
- Dòng lệnh kernel được nhúng sẵn trong bootloader
- root là
/dev/pvd3, còn init là/sbin/uMIPSinit /dev/pvd1được thử mount thành/boot- Thứ tự phân vùng của dự án là phân vùng FAT, phân vùng bootloader và rootfs
- Windows và macOS sẽ mount phân vùng đầu tiên, nên có thể dễ dàng chép thêm hoặc lấy bớt tệp qua phân vùng FAT
- Trong Linux sau khi khởi động, phân vùng đó cũng hiện là
/boot
Hiệu năng và ép xung
- Tốc độ hoạt động chính thức của STM32G031 là 64MHz, nhưng đã thử xung cao hơn bằng thiết lập điện áp nội bộ
- Tài liệu của STM có các thiết lập VOS2 1.0V và VOS1 1.2V; với VOS1, độ ổn định giảm khi vượt khoảng 75MHz
- Khi dùng thiết lập VOS0 1.35V xuất hiện trong tài liệu cũ và tài liệu chip tương tự, dư địa ép xung tăng lên đáng kể
- Phần lớn chip chạy tốt ở 136MHz, và một số đạt tới 180MHz
- Vì bộ nhớ flash không tự nhanh hơn nên cần quản lý đúng flash wait states
- Với CPU chủ 148MHz, CPU MIPS được giả lập có hiệu năng tương đương khoảng MIPS R3000 1.65MHz khi FPU bị vô hiệu hóa
- Hệ thống khởi động trong khoảng 1 phút, và chạy được vi, make, objdump, gcc
- Vì là một hệ Debian đầy đủ, có thể chép các gói
.debvào/bootrồi cài đặt
Lắp ráp và chạy lần đầu
-
Quy trình lắp ráp
- Các tệp thiết kế được cung cấp để có thể tự làm bo mạch, và hiện đang tìm công ty bán kit
- Trình tự lắp là socket thẻ SD, tụ điện, điện trở, STM32G031, rồi PL2303GL
- Ban đầu không gắn R101, R102, R201, R202
- Trước hết cần nạp bootloader vào STM32
- Nối tắt R101 và R201 để tạo đường serial cho ROM bootloader
- Thực hiện bước này khi chưa cắm thẻ SD và cũng chưa hàn chip RAM
- Sau khi nạp bootloader, bỏ cầu nối R101/R201 và nối tắt R102/R202
- Sau đó hàn chip RAM APS6408 hoặc VTI7064 vào vị trí U2 là hoàn tất phần cứng
-
Firmware và lần khởi động đầu
- Thẻ SD cần tối thiểu 1GB, và sẽ được ghi bằng ảnh đĩa cung cấp sẵn
- Ảnh này gồm bootloader MIPS giai đoạn 1, bootloader MIPS giai đoạn 2, một phân vùng chứa nhân Linux và bản sao firmware, cùng Debian rootfs
- Đặt FIRMWARE.BIN vào phân vùng FAT thì bootloader sẽ tự flash ở lần khởi động đầu tiên
- Terminal serial được đặt ở 115,200bps, 8N1
- Ở lần chạy đầu, fuse của STM32 sẽ được lập trình và có thể phải rút rồi cắm lại cáp USB-C
- Sau khoảng 20 giây, thông báo khởi động kernel Linux bắt đầu xuất hiện, và toàn bộ quá trình boot mất khoảng 1 phút
- Vì chỉ có 8MB RAM, lệnh đầu tiên được khuyến nghị mạnh là
swapon /swapfile - Việc bật swap mất vài chục giây, nhưng sau đó có thể chạy thêm nhiều chương trình hơn
Tệp tải về và cách dùng
- Tải xuống chính là uMIPS.8PL.zip
- Gói nén chứa các tệp cần thiết để chế tạo và chạy bo mạch
schematics: sơ đồ mạchgerbers: tệp Gerber để sản xuất bo mạchsrcs: mã nguồn trình giả lập và bootloaderbinaries/SD.img: ảnh để ghi vào thẻ SDBOOTLOADER.BIN: bootloader để nạp vào chip trong quá trình lắp rápFIRMWARE.BIN: ảnh firmware dựng sẵn
- Sau khi khởi động, shell mặc định là
sh, và cũng có thể chạybash - Để tránh thiếu RAM, nên bật swapfile có trong ảnh bằng
swapon /swapfile - Giả sử MCU chạy ở 120MHz thì tốc độ CPU hiệu dụng vào khoảng 1.5MHz
- Việc biên dịch một chương trình C đơn giản bằng gcc mất vài phút nhưng vẫn hoạt động
- Ví dụ đi kèm có trình tạo Mandelbrot dùng số thực dấu phẩy động và số cố định, ở cả dạng mã nguồn lẫn nhị phân
- Các công cụ được cài sẵn gồm vim, make và gcc; có thể thêm gói Debian qua phân vùng FAT16 dùng chung trên thẻ SD
1 bình luận
Các ý kiến trên Hacker News
Phần sau khi cân nhắc xem chân nào có thể gộp với ba chân của SDIO, giải pháp dùng nCS của RAM làm CLK của thẻ SD, CLK của RAM làm CMD của thẻ SD, và MOSI của RAM làm DAT của thẻ SD đúng là một màn hack tuyệt vời
Khi xét các tương tác có thể có với từng thiết bị, việc nó có thể hoạt động an toàn cũng rất thuyết phục, và hoàn toàn xứng đáng xuất hiện trên Hacker News
Mỗi khi thấy việc dùng một chip riêng để kết nối với USB trở thành lựa chọn mặc định thì luôn hơi tiếc
USB là một giao thức quá phức tạp, nên nếu vượt quá mức V-USB cơ bản để chạy USB 1.1 tốc độ thấp thì nhìn chung khó làm nếu không có phần cứng chuyên dụng và một stack phần mềm khá lớn
Ngược lại SPI đơn giản đến mức khó tin; phần cứng tối thiểu cần có chỉ cỡ một thanh ghi dịch có thể nhận xung clock đủ nhanh
Thật nhớ thời các máy tính để bàn và laptop cũ còn có cổng serial/parallel lộ ra ngoài để có thể giao tiếp ở mức thấp như vậy
Nếu các thiết bị ngoại vi đơn giản dùng UART, I2C, SPI multidrop trong khoảng cách ngắn với vài mức clock chuẩn và một đầu nối duy nhất, còn các thiết bị nhiều dữ liệu như màn hình hay ổ đĩa ngoài thì chuyển thẳng sang IEEE 802.3 Ethernet, có lẽ ta đã chỉ cần hỗ trợ liên kết Ethernet thay vì phải hỗ trợ riêng cả USB lẫn Ethernet
SPI không xét đến nhiều tiện ích mà USB cung cấp như cấp nguồn, hot-plug, phát hiện thiết bị, lỗi bit
Việc nhà phát triển phần mềm hiểu các quán dụng SPI và cách các nhà thiết kế phần cứng dùng SPI là có giá trị
Thông thường SPI được dùng để ghi các thanh ghi của thiết bị ngoại vi, và có bản chất khác với kiểu giao tiếp bất đồng bộ cấp cao thường thấy ở USB hoặc Ethernet cùng các tầng trừu tượng phía trên
Không có chuẩn phổ quát cho frame SPI, nhưng có các mẫu dùng theo thói quen, và chừng đó đã đủ cho vô số ứng dụng
Trên thực tế, các giao thức đơn giản như SPI và I2C là không đủ
Chúng không nhanh, dùng tín hiệu single-ended nên rất nhạy với nhiễu, và cũng không có sửa lỗi
Các giao thức này rất phù hợp với mục đích dự kiến của chúng, tức kết nối các IC với nhau trên PCB, nhưng nếu đưa một cổng không có termination ra bên ngoài thì khó bảo đảm được điều gì
Ngay cả trên PC hiện đại, các giao thức này và biến thể của chúng vẫn được dùng nhiều, nhưng chỉ là bus nội bộ
Tôi chưa xem kỹ đặc tả USB, nhưng vấn đề chính của bit-banging có lẽ là tốc độ yêu cầu
Vì vi điều khiển không đủ nhanh để vừa toggle chân, vừa giải mã giao thức và quản lý sửa lỗi, nên cần phần cứng chuyên dụng
Bit-banging I2C cũng có thể gặp vấn đề tương tự
Với CPU 20MHz, clock tối đa có thể đạt được khoảng 250KHz, chỉ nhỉnh hơn một nửa so với tốc độ tối đa phổ biến 400KHz, còn phiên bản 1MHz thì về cơ bản là bất khả thi
PHY tồn tại vì chuyển giao thức truyền thông sang phần cứng rẻ hơn áp đảo
Nếu không, bạn phải chọn CPU mạnh hơn rất nhiều để có tài nguyên quản lý truyền thông thủ công, và đó là lý do các vi điều khiển hiện đại có phần cứng cho I2C, SPI và truyền thông serial
Kết luận là các giao thức serial đơn giản như SPI, I2C, UART là lựa chọn rất tệ cho thiết bị ngoại vi bên ngoài
Chúng khó chạy ở tốc độ phù hợp và không chịu được cáp dài cùng nhiễu
Dù có thể xem RS-232 là ngoại lệ vì nó không phải UART, bản chất và thiết kế của các giao thức này không cho phép dùng theo cách đó; nếu sửa đặc tả để hỗ trợ kiểu dùng này thì rốt cuộc cũng là phát minh lại USB
Biển chỉ dẫn hoặc màn hình TV cho phòng họp cũng thường cung cấp RS-232 để điều khiển linh hoạt hơn HDMI-CEC
Nhiều trường hợp không cần bitrate cao hơn 9600bps, và đầu nối phổ biến nhất là terminal vít 3 chân gồm Tx, Rx, GND
Các hệ thống lắp đặt ngày nay thường có ít nhất một bộ chuyển RS232-USB ở đâu đó, còn trong phòng lớn thì bridge RS232 qua Ethernet
Lúc mới vào lĩnh vực này tôi thấy khá bất ngờ, nhưng nghĩ đến việc nhiều hệ thống đã tồn tại hàng chục năm và các thành phần được thay từng món một thì cũng dễ hiểu
Con chip này có giá khoảng 0,10 USD, với 2KB RAM, 16KB Flash, 48MHz, chạy 1 CPI
CH570 mới cũng khoảng 0,10 USD ở SOIC8, nhưng có 100MHz, 16KB RAM, 256KB Flash, USB và cả radio gói 2.4GHz; tôi đã đặt mua board phát triển
Sẽ tốt nếu ghi thêm độ dày PCB cần thiết cho những ai muốn tự làm board
Nếu tôi nhớ đúng thì khoảng 0,8mm, và “đầu nối cạnh USB-C” cần độ dày đó để vừa với phích cắm
Bài viết rất hay, nhưng tôi cũng tò mò liệu mọi thứ có đơn giản hơn nhiều nếu yêu cầu 8 chân được nới lỏng một chút hay không
Chỉ cần thêm vài chân có lẽ độ phức tạp của dự án đã giảm mạnh, còn thời gian hàn chỉ tăng rất ít
Có nhiều chip nhanh hơn nhiều với USB tích hợp
Allwinner V3s cũng có thể hàn tay, có RAM tích hợp và boot Linux native rất tốt
RP2350 cũng là một lựa chọn tốt, có giao diện QSPI RAM xuất sắc với cache tích hợp và hỗ trợ USB
Gần như là một dự án chỉ dùng 2 chip
Một chip chỉ là IC USB-nối tiếp, và nếu không tính thẻ SD thì tính cả thẻ SD vào lại thành 3 chip
Tổng số chân ít đến mức khiến người ta muốn thử làm theo kiểu dead bug
Bộ chuyển microSD sang SD khá hữu dụng như một giá đỡ microSD có thể hàn được
Thực hiện một trò tương tự nhắm vào nó chắc cũng sẽ là một pha hack thú vị
Về mặt kỹ thuật thì đây là một dự án rất tuyệt, nhưng có vẻ đã đi tới mức cực đoan, hơi lệch khỏi mục tiêu tạo ra một bộ kit máy tính mới cho người mới bắt đầu
Với người mới, việc hàn SOIC8 hay hàn SOIC28 không khác nhau nhiều
Có thể coi SOIC28 cũng dễ hoặc khó như SOIC8
Nếu dùng chip lớn hơn, có thể thêm âm thanh tối thiểu, bàn phím, và về sau thậm chí cả đầu ra màn hình thật kiểu VGA, khiến nó trở thành một máy tính hữu ích hơn nhiều
Độ khó hàn gần như không tăng, đồng thời tạo nền tảng tốt để người dùng có hứng thú mở rộng
Nếu muốn làm theo hướng đó thì có thể dùng mã của tôi
Tôi làm như vậy vì thấy ràng buộc nhân tạo 8 chân thú vị
Tự nhiên có một thôi thúc kỳ lạ muốn bỏ cả bo mạch và làm nó thành tác phẩm điêu khắc mạch điện
Tôi không phải nghệ sĩ hay nhà điêu khắc nên không dám thử
Nếu dùng SPI Flash 8 chân thay cho thẻ SD làm thiết bị lưu trữ thì có vẻ dễ thương
Bạn nói “vì lý do cá nhân mà bị dị ứng với RISC-V”, tôi tò mò lý do là gì
Tôi không muốn khơi mào một cuộc tranh cãi nảy lửa; đây chỉ là ý kiến cá nhân, nhưng là một ý kiến khá mạnh
RISC-V được thiết kế đủ muộn trong lịch sử để có thể tận dụng rất nhiều tri thức sẵn có, nhưng theo tôi nó hầu như đã không tận dụng chúng
Vì vậy, nhiều phần mở rộng đang được đề xuất để sửa những thứ lẽ ra phải được làm đúng ngay từ đầu
Khi ngày càng có thêm các phần bổ sung, phải đến 10 năm sau nó mới dần tiến gần tới một hình thức có lý hơn
Tôi cũng không chấp nhận lời biện minh rằng cần có một quá trình học hỏi
Thông tin cần thiết đã có ngay từ đầu, và các sai lầm cũng rõ ràng với hầu hết chúng ta
Một số phần mở rộng chỉ là miếng băng dán lên các vấn đề thiết kế căn bản
Ví dụ shadd2 là một miếng băng dán để vá vấn đề không có chế độ định địa chỉ đúng nghĩa cho truy cập mảng
Câu trả lời phổ biến cho việc này là hứa hẹn sự hợp nhất lệnh kỳ diệu bên trong lõi, điều thường được hứa nhưng thực tế không được cung cấp
Đặc biệt càng không có trên các bộ xử lý giá rẻ, vốn dường như là mục tiêu duy nhất của RISC-V
Việc thiếu lệnh trích xuất và chèn bitfield cũng là một sai lầm nghiệp dư, nên cũng có phần mở rộng để sửa nó
Nhưng ngay từ đầu lẽ ra đã phải rõ ràng rằng cần có những chức năng như vậy
Lệnh rẽ nhánh có điều kiện dựa trên một bit cụ thể trong thanh ghi cũng xuất hiện rất thường xuyên, nên đây là chức năng hiển nhiên đáng lẽ phải được cân nhắc từ đầu
Chỉ cần phân tích một chút phần mềm hiện đại là đã thấy điều đó
Điều gây bực mình là thông tin đó vốn đã có sẵn
Người ta đã biết phần mềm hiện đại làm những gì, nhưng tất cả đều bị phớt lờ, và kết quả theo tôi là chúng ta nhận được một MIPS-1 được cập nhật nhẹ
Giờ đây, khi hàng đống phần mở rộng được gắn thêm, tình trạng phân mảnh đã trở nên nghiêm trọng
Có thể nhắm tới một kết quả cuối cùng phần nào hợp lý như RV23, nhưng không có phần cứng nào triển khai nó; nếu không thì phải nhắm tới mẫu số chung nhỏ nhất, chạy ở mọi nơi nhưng hoạt động tệ hại
Khi cố dùng RISC-V cho điện toán hiệu năng cao thực sự thì còn có các vấn đề thiết kế nghiêm trọng hơn, nhưng tôi sẽ để dành chuyện đó cho bài rant tiếp theo
Một tập lệnh khác được thiết kế vào khoảng cùng thời kỳ đã thực sự tận dụng hiểu biết về diện mạo của phần mềm hiện đại, và kết quả đã thể hiện rõ: aarch64
Bản thân dự án đã rất tuyệt, nhưng trang này cũng là một tài liệu xuất sắc để tìm thông tin về các vi điều khiển nhỏ
Dòng WLCSP thì không có, nhưng nó cũng dẫn tới trang trình giả lập MIPS cho ARM https://dmitry.gr/?r=05.Projects&proj=33.%20LinuxCard, trông khá thú vị