29 октября 2018 г.

11 октября 2018 г.

UPX и секции

Если вдруг стоит задача добавить секцию в файл который уже пожат upx, то у него есть опция --preserve-build-id которая оставляет .note.gnu.build-id секцию из оригинального файла, так что можно используя objdump приделать свою

31 августа 2016 г.

msp430 и секция infoA

Напоминаю тем кто как я не читает даташиты: секция infoA в informational memory защищена и просто так не пишется.

---

Just to remind for those who doesn't read datasheets: infoA section of information memory is protected and can't be written with simple flash write.

15 января 2016 г.

Про virtualbox и qcow образы диска

Экспорт виртупльной машины при использовании qcow образа не работает, только если преобразовать в vdi и подцепить к VM.

Падает при этом ВНЕЗАПНО и без указания на то, что формат не нравится

0%...
Progress state: VBOX_E_FILE_ERROR
VBoxManage: error: Appliance write failed
VBoxManage: error: File not accessible or erroneous file contents
VBoxManage: error: Details: code VBOX_E_FILE_ERROR (0x80bb0004), component ApplianceWrap, interface IAppliance
VBoxManage: error: Context: "RTEXITCODE handleExportAppliance(HandlerArg*)" at line 1249 of file VBoxManageAppliance.cpp

А я-то думаю, что за херня.

2 ноября 2015 г.

GCC и mips

GCC 4.8 собирает кривой код для ramips (ralink rt5350, mips 24Kc). Пользоваться надо 4.6

Возможно конечно, что это только для openwrt так, но мне вот не свезло.

29 октября 2015 г.

openwrt rpcd и небольшой неочевидный нюанс

Себе на память:

rpcd при запуске исполняемых файлов которые лежат в /usr/libexec/rpcd ОБЯЗАТЕЛЬНО(!) ожидает ответ в stdout, хотя бы просто "{}". Иначе, если просто выйти, то он залипает в read и работать не будет.

2 декабря 2013 г.

Подстава при отладке u-boot

Очередные идиотские грабли, по которым я прошёлся с непоколебимой уверенностью в том, что я "Д'Артаньян", а окружают меня лица неторадиционной ориентации.

Отлаживаю код ethernet драйвера, проверяю инициализацию, вижу что значения пишутся хрен пойми куда.

...минула неделя разборок с отладчиком, компилятором и прочей нечистью...

Тут до меня доходит - u-boot же уже отрелоцировался в памяти и те адреса статических переменных которые у меня в символах прописаны, действительны уже чуть более чем никак! всё остальное правильно, но вот то, что я забыл про статичность данных переменных меня и подвело.

Идиот-с.

З.Ы. Кто-нибудь знает, как GDB сказать, что секция .bss лежит по некоторому адресу, не тому что в отлаживаемом бинарнике?

28 октября 2013 г.

Кровавый enterprise

В очередной раз сталкиваюсь со всей кровавостью enterprise решений. Есть такая штука как teamcity, отличная вещь кстати говоря, но внутри использует jgit для выдёргивания исходников из репозитория. Есть репозиторий, который внутри содержит симлинки, так надо. Как оказалось, jgit не умеет правильно обрабатывать симлинки и вместо них создаёт обычные файлы в которых указано назначение симлинка... Про это товарищи писавшие teamcity знают и описали работающий воркэраунд.

А я-то думал, что за хрень происходит.

22 октября 2013 г.

Очередной пример того, почему я не люблю make

В нагрузку к предыдущему псто можно сказать одно - make 3.81 и 3.82 - в некотором поведении между собой несовместимы.

В предыдущем псто был пример с ifndef  VAR и в нём делалось объявление этой самой VAR. Засада вылезла с той стороны с которой я её ну аще никак не ждал. Оказалось, что у make 3.81 и 3.82 по разному обрабатываются переменные командной строки. 3.82 их подставляет как надо, а вот 3.81 почему-то сначала выполняет присваивание которое в коде, гадит ошибками, после чего присваивает переменным те значения, которые переданы в параметрах командной строки. шозанах, я так и не понял. Пришлось устраивать трэш и передавать параметры как переменные окружения, вызывая
VAR=value make -e <target>
Вот такие пироги с котятами. Я допускаю, что я упорот и строю костыли там где не надо. Если так, разупорите примером. про ?= знаю, не помогло. 

21 октября 2013 г.

Вот бывает что надо при сборке развесистого проекта брать информацию о id коммита, ветке и прочих радостях жизни.

Мы сделали так:
COMMIT=`git show --pretty=oneline|head -c 40`
BUILDN=`git log --pretty=format:'' | wc -l`
BRANCH=`git branch|grep '*'|awk '{print $2}'`

Так вот, так делать не надо. Потому что если захочется собирать проект чем-нибудь типа Teamcity, попадаешь на то, что все такие нормальные системы не выдёргивают полноценное дерево, а только последнюю ревизию, из-за чего всё вышенаписанное ломается.

Посему был приделан костыль такого вида:

ifndef COMMIT
COMMIT=`git show --pretty=oneline|head -c 40`
endif
ifndef BUILDN
BUILDN=`git log --pretty=format:'' | wc -l`
endif
ifndef BRANCH
BRANCH=`git branch|grep '*'|awk '{print $2}'`
endif

Теперь если эти параметры передаются в makefile из системы сборки(а она их знает), то обращений к гиту(которые по понятным причинам обламываются) не будет.

Знал бы где где костыль сломается, инвалидное кресло бы припас.

18 апреля 2013 г.

  ______________________________________
/ Хозяина этого блога захватила в плен \
| неимоверная куча работы, так что в   |
| ближайшее время рассчитывать на него |
\ видимо не приходится                 /
 --------------------------------------
  \
   \    (__)
        o o\
       ('') \---------
          \           \
           |          |\
           ||---(  )_|| *
           ||    UU  ||
           ==        ==

8 апреля 2013 г.

Лучи поно^Wдобра в сторону u-boot

В readme u-boot указана константа CONFIG_PHY_ADDR - которая отвечает за то, на каком адресе висит ethernet phy.

Вроде бы всё хорошо... Хрен там. Люди писавшие драйвер для AT91RM9200 emac, решили что они самые прикольные и запилили свою константу CONFIG_DRIVER_AT91EMAC_PHYADDR

Козлы.

1 апреля 2013 г.

Заметки о жизни после bootrom у at91rm9200

Себе напоминалка, если вдруг когда забуду.

1 - при использовании XMODEM для загрузки программы в SRAM PLL для клоков уже выставлен и трогать его не надо.
2 - там же, DBGU после ремапа SRAM на 0x00000000 сбрасывается на дефолтное состояние и настраивать его снова - НАДО!
3 - GCC оптимизации делает мудацкие и при сборке начального загрузчика весь код отвечающий за инициализацию железа надо собирать с -O0, либо раскуривать оптимизатор GCC и активно использовать volatile
4 - при использовании XMODEM клоки для PIO контроллера настраивать не надо, они выставляются в процессе работы bootrom.

25 мая 2011 г.

Танцы на костях или два удара в бубен

Чтобы завести USB-сетевуху D-Link DUB-E100 Rev.B1(т.е. купленную не пять лет назад) на старых ядрах(ещё в 2.6.20 эта проблема вроде присутствует. точнее не скажу), придётся сделать два грязных хака и один удар в бубен.

Удар в бубен:
---
 src/linux-2.6.17/drivers/usb/net/asix.c |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/src/linux-2.6.17/drivers/usb/net/asix.c b/src/linux-2.6.17/drivers/usb/net/asix.c
index 12b599a..5d5f5d4 100644
--- a/src/linux-2.6.17/drivers/usb/net/asix.c
+++ b/src/linux-2.6.17/drivers/usb/net/asix.c
@@ -872,6 +872,11 @@ static const struct usb_device_id products [] = {
  USB_DEVICE (0x2001, 0x1a00),
  .driver_info =  (unsigned long) &dlink_dub_e100_info,
 }, {
+ // DLink DUB-E100 
+ USB_DEVICE (0x2001, 0x3c05),
+ .driver_info =  (unsigned long) &ax88772_info,
+}, {
+
  // Intellinet, ST Lab USB Ethernet
  USB_DEVICE (0x0b95, 0x1720),
  .driver_info =  (unsigned long) &ax8817x_info,
-- 
Это для того, чтобы устройство вообще определилось в системе.

Хаки:
---
 src/linux-2.6.17/drivers/usb/net/asix.c |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/linux-2.6.17/drivers/usb/net/asix.c b/src/linux-2.6.17/drivers/usb/net/asix.c
index 5d5f5d4..829c2ef 100644
--- a/src/linux-2.6.17/drivers/usb/net/asix.c
+++ b/src/linux-2.6.17/drivers/usb/net/asix.c
@@ -589,7 +589,7 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
 
  msleep(5);
  if ((ret = asix_write_cmd(dev, AX_CMD_SW_PHY_SELECT,
-    0x0001, 0, 0, buf)) < 0) {
+    0x0000, 0, 0, buf)) < 0) {
   dbg("Select PHY #1 failed: %d", ret);
   goto out2;
  }
@@ -614,7 +614,7 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
  if ((ret = asix_read_cmd(dev, AX88772_CMD_READ_NODE_ID,
     0, 0, ETH_ALEN, buf)) < 0) {
   dbg("Failed to read MAC address: %d", ret);
-  goto out2;
+  //goto out2;
  }
  memcpy(dev->net->dev_addr, buf, ETH_ALEN);
 
@@ -625,7 +625,7 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
           0x0010, 2, 2, buf)) < 0)
    || (*((u16 *)buf) != 0x003b)) {
   dbg("Read PHY register 2 must be 0x3b00: %d", ret);
-  goto out2;
+  //goto out2;
  }
 
  /* Initialize MII structure */
-- 
Тут выкидывается проверка на PHY ID, поскольку ethernet физика стоит на разных ревизиях разная. Плюс меняется что-то для выбора физики. Без этих хаков MAC-уровень заводится нормально, ip присваивается, мак определяется, но физически данные никуда не уходят. Спасибо LKML и людям пишущим в него, за инфу. http://lkml.org/lkml/2006/7/6/132 http://lkml.org/lkml/2007/1/15/156

18 мая 2011 г.

Настройка SDK для TC65i под Linux

Ничего сложного в этом нет, но есть пара неочевидных моментов.

Во-первых, скачиваем Cinterion TC65i SDK. Гугл в помощь.
Во-вторых, ставим Sun JDK и JRE. Это нужно для последующей установки Sun Wireless Toolkit.
В-третьих ставим Wine.

Дальше ставим всё это добро методами дистрибутива или руками. Тут на любителя.

В качестве IDE рассматриваю NetBeans 7 но работать должно с любой из версий до 6.0. Eclipse - сами.

Устанавливаем Cinterion SDK без интеграции с IDE, оно не надо. Из всего что поставится нужна будет директория "Program Files\Cinterion\TC65i\WTK". Её копируем куда-нибудь в сторонку.

Заходим в скопированную директорию, там заходим в bin и создаём два скрипта preverify и emulator с таким содержимым:
#!/bin/sh
wine (путь к директории WTK)/bin/emulator.exe $*

Аналогичный скрипт для preverify. Может можно использовать и родные от Sun Wireless Toolkit, не проверял.

Дальше запускаем NetBeans и заходим в Tools -> Java platforms.

Делаем "Add Platform", Выбираем "Custom JavaME MIDP platform emulator"

Дальше в Platform Home выбираем скопированную WTK директорию и пишем имя платформы и девайса.

На следующем экране должны быть найдены библиотеки для j2me. Жмём далее.

В раздел Javadoc добавляем директорию WTK/doc - в дальнейшем немного облегчит жизнь в плане подсказок по использованию функций и классов.

Всё. можно создавать J2ME проект. Настройки все будут аналогичны SDK'шным.



В итоге, что есть и чего нет.

Есть:
  • Сборка проекта и получение jar и jad файлов
  • Удобная IDE
  • Работа без тормозной виртуалки
Нет:
  • Загрузки файлов из IDE на устройство
  • Отладки на устройстве

Загрузка файлов на устройство решается использованием утилиты tc65sh Которой требуется библиотека rxtx.


Написано по мотивам:
http://www.xargs.com/linux/tc65-linux.html
http://florent.clairambault.fr/tag/tc65

17 мая 2011 г.

Не верь жене, тормозам и аппноутам

Если вдруг найдутся те, кому надо будет подключить SPI флеш(at45db642d) к at91rm9200 то это заметка для них.

В BSP файле для платы нужно объявить флешку. Делается это так:
static struct spi_board_info dk_spi_devices[] = {
 { /* DataFlash chip */
  .modalias = "mtd_dataflash",
  .chip_select = 0, 
  .bus_num = 0,
  .max_speed_hz = 16000000,
 }
}

потом в процедуре board_init добавляется инициализация spi
at91_add_device_spi(dk_spi_devices, ARRAY_SIZE(dk_spi_devices));

Важно правильно задать chip_select и bus_num, они зависят от разводки платы.

chip_select - тут задаётся номер CS SPI-контроллера на котором висит флешка

bus_num - номер контроллера SPI(их может быть несколько). Нумеруются они с 0.

22 января 2011 г.

LaTeX и приложения к диплому

В процессе клепания диплома, приделал приложения к нему. Через жопу, но работает.
\renewcommand\appendixname{Приложение}
\makeatletter
\def\redeflchapter{\def\l@chapter{\@dottedtocline{1}{3.0em}{7.8em}}}
\renewcommand\appendix{\par
\setcounter{chapter}{0}%
\setcounter{section}{0}%
\def\@chapapp{\appendixname}%
\addtocontents{toc}{\protect\redeflchapter}
\def\thechapter{\appendixname\hspace{0.2cm}\@Alph\c@chapter}}
\makeatother
это в объявлении документа, а само приложение делается так:
\appendix
\chapter{UML диаграммы}
\def\thechapter{A}
определение thechapter для того, чтобы нумерация изображений была вида "Рисунок A.1", а не "Рисунок Приложение А.1"