Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.11.2015, 13:43   #1
Foton6
Пользователь
 
Регистрация: 04.11.2015
Сообщений: 14
По умолчанию Разбираюсь с x86 (FreeRTOS + PCM-9387).

Доброго времени суток!
Игаюсь я собственно с одноплатным компьютером PCM-9387
(Celeron M 1Ghz).

Натянул на него FreeRTOS по средствам Grub'а.
Пользую Eclipse + Cross compiller (точно не знаю какой, по ссылкам со страницы FreeRTOS'a нашел его).
С ассемблером можно сказать начал знакомится только на этом "проекте")
Дрова под данную ОС не нашел) Было бы странно если бы нашел)

В общем по ходу дела начинают возникать вопросы на которые не могу пока что найти ответов и прошу вас немного помочь, по пинать в нужном направлении.

Весь код, который пишу, создаю как задачи во FreeRTOS.
Первые несколько вопросов:

-1- Считываю регистр данных клавиатуры (порт 0x60) пока без прерываний так как пока не разбирался что за магия творится в файлах startup.S и portASM.S. Нажатия клавишь нормально считываются, но при нажатии на некоторые клавиши динамик пищит непрерывно пока не нажать на другую клавишу (ничего не виснет). В чем может быть дело?
код считывания:
Код:
void KEY_code (void *pp)
{
	uint32_t temp =0;
	char OUT_NUM[8];
	while(1)
	{
		__asm__ __volatile__("in %w1, %b0":"=a"(temp):"d"(0x60));		//__Получение кода клавиши
		if(temp != 0)
		{
		    i2s_hex( OUT_NUM, temp );					//__Преобразование чисел в HEX строку.
		    k_print(1, 10, OUT_NUM );					//__Вывод на экран.
		    __asm__ __volatile__("in %w1, %b0":"=a"(temp):"d"(0x60));
		    temp |= 0x80;
		    __asm__ __volatile__("out %w0, %w1"::"a"(temp),"d"(0x61));	//__Гворю контроллеру "Данные считаны".
		}
	}
}
-2- Хочу задействовать GPIO порт, но что-то вообще безрезультатно. Документация на эту плату скудна( Не могу понять как обращатся к данному устройству. Подскажите как с ним работать?
Манул на плату (3 мб)
Foton6 вне форума Ответить с цитированием
Старый 04.11.2015, 14:03   #2
Foton6
Пользователь
 
Регистрация: 04.11.2015
Сообщений: 14
По умолчанию

Первый вопрос решен)
Исключил запись в регистр 0x61 (я же не в прерывании работаю). Хотя непонятно почему пищало.
Подкиньте пожалуйста ссылку на описание регистров контроллера клавиатуры, с адресами желательно.

Последний раз редактировалось Foton6; 04.11.2015 в 14:14.
Foton6 вне форума Ответить с цитированием
Старый 04.11.2015, 14:54   #3
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Открываем вашу доку находим строчку
System Chipset: Intel 852GM GMCH/ICH4 chipset

Дальше гуглим.

http://www.intel.com/content/www/us/...datasheet.html

http://www.intel.com/content/dam/www...-datasheet.pdf

Далее читаем вторую книгу смотрим
Ищем 61h находим на стр 342 что этот порт не имеет к клавиатуре ни какое отношение. А отвечает за пищалку и NMI.

Вам повезло материнку вы не спалили, а только вызвали NMI прерывание которое выдало ошибку, а система просто выдала Beep. На будущее проверяйте код который берёте, 61h порт относился к клавиатуре только в компьютерах IBM XT это было в 70 годах.


Продолжаем раскопки.
Находим даташит
http://pdf1.alldatasheet.com/datashe.../PCM-9387.html

Находим там LPC SuperIO опознаем его как W83627HF
Везёт на Super I/O только в 50% можно найти даташит:
http://datasheetspdf.com/PDF/W83627HF/370437/1

Далее 7 глава там описана клавиатура.
А так обычно приходится пользоваться документаций на IBM PS/2 так как все компьютеры являются совместимыми с ними.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 04.11.2015, 15:18   #4
Foton6
Пользователь
 
Регистрация: 04.11.2015
Сообщений: 14
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Открываем вашу доку находим строчку
System Chipset: Intel 852GM GMCH/ICH4 chipset

Дальше гуглим.
...
Спасибо)

Чет я даже не подумал на чипсет погуглить)
Ухх)
Столько инфы узнал за последние недели 2^^
Так и придется написать свою недоОС для опровдания полученных знаний))))))


А поповоду 0x61, если верить доке на плату то:
Цитата:
060-06F 8042 (keyboard controller)
Foton6 вне форума Ответить с цитированием
Старый 04.11.2015, 15:57   #5
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от Foton6 Посмотреть сообщение
060-06F 8042 (keyboard controller)
Это просто ошибка.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 04.11.2015 в 16:01.
Pavia вне форума Ответить с цитированием
Старый 05.11.2015, 15:14   #6
Foton6
Пользователь
 
Регистрация: 04.11.2015
Сообщений: 14
По умолчанию

Опять нужна помощь))))

Никак не могу заставить работать GPIO порты.
Использовал пример из дока на плату, не катит.
Почитал ДШ на микруху W83627HF. Вроде бы пример оформлен правильно, но блин оно ведь никак не работает.

Вот код:
Код:
while(1)
	{
		
//__Спец. последовательность для выхода в расширенный режим.
		temp = 0x87;
		__asm__ __volatile__("out %b0, %w1"::"a"(temp),"d"(0x2E));

		__asm__ __volatile__("out %b0, %w1"::"a"(temp),"d"(0x2E));
//__Выбор типа адресации (07 - работать с логическими номерами устройств)
		temp = 0x07;
		__asm__ __volatile__("out %b0, %w1"::"a"(temp),"d"(0x2E));
//__Выбираю 7 лог. устройство
		temp = 0x07;
		__asm__ __volatile__("out %b0, %w1"::"a"(temp),"d"(0x2F));

//__Выбираю регистр CR-F0
		temp = 0xF0;
		__asm__ __volatile__("out %b0, %w1"::"a"(temp),"d"(0x2E));
		temp = 0x00;
		__asm__ __volatile__("out %b0, %w1"::"a"(temp),"d"(0x2F));   //__Все пины как выходные.

//__Выбираю регистр CR-F2
		temp = 0xF2;
		__asm__ __volatile__("out %b0, %w1"::"a"(temp),"d"(0x2E));
		temp = 0x00;
		__asm__ __volatile__("out %b0, %w1"::"a"(temp),"d"(0x2F));   //__Все пины не инвертированные.

//__Выбираю регистр CR-F1
		temp = 0xF1;
		__asm__ __volatile__("out %b0, %w1"::"a"(temp),"d"(0x2E));
		temp = 0x55;
		__asm__ __volatile__("out %b0, %w1"::"a"(temp),"d"(0x2F));  //__Вывожу данные в порт.


//__Выбираю регистр CR-F0
		temp = 0xF0;
		__asm__ __volatile__("out %b0, %w1"::"a"(temp),"d"(0x2E));

		__asm__ __volatile__("in %w1, %b0":"=a"(temp):"d"(0x2F));  //__Вывожу содержимое регистра на экран.
		i2s_hex( OUT_NUM, temp );
		k_print(10, 4, OUT_NUM );

//__Выбираю регистр CR-F1
		temp = 0xF1;
		__asm__ __volatile__("out %b0, %w1"::"a"(temp),"d"(0x2E));

		__asm__ __volatile__("in %w1, %b0":"=a"(temp):"d"(0x2F));   //__Вывожу содержимое регистра на экран.
		i2s_hex( OUT_NUM, temp );
		k_print(10, 5, OUT_NUM );

//__Выбираю регистр CR-F2
		temp = 0xF2;
		__asm__ __volatile__("out %b0, %w1"::"a"(temp),"d"(0x2E));

		__asm__ __volatile__("in %w1, %b0":"=a"(temp):"d"(0x2F));   //__Вывожу содержимое регистра на экран.
		i2s_hex( OUT_NUM, temp );
		k_print(10, 6, OUT_NUM );

//__Последовательность для выхода из данного режима.
		temp = 0xAA;
		__asm__ __volatile__("out %b0, %w1"::"a"(temp),"d"(0x2E));
	}
Считывал все GPIO устройства, ни одно не соответствует реальному состоянию пинов, такое ощущение что пины вообще подключены совсем к другому устройству/порту/микрухе.
Описание на плату (разьемов/джамперов) соответствует той плате что на столе^^
З.Ы.
Как тут споллер юзать, а о длинные коды втыкать как то неудобно?

Последний раз редактировалось Foton6; 05.11.2015 в 15:22.
Foton6 вне форума Ответить с цитированием
Старый 05.11.2015, 16:43   #7
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
/__Выбираю регистр CR-F2
temp = 0xF2;
__asm__ __volatile__("out %b0, %w1"::"a"(temp),"d"(0x2E));

__asm__ __volatile__("in %w1, %b0":"=a"(temp):"d"(0x2F)); //__Вывожу содержимое регистра на экран.
Для того что-бы логика успела отработать между выбором регистра и чтение рекомендуется делать паузу. Обычно делают при помощи команды
out 0ebh, al. Или любой другой порт ISA не привязанный к устройствам.


Цитата:
такое ощущение что пины вообще подключены совсем к другому устройству/порту/микрухе.
Там порты GPIO совмещены с устройствами. Прежде чем их использовать не плохо-бы отключить: смотри регистр CR2A

Код:
		temp = 0x2A;
		__asm__ __volatile__("out %b0, %w1"::"a"(temp),"d"(0x2E));
		temp = 0xFD;
		__asm__ __volatile__("out %b0, %w1"::"a"(temp),"d"(0x2F));
Цитата:
Как тут споллер юзать, а о длинные коды втыкать как то неудобно?
Пиши короткий код. Повторяющийся код можно вынести в функцию. А скорее всего уже есть portoutb()
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 05.11.2015, 16:53   #8
Foton6
Пользователь
 
Регистрация: 04.11.2015
Сообщений: 14
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
....
Ну на счет писать короткий код понятно, просто у меня пока тут полный ТЕСТ-ХАОС )))) Тыкаю -удаляю снова тыкаю, короче дичь))))
Постараюсь завтра упорядочить все)

Да я пробовал паузы делать(при помощи функций FreeRTOS'а).
Эфект тот же, приведенный код нормально записывает и читает регисты.

А по поводу того включено ли необходимое мне устройство сказано в доках на плату что оно вкл. и уже настроено что 2 пина на выход 2 на вход, что подтверждает мультиметр)
Регист CR30 7 устаройства тоже подтверждает что включена именно GPIO опция. Обязательно проверю то что Вы сказали, а то уже начинаю верить в магию)
Foton6 вне форума Ответить с цитированием
Старый 06.11.2015, 09:30   #9
Foton6
Пользователь
 
Регистрация: 04.11.2015
Сообщений: 14
По умолчанию

Заработалиииииииии) Вы оказались правы в регистре был включен режим Game Port (общее значение регитсра было),
все решилось 1 << 7 ))))))
Блин это жесть насколько я не внимательный(
Foton6 вне форума Ответить с цитированием
Старый 06.11.2015, 13:55   #10
Foton6
Пользователь
 
Регистрация: 04.11.2015
Сообщений: 14
По умолчанию

ППЦ распиновка GPIO не соответствует документации Оо
приведенная распиновка на разъем (GP1, GP5, GP0, GP4, VCC).
действительная (GP3, GP2, GP1, GP0, VCC).
Foton6 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разбираюсь в коде С# Alexey Smirnov C# (си шарп) 4 18.11.2013 19:18
Разбираюсь с Code::Blocks Демик Помощь студентам 5 15.04.2013 20:22
Не разбираюсь динамическом программировании. sirex Паскаль, Turbo Pascal, PascalABC.NET 2 22.09.2010 21:58
Не разбираюсь в функциях logok Общие вопросы C/C++ 5 03.04.2010 00:30