⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1009.fip.patch

📁 sm86xx内核源包括补丁( GPL )的
💻 PATCH
📖 第 1 页 / 共 4 页
字号:
+#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 + -