LINUX.ORG.RU

Как собрать ARM-ноутбук из старого хлама

 , , , ,


7

3

Как-то в марте прошлого года я проводил генеральную уборку и нашёл у себя кучу старых сломанных одноядерных ноутбуков со сгоревшими материнскими платами. Там же были платы от разбитых телефонов и планшетов. Выкидывать было жалко, а на досках объявлений такое даже за 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.

Подсветка в этом ноутбуке «ламповая» со своим драйвером, я не стал её переделывать не на какие светодиоды:

  1. «Работает – не трогай»
  2. «Ламповая» подсветка «лампово» выглядит. Чего нет у бездушных светодиодов.

Для управления подсветкой используются стандартные 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 не наблюдаю.

★★★★

Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 4)

hi-tech – low-life мог ли мой дед колхозник подумать, что в будущем люди будут собирать тролейбусы из буханки

Bad_ptr ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.