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

📄 uboot-20061030-neo1973.patch

📁 Uboot常用的移植patches, 方便定制移植到s3c2440
💻 PATCH
📖 第 1 页 / 共 5 页
字号:
+	"neo1973 backlight (on|off) - switch backlight on or off\n"+	"neo1973 led num (on|off) - switch LED number 'num' on or off\n"+	"neo1973 vibrator (on|off) - switch vibrator on or off\n"+	"neo1973 gsm (on|off|version) - switch GSM Modem on/off or print firmware version\n"+	"neo1973 gps (on|off) - switch GPS system on or off\n"+);+#endif	/* CONFIG_CMD_BDI */Index: u-boot/board/neo1973/common/jbt6k74.c===================================================================--- /dev/null+++ u-boot/board/neo1973/common/jbt6k74.c@@ -0,0 +1,420 @@+/* u-boot driver for the tpo JBT6K74-AS LCM ASIC+ *+ * Copyright (C) 2006-2007 by OpenMoko, Inc.+ * Author: Harald Welte <laforge@openmoko.org>+ * All rights reserved.+ *+ * This program is free software; you can redistribute it and/or+ * modify it under the terms of the GNU General Public License as+ * published by the Free Software Foundation; either version 2 of+ * the License, or (at your option) any later version.+ *+ * This program is distributed in the hope that it will be useful,+ * but WITHOUT ANY WARRANTY; without even the implied warranty of+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the+ * GNU General Public License for more details.+ *+ * You should have received a copy of the GNU General Public License+ * along with this program; if not, write to the Free Software+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,+ * MA 02111-1307 USA+ *+ */+#include <common.h>+#include <spi.h>+#include <video_fb.h>+#include <asm/errno.h>+#include <s3c2410.h>+#include "jbt6k74.h"++#if 0+#define DEBUGP(x, args...) printf("%s: " x, __FUNCTION__, ## args);+#define DEBUGPC(x, args...) printf(x, ## args);+#else+#define DEBUGP(x, args...) do { } while (0)+#define DEBUGPC(x, args...) do { } while (0)+#endif+++enum jbt_register {+	JBT_REG_SLEEP_IN		= 0x10,+	JBT_REG_SLEEP_OUT		= 0x11,++	JBT_REG_DISPLAY_OFF		= 0x28,+	JBT_REG_DISPLAY_ON		= 0x29,++	JBT_REG_RGB_FORMAT		= 0x3a,+	JBT_REG_QUAD_RATE		= 0x3b,++	JBT_REG_POWER_ON_OFF		= 0xb0,+	JBT_REG_BOOSTER_OP		= 0xb1,+	JBT_REG_BOOSTER_MODE		= 0xb2,+	JBT_REG_BOOSTER_FREQ		= 0xb3,+	JBT_REG_OPAMP_SYSCLK		= 0xb4,+	JBT_REG_VSC_VOLTAGE		= 0xb5,+	JBT_REG_VCOM_VOLTAGE		= 0xb6,+	JBT_REG_EXT_DISPL		= 0xb7,+	JBT_REG_OUTPUT_CONTROL		= 0xb8,+	JBT_REG_DCCLK_DCEV		= 0xb9,+	JBT_REG_DISPLAY_MODE1		= 0xba,+	JBT_REG_DISPLAY_MODE2		= 0xbb,+	JBT_REG_DISPLAY_MODE		= 0xbc,+	JBT_REG_ASW_SLEW		= 0xbd,+	JBT_REG_DUMMY_DISPLAY		= 0xbe,+	JBT_REG_DRIVE_SYSTEM		= 0xbf,++	JBT_REG_SLEEP_OUT_FR_A		= 0xc0,+	JBT_REG_SLEEP_OUT_FR_B		= 0xc1,+	JBT_REG_SLEEP_OUT_FR_C		= 0xc2,+	JBT_REG_SLEEP_IN_LCCNT_D	= 0xc3,+	JBT_REG_SLEEP_IN_LCCNT_E	= 0xc4,+	JBT_REG_SLEEP_IN_LCCNT_F	= 0xc5,+	JBT_REG_SLEEP_IN_LCCNT_G	= 0xc6,++	JBT_REG_GAMMA1_FINE_1		= 0xc7,+	JBT_REG_GAMMA1_FINE_2		= 0xc8,+	JBT_REG_GAMMA1_INCLINATION	= 0xc9,+	JBT_REG_GAMMA1_BLUE_OFFSET	= 0xca,++	JBT_REG_BLANK_CONTROL		= 0xcf,+	JBT_REG_BLANK_TH_TV		= 0xd0,+	JBT_REG_CKV_ON_OFF		= 0xd1,+	JBT_REG_CKV_1_2			= 0xd2,+	JBT_REG_OEV_TIMING		= 0xd3,+	JBT_REG_ASW_TIMING_1		= 0xd4,+	JBT_REG_ASW_TIMING_2		= 0xd5,++	JBT_REG_HCLOCK_VGA		= 0xec,+	JBT_REG_HCLOCK_QVGA		= 0xed,++};++static const char *jbt_state_names[] = {+	[JBT_STATE_DEEP_STANDBY]	= "deep-standby",+	[JBT_STATE_SLEEP]		= "sleep",+	[JBT_STATE_NORMAL]		= "normal",+};++#define GTA01_SCLK	(1 << 7) 	/* GPG7 */+#define GTA01_MOSI	(1 << 6)	/* GPG6 */+#define GTA01_MISO	(1 << 5)	/* GPG5 */+#define GTA01_CS	(1 << 3)	/* GPG3 */++#define SPI_READ        ((immr->GPGDAT & GTA01_MISO) != 0)++#define SPI_CS(bit) 	if (bit) gpio->GPGDAT |= GTA01_CS; \+			else gpio->GPGDAT &= ~GTA01_CS++#define SPI_SDA(bit)    if (bit) gpio->GPGDAT |=  GTA01_MOSI; \+			else    gpio->GPGDAT &= ~GTA01_MOSI++#define SPI_SCL(bit)    if (bit) gpio->GPGDAT |=  GTA01_SCLK; \+			else    gpio->GPGDAT &= ~GTA01_SCLK++/* 150uS minimum clock cycle, we have two of this plus our other+ * instructions */+#define SPI_DELAY	udelay(100)	/* 200uS */+++#define JBT_TX_BUF_SIZE+struct jbt_info {+	enum jbt_state state;+	u_int16_t tx_buf[4];+	struct spi_device *spi_dev;+};++static struct jbt_info _jbt, *jbt = &_jbt;++static int jbt_spi_xfer(int wordnum, int bitlen, u_int16_t *dout)+{+	S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();+	u_int16_t tmpdout = 0;+	int   i, j;++	DEBUGP("spi_xfer: dout %08X wordnum %u bitlen %d\n",+		*(uint *)dout, wordnum, bitlen);++	SPI_CS(0);++	for (i = 0; i < wordnum; i ++) {+		tmpdout = dout[i];++		for (j = 0; j < bitlen; j++) {+			SPI_SCL(0);+			if (tmpdout & (1 << bitlen-1)) {+				SPI_SDA(1);+				DEBUGPC("1");+			} else {+				SPI_SDA(0);+				DEBUGPC("0");+			}+			SPI_DELAY;+			SPI_SCL(1);+			SPI_DELAY;+			tmpdout <<= 1;+		}+		DEBUGPC(" ");+	}+	DEBUGPC("\n");++	SPI_CS(1);++	return 0;+}++#define JBT_COMMAND	0x000+#define JBT_DATA	0x100++static int jbt_reg_write_nodata(struct jbt_info *jbt, u_int8_t reg)+{+	int rc;++	jbt->tx_buf[0] = JBT_COMMAND | reg;++	rc = jbt_spi_xfer(1, 9, jbt->tx_buf);++	return rc;+}+++static int jbt_reg_write(struct jbt_info *jbt, u_int8_t reg, u_int8_t data)+{+	int rc;++	jbt->tx_buf[0] = JBT_COMMAND | reg;+	jbt->tx_buf[1] = JBT_DATA | data;++	rc = jbt_spi_xfer(2, 9, jbt->tx_buf);++	return rc;+}++static int jbt_reg_write16(struct jbt_info *jbt, u_int8_t reg, u_int16_t data)+{+	int rc;++	jbt->tx_buf[0] = JBT_COMMAND | reg;+	jbt->tx_buf[1] = JBT_DATA | (data >> 8);+	jbt->tx_buf[2] = JBT_DATA | (data & 0xff);++	rc = jbt_spi_xfer(3, 9, jbt->tx_buf);++	return rc;+}++static int jbt_init_regs(struct jbt_info *jbt)+{+	int rc;++	DEBUGP("entering\n");++	rc = jbt_reg_write(jbt, JBT_REG_DISPLAY_MODE1, 0x01);+	rc |= jbt_reg_write(jbt, JBT_REG_DISPLAY_MODE2, 0x00);+	rc |= jbt_reg_write(jbt, JBT_REG_RGB_FORMAT, 0x60);+	rc |= jbt_reg_write(jbt, JBT_REG_DRIVE_SYSTEM, 0x10);+	rc |= jbt_reg_write(jbt, JBT_REG_BOOSTER_OP, 0x56);+	rc |= jbt_reg_write(jbt, JBT_REG_BOOSTER_MODE, 0x33);+	rc |= jbt_reg_write(jbt, JBT_REG_BOOSTER_FREQ, 0x11);+	rc |= jbt_reg_write(jbt, JBT_REG_BOOSTER_FREQ, 0x11);+	rc |= jbt_reg_write(jbt, JBT_REG_OPAMP_SYSCLK, 0x02);+	rc |= jbt_reg_write(jbt, JBT_REG_VSC_VOLTAGE, 0x2b);+	rc |= jbt_reg_write(jbt, JBT_REG_VCOM_VOLTAGE, 0x40);+	rc |= jbt_reg_write(jbt, JBT_REG_EXT_DISPL, 0x03);+	rc |= jbt_reg_write(jbt, JBT_REG_DCCLK_DCEV, 0x04);+	rc |= jbt_reg_write(jbt, JBT_REG_ASW_SLEW, 0x02);+	rc |= jbt_reg_write(jbt, JBT_REG_DUMMY_DISPLAY, 0x00);++	rc |= jbt_reg_write(jbt, JBT_REG_SLEEP_OUT_FR_A, 0x11);+	rc |= jbt_reg_write(jbt, JBT_REG_SLEEP_OUT_FR_B, 0x11);+	rc |= jbt_reg_write(jbt, JBT_REG_SLEEP_OUT_FR_C, 0x11);+	rc |= jbt_reg_write16(jbt, JBT_REG_SLEEP_IN_LCCNT_D, 0x2040);+	rc |= jbt_reg_write16(jbt, JBT_REG_SLEEP_IN_LCCNT_E, 0x60c0);+	rc |= jbt_reg_write16(jbt, JBT_REG_SLEEP_IN_LCCNT_F, 0x1020);+	rc |= jbt_reg_write16(jbt, JBT_REG_SLEEP_IN_LCCNT_G, 0x60c0);++	rc |= jbt_reg_write16(jbt, JBT_REG_GAMMA1_FINE_1, 0x5533);+	rc |= jbt_reg_write(jbt, JBT_REG_GAMMA1_FINE_2, 0x00);+	rc |= jbt_reg_write(jbt, JBT_REG_GAMMA1_INCLINATION, 0x00);+	rc |= jbt_reg_write(jbt, JBT_REG_GAMMA1_BLUE_OFFSET, 0x00);+	rc |= jbt_reg_write(jbt, JBT_REG_GAMMA1_BLUE_OFFSET, 0x00);++	rc |= jbt_reg_write16(jbt, JBT_REG_HCLOCK_VGA, 0x1f0);+	rc |= jbt_reg_write(jbt, JBT_REG_BLANK_CONTROL, 0x02);+	rc |= jbt_reg_write16(jbt, JBT_REG_BLANK_TH_TV, 0x0804);+	rc |= jbt_reg_write16(jbt, JBT_REG_BLANK_TH_TV, 0x0804);++	rc |= jbt_reg_write(jbt, JBT_REG_CKV_ON_OFF, 0x01);+	rc |= jbt_reg_write16(jbt, JBT_REG_CKV_1_2, 0x0000);++	rc |= jbt_reg_write16(jbt, JBT_REG_OEV_TIMING, 0x0d0e);+	rc |= jbt_reg_write16(jbt, JBT_REG_ASW_TIMING_1, 0x11a4);+	rc |= jbt_reg_write(jbt, JBT_REG_ASW_TIMING_2, 0x0e);++#if 0+	rc |= jbt_reg_write16(jbt, JBT_REG_HCLOCK_QVGA, 0x00ff);+	rc |= jbt_reg_write16(jbt, JBT_REG_HCLOCK_QVGA, 0x00ff);+#endif++	return rc;+}++static int standby_to_sleep(struct jbt_info *jbt)+{+	int rc;++	DEBUGP("entering\n");++	/* three times command zero */+	rc = jbt_reg_write_nodata(jbt, 0x00);+	udelay(1000);+	rc = jbt_reg_write_nodata(jbt, 0x00);+	udelay(1000);+	rc = jbt_reg_write_nodata(jbt, 0x00);+	udelay(1000);++	/* deep standby out */+	rc |= jbt_reg_write(jbt, JBT_REG_POWER_ON_OFF, 0x17);++	return rc;+}++static int sleep_to_normal(struct jbt_info *jbt)+{+	int rc;+	DEBUGP("entering\n");++	/* RGB I/F on, RAM wirte off, QVGA through, SIGCON enable */+	rc = jbt_reg_write(jbt, JBT_REG_DISPLAY_MODE, 0x80);++	/* Quad mode off */+	rc |= jbt_reg_write(jbt, JBT_REG_QUAD_RATE, 0x00);++	/* AVDD on, XVDD on */+	rc |= jbt_reg_write(jbt, JBT_REG_POWER_ON_OFF, 0x16);++	/* Output control */+	rc |= jbt_reg_write16(jbt, JBT_REG_OUTPUT_CONTROL, 0xfff9);++	/* Sleep mode off */+	rc |= jbt_reg_write_nodata(jbt, JBT_REG_SLEEP_OUT);++	/* initialize register set */+	rc |= jbt_init_regs(jbt);+	return rc;+}++static int normal_to_sleep(struct jbt_info *jbt)+{+	int rc;+	DEBUGP("entering\n");++	rc = jbt_reg_write_nodata(jbt, JBT_REG_DISPLAY_OFF);+	rc |= jbt_reg_write16(jbt, JBT_REG_OUTPUT_CONTROL, 0x8002);+	rc |= jbt_reg_write_nodata(jbt, JBT_REG_SLEEP_IN);++	return rc;+}++static int sleep_to_standby(struct jbt_info *jbt)+{+	DEBUGP("entering\n");+	return jbt_reg_write(jbt, JBT_REG_POWER_ON_OFF, 0x00);+}++/* frontend function */+int jbt6k74_enter_state(enum jbt_state new_state)+{+	int rc = -EINVAL;++	DEBUGP("entering(old_state=%u, new_state=%u)\n", jbt->state, new_state);++	switch (jbt->state) {+	case JBT_STATE_DEEP_STANDBY:+		switch (new_state) {+		case JBT_STATE_DEEP_STANDBY:+			rc = 0;+			break;+		case JBT_STATE_SLEEP:+			rc = standby_to_sleep(jbt);+			break;+		case JBT_STATE_NORMAL:+			/* first transition into sleep */+			rc = standby_to_sleep(jbt);+			/* then transition into normal */+			rc |= sleep_to_normal(jbt);+			break;+		}+		break;+	case JBT_STATE_SLEEP:+		switch (new_state) {+		case JBT_STATE_SLEEP:+			rc = 0;+			break;+		case JBT_STATE_DEEP_STANDBY:+			rc = sleep_to_standby(jbt);+			break;+		case JBT_STATE_NORMAL:+			rc = sleep_to_normal(jbt);+			break;+		}+		break;+	case JBT_STATE_NORMAL:+		switch (new_state) {+		case JBT_STATE_NORMAL:+			rc = 0;+			break;+		case JBT_STATE_DEEP_STANDBY:+			/* first transition into sleep */+			rc = normal_to_sleep(jbt);+			/* then transition into deep standby */+			rc |= sleep_to_standby(jbt);+			break;+		case JBT_STATE_SLEEP:+			rc = normal_to_sleep(jbt);+			break;+		}+		break;+	}++	return rc;+}++int jbt6k74_display_onoff(int on)+{+	DEBUGP("entering\n");+	if (on)+		return jbt_reg_write_nodata(jbt, JBT_REG_DISPLAY_ON);+	else+		return jbt_reg_write_nodata(jbt, JBT_REG_DISPLAY_OFF);+}++int jbt6k74_init(void)+{+	S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();++	/* initialize SPI for GPIO bitbang */+	gpio->GPGCON &= 0xffff033f;+	gpio->GPGCON |= 0x00005440;++	/* get LCM out of reset */+	gpio->GPCDAT |= (1 << 6);++	/* according to data sheet: wait 50ms (Tpos of LCM). However, 50ms+	 * seems unreliable with later LCM batches, increasing to 90ms */+	udelay(90000);++	return 0;+}++void board_video_init(GraphicDevice *pGD)+{+	S3C24X0_LCD * const lcd = S3C24X0_GetBase_LCD();++	lcd->LCDCON1 = 0x00000178; /* CLKVAL=1, BPPMODE=16bpp, TFT, ENVID=0 */++	lcd->LCDCON2 = 0x019fc3c1;+	lcd->LCDCON3 = 0x0039df67;+	lcd->LCDCON4 = 0x00000007;+	lcd->LCDCON5 = 0x0001cf09;+	lcd->LPCSEL  = 0x00000000;+}Index: u-boot/board/neo1973/common/jbt6k74.h===================================================================--- /dev/null+++ u-boot/board/neo1973/common/jbt6k74.h@@ -0,0 +1,14 @@+#ifndef _JBT6K74_H+#define _JBT6K74_H++enum jbt_state {+	JBT_STATE_DEEP_STANDBY,+	JBT_STATE_SLEEP,+	JBT_STATE_NORMAL,+};++int jbt6k74_init(void);+int jbt6k74_display_onoff(int on);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -