; ; Hunter Adams (vha3@cornell.edu) ; RGB generation for VGA driver ; Program name .program rgb pull block ; Pull from FIFO to OSR (only once) mov y, osr ; Copy value from OSR to y scratch register .wrap_target set pins, 0 ; Zero RGB pins in blanking mov x, y ; Initialize counter variable wait 1 irq 1 [3] ; Wait for vsync active mode (starts 5 cycles after execution) colorout: pull block ; Pull color value out pins, 3 [4] ; Push out to pins (first pixel) out pins, 3 [2] ; Push out to pins (next pixel) jmp x-- colorout ; Stay here thru horizontal active mode .wrap % c-sdk { static inline void rgb_program_init(PIO pio, uint sm, uint offset, uint pin) { // creates state machine configuration object c, sets // to default configurations. I believe this function is auto-generated // and gets a name of _program_get_default_config // Yes, page 40 of SDK guide pio_sm_config c = rgb_program_get_default_config(offset); // Map the state machine's SET and OUT pin group to three pins, the `pin` // parameter to this function is the lowest one. These groups overlap. sm_config_set_set_pins(&c, pin, 3); sm_config_set_out_pins(&c, pin, 3); // Set clock division (Commented out, this one runs at full speed) // sm_config_set_clkdiv(&c, 2) ; // Set this pin's GPIO function (connect PIO to the pad) pio_gpio_init(pio, pin); pio_gpio_init(pio, pin+1); pio_gpio_init(pio, pin+2); // Set the pin direction to output at the PIO (3 pins) pio_sm_set_consecutive_pindirs(pio, sm, pin, 3, true); // Load our configuration, and jump to the start of the program pio_sm_init(pio, sm, offset, &c); // Set the state machine running (commented out, I'll start this in the C) // pio_sm_set_enabled(pio, sm, true); } %}