Как-то в марте прошлого года я проводил генеральную уборку и нашёл у себя кучу старых сломанных одноядерных ноутбуков со сгоревшими материнскими платами. Там же были платы от разбитых телефонов и планшетов. Выкидывать было жалко, а на досках объявлений такое даже за 100 рублей никто бы не купил. Но я присмотрел среди этих плат несколько на SoC Allwinner: первый на A13, второй на A33. Изначально я думал из них сделать сервер на Linux, однако когда я зашёл на вики, глаз зацепило слово LVDS. Я сразу подумал: а что если взять один из этих мёртвых ноутбуков, снять сгоревшую мать и заменить её платой от полностью разбитого планшета? Так и родилась идея этого самодельного ноутбука.
Подбор компонентов
Цель проекта была собрать более-менее работоспособный аппарат из как можно более ненужного хлама. За основу я взял плату от планшета Oysters T74ER (маркировка платы AX3-751S-V1.5 512+4), корпус от ноутбука с матрицей от Sony view некой модели. Без нижней крышки и со сгоревшей матерью, она имеет КЗ на всевозможных линиях и не подаёт никаких признаков жизни. USB-хаб, usb-мини-клавиатура, парочка понижающих DC-DC преобразователей которые я снял со старого роутера. И всякая мелочь типа проводов, и синяя изолента – а иначе не заработает!
Подключение дисплея
Как ранее говорилось, многие SoC Allwinner имеют выход LVDS, более того он замультиплексирован с обычным параллельным RGB LCD-выходом, поэтому у производителей этих планшетов нет вариантов не вывести этот интерфейс наружу, кроме как не выводить дисплей в принципе. Но чем примечателен этот интерфейс? Тем, что он был очень популярен в старых ноутбуках и «квадратных» мониторах, которых у меня как грязи. Что нам это даёт? Чтобы подключить дисплей, нужно всего лишь правильно припаять шлейф от матрицы к LCD-выходу. Единственный нюанс заключался лишь в том куда его паять, к счастью у этих китайцев используется довольно стандартный 50-пиновый RGB-интерфейс. А схема стандартного noname-планшета лежала на том же sunxi wiki, там же даже нарисовали куда подключать LVDS.
Подсветка в этом ноутбуке «ламповая» со своим драйвером, я не стал её переделывать не на какие светодиоды:
- «Работает – не трогай»
- «Ламповая» подсветка «лампово» выглядит. Чего нет у бездушных светодиодов.
Для управления подсветкой используются стандартные LCD-BL-EN и LCD-PWM, просто соединяем соответствующие входы драйвера подсветки ноутбука.
USB
У A33 есть два usb-хоста, это usb-otg (хост и клиент) и стандартный (судя по драйверу) ehci-generic-хост. Обычно в старых китайских планшетах на allwiner’ах, а также rockchip’ах первый выводился непосредственно на microusb, а второй распаялся под отдельную платку wifi-модуля. Но в моём случае wifi esp8089 подключен по sdio, поэтому usb-хост остался не распаянным. Не долго думая как развести usb в своём ноутбуке, я решил microusb оставить не подключенным, а к не распаянному usb-хосту подключить usb-хаб и вывести его на боковые usb-порты к корпусу ноутбука, благо они были на отдельной от основной материнской платы.
Клавиатура
К сожалению, родную клавиатуру от ноутбука так просто не подключишь, (в данном случае у меня её даже не было). Поэтому почти единственным доступным способом будет подключение usb-клавиатуры. Но обычная полноразмерная клавиатура не подойдёт, нужна маленькая и тонкая, которая влезет в корпус. К счастью, такая у меня нашлась.
Разводка питания
Разные компоненты требуют разного питающие напряжения. Например, для питания матрицы ноутбука требуется 3,3 В, для драйвера подсветки 12-19 В, для USB 5 В, а для планшетной начинки 4,2 В. В качестве входного напряжение используется блок питания 12 В 2 А от роутера, а также у меня есть литий-ионный аккумулятор от шуруповёрта. Для получения всех вышеперечисленных напряжений из 12-вольтового источника используются понижающие dc-dc преобразователи, которые я вырезал из старого роутера.
Сборка mainline u-boot
Самый быстрый и простой способ проверить правильно ли я распаял дисплейный шлейф (помимо редактирования script.fel) – это собрать свой собственный u-boot с кастомным CONFIG_VIDEO_LCD_MODE, благо в отличие от стокового mainline u-boot имеет видеодрайвер, а в отличие от линукса не нужно для этого писать целый отдельный dts. Также mainline u-boot умеет читать extlinux конфиги, умеет запускать EFI-приложения, поддерживает usb-host, можно подключить usb-клавиатуру для интерактивного взаимодействия с консолью и даже подключить загрузочную usb-флешку, этакий bios, прямо как на настоящем x86-м ПК.
За основу был взят q8_a33_tablet_1024x600_defconfig в котором я изменил:
CONFIG_VIDEO_LCD_MODE="x:1280,y:800,depth:18,pclk_khz:68900,le:16,ri:128,up:1,lo:16,hs:1,vs:1,sync:3,vmode:0"
CONFIG_VIDEO_LCD_IF_LVDS=y
CONFIG_VIDEO_LCD_PANEL_LVDS=y
CONFIG_USB_EHCI_GENERIC=y # чтобы работали usb хосты на плате (обычно под wifi)
Тайминги я написал после внимательного изучения https://linux-sunxi.org/LCD по даташиту своей панели CHUNGHWA CLAA154WB03AN.
Сборка u-boot довольно тривиальна:
export KBUILD_OUTPUT=a33_laptop
export ARCH=arm
make CROSS_COMPILE=arm-none-eabi- xconfig
make CROSS_COMPILE=arm-none-eabi-
Особенность многих allwinner’ов (кроме a31) в том что их brom сначала пытается загрузить свой загрузчик с sd-карт, а лишь затем с nand. Это даёт возможно очень легко запускать на этих устройствах свой кастомный код без перепрошивки. Нужно всего-лишь в 8 сектор SD-карты прошить специально подписанный код.
dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=1k seek=8
Как не странно, у меня он с первого раза запустился.
Для загрузки Linux используется конфиг extlinux
extlinux/extlinux.conf
ui menu.c32
menu autoboot Welcome to Fedora. Automatic boot in # second{,s}. Press a key for options.
menu title Fedora Boot Options.
menu hidden
timeout 50
#totaltimeout 9000
default Archlinux
label Archlinux
kernel /zImage_pmos
append root=/dev/mmcblk0p2 console=tty0 console=tty1 console=ttyS0,115200n8
fdt /sun8i-a33-q8-laptop-lvds.dtb
Написание device tree для mainline linux
Однако с линуксом пришлось повозиться, был взят самый актуальный на момент экспериментов Linux 6.17.0 (сейчас пересобрал под 7.0-rc3, пока ничего не отвалилось), дисплей с 3d-драйвером lima завелись почти сразу, лишь написал такой device tree:
sun8i-a33-q8-laptop-lvds.dts
#include "sun8i-a33-q8-tablet.dts"
/ {
model = "Q8 A33 Laptop with 1280x800 LVDS LCD";
compatible = "allwinner,q8-a33-laptop", "allwinner,q8-a33",
"allwinner,sun8i-a33";
};
&panel {
compatible = "chunghwa,claa154wb03", "panel-lvds";
width-mm = <344>;
height-mm = <222>;
data-mapping = "jeida-18";
panel-timing {
/* 1280x800 @60Hz */
clock-frequency = <68900000>;
hactive = <1280>;
vactive = <800>;
hsync-len = <1>;
hfront-porch = <128>;
hback-porch = <16>;
vsync-len = <1>;
vfront-porch = <16>;
vback-porch = <1>;
};
port {
panel_in: endpoint {
remote-endpoint = <&tcon0_out_lcd>;
};
};
};
&tcon0 {
pinctrl-names = "default";
pinctrl-0 = <&lcd_lvds_pins>;
};
diff --git a/arch/arm/boot/dts/allwinner/sun8i-a23-a33.dtsi b/arch/arm/boot/dts/allwinner/sun8i-a23-a33.dtsi
index 2af8382cc..2ec074166 100644
--- a/arch/arm/boot/dts/allwinner/sun8i-a23-a33.dtsi
+++ b/arch/arm/boot/dts/allwinner/sun8i-a23-a33.dtsi
@@ -372,6 +372,12 @@ lcd_rgb666_pins: lcd-rgb666-pins {
function = "lcd0";
};
+ lcd_lvds_pins: lcd-lvds-pins {
+ pins = "PD18", "PD19", "PD20", "PD21", "PD22",
+ "PD23", "PD24", "PD25", "PD26", "PD27";
+ function = "lvds0";
+ };
+
mmc0_pins: mmc0-pins {
pins = "PF0", "PF1", "PF2",
Но usb у меня почему-то не в какую не хотел заводиться. Пробовал всяко-разно dts поправлять, в списках рассылок issue на похожие проблемы искать. Однако проблема оказалась в конфиге ядра, ибо я заметил что у postmarketOS usb-хост работал. Я просто взял конфиг ядра linux-postmarketos-allwinner, собрал и всё заработало!
Производительность и энергопотребление
SoC Allwinner A33 имеет 4-х ядерный процессор ARM cortex-a7 (который в mainline linux по умолчанию работает до 1 гигагерца) производительность одного потока которого по моим тестам в 7z b и hardinfo находится между производительностью Intel pentium II и pentium III. Кто скажет «мало» – посмотрите на цену б.у. ноутбука на pentium III или тем более pentium II, которые барыги перепродают как «ретро», который как будто полностью набиты дефицитной и дорогой DDR5 памятью, а не древней SDRAM объёмом от 32 до 128 Мб. Мой ноутбук имеет 512 Мб ОЗУ что является золотой серединой между «ретро» и комфортной работой современного Linux дистрибутива. И кроме почти бесплатности мой ноутбук по сравнению с теми x86 pentium’и (и даже намного более современными) имеет очень низкое энергопотребление. Например во включенном состоянии, потребление от 12V БП ~0,72А (~8W) и это на полной яркости, а полностью отключенным дисплеем всего 0,09А (~1W) и это с запущенным X-сервером!
TODO
Ещё нужно завести wi-fi и звук, первый esp8089 требует драйвер который есть только в виде древнего out-tree модуля ядра из под древнего downstream linux для rockchip, мне удалось заставить скомпилировать этот модуль под linux 7.0-rc3, однако он не хочет инициализироваться. Что-то там eagle_sdio failed with error не работает. Звуковой кодек в теории должен работать на mainline ядре, но на практике не работает. Хотя я ноды в dts все прописал, и в конфиге всё включил, но даже признаков инициализации alsa в dmesg не наблюдаю.
















