Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: не могу найти смешение для доступа к портам через /dev/mem
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Linux
andybeg
по сабжу нашёл ссылку а вот с адресами по которым идёт смещение для доступа к портам не найду sad.gif
andybeg
вроди бы нарыл адрес, теперь хочется подёргать пин, а не выходит, может что не так написал ...
Цитата
#define PORT0 0x3FFFC000

int SetStrobe(char port,int pin, char state)
{
unsigned char *gpioports;

int fd = open("/dev/mem", O_RDWR);
if (fd == -1)
{
printf("open error...\n");
return 1;
}

gpioports = mmap (0, getpagesize(), PROT_READ|PROT_WRITE, MAP_SHARED, fd, PORT0+0x20*port);

*gpioports != (1UL<<(pin));
return fd;
}
etoja
В uCLinux для lpc2478 к регистрам процессора можно обращаться напрямую по абсолютным адресам:

unsigned long *p, data;

p= 0x1234567; // напишите сюда адрес существующего регистра
data = 0x7654321;
*p = data;
data = *p;
andybeg
может чего не понял, но следующий код не помог sad.gif
Цитата
void SetStrobe(char port,int pin, char state)
{
unsigned long *p, data;

p= PORT0+0x20*port;
data = *p;
data |= (1UL<<(pin));
*p = data;
}


SetStrobe(0,24,1);
SetStrobe(2,11,1);
SetStrobe(1,13,1);
etoja
Цитата(andybeg @ Jun 24 2010, 11:39) *
может чего не понял, но следующий код не помог sad.gif


1) Как объявлена константа PORT0?
Напишите вместо неё число и не ленитесь ставить скобки:

p= PORT0+(0x20*port);

2) переменная port у вас 8-разрядная, значит и произведение 0x20*port будет 8-разрядным и результат может вылезти за 8 бит,
значит напишите так:

p= PORT0+(0x20UL * (unsigned long)port);

3) Сначала отладьте чтение из регистра, только потом - запись в регистр.

andybeg
на нулевом порту сидят джамперы
Цитата
void readJumers()
{
unsigned long *p, data;
p= 0x3FFFC000;
data = *p;

printf("\n0x%x",data);
}

их изменение не меняет картины, всё время получается 0x1000000, что опять же странно

может быть порты нужно как то особенно инициализировать при компиляции uClinux?
сейчас я использую vmlinux.bin кторый шёл с платой олимексовской, а romfs_5.img тот что получается после компиляции ... vmlinux.bin после компиляции получается в 2.5Гб, что описано в ветке рядом sad.gif

всё, разобрался ... по адресам писать научился , вопрос в том что по ним располагаются как понимаю пины портов и на них ничего не отображается sad.gif , как вариант конечно что адрес PORT0=0x3FFFC000 не верен
andybeg
нашёл один вариант доступа к двум первым портам ...

Цитата
void setP01(char port,int pin, char state)
{
unsigned long *IO0DIR,*IO0SET,*IO0CLR, data;
IO0DIR = 0xE0028008+(0x10UL * (unsigned long)port);
IO0SET = 0xE0028004+(0x10UL * (unsigned long)port);
IO0CLR = 0xE002800C+(0x10UL * (unsigned long)port);
if(state)
{
*IO0DIR = (1UL<<(pin));
*IO0SET |= (1UL<<(pin));
}else
{
*IO0DIR &= ~ (1UL<<(pin));
*IO0CLR |= (1UL<<(pin));
}
}


с другими так не получается sad.gif
etoja
У процессоров, не имеющих MMU, в частности у lpc2478, не возникает ни прерывание, ни исключение при обращении к аппаратным регистрам процессора.
Поэтому uCLinux не может (и не хочет по замыслу создателей) перехватывать эти обращения.

Вы убедились, что обращения к этим регистрам проходят, значит и к другим регистрам обязаны проходить.

Ищите ошибку в своих текстах.
Я же вам показывал, что ваши ошибки - элементарные.

Кстати, вы понимаете что выражение
*IO0SET &= ~(1UL<<(pin));
может только установить единицу на ножке, а сбросить ножку в ноль не может?

Если не понимаете, то читайте юзер мануал на процессор.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.