📄 1009.fip.patch
字号:
+#endif+ if (copy_to_user(ptr, (char *)&type, sizeof(unsigned long))) + return(-EFAULT);+ }+ break;+ default:+ return(-EIO);+ }+ return(0);+}++#endif /* __KERNEL__ */++/* Micro-second sleep */+static void fip_usleep(unsigned usec)+{+#ifdef __KERNEL__+ udelay(usec);+#else+ em86xx_usleep(usec);+#endif /* __KERNEL__ */+}++static unsigned int fip_read_reg(unsigned int offset)+{+// unsigned int val = *((volatile unsigned int *)(fip_base + offset));+ unsigned int val = gbus_read_uint32(pGBus, fip_base + offset);+ return(val);+}++static void fip_write_reg(unsigned int offset, unsigned int val)+{+ fip_wait_ready();+// *((volatile unsigned int *)(fip_base + offset)) = val;+ gbus_write_uint32(pGBus, fip_base + offset, val);+ fip_wait_ready();+}++#ifdef __KERNEL__+#ifdef ENABLE_WRITE_INTR+/* To queue the write request */+static void fip_queue_command(unsigned int cmd, unsigned int data)+{+ unsigned long flags;++ spin_lock_irqsave(&fip_priv.lock, flags);+ if (((fip_priv.cmd_pidx + 1) % CMDQ_SIZE) == fip_priv.cmd_cidx) {+ printk(KERN_ERR "Command queue full.\n");+ fip_issue_command(&fip_priv);+ } else {+ fip_priv.cmds[fip_priv.cmd_pidx].cmd = cmd;+ fip_priv.cmds[fip_priv.cmd_pidx].data = data;+ fip_priv.cmd_pidx = ((fip_priv.cmd_pidx + 1) % CMDQ_SIZE);+ }+ spin_unlock_irqrestore(&fip_priv.lock, flags);+}+#endif+#endif++#ifdef __KERNEL__+static int is_fip_busy_nowait(void)+{+ return((fip_read_reg(FIP_CONFIG) & FIP_BUSY) != 0);+}+#endif++#ifdef __KERNEL__+static+#endif /* __KERNEL__ */+int is_fip_busy(void)+{+#if defined(CONFIG_TANGOX_FIP_REF1)+ fip_usleep(10);+#elif defined(CONFIG_TANGOX_FIP_REF2)+ fip_usleep(20);+#endif+ return((fip_read_reg(FIP_CONFIG) & FIP_BUSY) != 0);+}++#ifdef __KERNEL__+static+#endif /* __KERNEL__ */+void fip_wait_ready(void)+{+ while (is_fip_busy());+#if defined(CONFIG_TANGOX_FIP_REF2)+ fip_usleep(20);+#endif+}++static void fip_user_display(int adr, int data)+{+#ifdef __KERNEL__+#ifdef ENABLE_WRITE_INTR+ fip_wait_ready();+ fip_queue_command(FIP_CMD_ADR_SETTING | (adr), data);+#else+ fip_wait_ready();+ fip_write_reg(FIP_DISPLAY_DATA, data);+ fip_write_reg(FIP_COMMAND, FIP_CMD_ADR_SETTING | (adr));+#endif+#else+ fip_wait_ready();+ fip_write_reg(FIP_DISPLAY_DATA, data);+ fip_wait_ready();+ fip_write_reg(FIP_COMMAND, FIP_CMD_ADR_SETTING | (adr));+ fip_wait_ready();+#endif+}++#ifdef __KERNEL__+static+#endif /* __KERNEL__ */+int fip_display_character(const int position, const char character) +{+ int i, byte1, byte2;+ unsigned char current_contents0, current_contents1;+#if defined(CONFIG_TANGOX_FIP_REF1)+ const int min_pos = 1;+#elif defined(CONFIG_TANGOX_FIP_REF2)+ const int min_pos = 0;+#endif+ + if ((position < min_pos) || (position > NUM_DIGITS)) {+#ifdef __KERNEL__+ printk(KERN_DEBUG "%s: position %d not available/supported.\n",+ fip_devname, position);+#else+ uart_printf("%s: position %d not available/supported.\n",+ fip_devname, position);+#endif /* __KERNEL__ */+ return(0);+ }++ for (i = 0; i < NUM_CHARACTERS; i++) {+ if (character == fipcharactersmap[i]) {+ byte1 = 24 - (3 * position);+ byte2 = 25 - (3 * position);++ current_contents0 = fipram[byte1];+ current_contents1 = fipram[byte2];++ /* clear */ + fipram[byte1] &= fipcharactermask[0];+ fipram[byte2] &= fipcharactermask[1];+ + /* set new bits */+ fipram[byte1] |= fipcharacters[i][0];+ fipram[byte2] |= fipcharacters[i][1];++ /* display if necessary */+ if (current_contents0 != fipram[byte1])+ fip_user_display(byte1, fipram[byte1]);+ if (current_contents1 != fipram[byte2])+ fip_user_display(byte2, fipram[byte2]);+ return(1);+ }+ }+#ifdef __KERNEL__+ printk(KERN_DEBUG "%s: character '%c' not available/supported.\n", fip_devname, character);+#else+ uart_printf("%s: character '%c' not available/supported.\n", fip_devname, character);+#endif /* __KERNEL__ */+ return(0);+}++#ifdef __KERNEL__+static+#endif /* __KERNEL__ */+void fip_clear(void)+{+ register int i;++ for (i = 0; i < MAX_FIP_RAM; i++) {+ fipram[i] = 0;+ fip_user_display(i, fipram[i]);+ }+}++#ifdef __KERNEL__+static+#endif /* __KERNEL__ */+void fip_display_raw(const int byte, const int bit, const int on) +{+ unsigned char current_contents;+ current_contents = fipram[byte];+ if (on != 0)+ fipram[byte] |= (1 << bit);+ else+ fipram[byte] &= ~(1 << bit);++ /* display only if necessary */+ if (current_contents != fipram[byte])+ fip_user_display(byte, fipram[byte]);+}++#ifdef __KERNEL__+static+#endif /* __KERNEL__ */+void fip_display_symbol(const int symbol, const int on) +{+ if ((symbol < 0) || (symbol >= NUM_SYMBOLS)) {+#ifdef __KERNEL__+ printk(KERN_DEBUG "%s: symbol #%d not available/supported.\n", fip_devname, symbol);+#else+ uart_printf("%s: symbol #%d not available/supported.\n", fip_devname, symbol);+#endif /* __KERNEL__ */+ return;+ }++#if defined(CONFIG_TANGOX_FIP_REF1)+ fip_display_raw(fipsymbols[symbol][0], fipsymbols[symbol][1], on);+#elif defined(CONFIG_TANGOX_FIP_REF2)+ //0-99 displays tra/chap number field (0-99)+ //100-199 displays title number field (0-99)+ //200 clears all in this area+ //201-206 displays symbols without effecting other fields+ if (symbol > 200) {+ //fip_display_raw(fipsymbols[symbol-200][0], fipsymbols[symbol-200][1], on);+ switch(symbol) {+ case 201:+ fip_user_display(0, 1);+ break;+ case 202:+ fip_user_display(0, 2);+ break;+ case 203:+ fip_user_display(0, 4);+ break;+ case 204:+ fip_user_display(0, 8);+ break;+ case 205:+ fip_user_display(27, 1);+ break;+ case 206:+ fip_user_display(29, 1);+ break;+ }+ } else if (symbol == 200) { + fipram[27] = fipxcharacters[11];+ fipram[28] = fipxcharacters[11];+ fipram[30] = fipxcharacters[11];+ fipram[31] = fipxcharacters[11];+ fip_user_display(27, fipram[27]);+ fip_user_display(28, fipram[28]); + fip_user_display(30, fipram[30]);+ fip_user_display(31, fipram[31]);+ + } else if (symbol >= 100) { + fipram[27] = fipxcharacters[(symbol-100)/10];+ fipram[28] = fipxcharacters[(symbol-100)%10];+ fip_user_display(27, fipram[27]);+ fip_user_display(28, fipram[28]);+ } else if (symbol >= 0) {+ fipram[30] = fipxcharacters[symbol/10];+ fipram[31] = fipxcharacters[symbol%10]; + fip_user_display(30, fipram[30]);+ fip_user_display(31, fipram[31]); + }+#endif+}++#ifdef __KERNEL__+static+#endif /* __KERNEL__ */+void fip_write_text(const int position, const char *text, const int flags) +{+ int x, i, j;+ int textLen = strlen (text);++#if defined(CONFIG_TANGOX_FIP_REF1)+ if (flags & FIP_CENTER)+ x = (position > 0) ? position - textLen / 2 : (NUM_DIGITS - textLen) / 2 + 1;+ else if (flags & FIP_RIGHT)+ x = (position > 0) ? position - textLen : NUM_DIGITS - textLen + 1;+ else + x = (position > 0) ? position : 1;+ if (x < 1)+ x = 1;++ if ((flags & FIP_NO_CLEAR) == 0) {+ /* clear colons */+ fip_display_symbol(COLON_HOUR_MIN_FIP_ON, 0);+ fip_display_symbol(COLON_MIN_SEC_FIP_ON, 0);+ }+#elif defined(CONFIG_TANGOX_FIP_REF2)+ if (flags & FIP_CENTER)+ x = (position >= 0) ? position - textLen / 2 : (NUM_DIGITS - textLen) / 2 + 1;+ else if (flags & FIP_RIGHT)+ x = (position >= 0) ? position - textLen : NUM_DIGITS - textLen + 1;+ else + x = (position >= 0) ? position : 1;+ if (x < 1)+ x = 1;+#endif++ /* show/write text */+ j = 0;+ for (i = 1; i <= NUM_DIGITS; i++) {+ if ((i < x) || (i >= (x+textLen)))+ fip_display_character(i, ' ');+ else if (!fip_display_character(i, text[j++])) {+#ifdef __KERNEL__+ printk(KERN_DEBUG "%s: cannot show text '%s'.\n", fip_devname, text);+#else+ uart_printf("%s: cannot show text '%s'.\n", fip_devname, text);+#endif /* __KERNEL__ */+ break;+ }+ }+}++#ifdef __KERNEL__ +static +#endif /* __KERNEL__ */+int fip_show_hms(int hour, int minute, int second)+{+ if (hour < L_OFF || minute < L_OFF || second < L_OFF ||+ hour > 99 || minute > 59 || second > 59) {+#ifdef __KERNEL__+ printk(KERN_DEBUG "%s: parameters passed not in valid range\n", fip_devname);+#else+ uart_printf("%s: parameters passed not in valid range\n", fip_devname);+#endif+ return(1);+ }+ +#if defined(CONFIG_TANGOX_FIP_REF1)+ // hour+ fip_display_character(1, ' ');+ fip_display_character(2, (hour==L_OFF) ? ' ' : hour/10 + '0');+ fip_display_character(3, (hour==L_OFF) ? ' ' : hour%10 + '0');++ // minute + fip_display_character(4, (minute==L_OFF) ? ' ' : minute/10 + '0');+ fip_display_character(5, (minute==L_OFF) ? ' ' : minute%10 + '0');++ // second+ fip_display_character(6, (second==L_OFF) ? ' ' : second/10 + '0');+ fip_display_character(7, (second==L_OFF) ? ' ' : second%10 + '0');++ // show colons if needed+ fip_display_symbol(COLON_HOUR_MIN_FIP_ON, (hour == L_OFF) ? 0 : 1);+ fip_display_symbol(COLON_MIN_SEC_FIP_ON, ((hour == L_OFF) && (minute == L_OFF)) ? 0 : 1);+#elif defined(CONFIG_TANGOX_FIP_REF2)+ // hour+ fip_display_character(0, (hour==L_OFF) ? ' ' : hour/10 + '0');+ fip_display_character(1, (hour==L_OFF) ? ' ' : hour%10 + '0');++ // minute + fip_display_character(2, (minute==L_OFF) ? ' ' : minute/10 + '0');+ fip_display_character(3, (minute==L_OFF) ? ' ' : minute%10 + '0');++ // second+ fip_display_character(4, (second==L_OFF) ? ' ' : second/10 + '0');+ fip_display_character(5, (second==L_OFF) ? ' ' : second%10 + '0');+ fip_display_character(6, ' ');+ fip_display_character(7, ' ');+#endif+ return(0);+}++#ifdef __KERNEL__ +static +#endif /* __KERNEL__ */+int fip_init(void)+{+ static int initflag = 0;++ if (initflag != 0)+ return(0);++#ifdef __KERNEL__+ /* Disable FIP and interrupt first */+ fip_wait_ready();+ fip_write_reg(FIP_CONFIG, 0);+ fip_wait_ready();++#ifdef ENABLE_WRITE_INTR+ /* Enable FIP and interrupts (read: 0x20000, write: 0x10000) */+ fip_write_reg(FIP_CONFIG, (FIP_DIVIDER | FIP_ENABLE | 0x30000));+#else+ /* Enable FIP and interrupts (read: 0x20000) */+ fip_write_reg(FIP_CONFIG, (FIP_DIVIDER | FIP_ENABLE | 0x20000));+#endif+#else+ fip_wait_ready();+ /* Enable FIP wthout enabling interrupt */+ fip_write_reg(FIP_CONFIG, (FIP_DIVIDER | FIP_ENABLE));+#endif /* __KERNEL__ */+ fip_wait_ready();++ /* Clear exisiting IRQ, if any */+ fip_write_reg(FIP_INT, 0x3);+ fip_wait_ready();++ /* select display mode */+ fip_write_reg(FIP_COMMAND, FIP_DISPLAY_MODE);+ fip_wait_ready();++ /* select brightness of display and turn it on */+ fip_write_reg(FIP_COMMAND, FIP_CMD_DISP_CTRL_TURN_DISPLAY_ON | brightness);+ fip_wait_ready();++ /* select write to display and fixed addressing */+ fip_write_reg(FIP_COMMAND, FIP_CMD_DATA_SET_ADR_MODE_FIXED_ADR);+ fip_wait_ready();++ fip_clear();+ fip_wait_ready();+ initflag = 1;+ return(0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -