📄 bfin-t350mcqb-fb.c
字号:
if (regno > 16) return -EINVAL; red >>= (16 - info->var.red.length); green >>= (16 - info->var.green.length); blue >>= (16 - info->var.blue.length); value = (red << info->var.red.offset) | (green << info->var.green.offset) | (blue << info->var.blue.offset); value &= 0xFFFFFF; ((u32 *) (info->pseudo_palette))[regno] = value; } return 0;}static struct fb_ops bfin_t350mcqb_fb_ops = { .owner = THIS_MODULE, .fb_open = bfin_t350mcqb_fb_open, .fb_release = bfin_t350mcqb_fb_release, .fb_check_var = bfin_t350mcqb_fb_check_var, .fb_fillrect = cfb_fillrect, .fb_copyarea = cfb_copyarea, .fb_imageblit = cfb_imageblit, .fb_mmap = bfin_t350mcqb_fb_mmap, .fb_cursor = bfin_t350mcqb_fb_cursor, .fb_setcolreg = bfin_t350mcqb_fb_setcolreg,};#ifndef NO_BL_SUPPORTstatic int bl_get_brightness(struct backlight_device *bd){ return 0;}static struct backlight_ops bfin_lq043fb_bl_ops = { .get_brightness = bl_get_brightness,};static struct backlight_device *bl_dev;static int bfin_lcd_get_power(struct lcd_device *dev){ return 0;}static int bfin_lcd_set_power(struct lcd_device *dev, int power){ return 0;}static int bfin_lcd_get_contrast(struct lcd_device *dev){ return 0;}static int bfin_lcd_set_contrast(struct lcd_device *dev, int contrast){ return 0;}static int bfin_lcd_check_fb(struct lcd_device *dev, struct fb_info *fi){ if (!fi || (fi == &bfin_t350mcqb_fb)) return 1; return 0;}static struct lcd_ops bfin_lcd_ops = { .get_power = bfin_lcd_get_power, .set_power = bfin_lcd_set_power, .get_contrast = bfin_lcd_get_contrast, .set_contrast = bfin_lcd_set_contrast, .check_fb = bfin_lcd_check_fb,};static struct lcd_device *lcd_dev;#endifstatic irqreturn_t bfin_t350mcqb_irq_error(int irq, void *dev_id){ /*struct bfin_t350mcqbfb_info *info = (struct bfin_t350mcqbfb_info *)dev_id;*/ u16 status = bfin_read_PPI_STATUS(); bfin_write_PPI_STATUS(0xFFFF); if (status) { bfin_t350mcqb_disable_ppi(); disable_dma(CH_PPI); /* start dma */ enable_dma(CH_PPI); bfin_t350mcqb_enable_ppi(); bfin_write_PPI_STATUS(0xFFFF); } return IRQ_HANDLED;}static int __devinit bfin_t350mcqb_probe(struct platform_device *pdev){ struct bfin_t350mcqbfb_info *info; struct fb_info *fbinfo; int ret; printk(KERN_INFO DRIVER_NAME ": %dx%d %d-bit RGB FrameBuffer initializing...\n", LCD_X_RES, LCD_Y_RES, LCD_BPP); if (request_dma(CH_PPI, "CH_PPI") < 0) { printk(KERN_ERR DRIVER_NAME ": couldn't request CH_PPI DMA\n"); ret = -EFAULT; goto out1; } fbinfo = framebuffer_alloc(sizeof(struct bfin_t350mcqbfb_info), &pdev->dev); if (!fbinfo) { ret = -ENOMEM; goto out2; } info = fbinfo->par; info->fb = fbinfo; info->dev = &pdev->dev; platform_set_drvdata(pdev, fbinfo); strcpy(fbinfo->fix.id, driver_name); fbinfo->fix.type = FB_TYPE_PACKED_PIXELS; fbinfo->fix.type_aux = 0; fbinfo->fix.xpanstep = 0; fbinfo->fix.ypanstep = 0; fbinfo->fix.ywrapstep = 0; fbinfo->fix.accel = FB_ACCEL_NONE; fbinfo->fix.visual = FB_VISUAL_TRUECOLOR; fbinfo->var.nonstd = 0; fbinfo->var.activate = FB_ACTIVATE_NOW; fbinfo->var.height = -1; fbinfo->var.width = -1; fbinfo->var.accel_flags = 0; fbinfo->var.vmode = FB_VMODE_NONINTERLACED; fbinfo->var.xres = LCD_X_RES; fbinfo->var.xres_virtual = LCD_X_RES; fbinfo->var.yres = LCD_Y_RES; fbinfo->var.yres_virtual = LCD_Y_RES; fbinfo->var.bits_per_pixel = LCD_BPP; fbinfo->var.red.offset = 0; fbinfo->var.green.offset = 8; fbinfo->var.blue.offset = 16; fbinfo->var.transp.offset = 0; fbinfo->var.red.length = 8; fbinfo->var.green.length = 8; fbinfo->var.blue.length = 8; fbinfo->var.transp.length = 0; fbinfo->fix.smem_len = LCD_X_RES * LCD_Y_RES * LCD_BPP / 8; fbinfo->fix.line_length = fbinfo->var.xres_virtual * fbinfo->var.bits_per_pixel / 8; fbinfo->fbops = &bfin_t350mcqb_fb_ops; fbinfo->flags = FBINFO_FLAG_DEFAULT; info->fb_buffer = dma_alloc_coherent(NULL, fbinfo->fix.smem_len, &info->dma_handle, GFP_KERNEL); if (NULL == info->fb_buffer) { printk(KERN_ERR DRIVER_NAME ": couldn't allocate dma buffer.\n"); ret = -ENOMEM; goto out3; } memset(info->fb_buffer, 0, fbinfo->fix.smem_len); fbinfo->screen_base = (void *)info->fb_buffer + ACTIVE_VIDEO_MEM_OFFSET; fbinfo->fix.smem_start = (int)info->fb_buffer + ACTIVE_VIDEO_MEM_OFFSET; fbinfo->fbops = &bfin_t350mcqb_fb_ops; fbinfo->pseudo_palette = &info->pseudo_pal; if (fb_alloc_cmap(&fbinfo->cmap, BFIN_LCD_NBR_PALETTE_ENTRIES, 0) < 0) { printk(KERN_ERR DRIVER_NAME "Fail to allocate colormap (%d entries)\n", BFIN_LCD_NBR_PALETTE_ENTRIES); ret = -EFAULT; goto out4; } if (bfin_t350mcqb_request_ports(1)) { printk(KERN_ERR DRIVER_NAME ": couldn't request gpio port.\n"); ret = -EFAULT; goto out6; } info->irq = platform_get_irq(pdev, 0); if (info->irq < 0) { ret = -EINVAL; goto out7; } ret = request_irq(info->irq, bfin_t350mcqb_irq_error, IRQF_DISABLED, "PPI ERROR", info); if (ret < 0) { printk(KERN_ERR DRIVER_NAME ": unable to request PPI ERROR IRQ\n"); goto out7; } if (register_framebuffer(fbinfo) < 0) { printk(KERN_ERR DRIVER_NAME ": unable to register framebuffer.\n"); ret = -EINVAL; goto out8; }#ifndef NO_BL_SUPPORT bl_dev = backlight_device_register("bf52x-bl", NULL, NULL, &bfin_lq043fb_bl_ops); bl_dev->props.max_brightness = 255; lcd_dev = lcd_device_register(DRIVER_NAME, NULL, &bfin_lcd_ops); lcd_dev->props.max_contrast = 255, printk(KERN_INFO "Done.\n");#endif return 0;out8: free_irq(info->irq, info);out7: bfin_t350mcqb_request_ports(0);out6: fb_dealloc_cmap(&fbinfo->cmap);out4: dma_free_coherent(NULL, fbinfo->fix.smem_len, info->fb_buffer, info->dma_handle);out3: framebuffer_release(fbinfo);out2: free_dma(CH_PPI);out1: platform_set_drvdata(pdev, NULL); return ret;}static int bfin_t350mcqb_remove(struct platform_device *pdev){ struct fb_info *fbinfo = platform_get_drvdata(pdev); struct bfin_t350mcqbfb_info *info = fbinfo->par; unregister_framebuffer(fbinfo); free_dma(CH_PPI); free_irq(info->irq, info); if (info->fb_buffer != NULL) dma_free_coherent(NULL, fbinfo->fix.smem_len, info->fb_buffer, info->dma_handle); fb_dealloc_cmap(&fbinfo->cmap);#ifndef NO_BL_SUPPORT lcd_device_unregister(lcd_dev); backlight_device_unregister(bl_dev);#endif bfin_t350mcqb_request_ports(0); platform_set_drvdata(pdev, NULL); framebuffer_release(fbinfo); printk(KERN_INFO DRIVER_NAME ": Unregister LCD driver.\n"); return 0;}#ifdef CONFIG_PMstatic int bfin_t350mcqb_suspend(struct platform_device *pdev, pm_message_t state){ struct fb_info *fbinfo = platform_get_drvdata(pdev); struct bfin_t350mcqbfb_info *info = fbinfo->par; bfin_t350mcqb_disable_ppi(); disable_dma(CH_PPI); bfin_write_PPI_STATUS(0xFFFF); return 0;}static int bfin_t350mcqb_resume(struct platform_device *pdev){ struct fb_info *fbinfo = platform_get_drvdata(pdev); struct bfin_t350mcqbfb_info *info = fbinfo->par; enable_dma(CH_PPI); bfin_t350mcqb_enable_ppi(); return 0;}#else#define bfin_t350mcqb_suspend NULL#define bfin_t350mcqb_resume NULL#endifstatic struct platform_driver bfin_t350mcqb_driver = { .probe = bfin_t350mcqb_probe, .remove = bfin_t350mcqb_remove, .suspend = bfin_t350mcqb_suspend, .resume = bfin_t350mcqb_resume, .driver = { .name = DRIVER_NAME, .owner = THIS_MODULE, },};static int __devinit bfin_t350mcqb_driver_init(void){ return platform_driver_register(&bfin_t350mcqb_driver);}static void __exit bfin_t350mcqb_driver_cleanup(void){ platform_driver_unregister(&bfin_t350mcqb_driver);}MODULE_DESCRIPTION("Blackfin TFT LCD Driver");MODULE_LICENSE("GPL");module_init(bfin_t350mcqb_driver_init);module_exit(bfin_t350mcqb_driver_cleanup);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -