static void st7585fb_deferred_io(struct fb_info *info, struct list_head *pagelist) { unsigned int row, col, t, i; unsigned char *vram = info->screen_base; struct st7585_data *dd = info->par; for (col = 0; col < 8; col++) { spisend(dd, 0x40 | col); spisend(dd, 0x8e); for (row = 0; row < 75; row++) { t = 0; for (i = 0; i < 8; i++) t |= ((vram[col + row * 8]) & (1 << (7-i))) ? (1 << i) : 0; spisend(dd, 0x100 | t); } } }
/* Input Arguments: x -> Command Byte to be sent */ void wrcmd(unsigned char x){ DC = 0; CE = 0; spisend(x); CE = 1; }
void wrdata(unsigned char x){ DC = 1; CE = 0; spisend(x); CE = 1; }
static int __devinit st7585_probe(struct spi_device *spi) { struct st7585_data *drvdata; int ret; drvdata = devm_kzalloc(&spi->dev, sizeof(*drvdata), GFP_KERNEL); if (!drvdata) return -ENOMEM; drvdata->spi = spi; spin_lock_init(&drvdata->lock); spi_set_drvdata(spi, drvdata); spi->mode = 3; spi->bits_per_word = 9; spi->max_speed_hz = 10000000; ret = spi_setup(spi); if (ret) return ret; spisend(drvdata, 0x21); spisend(drvdata, 0x90); spisend(drvdata, 0x20); spisend(drvdata, 0x0c); spisend(drvdata, 0x8e); drvdata->info = framebuffer_alloc(0, &spi->dev); if (!drvdata->info) { return -ENOMEM; } st7585_fix.smem_start = (unsigned long)drvdata->vram; st7585_fix.smem_len = VRAM_LEN; drvdata->info->par = drvdata; drvdata->info->flags = FBINFO_DEFAULT; drvdata->info->var = st7585_var; drvdata->info->fix = st7585_fix; drvdata->info->monspecs.hfmin = 0; drvdata->info->monspecs.hfmax = 0; drvdata->info->monspecs.vfmin = 10000; drvdata->info->monspecs.vfmax = 10000; drvdata->info->monspecs.dpms = 0; drvdata->info->fbops = &st7585fb_ops; drvdata->info->screen_base = drvdata->vram; drvdata->info->fbdefio = &st7585fb_defio; fb_deferred_io_init(drvdata->info); ret = register_framebuffer(drvdata->info); if (ret < 0) { framebuffer_release(drvdata->info); return -EINVAL; } printk(KERN_INFO "fb%d: %s frame buffer device\n", drvdata->info->node, drvdata->info->fix.id); return 0; }