COM порт написание драйвера

Тема в разделе "WASM.ELECTRONICS", создана пользователем Aids, 3 апр 2008.

  1. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    Я пытаюсь написать собственный драйвер для RS232. В ходе поиска я выяснил что микроконтроллером COM порта можно управлять инструкциями OUT и IN. Адреса портов я узнал в дисптчере задачь. COM1 3F8-3FE; COM2 2F8-2FE; но прежде чем пересылать или принимать данные надо сконфигурировать порт. Может кто знает какие байты надо пересылать для конфигурации порта?
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    как и всеми остальными девайсами компа. ну еще используется аппаратное проецирование памяти.
    ВОобще, если честно, то гугл рулит.
    НО ладно, так и быть:
    Код (Text):
    1. USHORT ComPorts[2] = {
    2.     PORT_COM1_BASE,
    3.     PORT_COM2_BASE
    4. };
    5. BOOLEAN
    6. CheckComPortConnected(
    7.     IN UCHAR ComPortNumber
    8.     )
    9. {
    10.     UCHAR Read;
    11.  
    12.     for( int i=0; i<8; i++ )
    13.     {
    14.         Read = KiInPort ( ComPorts[ComPortNumber] );
    15.         if( Read != 0xFF )
    16.             return TRUE;
    17.     }
    18.  
    19.     return FALSE;
    20. }
    21.  
    22.  
    23. BOOLEAN
    24. InitializeComPort(
    25.     IN UCHAR Port,
    26.     IN ULONG Frequency
    27.     )
    28. {
    29.     if( !CheckComPortConnected( Port  ) )
    30.     {
    31.         //
    32.         // Port is not connected.
    33.         //
    34.  
    35.         return FALSE;
    36.     }
    37.  
    38.     USHORT Multiplier = (USHORT)(COMPORT_BASEFREQ / (16 * Frequency));
    39.  
    40.     UCHAR Lcr = (1<<7);
    41.     WRITE_COM(Port, 3, Lcr);
    42.  
    43.     WRITE_COM(Port, 0, Multiplier & 0xFF);
    44.     WRITE_COM(Port, 0, Multiplier >> 8);
    45.    
    46.              // READY   BR FixParity     ParityCheck     Stop    Size
    47.     Lcr = 7; //   0     0   0               00            1       11
    48.     WRITE_COM(Port, 3, Lcr);
    49.  
    50.     WRITE_COM(Port, 1, 0);
    51.  
    52.     return TRUE;
    53. }
    54.  
    55. BOOLEAN
    56. ComPortGetByte(
    57.     UCHAR ComPortPreferred,
    58.     UCHAR* Byte
    59.     )
    60. {
    61.     UCHAR t;
    62.  
    63.     if (GET_COMPORT_STATE(ComPortPreferred) & COMPORT_DATAREADY)
    64.     {
    65.         t = READ_COM (ComPortPreferred, 0);
    66.  
    67.         if (ARGUMENT_PRESENT(Byte))
    68.         {
    69.             *Byte = t;
    70.         }
    71.  
    72.         return 1;
    73.     }
    74.  
    75.     if (GET_COMPORT_STATE(ComPortPreferred) & COMPORT_READER_ERROR)
    76.     {
    77.         return 0;
    78.     }
    79.  
    80.     return 0;
    81. }
    82.  
    83. VOID
    84. ComPortPutByte(
    85.     UCHAR ComPortPreferred,
    86.     UCHAR Byte
    87.     )
    88. {
    89.     while( !(GET_COMPORT_STATE(ComPortPreferred) & COMPORT_READY_TO_WRITE) )
    90.     {
    91.         Pause( 20 );
    92.     }
    93.        
    94.     WRITE_COM( ComPortPreferred, 0, Byte );
    95. }
    Константы очевидны:

    Код (Text):
    1. #define PORT_COM1_BASE 0x3F8
    2. #define PORT_COM2_BASE 0x2F8
    3.  
    4. // Reader states
    5. #define COMPORT_DATAREADY           0x01
    6. #define COMPORT_OVERFLOW_READERR    0x02
    7. #define COMPORT_PARITY_READERR      0x04
    8. #define COMPORT_SYNCH_READERR       0x08
    9. #define COMPORT_READER_ERROR  \
    10.             (COMPORT_OVERFLOW_READERR | COMPORT_PARITY_READERR | COMPORT_SYNCH_READERR)
    11. #define COMPORT_READER  (COMPORT_DATAREADY | COMPORT_READER_ERROR)
    12.  
    13. // Writer states
    14. #define COMPORT_READY_TO_WRITE      0x20
    15. #define COMPORT_WRITE_COMPLETED     0x40
    16. #define COMPORT_WRITER (COMPORT_READY_TO_WRITE | COMPORT_WRITE_COMPLETED)
    17.  
    18.  
    19. #define READ_COM(N,OFS) KiInPort( ComPorts[N] + (OFS) )
    20. #define WRITE_COM(N,OFS,V) KiOutPort( ComPorts[N] + (OFS), V )
    21.  
    22. #define GET_COMPORT_STATE(N) READ_COM( N, 5 )
    23.  
    24. #define COMPORT_BASEFREQ 1843200
    Ну и как вызывать думаю ясно. InitializeComPort(0, 117500) например
     
  3. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    Great Спасибо за пример. Ты не вкурсе где можно скачать документацию по системе команд других устройств? (Например контроллеру USB порта, команды на звуковую плату)
     
  4. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Google -> <название устройства> specification
    Полную доку по послед. порту, на русском языке я выкладывал на этом форуме, либо на коденете. Поиск по форуму рулит.