int qtft_fb_init(void) { int err = 0; func_in(); err = platform_driver_register(&qtft_fb_driver); if(err<0) goto out; qtft_fb_device = platform_device_alloc("qtft_fb_device", 0); if (!qtft_fb_device) { err = -ENOMEM; goto unregister; } err = platform_device_add(qtft_fb_device); if (err<0) goto device_put; goto out; device_put: platform_device_put(qtft_fb_device); unregister: platform_driver_unregister(&qtft_fb_driver); out: func_out(); return err; }
void qtft_fb_exit(void) { func_in(); platform_device_unregister(qtft_fb_device); platform_driver_unregister(&qtft_fb_driver); func_out(); }
void qtft_spi_exit(void) { func_in(); qtft_spi_device_unregister(current_device); spi_unregister_driver(&qtft_spi_dri_driver); func_out(); }
int bstree_iterate( bstree_t *tree_in, long node_in, void (*func_in)(bsnode_t*,void*), void *args_in ) { if( node_in != -1 ) { bstree_iterate( tree_in, tree_in->start[node_in].left, func_in, args_in ); func_in( tree_in->start + node_in, args_in ); bstree_iterate( tree_in, tree_in->start[node_in].right, func_in, args_in ); } return 0; }
static int qtft_fb_remove(struct platform_device *dev) { struct fb_info *info = platform_get_drvdata(dev); func_in(); if (info) { lcd_exit(); unregister_framebuffer(info); fb_dealloc_cmap(&info->cmap); framebuffer_release(info); rvfree(videomemory, videomemorysize); } func_out(); return 0; }
int qtft_spi_init(void) { int err=0; struct spi_master *master=NULL; struct spi_device *new_device=NULL; func_in(); err = spi_register_driver(&qtft_spi_dri_driver); if(err) { printk(KERN_ERR "Can't register spi driver \n"); goto out; } master = spi_busnum_to_master(SPI_BUS_NUM); if(!master) { printk(KERN_ERR "Can't get SPI bus %d\n",SPI_BUS_NUM); err = -ENODEV; goto err0; } new_device = spi_new_device(master, qtft_spi_dev_board_info); if(!new_device) { printk(KERN_ERR "Can't register spi device \n"); err = -ENODEV; goto err0; } goto out; err0: spi_unregister_driver(&qtft_spi_dri_driver); out: func_out(); return err; }
static int qtft_fb_probe(struct platform_device * dev) { struct fb_info *info; int retval = -ENOMEM; func_in(); // 分配显存 if (!(videomemory = rvmalloc(videomemorysize))) return retval; memset(videomemory, 0, videomemorysize); // 动态分配 fb_info info = framebuffer_alloc((sizeof(u32)*16), &dev->dev); if (!info) goto err0; // 虚拟地址 info->screen_base = (char __iomem *)videomemory; info->screen_size = videomemorysize; // 文件操作符 qtft_fb_ops 在 ops.c 中定义 info->fbops = &qtft_fb_ops; info->var = qtft_fb_var_default; qtft_fb_fix_default.smem_start = (unsigned long) videomemory; qtft_fb_fix_default.smem_len = videomemorysize; info->fix = qtft_fb_fix_default; // 16色伪调色板指针指向了 info->par 的私有空间 info->pseudo_palette = info->par; info->par = NULL; info->flags = FBINFO_DEFAULT; // 为16色伪调色板分配内存 retval = fb_alloc_cmap(&info->cmap, 16, 0); if (retval < 0) goto err1; retval = register_framebuffer(info); if (retval < 0) goto err2; // 初始化 LCD 模块 retval = lcd_init(); if (retval < 0) goto err3; retval = lcd_hard_reset(); if (retval < 0) goto err3; retval = lcd_normal_config(); if (retval < 0) goto err3; lcd_address_set(0,0,(info->var).xres,(info->var).yres); // 将 info 指针存入平台设备私有数据 platform_set_drvdata(dev, info); printk(KERN_INFO "SPI QVGA TFT LCD driver: fb%d, %ldK video memory\n", info->node, videomemorysize >> 10); goto out; err3: unregister_framebuffer(info); err2: fb_dealloc_cmap(&info->cmap); err1: framebuffer_release(info); err0: rvfree(videomemory, videomemorysize); out: func_out(); return retval; }