Browse Source

renamed

master
T. Meissner 10 years ago
parent
commit
29b696e57f
4 changed files with 290 additions and 290 deletions
  1. +115
    -145
      st7565-lcd/raspilcd.adb
  2. +0
    -145
      st7565-lcd/raspitest.adb
  3. +175
    -0
      st7565-lcd/st7565lcd.adb
  4. +0
    -0
      st7565-lcd/st7565lcd.ads

+ 115
- 145
st7565-lcd/raspilcd.adb View File

@ -1,175 +1,145 @@
with Interfaces;
use Interfaces;
with Interfaces.C;
use Interfaces.C;
with Interfaces.C.extensions;
use Interfaces.C.extensions;
with Ada.Text_IO;
with bcm2835_h;
use bcm2835_h;
with st7565lcd;
with Interfaces; use Interfaces;
with Ada.Text_IO, Ada.Integer_Text_IO, Ada.Streams.Stream_IO;
use Ada.Text_IO, Ada.Integer_Text_IO, Ada.Streams.Stream_IO;
with Ada.Command_Line; use Ada.Command_Line;
package body st7565lcd is
procedure raspilcd is
procedure io_init is
begin
bcm2835_gpio_fsel(pin => LCD_CS, mode => unsigned_char(BCM2835_GPIO_FSEL_OUTP));
bcm2835_gpio_fsel(pin => LCD_RST, mode => unsigned_char(BCM2835_GPIO_FSEL_OUTP));
bcm2835_gpio_fsel(pin => LCD_A0, mode => unsigned_char(BCM2835_GPIO_FSEL_OUTP));
bcm2835_gpio_fsel(pin => LCD_CLK, mode => unsigned_char(BCM2835_GPIO_FSEL_OUTP));
bcm2835_gpio_fsel(pin => LCD_SI, mode => unsigned_char(BCM2835_GPIO_FSEL_OUTP));
end io_init;
-- shorter names for packages
package IO renames Ada.Text_IO;
package LCD renames st7565lcd;
package IOS renames Ada.Streams.Stream_IO;
-- stream.io definitions
My_File : IOS.FILE_TYPE;
My_File_Access : IOS.STREAM_ACCESS;
procedure lcd_init is
begin
-- reset
bcm2835_gpio_write(pin => LCD_CS, on => unsigned_char(HIGH));
bcm2835_delayMicroseconds(unsigned_long_long(1));
bcm2835_gpio_write(pin => LCD_RST, on => unsigned_char(LOW));
bcm2835_delayMicroseconds(unsigned_long_long(1));
bcm2835_gpio_write(pin => LCD_RST, on => unsigned_char(HIGH));
bcm2835_delayMicroseconds(unsigned_long_long(1));
-- init routine
for index in lcd_init_data'range loop
lcd_transfer_data(value => lcd_init_data(index), si => false);
end loop;
lcd_clear;
end lcd_init;
-- picture data
picture_header : LCD.t_bmp_header;
color_mask : LCD.t_color_mask;
picture_data : LCD.t_bmp_array (0 .. 128 * 64 - 1);
-- lcd pixel array
lcd_data : LCD.t_lcd_array;
-- display strings on the lcd at a given position
-- data is a string with any allowed range
-- for strings not beginning at 0 we have to decrement the index
-- variable for xpos by the value of the range begin, so we get
-- for xpos a range from (xpos + 0 .. xpos + number of char in string)
procedure lcd_ascii57_string (xpos : natural; ypos : natural; data : string) is
begin
for index in data'range loop
lcd_ascii57(xpos => xpos + (index - data'first) * 6, ypos => ypos, data => character'val(character'pos(data(index))));
end loop;
end lcd_ascii57_string;
-- exception handling
tool_info : string := "raspi-lcd version 0.1, (c) 2014 by tmeissner";
usage : string := "usage: ./raspitest BMP-FILE (as root)";
bmp_error : string := "error: malformed BMP-FILE (valid: 128x64, no compression, 32bpp)";
cli_exception : exception;
bmp_exception : exception;
procedure lcd_ascii57 (xpos : natural; ypos : natural; data : character) is
begin
lcd_set_page(page => ypos, column => xpos);
-- write one 5x7 char
for index in 0..4 loop
lcd_transfer_data(value => font_5x7(character'pos(data))(index), si => true);
end loop;
-- one free column between chars
lcd_transfer_data(value => 16#00#, si => true);
end lcd_ascii57;
begin
-- no picture given
if Argument_Count /= 1 then
raise cli_exception;
end if;
procedure lcd_picture (xpos : natural; ypos: natural; picture : t_lcd_array) is
-- open picture file
declare
filename : string := Argument (1);
begin
for outdex in 0..7 loop
lcd_set_page(page => ypos + outdex, column => xpos);
for index in (128 * outdex) .. (128 * (outdex + 1) - 1) loop
lcd_transfer_data(value => picture(index), si => true);
end loop;
IOS.Open(My_File, In_File, filename);
My_File_Access := IOS.Stream(My_File);
end;
-- read bmp header
LCD.t_bmp_header'Read(My_File_Access, picture_header);
--Put_Line("Width: " & Integer'Image(picture_header.biWidth));
--Put_Line("Height: " & Integer'Image(picture_header.biHeight));
--Put_Line("Color Depth: " & Integer'Image(Integer(picture_header.biBitCount)));
--Put_Line("Compression: " & Integer'Image(Integer(picture_header.biCompression)));
-- check for valid bmp format
if (abs picture_header.biHeight /= 64 or picture_header.biWidth /= 128 or
(picture_header.biCompression /= 0 and picture_header.biCompression /= 3) or
picture_header.biBitCount /= 32) then
raise bmp_exception;
end if;
-- get color map if existing
if picture_header.biCompression = 3 then
LCD.t_color_mask'Read(My_File_Access, color_mask);
end if;
-- read in image data
if picture_header.biHeight < 0 then
-- top-down pixel matrix
for index in picture_data'range loop
if not IOS.End_Of_File(My_File) then
LCD.t_byte_array'Read(My_File_Access, picture_data(index));
end if;
end loop;
end lcd_picture;
else
procedure lcd_clear is
begin
bcm2835_gpio_write(pin => LCD_CS, on => unsigned_char(LOW));
for outdex in 0..7 loop
lcd_set_page(page => outdex, column => 0);
for index in 0..128 loop
lcd_transfer_data(value => 16#00#, si => true);
-- bottom-top pixel matrix
for row in reverse 0 .. 63 loop
for column in 0 .. 127 loop
if not IOS.End_Of_File(My_File) then
LCD.t_byte_array'Read(My_File_Access, picture_data(row * 128 + column));
end if;
end loop;
end loop;
bcm2835_gpio_write(pin => LCD_CS, on => unsigned_char(HIGH));
end lcd_clear;
end if;
-- close picture file
Ada.Streams.Stream_IO.Close(My_File);
-- convert bmp to lcd matrix
lcd_data := LCD.bmp_to_lcd(bmp => picture_data, color_mask => color_mask);
procedure lcd_transfer_data (value : byte; si : boolean) is
begin
bcm2835_gpio_write(pin => LCD_CS, on => unsigned_char(LOW));
bcm2835_gpio_write(pin => LCD_CLK, on => unsigned_char(HIGH));
if si then
bcm2835_gpio_write(pin => LCD_A0, on => unsigned_char(HIGH));
else
bcm2835_gpio_write(pin => LCD_A0, on => unsigned_char(LOW));
end if;
lcd_byte(value);
bcm2835_gpio_write(pin => LCD_CS, on => unsigned_char(HIGH));
end lcd_transfer_data;
-- load bcm2835 lib
-- print picture and some text on lcd
if integer(bcm2835_h.bcm2835_init) = 0 then
procedure lcd_set_page (page : natural; column : natural) is
lsb : byte := byte(column + 1) and 16#0f#;
msb : byte := byte(column + 1) and 16#f0#;
page_int : byte := byte(page) or 16#b0#;
begin
msb := Shift_Right(msb, 4);
msb := msb or 16#10#;
lcd_transfer_data(value => page_int, si => false);
lcd_transfer_data(value => msb, si => false);
lcd_transfer_data(value => lsb, si => false);
null;
end lcd_set_page;
IO.Put_Line("Error while initializing BCM2835 library");
else
LCD.io_init;
LCD.lcd_init;
LCD.lcd_picture(xpos => 0, ypos => 0, picture => lcd_data);
procedure lcd_byte (data : byte) is
data_int : byte := data;
begin
for index in 0..7 loop
bcm2835_delayMicroseconds(unsigned_long_long(1));
bcm2835_gpio_write(pin => LCD_CLK, on => unsigned_char(LOW));
if (data_int and 16#80#) = 16#80# then
bcm2835_gpio_write(pin => LCD_SI, on => unsigned_char(HIGH));
else
bcm2835_gpio_write(pin => LCD_SI, on => unsigned_char(LOW));
end if;
data_int := Shift_Left(data_int, 1);
bcm2835_delayMicroseconds(unsigned_long_long(1));
bcm2835_gpio_write(pin => LCD_CLK, on => unsigned_char(HIGH));
end loop;
end lcd_byte;
bcm2835_h.bcm2835_delay(5000);
LCD.lcd_clear;
LCD.lcd_ascii57_string(xpos => 0, ypos => 0, data => "raspiFPGA 0.1");
LCD.lcd_ascii57_string(xpos => 0, ypos => 1, data => "(c) raspiDEV 2013");
function bmp_to_lcd (bmp : t_bmp_array; color_mask : t_color_mask) return t_lcd_array is
lcd : t_lcd_array := (others => 16#00#);
logic : byte;
begin
for aussen in 0 .. 7 loop
logic := 16#01#;
for outdex in 0 .. 7 loop
for index in 0 .. 127 loop
if ((bmp(aussen * 1024 + outdex * 128 + index)(which_byte(color_mask.red)) or
bmp(aussen * 1024 + outdex * 128 + index)(which_byte(color_mask.green)) or
bmp(aussen * 1024 + outdex * 128 + index)(which_byte(color_mask.blue))) < 16#77#) then
lcd(aussen * 128 + index) := lcd(aussen * 128 + index) or logic;
end if;
end loop;
logic := Shift_Left(logic, 1);
end loop;
end loop;
return lcd;
end bmp_to_lcd;
-- close library
if integer(bcm2835_h.bcm2835_close) = 0 then
IO.Put_Line("Error while closing BCM2835 library");
end if;
end if;
function which_byte (data : dword) return integer is
begin
case data is
when 16#000000FF# =>
return 0;
when 16#0000FF00# =>
return 1;
when 16#00FF0000# =>
return 2;
when 16#FF000000# =>
return 3;
when others =>
return -1;
end case;
end which_byte;
end st7565lcd;
-- exception handling
exception
when e: cli_exception =>
put_line(tool_info);
put_line(usage);
when e: bmp_exception =>
put_line(tool_info);
put_line(bmp_error);
end raspilcd;

+ 0
- 145
st7565-lcd/raspitest.adb View File

@ -1,145 +0,0 @@
with Ada.Text_IO;
with bcm2835_h;
with st7565lcd;
with Interfaces; use Interfaces;
with Ada.Text_IO, Ada.Integer_Text_IO, Ada.Streams.Stream_IO;
use Ada.Text_IO, Ada.Integer_Text_IO, Ada.Streams.Stream_IO;
with Ada.Command_Line; use Ada.Command_Line;
procedure raspilcd is
-- shorter names for packages
package IO renames Ada.Text_IO;
package LCD renames st7565lcd;
package IOS renames Ada.Streams.Stream_IO;
-- stream.io definitions
My_File : IOS.FILE_TYPE;
My_File_Access : IOS.STREAM_ACCESS;
-- picture data
picture_header : LCD.t_bmp_header;
color_mask : LCD.t_color_mask;
picture_data : LCD.t_bmp_array (0 .. 128 * 64 - 1);
-- lcd pixel array
lcd_data : LCD.t_lcd_array;
-- exception handling
tool_info : string := "raspi-lcd version 0.1, (c) 2014 by tmeissner";
usage : string := "usage: ./raspitest BMP-FILE (as root)";
bmp_error : string := "error: malformed BMP-FILE (valid: 128x64, no compression, 32bpp)";
cli_exception : exception;
bmp_exception : exception;
begin
-- no picture given
if Argument_Count /= 1 then
raise cli_exception;
end if;
-- open picture file
declare
filename : string := Argument (1);
begin
IOS.Open(My_File, In_File, filename);
My_File_Access := IOS.Stream(My_File);
end;
-- read bmp header
LCD.t_bmp_header'Read(My_File_Access, picture_header);
--Put_Line("Width: " & Integer'Image(picture_header.biWidth));
--Put_Line("Height: " & Integer'Image(picture_header.biHeight));
--Put_Line("Color Depth: " & Integer'Image(Integer(picture_header.biBitCount)));
--Put_Line("Compression: " & Integer'Image(Integer(picture_header.biCompression)));
-- check for valid bmp format
if (abs picture_header.biHeight /= 64 or picture_header.biWidth /= 128 or
(picture_header.biCompression /= 0 and picture_header.biCompression /= 3) or
picture_header.biBitCount /= 32) then
raise bmp_exception;
end if;
-- get color map if existing
if picture_header.biCompression = 3 then
LCD.t_color_mask'Read(My_File_Access, color_mask);
end if;
-- read in image data
if picture_header.biHeight < 0 then
-- top-down pixel matrix
for index in picture_data'range loop
if not IOS.End_Of_File(My_File) then
LCD.t_byte_array'Read(My_File_Access, picture_data(index));
end if;
end loop;
else
-- bottom-top pixel matrix
for row in reverse 0 .. 63 loop
for column in 0 .. 127 loop
if not IOS.End_Of_File(My_File) then
LCD.t_byte_array'Read(My_File_Access, picture_data(row * 128 + column));
end if;
end loop;
end loop;
end if;
-- close picture file
Ada.Streams.Stream_IO.Close(My_File);
-- convert bmp to lcd matrix
lcd_data := LCD.bmp_to_lcd(bmp => picture_data, color_mask => color_mask);
-- load bcm2835 lib
-- print picture and some text on lcd
if integer(bcm2835_h.bcm2835_init) = 0 then
IO.Put_Line("Error while initializing BCM2835 library");
else
LCD.io_init;
LCD.lcd_init;
LCD.lcd_picture(xpos => 0, ypos => 0, picture => lcd_data);
bcm2835_h.bcm2835_delay(5000);
LCD.lcd_clear;
LCD.lcd_ascii57_string(xpos => 0, ypos => 0, data => "raspiFPGA 0.1");
LCD.lcd_ascii57_string(xpos => 0, ypos => 1, data => "(c) raspiDEV 2013");
-- close library
if integer(bcm2835_h.bcm2835_close) = 0 then
IO.Put_Line("Error while closing BCM2835 library");
end if;
end if;
-- exception handling
exception
when e: cli_exception =>
put_line(tool_info);
put_line(usage);
when e: bmp_exception =>
put_line(tool_info);
put_line(bmp_error);
end raspilcd;

+ 175
- 0
st7565-lcd/st7565lcd.adb View File

@ -0,0 +1,175 @@
with Interfaces;
use Interfaces;
with Interfaces.C;
use Interfaces.C;
with Interfaces.C.extensions;
use Interfaces.C.extensions;
with bcm2835_h;
use bcm2835_h;
package body st7565lcd is
procedure io_init is
begin
bcm2835_gpio_fsel(pin => LCD_CS, mode => unsigned_char(BCM2835_GPIO_FSEL_OUTP));
bcm2835_gpio_fsel(pin => LCD_RST, mode => unsigned_char(BCM2835_GPIO_FSEL_OUTP));
bcm2835_gpio_fsel(pin => LCD_A0, mode => unsigned_char(BCM2835_GPIO_FSEL_OUTP));
bcm2835_gpio_fsel(pin => LCD_CLK, mode => unsigned_char(BCM2835_GPIO_FSEL_OUTP));
bcm2835_gpio_fsel(pin => LCD_SI, mode => unsigned_char(BCM2835_GPIO_FSEL_OUTP));
end io_init;
procedure lcd_init is
begin
-- reset
bcm2835_gpio_write(pin => LCD_CS, on => unsigned_char(HIGH));
bcm2835_delayMicroseconds(unsigned_long_long(1));
bcm2835_gpio_write(pin => LCD_RST, on => unsigned_char(LOW));
bcm2835_delayMicroseconds(unsigned_long_long(1));
bcm2835_gpio_write(pin => LCD_RST, on => unsigned_char(HIGH));
bcm2835_delayMicroseconds(unsigned_long_long(1));
-- init routine
for index in lcd_init_data'range loop
lcd_transfer_data(value => lcd_init_data(index), si => false);
end loop;
lcd_clear;
end lcd_init;
-- display strings on the lcd at a given position
-- data is a string with any allowed range
-- for strings not beginning at 0 we have to decrement the index
-- variable for xpos by the value of the range begin, so we get
-- for xpos a range from (xpos + 0 .. xpos + number of char in string)
procedure lcd_ascii57_string (xpos : natural; ypos : natural; data : string) is
begin
for index in data'range loop
lcd_ascii57(xpos => xpos + (index - data'first) * 6, ypos => ypos, data => character'val(character'pos(data(index))));
end loop;
end lcd_ascii57_string;
procedure lcd_ascii57 (xpos : natural; ypos : natural; data : character) is
begin
lcd_set_page(page => ypos, column => xpos);
-- write one 5x7 char
for index in 0..4 loop
lcd_transfer_data(value => font_5x7(character'pos(data))(index), si => true);
end loop;
-- one free column between chars
lcd_transfer_data(value => 16#00#, si => true);
end lcd_ascii57;
procedure lcd_picture (xpos : natural; ypos: natural; picture : t_lcd_array) is
begin
for outdex in 0..7 loop
lcd_set_page(page => ypos + outdex, column => xpos);
for index in (128 * outdex) .. (128 * (outdex + 1) - 1) loop
lcd_transfer_data(value => picture(index), si => true);
end loop;
end loop;
end lcd_picture;
procedure lcd_clear is
begin
bcm2835_gpio_write(pin => LCD_CS, on => unsigned_char(LOW));
for outdex in 0..7 loop
lcd_set_page(page => outdex, column => 0);
for index in 0..128 loop
lcd_transfer_data(value => 16#00#, si => true);
end loop;
end loop;
bcm2835_gpio_write(pin => LCD_CS, on => unsigned_char(HIGH));
end lcd_clear;
procedure lcd_transfer_data (value : byte; si : boolean) is
begin
bcm2835_gpio_write(pin => LCD_CS, on => unsigned_char(LOW));
bcm2835_gpio_write(pin => LCD_CLK, on => unsigned_char(HIGH));
if si then
bcm2835_gpio_write(pin => LCD_A0, on => unsigned_char(HIGH));
else
bcm2835_gpio_write(pin => LCD_A0, on => unsigned_char(LOW));
end if;
lcd_byte(value);
bcm2835_gpio_write(pin => LCD_CS, on => unsigned_char(HIGH));
end lcd_transfer_data;
procedure lcd_set_page (page : natural; column : natural) is
lsb : byte := byte(column + 1) and 16#0f#;
msb : byte := byte(column + 1) and 16#f0#;
page_int : byte := byte(page) or 16#b0#;
begin
msb := Shift_Right(msb, 4);
msb := msb or 16#10#;
lcd_transfer_data(value => page_int, si => false);
lcd_transfer_data(value => msb, si => false);
lcd_transfer_data(value => lsb, si => false);
null;
end lcd_set_page;
procedure lcd_byte (data : byte) is
data_int : byte := data;
begin
for index in 0..7 loop
bcm2835_delayMicroseconds(unsigned_long_long(1));
bcm2835_gpio_write(pin => LCD_CLK, on => unsigned_char(LOW));
if (data_int and 16#80#) = 16#80# then
bcm2835_gpio_write(pin => LCD_SI, on => unsigned_char(HIGH));
else
bcm2835_gpio_write(pin => LCD_SI, on => unsigned_char(LOW));
end if;
data_int := Shift_Left(data_int, 1);
bcm2835_delayMicroseconds(unsigned_long_long(1));
bcm2835_gpio_write(pin => LCD_CLK, on => unsigned_char(HIGH));
end loop;
end lcd_byte;
function bmp_to_lcd (bmp : t_bmp_array; color_mask : t_color_mask) return t_lcd_array is
lcd : t_lcd_array := (others => 16#00#);
logic : byte;
begin
for aussen in 0 .. 7 loop
logic := 16#01#;
for outdex in 0 .. 7 loop
for index in 0 .. 127 loop
if ((bmp(aussen * 1024 + outdex * 128 + index)(which_byte(color_mask.red)) or
bmp(aussen * 1024 + outdex * 128 + index)(which_byte(color_mask.green)) or
bmp(aussen * 1024 + outdex * 128 + index)(which_byte(color_mask.blue))) < 16#77#) then
lcd(aussen * 128 + index) := lcd(aussen * 128 + index) or logic;
end if;
end loop;
logic := Shift_Left(logic, 1);
end loop;
end loop;
return lcd;
end bmp_to_lcd;
function which_byte (data : dword) return integer is
begin
case data is
when 16#000000FF# =>
return 0;
when 16#0000FF00# =>
return 1;
when 16#00FF0000# =>
return 2;
when 16#FF000000# =>
return 3;
when others =>
return -1;
end case;
end which_byte;
end st7565lcd;

st7565-lcd/raspilcd.ads → st7565-lcd/st7565lcd.ads View File


Loading…
Cancel
Save