“Hello, LED!” и плата FriendlyARM mini2440

Не так давно приобрел вышеозначенную плату (больше, думается, из любопытства), и даже успел ее изрядно поковырять.
Все, что ниже – мои собственные ИМХО, эмоции, впечатления и выводы. [и по лицу не бейте, пацаны..:D]
Board Photo
Каждый, кто предоставляет какой-либо материал по этой доске, норовит воткнуть ее фотографию. Я тоже так хочу.
На плате установлен микроконтроллер от Samsung, S3C2440A, максимальная тактовая которого заявлена в размере 533 МГц (это, кстати, повергло в неописуемое удивление одного моего коллегу, тяжело подползающего к семейству STM32). Этот камень не имеет встроенной программируемой флэш-памяти (только «Steppingstone» – внутренний SRAM-буфер на 4 кБ, служащий для загрузки), посему грузится извне. Для этого на плате установлено две микросхемы флэш, выбор которых осуществляется специальным переключателем: NOR-флэш (2 Мб) и NAND (128 Мб на моей плате). Современные платы, кстати, выпускаются с NAND объемом 256 Мб, а вообще за дополнительные 20$ можно заказать плату с 1 Гб флэш (но, думаю, тут таких извращенцев не имеется =)). В NAND в недалеком будущем я планирую загрузить android (сейчас там windows CE), а в NOR с завода прошит BIOS (supervivi). Я этого не знал и затер NOR в первый же вечер.
Собственно, разводка платы позволяет нарастить до 8 Мб NOR. Неплохо, правда? :)
Светодиодов для юзверей на плате предусмотрено четыре, и все зеленые. Печалька.
Подсоединены они к выводам порта B под номерами 5, 6, 7 и 8. Вот так:
LEDs Schematics
К выводам S3C2440A светики подсоединены катодами, а аноды подтянуты к питанию. Этот фактор и моя невнимательность явились причинами того, что первая попытка помигать ими провалилась с треском. Собственно, всеми четырьмя я и буду сейчас самозабвенно моргать. (А таки в будущем сдую я пару зеленых и поставлю разноцветные).
Система тактирования довольно сильно отличается от мне полюбившихся STM32. Встроенный генератор отсутствует. То есть, S3C2440 работает или от кварца, или при наличии внешнего такта. А иначе – не работает.
Весьма интересной мне показалась возможность тактирования USB от отдельного источника (отличного от источника тактовых импульсов для процессора и периферии). Таким образом, тактовый сигнал FCLK (для ядра), HCLK (для периферии шины AHB) и PCLK (для периферии шины APB) генерирует блок MPLL, а такт UCLK (для USB) может генерироваться отдельно блоком UPLL.
Настройка коэффициентов для выбора вышеуказанных частот производится с помощью специального регистра MPLLCON, и тут есть интересная деталь. Система стартует непосредственно от кварца или внешнего источника колебаний. И пока в регистр MPLLCON не будут записаны значения коэффициентов m, p и s, блок генерации MPLL не запустится, и системная частота будет равна частоте кварцевого генератора или внешнего такта. Даже если мы не хотим менять настройки генератора, перезаписать значения по умолчанию нам придется. Надо, Федя, надо…
Дополнительная плюшка в виде вывода тактового сигнала наружу с настраиваемым источником присутствует. Правда, азиатские наши друзья из Samsung не рекомендуют нам использовать этот вывод в качестве источника PLL для других девайсов в нашей системе.

А вот настройка портов ввода-вывода S3C2440A мне такой интересной уже не показалась. Не густо, мягко говоря. Регистр GPnCON (control) позволяет нам настроить любой вывод порта в одном из трех режимов: вход, выход и режим альтернативной функции. Можно включить подтяжку к питанию с помощью регистра GPnUP. Подтяжку к «земле» включить нельзя – это вам не STM32. =)
Включаются порты все разом. В регистре контроля распределения тактирования есть лишь один бит, названный просто: CLKON_GPIO. И не волнует.
Итак, кратко по необходимому пробежался – приступаем к написанию собственно программы для микроконтроллера.
Прежде всего – в качестве стартовой площадки использовалась программа, идущая на диске к mini2440. Написать «с нуля» можно было без проблем, но так – быстрей, и вероятность скорого успешного запуска повышается.
В качестве IDE использовалась Metrowerks CodeWarrior for ARM Developer Suite. Свой любимый IAR я использовать не стал в виду различий в синтаксисе асма IAR и CodeWarrior. Проще говоря, IAR неистово ругался на некоторые команды и макросы стартап-файлов проекта, и пришлось лезть в CodeWarrior. Хотя паяльником я сделал себе зарубку на подоконнике вернуться к этому вопросу в недалеком будущем.
Пробегусь по настройкам проекта. Открываем вкладку настроек в главном окне проекта.

Setup Icon
Да, за красным кружочком именно нужная нам кнопка.

Щелкаем по вкладке «Target settings», обращаем внимание на строку в окне «Post-linker»:
Target Settings
ARM fromELF (Executable and Linkable Format) – в двух словах, утилита, позволяющая нам получать исполняемый формат прошивки: .bin, .m32, .i32, .vhx
Далее спускаемся ниже и щелкаем по вкладке «ARM Assembler». Обращаем внимание на окошко «Architecture or Processor» — там стоит «ARM920T» — именно на базе этого процессора собран наш S3C2440A. В двух оставшихся выделенных окнах – настройки порядка байт (Little Endian) и рабочий режим процессора (32-разрядный ARM).

ARM ASM Settings

В окне «ARM C Compiler» особо интересного тоже ничего нет.

ARM C Settings

И – самое интересное – вкладка «ARM Linker»

ARM Linker Settings

В окне «RO Base» мы должны указать начальный адрес SDRAM для загрузки кода в оперативную память. В соответствии с картой памяти S3C2440A, адрес 0x30000000 является начальным адресом 6-го банка (SROM/SDRAM). Оперативной памяти у нас на борту 64 МБ, что дает нам возможность оперировать в пространстве 0x4000000, то есть 0x30000000..0x34000000.

Теперь заглянем в состав проекта (кстати, его название – 2440test).
Проект содержит стартап-файлы «2440init.s» (инициализация стека, памяти, тестовые процедуры режимов Stop и Sleep) и «2440Slib.s» (служебные процедуры MMU – memory management unit). Кроме привычного «main.c» файла находим также файлы «mmu.c» (инициализация MMU), «nand.c» (функции для оперирования флэш-памятью), и «2440lib.c» (служебные функции вроде инициализации портов, настройки коэффициентов блоков MPLL и UPLL, и т.д.). Ну и кроме прочего, мне пришлось создать хидер «s3c2440a.h», в котором я начал присваивать имена битам тех или иных регистров, которые я использовал в проекте (там не все, конечно же – придется дописывать по ходу процесса изучения платы). Как кому не знаю, а мне с именованными константами работать проще, нежели с записями вида: «rGPBCON = 0x155555».

Погружаемся в «main.c». Хотя чего там «погружаемся» — так, пятки намочим.
Смотрим код основной функции «main()»:
void Main (void)
{
	MPLL_Init();
	        rCLKCON |= CLKON_GPIOEN;
        Port_Init();													          
	MMU_Init();						
		rGPBDAT &= ~(GPIO_GPB5 | GPIO_GPB7);			
	while(1)
	{
		rGPBDAT &= ~GPIO_GPB6;
		rGPBDAT |= GPIO_GPB8;
		Delay(500);
		rGPBDAT |= GPIO_GPB6;
		rGPBDAT &= ~GPIO_GPB8;
		Delay(500);
	}
}

В самом начале, как я и писал выше, мы настраиваем и запускаем генератор MPLL, иначе ничего у нас не получится. Далее разрешаем тактирование портов ввода-вывода и вызываем функцию инициализации этих самых портов (на деле, настраиваем только нужный нам Port B). Далее – вызов функции инициализации MMU (без этого никак). И, собственно, все готово для организации безудержного и развеселого перемигивания светодиодов. Как я писал выше, к выводам порта светодиоды подсоединены катодами – то есть для того, чтобы зажечь светодиод, на соответствующем выводе порта необходимо установить низкий уровень. Что первым делом я и устроил со светодиодами LED1 и LED3. А далее – в вечном цикле перемаргиваются светодиоды LED2 и LED4. Задержка реализована с помощью функции Delay(ms), для реализации которой используется ШИМ-таймер 3. Нечто подобное есть в библиотеке у ST (для STM32 точно), но там расчет строится на частоте SysTick, а здесь – на PCLK. Функцию можно доработать для микросекундных задержек, уменьшив величину, загружаемую в буфер таймера, в 1000 раз.

Вот и все. Остается нажать «Compile», а затем – «Make», и получим отчет об удачной генерации .bin файла прошивки.
Заталкивать прошивку в контроллер буду с помощью шедшего в комплекте LPT-программатора. Вот он:

JTAG-mini small

Аццкий зверь на одной буферной микросхеме неудобен тем, что требуется железный LPT-порт. У меня в ноутбуке его нет (говаривают, что PCMCIA->LPT помогает в этих случаях, но я не рисковал покупать). Зато у меня есть древний как гомно мамонта второй ноутбук «Gateway Solo9000» с LPT-портом. Я его покупал когда-то для программирования ПЛИС Xilinx (покупать USB-программатор не разгонишься, ага).
Для собственно вталкивания прошивки во флэш воспользуемся программулиной «H-JTAG», которая, опять-таки, идет на диске в комплекте…ну и в сети ее достать не проблема.
После установки появится 5 разных иконок – нас в основном интересуют только «H-JTAG» и «H-Flasher».
Запускаем «H-JTAG». Появляется окно, которое сразу же деликатно и ненавязчиво предлагает нам поискать обновление. Тот древнейший ноутбук, на котором я работал, сроду сети не видел, а без Интернета искать обновления «H-JTAG» почему-то наотрез отказался. Капризный…
Зато для автоматического определения тарджет-контроллера сеть «H-JTAG-у» не нужна.
H-JTAG target detect
Подумал и определился:
H-JTAG target detected
Первым делом лезем во вкладку «Settings» -> «USB/LPT Selection». В появившемся окошке делаем выбор: «LPT(Parallel Port)». Кстати, автор программы одну букву «l» в слове «Parallel» в первом случае пропустил. Далее идем «Settings» -> «LPT JTAG Setting» и в возникшем окошке с кучкой вкладочек и галочек устанавливаем такие настройки:

JTAG settings
Жмем «OK», а затем на основной панели инструментов нажимаем кнопочку «H-Flasher»
H-Flasher link

Возникает совершенно иное с виду окошко. Слева – пункты настроек от 1 до 5, справа – собственно само окно настроек. Смотрим:

H-Flasher flash ch

Сначала выбираем нашу микросхему флэш-памяти, которую намерены прошить. Список относительно большой, но особо потеть не придется. Справа от списка, как видно, отображаются, кроме названия, основные характеристики и объем памяти.
Во вкладке «Configuration» нужно произвести настройки адресов: с какого адреса прошивать флэш и куда грузить программу в оперативной памяти.

H-Flasher Flash settings
Самое сложное и трудно объяснимое – это те Содом и Гоморра, которые творятся во вкладке «Init Scripts». Вначале я вообще проехал мимо этой вкладки, однако…после первого программирования прошиваться во второй раз флэшка отказалась, и определяться тоже не определялась. Я уж думал, что нахомутал по-крупному – однако вдумчивое изучение документации и материалов на форумах ясно указали на недостатки в настройках программы, связанных именно со скриптами инициализации. Суть в том, что данные скрипты выполняют полезные функции – например, системный сброс или инициализацию памяти. Вначале я пытался сочинить и слепить собственные скрипты, однако потом забил и нашел рабочий файл настроек «H-Flasher» с рабочими скриптами инициализации.

H-Flasher Init Scripts
Впрочем, нет – один скрипт («SoftReset») я таки добавил самостоятельно. Ошибки записи периодически возникали, и оказалось, что это связано с тем, что программа в памяти осуществляет настройку MMU. А скрипт «SoftReset» перед осуществлением прошивки запрещает MMU, что делает возможным перепрошивку памяти.

H-Flasher Init Scripts p2
В общем, ну их, эти скрипты… к такой-то бабушке. Дальше – собственно окошко программирования, «Programming».
H-Flasher Programming window

В строке «Type» выбираем «Plain Binary Format», в окне «Dst Addr» — начальный адрес флэш (мы его уже указывали, но зачем-то он понадобился снова). Ставим «0».
За красным пятном на самом деле скрывается кнопка выбора файла прошивки. Нажимаем, в выскочившем окне выбираем этот самый файл.
Жмем «Program».

H-Flasher Programming bar

Дожидаемся окончания программирования, закрываем окно.
Нажимаем на плате «Reset», и вот оно, вот оно… Таки работает.

LED2 flashing

LED4 flashing
Видео я снимать, конечно же, не стал – незачем. Надеюсь, мне поверят на слово.

Таким образом, было потрачено немерено времени, зачем — неизвестно, польза результата тоже неизвестна. Главное, что все работает и мигает.=)
  • +5
  • 12 августа 2012, 04:04
  • SubDia
  • 2
Файлы в топике: 2440test.zip, H-Flasher_mini2440.zip

Комментарии (52)

RSS свернуть / развернуть
А что из себя этот SoC представляет? Какое ядро, есть ли что-то дополнительное вроде GPU/DSP?
0
  • avatar
  • Vga
  • 12 августа 2012, 04:27
а ничего в нем нет. www.friendlyarm.net/products/mini2440
эти платы где-то района 2008-9 года, их уже даже не производят. где, а главное, зачем автор выкопал ее, это еще вопрос.

сейчас проще купить это www.hardkernel.com/renewal_2011/products/prdt_info.php?g_code=G133999328931 $150 за борду с современным SoCом я считаю вполне достойно.
0
Согласен, сейчас проще купить и ту доску.
Mini 2440 мне досталась практически нахаляву, да и интерес.
0
А это SoC? По-моему, нет же.
Ядро ARM920T, никаких дополнительных ништяков в нем нет. Ничего удивительного, в общем.))
0
Ну вокруг него же не приходится городить чипсет, видеоадаптер и так далее. Так что вполне себе SoC.
Более-менее чистапроц — атом. Сам посмотри, сколько вокруг него обвязки. И сколько тут.
0
Относительно — не спорю.
Но все же придерживаюсь мнения, что SoC — нечто более емкое, нежели данный камень.
0
Я бы так не сказал. Из начинки более современных SoC'ов ему разве что видеоускорителя не хватает, но они появились недавно.
0
А память? ОЗУ, ПЗУ…
0
Их отродясь не было в SoC'ах аналогичного назначения. И сейчас нет. Типичный состав SoC'а для подобных задач — проц, видеоадаптер (LCD RGB и опционально другие интерфейсы), GPU или DSP (опционально), интерфейс внешней памяти (RAM, Flash), звук (опционально внутренний аудиокодек, т.е. ЦАП/АЦП), USB (девайс, опционально хост), поддержка карт памяти, набор интерфейсов (Ethernet, камера, SPI, I2C, UART, etc) и прочая МК-образная периферия.
Практически все это в сабже есть.
0
Значит, меня не так и не тому учили. =))
В принципе, это есть мелочь, а в остальном я и так согласен.
0
SoC вообще понятие достаточно размытое (достаточно вспомнить недавний спор в сообществе о том, что есть ОК, МП, МК и СнК и чем отличаются). Поэтому я и уточнял, что «для данного назначения». И аналогичные девайсы как правило называют именно SoC.
0
Да уж, это точно (я о споре о различиях). В принципе, последние МК от ST (STM32F4xx) уже подошли вплотную к тому, чтобы именоваться SoC. Тут тоже можно много спорить — МК это или теперь уже SoC. В принципе, от названия у камня ничего не отвалится, да и лишнего не появится тоже.))
0
Такие платы лучше под Linux использовать, а писать мелкие програмки под неё (без соответствующей OS) дело малоперспективное.
0
Я бы даже сказал, бесперспективное. В конце концов, можно слепить малюсенькую плату на том же STM32, которая обойдется в 10 раз дешевле, и под нее писать без ОСи.
Тут дело такое… любознательность. =)
0
Тогда да. Но кстати любознательность можно направить по например такому варианту — поставить Linux, разобраться в нем, запустить интересные поделки — например интернет радио, например как тут )) Ссылка Ссылка Аудио выход на плате я понимаю есть… )
0
Точно, надо к роутеру аудиокарточку прикрутить. А то уже забыл совсем.
0
Кстати я себе такойже роутер заказал TP-WR703N )) И память для его апгрейда… 8 FLASH + 64 RAM
0
Где флешку брали и по чем? А то из нормального только оптом (5-10 штук и более). поштучно по $5+ продают, что делает покупку вр703н несколько неоправданной.
0
MX25L6445EM2I-10G, на ebay 4.81$. Но кстати можно и на 16 поставить MX25L12845 формфактор немного другой на плату не встанет, но можно подпаять, подороже на пару зеленых будет. Цена вопроса наверное не существенна, интерес важнее.
Я кстати заказал еще Raspberry Pi, так мне выставили 16 недель ожидания!!! Я чуть не о… ел )) А на аукционе на ebay цена не менее 80-100, по сравнению с TP-WR703N за 20$ это конечно впечатляет…
0
Мне в середине июня выставили 6 недель, и все еще не шипнули.
А где ты подходящее ОЗУ нашел? Оно довольно редкое.
Алсо, заменить память не так просто, как кажется. Плата (по крайней мере в моем 1043) хорошо отводит тепло и прогреть память до отлипания от платы весьма сложно. К тому же, если чутка недогреть — микра снимется с дорожками.
0
Да нет, это уже все делали Ссылка, прописать после загрузки надо в конфигах и все будет работать. С лишней RAM памятью можно например виртуальный диск сделать, лишним точно не будет.
0
А, он мелкий. С такого память сдуть будет проще. А вот с TL-WR1043ND я наебался на отличненько, еще и одну площадку с платы содрал. К счастью, это был NC. И еще несколько площадок полусодраны (т.е. сама площадка отвалилась, но дорожка ее кое-как удержала до момента припаивания новых мозгов).
А память туда нужна, AFAIK, 32Mx16. Это довольно редкие чипы, но востребованные для подобных модов (в роутеры, в вогоплеер, в некоторые КПК...). Мне повезло найти подходящую планочку дешевой памяти с четырьмя чипами.
0
я когда на своей wl700 менял флешку (2->8MB) и раму (64->128MB), просто заказал у местных. везли конечно долго, но там на новогодние праздники дело было. передулось без проблем вообще. да, раму сдул с обычной планки памяти.
0
Жирная у твоего память, однако. Возможно чипы на 128МБ пораспространенней, но конкретно 32Мх16 никто из группы VoGeeky не нашел, кроме меня.
0
ну, и wl700 далеко не бюджетная модель была… ;)
0
и не такая она уж и редкая. я без проблем нашел четырехчиповую планку 256МБ, в которой искомых микрух как раз четыре штуки.
да, мне нужны были 2 штуки как раз 32Мх16, а стояли 16Мх16
0
Я решил взять непаянное HY5DU121622CTP-D43, на ebay 6.94$ с доставкой, про планку тоже думал, но возиться с феном сильно не хочется и побаялся вдруг битую подсунут… китайса они такие, шлют как на картинке, а дальше их не волнует… )
0
дык, планку ведь можно предварительно проверить в компе мемтестом. я когда планировал асусу апгрейд, три дня (пятница и выходные на работе) планку гонял.
0
А вот лично мне интересней прогнать мемтест на таргете. Чтобы убедиться, что ОЗУ не пострадало от перепайки, успешно припаялось и совместимо с системой.
0
ну на таргете я тоже долго гонял мемтест, т.к. на тот момент асусину я брал как девборду с линухом и вифи на мипсе и экспериментами с прошивкой «от энтузиастов» в плане поддержки набортного IDE-контроллера.
0
Кстати подскажите чем serial flash 8Мбайт прошивали? Вроде пишут что просто (даже lpt вариант есть), но пока не нашел…?
0
моя параллельная. шил на программаторе. в тот момент работал в конторе, где в СЦ был программатор с набором переходников. грех было не воспользоваться служебным положением. ;)
0
Ага ну вот вроде нашелся кандидат, MX25L поддерживает Ссылка. Может кому пригодится…
0
Я для аналогичной SPI-флэшки использовал SPIPGM. Работает через LPT-порт, требуется адаптер (простейший — просто запитать микросхему памяти от 3.3В и подключить к линиям порта через резисторы 470 ом, распиновка подключения указана в самой программе, да и гуглится без проблем). Можно сделать адаптер как по твоей ссылке.
0
Мне, так через юсб-исп какой-нибудь с дудкой удобнее. лпт найти тяжко, а плату расширения покупать не хочется.
0
А они поддерживают SPI Flash? Хотя по идее физический интерфейс тот же, да. Но достоинство конкретно этого метода в простоте аппаратной части — если нужно прошить одну микросхему, как это требовалось мне, то такой путь самый простой.
LPT конечно минус, но радиолюбителям он нужен часто и потому есть смысл поискать себе в лабораторию комп с ЛПТ. Сам не так давно собрал подобный, найдя в магазине дешевую старую материнку с набортными аудио, видео и процем (VIA C3 800МГц плюс VIA UniChrome 3 — тот еще слоупок, но ведь не крусис же на нем запускать).
0
В радиолюбительских целях лучше lpt с защитой, а то ни туда не то ткнуть — как нефиг делать.
0
Ну так можно сделать переходничок с 74HC244/245. А лучше какими-нить двунаправленными буферами, которым можно побитово направление задать (если это вообще надо — я все же подозреваю, обычно двунаправленная шина юзается в одном направлении).
0
а я «мемтест» прогнал на таргете торрентом. вроде не бито ничего, работает и фильмы крутит :)
0
Это что за чип на 128 метров то? 64х16 же не существует в природе. или там 128х8 работает?
0
а я про организацию ничего и не говорил, то VGA домыслил. ;) асусу wl700ge меняется (как несложно догадаться по моим комментам ниже ;) ) 2х(16Мх16) на 2х(32Мх16)
0
до тех комментов я ещё не добрался, когда пост читал :)
вообще странно что они при двух микрухах юзали х16. х8 гораздо распространеннее по идеи.
0
Я память нашел у наших комповых барыг только со второго раза. 512метровые планки сейчас ещё довольно активно ходят, по этому есть шанс найти походя месяцок по точкам.
На 703 память сдувается легко. А вот та же дир-320 доставляет хлопоты (думаю точно такие же как и 1043).
0
Я нашел на довольно новой планке Hynix 256MB PC3200 четырехчиповой (покупал в никсе, местный магазин оттуда возит). Причем на купленной новой 512-метровой обнаружилось восемь чипов 64Mx8.
0
О, я ходил и смотрел маркировки, прежде чем купить, оставляя всех продавцов в недоумении, как это планка может не подходить. :)
А в магазине обычно не увидеть что там за чип стоит.
0
Есть подтверждения что 16МБ мод работает? Я не встречал что-то.
Цена вопроса наверное не существенна, интерес важнее.
Тогда зачем было брать самый дешёвый и относительно дохлый роутер? :)
Интересно пропатчить оперативку до 128метров. Дилемма у меня такая сейчас, брать ещё один роутер только ради проверки, или ну его, один фиг столько оперы не надо.
0
Я тоже не встречал ..., просто память искал по сайтам производителям (И потом в описании программатора spipgm увидел) что поддержка программирования 16 Мб Flash присутствует и соответственно предположил что можно попробывать… Но кстати думаю что идея может не так хороша, потомучто всеравно мало — Python наверное все равно не влезет, ему говорят под 20 надо (но я пока сам не проверил точно), я как раз для Python и хотел добавить. Скорее всего обойдусь просто внешней Гиговой флэшкой и поставлю на нее, там же и все остальные данные буду хранить.
0
Тогда зачем было брать самый дешёвый и относительно дохлый роутер? :)
Размер как раз понравился, и он не такой уж и дохлый )), 400МГц всетаки, по сравнению с моими WL-520gU и WL-HDD, за такую цену и размеры очень даже хорошо…
0
Однако с OpenWRT роутер кушает больше и больше тормозит, чем тот же DIR-320 с прошивкой от Олега (Vampik'ом адаптированная под дир). Только что flashfs не удобен, хотя порой это плюс, т.к. не забъется встроенная память при сбое (отвалился диск когда например).
Размер — да, плюс несомненный. его и встроить можно в девайс какой. И порты для встраивания удобнее расположены, не надо дорожки резать от юсб и пр.
0
Умельцы… откуда у народа идеи берутся? =)
Аудио есть, да. I2S, кодек на плате.
Было интересно поковырять железо; однако одно другому не мешает — два вида флэш на плате способствуют всяко-разным экспериментам…
0
ФрэндлиАрм помоему поставляет даже образ готовый со всеми драйаерами для данной платы… тогда прикрутить радио и например IR (LIRC) будет вполне возможно за пару деньков, если на плате USB HOST, то можно например вот такое добавить Ссылка, это точно под Linux заработает (ссылка как подключать есть у продавца если что)
0
Интересно, интересно… спасибо за наводку. =)
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.