1
0
mirror of git://projects.qi-hardware.com/ben-blinkenlights.git synced 2024-11-05 08:41:34 +02:00
Commit Graph

30 Commits

Author SHA1 Message Date
Werner Almesberger
ba1d297643 ubb-vga: new option -2 to keep on refreshing the LCD display (experimental)
"Experimental" means that it doesn't seem to work at the moment.

- regs4740.h (_LCD, LCDCTRL): added the LCD control register
- ubb-vga.c (old_lcdctrl, tame_lcd, restore_lcd): make the LCD controller
  use short bursts, to reduce the bus access latency for other users
- ubb-vga.c (keep_lcd, setup_noirq, cleanup_noirq, usage, main): new
  option -2 to keep on refreshing the LCD display
2011-05-06 20:19:38 -03:00
Werner Almesberger
f7e8fbbaea ubb-vga.c: moved timer setup and LCD disabling into noirq setup
- ubb-vga.c (ben_setup, setup_noirq): moved calls to disable_lcd and
  get_timer to setup_noirq
- ubb-vga.c (cleanup, cleanup_noirq): moved calls to release_timer
  and enable_lcd to cleanup_noirq
- ubb-vga.c (cleanup, main): "cleanup" is now empty; removed it
2011-05-06 19:36:34 -03:00
Werner Almesberger
01d33e28a7 ubb-vga.c (delay): try to compensate for APB jitter (experimental)
First, we extend all deadlines a litte to make sure we never have to
wait negative time. Second, we get the timer value at the end of the
wait and CPU-loop for the difference between the actual value and the
ideal (extended) value.
2011-05-03 12:09:24 -03:00
Werner Almesberger
5817669968 ubb-vga: try to clock MSC faster than the MMC bus; new video mode "640x480/61"
- ubb-vga.c (mode_db): added new mode "640x480/61"
- ubb-vga.c (setup, line): MSC_CLKRT is reset when the MSC resets. Moved
  it from "setup" to "line".
- ubb-vga.c (clkrt, setup, line): pick the highest available MSC clock
  and adjust the bus clock divider accordingly
- ubb-vga.c (main): added commented-out clock debugging output
- README: added XEN-1510T result for "640x480/61"
2011-05-03 10:19:16 -03:00
Werner Almesberger
3686153943 ubb-vga: housekeeping
- ubb-vga.c: added "friendly" 640x480 mode based on
  http://faculty.lasierra.edu/~ehwang/public/mypublications/VGA Monitor Controller.pdf
- README: added regressions and a new challenge
2011-05-02 07:10:52 -03:00
Werner Almesberger
6d8c8dd951 ubb-vga: use a free-running counter instead of resetting it for each line
Two benefits:
1) We don't accumulate errors from the delay between the timer reset and
   the deadline preceding it
2) In the future, we may use WAIT to wait for timer expiration, which
   should cause less bus activity and is should also reduce jitter

- regs4740.h (TFR. TFSR, TFCR, TDHR): added more timer registers
- ubb-vga.c (until): renamed to "delay" and changed to measure relative
  to the last deadline
- ubb-vga.c (line, hdelay, frame): replaced "until" with "delay"
- ubb-vga.c (hdelay, frame, session): reset the timer only once, at
  the beginning of the session
- ubb-vga.c (frame): we didn't wait for the horizontal back porch of
  the last image line
2011-05-02 06:11:29 -03:00
Werner Almesberger
a3cea3573c ubb-vga: send a line's last DMA transfer also if only partially filled
This caused 800x600 images to be cut off, because the line length is
not a multiple of 64 bytes.

- ubb-vga.c (session): make the allocation a multiple of the DMA
  transfer size
- ubb-vga.c (line): round number of transfers up instead of down
- ubb-vga.c (mode_db): line duration of 800x600/54 was a bit to short
2011-05-02 05:25:15 -03:00
Werner Almesberger
3ea6b9852e ubb-vga: make lines end in black (and not in overscan)
- ubb-vga.c (line): send a 0 word at the end of the line, to avoid
  overscan (we use PIO to synchronize with CPU timing)
- ubb-vga.c (mode_db): updated line length of 640x480 resolutions for
  correct termination
2011-05-02 05:16:19 -03:00
Werner Almesberger
4450a30456 ubb-vga.c (list_modes, usage, main): new option -l to list available modes 2011-05-01 23:12:38 -03:00
Werner Almesberger
b184fbbe74 ubb-vga.c (mode_db): cleanup and added approximations of standard modes 2011-05-01 23:00:35 -03:00
Werner Almesberger
9412c9debe ubb-vga: test image now shows detailed horizontal and vertical timing
- ubb-vga.c (CYCLES), ubb-vga.h: corrected conversion and moved to
  ubb-vga.h
- tstimg.c (printc): added characters '=' and '+'
- tstimg.c (tstimg): print detailed horizontal and vertical timing
2011-05-01 21:50:20 -03:00
Werner Almesberger
4b59dbf062 ubb-vga: express mode data in more common units and remove hard-coded constants
- ubb-vga.h (struct mode), ubb-vga.c (mode_db): replaced hsync_end with
  its constituends hsync_cycles and hback_cycles
- ubb-vga.h (struct mode), ubb-vga.c (mode_db): added vsync_lines,
  vfront_lines, and vback_lines
- ubb-vga.h (struct mode): changed "line_cycles" from "int" to
  "uint16_t"
- ubb-vga.c (line): don't hard-code horizontal back porch
- ubb-vga.c (line): don't hard-code sum of horizontal back porch and
  hsync
- ubb-vga.c (hdelay): don't hard-code hsync
- ubb-vga.c (frame): don't hard-code vsync and the vertical porches
- ubb-vga.c (frame): don't hard-code hsync and horizontal back porch
2011-05-01 20:59:38 -03:00
Werner Almesberger
aa2fc7101d ubb-vga.c (mode_db): added 1024x768, 53 Hz mode (56 MHz pixel clock) 2011-05-01 18:55:29 -03:00
Werner Almesberger
934a89bfa5 ubb-vga: added quick and dirty run-until-keypress mode
- ubb-vga.c (KEY_MASK): KEYINx lines on port D
- ubb-vga.c (session): run until keypress if the number of frames is
  zero
- ubb-vga.c (main): set frames to zero if omitted
2011-05-01 16:41:32 -03:00
Werner Almesberger
eabd0b53f6 ubb-vga: make mode information global
- ubb-vga.c (mode), ubb-vga.h: made global
2011-05-01 15:17:30 -03:00
Werner Almesberger
f7eb220401 ubb-vga: gently prepare the code for sharing mode information
This is tricky: if we just make "mode" global, the whole timing may
fall apart, with the DMA locking up. So let's take small bisectable
steps to get there ...

- ubb-vga.c (struct mode), ubb-vga.h: moved mode entry declaration to
  ubb-vga.h
- ubb-vga.c (mode_db): moved up
2011-05-01 15:17:01 -03:00
Werner Almesberger
90b087cea0 ubb-vga.c (struct mode, mode_db): removed no longer used field "line_words" 2011-05-01 14:47:16 -03:00
Werner Almesberger
9fb5c6f3f4 ubb-vga.c: moved some DMA settings from per-line to per-session setup
- ubb-vga.c (setup_noirq, line): moved DMA channel command setting to
  per-session setup
- ubb-vga.c (setup_noirq, line): moved DMA request type setting to
  per-session setup
- ubb-vga.c (line): added commend that the target address needs to be
  set for each transfer, even if it doesn't change
2011-05-01 13:54:54 -03:00
Werner Almesberger
b273f27c07 ubb-vga.c: DMA was set to transfer twice the amount needed, oops
- ubb-vga.c (line): removed unnecessary DMA channel reset
- ubb-vga.c (line): number of words is pixels/64, not pixels/32
2011-05-01 13:22:08 -03:00
Werner Almesberger
a8a0cfa22f ubb-vga.c: added (fragile) DMA support (locks up on anything but 800x600)
Note that DMA is very sensitive to the video timing. At the moment,
only 800x600 mode works without locking up the DMA controller.

- ubb-vga.c (DMA, setup_noirq, cleanup_noirq, line): replaced MMC PIO
  with DMA
- ubb-vga.c (frame): pass physical addresses to "line"
- ubb-vga.c (frame): detect if the DMA controller is stuck
2011-05-01 12:22:23 -03:00
Werner Almesberger
64f3047144 ubb-vga.c: cleaned up setup process and prepared for DMA
- ubb-vga.c (setup): made "static"
- ubb-vga.c (setup_noirq, cleanup_noirq, session): added functions for
  setup tasks to perform with interrupts off
2011-04-29 22:48:01 -03:00
Werner Almesberger
8d803dda4c ubb-vga.c: housekeeping
- ubb-vga.c (ben_setup): use REG_WINDOW instead of calculating the
  window size
- ubb-vga.c (PAGE_SIZS): we no longer need it - removed
- ubb-vga.c (line): shift bus width setting in MSC_CMDAT by the field
  position, not the bit position
- ubb-vga.c (line): moved comment detailing the search for the
  adjustment value to the mode database, so that we don't clutter
  this function
2011-04-29 22:22:51 -03:00
Werner Almesberger
3a8e062c48 renamed ubb-vga.c to ubb-vga-old.c, ubb-vga2.c to ubb-vga.c; updated Makefile 2011-04-29 14:03:07 -03:00
Werner Almesberger
a794c4b1b2 ubb-vga: avoid diodes; redesign for luminance bit (Y) and MMC controller
- ubb-vga.sch: use resistive divider instead of diodes
- ubb-vga.sch, ubb-vga.c (VSYNC): moved VSYNC from DAT3 to CLK to make
  all MMC data lines available for pixel data
- ubb-vga.sch, ubb-vga.c (R): moved red from DAT2 to DAT3 for convenient
  access to the 4th channel
- ubb-vga.sch: added luminance (Y) channel
- ubb-vga.sch: added pull-down to HSYNC/CMD, for later use with the MMC
  controller
- ubb-vga.c (pdfuns, pdfunc, ben_setup, setup): make UBB signals GPIOs,
  in case someone left them in a different configuration
2011-04-27 16:48:07 -03:00
Werner Almesberger
67107d0062 ubb-vga: option -d to double the number of set/clear pairs, improving resolution
- README: added compatibility of double mode
- ubb-vga.c (usage, main): new option -d to double the number of set/clear
  pairs (making lines longer and the apparent pixel clock slower)
- ubb-vga.c (grab, session, main): have a complete set/clear pair for each
  pixel in double mode
2011-04-24 21:09:50 -03:00
Werner Almesberger
dab839ab66 ubb-vga.c: moved line length and timing to variables
- ubb-vga.c (line_pairs, line, frame, tricolor, grid, session): line
  length is now kept in a variable, instead of hard-coding its value
  and the values derived from it
- ubb-vga.c (line_cycles, line, hdelay): the total line duration is now
  kept in a variable, instead of hard-coding it all over the place
2011-04-24 20:01:12 -03:00
Werner Almesberger
dae21696b3 ubb-vga.c: a bit more cleanup
- ubb-vga.c: added more section titles
- ubb-vga.c (pick, pattern): grouped pixel-generating functions with
  image generation
- ubb-vga.c (usage, main): properly parse command-line options ("getopt"
  is a bit of overkill at the moment but will be needed later)
2011-04-24 19:43:26 -03:00
Werner Almesberger
554c6645d8 ubb-vga.c: removed unused #defines and rearranged the code a little 2011-04-24 12:12:36 -03:00
Werner Almesberger
8bd7199d9e ubb-vga.c: removed commented-out code from earlier experiments
The history of the split prefetch code:

Once up on a time, I thought that it was important to stay very close
to the "official" pixel clock. We could do this when copying 32 bit
words from cache to the GPIO set/clear registers, but not when
shifting 8 bit values as we do now.

One problem with 32 bit values is that transferring that amount of
data exceeds the time available in the hsync pulse. Hence the idea
to split the prefetch between hsync pulse and horizontal front porch.

Note that we also split prefetches between the two VGA lines of each
QVGA line. This commit does not change that mechanism.

- ubb-vga.c (line, frame): removed code fragments for prefetch split
  between hsync pulse and front porch
- ubb-vga.c (line, frame): remove code fragments for measuring time
  relative to the rising edge of hsync (and letting the prefetch time
  control the hsync length), not the falling edge
2011-04-24 11:48:32 -03:00
Werner Almesberger
3b7a7caec1 renamed "video" to ubb-vga 2011-04-24 02:56:56 -03:00