2
0

nseries.c 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467
  1. /*
  2. * Nokia N-series internet tablets.
  3. *
  4. * Copyright (C) 2007 Nokia Corporation
  5. * Written by Andrzej Zaborowski <andrew@openedhand.com>
  6. *
  7. * This program is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU General Public License as
  9. * published by the Free Software Foundation; either version 2 or
  10. * (at your option) version 3 of the License.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License along
  18. * with this program; if not, see <http://www.gnu.org/licenses/>.
  19. */
  20. #include "qemu/osdep.h"
  21. #include "qapi/error.h"
  22. #include "cpu.h"
  23. #include "qemu/cutils.h"
  24. #include "qemu/bswap.h"
  25. #include "sysemu/reset.h"
  26. #include "sysemu/runstate.h"
  27. #include "sysemu/sysemu.h"
  28. #include "hw/arm/omap.h"
  29. #include "hw/arm/boot.h"
  30. #include "hw/irq.h"
  31. #include "ui/console.h"
  32. #include "hw/boards.h"
  33. #include "hw/i2c/i2c.h"
  34. #include "hw/display/blizzard.h"
  35. #include "hw/input/tsc2xxx.h"
  36. #include "hw/misc/cbus.h"
  37. #include "hw/misc/tmp105.h"
  38. #include "hw/qdev-properties.h"
  39. #include "hw/block/flash.h"
  40. #include "hw/hw.h"
  41. #include "hw/bt.h"
  42. #include "hw/loader.h"
  43. #include "hw/sysbus.h"
  44. #include "qemu/log.h"
  45. #include "exec/address-spaces.h"
  46. /* Nokia N8x0 support */
  47. struct n800_s {
  48. MemoryRegion sdram;
  49. struct omap_mpu_state_s *mpu;
  50. struct rfbi_chip_s blizzard;
  51. struct {
  52. void *opaque;
  53. uint32_t (*txrx)(void *opaque, uint32_t value, int len);
  54. uWireSlave *chip;
  55. } ts;
  56. int keymap[0x80];
  57. DeviceState *kbd;
  58. DeviceState *usb;
  59. void *retu;
  60. void *tahvo;
  61. DeviceState *nand;
  62. };
  63. /* GPIO pins */
  64. #define N8X0_TUSB_ENABLE_GPIO 0
  65. #define N800_MMC2_WP_GPIO 8
  66. #define N800_UNKNOWN_GPIO0 9 /* out */
  67. #define N810_MMC2_VIOSD_GPIO 9
  68. #define N810_HEADSET_AMP_GPIO 10
  69. #define N800_CAM_TURN_GPIO 12
  70. #define N810_GPS_RESET_GPIO 12
  71. #define N800_BLIZZARD_POWERDOWN_GPIO 15
  72. #define N800_MMC1_WP_GPIO 23
  73. #define N810_MMC2_VSD_GPIO 23
  74. #define N8X0_ONENAND_GPIO 26
  75. #define N810_BLIZZARD_RESET_GPIO 30
  76. #define N800_UNKNOWN_GPIO2 53 /* out */
  77. #define N8X0_TUSB_INT_GPIO 58
  78. #define N8X0_BT_WKUP_GPIO 61
  79. #define N8X0_STI_GPIO 62
  80. #define N8X0_CBUS_SEL_GPIO 64
  81. #define N8X0_CBUS_DAT_GPIO 65
  82. #define N8X0_CBUS_CLK_GPIO 66
  83. #define N8X0_WLAN_IRQ_GPIO 87
  84. #define N8X0_BT_RESET_GPIO 92
  85. #define N8X0_TEA5761_CS_GPIO 93
  86. #define N800_UNKNOWN_GPIO 94
  87. #define N810_TSC_RESET_GPIO 94
  88. #define N800_CAM_ACT_GPIO 95
  89. #define N810_GPS_WAKEUP_GPIO 95
  90. #define N8X0_MMC_CS_GPIO 96
  91. #define N8X0_WLAN_PWR_GPIO 97
  92. #define N8X0_BT_HOST_WKUP_GPIO 98
  93. #define N810_SPEAKER_AMP_GPIO 101
  94. #define N810_KB_LOCK_GPIO 102
  95. #define N800_TSC_TS_GPIO 103
  96. #define N810_TSC_TS_GPIO 106
  97. #define N8X0_HEADPHONE_GPIO 107
  98. #define N8X0_RETU_GPIO 108
  99. #define N800_TSC_KP_IRQ_GPIO 109
  100. #define N810_KEYBOARD_GPIO 109
  101. #define N800_BAT_COVER_GPIO 110
  102. #define N810_SLIDE_GPIO 110
  103. #define N8X0_TAHVO_GPIO 111
  104. #define N800_UNKNOWN_GPIO4 112 /* out */
  105. #define N810_SLEEPX_LED_GPIO 112
  106. #define N800_TSC_RESET_GPIO 118 /* ? */
  107. #define N810_AIC33_RESET_GPIO 118
  108. #define N800_TSC_UNKNOWN_GPIO 119 /* out */
  109. #define N8X0_TMP105_GPIO 125
  110. /* Config */
  111. #define BT_UART 0
  112. #define XLDR_LL_UART 1
  113. /* Addresses on the I2C bus 0 */
  114. #define N810_TLV320AIC33_ADDR 0x18 /* Audio CODEC */
  115. #define N8X0_TCM825x_ADDR 0x29 /* Camera */
  116. #define N810_LP5521_ADDR 0x32 /* LEDs */
  117. #define N810_TSL2563_ADDR 0x3d /* Light sensor */
  118. #define N810_LM8323_ADDR 0x45 /* Keyboard */
  119. /* Addresses on the I2C bus 1 */
  120. #define N8X0_TMP105_ADDR 0x48 /* Temperature sensor */
  121. #define N8X0_MENELAUS_ADDR 0x72 /* Power management */
  122. /* Chipselects on GPMC NOR interface */
  123. #define N8X0_ONENAND_CS 0
  124. #define N8X0_USB_ASYNC_CS 1
  125. #define N8X0_USB_SYNC_CS 4
  126. #define N8X0_BD_ADDR 0x00, 0x1a, 0x89, 0x9e, 0x3e, 0x81
  127. static void n800_mmc_cs_cb(void *opaque, int line, int level)
  128. {
  129. /* TODO: this seems to actually be connected to the menelaus, to
  130. * which also both MMC slots connect. */
  131. omap_mmc_enable((struct omap_mmc_s *) opaque, !level);
  132. }
  133. static void n8x0_gpio_setup(struct n800_s *s)
  134. {
  135. qdev_connect_gpio_out(s->mpu->gpio, N8X0_MMC_CS_GPIO,
  136. qemu_allocate_irq(n800_mmc_cs_cb, s->mpu->mmc, 0));
  137. qemu_irq_lower(qdev_get_gpio_in(s->mpu->gpio, N800_BAT_COVER_GPIO));
  138. }
  139. #define MAEMO_CAL_HEADER(...) \
  140. 'C', 'o', 'n', 'F', 0x02, 0x00, 0x04, 0x00, \
  141. __VA_ARGS__, \
  142. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  143. static const uint8_t n8x0_cal_wlan_mac[] = {
  144. MAEMO_CAL_HEADER('w', 'l', 'a', 'n', '-', 'm', 'a', 'c')
  145. 0x1c, 0x00, 0x00, 0x00, 0x47, 0xd6, 0x69, 0xb3,
  146. 0x30, 0x08, 0xa0, 0x83, 0x00, 0x00, 0x00, 0x00,
  147. 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00,
  148. 0x89, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00,
  149. 0x5d, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00,
  150. };
  151. static const uint8_t n8x0_cal_bt_id[] = {
  152. MAEMO_CAL_HEADER('b', 't', '-', 'i', 'd', 0, 0, 0)
  153. 0x0a, 0x00, 0x00, 0x00, 0xa3, 0x4b, 0xf6, 0x96,
  154. 0xa8, 0xeb, 0xb2, 0x41, 0x00, 0x00, 0x00, 0x00,
  155. N8X0_BD_ADDR,
  156. };
  157. static void n8x0_nand_setup(struct n800_s *s)
  158. {
  159. char *otp_region;
  160. DriveInfo *dinfo;
  161. s->nand = qdev_create(NULL, "onenand");
  162. qdev_prop_set_uint16(s->nand, "manufacturer_id", NAND_MFR_SAMSUNG);
  163. /* Either 0x40 or 0x48 are OK for the device ID */
  164. qdev_prop_set_uint16(s->nand, "device_id", 0x48);
  165. qdev_prop_set_uint16(s->nand, "version_id", 0);
  166. qdev_prop_set_int32(s->nand, "shift", 1);
  167. dinfo = drive_get(IF_MTD, 0, 0);
  168. if (dinfo) {
  169. qdev_prop_set_drive(s->nand, "drive", blk_by_legacy_dinfo(dinfo),
  170. &error_fatal);
  171. }
  172. qdev_init_nofail(s->nand);
  173. sysbus_connect_irq(SYS_BUS_DEVICE(s->nand), 0,
  174. qdev_get_gpio_in(s->mpu->gpio, N8X0_ONENAND_GPIO));
  175. omap_gpmc_attach(s->mpu->gpmc, N8X0_ONENAND_CS,
  176. sysbus_mmio_get_region(SYS_BUS_DEVICE(s->nand), 0));
  177. otp_region = onenand_raw_otp(s->nand);
  178. memcpy(otp_region + 0x000, n8x0_cal_wlan_mac, sizeof(n8x0_cal_wlan_mac));
  179. memcpy(otp_region + 0x800, n8x0_cal_bt_id, sizeof(n8x0_cal_bt_id));
  180. /* XXX: in theory should also update the OOB for both pages */
  181. }
  182. static qemu_irq n8x0_system_powerdown;
  183. static void n8x0_powerdown_req(Notifier *n, void *opaque)
  184. {
  185. qemu_irq_raise(n8x0_system_powerdown);
  186. }
  187. static Notifier n8x0_system_powerdown_notifier = {
  188. .notify = n8x0_powerdown_req
  189. };
  190. static void n8x0_i2c_setup(struct n800_s *s)
  191. {
  192. DeviceState *dev;
  193. qemu_irq tmp_irq = qdev_get_gpio_in(s->mpu->gpio, N8X0_TMP105_GPIO);
  194. I2CBus *i2c = omap_i2c_bus(s->mpu->i2c[0]);
  195. /* Attach a menelaus PM chip */
  196. dev = i2c_create_slave(i2c, "twl92230", N8X0_MENELAUS_ADDR);
  197. qdev_connect_gpio_out(dev, 3,
  198. qdev_get_gpio_in(s->mpu->ih[0],
  199. OMAP_INT_24XX_SYS_NIRQ));
  200. n8x0_system_powerdown = qdev_get_gpio_in(dev, 3);
  201. qemu_register_powerdown_notifier(&n8x0_system_powerdown_notifier);
  202. /* Attach a TMP105 PM chip (A0 wired to ground) */
  203. dev = i2c_create_slave(i2c, TYPE_TMP105, N8X0_TMP105_ADDR);
  204. qdev_connect_gpio_out(dev, 0, tmp_irq);
  205. }
  206. /* Touchscreen and keypad controller */
  207. static MouseTransformInfo n800_pointercal = {
  208. .x = 800,
  209. .y = 480,
  210. .a = { 14560, -68, -3455208, -39, -9621, 35152972, 65536 },
  211. };
  212. static MouseTransformInfo n810_pointercal = {
  213. .x = 800,
  214. .y = 480,
  215. .a = { 15041, 148, -4731056, 171, -10238, 35933380, 65536 },
  216. };
  217. #define RETU_KEYCODE 61 /* F3 */
  218. static void n800_key_event(void *opaque, int keycode)
  219. {
  220. struct n800_s *s = (struct n800_s *) opaque;
  221. int code = s->keymap[keycode & 0x7f];
  222. if (code == -1) {
  223. if ((keycode & 0x7f) == RETU_KEYCODE) {
  224. retu_key_event(s->retu, !(keycode & 0x80));
  225. }
  226. return;
  227. }
  228. tsc210x_key_event(s->ts.chip, code, !(keycode & 0x80));
  229. }
  230. static const int n800_keys[16] = {
  231. -1,
  232. 72, /* Up */
  233. 63, /* Home (F5) */
  234. -1,
  235. 75, /* Left */
  236. 28, /* Enter */
  237. 77, /* Right */
  238. -1,
  239. 1, /* Cycle (ESC) */
  240. 80, /* Down */
  241. 62, /* Menu (F4) */
  242. -1,
  243. 66, /* Zoom- (F8) */
  244. 64, /* FullScreen (F6) */
  245. 65, /* Zoom+ (F7) */
  246. -1,
  247. };
  248. static void n800_tsc_kbd_setup(struct n800_s *s)
  249. {
  250. int i;
  251. /* XXX: are the three pins inverted inside the chip between the
  252. * tsc and the cpu (N4111)? */
  253. qemu_irq penirq = NULL; /* NC */
  254. qemu_irq kbirq = qdev_get_gpio_in(s->mpu->gpio, N800_TSC_KP_IRQ_GPIO);
  255. qemu_irq dav = qdev_get_gpio_in(s->mpu->gpio, N800_TSC_TS_GPIO);
  256. s->ts.chip = tsc2301_init(penirq, kbirq, dav);
  257. s->ts.opaque = s->ts.chip->opaque;
  258. s->ts.txrx = tsc210x_txrx;
  259. for (i = 0; i < 0x80; i++) {
  260. s->keymap[i] = -1;
  261. }
  262. for (i = 0; i < 0x10; i++) {
  263. if (n800_keys[i] >= 0) {
  264. s->keymap[n800_keys[i]] = i;
  265. }
  266. }
  267. qemu_add_kbd_event_handler(n800_key_event, s);
  268. tsc210x_set_transform(s->ts.chip, &n800_pointercal);
  269. }
  270. static void n810_tsc_setup(struct n800_s *s)
  271. {
  272. qemu_irq pintdav = qdev_get_gpio_in(s->mpu->gpio, N810_TSC_TS_GPIO);
  273. s->ts.opaque = tsc2005_init(pintdav);
  274. s->ts.txrx = tsc2005_txrx;
  275. tsc2005_set_transform(s->ts.opaque, &n810_pointercal);
  276. }
  277. /* N810 Keyboard controller */
  278. static void n810_key_event(void *opaque, int keycode)
  279. {
  280. struct n800_s *s = (struct n800_s *) opaque;
  281. int code = s->keymap[keycode & 0x7f];
  282. if (code == -1) {
  283. if ((keycode & 0x7f) == RETU_KEYCODE) {
  284. retu_key_event(s->retu, !(keycode & 0x80));
  285. }
  286. return;
  287. }
  288. lm832x_key_event(s->kbd, code, !(keycode & 0x80));
  289. }
  290. #define M 0
  291. static int n810_keys[0x80] = {
  292. [0x01] = 16, /* Q */
  293. [0x02] = 37, /* K */
  294. [0x03] = 24, /* O */
  295. [0x04] = 25, /* P */
  296. [0x05] = 14, /* Backspace */
  297. [0x06] = 30, /* A */
  298. [0x07] = 31, /* S */
  299. [0x08] = 32, /* D */
  300. [0x09] = 33, /* F */
  301. [0x0a] = 34, /* G */
  302. [0x0b] = 35, /* H */
  303. [0x0c] = 36, /* J */
  304. [0x11] = 17, /* W */
  305. [0x12] = 62, /* Menu (F4) */
  306. [0x13] = 38, /* L */
  307. [0x14] = 40, /* ' (Apostrophe) */
  308. [0x16] = 44, /* Z */
  309. [0x17] = 45, /* X */
  310. [0x18] = 46, /* C */
  311. [0x19] = 47, /* V */
  312. [0x1a] = 48, /* B */
  313. [0x1b] = 49, /* N */
  314. [0x1c] = 42, /* Shift (Left shift) */
  315. [0x1f] = 65, /* Zoom+ (F7) */
  316. [0x21] = 18, /* E */
  317. [0x22] = 39, /* ; (Semicolon) */
  318. [0x23] = 12, /* - (Minus) */
  319. [0x24] = 13, /* = (Equal) */
  320. [0x2b] = 56, /* Fn (Left Alt) */
  321. [0x2c] = 50, /* M */
  322. [0x2f] = 66, /* Zoom- (F8) */
  323. [0x31] = 19, /* R */
  324. [0x32] = 29 | M, /* Right Ctrl */
  325. [0x34] = 57, /* Space */
  326. [0x35] = 51, /* , (Comma) */
  327. [0x37] = 72 | M, /* Up */
  328. [0x3c] = 82 | M, /* Compose (Insert) */
  329. [0x3f] = 64, /* FullScreen (F6) */
  330. [0x41] = 20, /* T */
  331. [0x44] = 52, /* . (Dot) */
  332. [0x46] = 77 | M, /* Right */
  333. [0x4f] = 63, /* Home (F5) */
  334. [0x51] = 21, /* Y */
  335. [0x53] = 80 | M, /* Down */
  336. [0x55] = 28, /* Enter */
  337. [0x5f] = 1, /* Cycle (ESC) */
  338. [0x61] = 22, /* U */
  339. [0x64] = 75 | M, /* Left */
  340. [0x71] = 23, /* I */
  341. #if 0
  342. [0x75] = 28 | M, /* KP Enter (KP Enter) */
  343. #else
  344. [0x75] = 15, /* KP Enter (Tab) */
  345. #endif
  346. };
  347. #undef M
  348. static void n810_kbd_setup(struct n800_s *s)
  349. {
  350. qemu_irq kbd_irq = qdev_get_gpio_in(s->mpu->gpio, N810_KEYBOARD_GPIO);
  351. int i;
  352. for (i = 0; i < 0x80; i++) {
  353. s->keymap[i] = -1;
  354. }
  355. for (i = 0; i < 0x80; i++) {
  356. if (n810_keys[i] > 0) {
  357. s->keymap[n810_keys[i]] = i;
  358. }
  359. }
  360. qemu_add_kbd_event_handler(n810_key_event, s);
  361. /* Attach the LM8322 keyboard to the I2C bus,
  362. * should happen in n8x0_i2c_setup and s->kbd be initialised here. */
  363. s->kbd = i2c_create_slave(omap_i2c_bus(s->mpu->i2c[0]),
  364. "lm8323", N810_LM8323_ADDR);
  365. qdev_connect_gpio_out(s->kbd, 0, kbd_irq);
  366. }
  367. /* LCD MIPI DBI-C controller (URAL) */
  368. struct mipid_s {
  369. int resp[4];
  370. int param[4];
  371. int p;
  372. int pm;
  373. int cmd;
  374. int sleep;
  375. int booster;
  376. int te;
  377. int selfcheck;
  378. int partial;
  379. int normal;
  380. int vscr;
  381. int invert;
  382. int onoff;
  383. int gamma;
  384. uint32_t id;
  385. };
  386. static void mipid_reset(struct mipid_s *s)
  387. {
  388. s->pm = 0;
  389. s->cmd = 0;
  390. s->sleep = 1;
  391. s->booster = 0;
  392. s->selfcheck =
  393. (1 << 7) | /* Register loading OK. */
  394. (1 << 5) | /* The chip is attached. */
  395. (1 << 4); /* Display glass still in one piece. */
  396. s->te = 0;
  397. s->partial = 0;
  398. s->normal = 1;
  399. s->vscr = 0;
  400. s->invert = 0;
  401. s->onoff = 1;
  402. s->gamma = 0;
  403. }
  404. static uint32_t mipid_txrx(void *opaque, uint32_t cmd, int len)
  405. {
  406. struct mipid_s *s = (struct mipid_s *) opaque;
  407. uint8_t ret;
  408. if (len > 9) {
  409. hw_error("%s: FIXME: bad SPI word width %i\n", __func__, len);
  410. }
  411. if (s->p >= ARRAY_SIZE(s->resp)) {
  412. ret = 0;
  413. } else {
  414. ret = s->resp[s->p++];
  415. }
  416. if (s->pm-- > 0) {
  417. s->param[s->pm] = cmd;
  418. } else {
  419. s->cmd = cmd;
  420. }
  421. switch (s->cmd) {
  422. case 0x00: /* NOP */
  423. break;
  424. case 0x01: /* SWRESET */
  425. mipid_reset(s);
  426. break;
  427. case 0x02: /* BSTROFF */
  428. s->booster = 0;
  429. break;
  430. case 0x03: /* BSTRON */
  431. s->booster = 1;
  432. break;
  433. case 0x04: /* RDDID */
  434. s->p = 0;
  435. s->resp[0] = (s->id >> 16) & 0xff;
  436. s->resp[1] = (s->id >> 8) & 0xff;
  437. s->resp[2] = (s->id >> 0) & 0xff;
  438. break;
  439. case 0x06: /* RD_RED */
  440. case 0x07: /* RD_GREEN */
  441. /* XXX the bootloader sometimes issues RD_BLUE meaning RDDID so
  442. * for the bootloader one needs to change this. */
  443. case 0x08: /* RD_BLUE */
  444. s->p = 0;
  445. /* TODO: return first pixel components */
  446. s->resp[0] = 0x01;
  447. break;
  448. case 0x09: /* RDDST */
  449. s->p = 0;
  450. s->resp[0] = s->booster << 7;
  451. s->resp[1] = (5 << 4) | (s->partial << 2) |
  452. (s->sleep << 1) | s->normal;
  453. s->resp[2] = (s->vscr << 7) | (s->invert << 5) |
  454. (s->onoff << 2) | (s->te << 1) | (s->gamma >> 2);
  455. s->resp[3] = s->gamma << 6;
  456. break;
  457. case 0x0a: /* RDDPM */
  458. s->p = 0;
  459. s->resp[0] = (s->onoff << 2) | (s->normal << 3) | (s->sleep << 4) |
  460. (s->partial << 5) | (s->sleep << 6) | (s->booster << 7);
  461. break;
  462. case 0x0b: /* RDDMADCTR */
  463. s->p = 0;
  464. s->resp[0] = 0;
  465. break;
  466. case 0x0c: /* RDDCOLMOD */
  467. s->p = 0;
  468. s->resp[0] = 5; /* 65K colours */
  469. break;
  470. case 0x0d: /* RDDIM */
  471. s->p = 0;
  472. s->resp[0] = (s->invert << 5) | (s->vscr << 7) | s->gamma;
  473. break;
  474. case 0x0e: /* RDDSM */
  475. s->p = 0;
  476. s->resp[0] = s->te << 7;
  477. break;
  478. case 0x0f: /* RDDSDR */
  479. s->p = 0;
  480. s->resp[0] = s->selfcheck;
  481. break;
  482. case 0x10: /* SLPIN */
  483. s->sleep = 1;
  484. break;
  485. case 0x11: /* SLPOUT */
  486. s->sleep = 0;
  487. s->selfcheck ^= 1 << 6; /* POFF self-diagnosis Ok */
  488. break;
  489. case 0x12: /* PTLON */
  490. s->partial = 1;
  491. s->normal = 0;
  492. s->vscr = 0;
  493. break;
  494. case 0x13: /* NORON */
  495. s->partial = 0;
  496. s->normal = 1;
  497. s->vscr = 0;
  498. break;
  499. case 0x20: /* INVOFF */
  500. s->invert = 0;
  501. break;
  502. case 0x21: /* INVON */
  503. s->invert = 1;
  504. break;
  505. case 0x22: /* APOFF */
  506. case 0x23: /* APON */
  507. goto bad_cmd;
  508. case 0x25: /* WRCNTR */
  509. if (s->pm < 0) {
  510. s->pm = 1;
  511. }
  512. goto bad_cmd;
  513. case 0x26: /* GAMSET */
  514. if (!s->pm) {
  515. s->gamma = ctz32(s->param[0] & 0xf);
  516. if (s->gamma == 32) {
  517. s->gamma = -1; /* XXX: should this be 0? */
  518. }
  519. } else if (s->pm < 0) {
  520. s->pm = 1;
  521. }
  522. break;
  523. case 0x28: /* DISPOFF */
  524. s->onoff = 0;
  525. break;
  526. case 0x29: /* DISPON */
  527. s->onoff = 1;
  528. break;
  529. case 0x2a: /* CASET */
  530. case 0x2b: /* RASET */
  531. case 0x2c: /* RAMWR */
  532. case 0x2d: /* RGBSET */
  533. case 0x2e: /* RAMRD */
  534. case 0x30: /* PTLAR */
  535. case 0x33: /* SCRLAR */
  536. goto bad_cmd;
  537. case 0x34: /* TEOFF */
  538. s->te = 0;
  539. break;
  540. case 0x35: /* TEON */
  541. if (!s->pm) {
  542. s->te = 1;
  543. } else if (s->pm < 0) {
  544. s->pm = 1;
  545. }
  546. break;
  547. case 0x36: /* MADCTR */
  548. goto bad_cmd;
  549. case 0x37: /* VSCSAD */
  550. s->partial = 0;
  551. s->normal = 0;
  552. s->vscr = 1;
  553. break;
  554. case 0x38: /* IDMOFF */
  555. case 0x39: /* IDMON */
  556. case 0x3a: /* COLMOD */
  557. goto bad_cmd;
  558. case 0xb0: /* CLKINT / DISCTL */
  559. case 0xb1: /* CLKEXT */
  560. if (s->pm < 0) {
  561. s->pm = 2;
  562. }
  563. break;
  564. case 0xb4: /* FRMSEL */
  565. break;
  566. case 0xb5: /* FRM8SEL */
  567. case 0xb6: /* TMPRNG / INIESC */
  568. case 0xb7: /* TMPHIS / NOP2 */
  569. case 0xb8: /* TMPREAD / MADCTL */
  570. case 0xba: /* DISTCTR */
  571. case 0xbb: /* EPVOL */
  572. goto bad_cmd;
  573. case 0xbd: /* Unknown */
  574. s->p = 0;
  575. s->resp[0] = 0;
  576. s->resp[1] = 1;
  577. break;
  578. case 0xc2: /* IFMOD */
  579. if (s->pm < 0) {
  580. s->pm = 2;
  581. }
  582. break;
  583. case 0xc6: /* PWRCTL */
  584. case 0xc7: /* PPWRCTL */
  585. case 0xd0: /* EPWROUT */
  586. case 0xd1: /* EPWRIN */
  587. case 0xd4: /* RDEV */
  588. case 0xd5: /* RDRR */
  589. goto bad_cmd;
  590. case 0xda: /* RDID1 */
  591. s->p = 0;
  592. s->resp[0] = (s->id >> 16) & 0xff;
  593. break;
  594. case 0xdb: /* RDID2 */
  595. s->p = 0;
  596. s->resp[0] = (s->id >> 8) & 0xff;
  597. break;
  598. case 0xdc: /* RDID3 */
  599. s->p = 0;
  600. s->resp[0] = (s->id >> 0) & 0xff;
  601. break;
  602. default:
  603. bad_cmd:
  604. qemu_log_mask(LOG_GUEST_ERROR,
  605. "%s: unknown command %02x\n", __func__, s->cmd);
  606. break;
  607. }
  608. return ret;
  609. }
  610. static void *mipid_init(void)
  611. {
  612. struct mipid_s *s = (struct mipid_s *) g_malloc0(sizeof(*s));
  613. s->id = 0x838f03;
  614. mipid_reset(s);
  615. return s;
  616. }
  617. static void n8x0_spi_setup(struct n800_s *s)
  618. {
  619. void *tsc = s->ts.opaque;
  620. void *mipid = mipid_init();
  621. omap_mcspi_attach(s->mpu->mcspi[0], s->ts.txrx, tsc, 0);
  622. omap_mcspi_attach(s->mpu->mcspi[0], mipid_txrx, mipid, 1);
  623. }
  624. /* This task is normally performed by the bootloader. If we're loading
  625. * a kernel directly, we need to enable the Blizzard ourselves. */
  626. static void n800_dss_init(struct rfbi_chip_s *chip)
  627. {
  628. uint8_t *fb_blank;
  629. chip->write(chip->opaque, 0, 0x2a); /* LCD Width register */
  630. chip->write(chip->opaque, 1, 0x64);
  631. chip->write(chip->opaque, 0, 0x2c); /* LCD HNDP register */
  632. chip->write(chip->opaque, 1, 0x1e);
  633. chip->write(chip->opaque, 0, 0x2e); /* LCD Height 0 register */
  634. chip->write(chip->opaque, 1, 0xe0);
  635. chip->write(chip->opaque, 0, 0x30); /* LCD Height 1 register */
  636. chip->write(chip->opaque, 1, 0x01);
  637. chip->write(chip->opaque, 0, 0x32); /* LCD VNDP register */
  638. chip->write(chip->opaque, 1, 0x06);
  639. chip->write(chip->opaque, 0, 0x68); /* Display Mode register */
  640. chip->write(chip->opaque, 1, 1); /* Enable bit */
  641. chip->write(chip->opaque, 0, 0x6c);
  642. chip->write(chip->opaque, 1, 0x00); /* Input X Start Position */
  643. chip->write(chip->opaque, 1, 0x00); /* Input X Start Position */
  644. chip->write(chip->opaque, 1, 0x00); /* Input Y Start Position */
  645. chip->write(chip->opaque, 1, 0x00); /* Input Y Start Position */
  646. chip->write(chip->opaque, 1, 0x1f); /* Input X End Position */
  647. chip->write(chip->opaque, 1, 0x03); /* Input X End Position */
  648. chip->write(chip->opaque, 1, 0xdf); /* Input Y End Position */
  649. chip->write(chip->opaque, 1, 0x01); /* Input Y End Position */
  650. chip->write(chip->opaque, 1, 0x00); /* Output X Start Position */
  651. chip->write(chip->opaque, 1, 0x00); /* Output X Start Position */
  652. chip->write(chip->opaque, 1, 0x00); /* Output Y Start Position */
  653. chip->write(chip->opaque, 1, 0x00); /* Output Y Start Position */
  654. chip->write(chip->opaque, 1, 0x1f); /* Output X End Position */
  655. chip->write(chip->opaque, 1, 0x03); /* Output X End Position */
  656. chip->write(chip->opaque, 1, 0xdf); /* Output Y End Position */
  657. chip->write(chip->opaque, 1, 0x01); /* Output Y End Position */
  658. chip->write(chip->opaque, 1, 0x01); /* Input Data Format */
  659. chip->write(chip->opaque, 1, 0x01); /* Data Source Select */
  660. fb_blank = memset(g_malloc(800 * 480 * 2), 0xff, 800 * 480 * 2);
  661. /* Display Memory Data Port */
  662. chip->block(chip->opaque, 1, fb_blank, 800 * 480 * 2, 800);
  663. g_free(fb_blank);
  664. }
  665. static void n8x0_dss_setup(struct n800_s *s)
  666. {
  667. s->blizzard.opaque = s1d13745_init(NULL);
  668. s->blizzard.block = s1d13745_write_block;
  669. s->blizzard.write = s1d13745_write;
  670. s->blizzard.read = s1d13745_read;
  671. omap_rfbi_attach(s->mpu->dss, 0, &s->blizzard);
  672. }
  673. static void n8x0_cbus_setup(struct n800_s *s)
  674. {
  675. qemu_irq dat_out = qdev_get_gpio_in(s->mpu->gpio, N8X0_CBUS_DAT_GPIO);
  676. qemu_irq retu_irq = qdev_get_gpio_in(s->mpu->gpio, N8X0_RETU_GPIO);
  677. qemu_irq tahvo_irq = qdev_get_gpio_in(s->mpu->gpio, N8X0_TAHVO_GPIO);
  678. CBus *cbus = cbus_init(dat_out);
  679. qdev_connect_gpio_out(s->mpu->gpio, N8X0_CBUS_CLK_GPIO, cbus->clk);
  680. qdev_connect_gpio_out(s->mpu->gpio, N8X0_CBUS_DAT_GPIO, cbus->dat);
  681. qdev_connect_gpio_out(s->mpu->gpio, N8X0_CBUS_SEL_GPIO, cbus->sel);
  682. cbus_attach(cbus, s->retu = retu_init(retu_irq, 1));
  683. cbus_attach(cbus, s->tahvo = tahvo_init(tahvo_irq, 1));
  684. }
  685. static void n8x0_uart_setup(struct n800_s *s)
  686. {
  687. Chardev *radio = uart_hci_init();
  688. qdev_connect_gpio_out(s->mpu->gpio, N8X0_BT_RESET_GPIO,
  689. csrhci_pins_get(radio)[csrhci_pin_reset]);
  690. qdev_connect_gpio_out(s->mpu->gpio, N8X0_BT_WKUP_GPIO,
  691. csrhci_pins_get(radio)[csrhci_pin_wakeup]);
  692. omap_uart_attach(s->mpu->uart[BT_UART], radio);
  693. }
  694. static void n8x0_usb_setup(struct n800_s *s)
  695. {
  696. SysBusDevice *dev;
  697. s->usb = qdev_create(NULL, "tusb6010");
  698. dev = SYS_BUS_DEVICE(s->usb);
  699. qdev_init_nofail(s->usb);
  700. sysbus_connect_irq(dev, 0,
  701. qdev_get_gpio_in(s->mpu->gpio, N8X0_TUSB_INT_GPIO));
  702. /* Using the NOR interface */
  703. omap_gpmc_attach(s->mpu->gpmc, N8X0_USB_ASYNC_CS,
  704. sysbus_mmio_get_region(dev, 0));
  705. omap_gpmc_attach(s->mpu->gpmc, N8X0_USB_SYNC_CS,
  706. sysbus_mmio_get_region(dev, 1));
  707. qdev_connect_gpio_out(s->mpu->gpio, N8X0_TUSB_ENABLE_GPIO,
  708. qdev_get_gpio_in(s->usb, 0)); /* tusb_pwr */
  709. }
  710. /* Setup done before the main bootloader starts by some early setup code
  711. * - used when we want to run the main bootloader in emulation. This
  712. * isn't documented. */
  713. static uint32_t n800_pinout[104] = {
  714. 0x080f00d8, 0x00d40808, 0x03080808, 0x080800d0,
  715. 0x00dc0808, 0x0b0f0f00, 0x080800b4, 0x00c00808,
  716. 0x08080808, 0x180800c4, 0x00b80000, 0x08080808,
  717. 0x080800bc, 0x00cc0808, 0x08081818, 0x18180128,
  718. 0x01241800, 0x18181818, 0x000000f0, 0x01300000,
  719. 0x00001b0b, 0x1b0f0138, 0x00e0181b, 0x1b031b0b,
  720. 0x180f0078, 0x00740018, 0x0f0f0f1a, 0x00000080,
  721. 0x007c0000, 0x00000000, 0x00000088, 0x00840000,
  722. 0x00000000, 0x00000094, 0x00980300, 0x0f180003,
  723. 0x0000008c, 0x00900f0f, 0x0f0f1b00, 0x0f00009c,
  724. 0x01140000, 0x1b1b0f18, 0x0818013c, 0x01400008,
  725. 0x00001818, 0x000b0110, 0x010c1800, 0x0b030b0f,
  726. 0x181800f4, 0x00f81818, 0x00000018, 0x000000fc,
  727. 0x00401808, 0x00000000, 0x0f1b0030, 0x003c0008,
  728. 0x00000000, 0x00000038, 0x00340000, 0x00000000,
  729. 0x1a080070, 0x00641a1a, 0x08080808, 0x08080060,
  730. 0x005c0808, 0x08080808, 0x08080058, 0x00540808,
  731. 0x08080808, 0x0808006c, 0x00680808, 0x08080808,
  732. 0x000000a8, 0x00b00000, 0x08080808, 0x000000a0,
  733. 0x00a40000, 0x00000000, 0x08ff0050, 0x004c0808,
  734. 0xffffffff, 0xffff0048, 0x0044ffff, 0xffffffff,
  735. 0x000000ac, 0x01040800, 0x08080b0f, 0x18180100,
  736. 0x01081818, 0x0b0b1808, 0x1a0300e4, 0x012c0b1a,
  737. 0x02020018, 0x0b000134, 0x011c0800, 0x0b1b1b00,
  738. 0x0f0000c8, 0x00ec181b, 0x000f0f02, 0x00180118,
  739. 0x01200000, 0x0f0b1b1b, 0x0f0200e8, 0x0000020b,
  740. };
  741. static void n800_setup_nolo_tags(void *sram_base)
  742. {
  743. int i;
  744. uint32_t *p = sram_base + 0x8000;
  745. uint32_t *v = sram_base + 0xa000;
  746. memset(p, 0, 0x3000);
  747. strcpy((void *) (p + 0), "QEMU N800");
  748. strcpy((void *) (p + 8), "F5");
  749. stl_p(p + 10, 0x04f70000);
  750. strcpy((void *) (p + 9), "RX-34");
  751. /* RAM size in MB? */
  752. stl_p(p + 12, 0x80);
  753. /* Pointer to the list of tags */
  754. stl_p(p + 13, OMAP2_SRAM_BASE + 0x9000);
  755. /* The NOLO tags start here */
  756. p = sram_base + 0x9000;
  757. #define ADD_TAG(tag, len) \
  758. stw_p((uint16_t *) p + 0, tag); \
  759. stw_p((uint16_t *) p + 1, len); p++; \
  760. stl_p(p++, OMAP2_SRAM_BASE | (((void *) v - sram_base) & 0xffff));
  761. /* OMAP STI console? Pin out settings? */
  762. ADD_TAG(0x6e01, 414);
  763. for (i = 0; i < ARRAY_SIZE(n800_pinout); i++) {
  764. stl_p(v++, n800_pinout[i]);
  765. }
  766. /* Kernel memsize? */
  767. ADD_TAG(0x6e05, 1);
  768. stl_p(v++, 2);
  769. /* NOLO serial console */
  770. ADD_TAG(0x6e02, 4);
  771. stl_p(v++, XLDR_LL_UART); /* UART number (1 - 3) */
  772. #if 0
  773. /* CBUS settings (Retu/AVilma) */
  774. ADD_TAG(0x6e03, 6);
  775. stw_p((uint16_t *) v + 0, 65); /* CBUS GPIO0 */
  776. stw_p((uint16_t *) v + 1, 66); /* CBUS GPIO1 */
  777. stw_p((uint16_t *) v + 2, 64); /* CBUS GPIO2 */
  778. v += 2;
  779. #endif
  780. /* Nokia ASIC BB5 (Retu/Tahvo) */
  781. ADD_TAG(0x6e0a, 4);
  782. stw_p((uint16_t *) v + 0, 111); /* "Retu" interrupt GPIO */
  783. stw_p((uint16_t *) v + 1, 108); /* "Tahvo" interrupt GPIO */
  784. v++;
  785. /* LCD console? */
  786. ADD_TAG(0x6e04, 4);
  787. stw_p((uint16_t *) v + 0, 30); /* ??? */
  788. stw_p((uint16_t *) v + 1, 24); /* ??? */
  789. v++;
  790. #if 0
  791. /* LCD settings */
  792. ADD_TAG(0x6e06, 2);
  793. stw_p((uint16_t *) (v++), 15); /* ??? */
  794. #endif
  795. /* I^2C (Menelaus) */
  796. ADD_TAG(0x6e07, 4);
  797. stl_p(v++, 0x00720000); /* ??? */
  798. /* Unknown */
  799. ADD_TAG(0x6e0b, 6);
  800. stw_p((uint16_t *) v + 0, 94); /* ??? */
  801. stw_p((uint16_t *) v + 1, 23); /* ??? */
  802. stw_p((uint16_t *) v + 2, 0); /* ??? */
  803. v += 2;
  804. /* OMAP gpio switch info */
  805. ADD_TAG(0x6e0c, 80);
  806. strcpy((void *) v, "bat_cover"); v += 3;
  807. stw_p((uint16_t *) v + 0, 110); /* GPIO num ??? */
  808. stw_p((uint16_t *) v + 1, 1); /* GPIO num ??? */
  809. v += 2;
  810. strcpy((void *) v, "cam_act"); v += 3;
  811. stw_p((uint16_t *) v + 0, 95); /* GPIO num ??? */
  812. stw_p((uint16_t *) v + 1, 32); /* GPIO num ??? */
  813. v += 2;
  814. strcpy((void *) v, "cam_turn"); v += 3;
  815. stw_p((uint16_t *) v + 0, 12); /* GPIO num ??? */
  816. stw_p((uint16_t *) v + 1, 33); /* GPIO num ??? */
  817. v += 2;
  818. strcpy((void *) v, "headphone"); v += 3;
  819. stw_p((uint16_t *) v + 0, 107); /* GPIO num ??? */
  820. stw_p((uint16_t *) v + 1, 17); /* GPIO num ??? */
  821. v += 2;
  822. /* Bluetooth */
  823. ADD_TAG(0x6e0e, 12);
  824. stl_p(v++, 0x5c623d01); /* ??? */
  825. stl_p(v++, 0x00000201); /* ??? */
  826. stl_p(v++, 0x00000000); /* ??? */
  827. /* CX3110x WLAN settings */
  828. ADD_TAG(0x6e0f, 8);
  829. stl_p(v++, 0x00610025); /* ??? */
  830. stl_p(v++, 0xffff0057); /* ??? */
  831. /* MMC host settings */
  832. ADD_TAG(0x6e10, 12);
  833. stl_p(v++, 0xffff000f); /* ??? */
  834. stl_p(v++, 0xffffffff); /* ??? */
  835. stl_p(v++, 0x00000060); /* ??? */
  836. /* OneNAND chip select */
  837. ADD_TAG(0x6e11, 10);
  838. stl_p(v++, 0x00000401); /* ??? */
  839. stl_p(v++, 0x0002003a); /* ??? */
  840. stl_p(v++, 0x00000002); /* ??? */
  841. /* TEA5761 sensor settings */
  842. ADD_TAG(0x6e12, 2);
  843. stl_p(v++, 93); /* GPIO num ??? */
  844. #if 0
  845. /* Unknown tag */
  846. ADD_TAG(6e09, 0);
  847. /* Kernel UART / console */
  848. ADD_TAG(6e12, 0);
  849. #endif
  850. /* End of the list */
  851. stl_p(p++, 0x00000000);
  852. stl_p(p++, 0x00000000);
  853. }
  854. /* This task is normally performed by the bootloader. If we're loading
  855. * a kernel directly, we need to set up GPMC mappings ourselves. */
  856. static void n800_gpmc_init(struct n800_s *s)
  857. {
  858. uint32_t config7 =
  859. (0xf << 8) | /* MASKADDRESS */
  860. (1 << 6) | /* CSVALID */
  861. (4 << 0); /* BASEADDRESS */
  862. cpu_physical_memory_write(0x6800a078, /* GPMC_CONFIG7_0 */
  863. &config7, sizeof(config7));
  864. }
  865. /* Setup sequence done by the bootloader */
  866. static void n8x0_boot_init(void *opaque)
  867. {
  868. struct n800_s *s = (struct n800_s *) opaque;
  869. uint32_t buf;
  870. /* PRCM setup */
  871. #define omap_writel(addr, val) \
  872. buf = (val); \
  873. cpu_physical_memory_write(addr, &buf, sizeof(buf))
  874. omap_writel(0x48008060, 0x41); /* PRCM_CLKSRC_CTRL */
  875. omap_writel(0x48008070, 1); /* PRCM_CLKOUT_CTRL */
  876. omap_writel(0x48008078, 0); /* PRCM_CLKEMUL_CTRL */
  877. omap_writel(0x48008090, 0); /* PRCM_VOLTSETUP */
  878. omap_writel(0x48008094, 0); /* PRCM_CLKSSETUP */
  879. omap_writel(0x48008098, 0); /* PRCM_POLCTRL */
  880. omap_writel(0x48008140, 2); /* CM_CLKSEL_MPU */
  881. omap_writel(0x48008148, 0); /* CM_CLKSTCTRL_MPU */
  882. omap_writel(0x48008158, 1); /* RM_RSTST_MPU */
  883. omap_writel(0x480081c8, 0x15); /* PM_WKDEP_MPU */
  884. omap_writel(0x480081d4, 0x1d4); /* PM_EVGENCTRL_MPU */
  885. omap_writel(0x480081d8, 0); /* PM_EVEGENONTIM_MPU */
  886. omap_writel(0x480081dc, 0); /* PM_EVEGENOFFTIM_MPU */
  887. omap_writel(0x480081e0, 0xc); /* PM_PWSTCTRL_MPU */
  888. omap_writel(0x48008200, 0x047e7ff7); /* CM_FCLKEN1_CORE */
  889. omap_writel(0x48008204, 0x00000004); /* CM_FCLKEN2_CORE */
  890. omap_writel(0x48008210, 0x047e7ff1); /* CM_ICLKEN1_CORE */
  891. omap_writel(0x48008214, 0x00000004); /* CM_ICLKEN2_CORE */
  892. omap_writel(0x4800821c, 0x00000000); /* CM_ICLKEN4_CORE */
  893. omap_writel(0x48008230, 0); /* CM_AUTOIDLE1_CORE */
  894. omap_writel(0x48008234, 0); /* CM_AUTOIDLE2_CORE */
  895. omap_writel(0x48008238, 7); /* CM_AUTOIDLE3_CORE */
  896. omap_writel(0x4800823c, 0); /* CM_AUTOIDLE4_CORE */
  897. omap_writel(0x48008240, 0x04360626); /* CM_CLKSEL1_CORE */
  898. omap_writel(0x48008244, 0x00000014); /* CM_CLKSEL2_CORE */
  899. omap_writel(0x48008248, 0); /* CM_CLKSTCTRL_CORE */
  900. omap_writel(0x48008300, 0x00000000); /* CM_FCLKEN_GFX */
  901. omap_writel(0x48008310, 0x00000000); /* CM_ICLKEN_GFX */
  902. omap_writel(0x48008340, 0x00000001); /* CM_CLKSEL_GFX */
  903. omap_writel(0x48008400, 0x00000004); /* CM_FCLKEN_WKUP */
  904. omap_writel(0x48008410, 0x00000004); /* CM_ICLKEN_WKUP */
  905. omap_writel(0x48008440, 0x00000000); /* CM_CLKSEL_WKUP */
  906. omap_writel(0x48008500, 0x000000cf); /* CM_CLKEN_PLL */
  907. omap_writel(0x48008530, 0x0000000c); /* CM_AUTOIDLE_PLL */
  908. omap_writel(0x48008540, /* CM_CLKSEL1_PLL */
  909. (0x78 << 12) | (6 << 8));
  910. omap_writel(0x48008544, 2); /* CM_CLKSEL2_PLL */
  911. /* GPMC setup */
  912. n800_gpmc_init(s);
  913. /* Video setup */
  914. n800_dss_init(&s->blizzard);
  915. /* CPU setup */
  916. s->mpu->cpu->env.GE = 0x5;
  917. /* If the machine has a slided keyboard, open it */
  918. if (s->kbd) {
  919. qemu_irq_raise(qdev_get_gpio_in(s->mpu->gpio, N810_SLIDE_GPIO));
  920. }
  921. }
  922. #define OMAP_TAG_NOKIA_BT 0x4e01
  923. #define OMAP_TAG_WLAN_CX3110X 0x4e02
  924. #define OMAP_TAG_CBUS 0x4e03
  925. #define OMAP_TAG_EM_ASIC_BB5 0x4e04
  926. static struct omap_gpiosw_info_s {
  927. const char *name;
  928. int line;
  929. int type;
  930. } n800_gpiosw_info[] = {
  931. {
  932. "bat_cover", N800_BAT_COVER_GPIO,
  933. OMAP_GPIOSW_TYPE_COVER | OMAP_GPIOSW_INVERTED,
  934. }, {
  935. "cam_act", N800_CAM_ACT_GPIO,
  936. OMAP_GPIOSW_TYPE_ACTIVITY,
  937. }, {
  938. "cam_turn", N800_CAM_TURN_GPIO,
  939. OMAP_GPIOSW_TYPE_ACTIVITY | OMAP_GPIOSW_INVERTED,
  940. }, {
  941. "headphone", N8X0_HEADPHONE_GPIO,
  942. OMAP_GPIOSW_TYPE_CONNECTION | OMAP_GPIOSW_INVERTED,
  943. },
  944. { NULL }
  945. }, n810_gpiosw_info[] = {
  946. {
  947. "gps_reset", N810_GPS_RESET_GPIO,
  948. OMAP_GPIOSW_TYPE_ACTIVITY | OMAP_GPIOSW_OUTPUT,
  949. }, {
  950. "gps_wakeup", N810_GPS_WAKEUP_GPIO,
  951. OMAP_GPIOSW_TYPE_ACTIVITY | OMAP_GPIOSW_OUTPUT,
  952. }, {
  953. "headphone", N8X0_HEADPHONE_GPIO,
  954. OMAP_GPIOSW_TYPE_CONNECTION | OMAP_GPIOSW_INVERTED,
  955. }, {
  956. "kb_lock", N810_KB_LOCK_GPIO,
  957. OMAP_GPIOSW_TYPE_COVER | OMAP_GPIOSW_INVERTED,
  958. }, {
  959. "sleepx_led", N810_SLEEPX_LED_GPIO,
  960. OMAP_GPIOSW_TYPE_ACTIVITY | OMAP_GPIOSW_INVERTED | OMAP_GPIOSW_OUTPUT,
  961. }, {
  962. "slide", N810_SLIDE_GPIO,
  963. OMAP_GPIOSW_TYPE_COVER | OMAP_GPIOSW_INVERTED,
  964. },
  965. { NULL }
  966. };
  967. static struct omap_partition_info_s {
  968. uint32_t offset;
  969. uint32_t size;
  970. int mask;
  971. const char *name;
  972. } n800_part_info[] = {
  973. { 0x00000000, 0x00020000, 0x3, "bootloader" },
  974. { 0x00020000, 0x00060000, 0x0, "config" },
  975. { 0x00080000, 0x00200000, 0x0, "kernel" },
  976. { 0x00280000, 0x00200000, 0x3, "initfs" },
  977. { 0x00480000, 0x0fb80000, 0x3, "rootfs" },
  978. { 0, 0, 0, NULL }
  979. }, n810_part_info[] = {
  980. { 0x00000000, 0x00020000, 0x3, "bootloader" },
  981. { 0x00020000, 0x00060000, 0x0, "config" },
  982. { 0x00080000, 0x00220000, 0x0, "kernel" },
  983. { 0x002a0000, 0x00400000, 0x0, "initfs" },
  984. { 0x006a0000, 0x0f960000, 0x0, "rootfs" },
  985. { 0, 0, 0, NULL }
  986. };
  987. static bdaddr_t n8x0_bd_addr = {{ N8X0_BD_ADDR }};
  988. static int n8x0_atag_setup(void *p, int model)
  989. {
  990. uint8_t *b;
  991. uint16_t *w;
  992. uint32_t *l;
  993. struct omap_gpiosw_info_s *gpiosw;
  994. struct omap_partition_info_s *partition;
  995. const char *tag;
  996. w = p;
  997. stw_p(w++, OMAP_TAG_UART); /* u16 tag */
  998. stw_p(w++, 4); /* u16 len */
  999. stw_p(w++, (1 << 2) | (1 << 1) | (1 << 0)); /* uint enabled_uarts */
  1000. w++;
  1001. #if 0
  1002. stw_p(w++, OMAP_TAG_SERIAL_CONSOLE); /* u16 tag */
  1003. stw_p(w++, 4); /* u16 len */
  1004. stw_p(w++, XLDR_LL_UART + 1); /* u8 console_uart */
  1005. stw_p(w++, 115200); /* u32 console_speed */
  1006. #endif
  1007. stw_p(w++, OMAP_TAG_LCD); /* u16 tag */
  1008. stw_p(w++, 36); /* u16 len */
  1009. strcpy((void *) w, "QEMU LCD panel"); /* char panel_name[16] */
  1010. w += 8;
  1011. strcpy((void *) w, "blizzard"); /* char ctrl_name[16] */
  1012. w += 8;
  1013. stw_p(w++, N810_BLIZZARD_RESET_GPIO); /* TODO: n800 s16 nreset_gpio */
  1014. stw_p(w++, 24); /* u8 data_lines */
  1015. stw_p(w++, OMAP_TAG_CBUS); /* u16 tag */
  1016. stw_p(w++, 8); /* u16 len */
  1017. stw_p(w++, N8X0_CBUS_CLK_GPIO); /* s16 clk_gpio */
  1018. stw_p(w++, N8X0_CBUS_DAT_GPIO); /* s16 dat_gpio */
  1019. stw_p(w++, N8X0_CBUS_SEL_GPIO); /* s16 sel_gpio */
  1020. w++;
  1021. stw_p(w++, OMAP_TAG_EM_ASIC_BB5); /* u16 tag */
  1022. stw_p(w++, 4); /* u16 len */
  1023. stw_p(w++, N8X0_RETU_GPIO); /* s16 retu_irq_gpio */
  1024. stw_p(w++, N8X0_TAHVO_GPIO); /* s16 tahvo_irq_gpio */
  1025. gpiosw = (model == 810) ? n810_gpiosw_info : n800_gpiosw_info;
  1026. for (; gpiosw->name; gpiosw++) {
  1027. stw_p(w++, OMAP_TAG_GPIO_SWITCH); /* u16 tag */
  1028. stw_p(w++, 20); /* u16 len */
  1029. strcpy((void *) w, gpiosw->name); /* char name[12] */
  1030. w += 6;
  1031. stw_p(w++, gpiosw->line); /* u16 gpio */
  1032. stw_p(w++, gpiosw->type);
  1033. stw_p(w++, 0);
  1034. stw_p(w++, 0);
  1035. }
  1036. stw_p(w++, OMAP_TAG_NOKIA_BT); /* u16 tag */
  1037. stw_p(w++, 12); /* u16 len */
  1038. b = (void *) w;
  1039. stb_p(b++, 0x01); /* u8 chip_type (CSR) */
  1040. stb_p(b++, N8X0_BT_WKUP_GPIO); /* u8 bt_wakeup_gpio */
  1041. stb_p(b++, N8X0_BT_HOST_WKUP_GPIO); /* u8 host_wakeup_gpio */
  1042. stb_p(b++, N8X0_BT_RESET_GPIO); /* u8 reset_gpio */
  1043. stb_p(b++, BT_UART + 1); /* u8 bt_uart */
  1044. memcpy(b, &n8x0_bd_addr, 6); /* u8 bd_addr[6] */
  1045. b += 6;
  1046. stb_p(b++, 0x02); /* u8 bt_sysclk (38.4) */
  1047. w = (void *) b;
  1048. stw_p(w++, OMAP_TAG_WLAN_CX3110X); /* u16 tag */
  1049. stw_p(w++, 8); /* u16 len */
  1050. stw_p(w++, 0x25); /* u8 chip_type */
  1051. stw_p(w++, N8X0_WLAN_PWR_GPIO); /* s16 power_gpio */
  1052. stw_p(w++, N8X0_WLAN_IRQ_GPIO); /* s16 irq_gpio */
  1053. stw_p(w++, -1); /* s16 spi_cs_gpio */
  1054. stw_p(w++, OMAP_TAG_MMC); /* u16 tag */
  1055. stw_p(w++, 16); /* u16 len */
  1056. if (model == 810) {
  1057. stw_p(w++, 0x23f); /* unsigned flags */
  1058. stw_p(w++, -1); /* s16 power_pin */
  1059. stw_p(w++, -1); /* s16 switch_pin */
  1060. stw_p(w++, -1); /* s16 wp_pin */
  1061. stw_p(w++, 0x240); /* unsigned flags */
  1062. stw_p(w++, 0xc000); /* s16 power_pin */
  1063. stw_p(w++, 0x0248); /* s16 switch_pin */
  1064. stw_p(w++, 0xc000); /* s16 wp_pin */
  1065. } else {
  1066. stw_p(w++, 0xf); /* unsigned flags */
  1067. stw_p(w++, -1); /* s16 power_pin */
  1068. stw_p(w++, -1); /* s16 switch_pin */
  1069. stw_p(w++, -1); /* s16 wp_pin */
  1070. stw_p(w++, 0); /* unsigned flags */
  1071. stw_p(w++, 0); /* s16 power_pin */
  1072. stw_p(w++, 0); /* s16 switch_pin */
  1073. stw_p(w++, 0); /* s16 wp_pin */
  1074. }
  1075. stw_p(w++, OMAP_TAG_TEA5761); /* u16 tag */
  1076. stw_p(w++, 4); /* u16 len */
  1077. stw_p(w++, N8X0_TEA5761_CS_GPIO); /* u16 enable_gpio */
  1078. w++;
  1079. partition = (model == 810) ? n810_part_info : n800_part_info;
  1080. for (; partition->name; partition++) {
  1081. stw_p(w++, OMAP_TAG_PARTITION); /* u16 tag */
  1082. stw_p(w++, 28); /* u16 len */
  1083. strcpy((void *) w, partition->name); /* char name[16] */
  1084. l = (void *) (w + 8);
  1085. stl_p(l++, partition->size); /* unsigned int size */
  1086. stl_p(l++, partition->offset); /* unsigned int offset */
  1087. stl_p(l++, partition->mask); /* unsigned int mask_flags */
  1088. w = (void *) l;
  1089. }
  1090. stw_p(w++, OMAP_TAG_BOOT_REASON); /* u16 tag */
  1091. stw_p(w++, 12); /* u16 len */
  1092. #if 0
  1093. strcpy((void *) w, "por"); /* char reason_str[12] */
  1094. strcpy((void *) w, "charger"); /* char reason_str[12] */
  1095. strcpy((void *) w, "32wd_to"); /* char reason_str[12] */
  1096. strcpy((void *) w, "sw_rst"); /* char reason_str[12] */
  1097. strcpy((void *) w, "mbus"); /* char reason_str[12] */
  1098. strcpy((void *) w, "unknown"); /* char reason_str[12] */
  1099. strcpy((void *) w, "swdg_to"); /* char reason_str[12] */
  1100. strcpy((void *) w, "sec_vio"); /* char reason_str[12] */
  1101. strcpy((void *) w, "pwr_key"); /* char reason_str[12] */
  1102. strcpy((void *) w, "rtc_alarm"); /* char reason_str[12] */
  1103. #else
  1104. strcpy((void *) w, "pwr_key"); /* char reason_str[12] */
  1105. #endif
  1106. w += 6;
  1107. tag = (model == 810) ? "RX-44" : "RX-34";
  1108. stw_p(w++, OMAP_TAG_VERSION_STR); /* u16 tag */
  1109. stw_p(w++, 24); /* u16 len */
  1110. strcpy((void *) w, "product"); /* char component[12] */
  1111. w += 6;
  1112. strcpy((void *) w, tag); /* char version[12] */
  1113. w += 6;
  1114. stw_p(w++, OMAP_TAG_VERSION_STR); /* u16 tag */
  1115. stw_p(w++, 24); /* u16 len */
  1116. strcpy((void *) w, "hw-build"); /* char component[12] */
  1117. w += 6;
  1118. strcpy((void *) w, "QEMU ");
  1119. pstrcat((void *) w, 12, qemu_hw_version()); /* char version[12] */
  1120. w += 6;
  1121. tag = (model == 810) ? "1.1.10-qemu" : "1.1.6-qemu";
  1122. stw_p(w++, OMAP_TAG_VERSION_STR); /* u16 tag */
  1123. stw_p(w++, 24); /* u16 len */
  1124. strcpy((void *) w, "nolo"); /* char component[12] */
  1125. w += 6;
  1126. strcpy((void *) w, tag); /* char version[12] */
  1127. w += 6;
  1128. return (void *) w - p;
  1129. }
  1130. static int n800_atag_setup(const struct arm_boot_info *info, void *p)
  1131. {
  1132. return n8x0_atag_setup(p, 800);
  1133. }
  1134. static int n810_atag_setup(const struct arm_boot_info *info, void *p)
  1135. {
  1136. return n8x0_atag_setup(p, 810);
  1137. }
  1138. static void n8x0_init(MachineState *machine,
  1139. struct arm_boot_info *binfo, int model)
  1140. {
  1141. struct n800_s *s = (struct n800_s *) g_malloc0(sizeof(*s));
  1142. uint64_t sdram_size = binfo->ram_size;
  1143. memory_region_allocate_system_memory(&s->sdram, NULL, "omap2.dram",
  1144. sdram_size);
  1145. memory_region_add_subregion(get_system_memory(), OMAP2_Q2_BASE, &s->sdram);
  1146. s->mpu = omap2420_mpu_init(&s->sdram, machine->cpu_type);
  1147. /* Setup peripherals
  1148. *
  1149. * Believed external peripherals layout in the N810:
  1150. * (spi bus 1)
  1151. * tsc2005
  1152. * lcd_mipid
  1153. * (spi bus 2)
  1154. * Conexant cx3110x (WLAN)
  1155. * optional: pc2400m (WiMAX)
  1156. * (i2c bus 0)
  1157. * TLV320AIC33 (audio codec)
  1158. * TCM825x (camera by Toshiba)
  1159. * lp5521 (clever LEDs)
  1160. * tsl2563 (light sensor, hwmon, model 7, rev. 0)
  1161. * lm8323 (keypad, manf 00, rev 04)
  1162. * (i2c bus 1)
  1163. * tmp105 (temperature sensor, hwmon)
  1164. * menelaus (pm)
  1165. * (somewhere on i2c - maybe N800-only)
  1166. * tea5761 (FM tuner)
  1167. * (serial 0)
  1168. * GPS
  1169. * (some serial port)
  1170. * csr41814 (Bluetooth)
  1171. */
  1172. n8x0_gpio_setup(s);
  1173. n8x0_nand_setup(s);
  1174. n8x0_i2c_setup(s);
  1175. if (model == 800) {
  1176. n800_tsc_kbd_setup(s);
  1177. } else if (model == 810) {
  1178. n810_tsc_setup(s);
  1179. n810_kbd_setup(s);
  1180. }
  1181. n8x0_spi_setup(s);
  1182. n8x0_dss_setup(s);
  1183. n8x0_cbus_setup(s);
  1184. n8x0_uart_setup(s);
  1185. if (machine_usb(machine)) {
  1186. n8x0_usb_setup(s);
  1187. }
  1188. if (machine->kernel_filename) {
  1189. /* Or at the linux loader. */
  1190. arm_load_kernel(s->mpu->cpu, machine, binfo);
  1191. qemu_register_reset(n8x0_boot_init, s);
  1192. }
  1193. if (option_rom[0].name &&
  1194. (machine->boot_order[0] == 'n' || !machine->kernel_filename)) {
  1195. uint8_t *nolo_tags = g_new(uint8_t, 0x10000);
  1196. /* No, wait, better start at the ROM. */
  1197. s->mpu->cpu->env.regs[15] = OMAP2_Q2_BASE + 0x400000;
  1198. /* This is intended for loading the `secondary.bin' program from
  1199. * Nokia images (the NOLO bootloader). The entry point seems
  1200. * to be at OMAP2_Q2_BASE + 0x400000.
  1201. *
  1202. * The `2nd.bin' files contain some kind of earlier boot code and
  1203. * for them the entry point needs to be set to OMAP2_SRAM_BASE.
  1204. *
  1205. * The code above is for loading the `zImage' file from Nokia
  1206. * images. */
  1207. load_image_targphys(option_rom[0].name,
  1208. OMAP2_Q2_BASE + 0x400000,
  1209. sdram_size - 0x400000);
  1210. n800_setup_nolo_tags(nolo_tags);
  1211. cpu_physical_memory_write(OMAP2_SRAM_BASE, nolo_tags, 0x10000);
  1212. g_free(nolo_tags);
  1213. }
  1214. }
  1215. static struct arm_boot_info n800_binfo = {
  1216. .loader_start = OMAP2_Q2_BASE,
  1217. /* Actually two chips of 0x4000000 bytes each */
  1218. .ram_size = 0x08000000,
  1219. .board_id = 0x4f7,
  1220. .atag_board = n800_atag_setup,
  1221. };
  1222. static struct arm_boot_info n810_binfo = {
  1223. .loader_start = OMAP2_Q2_BASE,
  1224. /* Actually two chips of 0x4000000 bytes each */
  1225. .ram_size = 0x08000000,
  1226. /* 0x60c and 0x6bf (WiMAX Edition) have been assigned but are not
  1227. * used by some older versions of the bootloader and 5555 is used
  1228. * instead (including versions that shipped with many devices). */
  1229. .board_id = 0x60c,
  1230. .atag_board = n810_atag_setup,
  1231. };
  1232. static void n800_init(MachineState *machine)
  1233. {
  1234. n8x0_init(machine, &n800_binfo, 800);
  1235. }
  1236. static void n810_init(MachineState *machine)
  1237. {
  1238. n8x0_init(machine, &n810_binfo, 810);
  1239. }
  1240. static void n800_class_init(ObjectClass *oc, void *data)
  1241. {
  1242. MachineClass *mc = MACHINE_CLASS(oc);
  1243. mc->desc = "Nokia N800 tablet aka. RX-34 (OMAP2420)";
  1244. mc->init = n800_init;
  1245. mc->default_boot_order = "";
  1246. mc->ignore_memory_transaction_failures = true;
  1247. mc->default_cpu_type = ARM_CPU_TYPE_NAME("arm1136-r2");
  1248. }
  1249. static const TypeInfo n800_type = {
  1250. .name = MACHINE_TYPE_NAME("n800"),
  1251. .parent = TYPE_MACHINE,
  1252. .class_init = n800_class_init,
  1253. };
  1254. static void n810_class_init(ObjectClass *oc, void *data)
  1255. {
  1256. MachineClass *mc = MACHINE_CLASS(oc);
  1257. mc->desc = "Nokia N810 tablet aka. RX-44 (OMAP2420)";
  1258. mc->init = n810_init;
  1259. mc->default_boot_order = "";
  1260. mc->ignore_memory_transaction_failures = true;
  1261. mc->default_cpu_type = ARM_CPU_TYPE_NAME("arm1136-r2");
  1262. }
  1263. static const TypeInfo n810_type = {
  1264. .name = MACHINE_TYPE_NAME("n810"),
  1265. .parent = TYPE_MACHINE,
  1266. .class_init = n810_class_init,
  1267. };
  1268. static void nseries_machine_init(void)
  1269. {
  1270. type_register_static(&n800_type);
  1271. type_register_static(&n810_type);
  1272. }
  1273. type_init(nseries_machine_init)