Блог о Gentoo и около-линуксовым штукам

29 мая 2013 г.

Прошивка MLT-1043S подручными средствами(i2c-tiny-usb)

0:36 Опубликовал Дмитрий Исаенко , Нет комментариев
Итак задача - запрограммировать EEPROM 24c04 из чипа CRUM картриджа MLT-1043S. Картридж для принтера Samsung ML-1661/1676/1861/1866/1866W.

Имеется девайс i2c-tiny-usb.
Софт, который потребуется: i2c-tools, hexdump, hexedit и самособранный eeprog. Последний ловко качается исходниками и компилируется в свою же папку, при этом никак не интегрируясь в систему и не представляя призрачной угрозы portage.
Далее всё подключаем\зажимаем и проворачиваем следующее:
Убедимся что поддержка программатора есть в ядре:
Device Drivers > I2C support > I2C device interface <*> (to get access through /dev/i2c-X)
Device Drivers > I2C support > I2C Hardware Bus support > Tiny-USB adapter <*>

Загружаем нужные нам модули
modprobe i2c-tiny-usb i2c-dev i2c-core

Проверяем жив ли интерфейс:
i2cdetect -l
i2c-0   i2c             i2c-tiny-usb at bus 002 device 008      I2C adapter

Проверяем, а не висит ли на этом интерфейсе нечто похожее на EEPROM:
i2cdetect 0
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-0.
I will probe address range 0x03-0x77.
Continue? [Y/n] y
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: 50 51 -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         

Видим 2 устройства - это нормально. 24с04 отражается в память двумя кусками. Последовательность логична - первые 256 байт на первом сегменте, вторые - на втором.
Считаем содержимое в бинарном виде с обоих сегментов собранным eeprog и пишем вывод в файлики:
# ./eeprog -f /dev/i2c-0 0x50 -r 0:256 > dump1
# ./eeprog -f /dev/i2c-0 0x51 -r 0:256 > dump2

Параметры программы:-f = не спрашивать, /dev/i2c-0 = с какого устройства читать, 0x50 = адрес, который мы узнали выше, -r = чтение, 0:256 = диапазон чтения от 0 до 256 байта.
Просмотреть считанное легко и просто используя hexdump -С.
Далее привожу выхлоп своих данных:
# hexdump -C dump1
00000000  01 33 02 39 01 33 2a df  01 61 ab f4 ff ff ff ff  |.3.9.3*..a......|
00000010  00 00 06 c3 ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
00000020  00 00 1c 0d ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
00000030  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*
00000100

# hexdump -C dump2
00000000  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
00000010  ff ff ff ff ff ff ff ff  50 54 31 36 36 43 48 4e  |........PT166CHN|
00000020  ff ff ff ff ff ff ff ff  43 52 55 4d 2d 31 31 31  |........CRUM-111|
00000030  30 30 37 38 31 35 31 33  01 32 de 9f 07 ff ff ff  |00781513.2......|
00000040  02 c7 9a e6 ff ff ff ff  00 01 4c 08 ff ff ff ff  |..........L.....|
00000050  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*
00000070  0a ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
00000080  a5 a5 a5 a5 50 54 31 36  36 43 48 4e ff ff ff ff  |....PT166CHN....|
00000090  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*
00000100

Теперь нам нужно обнулить счётчики и поменять номер картриджа. Делается это в любом HEX-редакторе, например hexedit -s(включает, ИМХО, более учеловеченное отображение).
Рассмотрим на готовом:
Для первого куска:
00000000 00 00 00 02 ff ff ff ff 00 00 00 00 ff ff ff ff |................|
00000010 00 00 00 00 ff ff ff ff ff ff ff ff ff ff ff ff |................|
00000020 00 00 00 00 ff ff ff ff ff ff ff ff ff ff ff ff |................|
00000030 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
00000100

Для второго куска
00000000 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
00000010 ff ff ff ff ff ff ff ff 50 54 31 36 36 43 48 4e |........PT166CHN|
00000020 ff ff ff ff ff ff ff ff 43 52 55 4d 2d 31 31 31 |........CRUM-111|
00000030 30 30 37 38 33 35 31 33 01 32 de 9f 07 ff ff ff |00783513.2......|
00000040 02 c7 9a e6 ff ff ff ff 00 01 4c 08 ff ff ff ff |..........L.....|
00000050 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
00000070 0a ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
00000080 ff ff ff ff 50 54 31 36 36 43 48 4e ff ff ff ff |....PT166CHN....|
00000090 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
00000100

Звёздочки, если вы не догадались - повторяющиеся линии файла. В редакторе строк будет несколько большим.
В первом файле мы обнулили счётчики - это первые 3 строки.
Во-втором файле мы изменили версию чипа CRUM, подправив одну цифру. Эта цифра при сбросе чипа будет всегда различаться, и если совпадёт - принтер не примет картридж. В строке |00783513.2......| можно менять всё что угодно, или всё что угодно до точки с двойкой (?).
В строке 00000080 мы убрали все a5 a5 a5 a5. Это, как говорят некоторые особо разбирающиеся люди - прогресс бар.
Всё. Зашиваем обратно:
# cat dump1 |./eeprog -f /dev/i2c-0 0x50 -w 0
# cat dump2 |./eeprog -f /dev/i2c-0 0x51 -w 0

Параметры программы:-f = не спрашивать, /dev/i2c-0 = на какое устройство писать, 0x50 = адрес, по которому писать, -w = запись, 0 = начиная с 0-ого байта.

Вуаля!

0 коммент.:

Отправить комментарий