Christian wrote: > First you have to modify the function au1100fb_setcolreg, add the switch > case for 4bpp. Look in the Alchemy manual for the format of the palette > in the 4 bpp case. Then look for my comment "TODO: 8bbp", put a switch > and for pseudocolor like visual ... I think this is not even necessary. Thanks, will look. > More important is that you change the monitor type. Yep, finding working parameters without real knowledge of what the registers mean was the hardest part, but I have it working now. > If you want I can > send you privately a patch this weekend, but I just cannot assure it > works, you have to test it and eventually contribute. I'd appreciate that, thank you. Currently I'm facing a different problem though, look at this code and the bitmap it generates (4bpp): unsigned long* fb = my_fb_info->fb_virt_start; fb[0] = 0x0000000f; // *....... fb[40] = 0x000000f0; // .*...... fb[80] = 0x000000ff; // **...... fb[120] = 0xf0000f00; // ..*....* fb[160] = 0xff000f0f; // *.*...** fb[200] = 0xfff00ff0; // .**..*** fb[240] = 0xffff0fff; // ***.**** To me, expecting the LSB to be part of the leftmost pixel is not really surprising, but functions like cfb_fillrect() (or rather bitfill32() etc) expect the order to be the other way around. I'm afraid that other framebuffer functions also expect that, but I haven't gotten far enough to test those. I only tested cfb_fillrect() and, seeing it fail, started looking for answers... any idea? I stumbled across another .. err .. 'feature': take a look at the appended patch, in particular the handling of the mask for the first long, am I dreaming or is this in fact handled wrongly in the current FB code? I'm a bit confused, because the same mistake is made in pretty much every FB driver I looked at. Thanks Uli --- Index: cfbcopyarea.c =================================================================== RCS file: /home/cvs/linux/drivers/video/cfbcopyarea.c,v retrieving revision 1.10 diff -u -w -r1.10 cfbcopyarea.c --- cfbcopyarea.c 12 Oct 2004 01:45:47 -0000 1.10 +++ cfbcopyarea.c 4 Feb 2005 13:11:16 -0000 @@ -70,7 +70,7 @@ } else { // Multiple destination words // Leading bits - if (first) { + if (first != ~0UL) { FB_WRITEL((FB_READL(src) & first) | (FB_READL(dst) & ~first), dst); @@ -223,7 +223,7 @@ } else { // Multiple destination words // Leading bits - if (first) { + if (first != ~0UL) { FB_WRITEL((FB_READL(src) & first) | (FB_READL(dst) & ~first), dst); dst--; src--; Index: cfbfillrect.c =================================================================== RCS file: /home/cvs/linux/drivers/video/cfbfillrect.c,v retrieving revision 1.8 diff -u -w -r1.8 cfbfillrect.c --- cfbfillrect.c 12 Oct 2004 01:45:47 -0000 1.8 +++ cfbfillrect.c 4 Feb 2005 13:11:16 -0000 @@ -142,7 +142,7 @@ } else { // Multiple destination words // Leading bits - if (first) { + if (first != ~0UL) { FB_WRITEL(comp(val, FB_READL(dst), first), dst); dst++; n -= BITS_PER_LONG-dst_idx; @@ -166,7 +166,7 @@ // Trailing bits if (last) - FB_WRITEL(comp(val, FB_READL(dst), first), dst); + FB_WRITEL(comp(val, FB_READL(dst), last), dst); } } @@ -197,7 +197,7 @@ } else { // Multiple destination words // Leading bits - if (first) { + if (first != ~0UL) { FB_WRITEL(comp(pat, FB_READL(dst), first), dst); dst++; pat = pat << left | pat >> right; @@ -224,7 +224,7 @@ // Trailing bits if (last) - FB_WRITEL(comp(pat, FB_READL(dst), first), dst); + FB_WRITEL(comp(pat, FB_READL(dst), last), dst); } } @@ -252,7 +252,7 @@ } else { // Multiple destination words // Leading bits - if (first) { + if (first != ~0UL) { dat = FB_READL(dst); FB_WRITEL(comp(dat ^ val, dat, first), dst); dst++; @@ -287,7 +287,7 @@ // Trailing bits if (last) { dat = FB_READL(dst); - FB_WRITEL(comp(dat ^ val, dat, first), dst); + FB_WRITEL(comp(dat ^ val, dat, last), dst); } } } @@ -320,7 +320,7 @@ } else { // Multiple destination words // Leading bits - if (first) { + if (first != ~0UL) { dat = FB_READL(dst); FB_WRITEL(comp(dat ^ pat, dat, first), dst); dst++; @@ -354,7 +354,7 @@ // Trailing bits if (last) { dat = FB_READL(dst); - FB_WRITEL(comp(dat ^ pat, dat, first), dst); + FB_WRITEL(comp(dat ^ pat, dat, last), dst); } } }