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

Discussion in 'WASM.ELECTRONICS' started by Aids, Apr 3, 2008.

  1. Aids

    Aids New Member

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

    wasm_test wasm test user

    Blog Posts:
    0
    Joined:
    Nov 24, 2006
    Messages:
    5,582
    как и всеми остальными девайсами компа. ну еще используется аппаратное проецирование памяти.
    ВОобще, если честно, то гугл рулит.
    НО ладно, так и быть:
    Code (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. }
    Константы очевидны:

    Code (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

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

    Vov4ick Владимир

    Blog Posts:
    0
    Joined:
    Oct 8, 2006
    Messages:
    581
    Location:
    МО
    Google -> <название устройства> specification
    Полную доку по послед. порту, на русском языке я выкладывал на этом форуме, либо на коденете. Поиск по форуму рулит.