1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2008 by Maurus Cuelenaere
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
24 void memset(void *target
, unsigned char c
, size_t len
)
31 _memset(target
,c
,len
);
34 if(((unsigned int)target
< 0xa0000000) && len
)
35 dma_cache_wback_inv((unsigned long)target
, len
);
37 dp
= (unsigned char *)((unsigned int)(&d
) | 0xa0000000);
42 REG_DMAC_DSAR(ch
) = PHYSADDR((unsigned long)dp
);
43 REG_DMAC_DTAR(ch
) = PHYSADDR((unsigned long)target
);
44 REG_DMAC_DTCR(ch
) = len
/ 32;
45 REG_DMAC_DRSR(ch
) = DMAC_DRSR_RS_AUTO
;
46 REG_DMAC_DCMD(ch
) = DMAC_DCMD_DAI
| DMAC_DCMD_SWDH_32
| DMAC_DCMD_DWDH_32
| DMAC_DCMD_DS_32BYTE
;
47 REG_DMAC_DCCSR(ch
) = DMAC_DCCSR_EN
| DMAC_DCCSR_NDES
;
49 while (REG_DMAC_DTCR(ch
));
52 dp
= (unsigned char *)((unsigned int)target
+ (len
& (32 - 1)));
53 for(d
= 0;d
< (len
% 32); d
++)
60 void memset16(void *target
, unsigned short c
, size_t len
)
67 _memset16(target
,c
,len
);
70 if(((unsigned int)target
< 0xa0000000) && len
)
71 dma_cache_wback_inv((unsigned long)target
, len
);
74 REG_DMAC_DSAR(ch
) = PHYSADDR((unsigned long)&d
);
75 REG_DMAC_DTAR(ch
) = PHYSADDR((unsigned long)target
);
76 REG_DMAC_DTCR(ch
) = len
/ 32;
77 REG_DMAC_DRSR(ch
) = DMAC_DRSR_RS_AUTO
;
78 REG_DMAC_DCMD(ch
) = DMAC_DCMD_DAI
| DMAC_DCMD_SWDH_16
| DMAC_DCMD_DWDH_16
| DMAC_DCMD_DS_32BYTE
;
79 REG_DMAC_DCCSR(ch
) = DMAC_DCCSR_EN
| DMAC_DCCSR_NDES
;
81 while (REG_DMAC_DTCR(ch
));
84 dp
= (unsigned short *)((unsigned int)target
+ (len
& (32 - 1)));
85 for(d
= 0; d
< (len
% 32); d
++)
91 void memcpy(void *target
, const void *source
, size_t len
)
97 _memcpy(target
, source
, len
);
99 if(((unsigned int)source
< 0xa0000000) && len
)
100 dma_cache_wback_inv((unsigned long)source
, len
);
102 if(((unsigned int)target
< 0xa0000000) && len
)
103 dma_cache_wback_inv((unsigned long)target
, len
);
105 REG_DMAC_DSAR(ch
) = PHYSADDR((unsigned long)source
);
106 REG_DMAC_DTAR(ch
) = PHYSADDR((unsigned long)target
);
107 REG_DMAC_DTCR(ch
) = len
/ 4;
108 REG_DMAC_DRSR(ch
) = DMAC_DRSR_RS_AUTO
;
109 REG_DMAC_DCMD(ch
) = DMAC_DCMD_DAI
| DMAC_DCMD_SWDH_32
| DMAC_DCMD_DWDH_32
| DMAC_DCMD_DS_32BIT
;
111 REG_DMAC_DCCSR(ch
) = DMAC_DCCSR_EN
| DMAC_DCCSR_NDES
;
112 while (REG_DMAC_DTCR(ch
));
115 dp
= (unsigned char*)((unsigned int)target
+ (len
& (4 - 1)));
116 for(i
= 0; i
< (len
% 4); i
++)