Например TDA7294

 Форум РадиоКот • Просмотр темы - USB HID интерфейс
Форум РадиоКот
Здесь можно немножко помяукать :)



Текущее время: Вт апр 24, 2018 13:18:51



Часовой пояс: UTC + 3 часа [ Летнее время ]


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 41 ]  На страницу 1, 2, 3  След.
Автор Сообщение
Не в сети
 Заголовок сообщения: USB HID интерфейс
СообщениеДобавлено: Чт мар 08, 2012 20:41:04 
Встал на лапы

Карма: 2
Зарегистрирован: Сб мар 03, 2012 18:54:33
Сообщений: 117
Рейтинг сообщения: 0
Прочитал, что данный интерфейс очень удобен при проектировании разного рода устройств (самоделок)
Скоростью связи вполне удовлетворен :) которую предоствляет мне интерфейс.
Собственно, сам вопрос - какие штатные функции есть в ком-пе для работы с такими устройствами и как реализовать поддержку этого интерфейса на ATmega-48 (имя устройства чтоб еще выводилось)?
В гугле забанили действительно :cry:
А если серьезно, то нигде нет ПОЛНОЙ информации по этим двум вопросам НА РУССКОМ ЯЗЫКЕ. А данная инфа могла бы быть полезна для большинства форумчан. Может, плохо искал, но не нашел.


Вернуться наверх
 Профиль WWW  
 
Не в сети
 Заголовок сообщения: Re: USB HID интерфейс
СообщениеДобавлено: Чт мар 08, 2012 20:49:20 
Держит паяльник хвостом
Аватар пользователя

Карма: 7
Зарегистрирован: Сб апр 02, 2011 18:59:22
Сообщений: 995
Откуда: Город-герой Севастополь
Рейтинг сообщения: 0
+Андрей+ писал(а):
какие штатные функции есть в ком-пе для работы с такими устройствами

Что Вы понимаете под словосочетанием "штатные функции"? Драйвера есть. =)
Вот эту тему гляньте, там ребята приводили ссылки на проект на меге восьмой. Правда, не помню, какой тип устройства - HID аль нет. Но это не суть важно.
Ищите и читайте спецификацию на интерфейс USB (1.1, к примеру). Читать и разбираться придется много.
Правда, не совсем понимаю, что означает "данный интерфейс очень удобен при проектировании разного рода устройств". Это еще смотря каких устройств. =)

_________________
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение


Вернуться наверх
 Профиль  
 
JLCPCB Prototype, Бесплатная доставка первого заказа + $2 на прототип ПП!

Крупнейший производитель печатных плат в Китае, 290,000+ заказчиков, 8,000+ он-лайн заказов в день.

Цена за 10 плат: $2 за 2-х слойную, $15 за 4-х слойную, $74 за 6-ти слойную.

LCSC Parts: Экономия до 50%, большой выбор компонентов в наличии, отправка заказа в день оплаты.

Не в сети
 Заголовок сообщения: Re: USB HID интерфейс
СообщениеДобавлено: Чт мар 08, 2012 20:52:50 
Собутыльник Кота
Аватар пользователя

Карма: 65
Зарегистрирован: Ср дек 24, 2008 10:58:58
Сообщений: 2922
Рейтинг сообщения: 0
Медали: 2
Мявтор 2-й степени (1) Мявтор 3-й степени (1)
Почитайте для начала вторую часть статьи в предыдущих новостях на сайте. Она, правда, не для AVR, н какие-то сведения по USB HID вы из нее извлечете. В компе имеетя готовый драйвер для HID, но как с ним работать зависит от языка программирования. У Windows есть много API для работы с HID.


Вернуться наверх
 Профиль  
 

Не в сети
 Заголовок сообщения: Re: USB HID интерфейс
СообщениеДобавлено: Чт мар 08, 2012 21:02:04 
Мудрый кот
Аватар пользователя

Карма: 15
Зарегистрирован: Пн окт 11, 2010 20:00:08
Сообщений: 1794
Рейтинг сообщения: 0
+Андрей+ писал(а):
Собственно, сам вопрос - какие штатные функции есть в ком-пе для работы с такими устройствами
Статья из журнала Радио №4, 2011 г. http://www.radioman-portal.ru/pages/1698/index.shtml
+Андрей+ писал(а):
как реализовать поддержку этого интерфейса на ATmega-48 (имя устройства чтоб еще выводилось
http://purebasic.mybb.ru/viewtopic.php?id=211 Тут мега 8, но легко можно переделать под 48. Вроде толко изменить имя рег-файла (заменить $regfile = "m8def.dat" на $regfile = "m48def.dat") и перекомпилировать.

Только первая часть статьи о создании своего микроконтроллерного USB устройства. http://radioman-portal.ru/pages/1928/index.shtml
Полная версия статьи в журнале Радио 2011 в номерах 10 и 11.


Вернуться наверх
 Профиль  
 

Не в сети
 Заголовок сообщения: Re: USB HID интерфейс
СообщениеДобавлено: Чт мар 08, 2012 21:10:11 
Встал на лапы

Карма: 2
Зарегистрирован: Сб мар 03, 2012 18:54:33
Сообщений: 117
Рейтинг сообщения: 0
нет, именно ШТАТНЫЕ функции Windows API. :)
там ничего не нашел, дайте прямую ссылку на проект.


Вернуться наверх
 Профиль WWW  
 
Не в сети
 Заголовок сообщения: Re: USB HID интерфейс
СообщениеДобавлено: Чт мар 08, 2012 21:14:24 
Мудрый кот
Аватар пользователя

Карма: 15
Зарегистрирован: Пн окт 11, 2010 20:00:08
Сообщений: 1794
Рейтинг сообщения: 0
Ну там есть функции типа HidD_GetHidGuid, HidD_GetAttributes, HidD_GetPreparsedData, HidP_GetCaps и многие другие.
Проще использовать компонент "HID_Lib_Plus.dll" (см. первую ссылку в моем предыдущем посте) чем лезть в дебри WinAPI, но хозяин-барин.

И многое зависит от языка программирования. На каком пишите?

+Андрей+ писал(а):
дайте прямую ссылку на проект
На какой именно?
Если речь про статьи то вот из Радио № 4, 2011 ftp://ftp.radio.ru/pub/2011/04/HID_Lib_Plus.rar
Из Радио № 10, 2011 ftp://ftp.radio.ru/pub/2011/11/usb-bascom.zip


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: USB HID интерфейс
СообщениеДобавлено: Чт мар 08, 2012 21:23:57 
Встал на лапы

Карма: 2
Зарегистрирован: Сб мар 03, 2012 18:54:33
Сообщений: 117
Рейтинг сообщения: 0
Ссылку на проект на меге-8.
Пишу на Дельфи и на Си.
И нет ли статейки в MSDN на все эти функции?


Вернуться наверх
 Профиль WWW  
 
Не в сети
 Заголовок сообщения: Re: USB HID интерфейс
СообщениеДобавлено: Чт мар 08, 2012 21:27:25 
Мудрый кот
Аватар пользователя

Карма: 15
Зарегистрирован: Пн окт 11, 2010 20:00:08
Сообщений: 1794
Рейтинг сообщения: 0
+Андрей+ писал(а):
Ссылку на проект на меге-8.
Там же внизу первого поста есть ссылка крупными буквами. Скачать файлы (компьютерная программа, прошивка для микроконтроллера и их исходные тексты).

+Андрей+ писал(а):
на Дельфи
В архиве есть пример использования компонента "HID_Lib_Plus.dll" в Дельфи 7.


Последний раз редактировалось Мурик Чт мар 08, 2012 21:29:52, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: USB HID интерфейс
СообщениеДобавлено: Чт мар 08, 2012 21:29:00 
Встал на лапы

Карма: 2
Зарегистрирован: Сб мар 03, 2012 18:54:33
Сообщений: 117
Рейтинг сообщения: 0
МНЕ ДАННЫй КОМПОНЕНТ НЕ НУЖЕН, ТОЛЬКО ШТАТНЫЕ ФУНКЦИИ!


Вернуться наверх
 Профиль WWW  
 
Не в сети
 Заголовок сообщения: Re: USB HID интерфейс
СообщениеДобавлено: Чт мар 08, 2012 21:31:01 
Мудрый кот
Аватар пользователя

Карма: 15
Зарегистрирован: Пн окт 11, 2010 20:00:08
Сообщений: 1794
Рейтинг сообщения: 0
Тогда гугл в помощь.
Не верю что в инете нет инфы по работе с HID.


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: USB HID интерфейс
СообщениеДобавлено: Чт мар 08, 2012 21:44:33 
Встал на лапы

Карма: 2
Зарегистрирован: Сб мар 03, 2012 18:54:33
Сообщений: 117
Рейтинг сообщения: 0
ну ведь ничего не нашел! :?


Вернуться наверх
 Профиль WWW  
 
Не в сети
 Заголовок сообщения: Re: USB HID интерфейс
СообщениеДобавлено: Чт мар 08, 2012 22:25:51 
Мудрый кот
Аватар пользователя

Карма: 15
Зарегистрирован: Пн окт 11, 2010 20:00:08
Сообщений: 1794
Рейтинг сообщения: 0
Ну раз реально такой напряг с поиском в инете, то вот вам рабочий код, использующий WinAPI для работы с USB HID.
Код:
Structure HIDD_ATTRIBUTES
  Size.l
  VendorID.u
  ProductID.u
  VersionNumber.u
EndStructure

Structure PSP_DEVICE_INTERFACE_DETAIL_DATA
  cbSize.l
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    DevicePath.l ; Для x64 платформы.
  CompilerElse
    DevicePath.c ; Для x86 платформы.
  CompilerEndIf
EndStructure


Prototype ProtoHidD_GetHidGuid(*HidGuid.GUID)
Prototype ProtoHidD_GetAttributes(*HidDeviceObject, *Attributes.HIDD_ATTRIBUTES)
Prototype ProtoHidD_GetPreparsedData(*HidDeviceObject, *PreparsedData)
Prototype ProtoHidD_GetFeature(HidHandle, *Buffer, Len)
Prototype ProtoHidD_SetFeature(HidHandle, *Buffer, Len)
Prototype ProtoSetupDiEnumDeviceInterfaces(*DeviceInfoSet, DeviceInfoData.l, *InterfaceClassGuid.GUID, MemberIndex.l, *DeviceInterfaceData.SP_DEVICE_INTERFACE_DATA)
Prototype ProtoSetupDiGetDeviceInterfaceDetail(*DeviceInfoSet, *DeviceInterfaceData.SP_DEVICE_INTERFACE_DATA, DeviceInterfaceDetailData.l, DeviceInterfaceDetailDataSize.l, *RequiredSize, *DeviceInfoData)

hid_Lib=OpenLibrary(#PB_Any, "hid.dll")
Setupapi_Lib=OpenLibrary(#PB_Any, "setupapi.dll")

Global HidD_GetHidGuid.ProtoHidD_GetHidGuid=GetFunction(hid_Lib, "HidD_GetHidGuid")
Global HidD_GetAttributes.ProtoHidD_GetAttributes=GetFunction(hid_Lib, "HidD_GetAttributes")
Global HidD_GetPreparsedData.ProtoHidD_GetPreparsedData=GetFunction(hid_Lib, "HidD_GetPreparsedData")
Global HidD_GetFeature.ProtoHidD_GetFeature=GetFunction(hid_Lib, "HidD_GetFeature")
Global HidD_SetFeature.ProtoHidD_SetFeature=GetFunction(hid_Lib, "HidD_SetFeature")
Global SetupDiEnumDeviceInterfaces.ProtoSetupDiEnumDeviceInterfaces=GetFunction(Setupapi_Lib, "SetupDiEnumDeviceInterfaces")
Global SetupDiGetDeviceInterfaceDetail.ProtoSetupDiGetDeviceInterfaceDetail=GetFunction(Setupapi_Lib, "SetupDiGetDeviceInterfaceDetailA")

Procedure HID_OpenDevice(PID.w, VID.w, VersionNumber.w, Index.w) ; Получение доступа к HID устройству
  HidGuid.Guid
  devInfoData.SP_DEVICE_INTERFACE_DATA
 
  devInfoData\cbSize = SizeOf(SP_DEVICE_INTERFACE_DATA)
  Length.l = 0
  CurrentIndex.w=0
 
  Attributes.HIDD_ATTRIBUTES
 
  Security.SECURITY_ATTRIBUTES
  Security\nLength=SizeOf(SECURITY_ATTRIBUTES)
  Security\bInheritHandle=1
  Security\lpSecurityDescriptor = 0
 
  HidD_GetHidGuid(@HidGuid)
  hDevInfo=SetupDiGetClassDevs_(@HidGuid,0,0, #DIGCF_PRESENT|#DIGCF_DEVICEINTERFACE)
  If hDevInfo=0
    ProcedureReturn 0
  EndIf
  LastDevice = #False
  For i=0 To 255
    MyDeviceDetected=#False
    Result=SetupDiEnumDeviceInterfaces(hDevInfo, 0, @HidGuid, i, @devInfoData)
    If Result
      Result = SetupDiGetDeviceInterfaceDetail(hDevInfo, @devInfoData, 0, 0,@Length, 0)
      *detailData.PSP_DEVICE_INTERFACE_DETAIL_DATA=AllocateMemory(Length)
      *detailData\cbSize=SizeOf(PSP_DEVICE_INTERFACE_DETAIL_DATA)
      Result = SetupDiGetDeviceInterfaceDetail(hDevInfo, @devInfoData, *detailData, Length+1, @Required, 0)
     
      DevicePath.s=PeekS(@*detailData\DevicePath)
      FreeMemory(*detailData)
     
      DeviceHandle=CreateFile_(@DevicePath, #GENERIC_READ|#GENERIC_WRITE, #FILE_SHARE_READ|#FILE_SHARE_WRITE, @Security, #OPEN_EXISTING, 0, 0)
     
      If DeviceHandle>0
        Attributes\Size = SizeOf(HIDD_ATTRIBUTES)
        Result = HidD_GetAttributes(DeviceHandle, @Attributes)
       
        If Attributes\ProductID=PID And Attributes\VendorID=VID And (Attributes\VersionNumber=VersionNumber Or VersionNumber=-1 )
          If CurrentIndex=Index
            SetupDiDestroyDeviceInfoList_(hDevInfo)
            ProcedureReturn DeviceHandle
          Else
            CurrentIndex+1
            CloseHandle_(DeviceHandle)
          EndIf
        Else
          CloseHandle_(DeviceHandle)
        EndIf
       
      EndIf
    Else
      Break
    EndIf
  Next i
 
  SetupDiDestroyDeviceInfoList_(hDevInfo)
  ProcedureReturn 0
EndProcedure


Procedure HID_CloseDevice(DeviceHandle) ; Закрытие HID устройства.
  If DeviceHandle
    ProcedureReturn CloseHandle_(DeviceHandle)
  Else
    ProcedureReturn 0
  EndIf
EndProcedure


Procedure HID_WriteDevice(DeviceHandle, *buffer, LenBuffer) ; Запись данных в HID устройство
  If DeviceHandle=0 Or *buffer=0 Or LenBuffer<=0
    ProcedureReturn 0
  EndIf
  Written.l=0
  Result=WriteFile_(DeviceHandle, *buffer, LenBuffer, @Written,  0)
  ProcedureReturn Written
EndProcedure


Procedure HID_ReadDevice(DeviceHandle, *buffer, LenBuffer) ; Чтение данных из HID устройства
  If DeviceHandle=0 Or *buffer=0 Or LenBuffer<=0
    ProcedureReturn 0
  EndIf
  Written.l=0
  Result=ReadFile_(DeviceHandle, *buffer, LenBuffer, @Written, 0)
  ProcedureReturn Written
EndProcedure

Procedure HID_GetFeature(DeviceHandle, *buffer, LenBuffer)
If DeviceHandle And *buffer And LenBuffer>0
   ProcedureReturn HidD_GetFeature(DeviceHandle, *buffer, LenBuffer)
Else
   ProcedureReturn 0
EndIf
EndProcedure

Procedure HID_SetFeature(DeviceHandle, *buffer, LenBuffer)
If DeviceHandle And *buffer And LenBuffer>0
   ProcedureReturn HidD_SetFeature(DeviceHandle, *buffer, LenBuffer)
Else
   ProcedureReturn 0
EndIf
EndProcedure


Тестирование кода, включение и отключение режима программирования в программаторе PICkit 2, который является USB HID устройством.
Код:
#USB_PID          = $33      ; Идентификаторы программатора PicKit 2
#USB_VID          = $4D8
#PK_PACKET_SIZE   =  65

Procedure VddOn(Handle) ; Включить питание
  Dim OutBuffer.b(#PK_PACKET_SIZE+2)
  OutBuffer(0)=0
  OutBuffer(1)=$A6 ; EXECUTE_SCRIPT
  OutBuffer(2)=2
  OutBuffer(3)=$FC ; _VDD_GND_OFF
  OutBuffer(4)=$FF ; _VDD_ON
  ProcedureReturn HID_WriteDevice(Handle, @OutBuffer(), #PK_PACKET_SIZE)
EndProcedure

Procedure VddOff(Handle) ; Выключить питание
  Dim OutBuffer.b(#PK_PACKET_SIZE+2)
  OutBuffer(0)=0
  OutBuffer(1)=$A6 ; EXECUTE_SCRIPT
  OutBuffer(2)=2
  OutBuffer(3)=$FE ; _VDD_OFF
  OutBuffer(4)=$FD ; _VDD_GND_ON
  ProcedureReturn HID_WriteDevice(Handle, @OutBuffer(), #PK_PACKET_SIZE)
EndProcedure

Handle=HID_OpenDevice(#USB_PID, #USB_VID, -1, 0) ; Установка связи с PicKit 2
If Handle
  VddOn(Handle)                           ; Включить питание программируемого МК
  Delay(1000)                             ; Пауза, равная 1000 миллисекунд
  VddOff(Handle)                          ; Выключить питание программируемого МК
  HID_CloseDevice(Handle)                 ; Разыв связи с PicKit 2
Else
  MessageRequester("PicKit 2 Test", "Нет связи с PicKit2!", 48)
EndIf


Вложения:
USB HID Source.rar [6.3 KiB]
Скачиваний: 398
Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: USB HID интерфейс
СообщениеДобавлено: Чт мар 08, 2012 23:36:16 
Встал на лапы

Карма: 2
Зарегистрирован: Сб мар 03, 2012 18:54:33
Сообщений: 117
Рейтинг сообщения: 0
так.
а для МК как поддержку юсб реализовать?


Вернуться наверх
 Профиль WWW  
 
Не в сети
 Заголовок сообщения: Re: USB HID интерфейс
СообщениеДобавлено: Пт мар 09, 2012 00:04:07 
Мудрый кот
Аватар пользователя

Карма: 15
Зарегистрирован: Пн окт 11, 2010 20:00:08
Сообщений: 1794
Рейтинг сообщения: 0
+Андрей+ писал(а):
так.
а для МК как поддержку юсб реализовать?
Я же выше давал ссылки.
Пример девайса. http://purebasic.mybb.ru/viewtopic.php?id=211
Описание библиотеки совтового USB для AVRов. http://radioman-portal.ru/pages/1928/index.shtml


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: USB HID интерфейс
СообщениеДобавлено: Пт мар 09, 2012 08:43:20 
Встал на лапы

Карма: 2
Зарегистрирован: Сб мар 03, 2012 18:54:33
Сообщений: 117
Рейтинг сообщения: 0
Вот, большое спасибо, искренне благодарен :)


Вернуться наверх
 Профиль WWW  
 
Не в сети
 Заголовок сообщения: Re: USB HID интерфейс
СообщениеДобавлено: Пт мар 09, 2012 10:30:11 
Встал на лапы

Зарегистрирован: Ср дек 24, 2008 12:59:24
Сообщений: 100
Откуда: Москва
Рейтинг сообщения: 0
Можно еще использовать V-USB
http://we.easyelectronics.ru/electro-an ... v-usb.html
Но остался один незатронутый вопрос, как отлаживать подобные устройства.
если что то не заработает то трудно понять на какой стороне на стороне хоста или на стороне МК.
есть ли программные эмуляторы HID устройств с помощью которых можно отладить софт на стороне хоста и быть уверенным что он работает?
облазил интернет но ничего кроме снифферов найти не смог, было бы здорово запустить эмулятор прописать VID и PID и обмениваться данными с ней вместо устройства.


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: USB HID интерфейс
СообщениеДобавлено: Пт мар 09, 2012 11:25:53 
Мудрый кот
Аватар пользователя

Карма: 15
Зарегистрирован: Пн окт 11, 2010 20:00:08
Сообщений: 1794
Рейтинг сообщения: 0
AaNnDdRrEeYy писал(а):
как отлаживать подобные устройства.если что то не заработает то трудно понять на какой стороне на стороне хоста или на стороне МК.
Со стороны хоста, отладка проблем не вызывает. Главное чтобы в IDE был нормальный отладчик.


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: USB HID интерфейс
СообщениеДобавлено: Пт мар 09, 2012 11:39:35 
Встал на лапы

Зарегистрирован: Ср дек 24, 2008 12:59:24
Сообщений: 100
Откуда: Москва
Рейтинг сообщения: 0
а со стороны МК как быть? pruteus программную реализацию usb не эмулирует.
пытался запустить V-USB в режиме отладки в AVR studio 4, студия вылетела по ошибке причем ничего не сказала просто закрылась.


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: USB HID интерфейс
СообщениеДобавлено: Пт мар 09, 2012 12:05:09 
Мудрый кот
Аватар пользователя

Карма: 15
Зарегистрирован: Пн окт 11, 2010 20:00:08
Сообщений: 1794
Рейтинг сообщения: 0
А со стороны МК нужно все делать аккуратно и без быдлокодерства.
Тогда может отладка и не понадобится.


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: USB HID интерфейс
СообщениеДобавлено: Сб мар 10, 2012 01:24:58 
Встал на лапы

Зарегистрирован: Ср дек 24, 2008 12:59:24
Сообщений: 100
Откуда: Москва
Рейтинг сообщения: 0
собрал ради интереса девайс на V USB (http://we.easyelectronics.ru/electro-an ... v-usb.html) заработал!
выдает вот такой вот дескриптор сообщений
HID Descriptor
Usage Page: 65280 (Vendor Specific)
Usage: 1 (Unknown)
Collection
Logical Minimum: 0
Logical Maximum: 255
Report Size: 8
Report Count: 3
Usage: 0 (Unknown)
Feature: 258 (Data,Variable,Absolute,No Wrap,Linear,Preferred State,No Null Position)

End Collection

и вот такой вот дескриптор устройства
Device Descriptor
USB version: 1.10
Device class: 0x0 - (Defined at Interface level)
Device subclass: 0x0 - Unknown
Device protocol: 0x0 - Unknown
Control pipe max size: 8 bytes
Vendor ID: 0x16c0 (VOTI)
Product ID: 0x5df (Unknown)
Product version: 1.0


программа на хосте которая работает не видит его нифига, как теперь с ним общаться ХЗ.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 41 ]  На страницу 1, 2, 3  След.



Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y