[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [microblaze-uclinux] VGA controller in Microblaze
Hi John,
Thanks for your help, it helped me to understand better how to work
with new devices and drivers. As you told me, I created a file
xilinxfb.c in arch/microblaze/platform/common, which content is:
#include <linux/autoconf.h>
#include <linux/init.h>
#include <linux/resource.h>
#include <linux/xilinx_devices.h>
/* Fake definitions of IRQ channels for XGPIOs that don't actually have one.
This is not super clean, but it does allow us to use a generic
platform_device initialiser macro - see below */
#ifndef CONFIG_XILINX_TFT_0_IRQ
#define CONFIG_XILINX_TFT_0_IRQ -1L
#endif
#ifndef CONFIG_XILINX_TFT_1_IRQ
#define CONFIG_XILINX_TFT_1_IRQ -1L
#endif
#ifndef CONFIG_XILINX_TFT_2_IRQ
#define CONFIG_XILINX_TFT_2_IRQ -1L
#endif
#ifndef CONFIG_XILINX_TFT_3_IRQ
#define CONFIG_XILINX_TFT_3_IRQ -1L
#endif
#ifndef CONFIG_XILINX_TFT_4_IRQ
#define CONFIG_XILINX_TFT_4_IRQ -1L
#endif
#ifndef CONFIG_XILINX_TFT_5_IRQ
#define CONFIG_XILINX_TFT_5_IRQ -1L
#endif
/* Generic XGPIO platform_device initialiser macro. Sinec we can nets #ifdef
conditionals inside macros, we have two resources for each device, but in
non-IRQ peripherals, the resource type is set to zero, otherwise it's
IORESOURCE_IRQ as expected. The kernel will just ignore zero-flagged
resources. We waste a small number of bytes - c'est la vie*/
#define XILINX_FB_PLATFORM_INITIALISER(n) \
{ \
.name = "xilinxfb", \
.id = (n), \
.dev.platform_data = 0, \
.num_resources = 2, \
.resource = (struct resource[]) { \
{ \
.start = CONFIG_XILINX_TFT_##n##_SPLB_BASEADDR, \
.end = CONFIG_XILINX_TFT_##n##_SPLB_HIGHADDR, \
.flags = IORESOURCE_IO, \
}, \
{ \
.start = CONFIG_XILINX_TFT_##n##_IRQ, \
.end = CONFIG_XILINX_TFT_##n##_IRQ, \
.flags = IORESOURCE_IRQ, \
}, \
}, \
}
// dev.platform_data se define como 0. En el archivo
.../drivers/video/xilinxfb.c se utiliza un platform_data por defecto
que define de la resolucion de la pantalla 640x480. Si aquí definimos
un platform_data, utiliza estos para aplicar la resolución y si no lo
definimos utiliza los que vienen por defecto.
// num_resources lo definimos igual a 2, así lo hace el resto de los
drivers en esta carpeta excepto xgpio (parece que este parámetro
depende de si hay interrupciones?).
// Será necesario definir la direccion donde se encuentra el
framebuffer? (parece que no, debería buscarla usando baseaddr).
static struct platform_device xilinx_fb_device[]= {
#ifdef CONFIG_XILINX_TFT_0_INSTANCE
XILINX_FB_PLATFORM_INITIALISER(0),
#endif
#ifdef CONFIG_XILINX_TFT_1_INSTANCE
XILINX_FB_PLATFORM_INITIALISER(1),
#endif
#ifdef CONFIG_XILINX_TFT_2_INSTANCE
XILINX_FB_PLATFORM_INITIALISER(2),
#endif
#ifdef CONFIG_XILINX_TFT_3_INSTANCE
XILINX_FB_PLATFORM_INITIALISER(3),
#endif
#ifdef CONFIG_XILINX_TFT_4_INSTANCE
XILINX_FB_PLATFORM_INITIALISER(4),
#endif
#ifdef CONFIG_XILINX_TFT_5_INSTANCE
XILINX_FB_PLATFORM_INITIALISER(5),
#endif
};
static int __init xilinx_fb_platform_init(void)
{
int i;
for(i=0;i<ARRAY_SIZE(xilinx_fb_device); i++)
platform_device_register(&xilinx_fb_device[i]);
return 0;
}
device_initcall(xilinx_fb_platform_init);
As a result, now I have a xilinxfb device:
# ls /sys/bus/platform/devices/
i8042 uartlite.0 xilinx_gpio.0 xilinx_gpio.1 xilinxfb.0
However this device is not assigned to fb0. I receive the following
message when booting the board:
xilinxfb xilinxfb.0: regs: phys=86e00000, virt=86e00000
xilinxfb xilinxfb.0: fb: phys=8fc00000, virt=8fc00000, size=1e0000
However there are no messages about the framebuffer. Moreover, when I
try to see the I/O memory space I obtain the following:
# cat /proc/iomem
81400000-8140ffff : xilinx_gpio.0
81400000-8140ffff : xilinx_gpio
81420000-8142ffff : xilinx_gpio.1
81420000-8142ffff : xilinx_gpio
84000000-8400ffff : uartlite.0
84000000-8400000f : uartlite
86e00000-86e00007 : xilinxfb
As you can see, there is no memory assigned to xilinxfb.o. I am surely
missing some steps when creating the framebuffer but I am not able to
see where is the error. Do you have any hint about what I am not doing
right?
Thanks a lot for your kind help John.
Regards,
Pablo Colodron
John Williams escribió:
Hi Pablo,
On Wed, Mar 25, 2009 at 8:50 PM, <pcolodron@xxxxxxxx> wrote:
Hi Inaki,
That is what I was checking just right now :) I have found out that although
it enters in function 'platform_driver_register', it does not enter in
function 'xilinxfb_platform_probe', which is the one that initialize the
framebuffer. I don't know why this happens but I'll try to figure it out...
Thanks a lot for your help Inaki. I'll let you know my progress.
The problem is that you have not registered a platform device - that
is the kernel doesn't know you have a xilinx_fb device in the system,
so it never calls the _probe() function.
To do this, look in arch/microblaze/platform/common - you need to
create a file called xilinxfb.c here. Link it in to the Makefile of
this directory.
This code must create a platform_device structure, and then call
platform_device_register() on that object.
There are other examples in this same directory for other devices -
e.g. xilinx_spi.c. The pattern should be clear.
Regards,
John
___________________________
microblaze-uclinux mailing list
microblaze-uclinux@xxxxxxxxxxxxxx
Project Home Page : http://www.itee.uq.edu.au/~jwilliams/mblaze-uclinux
Mailing List Archive :
http://www.itee.uq.edu.au/~listarch/microblaze-uclinux/
___________________________
microblaze-uclinux mailing list
microblaze-uclinux@xxxxxxxxxxxxxx
Project Home Page : http://www.itee.uq.edu.au/~jwilliams/mblaze-uclinux
Mailing List Archive : http://www.itee.uq.edu.au/~listarch/microblaze-uclinux/