1 /* 2 * Copyright (C) 2015 Allwinnertech, z.q <zengqi@allwinnertech.com> 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License version 2 as 6 * published by the Free Software Foundation. 7 * 8 */ 9 10 #ifndef __DISP_EINK__H__ 11 #define __DISP_EINK__H__ 12 13 #include "disp_private.h" 14 #include "include.h" 15 #include <video/sunxi_display2.h> 16 17 #define EINK_POWER_NUM 4 18 #define IMAGE_BUF_NUM 13 19 #define WAVE_DATA_BUF_NUM 16 20 #define INDEX_BUFFER_NUM 2 21 #define EINK_RECT_MODE 0x400 22 23 /* #define __EINK_DEBUG__ */ 24 25 struct st_argb { 26 u8 blue; 27 u8 green; 28 u8 red; 29 u8 alpha; 30 }; 31 32 struct eink_buffer_manager { 33 unsigned int in_index; 34 unsigned int out_index; 35 struct mutex mlock; 36 struct eink_8bpp_image image_slot[IMAGE_BUF_NUM]; 37 unsigned int buf_size; 38 unsigned int width; 39 unsigned int height; 40 41 bool (*is_full)(struct eink_buffer_manager *buffer_mgr); 42 bool (*is_empty)(struct eink_buffer_manager *buffer_mgr); 43 struct eink_8bpp_image *(*get_last_image)(struct eink_buffer_manager * 44 buffer_mgr); 45 struct eink_8bpp_image *(*get_current_image)(struct eink_buffer_manager 46 *buffer_mgr); 47 s32 (*queue_image)(struct eink_buffer_manager *buffer_mgr, 48 struct disp_layer_config_inner *config, 49 unsigned int layer_num, unsigned int mode, 50 struct area_info update_area); 51 s32 (*dequeue_image)(struct eink_buffer_manager *buffer_mgr); 52 s32 (*clear_image)(struct eink_buffer_manager *buffer_mgr); 53 }; 54 55 struct pipeline_list { 56 struct list_head free_list; 57 struct list_head used_list; 58 struct mutex mlock; 59 }; 60 61 struct pipeline_info { 62 struct area_info area; 63 unsigned int frame_index; 64 unsigned int total_frames; 65 unsigned int pipeline_no; 66 enum eink_update_mode mode; 67 enum eink_bit_num bit_num; 68 unsigned int wave_file_addr; 69 bool enable_flag; 70 int overlap_flag; 71 struct list_head node; 72 }; 73 struct pipeline_manager { 74 unsigned int disp; 75 int overlap_num; 76 struct pipeline_list list; 77 struct mutex mlock; 78 79 int (*check_overlap)(struct pipeline_manager *, struct area_info); 80 int (*op_skip)(struct pipeline_manager *, unsigned int); 81 int (*config_one_pipeline)(struct pipeline_manager *, struct area_info, 82 enum eink_update_mode); 83 int (*config_and_enable_one_pipeline)(struct pipeline_manager *, 84 struct area_info, 85 enum eink_update_mode, 86 unsigned int, 87 unsigned int *tframes); 88 int (*update_pipeline_list)(struct pipeline_manager *, unsigned int, 89 unsigned int *); 90 int (*used_list_status)(struct pipeline_manager *manager); 91 int (*free_list_status)(struct pipeline_manager *manager); 92 int (*check_overlap_num)(struct pipeline_manager *manager); 93 int (*clear_pipeline_list)(struct pipeline_manager *manager); 94 }; 95 96 struct wavedata_queue { 97 unsigned int head; 98 unsigned int tail; 99 void *wavedata_vaddr[WAVE_DATA_BUF_NUM]; 100 void *wavedata_paddr[WAVE_DATA_BUF_NUM]; 101 bool wavedata_used[WAVE_DATA_BUF_NUM]; 102 struct rect_size size; 103 spinlock_t slock; 104 }; 105 106 struct eink_private { 107 void *index_vaddr[INDEX_BUFFER_NUM]; 108 bool enable_flag; 109 void *index_paddr[INDEX_BUFFER_NUM]; 110 unsigned char new_index; 111 unsigned char old_index; 112 113 bool index_fresh; 114 char *wave_file_path; 115 unsigned int fresh_frame_index; 116 unsigned int decode_frame_index; 117 unsigned int total_frame; 118 unsigned int irq_no; 119 struct wavedata_queue wavedata_ring_buffer; 120 struct work_struct decode_frame_work; 121 struct eink_init_param param; 122 struct clk *eink_clk; 123 struct clk *edma_clk; 124 unsigned long eink_base_addr; 125 spinlock_t slock; 126 127 }; 128 129 int ring_buffer_manager_init(struct disp_eink_manager *eink_manager); 130 int ring_buffer_manager_exit(struct disp_eink_manager *eink_manager); 131 int pipeline_manager_init(struct disp_eink_manager *eink_manager); 132 int pipeline_manager_exit(struct disp_eink_manager *eink_manager); 133 int write_edma(struct disp_eink_manager *manager); 134 int disp_init_eink(struct disp_bsp_init_para *para); 135 int eink_display_one_frame(struct disp_eink_manager *manager); 136 extern int eink_irq_query_index(void); 137 138 extern s32 tcon0_simple_close(u32 sel); 139 extern s32 tcon0_simple_open(u32 sel); 140 extern void *disp_malloc(u32 num_bytes, void *phy_addr); 141 extern void disp_free(void *virt_addr, void *phy_addr, u32 num_bytes); 142 extern struct format_manager *disp_get_format_manager(unsigned int id); 143 144 #endif 145