1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/conf/landfall-examples/mips-ci20-common.io Wed Jun 17 00:20:06 2020 +0200
1.3 @@ -0,0 +1,25 @@
1.4 +-- vim: ft=lua ts=2 et sw=2
1.5 +
1.6 +-- Configuration file for Io.
1.7 +
1.8 +local hw = Io.system_bus()
1.9 +
1.10 +Io.add_vbus("cpm", Io.Vi.System_bus
1.11 +{
1.12 + CPM = wrap(hw:match("jz4780-cpm"));
1.13 +})
1.14 +
1.15 +Io.add_vbus("gpio", Io.Vi.System_bus
1.16 +{
1.17 + GPIO = wrap(hw:match("jz4780-gpio"));
1.18 +})
1.19 +
1.20 +Io.add_vbus("lcd", Io.Vi.System_bus
1.21 +{
1.22 + LCD = wrap(hw:match("jz4780-lcd"));
1.23 +})
1.24 +
1.25 +Io.add_vbus("hdmi", Io.Vi.System_bus
1.26 +{
1.27 + HDMI = wrap(hw:match("jz4780-hdmi"));
1.28 +})
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2.2 +++ b/conf/landfall-examples/mips-ci20-fbdrv.cfg Wed Jun 17 00:20:06 2020 +0200
2.3 @@ -0,0 +1,70 @@
2.4 +-- vim: ft=lua ts=2 et sw=2
2.5 +
2.6 +-- Start the framebuffer driver with supporting devices.
2.7 +-- The target platform is the MIPS Creator CI20.
2.8 +
2.9 +local L4 = require("L4");
2.10 +
2.11 +local l = L4.default_loader;
2.12 +
2.13 +-- Define general access to peripherals.
2.14 +
2.15 +local io_buses = {
2.16 + cpm = l:new_channel();
2.17 + gpio = l:new_channel();
2.18 + hdmi = l:new_channel();
2.19 + lcd = l:new_channel();
2.20 + };
2.21 +
2.22 +l:start({
2.23 + caps = {
2.24 + cpm = io_buses.cpm:svr(),
2.25 + gpio = io_buses.gpio:svr(),
2.26 + hdmi = io_buses.hdmi:svr(),
2.27 + lcd = io_buses.lcd:svr(),
2.28 +
2.29 + icu = L4.Env.icu,
2.30 + sigma0 = L4.cast(L4.Proto.Factory, L4.Env.sigma0):create(L4.Proto.Sigma0),
2.31 + },
2.32 + },
2.33 + "rom/io rom/hw_devices.io rom/mips-ci20-common.io");
2.34 +
2.35 +-- Expose the CPM peripheral.
2.36 +
2.37 +local cpm = l:new_channel();
2.38 +
2.39 +l:start({
2.40 + caps = {
2.41 + vbus = io_buses.cpm,
2.42 + cpm = cpm:svr(),
2.43 + },
2.44 + },
2.45 + "rom/dev_cpm_jz4780");
2.46 +
2.47 +-- Expose a display device for the CI20.
2.48 +
2.49 +local display = l:new_channel(); -- exposes display device
2.50 +
2.51 +l:start({
2.52 + caps = {
2.53 + cpm = cpm,
2.54 + display = display:svr(),
2.55 + icu = L4.Env.icu,
2.56 + vbus = io_buses.hdmi, -- for HDMI resource access
2.57 + },
2.58 + },
2.59 + "rom/dev_display_ci20_hdmi");
2.60 +
2.61 +-- Expose a framebuffer device.
2.62 +
2.63 +local fbdrv_fb = l:new_channel();
2.64 +
2.65 +l:start({
2.66 + caps = {
2.67 + vbus = io_buses.lcd,
2.68 + fb = fbdrv_fb:svr(),
2.69 + cpm = cpm,
2.70 + display = display, -- needed by LCD driver
2.71 + },
2.72 + },
2.73 + "rom/fb-drv");
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
3.2 +++ b/conf/landfall-examples/mips-ci20-fbdrv.list Wed Jun 17 00:20:06 2020 +0200
3.3 @@ -0,0 +1,18 @@
3.4 +
3.5 +modaddr 0x1100000
3.6 +
3.7 +entry mips-ci20-fbdrv-example
3.8 +bootstrap bootstrap -serial
3.9 +kernel fiasco -serial_esc
3.10 +roottask moe rom/mips-ci20-fbdrv.cfg
3.11 +module mips-ci20-fbdrv.cfg
3.12 +module mips-ci20-common.io
3.13 +module plat-mips-ci20/hw_devices.io
3.14 +module l4re
3.15 +module io
3.16 +module ned
3.17 +module fb-drv
3.18 +module dev_display_ci20_hdmi
3.19 +module dev_cpm_jz4780
3.20 +module libpanel_ci20.so
3.21 +module mips-jz4740-panel.txt
4.1 --- a/conf/landfall-examples/mips-ci20-hdmi-i2c.cfg Sat Jun 06 22:07:55 2020 +0200
4.2 +++ b/conf/landfall-examples/mips-ci20-hdmi-i2c.cfg Wed Jun 17 00:20:06 2020 +0200
4.3 @@ -6,12 +6,12 @@
4.4
4.5 local io_buses =
4.6 {
4.7 - hdmi = l:new_channel();
4.8 + vbus = l:new_channel();
4.9 };
4.10
4.11 l:start({
4.12 caps = {
4.13 - hdmi = io_buses.hdmi:svr(),
4.14 + vbus = io_buses.vbus:svr(),
4.15 icu = L4.Env.icu,
4.16 sigma0 = L4.cast(L4.Proto.Factory, L4.Env.sigma0):create(L4.Proto.Sigma0),
4.17 },
4.18 @@ -23,7 +23,7 @@
4.19 l:start({
4.20 caps = {
4.21 icu = L4.Env.icu,
4.22 - vbus = io_buses.hdmi,
4.23 + vbus = io_buses.vbus,
4.24 },
4.25 },
4.26 "rom/ex_ci20_hdmi_i2c");
5.1 --- a/conf/landfall-examples/mips-ci20-hdmi-i2c.io Sat Jun 06 22:07:55 2020 +0200
5.2 +++ b/conf/landfall-examples/mips-ci20-hdmi-i2c.io Wed Jun 17 00:20:06 2020 +0200
5.3 @@ -7,7 +7,8 @@
5.4 {
5.5 CPM = wrap(hw:match("jz4780-cpm"));
5.6 GPIO = wrap(hw:match("jz4780-gpio"));
5.7 + LCD = wrap(hw:match("jz4780-lcd"));
5.8 HDMI = wrap(hw:match("jz4780-hdmi"));
5.9 }
5.10
5.11 -Io.add_vbus("hdmi", bus)
5.12 +Io.add_vbus("vbus", bus)
6.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
6.2 +++ b/conf/landfall-examples/mips-ci20-spectrum.cfg Wed Jun 17 00:20:06 2020 +0200
6.3 @@ -0,0 +1,97 @@
6.4 +-- vim: ft=lua ts=2 et sw=2
6.5 +
6.6 +-- Start Mag to multiplex the framebuffer showing only a single program.
6.7 +-- This example shows an animation showing off a spectrum of colours.
6.8 +-- The target platform is the MIPS Creator CI20.
6.9 +
6.10 +local L4 = require("L4");
6.11 +
6.12 +local l = L4.default_loader;
6.13 +
6.14 +-- Define general access to peripherals.
6.15 +
6.16 +local io_buses = {
6.17 + cpm = l:new_channel();
6.18 + gpio = l:new_channel();
6.19 + hdmi = l:new_channel();
6.20 + lcd = l:new_channel();
6.21 + };
6.22 +
6.23 +l:start({
6.24 + caps = {
6.25 + cpm = io_buses.cpm:svr(),
6.26 + gpio = io_buses.gpio:svr(),
6.27 + hdmi = io_buses.hdmi:svr(),
6.28 + lcd = io_buses.lcd:svr(),
6.29 +
6.30 + icu = L4.Env.icu,
6.31 + sigma0 = L4.cast(L4.Proto.Factory, L4.Env.sigma0):create(L4.Proto.Sigma0),
6.32 + },
6.33 + },
6.34 + "rom/io rom/hw_devices.io rom/mips-ci20-common.io");
6.35 +
6.36 +-- Expose the CPM peripheral.
6.37 +
6.38 +local cpm = l:new_channel();
6.39 +
6.40 +l:start({
6.41 + caps = {
6.42 + vbus = io_buses.cpm,
6.43 + cpm = cpm:svr(),
6.44 + },
6.45 + },
6.46 + "rom/dev_cpm_jz4780");
6.47 +
6.48 +-- Expose a display device for the CI20.
6.49 +
6.50 +local display = l:new_channel(); -- exposes display device
6.51 +
6.52 +l:start({
6.53 + caps = {
6.54 + cpm = cpm,
6.55 + display = display:svr(),
6.56 + icu = L4.Env.icu,
6.57 + vbus = io_buses.hdmi, -- for HDMI resource access
6.58 + },
6.59 + },
6.60 + "rom/dev_display_ci20_hdmi");
6.61 +
6.62 +-- Expose a framebuffer device.
6.63 +
6.64 +local fbdrv_fb = l:new_channel();
6.65 +
6.66 +l:start({
6.67 + caps = {
6.68 + vbus = io_buses.lcd,
6.69 + fb = fbdrv_fb:svr(),
6.70 + cpm = cpm,
6.71 + display = display, -- needed by LCD driver
6.72 + },
6.73 + },
6.74 + "rom/fb-drv");
6.75 +
6.76 +-- Multiplex the framebuffer.
6.77 +
6.78 +local mag_caps = {
6.79 + mag = l:new_channel(),
6.80 + svc = l:new_channel(),
6.81 + };
6.82 +
6.83 +l:start({
6.84 + caps = {
6.85 + vbus = io_buses.gpio, -- needed by input driver
6.86 + fb = fbdrv_fb,
6.87 + mag = mag_caps.mag:svr(),
6.88 + svc = mag_caps.svc:svr(),
6.89 + },
6.90 + },
6.91 + "rom/mag");
6.92 +
6.93 +-- Show the spectrum example.
6.94 +
6.95 +l:start({
6.96 + caps = {
6.97 + fb = mag_caps.svc:create(L4.Proto.Goos, "g=1280x1014+0+0", "barheight=10"),
6.98 + },
6.99 + },
6.100 + "rom/ex_fb_spectrum_cc");
7.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
7.2 +++ b/conf/landfall-examples/mips-ci20-spectrum.list Wed Jun 17 00:20:06 2020 +0200
7.3 @@ -0,0 +1,20 @@
7.4 +
7.5 +modaddr 0x1100000
7.6 +
7.7 +entry mips-ci20-spectrum-example
7.8 +bootstrap bootstrap -serial
7.9 +kernel fiasco -serial_esc
7.10 +roottask moe rom/mips-ci20-spectrum.cfg
7.11 +module mips-ci20-spectrum.cfg
7.12 +module mips-ci20-common.io
7.13 +module plat-mips-ci20/hw_devices.io
7.14 +module l4re
7.15 +module io
7.16 +module ned
7.17 +module fb-drv
7.18 +module mag
7.19 +module dev_display_ci20_hdmi
7.20 +module dev_cpm_jz4780
7.21 +module ex_fb_spectrum_cc
7.22 +module libpanel_ci20.so
7.23 +module mips-jz4740-panel.txt
8.1 --- a/docs/wiki/Getting_Started Sat Jun 06 22:07:55 2020 +0200
8.2 +++ b/docs/wiki/Getting_Started Wed Jun 17 00:20:06 2020 +0200
8.3 @@ -83,6 +83,8 @@
8.4 {{{
8.5 mkdir mybuild/images
8.6 cp conf/landfall-examples/mips-qi_lb60-keypad-demo.list conf/modules.list
8.7 +~/L4/Landfall/tools/listlibs.sh \
8.8 + conf/landfall-examples/mips-qi_lb60-keypad-demo.list >> conf/modules.list
8.9 make O=mybuild uimage E=mips-qi_lb60-keypad-demo-example
8.10 }}}
8.11
8.12 @@ -93,6 +95,11 @@
8.13 `conf/modules.list`, this being the place where the build system obtains the
8.14 details of the software to include in the payload.
8.15
8.16 +The module lists provide details of essential programs and resources but may
8.17 +also require libraries if shared libraries are being used. The `listlibs.sh`
8.18 +invocation produces a manifest of required libraries for a given list of
8.19 +programs or modules. This manifest augments the module list provided.
8.20 +
8.21 Finally, the make invocation combines programs and libraries found in the
8.22 `mybuild` directory and uses the indicated payload to construct, in this case,
8.23 an example demonstrating use of the Ben NanoNote's keypad.
9.1 --- a/pkg/devices/Control Sat Jun 06 22:07:55 2020 +0200
9.2 +++ b/pkg/devices/Control Wed Jun 17 00:20:06 2020 +0200
9.3 @@ -3,6 +3,7 @@
9.4 provides: devices-cpm-jz4730
9.5 provides: devices-cpm-jz4740
9.6 provides: devices-cpm-jz4780
9.7 +provides: devices-display-ci20_hdmi
9.8 provides: devices-display-letux400
9.9 provides: devices-display-qi_lb60
9.10 provides: devices-fb-jz4740
9.11 @@ -34,6 +35,7 @@
9.12 provides: libdrivers-common
9.13 provides: libdrivers-cpm
9.14 provides: libdrivers-gpio
9.15 +provides: libdrivers-hdmi-jz4780
9.16 provides: libdrivers-i2c
9.17 provides: libdrivers-keypad-headers
9.18 provides: libdrivers-keypad-letux400
9.19 @@ -41,6 +43,7 @@
9.20 provides: libdrivers-keypad-qi_lb60
9.21 provides: libdrivers-lcd-headers
9.22 provides: libdrivers-lcd-jz4740
9.23 +provides: libdrivers-panel-ci20
9.24 provides: libdrivers-panel-headers
9.25 provides: libdrivers-panel-letux400
9.26 provides: libdrivers-panel-loader
10.1 --- a/pkg/devices/Makefile Sat Jun 06 22:07:55 2020 +0200
10.2 +++ b/pkg/devices/Makefile Wed Jun 17 00:20:06 2020 +0200
10.3 @@ -11,7 +11,7 @@
10.4
10.5 backlight: pwm spi
10.6 cpm: lib util
10.7 -display: backlight lib util
10.8 +display: backlight cpm lib util
10.9 fb: lcd lib util
10.10 input: keypad lib
10.11 keypad: lib util
11.1 --- a/pkg/devices/cpm/include/cpm-client.h Sat Jun 06 22:07:55 2020 +0200
11.2 +++ b/pkg/devices/cpm/include/cpm-client.h Wed Jun 17 00:20:06 2020 +0200
11.3 @@ -1,7 +1,7 @@
11.4 /*
11.5 * CPM client to access CPM servers.
11.6 *
11.7 - * Copyright (C) 2018 Paul Boddie <paul@boddie.org.uk>
11.8 + * Copyright (C) 2018, 2020 Paul Boddie <paul@boddie.org.uk>
11.9 *
11.10 * This program is free software; you can redistribute it and/or
11.11 * modify it under the terms of the GNU General Public License as
11.12 @@ -31,9 +31,17 @@
11.13 L4_KOBJECT(Cpm_device_interface)
11.14
11.15 public:
11.16 + int get_lcd_pixel_frequency(uint32_t *frequency) throw();
11.17 +
11.18 + int set_hdmi_frequency(uint32_t frequency) throw();
11.19 int set_lcd_frequencies(uint32_t pclk, uint8_t multiplier) throw();
11.20 +
11.21 + int start_hdmi() throw();
11.22 + int stop_hdmi() throw();
11.23 +
11.24 int start_lcd() throw();
11.25 int stop_lcd() throw();
11.26 +
11.27 int update_output_frequency() throw();
11.28 };
11.29
12.1 --- a/pkg/devices/cpm/include/cpm-ops.h Sat Jun 06 22:07:55 2020 +0200
12.2 +++ b/pkg/devices/cpm/include/cpm-ops.h Wed Jun 17 00:20:06 2020 +0200
12.3 @@ -1,7 +1,7 @@
12.4 /*
12.5 * CPM server operations.
12.6 *
12.7 - * Copyright (C) 2018 Paul Boddie <paul@boddie.org.uk>
12.8 + * Copyright (C) 2018, 2020 Paul Boddie <paul@boddie.org.uk>
12.9 *
12.10 * This program is free software; you can redistribute it and/or
12.11 * modify it under the terms of the GNU General Public License as
12.12 @@ -26,4 +26,8 @@
12.13 Cpm_op_start_lcd,
12.14 Cpm_op_stop_lcd,
12.15 Cpm_op_update_output_frequency,
12.16 + Cpm_op_get_lcd_pixel_frequency,
12.17 + Cpm_op_set_hdmi_frequency,
12.18 + Cpm_op_start_hdmi,
12.19 + Cpm_op_stop_hdmi,
12.20 };
13.1 --- a/pkg/devices/cpm/src/client/cpm-client.cc Sat Jun 06 22:07:55 2020 +0200
13.2 +++ b/pkg/devices/cpm/src/client/cpm-client.cc Wed Jun 17 00:20:06 2020 +0200
13.3 @@ -1,7 +1,7 @@
13.4 /*
13.5 * CPM client to access CPM servers.
13.6 *
13.7 - * Copyright (C) 2018 Paul Boddie <paul@boddie.org.uk>
13.8 + * Copyright (C) 2018, 2020 Paul Boddie <paul@boddie.org.uk>
13.9 *
13.10 * This program is free software; you can redistribute it and/or
13.11 * modify it under the terms of the GNU General Public License as
13.12 @@ -26,6 +26,47 @@
13.13 #include "cpm-ops.h"
13.14
13.15 int
13.16 +Cpm_device_interface::get_lcd_pixel_frequency(uint32_t *frequency) throw()
13.17 +{
13.18 + L4::Ipc::Iostream s(l4_utcb());
13.19 + int err = l4_error(s.call(cap(), Cpm_op_get_lcd_pixel_frequency));
13.20 + uint32_t _frequency;
13.21 +
13.22 + if (err)
13.23 + return err;
13.24 +
13.25 + s >> _frequency;
13.26 + *frequency = _frequency;
13.27 + return L4_EOK;
13.28 +}
13.29 +
13.30 +int
13.31 +Cpm_device_interface::set_hdmi_frequency(uint32_t frequency) throw()
13.32 +{
13.33 + L4::Ipc::Iostream s(l4_utcb());
13.34 +
13.35 + s << frequency;
13.36 +
13.37 + return l4_error(s.call(cap(), Cpm_op_set_hdmi_frequency));
13.38 +}
13.39 +
13.40 +int
13.41 +Cpm_device_interface::start_hdmi() throw()
13.42 +{
13.43 + L4::Ipc::Iostream s(l4_utcb());
13.44 +
13.45 + return l4_error(s.call(cap(), Cpm_op_start_hdmi));
13.46 +}
13.47 +
13.48 +int
13.49 +Cpm_device_interface::stop_hdmi() throw()
13.50 +{
13.51 + L4::Ipc::Iostream s(l4_utcb());
13.52 +
13.53 + return l4_error(s.call(cap(), Cpm_op_stop_hdmi));
13.54 +}
13.55 +
13.56 +int
13.57 Cpm_device_interface::set_lcd_frequencies(uint32_t pclk, uint8_t multiplier) throw()
13.58 {
13.59 L4::Ipc::Iostream s(l4_utcb());
14.1 --- a/pkg/devices/cpm/src/server/cpm-server.cc Sat Jun 06 22:07:55 2020 +0200
14.2 +++ b/pkg/devices/cpm/src/server/cpm-server.cc Wed Jun 17 00:20:06 2020 +0200
14.3 @@ -1,7 +1,7 @@
14.4 /*
14.5 * Common CPM server functionality.
14.6 *
14.7 - * Copyright (C) 2018 Paul Boddie <paul@boddie.org.uk>
14.8 + * Copyright (C) 2018, 2020 Paul Boddie <paul@boddie.org.uk>
14.9 *
14.10 * This program is free software; you can redistribute it and/or
14.11 * modify it under the terms of the GNU General Public License as
14.12 @@ -43,6 +43,24 @@
14.13 case L4::Meta::Protocol:
14.14 return L4::Util::handle_meta_request<Cpm_device_interface>(ios);
14.15
14.16 + case Cpm_op_get_lcd_pixel_frequency:
14.17 + ios << _chip->get_lcd_pixel_frequency();
14.18 + return L4_EOK;
14.19 +
14.20 + case Cpm_op_set_hdmi_frequency:
14.21 + uint32_t frequency;
14.22 + ios >> frequency;
14.23 + _chip->set_hdmi_frequency(frequency);
14.24 + return L4_EOK;
14.25 +
14.26 + case Cpm_op_start_hdmi:
14.27 + _chip->start_hdmi();
14.28 + return L4_EOK;
14.29 +
14.30 + case Cpm_op_stop_hdmi:
14.31 + _chip->stop_hdmi();
14.32 + return L4_EOK;
14.33 +
14.34 case Cpm_op_set_lcd_frequencies:
14.35 uint32_t pclk;
14.36 int multiplier;
15.1 --- a/pkg/devices/display/src/Makefile Sat Jun 06 22:07:55 2020 +0200
15.2 +++ b/pkg/devices/display/src/Makefile Wed Jun 17 00:20:06 2020 +0200
15.3 @@ -1,6 +1,6 @@
15.4 PKGDIR ?= ../..
15.5 L4DIR ?= $(PKGDIR)/../..
15.6
15.7 -TARGET := client letux400 qi_lb60
15.8 +TARGET := ci20 client letux400 qi_lb60
15.9
15.10 include $(L4DIR)/mk/subdir.mk
16.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
16.2 +++ b/pkg/devices/display/src/ci20/Makefile Wed Jun 17 00:20:06 2020 +0200
16.3 @@ -0,0 +1,14 @@
16.4 +PKGDIR ?= ../../..
16.5 +L4DIR ?= $(PKGDIR)/../..
16.6 +
16.7 +TARGET = dev_display_ci20_hdmi
16.8 +MODE = shared
16.9 +PC_FILENAME := devices-display-ci20_hdmi
16.10 +
16.11 +SRC_CC := display-ci20_hdmi.cc
16.12 +
16.13 +PRIVATE_INCDIR += $(PKGDIR)/display/include
16.14 +
16.15 +REQUIRES_LIBS := l4re_c l4re_c-util libdevice-cpm-client libdrivers-hdmi-jz4780 libdrivers-lcd-jz4740 libdrivers-panel-loader libdevice-util
16.16 +
16.17 +include $(L4DIR)/mk/prog.mk
17.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
17.2 +++ b/pkg/devices/display/src/ci20/display-ci20_hdmi.cc Wed Jun 17 00:20:06 2020 +0200
17.3 @@ -0,0 +1,168 @@
17.4 +/*
17.5 + * Export MIPS Creator CI20 HDMI display operations as a server.
17.6 + *
17.7 + * Copyright (C) 2018, 2020 Paul Boddie <paul@boddie.org.uk>
17.8 + *
17.9 + * This program is free software; you can redistribute it and/or
17.10 + * modify it under the terms of the GNU General Public License as
17.11 + * published by the Free Software Foundation; either version 2 of
17.12 + * the License, or (at your option) any later version.
17.13 + *
17.14 + * This program is distributed in the hope that it will be useful,
17.15 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
17.16 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17.17 + * GNU General Public License for more details.
17.18 + *
17.19 + * You should have received a copy of the GNU General Public License
17.20 + * along with this program; if not, write to the Free Software
17.21 + * Foundation, Inc., 51 Franklin Street, Fifth Floor,
17.22 + * Boston, MA 02110-1301, USA
17.23 + */
17.24 +
17.25 +#include <l4/devices/cpm-client.h>
17.26 +#include <l4/devices/hdmi-jz4780.h>
17.27 +#include <l4/devices/lcd-jz4740-config.h>
17.28 +#include <l4/devices/lcd-jz4740-panel.h>
17.29 +#include <l4/devices/panel-loader.h>
17.30 +#include <l4/devices/memory.h>
17.31 +
17.32 +#include <l4/cxx/ipc_server>
17.33 +#include <l4/re/env>
17.34 +#include <l4/re/util/object_registry>
17.35 +#include <l4/sys/capability>
17.36 +#include <l4/sys/factory>
17.37 +#include <l4/sys/icu.h>
17.38 +
17.39 +#include "display-ops.h"
17.40 +
17.41 +/* Virtual addresses for the HDMI register block plus interrupt capability. */
17.42 +
17.43 +static l4_addr_t hdmi_virt_base = 0, hdmi_virt_base_end = 0;
17.44 +static l4_uint32_t hdmi_irq_start, hdmi_irq_end;
17.45 +static L4::Cap<L4::Irq> hdmi_irq;
17.46 +static L4::Cap<L4::Icu> icu;
17.47 +
17.48 +/* CPM device abstractions. */
17.49 +
17.50 +static Hdmi_jz4780_chip *hdmi = 0;
17.51 +static L4::Cap<Cpm_device_interface> cpm_device;
17.52 +
17.53 +
17.54 +
17.55 +static int setup_memory(void)
17.56 +{
17.57 + if (get_memory("jz4780-hdmi", &hdmi_virt_base, &hdmi_virt_base_end))
17.58 + return 1;
17.59 +
17.60 + if (get_irq("jz4780-hdmi", &hdmi_irq_start, &hdmi_irq_end))
17.61 + return 1;
17.62 +
17.63 + /* Obtain a reference to the CPM device. */
17.64 +
17.65 + cpm_device = L4Re::Env::env()->get_cap<Cpm_device_interface>("cpm");
17.66 + if (!cpm_device.is_valid()) return 1;
17.67 +
17.68 + /* Start the HDMI peripheral. */
17.69 +
17.70 + cpm_device->stop_hdmi();
17.71 + cpm_device->set_hdmi_frequency(27000000);
17.72 + cpm_device->start_hdmi();
17.73 +
17.74 + /* Load the panel data from the configured library. */
17.75 +
17.76 + struct Jz4740_lcd_panel *panel = (struct Jz4740_lcd_panel *) load_panel();
17.77 + if (!panel) return 1;
17.78 +
17.79 + /* Obtain access to the HDMI interrupt using the ICU. */
17.80 +
17.81 + icu = L4Re::Env::env()->get_cap<L4::Icu>("icu");
17.82 +
17.83 + hdmi_irq = L4Re::Util::cap_alloc.alloc<L4::Irq>();
17.84 + L4Re::Env::env()->factory()->create(hdmi_irq);
17.85 +
17.86 + if (!hdmi_irq.is_valid() || !icu.is_valid()) return 1;
17.87 +
17.88 + /* Bind the IRQ object to the interrupt in this thread. */
17.89 +
17.90 + int err = l4_error(icu->bind(hdmi_irq_start, hdmi_irq));
17.91 + if (err) return err;
17.92 +
17.93 + hdmi_irq->bind_thread(L4Re::Env::env()->main_thread(), 0);
17.94 +
17.95 + /* Obtain an abstraction for the HDMI peripheral. */
17.96 +
17.97 + hdmi = new Hdmi_jz4780_chip(hdmi_virt_base, hdmi_virt_base_end, hdmi_irq.cap(), panel);
17.98 +
17.99 + return 0;
17.100 +}
17.101 +
17.102 +
17.103 +
17.104 +/* Display device. */
17.105 +
17.106 +class Display_device_server : public L4::Server_object_t<L4::Kobject>
17.107 +{
17.108 +public:
17.109 + /* Dispatch incoming requests. */
17.110 +
17.111 + int dispatch(l4_umword_t obj, L4::Ipc::Iostream &ios)
17.112 + {
17.113 + l4_msgtag_t tag;
17.114 +
17.115 + (void) obj;
17.116 + ios >> tag;
17.117 +
17.118 + switch (tag.label())
17.119 + {
17.120 + case Display_op_disable:
17.121 + disable();
17.122 + return L4_EOK;
17.123 +
17.124 + case Display_op_enable:
17.125 + enable();
17.126 + return L4_EOK;
17.127 +
17.128 + default:
17.129 + return -L4_EBADPROTO;
17.130 + }
17.131 + }
17.132 +
17.133 + /* Switch the display off. */
17.134 +
17.135 + void disable(void)
17.136 + {
17.137 + }
17.138 +
17.139 + /* Switch the display on. */
17.140 +
17.141 + void enable(void)
17.142 + {
17.143 + uint32_t frequency;
17.144 +
17.145 + // NOTE: Should test to see if it is connected.
17.146 +
17.147 + if (!cpm_device->get_lcd_pixel_frequency(&frequency))
17.148 + {
17.149 + hdmi->enable(frequency);
17.150 + }
17.151 + }
17.152 +};
17.153 +
17.154 +static L4Re::Util::Registry_server<> server;
17.155 +
17.156 +
17.157 +
17.158 +int main(void)
17.159 +{
17.160 + if (setup_memory()) return 1;
17.161 +
17.162 + /* Initialise and register a new server object. */
17.163 +
17.164 + Display_device_server server_obj;
17.165 + server.registry()->register_obj(&server_obj, "display");
17.166 +
17.167 + /* Enter the IPC server loop. */
17.168 +
17.169 + server.loop();
17.170 + return 0;
17.171 +}
18.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
18.2 +++ b/pkg/devices/lcd/include/lcd-ci20.h Wed Jun 17 00:20:06 2020 +0200
18.3 @@ -0,0 +1,43 @@
18.4 +/*
18.5 + * LCD device support for the MIPS Creator CI20.
18.6 + *
18.7 + * Copyright (C) 2018, 2020 Paul Boddie <paul@boddie.org.uk>
18.8 + *
18.9 + * This program is free software; you can redistribute it and/or
18.10 + * modify it under the terms of the GNU General Public License as
18.11 + * published by the Free Software Foundation; either version 2 of
18.12 + * the License, or (at your option) any later version.
18.13 + *
18.14 + * This program is distributed in the hope that it will be useful,
18.15 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
18.16 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18.17 + * GNU General Public License for more details.
18.18 + *
18.19 + * You should have received a copy of the GNU General Public License
18.20 + * along with this program; if not, write to the Free Software
18.21 + * Foundation, Inc., 51 Franklin Street, Fifth Floor,
18.22 + * Boston, MA 02110-1301, USA
18.23 + */
18.24 +
18.25 +#pragma once
18.26 +
18.27 +#include "lcd-jz4740-device.h"
18.28 +
18.29 +#ifdef __cplusplus
18.30 +
18.31 +class Lcd_ci20 : public Lcd_jz4740_device
18.32 +{
18.33 +public:
18.34 + /* Inherit constructor. */
18.35 +
18.36 + Lcd_ci20(Lcd_chip *chip, L4::Cap<Display_device_interface> display)
18.37 + : Lcd_jz4740_device(chip, display)
18.38 + {
18.39 + }
18.40 +
18.41 + /* Common device instance. */
18.42 +
18.43 + static Lcd_ci20 *device;
18.44 +};
18.45 +
18.46 +#endif
19.1 --- a/pkg/devices/lcd/src/jz4740/lcd-jz4740-device.cc Sat Jun 06 22:07:55 2020 +0200
19.2 +++ b/pkg/devices/lcd/src/jz4740/lcd-jz4740-device.cc Wed Jun 17 00:20:06 2020 +0200
19.3 @@ -1,7 +1,7 @@
19.4 /*
19.5 * Common LCD device support for the JZ4740 and related SoCs.
19.6 *
19.7 - * Copyright (C) 2018 Paul Boddie <paul@boddie.org.uk>
19.8 + * Copyright (C) 2018, 2020 Paul Boddie <paul@boddie.org.uk>
19.9 *
19.10 * This program is free software; you can redistribute it and/or
19.11 * modify it under the terms of the GNU General Public License as
19.12 @@ -22,6 +22,7 @@
19.13 #include <l4/devices/cpm-client.h>
19.14 #include <l4/devices/display-client.h>
19.15 #include <l4/devices/lcd-jz4740.h>
19.16 +#include <l4/devices/lcd-jz4780.h>
19.17 #include <l4/devices/panel-loader.h>
19.18 #include <l4/devices/memory.h>
19.19 #include "lcd-jz4740-device.h"
19.20 @@ -88,16 +89,24 @@
19.21 {
19.22 Lcd_jz4740_chip *chip = static_cast<Lcd_jz4740_chip *>(_chip);
19.23
19.24 + // Initialise the clocks for the LCD controller. Without this, the controller
19.25 + // cannot be operated.
19.26 +
19.27 + set_timing();
19.28 +
19.29 + // Configure the controller.
19.30 +
19.31 chip->disable();
19.32 chip->config((struct Jz4740_lcd_descriptor *) desc_vaddr,
19.33 (struct Jz4740_lcd_descriptor *) desc_paddr,
19.34 fb_paddr);
19.35
19.36 - // Initialise the clocks for the LCD controller.
19.37 + // Activate the display channel.
19.38
19.39 - set_timing();
19.40 enable_display();
19.41
19.42 + // Activate the controller output.
19.43 +
19.44 chip->enable();
19.45 }
19.46
19.47 @@ -141,10 +150,12 @@
19.48
19.49 // Allocate memory for the framebuffer at 2**6 == 64 byte == 16 word alignment,
19.50 // also for the descriptors.
19.51 + // NOTE: A 64 word burst mode is available on the JZ4780 that would
19.52 + // NOTE: necessitate 64 word alignment for the framebuffer.
19.53
19.54 const l4_size_t alloc_flags = L4Re::Mem_alloc::Continuous | L4Re::Mem_alloc::Pinned;
19.55
19.56 - if (L4Re::Env::env()->mem_alloc()->alloc(fb_size, _fbmem, alloc_flags, 6) ||
19.57 + if (L4Re::Env::env()->mem_alloc()->alloc(fb_size, _fbmem, alloc_flags, 8) ||
19.58 L4Re::Env::env()->mem_alloc()->alloc(desc_size, descmem, alloc_flags, 6))
19.59 return 1;
19.60
19.61 @@ -197,6 +208,15 @@
19.62
19.63 switch (panel->bpp)
19.64 {
19.65 + // NOTE: 24bpp here is actually RGBA or RGB padded.
19.66 +
19.67 + case 24:
19.68 + view_info->pixel_info.bytes_per_pixel = 4;
19.69 + view_info->pixel_info.r.shift = 16; view_info->pixel_info.r.size = 8;
19.70 + view_info->pixel_info.g.shift = 8; view_info->pixel_info.g.size = 8;
19.71 + view_info->pixel_info.b.shift = 0; view_info->pixel_info.b.size = 8;
19.72 + break;
19.73 +
19.74 case 32:
19.75 view_info->pixel_info.r.shift = 16; view_info->pixel_info.r.size = 8;
19.76 view_info->pixel_info.g.shift = 8; view_info->pixel_info.g.size = 8;
19.77 @@ -231,8 +251,15 @@
19.78
19.79 static int setup_memory()
19.80 {
19.81 + bool is_jz4780 = false;
19.82 +
19.83 if (get_memory("jz4740-lcd", &lcd_virt_base, &lcd_virt_base_end))
19.84 - return 1;
19.85 + {
19.86 + if (get_memory("jz4780-lcd", &lcd_virt_base, &lcd_virt_base_end))
19.87 + return 1;
19.88 + else
19.89 + is_jz4780 = true;
19.90 + }
19.91
19.92 // Obtain access to the CPM and display devices.
19.93
19.94 @@ -248,7 +275,10 @@
19.95
19.96 // Initialise the LCD abstraction.
19.97
19.98 - lcd_chip = new Lcd_jz4740_chip(lcd_virt_base, panel);
19.99 + if (is_jz4780)
19.100 + lcd_chip = new Lcd_jz4780_chip(lcd_virt_base, panel);
19.101 + else
19.102 + lcd_chip = new Lcd_jz4740_chip(lcd_virt_base, panel);
19.103
19.104 return 0;
19.105 }
20.1 --- a/pkg/devices/lib/Makefile Sat Jun 06 22:07:55 2020 +0200
20.2 +++ b/pkg/devices/lib/Makefile Wed Jun 17 00:20:06 2020 +0200
20.3 @@ -1,12 +1,13 @@
20.4 PKGDIR ?= ..
20.5 L4DIR ?= $(PKGDIR)/../..
20.6
20.7 -TARGET := common cpm gpio i2c keypad lcd panel pwm
20.8 +TARGET := common cpm gpio hdmi i2c keypad lcd panel pwm
20.9
20.10 include $(L4DIR)/mk/subdir.mk
20.11
20.12 cpm: common
20.13 gpio: common
20.14 +hdmi: panel
20.15 i2c: common
20.16 keypad: common
20.17 lcd: common
21.1 --- a/pkg/devices/lib/cpm/include/cpm-jz4780.h Sat Jun 06 22:07:55 2020 +0200
21.2 +++ b/pkg/devices/lib/cpm/include/cpm-jz4780.h Wed Jun 17 00:20:06 2020 +0200
21.3 @@ -121,7 +121,8 @@
21.4 uint8_t get_hclock0_source();
21.5 uint8_t get_hclock2_source();
21.6 uint8_t get_hdmi_source();
21.7 - uint8_t get_lcd_source(uint8_t controller = 0);
21.8 + uint8_t get_lcd_source(uint8_t controller);
21.9 + uint8_t get_lcd_source() { return get_lcd_source(0); }
21.10 uint8_t get_memory_source();
21.11 uint8_t get_pclock_source();
21.12
21.13 @@ -129,7 +130,8 @@
21.14 uint32_t get_hclock0_source_frequency();
21.15 uint32_t get_hclock2_source_frequency();
21.16 uint32_t get_hdmi_source_frequency();
21.17 - uint32_t get_lcd_source_frequency(uint8_t controller = 0);
21.18 + uint32_t get_lcd_source_frequency(uint8_t controller);
21.19 + uint32_t get_lcd_source_frequency() { return get_lcd_source_frequency(0); }
21.20 uint32_t get_memory_source_frequency();
21.21 uint32_t get_pclock_source_frequency();
21.22
21.23 @@ -139,7 +141,8 @@
21.24 uint32_t get_hclock0_frequency();
21.25 uint32_t get_hclock2_frequency();
21.26 uint32_t get_hdmi_frequency();
21.27 - uint32_t get_lcd_pixel_frequency(uint8_t controller = 0);
21.28 + uint32_t get_lcd_pixel_frequency(uint8_t controller);
21.29 + uint32_t get_lcd_pixel_frequency() { return get_lcd_pixel_frequency(0); }
21.30 uint32_t get_memory_frequency();
21.31 uint32_t get_pclock_frequency();
21.32
22.1 --- a/pkg/devices/lib/cpm/include/cpm.h Sat Jun 06 22:07:55 2020 +0200
22.2 +++ b/pkg/devices/lib/cpm/include/cpm.h Wed Jun 17 00:20:06 2020 +0200
22.3 @@ -1,7 +1,7 @@
22.4 /*
22.5 * Clock and power management (CPM) abstractions.
22.6 *
22.7 - * Copyright (C) 2017, 2018 Paul Boddie <paul@boddie.org.uk>
22.8 + * Copyright (C) 2017, 2018, 2020 Paul Boddie <paul@boddie.org.uk>
22.9 *
22.10 * This program is free software; you can redistribute it and/or
22.11 * modify it under the terms of the GNU General Public License as
22.12 @@ -33,6 +33,13 @@
22.13 class Cpm_chip
22.14 {
22.15 public:
22.16 + virtual uint32_t get_lcd_pixel_frequency() = 0;
22.17 +
22.18 + virtual void set_hdmi_frequency(uint32_t) { }
22.19 +
22.20 + virtual void start_hdmi() { }
22.21 + virtual void stop_hdmi() { }
22.22 +
22.23 virtual void set_lcd_frequencies(uint32_t pclk, uint8_t ratio) = 0;
22.24
22.25 virtual void start_lcd() = 0;
23.1 --- a/pkg/devices/lib/hdmi/src/Makefile Sat Jun 06 22:07:55 2020 +0200
23.2 +++ b/pkg/devices/lib/hdmi/src/Makefile Wed Jun 17 00:20:06 2020 +0200
23.3 @@ -1,8 +1,8 @@
23.4 PKGDIR ?= ../../..
23.5 L4DIR ?= $(PKGDIR)/../..
23.6
23.7 -TARGET = libhdmi.o.a
23.8 -PC_FILENAME := libdrivers-hdmi
23.9 +TARGET = libhdmi_jz4780.o.a
23.10 +PC_FILENAME := libdrivers-hdmi-jz4780
23.11
23.12 SRC_CC := jz4780.cc
23.13
24.1 --- a/pkg/devices/lib/panel/src/Makefile Sat Jun 06 22:07:55 2020 +0200
24.2 +++ b/pkg/devices/lib/panel/src/Makefile Wed Jun 17 00:20:06 2020 +0200
24.3 @@ -1,6 +1,6 @@
24.4 PKGDIR ?= ../../..
24.5 L4DIR ?= $(PKGDIR)/../..
24.6
24.7 -TARGET := letux400 loader qi_lb60
24.8 +TARGET := ci20 letux400 loader qi_lb60
24.9
24.10 include $(L4DIR)/mk/subdir.mk
25.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
25.2 +++ b/pkg/devices/lib/panel/src/ci20/Makefile Wed Jun 17 00:20:06 2020 +0200
25.3 @@ -0,0 +1,13 @@
25.4 +PKGDIR ?= ../../../..
25.5 +L4DIR ?= $(PKGDIR)/../..
25.6 +
25.7 +TARGET = libpanel_ci20.so
25.8 +PC_FILENAME := libdrivers-panel-ci20
25.9 +
25.10 +SRC_C := panel-ci20.c
25.11 +
25.12 +PRIVATE_INCDIR += $(PKGDIR)/lib/panel/include
25.13 +
25.14 +REQUIRES_LIBS := libdrivers-lcd-headers
25.15 +
25.16 +include $(L4DIR)/mk/lib.mk
26.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
26.2 +++ b/pkg/devices/lib/panel/src/ci20/panel-ci20.c Wed Jun 17 00:20:06 2020 +0200
26.3 @@ -0,0 +1,61 @@
26.4 +/*
26.5 + * Export a panel structure for the MIPS Creator CI20.
26.6 + *
26.7 + * Copyright (C) 2018, 2020 Paul Boddie <paul@boddie.org.uk>
26.8 + *
26.9 + * This program is free software; you can redistribute it and/or
26.10 + * modify it under the terms of the GNU General Public License as
26.11 + * published by the Free Software Foundation; either version 2 of
26.12 + * the License, or (at your option) any later version.
26.13 + *
26.14 + * This program is distributed in the hope that it will be useful,
26.15 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
26.16 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26.17 + * GNU General Public License for more details.
26.18 + *
26.19 + * You should have received a copy of the GNU General Public License
26.20 + * along with this program; if not, write to the Free Software
26.21 + * Foundation, Inc., 51 Franklin Street, Fifth Floor,
26.22 + * Boston, MA 02110-1301, USA
26.23 + */
26.24 +
26.25 +#include <l4/devices/lcd-jz4740-config.h>
26.26 +#include <l4/devices/lcd-jz4740-panel.h>
26.27 +
26.28 +static struct Jz4740_lcd_panel panel = {
26.29 + .config = (
26.30 + Jz4740_lcd_mode_tft_generic
26.31 + | Jz4740_lcd_bpp_24
26.32 + | Jz4740_lcd_desc_8_word
26.33 + | Jz4740_lcd_underrun_recover
26.34 + | Jz4740_lcd_ps_disabled
26.35 + | Jz4740_lcd_cls_disabled
26.36 + | Jz4740_lcd_spl_disabled
26.37 + | Jz4740_lcd_rev_disabled
26.38 + | Jz4740_lcd_pclock_negative
26.39 + | Jz4740_lcd_hsync_positive
26.40 + | Jz4740_lcd_vsync_positive
26.41 + | Jz4740_lcd_de_positive),
26.42 +
26.43 + // NOTE: To be configured using the HDMI DDC mechanism.
26.44 +
26.45 + .width = 1280,
26.46 + .height = 1024,
26.47 + .bpp = 24,
26.48 + .frame_rate = 60,
26.49 + .hsync = 112,
26.50 + .vsync = 3,
26.51 + .line_start = 248, // back porch (blanking - hsync - offset)
26.52 + .line_end = 48, // front porch (sync offset)
26.53 + .frame_start = 36, // back porch (blanking - vsync - offset)
26.54 + .frame_end = 3, // front porch (sync offset)
26.55 +};
26.56 +
26.57 +/* Employ an opaque pointer type. */
26.58 +
26.59 +void *panel_get(void);
26.60 +
26.61 +void *panel_get(void)
26.62 +{
26.63 + return &panel;
26.64 +}
27.1 --- a/pkg/devices/util/include/memory.h Sat Jun 06 22:07:55 2020 +0200
27.2 +++ b/pkg/devices/util/include/memory.h Wed Jun 17 00:20:06 2020 +0200
27.3 @@ -1,7 +1,7 @@
27.4 /*
27.5 - * Memory allocation utility functions.
27.6 + * Memory and resource allocation utility functions.
27.7 *
27.8 - * Copyright (C) 2018 Paul Boddie <paul@boddie.org.uk>
27.9 + * Copyright (C) 2018, 2019 Paul Boddie <paul@boddie.org.uk>
27.10 *
27.11 * This program is free software; you can redistribute it and/or
27.12 * modify it under the terms of the GNU General Public License as
27.13 @@ -25,10 +25,16 @@
27.14 #include <l4/re/env.h>
27.15 #include <l4/util/util.h>
27.16
27.17 +EXTERN_C_BEGIN
27.18 +
27.19 int get_device(char const *hid, l4io_device_handle_t *dh,
27.20 l4io_resource_handle_t *rh);
27.21
27.22 +int get_irq(char const *hid, l4_uint32_t *start, l4_uint32_t *end);
27.23 +
27.24 int get_resource(l4io_device_handle_t dh, l4io_resource_t *res,
27.25 enum l4io_resource_types_t type);
27.26
27.27 int get_memory(char const *hid, l4_addr_t *start, l4_addr_t *end);
27.28 +
27.29 +EXTERN_C_END
28.1 --- a/pkg/devices/util/src/memory.cc Sat Jun 06 22:07:55 2020 +0200
28.2 +++ b/pkg/devices/util/src/memory.cc Wed Jun 17 00:20:06 2020 +0200
28.3 @@ -1,7 +1,7 @@
28.4 /*
28.5 - * Memory allocation utility functions.
28.6 + * Memory and resource allocation utility functions.
28.7 *
28.8 - * Copyright (C) 2018 Paul Boddie <paul@boddie.org.uk>
28.9 + * Copyright (C) 2018, 2019 Paul Boddie <paul@boddie.org.uk>
28.10 *
28.11 * This program is free software; you can redistribute it and/or
28.12 * modify it under the terms of the GNU General Public License as
28.13 @@ -33,6 +33,29 @@
28.14 return l4io_lookup_device(hid, dh, 0, rh);
28.15 }
28.16
28.17 +int get_irq(char const *hid, l4_uint32_t *start, l4_uint32_t *end)
28.18 +{
28.19 + l4io_device_handle_t dh;
28.20 + l4io_resource_handle_t rh;
28.21 + l4io_resource_t res;
28.22 + int result;
28.23 +
28.24 + result = get_device(hid, &dh, &rh);
28.25 +
28.26 + if (result < 0)
28.27 + return result;
28.28 +
28.29 + result = get_resource(dh, &res, L4IO_RESOURCE_IRQ);
28.30 +
28.31 + if (result)
28.32 + return result;
28.33 +
28.34 + *start = res.start;
28.35 + *end = res.end;
28.36 +
28.37 + return result;
28.38 +}
28.39 +
28.40 int get_resource(l4io_device_handle_t dh, l4io_resource_t *res,
28.41 enum l4io_resource_types_t type)
28.42 {
29.1 --- a/pkg/landfall-examples/ci20_hdmi_i2c/Makefile Sat Jun 06 22:07:55 2020 +0200
29.2 +++ b/pkg/landfall-examples/ci20_hdmi_i2c/Makefile Wed Jun 17 00:20:06 2020 +0200
29.3 @@ -6,6 +6,6 @@
29.4
29.5 CFLAGS_ci20_hdmi_i2c.c = -include $(PKGDIR)/ci20_hdmi_i2c/P8021407-crop-1280x1024-16c.c
29.6
29.7 -REQUIRES_LIBS = libio l4re_c-util libdevice-util libdrivers-cpm libdrivers-hdmi libdrivers-lcd-jz4740 libdrivers-gpio libedid
29.8 +REQUIRES_LIBS = libio l4re_c-util libdevice-util libdrivers-cpm libdrivers-hdmi-jz4780 libdrivers-lcd-jz4740 libdrivers-gpio libedid
29.9
29.10 include $(L4DIR)/mk/prog.mk