Официальный форум СВД Встраиваемые Системы
03 Декабря, 2016, 07:42:10 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
 
 
 Сайт СВД ВС  Начало   Помощь Поиск Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Дискретные входы/выходы ARM Cortex-A8  (Прочитано 2710 раз)
ad
Пользователь

Сообщений: 69


« : 24 Февраля, 2015, 23:12:39 »

Добрый вечер. Уже отчаялся найти ответ. Может быть сможете помочь? Имеется BSP для ARM процессора (ARM Cortex-A8). Исходные коды для CAN-драйвера, Ethernet драйвера и других драйверов. Согласно описаниям доступа к регистрам в этих драйверах, по аналогии пытаюсь обратиться к GPIO регистрам, для получения значения дискретных входов/выходов - нам это нужно для выставления физического адреса для прибора. Доступ получаю следующим образом:
1) Вызываю функцию ThreadCtl(_NTO_TCTL_IO, 0) для получения доступа к регистрам;
2) Вызываю addr = mmap_device_io(<4K>, <GPIO address>) для получения базового адреса GPIO;
3) А затем с помощью value = in32(base+offset) считываю значение.

К сожалению, результаты следующие:
1) Либо получаю SIGSEGV;
2) Либо - SIGBUS - Bus error;
3) Либо считываю 0 и значение не меняется, даже при выставлении адреса.

Понятно, что либо адрес GPIO берется не тот, либо делаю что-то не так. Может быть есть какое-то действие, разрешающие считывание GPIO. Может кто-нибудь на подобных процессорах получал доступ к GPIO? Буду благодарен за любой совет.
Записан
Владимир Махилёв
Сотрудник СВД ВС
Ветеран

Сообщений: 659



WWW
« Ответ #1 : 25 Февраля, 2015, 13:02:21 »

Уточните пожалуйста о каком контроллере идёт речь.

По спецификации  на системный контроллер проверьте еще раз внимательно базовый адрес регистров GPIO. (Указывается либо полный адрес, либо это может быть смещение от начала области регистров контроллера.) Проверьте состояние регистров мультиплексирования (MUX или т.п.) и направление регистров (GPIO Direction), установлены-ли они на чтение.

По получению доступа к регистрам - при чтении подставляете в функцию in32 адрес, полученный от mmap()?
base_addr = mmap_device_io(<4K>, <GPIO address>);
value = in32(base_addr+offset);

Записан

ad
Пользователь

Сообщений: 69


« Ответ #2 : 25 Февраля, 2015, 23:02:28 »

Уточните пожалуйста о каком контроллере идёт речь.

По спецификации  на системный контроллер проверьте еще раз внимательно базовый адрес регистров GPIO. (Указывается либо полный адрес, либо это может быть смещение от начала области регистров контроллера.) Проверьте состояние регистров мультиплексирования (MUX или т.п.) и направление регистров (GPIO Direction), установлены-ли они на чтение.

По получению доступа к регистрам - при чтении подставляете в функцию in32 адрес, полученный от mmap()?
base_addr = mmap_device_io(<4K>, <GPIO address>);
value = in32(base_addr+offset);
Да, подставляю в функцию in32 адрес, полученный от mmap(). В примере, не совсем точно это описал, виноват. Вопрос смог решить тем, что просмотрев код для watchdog timer увидел использование функции mmap_device_memory(). При замене на указанную функцию и использовании GPIO3, а не GPIO0 смогли заметить изменение значение регистра. За помощь спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP © 2002-2016 СВД Встраиваемые Системы.
При использовании материалов сайта ссылка на forum.kpda.ru обязательна.

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines | © Aiwan. Kolobok smiles | Sitemap
Valid XHTML 1.0! Valid CSS!
Сайт СВД ВС

В последний раз google посещал эту страницу 15 Ноября, 2016, 21:16:40