Từ 1 tới 6 trên tổng số 6 kết quả

Đề tài: Lập trình Driver| Một số code access device viết bằng C

  1. #1
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Red face Lập trình Driver| Một số code access device viết bằng C

    Dưới đây là 1 số code mình sưu tầm được
    Các code này ví dụ về cách tương tác với device.

    Code đều run tốt với Borland Compiler v2.0+
    Hi vọng các bạn có thêm kiến thức qua những bài này.
    None!

  2. #2
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Mặc định 1. Flashlite-V25

    Chương trình đọc và in ra state của Port 2 trên Flashlite-V25

    C Code:
    1. #include <stdio.h>
    2.  
    3. /*define a macro to create a far pointer out of a segment
    4.     and offset*/
    5. /*macro could cast result as (unsigned char far *) but the
    6.    (void far*)*/
    7. /*is more generic and allows the result to be used with
    8.     variables other*/
    9. /*than unsigned characters */
    10.  
    11. #define MK_FP(seg,off) ((void far *) \
    12.               (((unsigned long)(seg) << 16) | (unsigned)(off)))
    13.  
    14. #define PORT_SEG        0xF000 /* segment for port registers */
    15. #define PORT_2          0xFF10 /* offset of Port 2 */
    16. #define PORT_MODE_2     0xFF11 /* offset of port 2 mode reg */
    17. #define PORT_MODE_CTL_2 0xFF12 /* offset of port 2 mode ctl reg */
    18.  
    19. main()
    20. {
    21.   unsigned char far *port2, *mode2, *ctl2;    
    22.   port2=(unsigned char far*)MK_FP(PORT_SEG,PORT_2);  
    23.     /* port 2 location */
    24.   mode2=(unsigned char far*)MK_FP(PORT_SEG,PORT_MODE_2);  
    25.     /* port 2 mode location */
    26.   ctl2=(unsigned char far*)MK_FP(PORT_SEG,PORT_MODE_CTL_2);
    27.     /* port 2 mode ctl location */
    28.  
    29.   *ctl2=0;        /* mode control -> i/o */
    30.   *mode2=0xFF;    /* mode -> all bits input */
    31.   while ( 1 )     /* do it forever */            
    32.     printf("PORT2: %X\n",(int)*port2);
    33.        /*read and print port 2 value*/
    34.  
    35. return 0;
    36. }
    None!

  3. #3
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Mặc định 2. Flashlite 386Ex Ports and Port I/O

    Chương trình đọc và in ra state của Port A trên Flashlite 386Ex

    C Code:
    1. #include <stdio.h>
    2. #include <dos.h>
    3.  
    4. #define PORT_A          0x60
    5.    /* address of Port A */
    6. #define PORT_DIR        0x63
    7.    /* address of port direction register */
    8. #define PORT_A_DIR_MASK 0x10
    9.    /* dir bit is bit 4 (00010000) = 0x10 */
    10.  
    11. main()
    12. {
    13.  unsigned char portA;
    14.  
    15.  portA = inportb(PORT_DIR);
    16.    /* get current value of direction reg */
    17.  portA |= PORT_A_DIR_MASK;  
    18.    /* set direction bit for input /*
    19.  outportb(PORT_DIR,portA);  
    20.    /* write value to direction reg */
    21.    
    22.  while ( 1 )     /* do it forever */              
    23.    printf("PORT A: %X\n",(int)inportb(PORT_A));
    24.      /*read and print port A value*/
    25.  
    26. return 0;
    27. }
    None!

  4. #4
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Mặc định 3. LCD Driver and Streams

    Chương trình hiển thị ngày giờ giữa màn hình của 4x20 LCD và dừng khi có một key input

    C Code:
    1. #include <stdio.h>
    2. #include <time.h>
    3. #include <conio.h>
    4.  
    5. #define LCD_CMD 160         /* command for LCD driver */
    6. #define LCD_CMD1 40         /* i/o format setup command */
    7. #define LCD_CMD2 6          /* cursor setup command */
    8. #define CLR_HOME 1          /* clear and home command */
    9.  
    10. void main()
    11. {
    12.   time_t sec_now, sec_prev=0;  /* time in seconds, 2 copies */  
    13.   struct  tm   *tm_now;        /* time/date structure */
    14.   FILE         *lcd;           /* stream for LCD data */
    15.   unsigned char  lcd_pos=0xC6; /* demo position w/ variable */
    16.  
    17. /* **when using Turbo C, use the following line: */
    18. /*   lcd=fopen("LPT1","w");    /* open LPT1 for output */
    19.  
    20. /* **when using Borland 4.52, use the following line: */
    21. lcd=stdprn;
    22. setbuf(lcd, NULL);            /* disable buffering */
    23.                               /* send init commands to LCD */
    24. fprintf(lcd,"%c%c",LCD_CMD,LCD_CMD1);
    25.               /* with defined commands */
    26.                    
    27. fprintf(lcd,"%c%c",LCD_CMD,40);  /* with decimal commands */
    28. fprintf(lcd,"%c%c",LCD_CMD,0xC); /* with hex commands */
    29. fprintf(lcd,"%c%c",LCD_CMD,LCD_CMD2);
    30. fprintf(lcd,"%c%c",LCD_CMD,CLR_HOME);
    31.  
    32. while ( !kbhit() ) {   /* repeat until key hit */
    33.  time(&sec_now);       /* get the time (sec from whenever) */
    34.   if (sec_now != sec_prev) {   /* see if new time */
    35.    sec_prev=sec_now;
    36.    tm_now=localtime(&sec_now);
    37.               /* convert seconds into something useful */
    38.        
    39.    fprintf(lcd,"%c%c",LCD_CMD,lcd_pos);
    40.               /* set position to output on LCD */
    41.  
    42.    fprintf(lcd,"%02d-%02d-%02d",       /* output date */      
    43.    tm_now->tm_mon,tm_now->tm_mday,tm_now->tm_year);
    44.    fprintf(lcd,"%c%c",LCD_CMD,0x9A);   /* reposition cursor */
    45.    fprintf(lcd,"%02d:%02d:%02d",       /* output time */
    46.    tm_now->tm_hour,tm_now->tm_min,tm_now->tm_sec);
    47.   }
    48. }
    49.  
    50. fclose(lcd);           /* close the stream */
    51. return 0;              /* done */
    52. }
    None!

  5. #5
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Mặc định 4. Using DOS and BIOS Interrupts

    Chương trình sử dụng TSR (Terminate and Stay Resident) để trap tại 0x30

    C Code:
    1. /* A/D interface example                                 */
    2. /* uses ad_int.com software interrupt 0x30               */
    3. /*       ah=1, ad interface functions                    */
    4. /*       al=0, get version, bl=ver, cx=55AA              */
    5. /*       al=1, set channel w/ bx=channel (0..7)          */
    6. /*       al=2, set range, w/ bx: 0=(0-5V), 1=(+/- 5V)    */
    7. /*                               2=(0-10V), 3=(+/- 10V)  */
    8. /*       al=3, get result, value returned in bx          */
    9.  
    10. /* displays data until key pressed */
    11.  
    12. #include <stdio.h>
    13. #include <conio.h>
    14. #include <dos.h>
    15.  
    16. #define IO_INT 0x30
    17. #define GAIN 0.00122 /* 5.00 Vref / 4096 counts -> 1.22 mV/count */
    18.  
    19. main()
    20. {
    21. int i;
    22. union REGS regs;           /* x86 registers */
    23.  
    24.  regs.h.ah = 1;            /* id A/D the driver */
    25.  regs.h.al = 0;
    26.  int86 (IO_INT,&regs, &regs);    /* do the software int */
    27.  
    28.  if (regs.x.cx != 0x55AA) {
    29.    printf("\nDevice interrupt not found\n");
    30.         /*wont work w/o the TSR*/
    31.    exit(-1);                                
    32.         /* that's all, folks */
    33.       }
    34.      else
    35.        printf("Driver Version: %X\n",(int)regs.h.bl );
    36.      while (!kbhit() ) {    /* repeat until key pressed */
    37.        for (i=0; i<4; i++) {    /* loop for 4 channels */
    38.          regs.h.ah=1;
    39.          regs.h.al=1;           /* set the channel */
    40.          regs.x.bx=i;
    41.          int86 (IO_INT,&regs, &regs); /* do the software int */
    42.          regs.h.ah=1;
    43.          regs.h.al=2;           /* set the range  (0-5V) */
    44.          regs.x.bx=0;
    45.          int86 (IO_INT,&regs, &regs); /* do the software int */
    46.          regs.h.ah=1;
    47.          regs.h.al=3;           /* get the data */
    48.          int86 (IO_INT,&regs, &regs); /* do the software int */
    49.          printf("%1.3f (%4X)    ",
    50.             i+1, regs.x.bx * GAIN, regs.x.bx );
    51.       }
    52.       printf("\n");             /* start a new line */
    53.   }
    54. return 0;
    55. }
    None!

  6. #6
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Mặc định 5. Interrupt Service Routines for IRQs on the 386Ex

    Chương trình đếm số ngắt trên IRQ3, IRQ4 và IRQ9.

    C Code:
    1. // Interrupt counter example program
    2. // JK microsystems
    3. // EW  June 1998
    4.  
    5. #include <stdio.h>
    6. #include <dos.h>
    7. #include <conio.h>
    8. #include <stdlib.h>
    9.  
    10. #define FALSE 0
    11. #define TRUE (!FALSE)
    12.  
    13. #define P3CFG 0xF824       // port 3 config register (386Ex)
    14. #define INTCFG 0xF832      // interrupt config register (386Ex)
    15. #define MCR0 0x3FC         // modem control reg, uart 0
    16. #define MCR1 0x2FC         // modem control reg, uart 1
    17.  
    18. long count3=0, count4=0, count9=0;
    19. char    newcount=FALSE;
    20.  
    21. void interrupt (*oldirq3)(...);
    22. void interrupt (*oldirq4)(...);
    23. void interrupt (*oldirq9)(...);
    24.  
    25. // Interrupt Service Routine, IRQ3
    26. void interrupt countint3(...) {
    27.     disable();              // disable ints
    28.     count3++;               // increment count
    29.     newcount=TRUE;          // flag to indicate new count ready
    30.     outportb(0x20,0x20);    // reset PIC
    31.     enable();               // ints ok now
    32. }
    33.  
    34. // Interrupt Service Routine, IRQ4
    35. void interrupt countint4(...) {
    36.     disable();              // disable ints
    37.      count4++;              // increment count
    38.     newcount=TRUE;          // flag to indicate new count ready
    39.     outportb(0x20,0x20);    // reset PIC
    40.     enable();               // ints ok now
    41. }
    42.  
    43. // Interrupt Service Routine, IRQ9
    44. void interrupt countint9(...) {
    45.     disable();              // disable ints
    46.     count9++;               // increment count
    47.     newcount=TRUE;          // flag to indicate new count ready
    48.     outportb(0xA0,0x20);    // send EOI to PIC2
    49.     outportb(0x20,0x20);    // send EOI to PIC1
    50.     enable();               // ints ok now
    51. }
    52. main ( void ) {
    53.  
    54. int PIC1mask=0,PIC2mask=0;  // define vars and set default values
    55. int  tmp;
    56.  
    57. printf("\nInterrupt Counter\n\n");
    58.                        // generate IRQ mask for PIC
    59. PIC1mask = 0x1C;       // bits set for IRQ3, IRQ4 and IRQ2(cascade)
    60. PIC2mask = 0x02;       // bit set for IRQ9
    61. disable();             // disable interrupts
    62.                        // save old vectors and set new ones
    63.  
    64. outportb( INTCFG, inportb(INTCFG) | 0x60 );  
    65.                        // port pin, not internal UARTs
    66. outportb( P3CFG, inportb(P3CFG) | 0x03 );    
    67.                        // connect IRQ 3 and 4 to
    68. outportb( MCR0, inportb(MCR0) & ~0x08 );    
    69.                        // more 386Ex stuff to get
    70. outportb( MCR1, inportb(MCR1) & ~0x08 );    
    71.                        // signals connected to pins
    72.  
    73. oldirq3=getvect(0xB);           // IRQ 3
    74. setvect(0xB,countint3);
    75.  
    76. oldirq4=getvect(0xC);           // IRQ 4
    77. setvect(0xC,countint4);
    78.  
    79. oldirq9=getvect(0x71);          // IRQ 9
    80. setvect(0x71,countint9);
    81.  
    82. printf("Old vectors: %Fp, %Fp, %Fp\n", oldirq3,oldirq4,oldirq9 );
    83. printf("New vectors: %Fp, %Fp, %Fp\n",
    84. getvect(0xB), getvect(0xC), getvect(0x71) );
    85. printf("ISRs: %Fp, %Fp, %Fp\n", countint3, countint4, countint9 );
    86.  
    87. tmp=inportb(0x21)&~PIC1mask;
    88. outportb(0x21,tmp);             // clear bits for IRQ2,3,4 in PIC1
    89.  
    90. tmp=inportb(0xA1)&~PIC2mask;
    91. outportb(0xA1,tmp);             // clear bit for IRQ9 in PIC2
    92.  
    93. enable();                       // re-enable interrupts
    94.  
    95. // end interrupt enable
    96.  
    97. printf("\nPress any key to exit.\n\n");
    98.  while( !kbhit() ) {
    99.     if ( newcount ) {
    100.        printf( "IRQ3=%ld  IRQ4=%ld  IRQ9=%ld\r",
    101.                                 count3, count4, count9 );
    102.        newcount=FALSE;
    103.        }
    104.  }
    105.  getch();                        // eat keypress
    106.  
    107. // turn off our interrupts and reset vectors
    108.       disable();
    109. // restore old vectors
    110.       setvect(0x0B,oldirq3);
    111.       setvect(0x0C,oldirq4);
    112.       setvect(0x71,oldirq9);
    113.  
    114.       outportb(0xA1,inportb(0xA1) | PIC2mask );
    115.       outportb(0x21,inportb(0x21) | PIC1mask );
    116.  
    117.       printf("\nInterrupt vectors reset to: %Fp %Fp, %Fp\n",
    118.          getvect(0xB), getvect(0xC), getvect(0x71) );
    119.  
    120.       enable();
    121.  
    122. return 0;
    123. }
    None!

Các đề tài tương tự

  1. Cách sử dụng RNDIS driver, giao tiếp qua cổng USB giữa PC và Smart Device?
    Gửi bởi markpq trong diễn đàn Lập trình Windows Mobile bằng C#
    Trả lời: 1
    Bài viết cuối: 07-01-2013, 03:57 PM
  2. Tool để lập trình linux device driver?
    Gửi bởi bigbang1b0 trong diễn đàn Công cụ, Tài liệu lập trình trên Linux
    Trả lời: 1
    Bài viết cuối: 13-10-2012, 10:48 PM
  3. Trả lời: 1
    Bài viết cuối: 06-10-2011, 08:11 PM
  4. Xin code về việc viết driver chuột cho linux
    Gửi bởi 5primes trong diễn đàn Thắc mắc lập trình C/C++ trên Linux
    Trả lời: 3
    Bài viết cuối: 01-04-2008, 06:49 AM
  5. Memory Device Driver trong lập trình C trên Linux
    Gửi bởi Xcross87 trong diễn đàn Thắc mắc chung
    Trả lời: 3
    Bài viết cuối: 26-12-2007, 12:42 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn