реклама на сайте
подробности

 
 
> Вопрос про CY7C68013 EZ-USB FX2, Есть готовое устройство, нужно подключиться, не поломав.
niktagor
сообщение Aug 31 2010, 11:41
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 24-06-09
Пользователь №: 50 601



Добрый день. Систуация такая. Имеется готовое устройство от буржуйских разработчиков, построенное на базе CY7C68013. К нему прилагается программа под винду, которую мне нужно полностью заменить своей самопальной программой. При этом прошивку устройства требуется оставить нетронутой. Использует она драйвер ezusb.sys. Имеется также бумажка с описанием USB команд и формата пакетов для устройства. Никогда с данным чипом дела не имел. Сейчас скачал CY3681 EZ-USB FX2 Development Kit, запустил EZ-USB Control Panel. Устройство успешно определилось. Смотрю на все это, и возникают у меня вопросы, и не могу я удержаться и не задать их вам.

1. Как мне скопировать всю информацию из чипа (программу, EEPROM и.т.д.), и что вообще нужно копировать, чтобы в процессе изучения не испортить объект изучения?

2. Я правильно понимаю, что EZ-USB Control Panel позволяет мне вручную потестировать интерфейс взаимодействия с устройством, напрямую посылая байты в оконечные точки и принимая оттуда данные?

3. uVision2 - это программа для написания прошивки? Нужно ли мне вообще в ней что-то делать, если я прошивку менять не хочу?

4. Я скачал и установил Suite USB 3.4 for Visual Studio. В самой студии ничего не изменилось. Как мне ее найти? Умеет ли она работать с драйвером ezusb.sys? Если нет, то можно ли мне использовать новый драйвер cyusb.sys, если прошивка написана под старый?

5. Как узнать, в каком режиме девайс работает - full speed или high speed?

6. Сейчас сижу под вистой. Могут ли возникнуть проблемы из-за несовместимости с ней старого драйвера?

7. (пространный) Может ли в устройстве быть защита, которая не позволит ему работать не с родной программой? (догадываюсь, что может). Может ли быть защита, которая не позволит ему работать с инструментарием от cypress? Может ли быть защита, которая что-нибудь сломает, если "узнает", что я пытаюсь написать свою софтину?

8. Какой алгоритм дальнейшей работы посоветуете? Какие программы использовать? Какие вопросы у меня еще не возникли, но могут возникнуть в ближайшее время? На какие подводные камни я могу напороться?


На некоторые из этих вопросов на форуме в том или ином виде уже есть ответы, но меня они не совсем устроили. Большое спасибо всем, кто откликнется!

Сообщение отредактировал niktagor - Aug 31 2010, 11:44
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Konst_777
сообщение Sep 20 2010, 14:38
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644



Цитата(niktagor @ Aug 31 2010, 14:41) *
...Имеется готовое устройство от буржуйских разработчиков, построенное на базе CY7C68013...

Цитата(niktagor @ Sep 20 2010, 16:24) *
Все сходится. Файл 17КБ. В начале - 0xC2. В конце - 0x80 0x01 0xE6 0x00 0x00...

Значит, таки не CY7C68013 (FX2), а CY7C68013a (FX2LP).

Цитата(niktagor @ Sep 13 2010, 10:32) *
...
Код
       <ENDPOINT>
                         Type="BULK"
                         Direction="OUT"
                         Address="01h"
                         Attributes="02h"
                         MaxPktSize="512"
                         DescriptorType="5"
                         DescriptorLength="7"
                         Interval="0"
             </ENDPOINT>

...

То есть, в таблице дескрипторов описание эндпоинта EP1OUT выглядит так:

High-Speed Bulk Out Endpoint Descriptor
db 07H ; Descriptor length
db 05H ; Descriptor type: Endpoint
db 01H ; Endpoint number, OUT direction
db 02H ; Endpoint type: Bulk
db 00H ; Maximun packet size (LSB)
db 02H ; Max packect size (MSB)
db 00H ; Polling interval

А мы хотим получить такой эндпоинт EP1OUT:

High-Speed Interrupt Out Endpoint Descriptor
db 07H ; Descriptor length
db 05H ; Descriptor type: Endpoint
db 01H ; Endpoint number, OUT direction
db 03H ; Endpoint type: Interrupt
db 40H ; Maximun packet size (LSB)
db 00H ; Max packect size (MSB)
db 02H ; Polling interval = (2^(bInterval-1))*125us = 250us

То есть, нужно в файле *.iic найти следующую последовательность байтов:
07 05 01 02 00 02 00

И заменить ее на такую:
07 05 01 03 40 00 02

Затем нужно научить Вашу программу загружать содержимое отредактированного файла *.iic в память FX2LP. Для C# библиотека CyUsb.dll имеет метод LoadRAM() в классе CyFX2Device (см. "Programmers Reference - C# Library" (файл CyUSB.NET.chm)). Для С++ эту функцию Вам придется писать самому.

Если firmware для FX2LP содержит переподключение к шине USB, то смену типа EP1OUT с Bulk на Interrupt Вы сможете увидеть, например с помощью CyConsole, сразу после загрузки firmware в FX2LP и переподключения FX2LP к шине USB. Если firmware для FX2LP не содержит переподключение к шине USB, то потребуются дополнительные действия.

Цитата(niktagor @ Sep 20 2010, 16:24) *
Все сходится. Файл 17КБ. В начале - 0xC2. В конце - 0x80 0x01 0xE6 0x00 0x00...

А все таки, Вы проверили, что структура считанного файла соответствует описанной в подразделе "3.4.3 Serial EEPROM Present, First Byte is 0xC2" EZ-USB® Technical Reference Manual ? То есть, перемещаясь по заголовкам каждой записи благополучно дошли до завершающей (0x80 0x01 0xE6 0x00 0x00) ???
Go to the top of the page
 
+Quote Post
niktagor
сообщение Sep 20 2010, 18:34
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 24-06-09
Пользователь №: 50 601



Цитата(Konst_777 @ Sep 20 2010, 18:38) *
А все таки, Вы проверили, что структура считанного файла соответствует описанной в подразделе "3.4.3 Serial EEPROM Present, First Byte is 0xC2" EZ-USB® Technical Reference Manual ? То есть, перемещаясь по заголовкам каждой записи благополучно дошли до завершающей (0x80 0x01 0xE6 0x00 0x00) ???

Проверил. Не соответствует. Самый первый байт - 0xС2. Потом идут судя по всему какие-то данные, совсем не то, что написано в мануале. Начиная с адреса примерно 0x2200 идет то, что должно быть с 0x01 (VID,PID...). Чуть подальше, с 0x2290 идет такая последовательность байт:
Код
07 05 01 02 00 02 00
07 05 82 02 00 02 00
07 05 86 02 00 02 00
07 05 81 02 00 02 00
09 02 2E 00 01 01 00 80 32
09 04 00 00 04 FF 00 00 00
07 05 01 02 40 00 00
07 05 82 02 40 00 00
07 05 86 02 40 00 00
07 05 81 02 40 00 00

То есть что-то типа двух разных конфигураций эндпоинтов. Менять только самую первую? Это не повлияет на работу алгоритма считывания данных с прибора?
Завершающая последовательность встречается только один раз, в конце файла.

Самое забавное - то, что я считал всякие данные с адресов 0x4000 - 0x43FF, хотя в мануале написано:
Цитата
Note Serial EEPROM data can be loaded only into these
three on-chip RAM spaces:
■ Program/Data RAM at 0x0000-0x3FFF
■ Data RAM at 0xE000-0xE1FF
■ The CPUCS register (at 0xE600 (only bit 0, 8051RES, is
EEPROM loadable)

Считываю 0xE000 - 0xEFFF, там совсем пусто.
Чудеса!!!

Так ведь я ж не стал сначала проверять. Я сразу давай загружать прошивку обратно, чтобы проверить возможность совершения этого действия. И вот парадокс - работает! Причем при изменении чего-нибудь, работать перестает. То есть оно реально загружает то, что я ему подсовываю.

Цитата
Значит, таки не CY7C68013 (FX2), а CY7C68013a (FX2LP).

Как Вы определили? У меня TRM на них один и тот же, и про EEPROM там для них одинаково написано.

Сообщение отредактировал niktagor - Sep 20 2010, 18:35
Go to the top of the page
 
+Quote Post
Konst_777
сообщение Sep 20 2010, 21:55
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644



Цитата(niktagor @ Sep 20 2010, 21:34) *
Проверил. Не соответствует. Самый первый байт - 0xС2. Потом идут судя по всему какие-то данные, совсем не то, что написано в мануале.
...
Самое забавное - то, что я считал всякие данные с адресов 0x4000 - 0x43FF, хотя в мануале написано:...

Похоже, что используется внешняя память (программы или данных). Тогда в начале файла *.iic помещается загрузчик, цель которого, преодолеть ограничения загрузки программы или данных только во внутреннюю память контроллера (см. .hex working, .iic not working). В этом случае контроллер может быть и FX2 (CY7C68013), хотя файл *.iic имеет объем больше 8К. То есть, нужно уточнить, какой контроллер используется (Distinction between FX2 and FX2LP by firmware).

Цитата(niktagor @ Sep 20 2010, 21:34) *
...
То есть что-то типа двух разных конфигураций эндпоинтов. Менять только самую первую? Это не повлияет на работу алгоритма считывания данных с прибора?
...

Да, два набора дескрипторов для режимов High Speed и Full Speed.
Менять только строку "07 05 01 02 00 02 00" на строку "07 05 01 03 40 00 02". В режиме Full Speed не будет обеспечена нужная Вам скорость обмена. Поэтому для дескрипторов режима Full Speed и не нужны изменения.
Не повлияет.

Цитата(niktagor @ Sep 20 2010, 21:34) *
...Причем при изменении чего-нибудь, работать перестает...

То есть, меняете строку строку "07 05 01 02 00 02 00" на строку "07 05 01 03 40 00 02" и перестает работать?
Я так понял, что Вы используете USB Control Center для загрузки модифицированного файла *.iic во внутреннюю память FX2/FX2LP. Это опасно. Рука дрогнет и перепрограммируете первые 256 байт EEPROM.

Цитата(niktagor @ Sep 20 2010, 21:34) *
Как Вы определили? У меня TRM на них один и тот же, и про EEPROM там для них одинаково написано.

С этой страницы можно скачать EZ-USB® Technical Reference Manual для FX2. В FX2 8K внутренней памяти программ и данных, в FX2LP - 16K. Я полагал, что firmware использует только внутреннюю память контроллера FX2/FX2LP. Поэтому, когда узнал, что файл *.iic занимает 17К, то посчитал, что 17К просто не поместятся в FX2. Serg_Sm совершенно справедливо указал, что на самом деле, объем EEPROM может и превышать объем внутренней памяти контроллера.
Go to the top of the page
 
+Quote Post
niktagor
сообщение Sep 21 2010, 17:55
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 24-06-09
Пользователь №: 50 601



Цитата
То есть, меняете строку строку "07 05 01 02 00 02 00" на строку "07 05 01 03 40 00 02" и перестает работать?
Я так понял, что Вы используете USB Control Center для загрузки модифицированного файла *.iic во внутреннюю память FX2/FX2LP. Это опасно. Рука дрогнет и перепрограммируете первые 256 байт EEPROM.


Изготовитель предоставляет программатор с одной кнопочкой "зашить", и прошивки раньше тоже были доступны. Скачивать он не умеет. Новую прошивку, которая у меня, не дают.
Строку поменял, все нормально переконфигурировалось. Определяется как interrupt. Массив запросов с CYUSB_OUT он не хочет воспринимать. То есть сколько бы я ему их не посылал, после срабатывания "CYUSB_IN", он информацию перестает выдавать. Скорее всего, такой код. Зато с ситуации 2.1мс+- 0.1мс все изменилось на очень стабильные 2мс +- 0.001мс. И это очень радует. У родной программы было хуже(2.5мс +- 0.5мс и иногда несколько отсчетов выпадало вообще), так что работа не впустую проделана.
Не радует вот что. У датчика время измерения можно менять. 1мс - это я писал самое минимальное, т.к. только в этом режиме будем работать с прибором.
Так вот,со старой конфигурацией время цикла было примерно равно времени измерения + 1мс. А теперь оно равно t измерения для t>2мс. А при t<2мс оно все равно равно 2мс.
То есть получается, что прибор умеет параллельно передавать данные и делать измерение, но это только для t>2мс. А в моем случае, при t=1мс, он намеренно ждет. Такой я могу сделать вывод.

И скорее всего, выход один - копать ассемблерный код... crying.gif

Сообщение отредактировал niktagor - Sep 21 2010, 17:56
Go to the top of the page
 
+Quote Post
Konst_777
сообщение Sep 21 2010, 19:15
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644



Цитата(niktagor @ Sep 21 2010, 20:55) *
...
И скорее всего, выход один - копать ассемблерный код... crying.gif

Еще рано горевать.
Во-первых, я промахнулся. Мы хотели обеспечить для EP1OUT: Type="INTERRUPT" и MaxPktSize="1". А сделали:Type="INTERRUPT" и MaxPktSize="64". Так что, если массив запросов с CYUSB_OUT у Вас меньше 64, то Вы и получите в ответ один формуляр CYUSB_IN. Чтобы сделать MaxPktSize="1", нужно в измененном файле *.iic заменить последовательность байт "07 05 01 03 40 00 02" на "07 05 01 03 01 00 02".
Во-вторых, пожалуйста, опишите формат байта (назначение битов), который составляет запрос CYUSB_OUT.
В третьих, опишите алгоритм выдачи массива запросов CYUSB_OUT и прием массива ответов CYUSB_IN. Насколько он отличается от такого алгоритма:
1) BeginDataXfer() c "CYUSB_IN" на прием массива размером N*4.5 Кбайт, N=1000
2) BeginDataXfer() c "CYUSB_OUT" на выдачу массива N байт, N=1000
3) WaitForXfer() и FinishDataXfer() для "CYUSB_OUT"
4) WaitForXfer() и FinishDataXfer() для "CYUSB_IN"

Еще вопрос:
Цитата(niktagor @ Sep 8 2010, 12:48) *
Устройство сделано так, что я отправляю туда один запрос размером 1 байт. Оно в ответ выплевывает 8 транзакций по 512 байт и одну с sync packet'ом...

Вот этот последний sync packet тоже содержит 512 байт или меньше? Если меньше 512 байт, то тогда понятно почему Вы получаете один формуляр CYUSB_IN в ответ на массив запросов с CYUSB_OUT.
Go to the top of the page
 
+Quote Post
niktagor
сообщение Sep 22 2010, 09:17
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 24-06-09
Пользователь №: 50 601



Цитата(Konst_777 @ Sep 21 2010, 23:15) *
Вот этот последний sync packet тоже содержит 512 байт или меньше? Если меньше 512 байт, то тогда понятно почему Вы получаете один формуляр CYUSB_IN в ответ на массив запросов с CYUSB_OUT.

Почему? Мне не понятно. Он один байт всего содержит. И я посылаю массив запросов на 4097 байт.
Цитата(Konst_777 @ Sep 21 2010, 23:15) *
Мы хотели обеспечить для EP1OUT: Type="INTERRUPT" и MaxPktSize="1".
...
Во-вторых, пожалуйста, опишите формат байта (назначение битов), который составляет запрос CYUSB_OUT.

Там нет назначений битов. Просто байт запроса данных. Все конфигурирование типа установки скорости датчика происходит заранее, с помощью других команд. Размеры некоторых больше одного байта. Можно ли в этом случае делать MaxPktSize=1?
Я правильно понимаю, что в устройстве буфер 64 байта и он его весь забивает нулями, когда я посылаю команду с MaxPktSize = 64, а мы пытаемся поместить в него несколько команд?
Цитата(Konst_777 @ Sep 21 2010, 23:15) *
В третьих, опишите алгоритм выдачи массива запросов CYUSB_OUT и прием массива ответов CYUSB_IN. Насколько он отличается от такого алгоритма:
1) BeginDataXfer() c "CYUSB_IN" на прием массива размером N*4.5 Кбайт, N=1000
2) BeginDataXfer() c "CYUSB_OUT" на выдачу массива N байт, N=1000
3) WaitForXfer() и FinishDataXfer() для "CYUSB_OUT"
4) WaitForXfer() и FinishDataXfer() для "CYUSB_IN"

Сейчас с таким работает:

0)BeginDataXfer() c "CYUSB_IN" на прием 4097 байт
while(i<1000)
{
1) BeginDataXfer() c "CYUSB_IN" на прием 4097 байт
2) XferData() для "CYUSB_OUT"
3) WaitForXfer() и FinishDataXfer() для "CYUSB_IN"
i++
}
5)WaitForXfer() и FinishDataXfer() для "CYUSB_IN"

Причем WaitForXfer вызывается для того запроса, который был послан раньше. Массив запросов ни в ту ни в другую сторону он не хочет воспринимать. XferData() выполняется совсем быстро (5мкс), поэтому делаю синхронно.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- niktagor   Вопрос про CY7C68013 EZ-USB FX2   Aug 31 2010, 11:41
- - niktagor   При попытках понять работу примера BulkXfer, родил...   Aug 31 2010, 17:30
- - Konst_777   Цитата(niktagor @ Aug 31 2010, 14:41) 1. ...   Aug 31 2010, 18:11
|- - niktagor   ЦитатаМожно, нужно отредактировать cyusb.inf файл,...   Sep 1 2010, 10:33
|- - Konst_777   Цитата(niktagor @ Sep 1 2010, 13:33) На в...   Sep 1 2010, 17:22
- - niktagor   ЦитатаВ таком случае, почему есть уверенность, что...   Sep 1 2010, 18:47
|- - Konst_777   Цитата(niktagor @ Sep 1 2010, 21:47) ...М...   Sep 1 2010, 18:58
- - niktagor   Добрый день. Ситуация такая. Драйвер cyusb.sys нас...   Sep 7 2010, 18:47
|- - Mik174   Цитата(niktagor @ Sep 7 2010, 22:47) Или ...   Sep 7 2010, 19:39
|- - Serg_Sm   Цитата(niktagor @ Sep 7 2010, 22:47) Добр...   Sep 8 2010, 08:19
|- - niktagor   Цитата(Serg_Sm @ Sep 8 2010, 12:19) 40 МБ...   Sep 8 2010, 08:32
|- - Serg_Sm   Цитата(niktagor @ Sep 8 2010, 12:32) Прот...   Sep 8 2010, 09:27
- - Harbinger   Оно же USBee нескольких модификаций, оно же LOGIC-...   Sep 7 2010, 19:55
- - niktagor   ЦитатаЧто значит "именно блоками по 4К"?...   Sep 8 2010, 09:48
|- - Konst_777   Цитата(niktagor @ Sep 8 2010, 12:48) ...В...   Sep 8 2010, 10:14
|- - Serg_Sm   Цитата(niktagor @ Sep 8 2010, 13:48) Устр...   Sep 8 2010, 10:21
||- - Konst_777   Цитата(Serg_Sm @ Sep 8 2010, 13:21) ... и...   Sep 8 2010, 11:29
|- - -Al-   Цитата(niktagor @ Sep 8 2010, 13:48) Устр...   Sep 10 2010, 04:57
|- - Седой   Цитата(-Al- @ Sep 10 2010, 10:5...   Sep 10 2010, 06:15
|- - -Al-   Цитата(Седой @ Sep 10 2010, 10:15) НИКОГД...   Sep 10 2010, 18:59
|- - Седой   Цитата(-Al- @ Sep 11 2010, 00:5...   Sep 11 2010, 07:52
- - niktagor   Хорошо. Почему тогда этот другой процесс ВСЕГДА за...   Sep 8 2010, 10:31
|- - Serg_Sm   Цитата(niktagor @ Sep 8 2010, 14:31) Хоро...   Sep 8 2010, 11:19
- - niktagor   Про 15 миллисекунд разобрался. Это точность систем...   Sep 8 2010, 12:03
|- - Konst_777   Цитата(niktagor @ Sep 8 2010, 13:31) Ситу...   Sep 8 2010, 14:38
|- - VladimirB   Цитата(niktagor @ Sep 8 2010, 16:03) Про ...   Sep 8 2010, 20:18
|- - Konst_777   Цитата(niktagor @ Sep 8 2010, 12:48) ... ...   Sep 9 2010, 11:54
- - Serg_Sm   В FX2LP есть аппаратная буферизация - как минимум ...   Sep 8 2010, 12:48
- - niktagor   Прикрутил high-resolution timer. Выясняется, что м...   Sep 9 2010, 17:24
|- - VladimirB   Цитата(niktagor @ Sep 9 2010, 21:24) Прик...   Sep 9 2010, 20:02
- - niktagor   По поводу моих 250мкс по Вашей ссылке нашел интере...   Sep 10 2010, 08:30
|- - Konst_777   Цитата(niktagor @ Sep 10 2010, 11:30) ......   Sep 10 2010, 19:23
- - niktagor   Выкладываю всю информацию об эндпоинтах и приступа...   Sep 13 2010, 07:32
|- - Konst_777   Цитата(niktagor @ Sep 13 2010, 10:32) ......   Sep 13 2010, 08:30
- - niktagor   Цитата1). Известно ли Вам как построена аппаратура...   Sep 13 2010, 08:52
|- - Konst_777   Цитата(niktagor @ Sep 13 2010, 11:52) ......   Sep 13 2010, 09:50
|- - niktagor   Цитата(Konst_777 @ Sep 13 2010, 13:50) .....   Sep 13 2010, 14:28
|- - Konst_777   Цитата(niktagor @ Sep 13 2010, 17:28) Да,...   Sep 13 2010, 16:53
- - niktagor   ЦитатаВ FX2LP EP1OUT имеет буфер объемом 64 байта ...   Sep 13 2010, 17:26
|- - Konst_777   Цитата(niktagor @ Sep 13 2010, 20:26) Мой...   Sep 15 2010, 18:35
- - Konst_777   Давайте, вначале Вы ответите на мои вопросы. А зат...   Sep 13 2010, 17:30
- - niktagor   Konst_777, прошу прощения за невнимательность. Цит...   Sep 14 2010, 14:43
|- - Konst_777   Цитата(niktagor @ Sep 14 2010, 17:43) ......   Sep 14 2010, 19:49
|- - niktagor   Цитата(Konst_777 @ Sep 14 2010, 23:49) Ит...   Sep 15 2010, 14:42
- - niktagor   EEPROM скачал успешно! Всего 17КБ вышло. Гляну...   Sep 19 2010, 18:50
|- - Konst_777   Цитата(niktagor @ Sep 19 2010, 21:50) ......   Sep 19 2010, 19:02
|- - niktagor   Цитата(Konst_777 @ Sep 19 2010, 23:02) Ди...   Sep 20 2010, 13:24
- - Serg_Sm   Кипарисы с буковкой "A" имеют 16Кбайт па...   Sep 20 2010, 05:06
- - niktagor   Сегодня хотел попробовать загрузить обратно данные...   Sep 20 2010, 08:47
|- - Serg_Sm   Цитата(niktagor @ Sep 20 2010, 12:47) Сег...   Sep 20 2010, 10:42
|- - Konst_777   Цитата(niktagor @ Sep 22 2010, 12:17) Поч...   Sep 22 2010, 17:39
- - MSM   Здравствуйте Уважаемые форумчане. Прочитал внимате...   May 15 2014, 15:06
|- - jcxz   Вы уверены, что прошивка грузится именно из .sys, ...   May 15 2014, 15:55
- - MSM   Прошивка точно грузится из файла AD9957LD.sys В 15...   May 19 2014, 02:30
- - MSM   Спасибо за советы. Прошивку вытащить удалось. Тепе...   May 28 2014, 10:12
- - Dele   Добрый день! Может немного не суда, но все же....   Jun 11 2014, 02:05


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th June 2025 - 11:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01536 секунд с 7
ELECTRONIX ©2004-2016