mirror of
https://github.com/genodelabs/genode.git
synced 2025-05-29 05:34:23 +00:00
Implement platform driver for i.MX53 platform
Move clock and reset controller functionality out of framebuffer driver into platform driver.
This commit is contained in:
parent
d2f5deaf33
commit
4fe158a320
@ -46,6 +46,9 @@ namespace Genode
|
|||||||
AIPS_1_MMIO_BASE = 0x53f00000,
|
AIPS_1_MMIO_BASE = 0x53f00000,
|
||||||
AIPS_2_MMIO_BASE = 0x63f00000,
|
AIPS_2_MMIO_BASE = 0x63f00000,
|
||||||
|
|
||||||
|
IOMUXC_BASE = 0x53fa8000,
|
||||||
|
IOMUXC_SIZE = 0x00004000,
|
||||||
|
|
||||||
IPU_ERR_IRQ = 10,
|
IPU_ERR_IRQ = 10,
|
||||||
IPU_SYNC_IRQ = 11,
|
IPU_SYNC_IRQ = 11,
|
||||||
IPU_BASE = 0x18000000,
|
IPU_BASE = 0x18000000,
|
||||||
|
22
os/include/platform/imx53/platform_session/capability.h
Normal file
22
os/include/platform/imx53/platform_session/capability.h
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
* \brief Platform session capability type
|
||||||
|
* \author Stefan Kalkowski
|
||||||
|
* \date 2013-04-29
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2013 Genode Labs GmbH
|
||||||
|
*
|
||||||
|
* This file is part of the Genode OS framework, which is distributed
|
||||||
|
* under the terms of the GNU General Public License version 2.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _INCLUDE__PLATFORM_SESSION__CAPABILITY_H_
|
||||||
|
#define _INCLUDE__PLATFORM_SESSION__CAPABILITY_H_
|
||||||
|
|
||||||
|
#include <base/capability.h>
|
||||||
|
#include <platform_session/platform_session.h>
|
||||||
|
|
||||||
|
namespace Platform { typedef Genode::Capability<Session> Session_capability; }
|
||||||
|
|
||||||
|
#endif /* _INCLUDE__PLATFORM_SESSION__CAPABILITY_H_ */
|
35
os/include/platform/imx53/platform_session/client.h
Normal file
35
os/include/platform/imx53/platform_session/client.h
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* \brief i.MX53 specific platform session client side
|
||||||
|
* \author Stefan Kalkowski <stefan.kalkowski@genode-labs.com
|
||||||
|
* \date 2013-04-29
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2013 Genode Labs GmbH
|
||||||
|
*
|
||||||
|
* This file is part of the Genode OS framework, which is distributed
|
||||||
|
* under the terms of the GNU General Public License version 2.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _INCLUDE__PLATFORM_SESSION__CLIENT_H_
|
||||||
|
#define _INCLUDE__PLATFORM_SESSION__CLIENT_H_
|
||||||
|
|
||||||
|
#include <base/capability.h>
|
||||||
|
#include <base/rpc.h>
|
||||||
|
#include <platform_session/platform_session.h>
|
||||||
|
|
||||||
|
namespace Platform {
|
||||||
|
|
||||||
|
struct Client : Genode::Rpc_client<Session>
|
||||||
|
{
|
||||||
|
explicit Client(Capability<Session> session)
|
||||||
|
: Genode::Rpc_client<Session>(session) { }
|
||||||
|
|
||||||
|
void enable(Device dev) { call<Rpc_enable>(dev); }
|
||||||
|
void disable(Device dev) { call<Rpc_disable>(dev); }
|
||||||
|
void clock_rate(Device dev, unsigned long rate) {
|
||||||
|
call<Rpc_clock_rate>(dev, rate); }
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* _INCLUDE__PLATFORM_SESSION__CLIENT_H_ */
|
37
os/include/platform/imx53/platform_session/connection.h
Normal file
37
os/include/platform/imx53/platform_session/connection.h
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* \brief Connection to platform service
|
||||||
|
* \author Stefan Kalkowski
|
||||||
|
* \date 2013-04-29
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2013 Genode Labs GmbH
|
||||||
|
*
|
||||||
|
* This file is part of the Genode OS framework, which is distributed
|
||||||
|
* under the terms of the GNU General Public License version 2.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _INCLUDE__PLATFORM_SESSION__CONNECTION_H_
|
||||||
|
#define _INCLUDE__PLATFORM_SESSION__CONNECTION_H_
|
||||||
|
|
||||||
|
#include <platform_session/client.h>
|
||||||
|
#include <util/arg_string.h>
|
||||||
|
#include <base/connection.h>
|
||||||
|
|
||||||
|
namespace Platform {
|
||||||
|
|
||||||
|
class Connection : public Genode::Connection<Session>,
|
||||||
|
public Client
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*/
|
||||||
|
Connection()
|
||||||
|
: Genode::Connection<Session>(session("ram_quota=4K")),
|
||||||
|
Client(cap()) { }
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* _INCLUDE__PLATFORM_SESSION__CONNECTION_H_ */
|
@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* \brief i.MX53 specific platform session
|
||||||
|
* \author Stefan Kalkowski <stefan.kalkowski@genode-labs.com
|
||||||
|
* \date 2013-04-29
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2013 Genode Labs GmbH
|
||||||
|
*
|
||||||
|
* This file is part of the Genode OS framework, which is distributed
|
||||||
|
* under the terms of the GNU General Public License version 2.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _INCLUDE__PLATFORM_SESSION__PLATFORM_SESSION_H_
|
||||||
|
#define _INCLUDE__PLATFORM_SESSION__PLATFORM_SESSION_H_
|
||||||
|
|
||||||
|
#include <base/capability.h>
|
||||||
|
#include <base/rpc.h>
|
||||||
|
|
||||||
|
namespace Platform {
|
||||||
|
|
||||||
|
struct Session : Genode::Session
|
||||||
|
{
|
||||||
|
enum Device { IPU };
|
||||||
|
|
||||||
|
static const char *service_name() { return "Platform"; }
|
||||||
|
|
||||||
|
virtual ~Session() { }
|
||||||
|
|
||||||
|
virtual void enable(Device dev) = 0;
|
||||||
|
virtual void disable(Device dev) = 0;
|
||||||
|
virtual void clock_rate(Device dev, unsigned long rate) = 0;
|
||||||
|
|
||||||
|
|
||||||
|
/*********************
|
||||||
|
** RPC declaration **
|
||||||
|
*********************/
|
||||||
|
|
||||||
|
GENODE_RPC(Rpc_enable, void, enable, Device);
|
||||||
|
GENODE_RPC(Rpc_disable, void, disable, Device);
|
||||||
|
GENODE_RPC(Rpc_clock_rate, void, clock_rate, Device, unsigned long);
|
||||||
|
|
||||||
|
GENODE_RPC_INTERFACE(Rpc_enable, Rpc_disable, Rpc_clock_rate);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* _INCLUDE__PLATFORM_SESSION__PLATFORM_SESSION_H_ */
|
@ -10,8 +10,9 @@ set build_components {
|
|||||||
drivers/framebuffer drivers/pci drivers/input
|
drivers/framebuffer drivers/pci drivers/input
|
||||||
}
|
}
|
||||||
|
|
||||||
lappend_if [have_spec usb] build_components drivers/usb
|
lappend_if [have_spec usb] build_components drivers/usb
|
||||||
lappend_if [have_spec gpio] build_components drivers/gpio
|
lappend_if [have_spec gpio] build_components drivers/gpio
|
||||||
|
lappend_if [have_spec imx53] build_components drivers/platform
|
||||||
|
|
||||||
build $build_components
|
build $build_components
|
||||||
|
|
||||||
@ -68,6 +69,14 @@ append_if [have_spec gpio] config {
|
|||||||
<config/>
|
<config/>
|
||||||
</start>}
|
</start>}
|
||||||
|
|
||||||
|
append_if [have_spec imx53] config {
|
||||||
|
<start name="platform_drv">
|
||||||
|
<resource name="RAM" quantum="1M"/>
|
||||||
|
<provides><service name="Platform"/></provides>
|
||||||
|
<config/>
|
||||||
|
</start>
|
||||||
|
}
|
||||||
|
|
||||||
append_if [have_spec ps2] config {
|
append_if [have_spec ps2] config {
|
||||||
<start name="ps2_drv">
|
<start name="ps2_drv">
|
||||||
<resource name="RAM" quantum="1M"/>
|
<resource name="RAM" quantum="1M"/>
|
||||||
@ -116,6 +125,7 @@ lappend_if [have_spec ps2] boot_modules ps2_drv
|
|||||||
lappend_if [have_spec framebuffer] boot_modules fb_drv
|
lappend_if [have_spec framebuffer] boot_modules fb_drv
|
||||||
lappend_if [have_spec usb] boot_modules usb_drv
|
lappend_if [have_spec usb] boot_modules usb_drv
|
||||||
lappend_if [have_spec gpio] boot_modules gpio_drv
|
lappend_if [have_spec gpio] boot_modules gpio_drv
|
||||||
|
lappend_if [have_spec imx53] boot_modules platform_drv
|
||||||
|
|
||||||
build_boot_image $boot_modules
|
build_boot_image $boot_modules
|
||||||
|
|
||||||
|
@ -1,67 +0,0 @@
|
|||||||
/*
|
|
||||||
* \brief Clock control module
|
|
||||||
* \author Nikolay Golikov <nik@ksyslabs.org>
|
|
||||||
* \date 2012-10-09
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (C) 2012 Ksys Labs LLC
|
|
||||||
* Copyright (C) 2012 Genode Labs GmbH
|
|
||||||
*
|
|
||||||
* This file is part of the Genode OS framework, which is distributed
|
|
||||||
* under the terms of the GNU General Public License version 2.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _CCM_H_
|
|
||||||
#define _CCM_H_
|
|
||||||
|
|
||||||
/* Genode includes */
|
|
||||||
#include <util/mmio.h>
|
|
||||||
|
|
||||||
struct Ccm : Genode::Mmio
|
|
||||||
{
|
|
||||||
enum { IPU_CLK = 133000000 };
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Control divider register
|
|
||||||
*/
|
|
||||||
struct Ccdr : Register<0x4, 32>
|
|
||||||
{
|
|
||||||
struct Ipu_hs_mask : Bitfield <21, 1> { };
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Low power control register
|
|
||||||
*/
|
|
||||||
struct Clpcr : Register<0x54, 32>
|
|
||||||
{
|
|
||||||
struct Bypass_ipu_hs : Bitfield<18, 1> { };
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
struct Cccr5 : Register<0x7c, 32>
|
|
||||||
{
|
|
||||||
struct Ipu_clk_en : Bitfield<10, 2> { };
|
|
||||||
};
|
|
||||||
|
|
||||||
void ipu_clk_enable(void)
|
|
||||||
{
|
|
||||||
write<Cccr5::Ipu_clk_en>(3);
|
|
||||||
write<Ccdr::Ipu_hs_mask>(0);
|
|
||||||
write<Clpcr::Bypass_ipu_hs>(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ipu_clk_disable(void)
|
|
||||||
{
|
|
||||||
write<Cccr5::Ipu_clk_en>(0);
|
|
||||||
write<Ccdr::Ipu_hs_mask>(1);
|
|
||||||
write<Clpcr::Bypass_ipu_hs>(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
Ccm(Genode::addr_t const mmio_base) : Genode::Mmio(mmio_base) { }
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* _CCM_H_ */
|
|
@ -9,12 +9,11 @@
|
|||||||
#include <os/attached_io_mem_dataspace.h>
|
#include <os/attached_io_mem_dataspace.h>
|
||||||
#include <io_mem_session/connection.h>
|
#include <io_mem_session/connection.h>
|
||||||
#include <gpio_session/connection.h>
|
#include <gpio_session/connection.h>
|
||||||
|
#include <platform_session/connection.h>
|
||||||
#include <util/mmio.h>
|
#include <util/mmio.h>
|
||||||
|
|
||||||
/* local includes */
|
/* local includes */
|
||||||
#include <ipu.h>
|
#include <ipu.h>
|
||||||
#include <src.h>
|
|
||||||
#include <ccm.h>
|
|
||||||
|
|
||||||
|
|
||||||
namespace Framebuffer {
|
namespace Framebuffer {
|
||||||
@ -27,18 +26,9 @@ class Framebuffer::Driver
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
/* Clocks control module */
|
Platform::Connection _platform;
|
||||||
Attached_io_mem_dataspace _ccm_mmio;
|
Attached_io_mem_dataspace _ipu_mmio; /* Image processing unit memory */
|
||||||
Ccm _ccm;
|
|
||||||
|
|
||||||
/* System reset controller registers */
|
|
||||||
Attached_io_mem_dataspace _src_mmio;
|
|
||||||
Src _src;
|
|
||||||
|
|
||||||
/* Image processing unit memory */
|
|
||||||
Attached_io_mem_dataspace _ipu_mmio;
|
|
||||||
Ipu _ipu;
|
Ipu _ipu;
|
||||||
|
|
||||||
Gpio::Connection _gpio;
|
Gpio::Connection _gpio;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -64,19 +54,13 @@ class Framebuffer::Driver
|
|||||||
|
|
||||||
|
|
||||||
Driver()
|
Driver()
|
||||||
: _ccm_mmio(Board_base::CCM_BASE, Board_base::CCM_SIZE),
|
: _ipu_mmio(Board_base::IPU_BASE, Board_base::IPU_SIZE),
|
||||||
_ccm((addr_t)_ccm_mmio.local_addr<void>()),
|
|
||||||
_src_mmio(Board_base::SRC_BASE, Board_base::SRC_SIZE),
|
|
||||||
_src((addr_t)_src_mmio.local_addr<void>()),
|
|
||||||
_ipu_mmio(Board_base::IPU_BASE, Board_base::IPU_SIZE),
|
|
||||||
_ipu((addr_t)_ipu_mmio.local_addr<void>()) { }
|
_ipu((addr_t)_ipu_mmio.local_addr<void>()) { }
|
||||||
|
|
||||||
bool init(addr_t phys_base)
|
bool init(addr_t phys_base)
|
||||||
{
|
{
|
||||||
/* reset ipu over src */
|
/* enable IPU via platform driver */
|
||||||
_src.write<Src::Ctrl_reg::Ipu_rst>(1);
|
_platform.enable(Platform::Session::IPU);
|
||||||
|
|
||||||
_ccm.ipu_clk_enable();
|
|
||||||
|
|
||||||
_ipu.init(WIDTH, HEIGHT, WIDTH * BYTES_PER_PIXEL, phys_base);
|
_ipu.init(WIDTH, HEIGHT, WIDTH * BYTES_PER_PIXEL, phys_base);
|
||||||
|
|
||||||
@ -85,6 +69,5 @@ class Framebuffer::Driver
|
|||||||
_gpio.direction_output(LCD_CONT_GPIO, true);
|
_gpio.direction_output(LCD_CONT_GPIO, true);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,31 +0,0 @@
|
|||||||
/*
|
|
||||||
* \brief System reset controller registers
|
|
||||||
* \author Nikolay Golikov <nik@ksyslabs.org>
|
|
||||||
* \date 2012-11-06
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (C) 2012 Ksys Labs LLC
|
|
||||||
* Copyright (C) 2012 Genode Labs GmbH
|
|
||||||
*
|
|
||||||
* This file is part of the Genode OS framework, which is distributed
|
|
||||||
* under the terms of the GNU General Public License version 2.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _SRC_H_
|
|
||||||
#define _SRC_H_
|
|
||||||
|
|
||||||
/* Genode includes */
|
|
||||||
#include <util/mmio.h>
|
|
||||||
|
|
||||||
struct Src : Genode::Mmio
|
|
||||||
{
|
|
||||||
Src(Genode::addr_t const mmio_base) : Genode::Mmio(mmio_base) { }
|
|
||||||
|
|
||||||
struct Ctrl_reg : Register<0x0, 32>
|
|
||||||
{
|
|
||||||
struct Ipu_rst : Bitfield<3, 1> { };
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* _SRC_H_ */
|
|
71
os/src/drivers/platform/imx53/ccm.h
Normal file
71
os/src/drivers/platform/imx53/ccm.h
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
* \brief Clock control module register description
|
||||||
|
* \author Nikolay Golikov <nik@ksyslabs.org>
|
||||||
|
* \author Stefan Kalkowski <stefan.kalkowski@genode-labs.com>
|
||||||
|
* \date 2013-04-29
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2013 Genode Labs GmbH
|
||||||
|
*
|
||||||
|
* This file is part of the Genode OS framework, which is distributed
|
||||||
|
* under the terms of the GNU General Public License version 2.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _DRIVERS__PLATFORM__IMX53__CCM_H_
|
||||||
|
#define _DRIVERS__PLATFORM__IMX53__CCM_H_
|
||||||
|
|
||||||
|
/* Genode includes */
|
||||||
|
#include <util/mmio.h>
|
||||||
|
#include <drivers/board_base.h>
|
||||||
|
#include <os/attached_io_mem_dataspace.h>
|
||||||
|
|
||||||
|
class Ccm : public Genode::Attached_io_mem_dataspace,
|
||||||
|
Genode::Mmio
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Control divider register
|
||||||
|
*/
|
||||||
|
struct Ccdr : Register<0x4, 32>
|
||||||
|
{
|
||||||
|
struct Ipu_hs_mask : Bitfield <21, 1> { };
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Low power control register
|
||||||
|
*/
|
||||||
|
struct Clpcr : Register<0x54, 32>
|
||||||
|
{
|
||||||
|
struct Bypass_ipu_hs : Bitfield<18, 1> { };
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Cccr5 : Register<0x7c, 32>
|
||||||
|
{
|
||||||
|
struct Ipu_clk_en : Bitfield<10, 2> { };
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
Ccm()
|
||||||
|
: Genode::Attached_io_mem_dataspace(Genode::Board_base::CCM_BASE,
|
||||||
|
Genode::Board_base::CCM_SIZE),
|
||||||
|
Genode::Mmio((Genode::addr_t)local_addr<void>()) {}
|
||||||
|
|
||||||
|
void ipu_clk_enable(void)
|
||||||
|
{
|
||||||
|
write<Cccr5::Ipu_clk_en>(3);
|
||||||
|
write<Ccdr::Ipu_hs_mask>(0);
|
||||||
|
write<Clpcr::Bypass_ipu_hs>(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ipu_clk_disable(void)
|
||||||
|
{
|
||||||
|
write<Cccr5::Ipu_clk_en>(0);
|
||||||
|
write<Ccdr::Ipu_hs_mask>(1);
|
||||||
|
write<Clpcr::Bypass_ipu_hs>(1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* _DRIVERS__PLATFORM__IMX53__CCM_H_ */
|
33
os/src/drivers/platform/imx53/iomux.h
Normal file
33
os/src/drivers/platform/imx53/iomux.h
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* \brief IOMUX controller register description
|
||||||
|
* \author Stefan Kalkowski <stefan.kalkowski@genode-labs.com>
|
||||||
|
* \date 2013-04-29
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2013 Genode Labs GmbH
|
||||||
|
*
|
||||||
|
* This file is part of the Genode OS framework, which is distributed
|
||||||
|
* under the terms of the GNU General Public License version 2.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _DRIVERS__PLATFORM__IMX53__IOMUX_H_
|
||||||
|
#define _DRIVERS__PLATFORM__IMX53__IOMUX_H_
|
||||||
|
|
||||||
|
/* Genode includes */
|
||||||
|
#include <util/mmio.h>
|
||||||
|
#include <drivers/board_base.h>
|
||||||
|
#include <os/attached_io_mem_dataspace.h>
|
||||||
|
|
||||||
|
class Iomux : public Genode::Attached_io_mem_dataspace,
|
||||||
|
Genode::Mmio
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
Iomux()
|
||||||
|
: Genode::Attached_io_mem_dataspace(Genode::Board_base::IOMUXC_BASE,
|
||||||
|
Genode::Board_base::IOMUXC_SIZE),
|
||||||
|
Genode::Mmio((Genode::addr_t)local_addr<void>()) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* _DRIVERS__PLATFORM__IMX53__IOMUX_H_ */
|
120
os/src/drivers/platform/imx53/main.cc
Normal file
120
os/src/drivers/platform/imx53/main.cc
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
/*
|
||||||
|
* \brief Driver for i.MX53 specific platform devices (clocks, power, etc.)
|
||||||
|
* \author Stefan Kalkowski <stefan.kalkowski@genode-labs.com>
|
||||||
|
* \date 2013-04-29
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2013 Genode Labs GmbH
|
||||||
|
*
|
||||||
|
* This file is part of the Genode OS framework, which is distributed
|
||||||
|
* under the terms of the GNU General Public License version 2.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <base/printf.h>
|
||||||
|
#include <base/sleep.h>
|
||||||
|
#include <base/rpc_server.h>
|
||||||
|
#include <cap_session/connection.h>
|
||||||
|
#include <root/component.h>
|
||||||
|
#include <platform_session/platform_session.h>
|
||||||
|
|
||||||
|
#include <iomux.h>
|
||||||
|
#include <ccm.h>
|
||||||
|
#include <src.h>
|
||||||
|
|
||||||
|
|
||||||
|
namespace Platform {
|
||||||
|
class Session_component;
|
||||||
|
class Root;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class Platform::Session_component : public Genode::Rpc_object<Platform::Session>
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
Iomux &_iomux; /* I/O multiplexer device */
|
||||||
|
Ccm &_ccm; /* clock control module */
|
||||||
|
Src &_src; /* system reset controller */
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*/
|
||||||
|
Session_component(Iomux &iomux, Ccm &ccm, Src &src)
|
||||||
|
: _iomux(iomux), _ccm(ccm), _src(src) {}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************
|
||||||
|
** Platform session interface **
|
||||||
|
**********************************/
|
||||||
|
|
||||||
|
void enable(Device dev)
|
||||||
|
{
|
||||||
|
switch (dev) {
|
||||||
|
case Session::IPU:
|
||||||
|
_src.reset_ipu();
|
||||||
|
_ccm.ipu_clk_enable();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
PWRN("Invalid device");
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
void disable(Device dev)
|
||||||
|
{
|
||||||
|
switch (dev) {
|
||||||
|
case Session::IPU:
|
||||||
|
_ccm.ipu_clk_disable();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
PWRN("Invalid device");
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
void clock_rate(Device dev, unsigned long rate)
|
||||||
|
{
|
||||||
|
switch (dev) {
|
||||||
|
default:
|
||||||
|
PWRN("Invalid device");
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class Platform::Root : public Genode::Root_component<Platform::Session_component>
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
Iomux _iomux;
|
||||||
|
Ccm _ccm;
|
||||||
|
Src _src;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
Session_component *_create_session(const char *args) {
|
||||||
|
return new (md_alloc()) Session_component(_iomux, _ccm, _src); }
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
Root(Genode::Rpc_entrypoint *session_ep,
|
||||||
|
Genode::Allocator *md_alloc)
|
||||||
|
: Genode::Root_component<Session_component>(session_ep, md_alloc) { }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
int main(int, char **)
|
||||||
|
{
|
||||||
|
using namespace Genode;
|
||||||
|
|
||||||
|
PINF("--- i.MX53 platform driver ---\n");
|
||||||
|
|
||||||
|
static Cap_connection cap;
|
||||||
|
static Rpc_entrypoint ep(&cap, 4096, "imx53_plat_ep");
|
||||||
|
static Platform::Root plat_root(&ep, env()->heap());
|
||||||
|
env()->parent()->announce(ep.manage(&plat_root));
|
||||||
|
|
||||||
|
sleep_forever();
|
||||||
|
return 0;
|
||||||
|
}
|
43
os/src/drivers/platform/imx53/src.h
Normal file
43
os/src/drivers/platform/imx53/src.h
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* \brief System reset controller register description
|
||||||
|
* \author Nikolay Golikov <nik@ksyslabs.org>
|
||||||
|
* \author Stefan Kalkowski <stefan.kalkowski@genode-labs.com>
|
||||||
|
* \date 2013-04-29
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2013 Genode Labs GmbH
|
||||||
|
*
|
||||||
|
* This file is part of the Genode OS framework, which is distributed
|
||||||
|
* under the terms of the GNU General Public License version 2.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _DRIVERS__PLATFORM__IMX53__SRC_H_
|
||||||
|
#define _DRIVERS__PLATFORM__IMX53__SRC_H_
|
||||||
|
|
||||||
|
/* Genode includes */
|
||||||
|
#include <util/mmio.h>
|
||||||
|
#include <drivers/board_base.h>
|
||||||
|
#include <os/attached_io_mem_dataspace.h>
|
||||||
|
|
||||||
|
class Src : public Genode::Attached_io_mem_dataspace,
|
||||||
|
Genode::Mmio
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
struct Ctrl_reg : Register<0x0, 32>
|
||||||
|
{
|
||||||
|
struct Ipu_rst : Bitfield<3, 1> { };
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
Src()
|
||||||
|
: Genode::Attached_io_mem_dataspace(Genode::Board_base::SRC_BASE,
|
||||||
|
Genode::Board_base::SRC_SIZE),
|
||||||
|
Genode::Mmio((Genode::addr_t)local_addr<void>()) {}
|
||||||
|
|
||||||
|
void reset_ipu() { write<Ctrl_reg::Ipu_rst>(1); }
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* _DRIVERS__PLATFORM__IMX53__SRC_H_ */
|
5
os/src/drivers/platform/imx53/target.mk
Normal file
5
os/src/drivers/platform/imx53/target.mk
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
TARGET = platform_drv
|
||||||
|
REQUIRES = imx53
|
||||||
|
SRC_CC = main.cc
|
||||||
|
INC_DIR += ${PRG_DIR}
|
||||||
|
LIBS = base
|
Loading…
x
Reference in New Issue
Block a user