|
|
  |
не могу найти смешение для доступа к портам через /dev/mem, lpc2478 |
|
|
|
Jun 24 2010, 06:05
|
Частый гость
 
Группа: Участник
Сообщений: 133
Регистрация: 30-11-06
Пользователь №: 22 954

|
вроди бы нарыл адрес, теперь хочется подёргать пин, а не выходит, может что не так написал ... Цитата #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; }
|
|
|
|
|
Jun 24 2010, 07:39
|
Частый гость
 
Группа: Участник
Сообщений: 133
Регистрация: 30-11-06
Пользователь №: 22 954

|
может чего не понял, но следующий код не помог  Цитата 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);
|
|
|
|
|
Jun 24 2010, 08:05
|

Профессионал
    
Группа: Свой
Сообщений: 1 121
Регистрация: 14-01-05
Из: Москва
Пользователь №: 1 952

|
Цитата(andybeg @ Jun 24 2010, 11:39)  может чего не понял, но следующий код не помог  1) Как объявлена константа PORT0? Напишите вместо неё число и не ленитесь ставить скобки: p= PORT0+(0x20*port); 2) переменная port у вас 8-разрядная, значит и произведение 0x20*port будет 8-разрядным и результат может вылезти за 8 бит, значит напишите так: p= PORT0+(0x20UL * (unsigned long)port); 3) Сначала отладьте чтение из регистра, только потом - запись в регистр.
|
|
|
|
|
Jun 24 2010, 09:34
|
Частый гость
 
Группа: Участник
Сообщений: 133
Регистрация: 30-11-06
Пользователь №: 22 954

|
на нулевом порту сидят джамперы Цитата 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Гб, что описано в ветке рядом  всё, разобрался ... по адресам писать научился , вопрос в том что по ним располагаются как понимаю пины портов и на них ничего не отображается  , как вариант конечно что адрес PORT0=0x3FFFC000 не верен
Сообщение отредактировал andybeg - Jun 24 2010, 09:36
|
|
|
|
|
Jun 25 2010, 10:28
|
Частый гость
 
Группа: Участник
Сообщений: 133
Регистрация: 30-11-06
Пользователь №: 22 954

|
нашёл один вариант доступа к двум первым портам ... Цитата 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)); } } с другими так не получается
Сообщение отредактировал andybeg - Jun 25 2010, 11:25
|
|
|
|
|
Jun 25 2010, 10:57
|

Профессионал
    
Группа: Свой
Сообщений: 1 121
Регистрация: 14-01-05
Из: Москва
Пользователь №: 1 952

|
У процессоров, не имеющих MMU, в частности у lpc2478, не возникает ни прерывание, ни исключение при обращении к аппаратным регистрам процессора. Поэтому uCLinux не может (и не хочет по замыслу создателей) перехватывать эти обращения.
Вы убедились, что обращения к этим регистрам проходят, значит и к другим регистрам обязаны проходить.
Ищите ошибку в своих текстах. Я же вам показывал, что ваши ошибки - элементарные.
Кстати, вы понимаете что выражение *IO0SET &= ~(1UL<<(pin)); может только установить единицу на ножке, а сбросить ножку в ноль не может?
Если не понимаете, то читайте юзер мануал на процессор.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|