• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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