Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: OMAP L138
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Сигнальные процессоры и их программирование - DSP
Страницы: 1, 2
torik
Всем привет.

Сигнальниками раньше не занимался, больше ПЛИС. Но СИ и еклипс мне знакомы.
Сделал плату, на ней имеется ПЛИС и OMAP L138.
Нужно написать простую программку для проверки работоспособности платы:
- EMIF, подключенный к ПЛИС
- UPP, подключенный к ПЛСИ
- чтение/запись DDR2, подключенной к сигнальнику
- помаргать светодиодиками.

Что-то не могу найти простых толковых примеров, Quick Start или еще чего. Ткните куда-нибудь...

"хело ворлд" в Code Composer Studio v5 получил, т.е. jtag работает, проц запускается.
Konst_777
Цитата(torik @ Aug 23 2012, 07:51) *
...Что-то не могу найти простых толковых примеров, Quick Start или еще чего. Ткните куда-нибудь...

Возможно, Вам будут полезны примеры из StarterWare.
torik
Почитал доку на upp - там гора регистров, может проще под bios драйвера скачать и пойти таким путем?
Про биос есть дока толковая?
aaarrr
Цитата(torik @ Aug 23 2012, 18:15) *
Почитал доку на upp - там гора регистров

UPP - пожалуй, один из самых простых модулей. Окучить его в минимальном виде можно буквально десятком строк на "C".
torik
Дык есть примеры-то?
Да даже проще - я не понимаю как светодиодами через GPIO помаргать. Скачивал какие-то примеры - но они не компилятся.

Начнем с простого GPIO - как настроить на выход и изменять значение?
aaarrr
Цитата(torik @ Aug 23 2012, 19:04) *
Начнем с простого GPIO - как настроить на выход и изменять значение?

1. Включить GPIO в PSC
2. Настроить соответствующий PINMUX
3. Настроить пин на вывод и вывести значение

Примерно так же, как и в любом МК. Только на первый взгляд все кажется монструозным.
torik
Цитата
1. Включить GPIO в PSC
2. Настроить соответствующий PINMUX
3. Настроить пин на вывод и вывести значение


Уже становится понятнее. А что такое PSC, есть для вышеперечисленных пунктов подробный порядок действий?
aaarrr
Цитата(torik @ Aug 24 2012, 16:34) *
Уже становится понятнее. А что такое PSC, есть для вышеперечисленных пунктов подробный порядок действий?

PSC - Power and Sleep Controller.

Подробный порядок действий для GPIO:
1. PSC
1.1. Записываем 0x03 (Enable State) в регистр MDCTL3 модуля PSC1 (MDCTL3 @ PSC1 - GPIO, привязки даны в документации на PSC)
1.2. Ставим GO0 в регистре PTCMD модуля PSC1, вызывая тем самым смену состояния
1.3. Дожидаемся сброса бита GOSTAT0 в регистре PTSTAT
2. PINMUX
2.1. Просто выставляем нужное значение в соответствующем поле PINMUX
3. GPIO
3.1. Убеждаемся, что ID модуля читается, т.е. п.1 отработали правильно
3.2. Сбрасываем нужный бит в DIRxx, переводя тем самым пин на выход
3.3. Пишем SET_DATAxx / CLR_DATAxx, наблюдаем изменение состояния пина
torik
Во, что-то более-менее понятное в StraterWare вижу.
Скомпилил пример. А когда создаю свой проект, где в проекте указать --include path?
torik
Когда ARM ядро запускаю, все нормально. Прога дебажится через SAU-510.
Однако когда создаю проект под DSP ядро, при попытке подключиться дает ошибку:

Код
Error connecting to the target:
(Error -1180 @ 0x0)
Device is held in reset. Take the device out of reset, and retry the operation.
(Emulation package 5.0.747.0)


На ногу RESETn сигнальника с плисины я подаю короткий ресет, без этого и арм не запускается.
Подскажите, где копать - в железе или в настройках проекта?

Проверили на отладке - ведет себя также
aaarrr
DSP нужно включить со стороны ARM'а - он выключается почти сразу после старта.
torik
Охренеть.

По примерам из StarterWare:
Код
   PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_DSP, PSC_POWERDOMAIN_ALWAYS_ON,
             PSC_MDCTL_NEXT_ENABLE);

И заливаю это в АРМ, все верно?

А как положить это в ПЗУ, хотя бы M25P64, подключенное к сигнальнику? А то не могу же я, не прекратив выполнение программы арма началь отладку дсп...


Но кроме того, вернусь к изначальной теме: мне надо помыргать светодиодом.
На основе StarterWire и рекомендаций aaarrr (я только не понял че там за ID такой), написал прогу и запускаю ее под арм:

Код
#include <stdio.h>

#include "gpio.h"
#include "psc.h"

#include "soc_OMAPL138.h"
#include "lcdkOMAPL138.h"

#include "hw_syscfg0_OMAPL138.h"

#include "hw_types.h"

/*****************************************************************************
**                       MACRO DEFINITION
*****************************************************************************/
/* Pin Multiplexing bit mask to select GP0[0] pin. */
#define PINMUX1_GPIO0_0_ENABLE    (SYSCFG_PINMUX1_PINMUX1_27_24_GPIO0_1  << SYSCFG_PINMUX1_PINMUX1_27_24_SHIFT)

/****************************************************************************/
/*              LOCAL FUNCTION PROTOTYPES                                   */
/****************************************************************************/
static void Delay(volatile unsigned int delay);

/****************************************************************************/
/*              GLOBAL VARIABLES                                            */
/****************************************************************************/

/****************************************************************************/
/*             LOCAL FUNCTION DEFINITIONS                                   */
/****************************************************************************/




//#include <OMAPL138_common.h>
/*
* hello.c
*/
void main(void) {
    printf("Hello World!\n");
    //CSL_FINS(gpioRegs->BANK[GP0].DIR, GPIO_DIR_DIR12, CSL_GPIO_DIR_DIR_OUT);
    unsigned int savePinmux = 0;


    /* The Local PSC number for GPIO is 3. GPIO belongs to PSC1 module.*/
   PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON,
             PSC_MDCTL_NEXT_ENABLE);

   PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_DSP, PSC_POWERDOMAIN_ALWAYS_ON,
             PSC_MDCTL_NEXT_ENABLE);

    /* Pin Multiplexing of pin 12 of GPIO Bank 6.*/
//   GPIOBank6Pin12PinMuxSetup();
    /*
    ** Clearing the bit in context and retaining the other bit values
    ** in PINMUX10 register.
    */
    savePinmux = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) &
                 ~(SYSCFG_PINMUX1_PINMUX1_31_28));

    /* Setting the pins corresponding to GP4[0] in PINMUX10 register.*/
    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) =
         (PINMUX1_GPIO0_0_ENABLE | savePinmux);


    /* Sets the pin 1 (GP0[0]) as out.*/
    GPIODirModeSet(SOC_GPIO_0_REGS, 1, GPIO_DIR_OUTPUT);

    while(1)
    {
        GPIOPinWrite(SOC_GPIO_0_REGS, 1, GPIO_PIN_LOW);

        Delay(1000000);

        GPIOPinWrite(SOC_GPIO_0_REGS, 1, GPIO_PIN_HIGH);

        Delay(1000000);
    }


}

/*
** \brief  This function checks the insertion status of the MMC/SD card
**         in the device and prints related statements on the serial
**         commuincation console of the external device.
**
*/

/*
** \brief   This function can be called to generate a delay.
*/

static void Delay(volatile unsigned int delay)
{
    while(delay--);
}


Однако светодиод не моргает. Подпрогаммы посмотрел, вроде бы все верно (да и кто бы сомневался). Может в арм-е по-другому надо с psc что-то делать, что-то еще включить?



aaarrr
Цитата(torik @ Aug 29 2012, 11:41) *
По примерам из StarterWare:
Код
   PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_DSP, PSC_POWERDOMAIN_ALWAYS_ON,
             PSC_MDCTL_NEXT_ENABLE);

И заливаю это в АРМ, все верно?

Со StarterWare я не знаком, но на вид верно.

Цитата(torik @ Aug 29 2012, 11:41) *
А как положить это в ПЗУ, хотя бы M25P64, подключенное к сигнальнику? А то не могу же я, не прекратив выполнение программы арма началь отладку дсп...

Могу предложить Хитрый Способ:
1. Создаем в HEX-редакторе "бинарник" для ARM из одной инструкции "b .": 0xfe 0xff 0xff 0xea
2. Берем AISGen, ставим в нем галку "Configure PSC", разрешаем в конфигурации PSC DSP
3. Создаем загрузочный образ
Дубово, но зато просто и будет работать.

Цитата(torik @ Aug 29 2012, 11:41) *
Но кроме того, вернусь к изначальной теме: мне надо помыргать светодиодом.
На основе StarterWire и рекомендаций aaarrr (я только не понял че там за ID такой), написал прогу и запускаю ее под арм:
...
Однако светодиод не моргает. Подпрогаммы посмотрел, вроде бы все верно (да и кто бы сомневался). Может в арм-е по-другому надо с psc что-то делать, что-то еще включить?

ID - регистр модуля GPIO. Его можно прочитать, чтобы убедиться, что клок на самом деле включен.
Подозреваю, что SYSCFG залочен (см. регистры Kick0, Kick1), поэтому запись в PINMUX не проходит.
torik
Цитата
Подозреваю, что SYSCFG залочен (см. регистры Kick0, Kick1), поэтому запись в PINMUX не проходит.


Пишу такую последовательность:
Код
    HWREG (SOC_SYSCFG_0_REGS + SYSCFG0_KICK0R) = 0x83e70b13;
    HWREG (SOC_SYSCFG_0_REGS + SYSCFG0_KICK1R) = 0x95a4f1e0;


Эффект нулевой.

Цитата
ID - регистр модуля GPIO

Для тупых поясните - что это такое за регистр ID модуля GPIO?

Попробовал прочитать пинмукс после записи в него - результат 0, несмотря на разлочивание.
aaarrr
Цитата(torik @ Aug 29 2012, 13:44) *
Для тупых поясните - что это такое за регистр ID модуля GPIO?

Регистр REVID, 0-й адрес в пространстве модуля. Не знаю, как еще объяснить.

Цитата(torik @ Aug 29 2012, 13:44) *
Попробовал прочитать пинмукс после записи в него - результат 0, несмотря на разлочивание.

Возможно, процессор не в привилегированном режиме находится. Попробуйте прочитать REVID SYSCFG.
torik
Чтение REVID дает 0x4E840102

а пинмукс читается как 0
aaarrr
Попробуйте теперь прочитать DEVIDR0.
torik
Кстати, SYSCFG0_KICK0R тоже 0

DEVIDR0 = 0x1B7D102F
aaarrr
Странно как-то. В каком режиме процессор (регистр CPSR)?
torik
Такого регистра не наблюдаю в документации вообще
aaarrr
Это регистр процессора, из серии R0, R1 и т.п.
torik
В регистре R0 содержится адрес зинмукса вроде 0x01C14124.

В режиме дебага вручную правлю регистр пинмукс1 - и запускаю прогу, диод начинает моргать.
aaarrr
Цитата(aaarrr @ Aug 29 2012, 14:47) *
Это регистр процессора, из серии R0, R1 и т.п.

Здесь имелось в виду, где смотреть. Нужно знать именно значение CPSR.
torik
0x200000D0

Есть подозрение, что надо как-то перевести проц в режим supervisor-а, иначе регистры kick и иже с ними не пишутся походу.

Типа чё типа как надо сделать?
aaarrr
Цитата(torik @ Aug 29 2012, 15:36) *
0x200000D0

Понятно: процессор в user mode, поэтому и доступа к SYSCFG нет. Надо шерстить стартап StarterWare на предмет выставления режима.
torik
Exception по Reset-у как раз в режиме супервизора.
Надо как-то сделать ему обработчик, где и буду все эти регистры инициализировать.

Как вариант?

или даже Software interrupt, но не знаю как это сделать на сях.
aaarrr
Цитата(torik @ Aug 29 2012, 16:11) *
Exception по Reset-у как раз в режиме супервизора.
Надо как-то сделать ему обработчик, где и буду все эти регистры инициализировать.

Как вариант?

Так он уже есть, надо только модифицировать на предмет отмены перевода в user.
torik
Ух ты. Где это сделать?
maxis
Тоже интересно, не поделится ли кто примером как попасть в режим супервизора?
aaarrr
Цитата(maxis @ Aug 29 2012, 16:45) *
Тоже интересно, не поделится ли кто примером как попасть в режим супервизора?

Вариантов два:
- не попадать в режим юзера
- SWI

Нужно изучать/модифицировать исходники. Тут не помогу, т.к. у меня их нет.
А вообще, запускаем поиск по "msr" - и вперед.
jcxz
Цитата(aaarrr @ Aug 29 2012, 12:57) *
DSP нужно включить со стороны ARM'а - он выключается почти сразу после старта.

Хм... А что - в L138 первым стартует ARM?
Работал с L137 только - там стартует DSP (по вкл. питания ARM - в ресете) , код bootloader-а выполняет DSP, и в пользовательском ПО чтобы использовать ARM, надо сперва прописать таблицу векторов для ARM (в его памяти), а потом - включить его и вывести из ресета.
Под JTAG - на L137 доступны сразу оба ядра, так как JTAG их сам выводит из ресета когда подключается к ним. И на отладку под JTAG можно запускать сразу два проекта параллельно.

Цитата(aaarrr @ Aug 29 2012, 17:45) *
Понятно: процессор в user mode, поэтому и доступа к SYSCFG нет. Надо шерстить стартап StarterWare на предмет выставления режима.
rts.lib файл boot.asm:
Код
cstartup: .asmfunc                                        
  MRS   R0, SPSR    ;Now will                  
  ORR   R0, R0, #CPU_MODE_SYS;set to SVC mode                  
  MSR   CPSR, R0    ;  with privileges
Можно конечно через SWI. Но я делаю как показал выше - так проще.
Кроме того - в этом rts.lib можно ещё что-нить пооптимизить и пообкусывать.
torik
Скачали с сайта техаса файл boot.asm, тупо добавили его в проект - все заработало.

Как это работает, каким образом этот асм файл встроился в код - непонятно совершенно.

А сигнальник все равно в ресете

На строках

Код
     PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_DSP, PSC_POWERDOMAIN_ALWAYS_ON,
             PSC_MDCTL_NEXT_ENABLE);


виснет. Какой порядок включения dsp? Разве не такой же как и GPIO?
aaarrr
Цитата(jcxz @ Aug 30 2012, 06:46) *
Хм... А что - в L138 первым стартует ARM?

Там мудреная система загрузки: первым стартует DSP, затем он при помощи PRU окучивает ARM, потом ARM отрубает DSP.

Цитата(torik @ Aug 30 2012, 09:50) *
Какой порядок включения dsp?

Порядок включения описан в разделе "DSP Wake Up" sprugm7. Но виснуть при обращении к PSC всяко не должен.
maxis
Цитата(aaarrr @ Aug 30 2012, 10:21) *
Порядок включения описан в разделе "DSP Wake Up" sprugm7. Но виснуть при обращении к PSC всяко не должен.


По мануалу:

Perform the following steps to wake up the DSP:
1. Write a 83E7 0B13h to the KICK0R register in the SYSCFG module.
2. Write a 95A4 F1E0h to the KICK1R register in the SYSCFG module.
3. Write the truncated DSP boot address vector to the DSP_ISTP_RST_VAL field in the host 1
configuration register (HOST1CFG) of the SYSCFG module. The least-significant bits of the boot
address are fixed at 0.
4. Write a 3h to the NEXT bit in the DSP local power sleep controller (LPSC) module control register
(PSC0.MDCTL15) to prepare the DSP module for an enable transition (to enable the clocks and all
transitioning from the SwRstDisable state to Enable state).
5. Write a 1 to the GO[1] bit (DSP subsystem is part of the PD_DSP domain) in the power domain
transition command register (PSC0.PTCMD) to start the state transition sequence for the DSP module.
6. Check (poll for 0) the GOSTAT[1] bit in the power domain transition status register (PSC0.PTSTAT) for
power transition sequence completion. The domain is only safely in the new state after the GOSTAT[1]
bit is cleared to 0.
7. Wait for the STATE bit field in the DSP LPSC module status register (PSC0.MDSTAT15) to change to
3h. The module is only safely in the new state after the STATE bit field changes to reflect the new
state.
8. Write a 1 to the LRST bit in PSC0.MDCTL15 to release the DSP local reset controlled by the PSC
module.

Выполняю следующее:

Код
    HWREG (SOC_SYSCFG_0_REGS + SYSCFG0_KICK0R) = 0x83e70b13;
    HWREG (SOC_SYSCFG_0_REGS + SYSCFG0_KICK1R) = 0x95a4f1e0;

    //Включение DSP
    HWREG (SOC_SYSCFG_0_REGS + SYSCFG0_HOST1CFG) = 0x00E00000;
    PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_DSP, PSC_POWERDOMAIN_PD_DSP, PSC_MDCTL_NEXT_ENABLE);
    PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_DSP, PSC_POWERDOMAIN_PD_DSP, PSC_PTCMD_GO1);
    PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_DSP, PSC_POWERDOMAIN_PD_DSP, PSC_PTSTAT_GOSTAT1_SHIFT);
    PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_DSP, PSC_POWERDOMAIN_PD_DSP, PSC_MDSTAT_STATE);
    PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_DSP, PSC_POWERDOMAIN_PD_DSP, PSC_MDSTAT_LRST);


И на строке
Код
PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_DSP, PSC_POWERDOMAIN_PD_DSP, PSC_MDSTAT_STATE);

Выполнение программы подвисает. Что делаю не так?
aaarrr
Цитата(maxis @ Aug 30 2012, 13:26) *
И на строке
Код
PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_DSP, PSC_POWERDOMAIN_PD_DSP, PSC_MDSTAT_STATE);

Выполнение программы подвисает. Что делаю не так?

А что говорит PSC0.MDSTAT15?
maxis
Цитата(aaarrr @ Aug 30 2012, 14:27) *
А что говорит PSC0.MDSTAT15?

0x00000A00
aaarrr
То есть по статусу он и не начинал включаться. Нужно смотреть внутренности PSCModuleControl, так у меня идей нет.
jcxz
Цитата(aaarrr @ Aug 30 2012, 12:21) *
Там мудреная система загрузки: первым стартует DSP, затем он при помощи PRU окучивает ARM, потом ARM отрубает DSP.

Значит - всё точно так же как в L137.
А зачем Вы отрубаете DSP после старта ARM?
Если интересно могу привести свой код, которым запускаю ARM (см. прикреплённый файл).Нажмите для просмотра прикрепленного файла Файл boot.asm (который в составе rts.lib) модифицирован как указано в моём посте выше.
Начало main() из DSP-проекта:
Код
#pragma FUNC_NEVER_RETURNS
int main()
{
  u32 cpuUseIdle;
  s32 i;

  CACHE.L1DCFG = 7;
  i = CACHE.L1DCFG;
  soc.faza = soc.FAZA_BEGIN;
  EnableARM();

  CooperateWait(soc.FAZA_DSPIDLE_MEAS); //отсель ARM и DSP работают совместно
  ...
aaarrr
Цитата(jcxz @ Sep 1 2012, 00:01) *
Значит - всё точно так же как в L137.

Нет, совершенно по-другому. DSP после старта отрубает программа из ARM Boot ROM.
SM
Цитата(jcxz @ Sep 1 2012, 00:01) *
Значит - всё точно так же как в L137.


Это и есть основное, если даже не единственное отличие 137 и 138 - в 137 стартует DSP с заглушенным ARM, а в 138 наоборот, стартует ARM с заглушенным DSP.
jcxz
Цитата(SM @ Sep 2 2012, 00:26) *
Это и есть основное, если даже не единственное отличие 137 и 138 - в 137 стартует DSP с заглушенным ARM, а в 138 наоборот, стартует ARM с заглушенным DSP.

Да уж, нагородили ... техасцы на ровном месте..... wacko.gif
Думаю, что у L138 тогда более логичный порядок старта. Всегда удивляло - зачем в L137 сделали главным в запуске DSP?
Кстати - не единственное - для нас существенным доводом в пользу L137 против L138 стало наличие в первом McASP (в L138 - только McBSP).
SM
Цитата(jcxz @ Sep 2 2012, 09:54) *
Всегда удивляло - зачем в L137 сделали главным в запуске DSP?

Все просто. Есть задачи, где ДСП молотит всегда, а АРМ у него на подручных работах - TCP/IP например. Там не надо, чтобы АРМ стартовал первым, ДСП в него грузит нужные протокольные уровни и работает через него как через сопроцессор связи. Там L137 удобен - так как ДСП грузится первым и дальше мастерит всеми процессами. А есть другие задачи - где АРМ работает например под линуксом, а ДСП у него на подручных работах - кодек загрузить, когда юзер захочет. Вот тут L138 самое оно.
aaarrr
На самом деле в L138 первым тоже стартует DSP, просто от конечного пользователя вся эта кухня скрыта.

И в нем есть McASP, куда же без него.
SM
Цитата(aaarrr @ Sep 2 2012, 13:27) *
На самом деле в L138 первым тоже стартует DSP

Конечно, точно не могу утверждать, но косвенные признаки показывают, что это не так. Если выполнить hardware reset через JTAG при помощи ICEPICK, и не дать ядрам выполнить ничего из внутреннего ПЗУ, то живым в L138 оказывается таки ARM, а в L137 - DSP. И это же следует из анализа стартапных GEL-файлов обоих процессоров, и последовательностей коннекта эмуляторов к ядрам.
aaarrr
Вот цитата из errata, касающаяся ревизий 2.0 и ниже:
Цитата
For affected silicon revisions, the DSP initiates the system boot sequence when the
device is released from reset. Before the ARM can take control of the user boot mode,
the DSP must first initialize the ARM reset vector table so that the ARM will execute from
its boot ROM.

Возможно, в 2.1 последовательность поменяли, хотя проще было бы пропатчить DSP boot ROM.
SM
Цитата(aaarrr @ Sep 3 2012, 01:14) *
Вот цитата из errata, касающаяся ревизий 2.0 и ниже:

Возможно, в 2.1 последовательность поменяли, хотя проще было бы пропатчить DSP boot ROM.


так и именно, оный глюк был в далекой древности и устранен...
remi700
Возникла примерно такая же задача как в начале темы - на OMAP-L138 протестировать uPP, EMIF и I2C для связи с ПЛИС, только под встроенным Linux и не привлекая DSP ядро. Если с I2C все понятно, то на вопрос о запуске uPP на ARM без запуска DSP на форуме TI отвечают только "используйте DSP/LINK", хотя uPP выглядит достаточно простым. Почему нельзя запустить его не запуская DSP? На форуме и в даташитах прямого ответа на этот вопрос нет (возможно проглядел что он может писать только в память DSP?).
aaarrr
Цитата(remi700 @ Sep 22 2013, 23:36) *
Почему нельзя запустить его не запуская DSP?

Запустить можно, просто драйвера в SDK нет, поэтому и отвечают, что нельзя.
ASN
remi700
Для того, чтобы портестировать UPP можно написать программу без Linux с использованием DMA.
Или написать драйвер net_device (например, на основе драйвера emac).
IMHO, DSP/LINK удобен именно для связи с DSP.
octobus
Есть у кого рабочий пример работы с UPP без DSP/BIOS. Интерфейс на первый взгляд простой, но GPIO тоже простые, а как посмотришь инициализицию там туче пересылок, прежде чем активируешь порты.
И еще вопрос, работал ли кто нибудь с UPP через его DMA? Есть исходники, может кто поделится.
Сам я не уверен, что удастся в разумные сроки разобраться с DMA. На E2E столько тем, где люди копаются с UPP и толком ни один топик не решен.
Короче нужна помощь.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.