From 29b696e57f0b6a0af2166d26adc31a778294914d Mon Sep 17 00:00:00 2001 From: tmeissner Date: Sun, 19 Jan 2014 01:07:00 +0100 Subject: [PATCH] renamed --- st7565-lcd/raspilcd.adb | 260 +++++++++------------ st7565-lcd/raspitest.adb | 145 ------------ st7565-lcd/st7565lcd.adb | 175 ++++++++++++++ st7565-lcd/{raspilcd.ads => st7565lcd.ads} | 0 4 files changed, 290 insertions(+), 290 deletions(-) delete mode 100644 st7565-lcd/raspitest.adb create mode 100644 st7565-lcd/st7565lcd.adb rename st7565-lcd/{raspilcd.ads => st7565lcd.ads} (100%) diff --git a/st7565-lcd/raspilcd.adb b/st7565-lcd/raspilcd.adb index 639c828..f842265 100644 --- a/st7565-lcd/raspilcd.adb +++ b/st7565-lcd/raspilcd.adb @@ -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; diff --git a/st7565-lcd/raspitest.adb b/st7565-lcd/raspitest.adb deleted file mode 100644 index f842265..0000000 --- a/st7565-lcd/raspitest.adb +++ /dev/null @@ -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; diff --git a/st7565-lcd/st7565lcd.adb b/st7565-lcd/st7565lcd.adb new file mode 100644 index 0000000..639c828 --- /dev/null +++ b/st7565-lcd/st7565lcd.adb @@ -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; diff --git a/st7565-lcd/raspilcd.ads b/st7565-lcd/st7565lcd.ads similarity index 100% rename from st7565-lcd/raspilcd.ads rename to st7565-lcd/st7565lcd.ads