diff options
Diffstat (limited to 'roms/u-boot/drivers/demo')
| -rw-r--r-- | roms/u-boot/drivers/demo/Makefile | 9 | ||||
| -rw-r--r-- | roms/u-boot/drivers/demo/demo-pdata.c | 47 | ||||
| -rw-r--r-- | roms/u-boot/drivers/demo/demo-shape.c | 127 | ||||
| -rw-r--r-- | roms/u-boot/drivers/demo/demo-simple.c | 47 | ||||
| -rw-r--r-- | roms/u-boot/drivers/demo/demo-uclass.c | 58 | 
5 files changed, 288 insertions, 0 deletions
| diff --git a/roms/u-boot/drivers/demo/Makefile b/roms/u-boot/drivers/demo/Makefile new file mode 100644 index 00000000..baaa2baa --- /dev/null +++ b/roms/u-boot/drivers/demo/Makefile @@ -0,0 +1,9 @@ +# +# Copyright (c) 2013 Google, Inc +# +# SPDX-License-Identifier:	GPL-2.0+ +# + +obj-$(CONFIG_DM_DEMO) += demo-uclass.o demo-pdata.o +obj-$(CONFIG_DM_DEMO_SIMPLE) += demo-simple.o +obj-$(CONFIG_DM_DEMO_SHAPE) += demo-shape.o diff --git a/roms/u-boot/drivers/demo/demo-pdata.c b/roms/u-boot/drivers/demo/demo-pdata.c new file mode 100644 index 00000000..e92841db --- /dev/null +++ b/roms/u-boot/drivers/demo/demo-pdata.c @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2013 Google, Inc + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#include <common.h> +#include <dm.h> +#include <dm-demo.h> + +static const struct dm_demo_pdata red_square = { +	.colour = "red", +	.sides = 4. +}; +static const struct dm_demo_pdata green_triangle = { +	.colour = "green", +	.sides = 3. +}; +static const struct dm_demo_pdata yellow_hexagon = { +	.colour = "yellow", +	.sides = 6. +}; + +U_BOOT_DEVICE(demo0) = { +	.name = "demo_shape_drv", +	.platdata = &red_square, +}; + +U_BOOT_DEVICE(demo1) = { +	.name = "demo_simple_drv", +	.platdata = &red_square, +}; + +U_BOOT_DEVICE(demo2) = { +	.name = "demo_shape_drv", +	.platdata = &green_triangle, +}; + +U_BOOT_DEVICE(demo3) = { +	.name = "demo_simple_drv", +	.platdata = &yellow_hexagon, +}; + +U_BOOT_DEVICE(demo4) = { +	.name = "demo_shape_drv", +	.platdata = &yellow_hexagon, +}; diff --git a/roms/u-boot/drivers/demo/demo-shape.c b/roms/u-boot/drivers/demo/demo-shape.c new file mode 100644 index 00000000..2f0eb96b --- /dev/null +++ b/roms/u-boot/drivers/demo/demo-shape.c @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2013 Google, Inc + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#include <common.h> +#include <dm.h> +#include <errno.h> +#include <fdtdec.h> +#include <malloc.h> +#include <dm-demo.h> +#include <asm/io.h> + +DECLARE_GLOBAL_DATA_PTR; + +/* Shape size */ +#define WIDTH	8 +#define HEIGHT	6 + +struct shape_data { +	int num_chars;	/* Number of non-space characters output so far */ +}; + +/* Crazy little function to draw shapes on the console */ +static int shape_hello(struct device *dev, int ch) +{ +	const struct dm_demo_pdata *pdata = dev_get_platdata(dev); +	struct shape_data *data = dev_get_priv(dev); +	static const struct shape { +		int start; +		int end; +		int dstart; +		int dend; +	} shapes[3] = { +		{ 0, 1, 0, 1 }, +		{ 0, WIDTH, 0, 0 }, +		{ HEIGHT / 2 - 1, WIDTH - HEIGHT / 2 + 1, -1, 1}, +	}; +	struct shape shape; +	unsigned int index; +	int line, pos, inside; +	const char *colour = pdata->colour; +	int first = 0; + +	if (!ch) +		ch = pdata->default_char; +	if (!ch) +		ch = '@'; + +	index = (pdata->sides / 2) - 1; +	if (index >= ARRAY_SIZE(shapes)) +		return -EIO; +	shape = shapes[index]; + +	for (line = 0; line < HEIGHT; line++) { +		first = 1; +		for (pos = 0; pos < WIDTH; pos++) { +			inside = pos >= shape.start && pos < shape.end; +			if (inside) { +				putc(first ? *colour++ : ch); +				data->num_chars++; +				first = 0; +				if (!*colour) +					colour = pdata->colour; +			} else { +				putc(' '); +			} +		} +		putc('\n'); +		shape.start += shape.dstart; +		shape.end += shape.dend; +		if (shape.start < 0) { +			shape.dstart = -shape.dstart; +			shape.dend = -shape.dend; +			shape.start += shape.dstart; +			shape.end += shape.dend; +		} +	} + +	return 0; +} + +static int shape_status(struct device *dev, int *status) +{ +	struct shape_data *data = dev_get_priv(dev); + +	*status = data->num_chars; +	return 0; +} + +static const struct demo_ops shape_ops = { +	.hello = shape_hello, +	.status = shape_status, +}; + +static int shape_ofdata_to_platdata(struct device *dev) +{ +	struct dm_demo_pdata *pdata = dev_get_platdata(dev); +	int ret; + +	/* Parse the data that is common with all demo devices */ +	ret = demo_parse_dt(dev); +	if (ret) +		return ret; + +	/* Parse the data that only we need */ +	pdata->default_char = fdtdec_get_int(gd->fdt_blob, dev->of_offset, +					     "character", '@'); + +	return 0; +} + +static const struct device_id demo_shape_id[] = { +	{ "demo-shape", 0 }, +	{ }, +}; + +U_BOOT_DRIVER(demo_shape_drv) = { +	.name	= "demo_shape_drv", +	.of_match = demo_shape_id, +	.id	= UCLASS_DEMO, +	.ofdata_to_platdata = shape_ofdata_to_platdata, +	.ops	= &shape_ops, +	.priv_auto_alloc_size = sizeof(struct shape_data), +	.platdata_auto_alloc_size = sizeof(struct dm_demo_pdata), +}; diff --git a/roms/u-boot/drivers/demo/demo-simple.c b/roms/u-boot/drivers/demo/demo-simple.c new file mode 100644 index 00000000..6ba81317 --- /dev/null +++ b/roms/u-boot/drivers/demo/demo-simple.c @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2013 Google, Inc + * + * (C) Copyright 2012 + * Pavel Herrmann <morpheus.ibis@gmail.com> + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#include <common.h> +#include <dm.h> +#include <dm-demo.h> +#include <asm/io.h> + +static int simple_hello(struct device *dev, int ch) +{ +	const struct dm_demo_pdata *pdata = dev_get_platdata(dev); + +	printf("Hello from %08x: %s %d\n", map_to_sysmem(dev), pdata->colour, +	       pdata->sides); + +	return 0; +} + +static const struct demo_ops simple_ops = { +	.hello = simple_hello, +}; + +static int demo_shape_ofdata_to_platdata(struct device *dev) +{ +	/* Parse the data that is common with all demo devices */ +	return demo_parse_dt(dev); +} + +static const struct device_id demo_shape_id[] = { +	{ "demo-simple", 0 }, +	{ }, +}; + +U_BOOT_DRIVER(demo_simple_drv) = { +	.name	= "demo_simple_drv", +	.of_match = demo_shape_id, +	.id	= UCLASS_DEMO, +	.ofdata_to_platdata = demo_shape_ofdata_to_platdata, +	.ops	= &simple_ops, +	.platdata_auto_alloc_size = sizeof(struct dm_demo_pdata), +}; diff --git a/roms/u-boot/drivers/demo/demo-uclass.c b/roms/u-boot/drivers/demo/demo-uclass.c new file mode 100644 index 00000000..48588be9 --- /dev/null +++ b/roms/u-boot/drivers/demo/demo-uclass.c @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2013 Google, Inc + * + * (C) Copyright 2012 + * Pavel Herrmann <morpheus.ibis@gmail.com> + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#include <common.h> +#include <dm.h> +#include <dm-demo.h> +#include <errno.h> +#include <fdtdec.h> +#include <malloc.h> +#include <asm/io.h> +#include <linux/list.h> + +DECLARE_GLOBAL_DATA_PTR; + +UCLASS_DRIVER(demo) = { +	.id		= UCLASS_DEMO, +}; + +int demo_hello(struct device *dev, int ch) +{ +	const struct demo_ops *ops = device_get_ops(dev); + +	if (!ops->hello) +		return -ENOSYS; + +	return ops->hello(dev, ch); +} + +int demo_status(struct device *dev, int *status) +{ +	const struct demo_ops *ops = device_get_ops(dev); + +	if (!ops->status) +		return -ENOSYS; + +	return ops->status(dev, status); +} + +int demo_parse_dt(struct device *dev) +{ +	struct dm_demo_pdata *pdata = dev_get_platdata(dev); +	int dn = dev->of_offset; + +	pdata->sides = fdtdec_get_int(gd->fdt_blob, dn, "sides", 0); +	pdata->colour = fdt_getprop(gd->fdt_blob, dn, "colour", NULL); +	if (!pdata->sides || !pdata->colour) { +		debug("%s: Invalid device tree data\n", __func__); +		return -EINVAL; +	} + +	return 0; +} | 
