Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Запись в порт


Автор: hente 1.4.2009, 10:56
Здраствуйтеsmile)

Код

10 value=inb(0x2fb);//считываеи данные
20     value---< выставляем необходимые биты
30 outb(value,0x2fb);//устанавливаем



описание:
Считываю байт из регистра с данным адресом
потом выставляю необходимый бит, и опять записываю
но вот после записи считываю байт а он без изменений
как будто строки 20 и небыло 

перед этим резервирую эти адреса портов ф-ей reque_regoin()

в чеи может быть проблемв? 

Автор: xvr 1.4.2009, 13:16
А что за девайс там висит? Может он так и должен реагировать?

Автор: hente 1.4.2009, 13:39
UART

Автор: xvr 1.4.2009, 14:29
Там висит Line Control регистр. Должен писаться и читаться. Можно глянуть на код?


Автор: MAKCim 1.4.2009, 16:37
Цитата(hente @  1.4.2009,  10:56 Найти цитируемый пост)
в чеи может быть проблемв?  

мож задержку (udelay из ядра, yield из юзер-спейс) перед повторным считыванием сделать?

Автор: hente 2.4.2009, 04:57
ядро 2.6.21.5
вот исходникsmile)

Код

#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>

#include <linux/interrupt.h>
#include <linux/sched.h>
#include <linux/workqueue.h>
#include <linux/ioport.h>
#include <asm/io.h>

static int adr_port=0x2f8;
static int count_port=8;

/*----------------------------------------------
----------------------------------------------*/

irqreturn_t irq_handler(int irq,void* dev_id,struct pt_rega *regs){
    
    printk("<1> irq_%d",irq); 
    
    return IRQ_HANDLED;
    }

/*------------------------------------------------
------------------------------------------------*/

static int init_mod(void){
    request_region(adr_port,count_port,"test_irq_mem");

    printk("<1> START MOD"); 
    printk("<1> \n"); 
    int status=1;
//-------------------------------------------------    
    unsigned char irq_on;
    
    outb(0,0x02fb);
    printk("<1> 0x2fb edit %x \n",irq_on);     
    
    irq_on=inb(0x02fb);
    printk("<1> 0x2fb read %x \n",irq_on); //тут всегда читает FF не завимо 
                                                 //что я записываю 0б или любой другой бит
    
//    flag SA_INTERRUPT SA_SHIRQ
    
    free_irq(3,NULL);    
    status = request_irq(3,irq_handler,  SA_INTERRUPT,"test_irq",(void*)(irq_handler));
                                    //         __^__
                                   //тут правильно флаг стоит?
    printk("<1> request_irq %d \n",status); 
    
     return 0;
    }

/*---------------------------------------------------    
----------------------------------------------------*/

static void cleanup_mod(void){
    release_region(adr_port,count_port);
    printk("<1> STOP MOD"); 
    free_irq(3,NULL);    
    return;
    }
    
/*--------------------------------------------------
---------------------------------------------------*/    
module_init(init_mod); 
module_exit(cleanup_mod); 
 


Автор: hente 2.4.2009, 05:22
к стате вчера пришла идея:  аможет другие модули зарезервировали эти регстры...так вот
перекомпилировал ядро отключив (поставил "модуль") все что связано с последовательным портом
как раз после этого и начало выдавать "FF", а до того при чтении выдавало "00"...вот правильно ли я мыслю?

Автор: MAKCim 2.4.2009, 08:31
hente
насколько я вижу, ты записываешь 0 в порт 0x02fb
почему при чтении ты должен получить FF? это логика устройства?

Добавлено через 3 минуты и 21 секунду
Цитата(hente @  2.4.2009,  05:22 Найти цитируемый пост)
аможет другие модули зарезервировали эти регстры...

посмотри спецификацию на чипсет
обычно есть два диапазона адресов I/O: настриваемый и legacy
legacy диапазон распределен между legacy устройствами и статичен
настриваемый позволяет динамически резервировать для PCI устройств пространство адресов I/O

Автор: hente 2.4.2009, 10:38
в том тот и проблема почему когда я  туда записываю "0"(любой байт) получаю "FF"...???????
0x02fb-как я понял эт регист управления COM2 портом (0x2f8)
там по определенным битам включается прерывания на IRQ 3,

вообще проблема в том что приведенный выше код не отлавливает прерывания от COM2 (ну или UART)

зато если меняю в request_irq() первый параметр(номер прерывания ) то клавиатурные прерывания без проблем ловятся.

Устройство подключено и работает!...под другой ОС (WIN) гружусь все в норме...

очень большая просьба к помощи, от людей которые с этим сталкивалися.

Автор: xvr 2.4.2009, 14:10
Похоже нету там у тебя порта  smile Ищи его на других адресах. Или по крайней мере проверь, что из портов 0x2f8-0x2ff считывается что либо отличное от FF

Автор: andrew_121 2.4.2009, 18:04
В старые добрые времена кодил под DOS драйвер звуковухи. Так вот. Там, для инициализации нужно было записать значение, считать, произвести битовую операцию, и обратно записать.
Так вот что было не так как писалось в даташите на микруху. При попытке считать значение, оно считывалось таким же. Исправить проблему получилось только введением цикла в момент считывания, который продолжался до тех пор, пока считываемое значение не изменилось. И все, вуаля!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)