diff options
author | Koen Kooi <koen@openembedded.org> | 2009-06-10 19:46:52 +0200 |
---|---|---|
committer | Koen Kooi <koen@openembedded.org> | 2009-06-10 19:46:52 +0200 |
commit | c34afca7ebd0868fa78ded64c5cd2fd53b4d78bc (patch) | |
tree | a19914c937408dad038c1b26ba8c47d4a4d2e745 /recipes/libdlo | |
parent | d302cb3796aea6f77e3a32ae2e5d6c807ddbbcd0 (diff) |
kernel-module-udlfb: update to 0.2.3
Diffstat (limited to 'recipes/libdlo')
-rw-r--r-- | recipes/libdlo/kernel-module-udlfb.bb | 2 | ||||
-rw-r--r-- | recipes/libdlo/kernel-module-udlfb/udlfb.c | 38 | ||||
-rw-r--r-- | recipes/libdlo/kernel-module-udlfb/udlfb.h | 18 |
3 files changed, 44 insertions, 14 deletions
diff --git a/recipes/libdlo/kernel-module-udlfb.bb b/recipes/libdlo/kernel-module-udlfb.bb index 55262d22c9..10e83c4caa 100644 --- a/recipes/libdlo/kernel-module-udlfb.bb +++ b/recipes/libdlo/kernel-module-udlfb.bb @@ -1,7 +1,7 @@ DESCRIPTION = "Framebuffer console driver for displaylink based usb devices" LICENSE = "GPLv2" -PV = "0.2.2" +PV = "0.2.3" SRC_URI = "file://udlfb.c \ file://udlfb.h \ diff --git a/recipes/libdlo/kernel-module-udlfb/udlfb.c b/recipes/libdlo/kernel-module-udlfb/udlfb.c index 96fdb3e7d5..abeca9bd12 100644 --- a/recipes/libdlo/kernel-module-udlfb/udlfb.c +++ b/recipes/libdlo/kernel-module-udlfb/udlfb.c @@ -7,6 +7,7 @@ * Based on the amazing work of Florian Echtler and libdlo 0.1 * * * * * + * 10.06.09 release 0.2.3 (edid ioctl, fallback for unsupported modes) * * 05.06.09 release 0.2.2 (real screen blanking, rle compression, double buffer) * * 31.05.09 release 0.2 * * 22.05.09 First public (ugly) release * @@ -600,10 +601,21 @@ static int dlfb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg) { struct dlfb_data *dev_info = info->par; - struct dloarea *area = (struct dloarea *)arg; + struct dloarea *area = NULL; + + if (cmd == 0xAD) { + char *edid = (char *)arg; + dlfb_edid(dev_info); + if (copy_to_user(edid, dev_info->edid, 128)) { + return -EFAULT; + } + return 0; + } - if (cmd == 0xAA || cmd == 0xAB) { + if (cmd == 0xAA || cmd == 0xAB || cmd == 0xAC) { + + area = (struct dloarea *)arg; if (area->x < 0) @@ -714,7 +726,6 @@ dlfb_probe(struct usb_interface *interface, const struct usb_device_id *id) { struct dlfb_data *dev_info; struct fb_info *info; - int i; int ret; char rbuf[4]; @@ -755,15 +766,7 @@ dlfb_probe(struct usb_interface *interface, const struct usb_device_id *id) printk("ret control msg 0: %d %x%x%x%x\n", ret, rbuf[0], rbuf[1], rbuf[2], rbuf[3]); - for (i = 0; i < 128; i++) { - ret = - usb_control_msg(dev_info->udev, - usb_rcvctrlpipe(dev_info->udev, 0), (0x02), - (0x80 | (0x02 << 5)), i << 8, 0xA1, rbuf, 2, - 0); - /* printk("ret control msg edid %d: %d [%d]\n",i, ret, rbuf[1]); */ - dev_info->edid[i] = rbuf[1]; - } + dlfb_edid(dev_info); info = framebuffer_alloc(sizeof(u32) * 256, &dev_info->udev->dev); @@ -775,6 +778,10 @@ dlfb_probe(struct usb_interface *interface, const struct usb_device_id *id) fb_parse_edid(dev_info->edid, &info->var); printk("EDID XRES %d YRES %d\n", info->var.xres, info->var.yres); + if (info->var.xres == 0 || info->var.yres == 0) { + info->var.xres = 800; + info->var.yres = 480; + } if (dlfb_set_video_mode(dev_info, info->var.xres, info->var.yres) != 0) goto out; @@ -828,7 +835,12 @@ dlfb_probe(struct usb_interface *interface, const struct usb_device_id *id) info->fix.smem_start = (unsigned long)info->screen_base; info->fix.smem_len = PAGE_ALIGN(dev_info->screen_size); - memcpy(info->fix.id, "DisplayLink FB", 14); + if (strlen(dev_info->udev->product) > 15) { + memcpy(info->fix.id, dev_info->udev->product, 15); + } + else { + memcpy(info->fix.id, dev_info->udev->product, strlen(dev_info->udev->product)); + } info->fix.type = FB_TYPE_PACKED_PIXELS; info->fix.visual = FB_VISUAL_TRUECOLOR; info->fix.accel = info->flags; diff --git a/recipes/libdlo/kernel-module-udlfb/udlfb.h b/recipes/libdlo/kernel-module-udlfb/udlfb.h index f0508628f0..d587088913 100644 --- a/recipes/libdlo/kernel-module-udlfb/udlfb.h +++ b/recipes/libdlo/kernel-module-udlfb/udlfb.h @@ -50,6 +50,24 @@ static void dlfb_bulk_callback(struct urb *urb) } +static void dlfb_edid(struct dlfb_data *dev_info) +{ + int i; + int ret; + char rbuf[2]; + + for (i = 0; i < 128; i++) { + ret = + usb_control_msg(dev_info->udev, + usb_rcvctrlpipe(dev_info->udev, 0), (0x02), + (0x80 | (0x02 << 5)), i << 8, 0xA1, rbuf, 2, + 0); + /*printk("ret control msg edid %d: %d [%d]\n",i, ret, rbuf[1]);*/ + dev_info->edid[i] = rbuf[1]; + } + +} + static int dlfb_bulk_msg(struct dlfb_data *dev_info, int len) { |