Bugfixes upon chaning GCC versions
[tpg/acess2.git] / Kernel / drv / dma.c
1 /*\r
2  * AcessOS 1.0\r
3  * DMA Driver\r
4  */\r
5 #include <common.h>\r
6 \r
7 #define DMA_SIZE        (0x2400)\r
8 #define DMA_ADDRESS(c)  ((c)*DMA_SIZE+0x500)    //Save Space for IDT and BDA\r
9 \r
10 #define LOWB(x) ((x)&0xFF)\r
11 #define HIB(x)  (((x)>>8)&0xFF)\r
12 #define HIW(x)  (((x)>>16)&0xFFFF)\r
13 \r
14 typedef struct {\r
15         int     mode;\r
16         char    *address;\r
17 } t_dmaChannel;\r
18 \r
19 const Uint8 cMASKPORT [8] = { 0x0A, 0x0A, 0x0A, 0x0A, 0xD4, 0xD4, 0xD4, 0xD4 };\r
20 const Uint8 cMODEPORT [8] = { 0x0B, 0x0B, 0x0B, 0x0B, 0xD6, 0xD6, 0xD6, 0xD6 };\r
21 const Uint8 cCLEARPORT[8] = { 0x0C, 0x0C, 0x0C, 0x0C, 0xD8, 0xD8, 0xD8, 0xD8 };\r
22 const Uint8 cPAGEPORT [8] = { 0x87, 0x83, 0x81, 0x82, 0x8F, 0x8B, 0x89, 0x8A };\r
23 const Uint8 cADDRPORT [8] = { 0x00, 0x02, 0x04, 0x06, 0xC0, 0xC4, 0xC8, 0xCC };\r
24 const Uint8 cCOUNTPORT[8] = { 0x01, 0x03, 0x05, 0x07, 0xC2, 0xC6, 0xCA, 0xCE };\r
25 \r
26 char    *dma_addresses[8];\r
27 t_dmaChannel    dma_channels[8];\r
28 \r
29 /**\r
30  * \fn void DMA_Install()\r
31  * \brief Initialise DMA channels\r
32  */\r
33 void DMA_Install()\r
34 {\r
35         Uint    i;\r
36         for(i=8;i--;)\r
37         {\r
38                 outb( cMASKPORT[i], 0x04 | (i & 0x3) ); // mask channel\r
39                 outb( cCLEARPORT[i], 0x00 );\r
40                 outb( cMODEPORT[i], 0x48 | (i & 0x3) ); //Read Flag\r
41                 outb( 0xd8, 0xff);      //Reset Flip-Flop\r
42                 outb( cADDRPORT[i], LOWB(DMA_ADDRESS(i)) );     // send address\r
43                 outb( cADDRPORT[i], HIB(DMA_ADDRESS(i)) );      // send address\r
44                 outb( 0xd8, 0xff);      //Reset Flip-Flop\r
45                 outb( cCOUNTPORT[i], LOWB(DMA_SIZE) );      // send size\r
46                 outb( cCOUNTPORT[i], HIB(DMA_SIZE) );       // send size\r
47                 outb( cPAGEPORT[i], LOWB(HIW(DMA_ADDRESS(i))) );        // send page\r
48                 outb( cMASKPORT[i], i & 0x3 );              // unmask channel\r
49                 \r
50                 dma_channels[i].mode = 0;\r
51                 dma_addresses[i] = (char*)DMA_ADDRESS(i);\r
52                 dma_addresses[i] += KERNEL_BASE;\r
53         }\r
54 }\r
55 \r
56 /**\r
57  * \fn void DMA_SetChannel(int Channel, int length, int read)\r
58  * \brief Set DMA Channel Length and RW\r
59  */\r
60 void DMA_SetChannel(int Channel, int length, int read)\r
61 {\r
62         Uint    chan = Channel & 7;\r
63         read = !!read;\r
64         if(length > DMA_SIZE)   length = DMA_SIZE;\r
65         length --;      //Adjust for DMA\r
66         //__asm__ __volatile__ ("cli");\r
67         outb( cMASKPORT[chan], 0x04 | (chan & 0x3) );           // mask channel\r
68         outb( cCLEARPORT[chan], 0x00 );\r
69         outb( cMODEPORT[chan], (0x44 + (!read)*4) | (chan & 0x3) );\r
70         outb( cADDRPORT[chan], LOWB(DMA_ADDRESS(chan)) );               // send address\r
71         outb( cADDRPORT[chan], HIB(DMA_ADDRESS(chan)) );                // send address\r
72         outb( cPAGEPORT[chan], HIW(DMA_ADDRESS(chan)) );                // send page\r
73         outb( cCOUNTPORT[chan], LOWB(length) );      // send size\r
74         outb( cCOUNTPORT[chan], HIB(length) );       // send size\r
75         outb( cMASKPORT[chan], chan & 0x3 );              // unmask channel\r
76         dma_addresses[chan] = (char*)DMA_ADDRESS(chan);\r
77         dma_addresses[chan] += KERNEL_BASE;\r
78         //__asm__ __volatile__ ("sti");\r
79 }\r
80 \r
81 /**\r
82  * \fn void DMA_ReadData(int channel, int count, void *buffer)\r
83  * \brief Read data from a DMA buffer\r
84  */\r
85 int DMA_ReadData(int channel, int count, void *buffer)\r
86 {\r
87         if(channel < 0 || channel > 7)\r
88                 return -1;\r
89         if(count < 0 || count > DMA_SIZE)\r
90                 return -2;\r
91         //LogF("memcpy(*0x%x, dma_channels[channel].address, count)\n", buffer\r
92         memcpy(buffer, dma_addresses[channel], count);\r
93         return 0;\r
94 }\r

UCC git Repository :: git.ucc.asn.au