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

 
 
 
Reply to this topicStart new topic
> IAR EWARM6.3 и NVIC в ATSAM4S16B, Как при отладке смотреть регистры NVIC
Obam
сообщение Nov 14 2014, 12:52
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



При работе с SAM4S16B (ATMEL) пользуюсь IAR EWARM6.3 и ассемблером : в выпадающем списке окна Registers нет регистров, относящихся к NVIC.
Отладка идет с использованием штатного IAR-овского файла iosam4s16b.svd: в нём нет и намёка на NVIC.
Есть подозрение, что в файлике iosam4s.ddf NVIC прописан, только его нет нигде.

Может уважаемое сообщество знает как помочь моей беде? :)
Go to the top of the page
 
+Quote Post
jcxz
сообщение Nov 18 2014, 07:46
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Так же как и с любой другой периферией ядра:
заходите на
http://infocenter.arm.com/help/index.jsp?t...home/index.html
качаете Reference Manual на своё ядро и изучаете раздел NVIC.
Go to the top of the page
 
+Quote Post
Obam
сообщение Nov 24 2014, 14:05
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Любезный, как RefMAN на ядро поможет включить отображение регистров NVIC в EWARM при отладке SAM4S16? wink.gif

Вы бы посмотрели у себя в каталоге с IARом: может завалялся файлик iosam4s.ddf?


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Xenia
сообщение Nov 24 2014, 16:00
Сообщение #4


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(Obam @ Nov 24 2014, 17:05) *
Вы бы посмотрели у себя в каталоге с IARом: может завалялся файлик iosam4s.ddf?


Такого нет, но есть такие:
ATSAM4S16A.ddf
ATSAM4S16B.ddf
ATSAM4S16C.ddf
ATSAM4S2A.ddf
ATSAM4S2B.ddf
ATSAM4S2C.ddf
ATSAM4S4A.ddf
ATSAM4S4B.ddf
ATSAM4S4C.ddf
ATSAM4S8A.ddf
ATSAM4S8B.ddf
ATSAM4S8C.ddf
ATSAM4SA16B.ddf
ATSAM4SA16C.ddf
ATSAM4SD16B.ddf
ATSAM4SD16C.ddf
ATSAM4SD32B.ddf
ATSAM4SD32C.ddf
ATSAM4SP32A.ddf

А из iosam4s бывает только хидер:
iosam4s.h
Go to the top of the page
 
+Quote Post
Obam
сообщение Nov 25 2014, 07:55
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Xenia, (сужу по аватарке) голубушка, поделитесь .ddf-ками на SAM4, не сочтите за труд.
В моей инсталляции EWARM Сortex-ы Atmela разрисованы только .svd-файлами.
Go to the top of the page
 
+Quote Post
Xenia
сообщение Nov 25 2014, 13:39
Сообщение #6


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(Obam @ Nov 25 2014, 10:55) *
Xenia, (сужу по аватарке) голубушка, поделитесь .ddf-ками на SAM4, не сочтите за труд.
В моей инсталляции EWARM Сortex-ы Atmela разрисованы только .svd-файлами.


Это файлы от EWARM-7303
Прикрепленные файлы
Прикрепленный файл  ATSAM4S.zip ( 13.24 килобайт ) Кол-во скачиваний: 14
 
Go to the top of the page
 
+Quote Post
jcxz
сообщение Nov 26 2014, 06:14
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Obam @ Nov 24 2014, 20:05) *
Любезный, как RefMAN на ядро поможет включить отображение регистров NVIC в EWARM при отладке SAM4S16? wink.gif

Элементарно:
1.Описываете необходимую периферию. Например так:
CODE
//NVIC (Cortex-M3 Peripheral)
typedef struct {
u32 unuse0[1];
u32 INT_TYPE;
u32 ACTLR;
u32 unuse1[1];
struct {
u32 CTRL;
u32 LOAD;
u32 VAL;
u32 CAL;
} ST;
u32 unuse2[56];
u32 ENA[2];
u32 unuse3[30];
u32 DIS[2];
u32 unuse4[30];
u32 SETPEND[2];
u32 unuse5[30];
u32 CLRPEND[2];
u32 unuse6[30];
u32 ACTIVE[2];
u32 unuse7[62];
u32 PRI[16];
u32 unuse8[560];
u32 CPUID;
u32 INT_CTRL;
u32 VTABLE;
u32 APINT;
u32 SCR; //System Control Register
u32 CCR; //Configuration Control Register
u32 SYSPRI[3]; //System Handler Priority Registers
u32 SHCSR; //System Handler Control and State Register
union {
u32 CFSR; //Configurable Fault Status Register
struct {
u8 MMFSR; //Memory Manage Fault Status Register
u8 BFSR; //Bus Fault Status Register
u16 UFSR; //Usage Fault Status Register
};
};
u32 HFSR; //Hard Fault Status Register
u32 DFSR; //Debug Fault Status Register
u32 MMFAR; //Memory Manage Fault Address Register
u32 BFAR; //Bus Fault Address Register
u32 unuse9[21];
u32 MPU_TYPE;
u32 MPU_CTRL;
u32 MPU_NUMBER;
u32 MPU_BASE;
u32 MPU_ATTR;
u32 unuse10[19];
u32 DBG_CTRL;
u32 DBG_XFER;
u32 DBG_DATA;
u32 DBG_INT;
u32 unuse11[64];
u32 SW_TRIG;
} HwRegsNVIC;


2.Натягиваете её на адресное пространство:
EXTERN volatile __no_init __root __absolute HwRegsNVIC NVIC @ 0xE000E000;

3.В окне Watch IAR-а вводите NVIC.
4Наслаждаетесь результатом. Без всяких ddf.
Go to the top of the page
 
+Quote Post
Obam
сообщение Nov 27 2014, 08:08
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Ну во-первЫх: ddf-ы неотъемлемая часть IARa, а Atmel небрежно их составляет (вспоминаются стародавние времена EWARM4.30 - у AT91SAM7S256
были прописаны по одному AIC_SMR и AIC_SМR регистру вместо 32-х); почему-то для NXP-овых и STM-ных
Cortexов NVIC в окне регистров отображается.
Во-вторых: нету никаких "volatile","__root", __absolute" и прочей ботвы - ибо ассемблер.

Вот как-то так…

Цитата(Xenia @ Nov 25 2014, 17:39) *
Это файлы от EWARM-7303


Спасибо большое
Go to the top of the page
 
+Quote Post
Obam
сообщение Feb 4 2015, 12:23
Сообщение #9


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Появилось чуть свободного времени и я "добил" тему с неотображением NVIC в регистрах IAR EWARM6.3: с сайта ARM взял STM32F4xx.svd,
(в нём NVIC расписан) привел раздел <peripheral> в соответствие с Atmel-11100G-ATARM-SAM4S-Datasheet_27-May-14, добавил в ATSAM4S16B.svd
и всё заработало.

CODE
<peripheral>
<name>NVIC</name>
<description>Nested Vectored Interrupt
Controller</description>
<groupName>NVIC</groupName>
<baseAddress>0xE000E000</baseAddress>
<addressBlock>
<offset>0x0</offset>
<size>0x1001</size>
<usage>registers</usage>
</addressBlock>
<addressBlock>
<offset>0x1001</offset>
<size>0xFFFFF3FF</size>
<usage>reserved</usage>
</addressBlock>
<registers>
<register>
<name>NVIC_STIR</name>
<displayName>NVIC_STIR</displayName>
<description>Software Triggered Interrupt
Register</description>
<addressOffset>0xF00</addressOffset>
<size>0x20</size>
<access>write-only</access>
<resetValue>0x00000000</resetValue>
<fields>
<field>
<name>INTID</name>
<description>interrupt to be triggered</description>
<bitOffset>0</bitOffset>
<bitWidth>9</bitWidth>
</field>
</fields>
</register>
<register>
<name>NVIC_ISER0</name>
<displayName>NVIC_ISER0</displayName>
<description>Interrupt Set-Enable Register</description>
<addressOffset>0x100</addressOffset>
<size>0x20</size>
<access>read-write</access>
<resetValue>0x00000000</resetValue>
<fields>
<field>
<name>SETENA</name>
<description>SETENA</description>
<bitOffset>0</bitOffset>
<bitWidth>32</bitWidth>
</field>
</fields>
</register>
<register>
<name>NVIC_ISER1</name>
<displayName>NVIC_ISER1</displayName>
<description>Interrupt Set-Enable Register</description>
<addressOffset>0x104</addressOffset>
<size>0x20</size>
<access>read-write</access>
<resetValue>0x00000000</resetValue>
<fields>
<field>
<name>SETENA</name>
<description>SETENA</description>
<bitOffset>0</bitOffset>
<bitWidth>32</bitWidth>
</field>
</fields>
</register>
<register>
<name>NVIC_ISER2</name>
<displayName>NVIC_ISER2</displayName>
<description>Interrupt Set-Enable Register</description>
<addressOffset>0x108</addressOffset>
<size>0x20</size>
<access>read-write</access>
<resetValue>0x00000000</resetValue>
<fields>
<field>
<name>SETENA</name>
<description>SETENA</description>
<bitOffset>0</bitOffset>
<bitWidth>32</bitWidth>
</field>
</fields>
</register>
<register>
<name>NVIC_ICER0</name>
<displayName>NVIC_ICER0</displayName>
<description>Interrupt Clear-Enable
Register</description>
<addressOffset>0x180</addressOffset>
<size>0x20</size>
<access>read-write</access>
<resetValue>0x00000000</resetValue>
<fields>
<field>
<name>CLRENA</name>
<description>CLRENA</description>
<bitOffset>0</bitOffset>
<bitWidth>32</bitWidth>
</field>
</fields>
</register>
<register>
<name>NVIC_ICER1</name>
<displayName>NVIC_ICER1</displayName>
<description>Interrupt Clear-Enable
Register</description>
<addressOffset>0x184</addressOffset>
<size>0x20</size>
<access>read-write</access>
<resetValue>0x00000000</resetValue>
<fields>
<field>
<name>CLRENA</name>
<description>CLRENA</description>
<bitOffset>0</bitOffset>
<bitWidth>32</bitWidth>
</field>
</fields>
</register>
<register>
<name>NVIC_ICER2</name>
<displayName>NVIC_ICER2</displayName>
<description>Interrupt Clear-Enable
Register</description>
<addressOffset>0x188</addressOffset>
<size>0x20</size>
<access>read-write</access>
<resetValue>0x00000000</resetValue>
<fields>
<field>
<name>CLRENA</name>
<description>CLRENA</description>
<bitOffset>0</bitOffset>
<bitWidth>32</bitWidth>
</field>
</fields>
</register>
<register>
<name>NVIC_ISPR0</name>
<displayName>NVIC_ISPR0</displayName>
<description>Interrupt Set-Pending Register</description>
<addressOffset>0x200</addressOffset>
<size>0x20</size>
<access>read-write</access>
<resetValue>0x00000000</resetValue>
<fields>
<field>
<name>SETPEND</name>
<description>SETPEND</description>
<bitOffset>0</bitOffset>
<bitWidth>32</bitWidth>
</field>
</fields>
</register>
<register>
<name>NVIC_ISPR1</name>
<displayName>NVIC_ISPR1</displayName>
<description>Interrupt Set-Pending Register</description>
<addressOffset>0x204</addressOffset>
<size>0x20</size>
<access>read-write</access>
<resetValue>0x00000000</resetValue>
<fields>
<field>
<name>SETPEND</name>
<description>SETPEND</description>
<bitOffset>0</bitOffset>
<bitWidth>32</bitWidth>
</field>
</fields>
</register>
<register>
<name>NVIC_ISPR2</name>
<displayName>NVIC_ISPR2</displayName>
<description>Interrupt Set-Pending Register</description>
<addressOffset>0x208</addressOffset>
<size>0x20</size>
<access>read-write</access>
<resetValue>0x00000000</resetValue>
<fields>
<field>
<name>SETPEND</name>
<description>SETPEND</description>
<bitOffset>0</bitOffset>
<bitWidth>32</bitWidth>
</field>
</fields>
</register>
<register>
<name>NVIC_ICPR0</name>
<displayName>NVIC_ICPR0</displayName>
<description>Interrupt Clear-Pending
Register</description>
<addressOffset>0x280</addressOffset>
<size>0x20</size>
<access>read-write</access>
<resetValue>0x00000000</resetValue>
<fields>
<field>
<name>CLRPEND</name>
<description>CLRPEND</description>
<bitOffset>0</bitOffset>
<bitWidth>32</bitWidth>
</field>
</fields>
</register>
<register>
<name>NVIC_ICPR1</name>
<displayName>NVIC_ICPR1</displayName>
<description>Interrupt Clear-Pending
Register</description>
<addressOffset>0x284</addressOffset>
<size>0x20</size>
<access>read-write</access>
<resetValue>0x00000000</resetValue>
<fields>
<field>
<name>CLRPEND</name>
<description>CLRPEND</description>
<bitOffset>0</bitOffset>
<bitWidth>32</bitWidth>
</field>
</fields>
</register>
<register>
<name>NVIC_ICPR2</name>
<displayName>NVIC_ICPR2</displayName>
<description>Interrupt Clear-Pending
Register</description>
<addressOffset>0x288</addressOffset>
<size>0x20</size>
<access>read-write</access>
<resetValue>0x00000000</resetValue>
<fields>
<field>
<name>CLRPEND</name>
<description>CLRPEND</description>
<bitOffset>0</bitOffset>
<bitWidth>32</bitWidth>
</field>
</fields>
</register>
<register>
<name>NVIC_IABR0</name>
<displayName>NVIC_IABR0</displayName>
<description>Interrupt Active Bit Register</description>
<addressOffset>0x300</addressOffset>
<size>0x20</size>
<access>read-only</access>
<resetValue>0x00000000</resetValue>
<fields>
<field>
<name>ACTIVE</name>
<description>ACTIVE</description>
<bitOffset>0</bitOffset>
<bitWidth>32</bitWidth>
</field>
</fields>
</register>
<register>
<name>NVIC_IABR1</name>
<displayName>NVIC_IABR1</displayName>
<description>Interrupt Active Bit Register</description>
<addressOffset>0x304</addressOffset>
<size>0x20</size>
<access>read-only</access>
<resetValue>0x00000000</resetValue>
<fields>
<field>
<name>ACTIVE</name>
<description>ACTIVE</description>
<bitOffset>0</bitOffset>
<bitWidth>32</bitWidth>
</field>
</fields>
</register>
<register>
<name>NVIC_IABR2</name>
<displayName>NVIC_IABR2</displayName>
<description>Interrupt Active Bit Register</description>
<addressOffset>0x308</addressOffset>
<size>0x20</size>
<access>read-only</access>
<resetValue>0x00000000</resetValue>
<fields>
<field>
<name>ACTIVE</name>
<description>ACTIVE</description>
<bitOffset>0</bitOffset>
<bitWidth>32</bitWidth>
</field>
</fields>
</register>
<register>
<name>NVIC_IPR0</name>
<displayName>NVIC_IPR0</displayName>
<description>Interrupt Priority Register</description>
<addressOffset>0x400</addressOffset>
<size>0x20</size>
<access>read-write</access>
<resetValue>0x00000000</resetValue>
<fields>
<field>
<name>PRI0</name>
<description>PRI0</description>
<bitOffset>0</bitOffset>
<bitWidth>8</bitWidth>
</field>
<field>
<name>PRI1</name>
<description>PRI1</description>
<bitOffset>8</bitOffset>
<bitWidth>8</bitWidth>
</field>
<field>
<name>PRI2</name>
<description>PRI2</description>
<bitOffset>16</bitOffset>
<bitWidth>8</bitWidth>
</field>
<field>
<name>PRI3</name>
<description>PRI3</description>
<bitOffset>24</bitOffset>
<bitWidth>8</bitWidth>
</field>
</fields>
</register>
<register>
<name>NVIC_IPR1</name>
<displayName>NVIC_IPR1</displayName>
<description>Interrupt Priority Register</description>
<addressOffset>0x404</addressOffset>
<size>0x20</size>
<access>read-write</access>
<resetValue>0x00000000</resetValue>
<fields>
<field>
<name>PRI0</name>
<description>PRI0</description>
<bitOffset>0</bitOffset>
<bitWidth>8</bitWidth>
</field>
<field>
<name>PRI1</name>
<description>PRI1</description>
<bitOffset>8</bitOffset>
<bitWidth>8</bitWidth>
</field>
<field>
<name>PRI2</name>
<description>PRI2</description>
<bitOffset>16</bitOffset>
<bitWidth>8</bitWidth>
</field>
<field>
<name>PRI3</name>
<description>PRI3</description>
<bitOffset>24</bitOffset>
<bitWidth>8</bitWidth>
</field>
</fields>
</register>
<register>
<name>NVIC_IPR2</name>
<displayName>NVIC_IPR2</displayName>
<description>Interrupt Priority Register</description>
<addressOffset>0x408</addressOffset>
<size>0x20</size>
<access>read-write</access>
<resetValue>0x00000000</resetValue>
<fields>
<field>
<name>PRI0</name>
<description>PRI0</description>
<bitOffset>0</bitOffset>
<bitWidth>8</bitWidth>
</field>
<field>
<name>PRI1</name>
<description>PRI1</description>
<bitOffset>8</bitOffset>
<bitWidth>8</bitWidth>
</field>
<field>
<name>PRI2</name>
<description>PRI2</description>
<bitOffset>16</bitOffset>
<bitWidth>8</bitWidth>
</field>
<field>
<name>PRI3</name>
<description>PRI3</description>
<bitOffset>24</bitOffset>
<bitWidth>8</bitWidth>
</field>
</fields>
</register>
<register>
<name>NVIC_IPR3</name>
<displayName>NVIC_IPR3</displayName>
<description>Interrupt Priority Register</description>
<addressOffset>0x40C</addressOffset>
<size>0x20</size>
<access>read-write</access>
<resetValue>0x00000000</resetValue>
<fields>
<field>
<name>PRI0</name>
<description>PRI0</description>
<bitOffset>0</bitOffset>
<bitWidth>8</bitWidth>
</field>
<field>
<name>PRI1</name>
<description>PRI1</description>
<bitOffset>8</bitOffset>
<bitWidth>8</bitWidth>
</field>
<field>
<name>PRI2</name>
<description>PRI2</description>
<bitOffset>16</bitOffset>
<bitWidth>8</bitWidth>
</field>
<field>
<name>PRI3</name>
<description>PRI3</description>
<bitOffset>24</bitOffset>
<bitWidth>8</bitWidth>
</field>
</fields>
</register>
<register>
<name>NVIC_IPR4</name>
<displayName>NVIC_IPR4</displayName>
<description>Interrupt Priority Register</description>
<addressOffset>0x410</addressOffset>
<size>0x20</size>
<access>read-write</access>
<resetValue>0x00000000</resetValue>
<fields>
<field>
<name>PRI0</name>
<description>PRI0</description>
<bitOffset>0</bitOffset>
<bitWidth>8</bitWidth>
</field>
<field>
<name>PRI1</name>
<description>PRI1</description>
<bitOffset>8</bitOffset>
<bitWidth>8</bitWidth>
</field>
<field>
<name>PRI2</name>
<description>PRI2</description>
<bitOffset>16</bitOffset>
<bitWidth>8</bitWidth>
</field>
<field>
<name>PRI3</name>
<description>PRI3</description>
<bitOffset>24</bitOffset>
<bitWidth>8</bitWidth>
</field>
</fields>
</register>
<register>
<name>NVIC_IPR5</name>
<displayName>NVIC_IPR5</displayName>
<description>Interrupt Priority Register</description>
<addressOffset>0x414</addressOffset>
<size>0x20</size>
<access>read-write</access>
<resetValue>0x00000000</resetValue>
<fields>
<field>
<name>PRI0</name>
<description>PRI0</description>
<bitOffset>0</bitOffset>
<bitWidth>8</bitWidth>
</field>
<field>
<name>PRI1</name>
<description>PRI1</description>
<bitOffset>8</bitOffset>
<bitWidth>8</bitWidth>
</field>
<field>
<name>PRI2</name>
<description>PRI2</description>
<bitOffset>16</bitOffset>
<bitWidth>8</bitWidth>
</field>
<field>
<name>PRI3</name>
<description>PRI3</description>
<bitOffset>24</bitOffset>
<bitWidth>8</bitWidth>
</field>
</fields>
</register>
<register>
<name>NVIC_IPR6</name>
<displayName>NVIC_IPR6</displayName>
<description>Interrupt Priority Register</description>
<addressOffset>0x418</addressOffset>
<size>0x20</size>
<access>read-write</access>
<resetValue>0x00000000</resetValue>
<fields>
<field>
<name>PRI0</name>
<description>PRI0</description>
<bitOffset>0</bitOffset>
<bitWidth>8</bitWidth>
</field>
<field>
<name>PRI1</name>
<description>PRI1</description>
<bitOffset>8</bitOffset>
<bitWidth>8</bitWidth>
</field>
<field>
<name>PRI2</name>
<description>PRI2</description>
<bitOffset>16</bitOffset>
<bitWidth>8</bitWidth>
</field>
<field>
<name>PRI3</name>
<description>PRI3</description>
<bitOffset>24</bitOffset>
<bitWidth>8</bitWidth>
</field>
</fields>
</register>
<register>
<name>NVIC_IPR7</name>
<displayName>NVIC_IPR7</displayName>
<description>Interrupt Priority Register</description>
<addressOffset>0x41C</addressOffset>
<size>0x20</size>
<access>read-write</access>
<resetValue>0x00000000</resetValue>
<fields>
<field>
<name>PRI0</name>
<description>PRI0</description>
<bitOffset>0</bitOffset>
<bitWidth>8</bitWidth>
</field>
<field>
<name>PRI1</name>
<description>PRI1</description>
<bitOffset>8</bitOffset>
<bitWidth>8</bitWidth>
</field>
<field>
<name>PRI2</name>
<description>PRI2</description>
<bitOffset>16</bitOffset>
<bitWidth>8</bitWidth>
</field>
<field>
<name>PRI3</name>
<description>PRI3</description>
<bitOffset>24</bitOffset>
<bitWidth>8</bitWidth>
</field>
</fields>
</register>
<register>
<name>NVIC_IPR8</name>
<displayName>NVIC_IPR8</displayName>
<description>Interrupt Priority Register</description>
<addressOffset>0x420</addressOffset>
<size>0x20</size>
<access>read-write</access>
<resetValue>0x00000000</resetValue>
<fields>
<field>
<name>PRI0</name>
<description>PRI0</description>
<bitOffset>0</bitOffset>
<bitWidth>8</bitWidth>
</field>
<field>
<name>PRI1</name>
<description>PRI1</description>
<bitOffset>8</bitOffset>
<bitWidth>8</bitWidth>
</field>
<field>
<name>PRI2</name>
<description>PRI2</description>
<bitOffset>16</bitOffset>
<bitWidth>8</bitWidth>
</field>
<field>
<name>PRI3</name>
<description>PRI3</description>
<bitOffset>24</bitOffset>
<bitWidth>8</bitWidth>
</field>
</fields>
</register>
</registers>
</peripheral>


Прикрепленное изображение


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 19:31
Рейтинг@Mail.ru


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