Hi Hans, On Thu, Jan 14, 2010 at 1:25 PM, Hans Verkuil <hverkuil@xxxxxxxxx> wrote: > >> Hi, >> >> >> On Thu, Jan 14, 2010 at 11:35 AM, Michael Qiu <fallwind@xxxxxxxxx> wrote: >>> Hi guys, >>> I'm going to write drivers for a new soc which designed for dvb-s set >>> top box. >>> It will support these features: >>> 1. Multi-layer display with alpha blending feature, including >>> video(YUV), OSDs(2 same RGB layers), background(with fixed YUV color) >>> and still picture(YUV color for still image) >>> 2. DVB-S tuner and demod >>> 3. HW MPEG2/4 decoder >>> 4. HW accelerated JPEG decoder engine. >>> >>> My targets are: >>> 1. Fit all the drivers in proper framework so they can be easily used >>> by applications in open source community. >>> 2. As flexible as I can to add new software features in the future. >>> >>> My questions are: >>> How many drivers should I implement, and how should I divide all the >>> features? >>> As far as I know: >>> A) a frame buffer driver for 2 OSDs, maybe also the control point for >>> whole display module? >>> B) video output device for video layer, which will output video program. >>> C) drivers for tuner and demo (or just a driver which will export 2 >>> devices files for each?) >>> D) driver for jpeg accelerate interface, or should it be a part of >>> MPEG2/4 decoder driver? >>> E) driver for MPEG2/4 decoder which will control the behave of H/W >>> decoder. >>> >>> Actually I think all the display functions are relative, some >>> functions i listed upper are operating one HW module, for instance: >>> OSD and video layer are implemented by display module in H/W level. >>> What's the right way to implement these functions in driver level, >>> united or separated? >>> And, I've read some documents for V4L2, but I still cannot figure out >>> where should I implement my driver in the framework. >>> >>> In a word, I'm totally confused. Can you guys show me the right way or >>> just kick me to a existing example with similar features? >>> >> >> Currently, there are 2 drivers which have exactly the functionality >> that you have mentioned. The first one is an AV7110 based device and >> the other one is a STi7109 SOC based device. >> >> With regards to the AV7110 based hardware, you can have a look at >> linux/drivers/media/dvb/ttpci/ * >> >> And with regards to the STi7109 SOC based, you can have a look at >> http://jusst.de/hg/saa716x/ >> linux/drivers/media/common/saa716x/ * >> specifically you will need to look at saa716x_ff.c/h for the STi7109 >> related stuff >> >> >> Both the AV7110 and STi7109 SOC feature a OSD interface, in addition >> to the audio and video layers. which you can see from the drivers, >> themselves. Additionally the STi7109 SOC features HDMI outputs. The >> AV7110 based cards, they incorporate DVB-S/C/T frontends for different >> products. The STi7109 product that we have currently features only a >> DVB-S/S2 system only, though that doesn't make any difference at all. > > The AV7110 OSD is not framebuffer based AFAIK. So probably not a good > place to look. It doesn't support OSD ? static inline int DestroyOSDWindow(struct av7110 *av7110, u8 windownr) { return av7110_fw_cmd(av7110, COMTYPE_OSD, WDestroy, 1, windownr); } static inline int CreateOSDWindow(struct av7110 *av7110, u8 windownr, osd_raw_window_t disptype, u16 width, u16 height) { return av7110_fw_cmd(av7110, COMTYPE_OSD, WCreate, 4, windownr, disptype, width, height); } static enum av7110_osd_palette_type bpp2pal[8] = { Pal1Bit, Pal2Bit, 0, Pal4Bit, 0, 0, 0, Pal8Bit }; static osd_raw_window_t bpp2bit[8] = { OSD_BITMAP1, OSD_BITMAP2, 0, OSD_BITMAP4, 0, 0, 0, OSD_BITMAP8 }; static inline int WaitUntilBmpLoaded(struct av7110 *av7110) { int ret = wait_event_timeout(av7110->bmpq, av7110->bmp_state != BMP_LOADING, 10*HZ); if (ret == 0) { printk("dvb-ttpci: warning: timeout waiting in LoadBitmap: %d, %d\n", ret, av7110->bmp_state); av7110->bmp_state = BMP_NONE; return -ETIMEDOUT; } return 0; } static inline int LoadBitmap(struct av7110 *av7110, u16 dx, u16 dy, int inc, u8 __user * data) { u16 format; int bpp; int i; int d, delta; u8 c; int ret; dprintk(4, "%p\n", av7110); format = bpp2bit[av7110->osdbpp[av7110->osdwin]]; av7110->bmp_state = BMP_LOADING; if (format == OSD_BITMAP8) { bpp=8; delta = 1; } else if (format == OSD_BITMAP4) { bpp=4; delta = 2; } else if (format == OSD_BITMAP2) { bpp=2; delta = 4; } else if (format == OSD_BITMAP1) { bpp=1; delta = 8; } else { av7110->bmp_state = BMP_NONE; return -EINVAL; } av7110->bmplen = ((dx * dy * bpp + 7) & ~7) / 8; av7110->bmpp = 0; if (av7110->bmplen > 32768) { av7110->bmp_state = BMP_NONE; return -EINVAL; } for (i = 0; i < dy; i++) { if (copy_from_user(av7110->bmpbuf + 1024 + i * dx, data + i * inc, dx)) { av7110->bmp_state = BMP_NONE; return -EINVAL; } } if (format != OSD_BITMAP8) { for (i = 0; i < dx * dy / delta; i++) { c = ((u8 *)av7110->bmpbuf)[1024 + i * delta + delta - 1]; for (d = delta - 2; d >= 0; d--) { c |= (((u8 *)av7110->bmpbuf)[1024 + i * delta + d] << ((delta - d - 1) * bpp)); ((u8 *)av7110->bmpbuf)[1024 + i] = c; } } } av7110->bmplen += 1024; dprintk(4, "av7110_fw_cmd: LoadBmp size %d\n", av7110->bmplen); ret = av7110_fw_cmd(av7110, COMTYPE_OSD, LoadBmp, 3, format, dx, dy); if (!ret) ret = WaitUntilBmpLoaded(av7110); return ret; } I will be surprised if OSD doesn't work on the AV7110 based ..... > The saa716x driver doesn't have a framebuffer either. Manu, is this driver > just passing the captured video to the OSD? Or does it use some custom OSD > commands? Just curious. Well, the SAA716x is only the PCI Express interface. There is no video capture involved in there with the STi7109. It is a full fledged DVB STB SOC. OSD is handled by the STi7109 on that STB. http://www.st.com/stonline/products/literature/bd/11660/sti7109.pdf Though it is not complete, that driver, it still does handle it, through the firmware interface. These are the kind of devices that you find on a DVB STB, i must say. On a DVB STB, what happens is that you load a vendor specific firmware on the SOC. The SOC is just issued the firmware commands, that's how a STB works in principle. A DVB STB can be considered to have 2 outputs, ie if you use it as a PC card, you can output the whole thing to your PC monitor, or output it to a TV set. But in the case of the STB, you have a TV output alone. Regards, Manu -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html