Main Page   Data Structures   File List   Data Fields   Globals   Related Pages  

clib/HWAPI.C

Go to the documentation of this file.
00001 /****************************************************************************
00002 *
00003 * (C) 2000 by BECK IPC GmbH
00004 *
00005 *  BECK IPC GmbH
00006 *  Garbenheimerstr. 38
00007 *  D-35578 Wetzlar
00008 *
00009 *  Phone : (49)-6441-905-240
00010 *  Fax   : (49)-6441-905-245
00011 *
00012 * IPC@CHIP SC12 API 
00013 * ---------------------------------------------------------------------------
00014 * $Header: HWAPI.C, 6, 23.01.2002 15:28:01, Christoph Stoidner$
00015 * ---------------------------------------------------------------------------
00016 * $Log: 
00017 *  6    IPC@CHIP  1.5         23.01.2002 15:28:01  Christoph Stoidner modified DMA
00018 *       Functions GetDmaInfo and StartDma
00019 *  5    IPC@CHIP  1.4         16.01.2002 14:18:50  Christoph Stoidner removed
00020 *       duclicate declared function
00021 *  4    IPC@CHIP  1.3         16.01.2002 11:04:28  Christoph Stoidner add new
00022 *       functions and some comments
00023 *  3    IPC@CHIP  1.2         19.06.2001 13:35:06  Markus Bartat   start: Added
00024 *       comments to the c functions
00025 *  2    IPC@CHIP  1.1         31.05.2001 16:18:23  Christoph Stoidner 
00026 *  1    IPC@CHIP  1.0         14.02.2001 16:09:18  Christoph Stoidner 
00027 * $
00028 *****************************************************************************/
00029 
00030 /***************************************************************************/
00031 // Includes
00032 /***************************************************************************/
00033 #include <dos.h>
00034 #include "clib/hwapi.h"
00035 
00036 /***************************************************************************/
00037 // Defines
00038 /***************************************************************************/
00039 
00040 /***************************************************************************/
00041 // Functions
00042 /***************************************************************************/
00043 
00044 /***************************************************************************/
00045 // Enable bus
00046 /***************************************************************************/
00047 void pfe_enable_bus (unsigned mask, unsigned char ale)
00048 {
00049   // Enable bus mask
00050   asm mov ah, PFE_ENABLE_DATA_BUS
00051   asm mov al, ale
00052   asm mov dx, mask
00053   asm int PFE_INT
00054 }
00055 
00056 /***************************************************************************/
00057 // Enable non multplexed address bus
00058 /***************************************************************************/
00059 void pfe_enable_adr (unsigned char adr)
00060 {
00061   //enable non multiplexed io-bus
00062   asm mov ah, PFE_ENABLE_NON_MULTI_ADDR_BUS;
00063   asm mov dx, 1
00064   asm mov cl, adr
00065   asm shl dx, cl    ;//dx = 1<<adr
00066   asm int PFE_INT
00067 }
00068 
00069 /***************************************************************************/
00070 // Enable programmable chip selects
00071 /***************************************************************************/
00072 void pfe_enable_pcs (unsigned char pcs)
00073 {
00074   // Enable programmable chip selects
00075   asm mov ah, PFE_ENABLE_PCS;
00076   asm mov dx, 1
00077   asm mov cl, pcs
00078   asm shl dx, cl    ;//dx = 1<<pcs
00079   asm int PFE_INT
00080 }
00081 
00082 /***************************************************************************/
00083 // Enable interrupts
00084 /***************************************************************************/
00085 void pfe_enable_int (unsigned char irq)
00086 {
00087   // Enable interrupts
00088   asm mov ah, PFE_ENABLE_EXTERNAL_IRQ;
00089   asm mov dx, 1
00090   asm mov cl, irq
00091   asm shl dx, cl    ;//dx= 1<<irq
00092   asm int PFE_INT
00093 }
00094 
00095 /***************************************************************************/
00096 // Enable timer
00097 /***************************************************************************/
00098 void pfe_enable_timer (unsigned mode)
00099 {
00100   // Enable timer
00101   asm mov ah, PFE_ENABLE_EXTERNAL_TIMER;
00102   asm mov dx, mode
00103   asm int PFE_INT
00104 }
00105 
00106 /***************************************************************************/
00107 // Set Edge Level Interrupt Mode
00108 /***************************************************************************/
00109 void pfe_set_edge_level_intr_mode(unsigned char mode, unsigned mask)
00110 {
00111   // set edge level interrupt mode
00112   asm mov ah, PFE_SET_EDGE_LEVEL_INTR_MODE;
00113   asm mov al, mode
00114   asm mov dx, mask
00115   asm int PFE_INT
00116 }
00117 
00118 
00119 /***************************************************************************/
00120 // Enable Pwd Mode
00121 /***************************************************************************/
00122 void pfe_enable_pwd(void)
00123 {
00124   // enable pwd
00125   asm mov ah, PFE_ENABLE_PWD;
00126   asm int PFE_INT
00127 }
00128 
00129 /***************************************************************************/
00130 // Enable External Dma
00131 /***************************************************************************/
00132 int pfe_enable_external_dma( unsigned char channel)
00133 {
00134   int retval;
00135 
00136   // enable pwd
00137   asm mov ah, PFE_ENABLE_EXTERNAL_DMA;
00138   asm mov al, channel
00139   asm int PFE_INT
00140   asm mov retval, ax
00141   return retval;
00142 }
00143 
00144 
00145 /***************************************************************************/
00146 // Enable INT0/INTA cascade mode
00147 /***************************************************************************/
00148 void pfe_enable_int_cascade_mode(void)
00149 {
00150   // enable int0/inta cascade mode
00151   asm mov ah, PFE_ENABLE_INT_CASCADE_MODE;
00152   asm int PFE_INT
00153 }
00154 
00155 
00156 
00157 /***************************************************************************/
00158 // Enable programmable pio pins
00159 /***************************************************************************/
00160 void pfe_enable_pio (unsigned pio, unsigned char mode)
00161 {
00162   pio = 1 << pio;
00163 
00164   // Enable programmable pios
00165   asm mov ah, PFE_ENABLE_PIO;
00166   asm mov al, mode
00167   asm mov dx, pio
00168   asm int PFE_INT
00169 }
00170 
00171 /***************************************************************************/
00172 // Get programmable pio pins state
00173 /***************************************************************************/
00174 void pfe_get_pio_state (unsigned *wPio, unsigned *wInp, unsigned *wOut)
00175 {
00176   unsigned p, i, o;
00177 
00178   asm mov ah, PFE_ENABLE_PIO;
00179   asm mov al, 0
00180   asm int PFE_INT
00181   asm mov p, ax
00182   asm mov i, dx
00183   asm mov o, cx
00184 
00185   *wPio = p;
00186   *wInp = i;
00187   *wOut = o;
00188 }
00189 
00190 /***************************************************************************/
00191 // Get programmable pio pins output state
00192 /***************************************************************************/
00193 void hal_get_pio_output_state (unsigned *pins, unsigned wOut)
00194 {
00195   unsigned p;
00196 
00197   // Read pio outputs init state
00198   asm mov ah, PFE_ENABLE_PIO;
00199   asm mov bx, 0xFFFF
00200   asm xor cx, cx        ;// cx = 0
00201   asm int HAL_INT
00202   asm and ax, wOut
00203   asm mov p, ax
00204 
00205   *pins = p; //*pins = ax & wOut;
00206 }
00207 
00208 /***************************************************************************/
00209 // Read databus
00210 /***************************************************************************/
00211 unsigned char hal_read_bus (unsigned adr, unsigned wAND, unsigned wXOR)
00212 {
00213   unsigned char retval;
00214 
00215   // read data bus
00216   asm mov ah, HAL_READ_DATA_BUS;
00217   asm mov di, adr
00218   asm mov bx, wAND
00219   asm mov cx, wXOR
00220   asm int HAL_INT
00221   asm mov retval, al
00222 
00223   return retval;
00224 }
00225 
00226 /***************************************************************************/
00227 // Write databus
00228 /***************************************************************************/
00229 void hal_write_bus (unsigned adr, unsigned char value, unsigned wAND, unsigned wXOR)
00230 {
00231   // write data bus
00232   asm mov ah, HAL_WRITE_DATA_BUS;
00233   asm mov di, adr
00234   asm mov dh, 0
00235   asm mov dl, value
00236   asm mov bx, wAND
00237   asm mov cx, wXOR
00238   asm int HAL_INT
00239 }
00240 
00241 /***************************************************************************/
00242 // Read block from databus
00243 /***************************************************************************/
00244 void hal_readblock_bus (unsigned adr0, unsigned adr1, unsigned char *buf, unsigned cnt)
00245 {
00246   // read data bus
00247   _ES = FP_SEG(buf);
00248   _BX = FP_OFF(buf);
00249   asm mov ah, HAL_BLOCK_READ_DATA_BUS;
00250   asm mov di, adr0
00251   asm mov si, adr1
00252   asm mov cx, cnt
00253   asm int HAL_INT
00254 }
00255 
00256 /***************************************************************************/
00257 // Write block to databus
00258 /***************************************************************************/
00259 void hal_writeblock_bus (unsigned adr0, unsigned adr1, unsigned char *buf, unsigned cnt)
00260 {
00261   // write data bus
00262   _ES = FP_SEG(buf);
00263   _BX = FP_OFF(buf);
00264   asm mov ah, HAL_BLOCK_WRITE_DATA_BUS;
00265   asm mov di, adr0
00266   asm mov si, adr1
00267   asm mov cx, cnt
00268   asm int HAL_INT
00269 }
00270 
00271 /***************************************************************************/
00272 // Read pios
00273 /***************************************************************************/
00274 unsigned hal_read_pios (unsigned wAND, unsigned wXOR)
00275 {
00276   unsigned retval;
00277 
00278   // read pios
00279   asm mov ah, HAL_READ_PIO
00280   asm mov bx, wAND
00281   asm mov cx, wXOR
00282   asm int HAL_INT
00283   asm mov retval, ax
00284 
00285   return retval;
00286 }
00287 
00288 /***************************************************************************/
00289 // Write pios
00290 /***************************************************************************/
00291 void hal_write_pios (unsigned value, unsigned wAND, unsigned wXOR)
00292 {
00293   // write pios
00294   asm mov ah, HAL_WRITE_PIO
00295   asm mov dx, value
00296   asm mov bx, wAND
00297   asm mov cx, wXOR
00298   asm int HAL_INT
00299 }
00300 
00301 /***************************************************************************/
00302 // Read single pio
00303 /***************************************************************************/
00304 unsigned char hal_read_pio (unsigned char pio)
00305 {
00306   unsigned retval;
00307 
00308   asm mov ah, HAL_READ_SPECIFIC_PIO
00309   asm mov al, pio
00310   asm int HAL_INT
00311   asm mov retval, ax
00312 
00313   if (retval) return 1;
00314   else        return 0;
00315 }
00316 
00317 /***************************************************************************/
00318 // Write single pio
00319 /***************************************************************************/
00320 void hal_write_pio (unsigned char pio, unsigned value)
00321 {
00322   asm mov ah, HAL_WRITE_SPECIFIC_PIO
00323   asm mov al, pio
00324   asm mov dx, value
00325   asm int HAL_INT
00326 }
00327 
00328 /***************************************************************************/
00329 // Install ISR
00330 /***************************************************************************/
00331 InterruptHandler hal_install_isr (unsigned irq, unsigned count, InterruptHandler handler)
00332 {
00333   InterruptHandler oldhandler;
00334   unsigned rbx, res;
00335 
00336   // install isr
00337   asm les bx, handler  ;// es = FP_SEG(handler);  bx = FP_OFF(handler);
00338   asm mov ah, HAL_INSTALL_ISR;
00339   asm mov dx, irq
00340   asm mov cx, count
00341   asm int HAL_INT
00342   asm mov rbx, bx
00343   asm mov res, es
00344 
00345   oldhandler = (InterruptHandler) MK_FP(res,rbx);
00346 
00347   return oldhandler;
00348 }
00349 
00350 /***************************************************************************/
00351 // Init timer
00352 /***************************************************************************/
00353 void hal_init_timer (unsigned char timer, unsigned mode, unsigned divider)
00354 {
00355   // install isr
00356   asm mov ah, HAL_INIT_TIMER;
00357   asm mov al, timer
00358   asm mov dx, mode
00359   asm mov cx, divider
00360   asm int HAL_INT
00361 }
00362 
00363 /***************************************************************************/
00364 // Start timer
00365 /***************************************************************************/
00366 void hal_start_timer (unsigned char timer)
00367 {
00368   // start timer
00369   asm mov ah, HAL_START_TIMER;
00370   asm mov al, timer
00371   asm int HAL_INT
00372 }
00373 
00374 /***************************************************************************/
00375 // Stop timer
00376 /***************************************************************************/
00377 void hal_stop_timer (unsigned char timer)
00378 {
00379   // stop timer
00380   asm mov ah, HAL_STOP_TIMER;
00381   asm mov al, timer
00382   asm int HAL_INT
00383 }
00384 
00385 /***************************************************************************/
00386 // Read timer count
00387 /***************************************************************************/
00388 unsigned hal_read_timer_count (unsigned char timer, unsigned far *maxcount)
00389 {
00390   unsigned retval, count;
00391 
00392   // read count
00393   asm mov ah, HAL_READ_TIMER_COUNT;
00394   asm mov al, timer
00395   asm int HAL_INT
00396   asm mov count, dx
00397   asm mov retval, ax
00398 
00399   *maxcount = count;
00400   return retval;
00401 }
00402 
00403 /***************************************************************************/
00404 // Write timer count
00405 /***************************************************************************/
00406 void hal_write_timer_count (unsigned char timer, unsigned counter)
00407 {
00408   // write count
00409   asm mov ah, HAL_WRITE_TIMER_COUNT;
00410   asm mov al, timer
00411   asm mov dx, counter
00412   asm int HAL_INT
00413 }
00414 
00415 /***************************************************************************/
00416 // Set watchdog mode
00417 /***************************************************************************/
00418 unsigned char hal_set_watchdog_mode (unsigned char mode)
00419 {
00420   unsigned char retval;
00421 
00422   // set watchdog mode
00423   asm mov ah, HAL_GET_SET_WATCHDOG_MODE;
00424   asm mov al, mode
00425   asm int HAL_INT
00426   asm mov retval, al
00427 
00428   return retval;
00429 }
00430 
00431 /***************************************************************************/
00432 // Refresh watchdog
00433 /***************************************************************************/
00434 void hal_refresh_watchdog (void)
00435 {
00436   // refresh watchdog
00437   asm mov ah, HAL_REFRESH_WATCHDOG;
00438   asm int HAL_INT
00439 }
00440 
00441 
00442 /***************************************************************************/
00443 // Get Frequencies
00444 /***************************************************************************/
00445 unsigned long hal_get_frequencies( unsigned char frq )
00446 {
00447   unsigned hword, lword;
00448 
00449   // get frequencies
00450   asm mov ah, HAL_GET_FREQUENCIES;
00451   asm mov al, frq
00452   asm int HAL_INT
00453 
00454   asm mov hword, dx
00455   asm mov lword, ax
00456 
00457   return ((unsigned long)hword<<16)+lword;
00458 }
00459 
00460 
00461 /***************************************************************************/
00462 // Set Duty Cycle Waveform
00463 /***************************************************************************/
00464 void hal_set_duty_cycle_waveform( unsigned char timer, int mode,
00465                                   unsigned clock_divider )
00466 {
00467   // ser dury cycle waveform
00468   asm mov ah, HAL_SET_DUTY_CYCLE_WAVEFORM;
00469   asm mov al, timer
00470   asm mov dx, mode
00471   asm mov cx, clock_divider
00472   asm int HAL_INT
00473 
00474   return;
00475 }
00476 
00477 /***************************************************************************/
00478 // Give End of Interrupt (EOI)
00479 /***************************************************************************/
00480 void hal_give_eoi( unsigned char intr_no )
00481 {
00482   // give EOI
00483   asm mov ah, HAL_GIVE_EOI;
00484   asm mov al, intr_no
00485   asm int HAL_INT
00486   return;
00487 }
00488 
00489 
00490 /***************************************************************************/
00491 // Start DMA
00492 /***************************************************************************/
00493 void hal_start_dma( unsigned char channel, Dma_Info *dmaInfo )
00494 {
00495   unsigned long src;
00496   unsigned long dest;
00497   struct SREGS segregs;
00498   union REGS regs;
00499 
00500   // read Source Address
00501   if ( dmaInfo->ctrl_reg&DMA_SRCMEM )
00502   {
00503     src  = FP_SEG(dmaInfo->src.mem);
00504     src *= 0x10;
00505     src += FP_OFF(dmaInfo->src.mem);
00506   }
00507   else src = dmaInfo->src.io;
00508 
00509   // read dest Address
00510   if ( dmaInfo->ctrl_reg&DMA_DESTMEM )
00511   {
00512      dest  = FP_SEG(dmaInfo->dest.mem);
00513      dest *= 0x10;
00514      dest += FP_OFF(dmaInfo->dest.mem);
00515   }
00516   else dest = dmaInfo->dest.io;
00517 
00518   // start DMA
00519   regs.h.ah = HAL_START_DMA;
00520   regs.h.al = channel;
00521   regs.x.cx = dmaInfo->count;
00522   regs.x.dx = dmaInfo->ctrl_reg;
00523   regs.x.bx = FP_SEG(&src);
00524   regs.x.si = FP_OFF(&src);
00525   segregs.es  = FP_SEG(&dest);
00526   regs.x.di = FP_OFF(&dest);
00527   int86x( HAL_INT, &regs, &regs, &segregs );
00528   return;
00529 }
00530 
00531 /***************************************************************************/
00532 // Stop DMA
00533 /***************************************************************************/
00534 int hal_stop_dma( unsigned char channel )
00535 {
00536   int retval;
00537 
00538   asm mov ah, HAL_STOP_DMA
00539   asm mov al, channel
00540   asm int HAL_INT
00541   asm mov retval, ax
00542   return retval;
00543 }
00544 
00545 
00546 /***************************************************************************/
00547 // Get DMA Info
00548 /***************************************************************************/
00549 int hal_get_dma_info( unsigned char channel, Dma_Info *dmaInfo )
00550 {
00551   unsigned long src;
00552   unsigned long dest;
00553   unsigned ioff, iseg;
00554   struct SREGS segregs;
00555   union REGS regs;
00556 
00557   // start DMA
00558   regs.h.ah = HAL_GET_DMA_INFO;
00559   regs.h.al = channel;
00560   regs.x.bx = FP_SEG(&src);
00561   regs.x.si = FP_OFF(&src);
00562   segregs.es  = FP_SEG(&dest);
00563   regs.x.di = FP_OFF(&dest);
00564   int86x( HAL_INT, &regs, &regs, &segregs );
00565 
00566   dmaInfo->ctrl_reg = regs.x.dx;
00567   dmaInfo->count    = regs.x.cx;
00568 
00569   // read dest Address
00570   if ( dmaInfo->ctrl_reg&DMA_SRCMEM )
00571   {
00572      iseg = (unsigned)(src/0x10);
00573      ioff = (unsigned)(src-((unsigned long)iseg*0x10));
00574      dmaInfo->src.mem  = MK_FP( iseg, ioff );
00575   }
00576   else dmaInfo->src.io = (unsigned)src;
00577 
00578   // read dest Address
00579   if ( dmaInfo->ctrl_reg&DMA_DESTMEM )
00580   {
00581      iseg = (unsigned)(src/0x10);
00582      ioff = (unsigned)(src-((unsigned long)iseg*0x10));
00583      dmaInfo->dest.mem  = MK_FP( iseg, ioff );
00584   }
00585   else dmaInfo->dest.io = (unsigned)dest;
00586 
00587   return regs.x.ax;
00588 }
00589 
00590 
00591 /***************************************************************************/
00592 // Init/Restore Non Volatile Data
00593 /***************************************************************************/
00594 int hal_init_restore_non_volatile_data( Remop *remop )
00595 {
00596    int retval;
00597 
00598    asm les bx, remop
00599    asm mov ah, HAL_INIT_REST_NON_VOLATILE_DATA
00600    asm int HAL_INT
00601    asm mov retval, ax
00602    return retval;
00603 }
00604 
00605 
00606 /***************************************************************************/
00607 // Save Non Volatile Data
00608 /***************************************************************************/
00609 void hal_save_non_volatile_data(void)
00610 {
00611    asm mov ah, HAL_SAVE_NON_VOLATILE_DATA
00612    asm int HAL_INT
00613 }
00614 
00615 
00616 /***************************************************************************/
00617 // Get Reboot Reason
00618 /***************************************************************************/
00619 int hal_get_reboot_reason(void)
00620 {
00621    int retval;
00622 
00623    asm mov ah, HAL_GET_REBOOT_REASON
00624    asm int HAL_INT
00625    asm mov retval, ax
00626    return retval;
00627 }
00628 
00629 
00630 
00631 
00632 
00633 
00634 

Generated on Sun Aug 4 21:47:27 2002 for k/os mp3v2 by doxygen1.2.16