Официальный форум СВД Встраиваемые Системы
20 Апрель, 2024, 19:10:52 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

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

Сообщений: 70


« : 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? Буду благодарен за любой совет.
Записан
Владимир Махилёв
Сотрудник СВД ВС
Старожил

Сообщений: 704



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
Пользователь

Сообщений: 70


« Ответ #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-2024 СВД Встраиваемые Системы.
При использовании материалов сайта ссылка на forum.kpda.ru обязательна.

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

В последний раз google посещал эту страницу 21 Март, 2024, 17:39:09