The code needs tidying and commenting and debugging before I can share it (and before I forget how it works). I have got colour out of 3 monitors so far so it is looking good. This is using NTSC timings, I will try PAL another day. Resolution is 640x200 (or about 700x220 with overscan), but practically the Arduino won't be fast enough or have the ram to make use of all that. I may aim for a 160x200 mode.
stimmer:
The code needs tidying and commenting and debugging before I can share it (and before I forget how it works). I have got colour out of 3 monitors so far so it is looking good. This is using NTSC timings, I will try PAL another day. Resolution is 640x200 (or about 700x220 with overscan), but practically the Arduino won't be fast enough or have the ram to make use of all that. I may aim for a 160x200 mode.
Grayscale, colour bars and dot crawl
Sorry, but I wanted to make such library. I really appreciate your help, but I want to do things myself. Could you give me the dma stuff at least?
// Continuous DMA -> SMC port (pins 34-41)
// by stimmer
// set up 2 DMA buffers and a linked list
// 888 and 222 is NTSC timings (~15750 buffers/sec)
uint8_t dmabuf[2][888];
uint32_t dmall[10]={(uint32_t)dmabuf[0],0x60000000,0x22060000+222,0x20000000,(uint32_t)(dmall+5),
(uint32_t)dmabuf[1],0x60000000,0x22060000+222,0x20000000,(uint32_t)dmall};
int cbuf=0; // current buffer index
void DMAC_Handler()
{
uint32_t dummy=REG_DMAC_EBCISR; // clear DMA interrupt flag
dmall[2+5*cbuf]=0x22060000+222; // may not be needed
// write to dmabuf[cbuf] here
// you only have 6 clock cycles per byte!
// write words and longs where you can for speed
cbuf=1-cbuf;
}
void setup() {
// set up memory controller
REG_PMC_PCER0= 1<<9;
REG_SMC_SETUP0=0;
REG_PIOC_PDR=0b1111111100;
REG_PIOC_ABSR&=~0b1111111100;
REG_SMC_WPCR=0x534d4300;
REG_SMC_SETUP0=0x00000000;
REG_SMC_PULSE0=0X00000101;
REG_SMC_CYCLE0=0X00000006; // this sets the DMA rate - 84/6=14 MByte/sec
REG_SMC_TIMINGS0=0;
REG_SMC_MODE0=0x00000000;
// this code puts DMA priority above CPU.
MATRIX->MATRIX_WPMR=0x4d415400;
for(int i=0;i<6;i++)MATRIX->MATRIX_MCFG[i]=1;
MATRIX->MATRIX_MCFG[4]=4;
for(int i=0;i<8;i++)MATRIX->MATRIX_SCFG[i]=0x01000008;
MATRIX->MATRIX_SCFG[6]=0x011200ff;
MATRIX->MATRIX_PRAS0=MATRIX->MATRIX_PRAS1=MATRIX->MATRIX_PRAS2=0x00000000;
MATRIX->MATRIX_PRAS3=MATRIX->MATRIX_PRAS4=MATRIX->MATRIX_PRAS5=0x00000000;
MATRIX->MATRIX_PRAS6=0x00030000;
MATRIX->MATRIX_PRAS7=MATRIX->MATRIX_PRAS8=0x00000000;
// set up DMA
REG_PMC_PCER1= 1<<7;
REG_DMAC_WPMR=DMAC_WPMR_WPKEY(0x444d4143);
REG_DMAC_EN=1;
REG_DMAC_GCFG=0x00;
REG_DMAC_CFG5=0x10702200;
REG_DMAC_DSCR5=(uint32_t)dmall;
REG_DMAC_EBCIER=1<<5;
NVIC_EnableIRQ(DMAC_IRQn);
// start DMA
REG_DMAC_CHER=1<<5;
}
void loop() {
}
stimmer:
This is just the DMA section of the code:
// Continuous DMA -> SMC port (pins 34-41)
// by stimmer
// set up 2 DMA buffers and a linked list
// 888 and 222 is NTSC timings (~15750 buffers/sec)
uint8_t dmabuf[2][888];
uint32_t dmall[10]={(uint32_t)dmabuf[0],0x60000000,0x22060000+222,0x20000000,(uint32_t)(dmall+5),
(uint32_t)dmabuf[1],0x60000000,0x22060000+222,0x20000000,(uint32_t)dmall};
int cbuf=0; // current buffer index
void DMAC_Handler()
{
uint32_t dummy=REG_DMAC_EBCISR; // clear DMA interrupt flag
dmall[2+5*cbuf]=0x22060000+222; // may not be needed
// write to dmabuf[cbuf] here
// you only have 6 clock cycles per byte!
// write words and longs where you can for speed
cbuf=1-cbuf;
}
void setup() {
// set up memory controller
REG_PMC_PCER0= 1<<9;
REG_SMC_SETUP0=0;
REG_PIOC_PDR=0b1111111100;
REG_PIOC_ABSR&=~0b1111111100;
REG_SMC_WPCR=0x534d4300;
REG_SMC_SETUP0=0x00000000;
REG_SMC_PULSE0=0X00000101;
REG_SMC_CYCLE0=0X00000006; // this sets the DMA rate - 84/6=14 MByte/sec
REG_SMC_TIMINGS0=0;
REG_SMC_MODE0=0x00000000;
The last few days, I worked on writing a wss. It was not easy, but now widescreen is possible. I have also made some progress on the color stuff. But not on the arduino yet. I first made an application on the pc to generate composite video signals from pictures. It works great. (I got another tool to get it colored again) I will work soon on color for the arduino.
Some progress on coloring is made, but I can't get those colors to be smooth.
On the picture you can see from top to bottom Red, Green and Blue. (The green is the most bad one. But you can see some green spots)
Thanks! It will even become better when I change the resistors of my R2R ladder. They're a bit too high, so that's why the pictures are a bit dark. Here is another picture:
I just tested on a real tv, and it looks very nice! No color errors and such. Keep in mind that it works with a framebuffer, so you can draw on it in runtime. And you can use every color you want!