Например TDA7294

Форум РадиоКот • Просмотр темы - Дисплеи от мобильных телефонов- осцилограммы работы
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Ср апр 24, 2024 01:01:23

Часовой пояс: UTC + 3 часа


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



Начать новую тему Ответить на тему  [ Сообщений: 869 ]     ... , , , , 44
Автор Сообщение
 Заголовок сообщения: Re: Дисплеи от мобильных телефонов- осцилограммы работы
СообщениеДобавлено: Вт сен 26, 2017 19:46:56 
Возможно здесь не совсем подходящее место, но всё таки...
Подключаю дисплей от S5230 к STM32F407 через FSMC (выбрал A19). Могу ли я задействовать на этом же FSMC (bank1) общение с внешней SRAM, но с другим A16, например и как настроить FSMC для этого?
Спасибо.


Вернуться наверх
   
 
Не в сети
 Заголовок сообщения: Re: Дисплеи от мобильных телефонов- осцилограммы работы
СообщениеДобавлено: Чт май 31, 2018 13:12:04 
Мудрый кот

Карма: 10
Рейтинг сообщений: 272
Зарегистрирован: Пт мар 26, 2010 17:16:52
Сообщений: 1769
Откуда: Kazan
Рейтинг сообщения: 0
Panda_Y2K Удалось ли вам победить поворот изображения на дисплее NOKIA 2100?
На сайте VRTP еще в 2009 году вы писали что проблема решена, но здесь на радиокоте вы вновь
возвращаетесь к этому вопросу.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Дисплеи от мобильных телефонов- осцилограммы работы
СообщениеДобавлено: Вт июн 05, 2018 14:27:18 
Мучитель микросхем

Карма: 2
Рейтинг сообщений: 10
Зарегистрирован: Ср окт 19, 2011 08:48:27
Сообщений: 443
Откуда: Мать городов русских
Рейтинг сообщения: 0
Народ, кто-то работал с LGDP4524? Запустил 2.0" TFT 176X220 на Arduino Uno через UTFT либу, выдрал оттуда код, портировал на STM32F051 - ни фига не пашет :(

_________________
Хорошему коту и в декабре - март :)


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Дисплеи от мобильных телефонов- осцилограммы работы
СообщениеДобавлено: Пт июн 29, 2018 08:58:18 
Мучитель микросхем

Карма: 2
Рейтинг сообщений: 10
Зарегистрирован: Ср окт 19, 2011 08:48:27
Сообщений: 443
Откуда: Мать городов русских
Рейтинг сообщения: 3
Дисплейчик на LGDP4524 пока не запустил, вот нашёл, если кому интересно: http://www.fortymall.com/views.asp?hw_id=291 - что он аналогичен ILI9225.

_________________
Хорошему коту и в декабре - март :)


Вернуться наверх
 
Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Дисплеи от мобильных телефонов- осцилограммы работы
СообщениеДобавлено: Пт авг 28, 2020 10:23:42 
Потрогал лапой паяльник

Зарегистрирован: Пт янв 29, 2010 19:42:27
Сообщений: 311
Рейтинг сообщения: 0
Подскажите /CS экрана на LPH8836-4 можно на постояку на землю садаить?

_________________
ух ты.... показывает


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Дисплеи от мобильных телефонов- осцилограммы работы
СообщениеДобавлено: Пн мар 18, 2024 22:27:04 
Родился

Зарегистрирован: Пн мар 18, 2024 22:04:17
Сообщений: 2
Рейтинг сообщения: 0
Прив народ как настрой?
Имеется дисплей lph8924-2 который отказывается нормально подключаться к микроконтроллеру (esp32) -- по сути даже не монимаю, проходит ли он нормально инициализацию -- на запрос id контроллера высылает 0x040404 -- как расценивать сею инфу я хз. И какой то бред высылает на запрос статуса -- 99999999999999999999999999999999 в десятичном виде.

Изображение Изображение Изображение Изображение

в коде такое:
Спойлер
Код:
enum class Cmd : std::int8_t {
    eNOP        = LCD_CMD_NOP,   //0x00    This command is empty command
    eSWRESET    = LCD_CMD_SWRESET,   //0x01    Software reset registers (the built-in frame buffer is not affected)
    eRDDID      = LCD_CMD_RDDID,   //0x04    Read 24-bit display ID
    eRDDST      = LCD_CMD_RDDST,   //0x09    Read display status
    eRDDPM      = LCD_CMD_RDDPM,   //0x0A    Read display power mode
    eRDD_MADCTL = LCD_CMD_RDD_MADCTL,   //0x0B    Read display MADCTL
    eRDD_COLMOD = LCD_CMD_RDD_COLMOD,   //0x0C    Read display pixel format
    eRDDIM      = LCD_CMD_RDDIM,   //0x0D    Read display image mode
    eRDDSM      = LCD_CMD_RDDSM,   //0x0E    Read display signal mode
    eRDDSR      = LCD_CMD_RDDSR,   //0x0F    Read display self-diagnostic result
    eSLPIN =    LCD_CMD_SLPIN,   //0x10    Go into sleep mode (DC/DC, oscillator, scanning stopped, but memory keeps content)
    eSLPOUT  = LCD_CMD_SLPOUT,   //0x11    Exit sleep mode
    ePTLON   = LCD_CMD_PTLON,   //0x12    Turns on partial display mode
    eNORON   = LCD_CMD_NORON,   //0x13    Turns on normal display mode
    eINVOFF  = LCD_CMD_INVOFF,   //0x20    Recover from display inversion mode
    eINVON   = LCD_CMD_INVON,   //0x21    Go into display inversion mode
    eGAMSET  = LCD_CMD_GAMSET,   //0x26    Select Gamma curve for current display
    eDISPOFF = LCD_CMD_DISPOFF,   //0x28    Display off (disable frame buffer output)
    eDISPON  = LCD_CMD_DISPON,   //0x29    Display on (enable frame buffer output)
    eCASET   = LCD_CMD_CASET,   //0x2A    Set column address
    eRASET   = LCD_CMD_RASET,   //0x2B    Set row address
    eRAMWR   = LCD_CMD_RAMWR,   //0x2C    Write frame memory
    eRAMRD   = LCD_CMD_RAMRD,   //0x2E    Read frame memory
    ePTLAR   = LCD_CMD_PTLAR,   //0x30    Define the partial area
    eVSCRDEF = LCD_CMD_VSCRDEF,   //0x33    Vertical scrolling definition
    eTEOFF   = LCD_CMD_TEOFF,   //0x34    Turns off tearing effect
    eTEON    = LCD_CMD_TEON,   //0x35    Turns on tearing effect

    eMADCTL = LCD_CMD_MADCTL,   //0x36    Memory data access control

    eVSCSAD = LCD_CMD_VSCSAD,   //0x37    Vertical scroll start address
    eIDMOFF = LCD_CMD_IDMOFF,   //0x38    Recover from IDLE mode
    eIDMON  = LCD_CMD_IDMON,   //0x39    Fall into IDLE mode (8 color depth is displayed)
    eCOLMOD = LCD_CMD_COLMOD,   //0x3A    Defines the format of RGB picture data
    eRAMWRC = LCD_CMD_RAMWRC,   //0x3C    Memory write continue
    eRAMRDC = LCD_CMD_RAMRDC,   //0x3E    Memory read continue
    eSTE = LCD_CMD_STE,   //0x44    Set tear scan line, tearing effect output signal when display module reaches line N
    eGDCAN   = LCD_CMD_GDCAN,   //0x45    Get scan line
    eWRDISBV = LCD_CMD_WRDISBV,   //0x51    Write display brightness
    eRDDISBV = LCD_CMD_RDDISBV   //0x52   Read display brightness value
};

enum class MadCtlBits : std::int16_t {
    eMH  = LCD_CMD_MH_BIT,   // Display data latch order, 0: refresh left to right, 1: refresh right to left
    eBGR = LCD_CMD_BGR_BIT,   // RGB/BGR order, 0: RGB, 1: BGR
    eML  = LCD_CMD_ML_BIT,   // Line address order, 0: refresh top to bottom, 1: refresh bottom to top
    eMV  = LCD_CMD_MV_BIT,   // Row/Column order, 0: normal mode, 1: reverse mode
    eMX  = LCD_CMD_MX_BIT,   // Column address order, 0: left to right, 1: right to left
    eMY  = LCD_CMD_MY_BIT,   // Row address order, 0: top to bottom, 1: bottom to top
};

enum class ColorMode : std::int8_t {
    e8BIT  = 2,
    e12BIT = 3,
    e16BIT = 5,
    e24BIT = 7,
};

    struct alignas( 32 ) Status {
        std::uint8_t ST24 : 1;
        std::uint8_t MH : 1;
        std::uint8_t RGB : 1;
        std::uint8_t ML : 1;
        std::uint8_t MV : 1;
        std::uint8_t MX : 1;
        std::uint8_t MY : 1;
        std::uint8_t BOTSON : 1;
        std::uint8_t NORON : 1;
        std::uint8_t SLOUT : 1;
        std::uint8_t PTLON : 1;
        std::uint8_t IDMON : 1;
        std::uint8_t IFPF : 3;
        std::uint8_t ST23 : 1;
        std::uint8_t GCS2 : 1;
        std::uint8_t TEON : 1;
        std::uint8_t DISON : 1;
        std::uint8_t ST11 : 1;
        std::uint8_t ST12 : 1;
        std::uint8_t INVON : 1;
        std::uint8_t ST14 : 1;
        std::uint8_t VSSON : 1;
        std::uint8_t ST0 : 1;
        std::uint8_t DEON : 1;
        std::uint8_t PCKON : 1;
        std::uint8_t VSON : 1;
        std::uint8_t HSON : 1;
        std::uint8_t TELOM : 1;
        std::uint8_t GCS0 : 1;
        std::uint8_t GCS1 : 1;
    };

    using Id = union {
        struct {
            uint8_t ID1;
            uint8_t ID2;
            uint8_t ID3;
        };
        uint8_t ID[ 3 ];
    };

static Status readStatus() {


        constexpr auto rawSize = sizeof( Status );

        std::array< std::uint8_t, rawSize > statusRaw {};

        Driver::send_command( std::to_underlying( Cmd::eRDDST ) );
        Driver::bus::read_raw( statusRaw.begin(), rawSize );

        std::cout << "Status size is " << rawSize << " : ";
        std::cout << ( int ) *statusRaw.data() << std::endl;

        return reinterpret_cast< Status & >( statusRaw );
    }

static Id readId() {
        Id id {};

        Driver::send_command( std::to_underlying( Cmd::eRDDID ) );
        Driver::bus::read_raw( id.ID, 3 );

        return id;
    }

static void init() {
        std::cout << "Initialize\n";
        auto initStatus = Driver::initialize();
        std::cout << "Initialize is " << initStatus << std::endl;

        LcdCom::Status status;

        std::cout << "SW reset\n";
        Driver::send_command( std::to_underlying( LcdCommon::Cmd::eSWRESET ) );
        delay( 50 );
        do {
            status = LcdCom::readStatus();
            delay( 50 );
        } while ( !status.NORON );

        const auto         id    = LcdCom::readId();
        const std::int32_t idRes = ( static_cast< std::int32_t >( id.ID1 ) << 16 ) |
                                   ( static_cast< std::int32_t >( id.ID2 ) << 8 ) |
                                   ( static_cast< std::int32_t >( id.ID3 ) );
        std::cout << "Display id is: " << std::hex << idRes << std::endl;
}


пробовал инитить, как находил тут (вроде третья страница) -- но у меня отказывается после мигания (моргания) дисплея что либо воспроизводить. Однако если инитить моей системой команд, то реагирует после на запись видеопамяти, только как то неправильно -- будто шум подается, хотя я делаю полоски разного цвета три штуки на весь дисплей...

еще недопонимаю, почему в ините который на форуме описан в команды, которые вроде бы без аргументов поставляются данные? типа такого:

Код:
regSet( 0x11, 0x0014 );


в своих трудах опирался на https://github.com/Azq2/stm32-lcd-lph8924-1 и https://github.com/codewitch-honey-crisis/htcw_tft_io

П.С, -- так и не понял какой контроллер у ентого дисплея... одни тут утверждали, что такой же как и у ILI9153 вроде (не помню точной цифры), другие говорили, что SSD1286...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Дисплеи от мобильных телефонов- осцилограммы работы
СообщениеДобавлено: Вт мар 19, 2024 22:22:25 
Опытный кот
Аватар пользователя

Карма: 2
Рейтинг сообщений: 43
Зарегистрирован: Пт апр 15, 2011 21:11:22
Сообщений: 734
Откуда: Россия, Ставропольский край
Рейтинг сообщения: 0
на стр.34 этого топика запускали такой дисплей, смотрел?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Дисплеи от мобильных телефонов- осцилограммы работы
СообщениеДобавлено: Ср мар 20, 2024 07:09:12 
Родился

Зарегистрирован: Пн мар 18, 2024 22:04:17
Сообщений: 2
Рейтинг сообщения: 0
на стр.34 этого топика запускали такой дисплей, смотрел?

да -- смотрел ранее, но там нету ничего по сути по запуску, остальное по сути тоже самое из предыдущих постов упоминается, что я уже делал.
Единственное возможно стоит попробовать не делать команду 0x36 перед заполнением, возможно она как то не так работает как предполагается.

Добавлено after 1 hour 19 minutes 56 seconds:
на стр.34 этого топика запускали такой дисплей, смотрел?

да -- смотрел ранее, но там нету ничего по сути по запуску, остальное по сути тоже самое из предыдущих постов упоминается, что я уже делал.
Единственное возможно стоит попробовать не делать команду 0x36 перед заполнением, возможно она как то не так работает как предполагается.

какая то мистика -- вроде все тоже самое подал, но теперь заполняет нормально...


Спойлер
Код:

template < LcdDriveType DriverType > class Lcd {
public:
    using Driver = DriverType;

    struct alignas( 32 ) Status {
        std::uint8_t ST24 : 1;
        std::uint8_t MH : 1;
        std::uint8_t RGB : 1;
        std::uint8_t ML : 1;
        std::uint8_t MV : 1;
        std::uint8_t MX : 1;
        std::uint8_t MY : 1;
        std::uint8_t BOTSON : 1;
        std::uint8_t NORON : 1;
        std::uint8_t SLOUT : 1;
        std::uint8_t PTLON : 1;
        std::uint8_t IDMON : 1;
        std::uint8_t IFPF : 3;
        std::uint8_t ST23 : 1;
        std::uint8_t GCS2 : 1;
        std::uint8_t TEON : 1;
        std::uint8_t DISON : 1;
        std::uint8_t ST11 : 1;
        std::uint8_t ST12 : 1;
        std::uint8_t INVON : 1;
        std::uint8_t ST14 : 1;
        std::uint8_t VSSON : 1;
        std::uint8_t ST0 : 1;
        std::uint8_t DEON : 1;
        std::uint8_t PCKON : 1;
        std::uint8_t VSON : 1;
        std::uint8_t HSON : 1;
        std::uint8_t TELOM : 1;
        std::uint8_t GCS0 : 1;
        std::uint8_t GCS1 : 1;
    };

    using Id = union {
        struct {
            uint8_t ID1;
            uint8_t ID2;
            uint8_t ID3;
        };
        uint8_t ID[ 3 ];
    };

    static void reset() { Driver::send_command( std::to_underlying( LcdCommon::Cmd::eSWRESET ) ); }

    static Status readStatus() {
        constexpr auto rawSize = sizeof( Status );

        std::array< std::uint8_t, rawSize > statusRaw {};

        Driver::send_command( std::to_underlying( Cmd::eRDDST ) );
        Driver::bus::read_raw( statusRaw.begin(), rawSize );

        std::cout << "Status size is " << rawSize << " : ";
        std::cout << ( int ) *statusRaw.data() << std::endl;

        return reinterpret_cast< Status & >( statusRaw );
    }

    static Id readId() {
        Id id {};

        Driver::send_command( std::to_underlying( Cmd::eRDDID ) );
        Driver::bus::read_raw( id.ID, 3 );

        return id;
    }

    static void setRamArea( Math::Rect rect ) {
        Driver::send_command( std::to_underlying( Cmd::eCASET ) );
        Driver::send_data8( rect.offset.x );
        Driver::send_data8( rect.extent.width );

        Driver::send_command( std::to_underlying( Cmd::eRASET ) );
        Driver::send_data8( rect.offset.y );
        Driver::send_data8( rect.extent.height );
    }

    static void setAddressMode( uint8_t mx, uint8_t my, uint8_t mv, uint8_t ml, uint8_t bgr, uint8_t mh ) {
        Driver::send_command( std::to_underlying( Cmd::eMADCTL ) );
        Driver::send_data8( ( ( mx ? 1 : 0 ) << 7 ) | ( ( my ? 1 : 0 ) << 6 ) | ( ( mv ? 1 : 0 ) << 5 ) |
                            ( ( ml ? 1 : 0 ) << 4 ) | ( ( bgr ? 1 : 0 ) << 3 ) | ( ( ml ? 1 : 0 ) << 2 ) );
    }

    static void sleepin() {
        Driver::send_command( std::to_underlying( Cmd::eSLPIN ) );
        std::cout << "LCD sleep on\n";
    }

    static void sleepout() {
        Driver::send_command( std::to_underlying( Cmd::eSLPOUT ) );
        std::cout << "LCD sleep off\n";
    }

    static void enable() {
        Driver::send_command( std::to_underlying( Cmd::eDISPON ) );
        std::cout << "LCD enabled\n";
    }
    static void disable() {
        Driver::send_command( std::to_underlying( Cmd::eDISPOFF ) );
        std::cout << "LCD disabled\n";
    }

    static void writeRamStartContinue() { Driver::send_command( std::to_underlying( Cmd::eRAMWRC ) ); }
    static void writeRamStart() { Driver::send_command( std::to_underlying( Cmd::eRAMWR ) ); }

    static void setColorMode( ColorMode mode ) {
        Driver::send_command( std::to_underlying( Cmd::eCOLMOD ) );
        Driver::send_data8( std::to_underlying( mode ) );
    }

    static void regSet( Cmd cmd, std::uint16_t data ) {
        Driver::send_command( std::to_underlying( cmd ) );
        Driver::send_data16( data );
    }

    static void regSet( std::uint8_t cmd, std::uint16_t data ) {
        Driver::send_command( cmd );
        Driver::send_data16( data );
    }
};

static void Lcd::init() {
        std::cout << "Initialize\n";
        auto initStatus = Driver::initialize();
        std::cout << "Initialize is " << initStatus << std::endl;

        LcdCom::Status status;

        delay( 100 );
        std::cout << "SW reset\n";
        Driver::send_command( std::to_underlying( LcdCommon::Cmd::eSWRESET ) );
        delay( 500 );
        do {
            status = LcdCom::readStatus();
            delay( 100 );
        } while ( !status.NORON );

        const auto         id    = LcdCom::readId();
        const std::int32_t idRes = ( static_cast< std::int32_t >( id.ID1 ) << 16 ) |
                                   ( static_cast< std::int32_t >( id.ID2 ) << 8 ) |
                                   ( static_cast< std::int32_t >( id.ID3 ) );
        std::cout << "Display id is: " << std::hex << idRes << std::endl;

        LcdCom::sleepout();

        delay( 100 );
    }

void setup() {
    init();

    Lcd::init();
   
    Lcd::LcdCom::setColorMode( Lcd::ColorMode::e8BIT );
    std::cout << "Test pint 1\n";
    delay( 100 );
   
    Lcd::LcdCom::setRamArea( Math::Rect { { 0, 0 }, { Lcd::width - 1, Lcd::height - 1 } } );
    std::cout << "Test pint 2\n";
    delay( 100 );
   
    Lcd::LcdCom::setAddressMode( 0, 0, 0, 0, 0, 0 );
    std::cout << "Test pint 3\n";
    delay( 100 );
   
    Lcd::LcdCom::enable();
    std::cout << "Test pint 4\n";
    delay( 100 );

    Lcd::LcdCom::writeRamStart();
    delay( 100 );

    while ( 1 ) {
        for ( int y = 0; y < 58; ++y ) {
            for ( int x = 0; x < 132; ++x ) {
                Lcd::sendRgb24( 0xFF0000 );
            }
        }

        for ( int y = 58; y < 58 + 58; ++y ) {
            for ( int x = 0; x < 132; ++x ) {
                Lcd::sendRgb24( 0x00FF00 );
            }
        }

        for ( int y = 58 + 58; y < 176; ++y ) {
            for ( int x = 0; x < 132; ++x ) {
                Lcd::sendRgb24( 0x0000FF );
            }
        }
    }
}


П.С. -- теперь выводит более адекватный статус, как я понимаю --
Код:
Status size is 32 : 9

АПД. хотя нет... -- статус так вывел, поскольку я неверно сделал -- разыменовал байт, и соответственно там одна девятка...

АПД. теперь вывод в uart такой:
Код:
rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:1184
load:0x40078000,len:13232
load:0x40080400,len:3028
entry 0x400805e4
Initialize
Initialize is 1
SW reset
Status size is 32 : 151587081
Display id is: 40404
LCD sleep off
Test pint 1
Test pint 2
Test pint 3
LCD enabled
Test pint 4

и вот это уже похоже на правду в статусе.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Дисплеи от мобильных телефонов- осцилограммы работы
СообщениеДобавлено: Ср мар 20, 2024 22:24:23 
Опытный кот
Аватар пользователя

Карма: 2
Рейтинг сообщений: 43
Зарегистрирован: Пт апр 15, 2011 21:11:22
Сообщений: 734
Откуда: Россия, Ставропольский край
Рейтинг сообщения: 0
так изображение удалось вывести?


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 869 ]     ... , , , , 44

Часовой пояс: UTC + 3 часа


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

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


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

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


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