PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
ee_sif2.c
1/*
2
3Common PS2 SIF management API for both EE and IOP.
4
5This file contains all common code for both EE and IOP SIF management.
6
7*/
8
9#include <tamtypes.h>
10#include <ps2_reg_defs.h>
11#include "ee_regs.h"
12#include "ps2_sbus.h"
13#include "sbus_priv.h"
14
15static int _sif2_inited = 0;
16static u32 _sif2_xfer_addr = 0;
17static u32 _sif2_xfer_size = 0;
18static u32 _sif2_xfer_attr = 0;
19static u32 _sif2_xfer_chunk_size = 0;
20
21void SIF2_RestartDma(void);
22
23void SIF2_sync_dma(void)
24{
25 int oldi;
26
27 M_SuspendIntr(&oldi);
28
29 while (1) {
30 if (!(*R_EE_D7_CHCR & EE_CHCR_STR)) {
31 if ((_sif2_xfer_addr != 0) && (_sif2_xfer_size > 0)) {
32 _sif2_xfer_addr += _sif2_xfer_chunk_size;
33 _sif2_xfer_size -= _sif2_xfer_chunk_size;
34 }
35
36 if ((_sif2_xfer_addr != 0) && (_sif2_xfer_size > 0)) {
37 SIF2_RestartDma();
38 } else {
39 _sif2_xfer_addr = 0;
40 _sif2_xfer_size = 0;
41 break;
42 }
43 }
44 }
45
46 M_ResumeIntr(oldi);
47}
48
49void SIF2_RestartDma(void)
50{
51 int oldi;
52
53 M_SuspendIntr(&oldi);
54
55 // disable CH7 interrupt and clear interrupt status
56 *R_EE_D_STAT &= 0x00800080;
57
58 // enable CH7 priority
59 // *R_EE_D_PCR |= 0x00800000;
60
61 _sif2_xfer_chunk_size = (_sif2_xfer_size > SIF2_XFER_CHUNK_SIZE) ? SIF2_XFER_CHUNK_SIZE : _sif2_xfer_size;
62
63 *R_EE_D7_CHCR = 0;
64 *R_EE_D7_MADR = (_sif2_xfer_addr & 0x0FFFFFFF);
65 *R_EE_D7_QWC = ((_sif2_xfer_chunk_size + 15) / 16);
66 *R_EE_D7_CHCR = _sif2_xfer_attr | EE_CHCR_STR;
67
68 M_ResumeIntr(oldi);
69}
70
71int SIF2_set_dma(u32 addr, u32 size, u32 attr)
72{
73 size = ((size + 15) / 16) * 16;
74
75 _sif2_xfer_addr = addr;
76 _sif2_xfer_size = size;
77 _sif2_xfer_attr = attr;
78
79 SIF2_RestartDma();
80 return (0);
81}
82
83
84int SIF2_init(void)
85{
86 int oldi;
87
88 if (_sif2_inited) {
89 return (-1);
90 }
91
92 _DisableDmac(7);
93
94 M_SuspendIntr(&oldi);
95
96 // Enable DMA
97 *R_EE_D_CTRL |= 1;
98
99 *R_LOCAL_SBUS(PS2_SBUS_REG4) = 0x00000100;
100 *R_LOCAL_SBUS(PS2_SBUS_REG6) = 0x000000FF;
101
102 *R_EE_D7_CHCR = 0;
103
104 M_ResumeIntr(oldi);
105
106 // EnableDmac(7);
107
108 _sif2_inited = 1;
109
110 return (0);
111}
112
113int SIF2_deinit(void)
114{
115 int oldi;
116
117 if (!_sif2_inited) {
118 return (-1);
119 }
120
121 _DisableDmac(7);
122
123 M_SuspendIntr(&oldi);
124 *R_EE_D7_CHCR = 0;
125 M_ResumeIntr(oldi);
126
127 _sif2_inited = 0;
128
129 return (0);
130}
#define R_EE_D_CTRL
Definition ee_regs.h:448
#define R_EE_D7_MADR
Definition ee_regs.h:426
#define R_EE_D7_CHCR
Definition ee_regs.h:424
#define R_EE_D_STAT
Definition ee_regs.h:450
#define R_EE_D7_QWC
Definition ee_regs.h:428