* DMA Driver\r
*/\r
#include <acess.h>\r
+#include <modules.h>\r
\r
#define DMA_SIZE (0x2400)\r
#define DMA_ADDRESS(c) ((c)*DMA_SIZE+0x500) //Save Space for IDT and BDA\r
#define HIB(x) (((x)>>8)&0xFF)\r
#define HIW(x) (((x)>>16)&0xFFFF)\r
\r
-typedef struct {\r
- int mode;\r
+// === TYPES ===\r
+typedef struct\r
+{\r
+ int mode;\r
char *address;\r
} t_dmaChannel;\r
\r
+// === PROTOTYPES ===\r
+ int DMA_Install(char **Arguments);\r
+void DMA_SetChannel(int Channel, int length, int read);\r
+ int DMA_ReadData(int channel, int count, void *buffer);\r
+\r
+// === CONSTANTS ===\r
const Uint8 cMASKPORT [8] = { 0x0A, 0x0A, 0x0A, 0x0A, 0xD4, 0xD4, 0xD4, 0xD4 };\r
const Uint8 cMODEPORT [8] = { 0x0B, 0x0B, 0x0B, 0x0B, 0xD6, 0xD6, 0xD6, 0xD6 };\r
const Uint8 cCLEARPORT[8] = { 0x0C, 0x0C, 0x0C, 0x0C, 0xD8, 0xD8, 0xD8, 0xD8 };\r
const Uint8 cADDRPORT [8] = { 0x00, 0x02, 0x04, 0x06, 0xC0, 0xC4, 0xC8, 0xCC };\r
const Uint8 cCOUNTPORT[8] = { 0x01, 0x03, 0x05, 0x07, 0xC2, 0xC6, 0xCA, 0xCE };\r
\r
+// === GLOBALS ===\r
+MODULE_DEFINE(0, 0x0100, ISADMA, DMA_Install, NULL, NULL);\r
char *dma_addresses[8];\r
t_dmaChannel dma_channels[8];\r
\r
+// === CODE ===\r
/**\r
- * \fn void DMA_Install()\r
* \brief Initialise DMA channels\r
+ * \param Arguments Arguments passed at boot time\r
*/\r
-void DMA_Install()\r
+int DMA_Install(char **Arguments)\r
{\r
Uint i;\r
for(i=8;i--;)\r
dma_addresses[i] = (char*)DMA_ADDRESS(i);\r
dma_addresses[i] += KERNEL_BASE;\r
}\r
+ return MODULE_ERR_OK;\r
}\r
\r
/**\r
memcpy(buffer, dma_addresses[channel], count);\r
return 0;\r
}\r
+\r
+/**\r
+ * \fn void DMA_WriteData(int channel, int count, void *buffer)\r
+ * \brief Write data to a DMA buffer\r
+ */\r
+int DMA_WriteData(int channel, int count, void *buffer)\r
+{\r
+ if(channel < 0 || channel > 7)\r
+ return -1;\r
+ if(count < 0 || count > DMA_SIZE)\r
+ return -2;\r
+ \r
+ memcpy(dma_addresses[channel], buffer, count);\r
+ \r
+ return 0;\r
+}\r