#include #include #include #include //sleep #include //nanosleep #include //u,mdelay #include #include #include #include "chrlcd.h" // #include #include // #define gen_set_output_param(value) value,0,0,0 #define gen_set_input_param() 0,0,0,0 #define gen_get_param() 0,0,0,0 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// //+ display_param_list //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// void display_param_list(struct gpio_param *head){ struct gpio_param *current; int i = 0; int val = 0; if(!head) return; current = head; do{ i++; LOG_DEBUG("list[%2d] : 0x%08lx\n",i,(unsigned long)current); LOG_MSG("GPIO No. : %ld ",current->no); switch(current->no){ case GPIO0: LOG_MSG("(GPIO0)\n");break; case GPIO1: LOG_MSG("(GPIO1)\n");break; case GPIO2: LOG_MSG("(GPIO2)\n");break; case GPIO3: LOG_MSG("(GPIO3)\n");break; case GPIO4: LOG_MSG("(GPIO4)\n");break; case GPIO5: LOG_MSG("(GPIO5)\n");break; case GPIO6: LOG_MSG("(GPIO6)\n");break; case GPIO7: LOG_MSG("(GPIO7)\n");break; default: LOG_MSG("(unknown)\n");return; } LOG_MSG("MODE : %ld ",current->mode); switch(current->mode){ case MODE_OUTPUT: LOG_MSG("(MODE_OUTPUT)\n");break; case MODE_INPUT: LOG_MSG("(MODE_INPUT)\n");break; case MODE_GET: LOG_MSG("(MODE_GET)\n");break; default: LOG_MSG("(unknown)\n");return; } switch(current->mode){ case MODE_OUTPUT: LOG_MSG("VALUE : %ld ",current->data.o.value); LOG_MSG("(%s)\n",(current->data.o.value) ? "HIGH":"LOW"); break; case MODE_INPUT: LOG_MSG("VALUE : %ld ",current->data.i.value); LOG_MSG("(%s)\n",(current->data.i.value) ? "HIGH":"LOW"); val = val + ((current->data.i.value)<<(i-1)); //printf("\nValue: %d\n\n",val); //for Check break; } LOG_MSG("\n"); current = current->next; }while(current); LOG_MSG("\nValue: %d\n\n",val); } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// //+ add_param_list //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// int add_param_list(struct gpio_param **head, unsigned long no,unsigned long mode, unsigned long arg1,unsigned long arg2, unsigned long arg3,unsigned long arg4){ struct gpio_param *add; struct gpio_param *tmp; add = (struct gpio_param *)malloc(sizeof(struct gpio_param)); if(!add) return -1; memset(add,0,sizeof(struct gpio_param)); add->no = no; add->mode = mode; switch(mode){ case MODE_OUTPUT: add->data.o.value = arg1; break; case MODE_INPUT: break; case MODE_GET: break; default: return -1; } if(*head){ tmp = *head; while(tmp->next){ tmp = tmp->next; } tmp->next = add; }else{ *head = add; } return 0; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// //+ free_param_list //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// int free_param_list(struct gpio_param **head){ struct gpio_param *tmp; struct gpio_param *current; int i = 0; if(!*head) return 0; current = *head; do{ i++; tmp = current; current = current->next; LOG_DEBUG("free[%2d] : 0x%08lx\n",i,(unsigned long)tmp); free(tmp); }while(current); *head=0; return 0; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// //+ port_drive int port_wr4bitD(int re,int dat)/ //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// int port_wr4bitD(int re,int dat){ //**2007215 NEW struct gpio_param *param_list = NULL; int fd; unsigned long value= dat; //***** 0x0-f:4itData unsigned long value_re = re; //***** 0:relow cmd 1:rehigh data add_param_list(¶m_list,port_E,MODE_OUTPUT,gen_set_output_param(0)); add_param_list(¶m_list,port_4bitD,MODE_OUTPUT,gen_set_output_param(value & BIT(0))); add_param_list(¶m_list,(port_4bitD<<1),MODE_OUTPUT,gen_set_output_param(value & BIT(1))); add_param_list(¶m_list,(port_4bitD<<2),MODE_OUTPUT,gen_set_output_param(value & BIT(2))); add_param_list(¶m_list,(port_4bitD<<3),MODE_OUTPUT,gen_set_output_param(value & BIT(3))); add_param_list(¶m_list,port_RS,MODE_OUTPUT,gen_set_output_param(value_re)); fd=open(DEVICE,O_RDWR); ioctl(fd,PARAM_SET,param_list); free_param_list(¶m_list); add_param_list(¶m_list,port_E,MODE_OUTPUT,gen_set_output_param(1)); ioctl(fd,PARAM_SET,param_list); free_param_list(¶m_list); add_param_list(¶m_list,port_E,MODE_OUTPUT,gen_set_output_param(0)); ioctl(fd,PARAM_SET,param_list); free_param_list(¶m_list); close(fd); return 0; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// //+ check_param_list //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// int check_param_list(struct gpio_param *head){ struct gpio_param *current; int i = 0; int val = 0; if(!head) return; current = head; do{ i++; switch(current->mode){ case MODE_OUTPUT: break; case MODE_INPUT: val = val + ((current->data.i.value)<<(i-1)); break; } current = current->next; }while(current); return val; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// //+ port_read /portEもチェック よって モジュールでEプルダウンのこと //+ E:lowでないとchr_LCDへ妙なのを書き込むよ とりあえず いま Eは外しておく //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// int port_read(){ //**2007216 NEW struct gpio_param *param_list = NULL; int fd; unsigned int rd_value = 0;; //***** 0x0-f:4itData + re + E add_param_list(¶m_list,port_4bitD,MODE_INPUT,gen_set_input_param()); add_param_list(¶m_list,(port_4bitD<<1),MODE_INPUT,gen_set_input_param()); add_param_list(¶m_list,(port_4bitD<<2),MODE_INPUT,gen_set_input_param()); add_param_list(¶m_list,(port_4bitD<<3),MODE_INPUT,gen_set_input_param()); add_param_list(¶m_list,port_RS,MODE_INPUT,gen_set_input_param()); add_param_list(¶m_list,port_E,MODE_INPUT,gen_set_input_param()); fd=open(DEVICE,O_RDWR); ioctl(fd,PARAM_SET,param_list); free_param_list(¶m_list); add_param_list(¶m_list,port_4bitD,MODE_GET,gen_get_param()); add_param_list(¶m_list,(port_4bitD<<1),MODE_GET,gen_get_param()); add_param_list(¶m_list,(port_4bitD<<2),MODE_GET,gen_get_param()); add_param_list(¶m_list,(port_4bitD<<3),MODE_GET,gen_get_param()); add_param_list(¶m_list,port_RS,MODE_GET,gen_get_param()); add_param_list(¶m_list,port_E,MODE_GET,gen_get_param()); ioctl(fd,PARAM_GET,param_list); display_param_list(param_list); close(fd); free_param_list(¶m_list); return rd_value; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// //+ port_read /portEもチェック よって モジュールでEプルダウンのこと //+ E:lowでないとchr_LCDへ妙なのを書き込むよ とりあえず いま Eは外しておく //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// int port_check(){ //**2007216 NEW struct gpio_param *param_list = NULL; int fd; unsigned int rd_value = 0;; //***** 0x0-f:4itData + re + E add_param_list(¶m_list,port_4bitD,MODE_INPUT,gen_set_input_param()); add_param_list(¶m_list,(port_4bitD<<1),MODE_INPUT,gen_set_input_param()); add_param_list(¶m_list,(port_4bitD<<2),MODE_INPUT,gen_set_input_param()); add_param_list(¶m_list,(port_4bitD<<3),MODE_INPUT,gen_set_input_param()); add_param_list(¶m_list,port_RS,MODE_INPUT,gen_set_input_param()); add_param_list(¶m_list,port_E,MODE_INPUT,gen_set_input_param()); fd=open(DEVICE,O_RDWR); ioctl(fd,PARAM_SET,param_list); free_param_list(¶m_list); add_param_list(¶m_list,port_4bitD,MODE_GET,gen_get_param()); add_param_list(¶m_list,(port_4bitD<<1),MODE_GET,gen_get_param()); add_param_list(¶m_list,(port_4bitD<<2),MODE_GET,gen_get_param()); add_param_list(¶m_list,(port_4bitD<<3),MODE_GET,gen_get_param()); add_param_list(¶m_list,port_RS,MODE_GET,gen_get_param()); add_param_list(¶m_list,port_E,MODE_GET,gen_get_param()); ioctl(fd,PARAM_GET,param_list); rd_value = check_param_list(param_list); close(fd); free_param_list(¶m_list); return rd_value; }