source: mainline/uspace/drv/audio/sb16/dma_controller.c@ dea75c04

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since dea75c04 was dea75c04, checked in by Jan Vesely <jano.vesely@…>, 14 years ago

sb16: Add register value interpretation.

  • Property mode set to 100644
File size: 5.3 KB
Line 
1/*
2 * Copyright (c) 2011 Jan Vesely
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28/** @addtogroup drvaudiosb16
29 * @{
30 */
31/** @file
32 * @brief DMA memory management
33 */
34#include <assert.h>
35#include <errno.h>
36
37#include "dma_controller.h"
38
39#define DMA_CONTROLLER_FIRST_BASE 0x0
40typedef struct dma_controller_regs_first {
41 uint8_t channel_start0;
42 uint8_t channel_count0;
43 uint8_t channel_start1;
44 uint8_t channel_count1;
45 uint8_t channel_start2;
46 uint8_t channel_count2;
47 uint8_t channel_start3;
48 uint8_t channel_count3;
49
50 uint8_t command_status;
51#define DMA_STATUS_REQ(x) (1 << ((x % 4) + 4))
52#define DMA_STATUS_COMPLETE(x) (1 << (x % 4))
53/* http://wiki.osdev.org/DMA: The only bit that works is COND(bit 2) */
54#define DMA_COMMAND_COND (1 << 2) /* Disables DMA controller */
55
56 uint8_t request; /* Memory to memory transfers, NOT implemented on PCs*/
57 uint8_t single_mask;
58#define DMA_SINGLE_MASK_CHAN_SELECT_MASK (0x3)
59#define DMA_SINGLE_MASK_CHAN_SELECT_SHIFT (0)
60#define DMA_SINGLE_MASK_MASK_ON_FLAG (1 << 2)
61
62 uint8_t mode;
63#define DMA_MODE_CHAN_SELECT_MASK (0x3)
64#define DMA_MODE_CHAN_SELECT_SHIFT (0)
65#define DMA_MODE_CHAN_TRA_MASK (0x3)
66#define DMA_MODE_CHAN_TRA_SHIFT (2)
67#define DMA_MODE_CHAN_TRA_SELF_TEST (0)
68#define DMA_MODE_CHAN_TRA_WRITE (1)
69#define DMA_MODE_CHAN_TRA_READ (2)
70#define DMA_MODE_CHAN_AUTO_FLAG (1 << 4)
71#define DMA_MODE_CHAN_DOWN_FLAG (1 << 5)
72#define DMA_MODE_CHAN_MOD_MASK (0x3)
73#define DMA_MODE_CHAN_MOD_SHIFT (6)
74#define DMA_MODE_CHAN_MOD_DEMAND (0)
75#define DMA_MODE_CHAN_MOD_SINGLE (1)
76#define DMA_MODE_CHAN_MOD_BLOCK (2)
77#define DMA_MODE_CHAN_MOD_CASCADE (3)
78
79 uint8_t flip_flop;
80 uint8_t master_reset; /* Intermediate is not implemented on PCs */
81 uint8_t mask_reset;
82/* Master reset sets Flip-Flop low, clears status,sets all mask bits on */
83
84 uint8_t multi_mask;
85#define DMA_MULTI_MASK_CHAN(x) (1 << (x % 4))
86
87} dma_controller_regs_first_t;
88
89#define DMA_CONTROLLER_SECOND_BASE 0xc0
90/* See dma_controller_regs_first_t for register values */
91typedef struct dma_controller_regs_second {
92 uint8_t channel_start4;
93 uint8_t reserved0;
94 uint8_t channel_count4;
95 uint8_t reserved1;
96 uint8_t channel_start5;
97 uint8_t reserved2;
98 uint8_t channel_count5;
99 uint8_t reserved3;
100 uint8_t channel_start6;
101 uint8_t reserved4;
102 uint8_t channel_count6;
103 uint8_t reserved5;
104 uint8_t channel_start7;
105 uint8_t reserved6;
106 uint8_t channel_count7;
107
108 uint8_t command_status;
109 uint8_t reserved8;
110 uint8_t request;
111 uint8_t reserved9;
112 uint8_t single_mask;
113 uint8_t reserveda;
114 uint8_t mode;
115 uint8_t reservedb;
116 uint8_t flip_flop;
117 uint8_t reservedc;
118 uint8_t master_reset_intermediate;
119 uint8_t reservedd;
120 uint8_t multi_mask;
121} dma_controller_regs_second_t;
122
123#define DMA_CONTROLLER_PAGE_BASE 0x81
124typedef struct dma_page_regs {
125 uint8_t channel2;
126 uint8_t channel3;
127 uint8_t channel1;
128 uint8_t reserved0;
129 uint8_t reserved1;
130 uint8_t reserved2;
131 uint8_t channel0;
132 uint8_t reserved3;
133 uint8_t channel6;
134 uint8_t channel7;
135 uint8_t channel5;
136 uint8_t reserved4;
137 uint8_t reserved5;
138 uint8_t reserved6;
139 uint8_t channel4;
140} dma_page_regs_t;
141
142typedef struct dma_channel {
143 uint8_t offset_reg_address;
144 uint8_t size_reg_address;
145 uint8_t page_reg_address;
146} dma_channel_t;
147
148typedef struct dma_controller {
149 dma_channel_t channel[8];
150 dma_page_regs_t *page_table;
151 dma_controller_regs_first_t *first;
152 dma_controller_regs_second_t *second;
153} dma_controller_t;
154
155dma_controller_t controller_8237 = {
156 .channel = {
157 { 0x00, 0x01, 0x87 }, { 0x02, 0x03, 0x83 },
158 { 0x04, 0x05, 0x81 }, { 0x06, 0x07, 0x82 },
159 { 0xc0, 0xc2, 0x8f }, { 0xc4, 0xc6, 0x8b },
160 { 0xc8, 0xca, 0x89 }, { 0xcc, 0xce, 0x8a } },
161 .page_table = NULL,
162 .first = NULL,
163 .second = NULL,
164};
165
166static inline dma_controller_t *dma_controller_init()
167{
168 return NULL;
169}
170/*----------------------------------------------------------------------------*/
171int dma_setup_channel(unsigned channel, uintptr_t pa, size_t size)
172{
173 static dma_controller_t *controller = NULL;
174 if (!controller)
175 return EIO;
176 return ENOTSUP;
177}
178/**
179 * @}
180 */
Note: See TracBrowser for help on using the repository browser.