RadiatoR 2 23 июля, 2017 Опубликовано 23 июля, 2017 · Жалоба Всем доброго дня. Написал небольшое приложение, которое выводит значение кнопки Key в консоль (плата de0-nano-soc). Кнопка висит на GPIO54 (J18), что находится в группе GPIO1 со сдвигом (1 << 25). Пытаюсь прочитать ее значение с регистра ext_port_a, но она всегда в одном и том же состоянии - выключена. Такое ощущение, что не включено тактирование (аля как в STM32). Но регистр ext_port_a для GPIO0 иногда меняется. Видимо я что-то упустил? Не могу понять. Вот код: #include #include "Types.h" #define GPIO_BASE 0xFF708000 #define GPIO_0 GPIO_BASE #define GPIO_1 GPIO_0 + 0x1000 #define GPIO_2 GPIO_1 + 0x1000 #define GPIO_EXT_PORT_A 0x50 #define GPIO_0_EXT_PORT_A GPIO_0 + GPIO_EXT_PORT_A #define GPIO_1_EXT_PORT_A GPIO_1 + GPIO_EXT_PORT_A #define GPIO_2_EXT_PORT_A GPIO_2 + GPIO_EXT_PORT_A void delay(unsigned long long delay) { while(delay--); } #define PIN 25 void main()//int argc, char** argv { unsigned int step = 0; //scanf("%d", &step); while(true) { if((*((uint *)GPIO_0_EXT_PORT_A) & ((uint)1 << PIN)) > 0) printf("ON! gpio_0 Iteration: %d\n", step); else printf("OFF! gpio_0 Iteration: %d\n", step); if((*((uint *)GPIO_1_EXT_PORT_A) & ((uint)1 << PIN)) > 0) printf("ON! gpio_1 Iteration: %d\n", step); else printf("OFF! gpio_1 Iteration: %d\n", step); if((*((uint *)GPIO_2_EXT_PORT_A) & ((uint)1 << PIN)) > 0) printf("ON! gpio_2 Iteration: %d\n", step); else printf("OFF! gpio_2 Iteration: %d\n", step); printf("\n"); step++; delay(100000000); } } Заранее спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 23 июля, 2017 Опубликовано 23 июля, 2017 · Жалоба Попробуйте сначала хотя бы снять сигнал сброса с модуля GPIO, вызвав alt_gpio_init() В настройках HPS в QSys нужные пины настроены как GPIO? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RadiatoR 2 23 июля, 2017 Опубликовано 23 июля, 2017 · Жалоба По поводу alt_gpio_init() есть проблема - не могу понять как заголовочные мне нужно подключить для работы с периферией hps. У меня есть папка C:\intelFPGA\16.1\embedded\ip\altera\hps\altera_hps\hwlib\include и тут много заголовочных файлов, в том числе для gpio. При добавлении в свойствах проекта этой директории компилятор ругается на некоторые инклюды, например Error: #5: cannot open source input file "cstdbool": No such file or directory. Вообще эклипс странный какой-то (запускаю через EDS shell - "eclipse &") просто в проекте не подтягивает cstdbool, более того при билде проекта не билдит его. То есть если пожмакать в исходнике без ошибок кнопками просто в коде и забилдить - он напишет: 17:17:10 **** Incremental Build of configuration Debug for project Altera-Cyclone-V_RAM **** make all make: Nothing to be done for 'all'. 17:17:10 Build Finished (took 73ms) и типо нормально. Хотя ругаться на рандомный текст должен. Хм, если сделать клин и опять билд, то он в консоли пишет, что билдит, все ок, но такого быть не может... Что за идиотизм? Помогает перезагрузка... Странно очень. Пока что не могу понять по исходникам что и где ресетится... Долго лазить, т.к. у меня они не подтягиваются... Сейчас буду бороться с эклипсом... По поводу Qsys - раньше с ним дела не имел. Как я понял это планировщик ножек микросхемы? А по дефолту ноги настроены на плис? Открыл голд реф в квартусе. Тут есть верилог файл ghrd_top (видимо описание какая нога куда идет). Запустил qsys, появилось (графическое?) отображение схемы соединения чего-то с чем-то. Есть блоки (instance?) hps_0, там есть hps_io, полагаю это блок GPIO и его нужно физически соединить с ногами. Есть блоки button_pio и led_pio. Между hps_io и button_pio (external_connection) было уже какое-то серое (выключенное) соединение. Я воткнул точки по этому соединению на обоих блоках. Сразу выскочило 13 ошибок. Видимо что-то пошло не так :D Есть какой-то референс, где эти кнопки уже подключены? А как в итоге заливается эта настройка ног? Через прошивку ПЛИС? Или это всего лишь наглядное отображение, а потом на основе него генерируется верилоговский файл (ghrd_top.v), который уже компилируется квартусом и шьется? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 23 июля, 2017 Опубликовано 23 июля, 2017 · Жалоба компилятор ругается на некоторые инклюды, например Error: #5: cannot open source input file "cstdbool": No such file or directory. Аналогично было. Я не стал парится, а просто положил пустой файл с именем cstdbool в папку с исходниками и проблема ушла. Нужные исходники hwlib тоже пришлось скопировать в отдельную папку проекта, чтобы они подключились и компилировались. По поводу эклипса и билда - использую компилятор ARM, и в настройках C/C++ Build у меня включено Generate Makefiles Automatically. Работает чётко, все изменения в проекте отслеживаются правильно, компилируются только модифицированные файлы. По поводу Qsys - раньше с ним дела не имел. Как я понял это планировщик ножек микросхемы? Это интегратор системы, в котором задаются настройки модулей и их соединения. В том числе QSys генерирует код, на основе которого загрузчик будет инициализировать процессор, настраивать пины, SDRAM, PLL и т.д. К примеру, пины GPIO настраиваются в свойствах HPS на вкладке Peripheral Pins. А планировщик ножек - это PinPlanner. Вы бы матчасть поизучали получше. Иначе SoC вам поднимать будет непросто :) Есть какой-то референс, где эти кнопки уже подключены? Вот в GHRD всё, что надо, подключено, изучайте его. А как в итоге заливается эта настройка ног? Через прошивку ПЛИС? Загрузчиком - bootloader называется. Тут было несколько тем, где подробнее разжёвано. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RadiatoR 2 18 октября, 2017 Опубликовано 18 октября, 2017 · Жалоба Доброго дня. К сожалению не много времени получается уделить освоению платки, но все же лучше чем ничего. Разобрался с Qsys, голд референсом. Обнаружил модуль Reset manager, который все блокировал (я то по аналогии с stm32 работал, а там только тактирование...). Снял ресет с гпио -> отобразился ID портов 0x3230382A, увидел изменение регистра в gpio_ext_porta по нажатию кнопки. Здорово, вот только диодом так и не могу поморгать. Пытался работать с ним напрямую из памяти - не хочет. DDR естественно установлен. Вроде бы ограничений больше нет. В голд референсе выходы J18(кнопка) и A20(led) как и положены установлены в гпио. Сам светодиодик кстати слегка светится, думал это weak pull-up, убрал просто на tri stated, но светик так и остался слегка светящимся... Что может еще ограничивать его включение? Спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 19 октября, 2017 Опубликовано 19 октября, 2017 · Жалоба Настроить пины надо будет всё равно: // Setup GPIOs // Reset GPIO module alt_gpio_init(); ALT_GPIO_CONFIG_RECORD_t gpio_init_pins[] = { // HPS_LED { ALT_GPIO_1BIT_53, ALT_GPIO_PIN_OUTPUT, ALT_GPIO_PIN_LEVEL_TRIG_INT, ALT_GPIO_PIN_ACTIVE_LOW, ALT_GPIO_PIN_NODEBOUNCE, ALT_GPIO_PIN_DATAZERO }, // HPS_KEY { ALT_GPIO_1BIT_54, ALT_GPIO_PIN_INPUT, ALT_GPIO_PIN_LEVEL_TRIG_INT, ALT_GPIO_PIN_ACTIVE_LOW, ALT_GPIO_PIN_DEBOUNCE, ALT_GPIO_PIN_DATAZERO } }; status = alt_gpio_group_config(gpio_init_pins, ARRAY_COUNT(gpio_init_pins)); assert(status == ALT_E_SUCCESS); И затем уже можно будет изменять значение на пине функцией alt_gpio_port_data_write Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RadiatoR 2 19 октября, 2017 Опубликовано 19 октября, 2017 · Жалоба Выкинув некоторые куски непонятного asm кода из альтеровских библиотек они все таки скомпилились. Провел инициализацию gpio с помощью alt_gpio_group_config и далее попробовал включить светик с помощью alt_gpio_port_data_write. Не получилось. В обоих случаях функция возвращала "успех". Не удивительно, ведь эти функции всего лишь настраивают регистры GPIO, а именно прерывания, дебаунс и т.д. Все они находятся в дефолтном, выключенном состоянии и не меняются при вызове этих функций. Меняется только DDR регистр на 1 << 24 и DR регистр выставляет ту же единичку. Все это я проделывал напрямую через память. Светодиод продолжает очень тускло гореть. При изменении бита в DR яркость горения не меняется. Вообще полагаю тут даже дело не в настройке, т.к. gpio на вход работает нормально. Это свидетельствует о наличии тактирования и вообще работоспособности интерфейса. Т.к. за выход отвечает только 1 бит в DDR, то настройка проведена верно. Загвоздка где-то рядом, но не тут. В общем буду копать дальше. Кстати еще вопросик - у меня while цикл бесконечный. Если идти по шагам, то все ок. Если ткнуть "play", то PC прыгнет на код bootROM и будет там что-то делать. Кроме как прерыванию тут более нечему сработать. Почему так происходит? Какое прерывание может срабатывать и выбрасывать код опять в бут? Кстати при выбросе в бут GPIO опять падает в reset. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 19 октября, 2017 Опубликовано 19 октября, 2017 · Жалоба А что у вас в настройках HPS в квартусе? Нужные пины GPIO настроены верно? Я же выше говорил уже про это: К примеру, пины GPIO настраиваются в свойствах HPS на вкладке Peripheral Pins. Затем генерируете прелоадер с настройками своей системы, и он проведет необходимую низкоуровневую настройку - pinmux, reset manager и т.п. Вы как свое приложение запускаете вообще? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RadiatoR 2 20 октября, 2017 Опубликовано 20 октября, 2017 · Жалоба Добрый день. В настройках hps 54 и 53 пины настроены как gpio. Собственно это в голд референсе было изначально. Это дело прошивается в плис, соответственно настраиваются тамошние свзяи (или не настраиваются?). Далее я запускаю baremetal приложение (SD карта вообще не вставлена). Код загружается в 64кб RAM и стартует оттуда. Там уже сбрасывается ресет с гпио и инициализируется ножка на выход. Получается прелоадера нет никакого, т.к. нет сд карты. Я сегодня попробую перенастроить ножку кнопки на выход, ее включить и посмотреть что у нее там будет. Мало ли чего могло произойти с ногой светика, хотя вряд ли. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 20 октября, 2017 Опубликовано 20 октября, 2017 · Жалоба В настройках hps 54 и 53 пины настроены как gpio. Собственно это в голд референсе было изначально. Это дело прошивается в плис, соответственно настраиваются тамошние свзяи (или не настраиваются?). Далее я запускаю baremetal приложение (SD карта вообще не вставлена). Код загружается в 64кб RAM и стартует оттуда. Там уже сбрасывается ресет с гпио и инициализируется ножка на выход. Получается прелоадера нет никакого, т.к. нет сд карты. Я сегодня попробую перенастроить ножку кнопки на выход, ее включить и посмотреть что у нее там будет. Мало ли чего могло произойти с ногой светика, хотя вряд ли. Ну я так и понял, что вы занимаетесь ерундой. Без прелоадера ничего у вас нормально работать не будет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RadiatoR 2 25 января, 2018 Опубликовано 25 января, 2018 · Жалоба Доброго вечера. Через прелоадер неспортивно. Хочется понять какие модули нужно настроить чтобы заработал интерфейс. В дальнейшем так будет проще настраивать остальное, да и базовые знания будут лучше, чем "просто запустим прелоадер". Итак QSys сгенерил голд референс. Там GPIO настроены как GPIO, что и требуется. 1. В программе первым делом сбрасываю вотчдог (с помощью ресет манагера) - именно он выкидывал меня куда-то в прерывание в бут если я не сбрасывал его. 2. Настраиваю GPLMUX53 на GPIO: *((uint *)0xFFD086A8) = 1; 3. Снимаю ресет на GPIO1 RSTMGR->PERMODRST &= ~(uint(1 << 26)); 4. GENERALIO5 уже находится в GPIO, поэтому обнулять его нам не нужно. 5. Настраиваю DDR у порта GPIO1->DDR |= 1 << 24; 6. Пытаюсь мигать с задержкой, регистры меняются, светик не светит =( if(phase) { phase = false; GPIO1->DR = 1 << 24; } else { phase = true; GPIO1->DR &= ~(uint(1 << 24)); } delay(2000000); Прочитал про все менеджеры. Вроде бы более никто не контролирует GPIO. Уже совсем близко, но что-то еще держит... Завтра попробую скомпилить прелоадер и поискать какой кусок кода инициализирует gpio, а то так можно бесконечно рыть... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RadiatoR 2 22 февраля, 2018 Опубликовано 22 февраля, 2018 · Жалоба Всем доброго и с наступающим! Как оказалось все это время порт был в tri-state состоянии, благодаря биту tristate в System manager -> VIO Control Register[2] (0xFFD08048) -> tristate. Некая Freeze Control Group в систем манагере. Итак светик заработал - это главное, а остальные DMA, ETH, FPGA manager и прочие пойдут как по маслу это точно :D Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться