12 static struct rgb15 *disp_data;
13 void *vga_shm_get(void);
14 void vga_shm_free(void* addr);
16 struct timespec sleep_inteval = {0, 1000000 / VGA_REFRESH_RATE};
18 static void init_color1(void) {
20 for (y = 0; y < VGA_HEIGHT; y++) {
21 for (x = 0; x < VGA_WIDTH; x++) {
22 int pos = x + VGA_WIDTH * y;
23 if (x < VGA_WIDTH / 7) {
25 disp_data[pos].r = to5bit(0xffff) * 3 / 4;
26 disp_data[pos].g = to5bit(0xffff) * 3 / 4;
27 disp_data[pos].b = to5bit(0xffff) * 3 / 4;
29 else if (x < VGA_WIDTH * 2 / 7) {
31 disp_data[pos].r = to5bit(0xffff);
32 disp_data[pos].g = to5bit(0xffff);
33 disp_data[pos].b = to5bit(0);
35 else if (x < VGA_WIDTH * 3 / 7) {
37 disp_data[pos].r = to5bit(0);
38 disp_data[pos].g = to5bit(0xffff);
39 disp_data[pos].b = to5bit(0xffff);
41 else if (x < VGA_WIDTH * 4 / 7) {
44 disp_data[pos].g = to5bit(0xffff);
47 else if (x < VGA_WIDTH * 5 / 7) {
49 disp_data[pos].r = to5bit(0xffff);
50 disp_data[pos].g = to5bit(0);
51 disp_data[pos].b = to5bit(0xffff);
53 else if (x < VGA_WIDTH * 6 / 7) {
55 disp_data[pos].r = to5bit(0xffff);
59 else if (x < VGA_WIDTH * 7 / 7) {
63 disp_data[pos].b = to5bit(0xffff);
70 static void init_color2(void) {
72 for (y = 0; y < VGA_HEIGHT; y++) {
73 for (x = 0; x < VGA_WIDTH; x++) {
74 int pos = x + VGA_WIDTH * y;
75 if (y < VGA_HEIGHT / 7) {
77 disp_data[pos].r = to5bit(0xffff) * 3 / 4;
78 disp_data[pos].g = to5bit(0xffff) * 3 / 4;
79 disp_data[pos].b = to5bit(0xffff) * 3 / 4;
81 else if (y < VGA_HEIGHT * 2 / 7) {
83 disp_data[pos].r = to5bit(0xffff);
84 disp_data[pos].g = to5bit(0xffff);
85 disp_data[pos].b = to5bit(0);
87 else if (y < VGA_HEIGHT * 3 / 7) {
89 disp_data[pos].r = to5bit(0);
90 disp_data[pos].g = to5bit(0xffff);
91 disp_data[pos].b = to5bit(0xffff);
93 else if (y < VGA_HEIGHT * 4 / 7) {
96 disp_data[pos].g = to5bit(0xffff);
99 else if (y < VGA_HEIGHT * 5 / 7) {
101 disp_data[pos].r = to5bit(0xffff);
102 disp_data[pos].g = to5bit(0);
103 disp_data[pos].b = to5bit(0xffff);
105 else if (y < VGA_HEIGHT * 6 / 7) {
107 disp_data[pos].r = to5bit(0xffff);
108 disp_data[pos].g = 0;
109 disp_data[pos].b = 0;
111 else if (y < VGA_HEIGHT * 7 / 7) {
113 disp_data[pos].r = 0;
114 disp_data[pos].g = 0;
115 disp_data[pos].b = to5bit(0xffff);
122 static void move_color1(void) {
125 static struct rgb15 v_line[VGA_HEIGHT];
128 for (y = 0; y < VGA_HEIGHT; y++) {
129 v_line[y] = disp_data[y * VGA_WIDTH];
131 for (y = 0; y < VGA_HEIGHT; y++) {
132 for (x = 0; x < VGA_WIDTH - 1; x++) {
133 int pos = x + VGA_WIDTH * y;
134 disp_data[pos] = disp_data[pos + 1];
136 disp_data[VGA_WIDTH * y - 1] = v_line[y];
138 nanosleep(&sleep_inteval, NULL);
142 static void move_color2(void) {
145 static struct rgb15 h_line[VGA_WIDTH];
148 memcpy(h_line, disp_data, sizeof(h_line));
149 for (y = 0; y < VGA_HEIGHT - 1; y++) {
150 memcpy( disp_data + VGA_WIDTH * y, disp_data + VGA_WIDTH * (y + 1), sizeof(h_line));
152 memcpy(disp_data + VGA_WIDTH * (VGA_HEIGHT - 1), h_line, sizeof(h_line));
153 nanosleep(&sleep_inteval, NULL);
157 static void print_usage(void) {
158 printf("dummy-driver app usage:\n");
159 printf(" dummy-driver [1-4]\n");
160 printf(" 1: vertical color pattern test\n");
161 printf(" 2: horiontal color pattern test\n");
162 printf(" 3: vertical color pattern w/ scroll test\n");
163 printf(" 4: horizontal color pattern w/ scroll test\n");
164 printf(" [no option]: reset shared memory\n");
167 int main(int argc, char** argv) {
170 /* get vga shared memory */
171 if((disp_data = (struct rgb15 *)vga_shm_get()) == NULL)
173 fprintf(stderr, "error attaching shared memory.\n");
177 memset(disp_data, 0, VGA_SHM_SIZE);
180 if ( !strcmp(argv[1],"2") )
182 else if ( !strcmp(argv[1],"3") )
184 else if ( !strcmp(argv[1],"4") )
190 vga_shm_free(disp_data);