stellaris.c 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401
  1. /*
  2. * Luminary Micro Stellaris peripherals
  3. *
  4. * Copyright (c) 2006 CodeSourcery.
  5. * Written by Paul Brook
  6. *
  7. * This code is licensed under the GPL.
  8. */
  9. #include "sysbus.h"
  10. #include "ssi.h"
  11. #include "arm-misc.h"
  12. #include "devices.h"
  13. #include "qemu/timer.h"
  14. #include "i2c.h"
  15. #include "net/net.h"
  16. #include "boards.h"
  17. #include "exec/address-spaces.h"
  18. #define GPIO_A 0
  19. #define GPIO_B 1
  20. #define GPIO_C 2
  21. #define GPIO_D 3
  22. #define GPIO_E 4
  23. #define GPIO_F 5
  24. #define GPIO_G 6
  25. #define BP_OLED_I2C 0x01
  26. #define BP_OLED_SSI 0x02
  27. #define BP_GAMEPAD 0x04
  28. typedef const struct {
  29. const char *name;
  30. uint32_t did0;
  31. uint32_t did1;
  32. uint32_t dc0;
  33. uint32_t dc1;
  34. uint32_t dc2;
  35. uint32_t dc3;
  36. uint32_t dc4;
  37. uint32_t peripherals;
  38. } stellaris_board_info;
  39. /* General purpose timer module. */
  40. typedef struct gptm_state {
  41. SysBusDevice busdev;
  42. MemoryRegion iomem;
  43. uint32_t config;
  44. uint32_t mode[2];
  45. uint32_t control;
  46. uint32_t state;
  47. uint32_t mask;
  48. uint32_t load[2];
  49. uint32_t match[2];
  50. uint32_t prescale[2];
  51. uint32_t match_prescale[2];
  52. uint32_t rtc;
  53. int64_t tick[2];
  54. struct gptm_state *opaque[2];
  55. QEMUTimer *timer[2];
  56. /* The timers have an alternate output used to trigger the ADC. */
  57. qemu_irq trigger;
  58. qemu_irq irq;
  59. } gptm_state;
  60. static void gptm_update_irq(gptm_state *s)
  61. {
  62. int level;
  63. level = (s->state & s->mask) != 0;
  64. qemu_set_irq(s->irq, level);
  65. }
  66. static void gptm_stop(gptm_state *s, int n)
  67. {
  68. qemu_del_timer(s->timer[n]);
  69. }
  70. static void gptm_reload(gptm_state *s, int n, int reset)
  71. {
  72. int64_t tick;
  73. if (reset)
  74. tick = qemu_get_clock_ns(vm_clock);
  75. else
  76. tick = s->tick[n];
  77. if (s->config == 0) {
  78. /* 32-bit CountDown. */
  79. uint32_t count;
  80. count = s->load[0] | (s->load[1] << 16);
  81. tick += (int64_t)count * system_clock_scale;
  82. } else if (s->config == 1) {
  83. /* 32-bit RTC. 1Hz tick. */
  84. tick += get_ticks_per_sec();
  85. } else if (s->mode[n] == 0xa) {
  86. /* PWM mode. Not implemented. */
  87. } else {
  88. hw_error("TODO: 16-bit timer mode 0x%x\n", s->mode[n]);
  89. }
  90. s->tick[n] = tick;
  91. qemu_mod_timer(s->timer[n], tick);
  92. }
  93. static void gptm_tick(void *opaque)
  94. {
  95. gptm_state **p = (gptm_state **)opaque;
  96. gptm_state *s;
  97. int n;
  98. s = *p;
  99. n = p - s->opaque;
  100. if (s->config == 0) {
  101. s->state |= 1;
  102. if ((s->control & 0x20)) {
  103. /* Output trigger. */
  104. qemu_irq_pulse(s->trigger);
  105. }
  106. if (s->mode[0] & 1) {
  107. /* One-shot. */
  108. s->control &= ~1;
  109. } else {
  110. /* Periodic. */
  111. gptm_reload(s, 0, 0);
  112. }
  113. } else if (s->config == 1) {
  114. /* RTC. */
  115. uint32_t match;
  116. s->rtc++;
  117. match = s->match[0] | (s->match[1] << 16);
  118. if (s->rtc > match)
  119. s->rtc = 0;
  120. if (s->rtc == 0) {
  121. s->state |= 8;
  122. }
  123. gptm_reload(s, 0, 0);
  124. } else if (s->mode[n] == 0xa) {
  125. /* PWM mode. Not implemented. */
  126. } else {
  127. hw_error("TODO: 16-bit timer mode 0x%x\n", s->mode[n]);
  128. }
  129. gptm_update_irq(s);
  130. }
  131. static uint64_t gptm_read(void *opaque, hwaddr offset,
  132. unsigned size)
  133. {
  134. gptm_state *s = (gptm_state *)opaque;
  135. switch (offset) {
  136. case 0x00: /* CFG */
  137. return s->config;
  138. case 0x04: /* TAMR */
  139. return s->mode[0];
  140. case 0x08: /* TBMR */
  141. return s->mode[1];
  142. case 0x0c: /* CTL */
  143. return s->control;
  144. case 0x18: /* IMR */
  145. return s->mask;
  146. case 0x1c: /* RIS */
  147. return s->state;
  148. case 0x20: /* MIS */
  149. return s->state & s->mask;
  150. case 0x24: /* CR */
  151. return 0;
  152. case 0x28: /* TAILR */
  153. return s->load[0] | ((s->config < 4) ? (s->load[1] << 16) : 0);
  154. case 0x2c: /* TBILR */
  155. return s->load[1];
  156. case 0x30: /* TAMARCHR */
  157. return s->match[0] | ((s->config < 4) ? (s->match[1] << 16) : 0);
  158. case 0x34: /* TBMATCHR */
  159. return s->match[1];
  160. case 0x38: /* TAPR */
  161. return s->prescale[0];
  162. case 0x3c: /* TBPR */
  163. return s->prescale[1];
  164. case 0x40: /* TAPMR */
  165. return s->match_prescale[0];
  166. case 0x44: /* TBPMR */
  167. return s->match_prescale[1];
  168. case 0x48: /* TAR */
  169. if (s->control == 1)
  170. return s->rtc;
  171. case 0x4c: /* TBR */
  172. hw_error("TODO: Timer value read\n");
  173. default:
  174. hw_error("gptm_read: Bad offset 0x%x\n", (int)offset);
  175. return 0;
  176. }
  177. }
  178. static void gptm_write(void *opaque, hwaddr offset,
  179. uint64_t value, unsigned size)
  180. {
  181. gptm_state *s = (gptm_state *)opaque;
  182. uint32_t oldval;
  183. /* The timers should be disabled before changing the configuration.
  184. We take advantage of this and defer everything until the timer
  185. is enabled. */
  186. switch (offset) {
  187. case 0x00: /* CFG */
  188. s->config = value;
  189. break;
  190. case 0x04: /* TAMR */
  191. s->mode[0] = value;
  192. break;
  193. case 0x08: /* TBMR */
  194. s->mode[1] = value;
  195. break;
  196. case 0x0c: /* CTL */
  197. oldval = s->control;
  198. s->control = value;
  199. /* TODO: Implement pause. */
  200. if ((oldval ^ value) & 1) {
  201. if (value & 1) {
  202. gptm_reload(s, 0, 1);
  203. } else {
  204. gptm_stop(s, 0);
  205. }
  206. }
  207. if (((oldval ^ value) & 0x100) && s->config >= 4) {
  208. if (value & 0x100) {
  209. gptm_reload(s, 1, 1);
  210. } else {
  211. gptm_stop(s, 1);
  212. }
  213. }
  214. break;
  215. case 0x18: /* IMR */
  216. s->mask = value & 0x77;
  217. gptm_update_irq(s);
  218. break;
  219. case 0x24: /* CR */
  220. s->state &= ~value;
  221. break;
  222. case 0x28: /* TAILR */
  223. s->load[0] = value & 0xffff;
  224. if (s->config < 4) {
  225. s->load[1] = value >> 16;
  226. }
  227. break;
  228. case 0x2c: /* TBILR */
  229. s->load[1] = value & 0xffff;
  230. break;
  231. case 0x30: /* TAMARCHR */
  232. s->match[0] = value & 0xffff;
  233. if (s->config < 4) {
  234. s->match[1] = value >> 16;
  235. }
  236. break;
  237. case 0x34: /* TBMATCHR */
  238. s->match[1] = value >> 16;
  239. break;
  240. case 0x38: /* TAPR */
  241. s->prescale[0] = value;
  242. break;
  243. case 0x3c: /* TBPR */
  244. s->prescale[1] = value;
  245. break;
  246. case 0x40: /* TAPMR */
  247. s->match_prescale[0] = value;
  248. break;
  249. case 0x44: /* TBPMR */
  250. s->match_prescale[0] = value;
  251. break;
  252. default:
  253. hw_error("gptm_write: Bad offset 0x%x\n", (int)offset);
  254. }
  255. gptm_update_irq(s);
  256. }
  257. static const MemoryRegionOps gptm_ops = {
  258. .read = gptm_read,
  259. .write = gptm_write,
  260. .endianness = DEVICE_NATIVE_ENDIAN,
  261. };
  262. static const VMStateDescription vmstate_stellaris_gptm = {
  263. .name = "stellaris_gptm",
  264. .version_id = 1,
  265. .minimum_version_id = 1,
  266. .minimum_version_id_old = 1,
  267. .fields = (VMStateField[]) {
  268. VMSTATE_UINT32(config, gptm_state),
  269. VMSTATE_UINT32_ARRAY(mode, gptm_state, 2),
  270. VMSTATE_UINT32(control, gptm_state),
  271. VMSTATE_UINT32(state, gptm_state),
  272. VMSTATE_UINT32(mask, gptm_state),
  273. VMSTATE_UNUSED(8),
  274. VMSTATE_UINT32_ARRAY(load, gptm_state, 2),
  275. VMSTATE_UINT32_ARRAY(match, gptm_state, 2),
  276. VMSTATE_UINT32_ARRAY(prescale, gptm_state, 2),
  277. VMSTATE_UINT32_ARRAY(match_prescale, gptm_state, 2),
  278. VMSTATE_UINT32(rtc, gptm_state),
  279. VMSTATE_INT64_ARRAY(tick, gptm_state, 2),
  280. VMSTATE_TIMER_ARRAY(timer, gptm_state, 2),
  281. VMSTATE_END_OF_LIST()
  282. }
  283. };
  284. static int stellaris_gptm_init(SysBusDevice *dev)
  285. {
  286. gptm_state *s = FROM_SYSBUS(gptm_state, dev);
  287. sysbus_init_irq(dev, &s->irq);
  288. qdev_init_gpio_out(&dev->qdev, &s->trigger, 1);
  289. memory_region_init_io(&s->iomem, &gptm_ops, s,
  290. "gptm", 0x1000);
  291. sysbus_init_mmio(dev, &s->iomem);
  292. s->opaque[0] = s->opaque[1] = s;
  293. s->timer[0] = qemu_new_timer_ns(vm_clock, gptm_tick, &s->opaque[0]);
  294. s->timer[1] = qemu_new_timer_ns(vm_clock, gptm_tick, &s->opaque[1]);
  295. vmstate_register(&dev->qdev, -1, &vmstate_stellaris_gptm, s);
  296. return 0;
  297. }
  298. /* System controller. */
  299. typedef struct {
  300. MemoryRegion iomem;
  301. uint32_t pborctl;
  302. uint32_t ldopctl;
  303. uint32_t int_status;
  304. uint32_t int_mask;
  305. uint32_t resc;
  306. uint32_t rcc;
  307. uint32_t rcc2;
  308. uint32_t rcgc[3];
  309. uint32_t scgc[3];
  310. uint32_t dcgc[3];
  311. uint32_t clkvclr;
  312. uint32_t ldoarst;
  313. uint32_t user0;
  314. uint32_t user1;
  315. qemu_irq irq;
  316. stellaris_board_info *board;
  317. } ssys_state;
  318. static void ssys_update(ssys_state *s)
  319. {
  320. qemu_set_irq(s->irq, (s->int_status & s->int_mask) != 0);
  321. }
  322. static uint32_t pllcfg_sandstorm[16] = {
  323. 0x31c0, /* 1 Mhz */
  324. 0x1ae0, /* 1.8432 Mhz */
  325. 0x18c0, /* 2 Mhz */
  326. 0xd573, /* 2.4576 Mhz */
  327. 0x37a6, /* 3.57954 Mhz */
  328. 0x1ae2, /* 3.6864 Mhz */
  329. 0x0c40, /* 4 Mhz */
  330. 0x98bc, /* 4.906 Mhz */
  331. 0x935b, /* 4.9152 Mhz */
  332. 0x09c0, /* 5 Mhz */
  333. 0x4dee, /* 5.12 Mhz */
  334. 0x0c41, /* 6 Mhz */
  335. 0x75db, /* 6.144 Mhz */
  336. 0x1ae6, /* 7.3728 Mhz */
  337. 0x0600, /* 8 Mhz */
  338. 0x585b /* 8.192 Mhz */
  339. };
  340. static uint32_t pllcfg_fury[16] = {
  341. 0x3200, /* 1 Mhz */
  342. 0x1b20, /* 1.8432 Mhz */
  343. 0x1900, /* 2 Mhz */
  344. 0xf42b, /* 2.4576 Mhz */
  345. 0x37e3, /* 3.57954 Mhz */
  346. 0x1b21, /* 3.6864 Mhz */
  347. 0x0c80, /* 4 Mhz */
  348. 0x98ee, /* 4.906 Mhz */
  349. 0xd5b4, /* 4.9152 Mhz */
  350. 0x0a00, /* 5 Mhz */
  351. 0x4e27, /* 5.12 Mhz */
  352. 0x1902, /* 6 Mhz */
  353. 0xec1c, /* 6.144 Mhz */
  354. 0x1b23, /* 7.3728 Mhz */
  355. 0x0640, /* 8 Mhz */
  356. 0xb11c /* 8.192 Mhz */
  357. };
  358. #define DID0_VER_MASK 0x70000000
  359. #define DID0_VER_0 0x00000000
  360. #define DID0_VER_1 0x10000000
  361. #define DID0_CLASS_MASK 0x00FF0000
  362. #define DID0_CLASS_SANDSTORM 0x00000000
  363. #define DID0_CLASS_FURY 0x00010000
  364. static int ssys_board_class(const ssys_state *s)
  365. {
  366. uint32_t did0 = s->board->did0;
  367. switch (did0 & DID0_VER_MASK) {
  368. case DID0_VER_0:
  369. return DID0_CLASS_SANDSTORM;
  370. case DID0_VER_1:
  371. switch (did0 & DID0_CLASS_MASK) {
  372. case DID0_CLASS_SANDSTORM:
  373. case DID0_CLASS_FURY:
  374. return did0 & DID0_CLASS_MASK;
  375. }
  376. /* for unknown classes, fall through */
  377. default:
  378. hw_error("ssys_board_class: Unknown class 0x%08x\n", did0);
  379. }
  380. }
  381. static uint64_t ssys_read(void *opaque, hwaddr offset,
  382. unsigned size)
  383. {
  384. ssys_state *s = (ssys_state *)opaque;
  385. switch (offset) {
  386. case 0x000: /* DID0 */
  387. return s->board->did0;
  388. case 0x004: /* DID1 */
  389. return s->board->did1;
  390. case 0x008: /* DC0 */
  391. return s->board->dc0;
  392. case 0x010: /* DC1 */
  393. return s->board->dc1;
  394. case 0x014: /* DC2 */
  395. return s->board->dc2;
  396. case 0x018: /* DC3 */
  397. return s->board->dc3;
  398. case 0x01c: /* DC4 */
  399. return s->board->dc4;
  400. case 0x030: /* PBORCTL */
  401. return s->pborctl;
  402. case 0x034: /* LDOPCTL */
  403. return s->ldopctl;
  404. case 0x040: /* SRCR0 */
  405. return 0;
  406. case 0x044: /* SRCR1 */
  407. return 0;
  408. case 0x048: /* SRCR2 */
  409. return 0;
  410. case 0x050: /* RIS */
  411. return s->int_status;
  412. case 0x054: /* IMC */
  413. return s->int_mask;
  414. case 0x058: /* MISC */
  415. return s->int_status & s->int_mask;
  416. case 0x05c: /* RESC */
  417. return s->resc;
  418. case 0x060: /* RCC */
  419. return s->rcc;
  420. case 0x064: /* PLLCFG */
  421. {
  422. int xtal;
  423. xtal = (s->rcc >> 6) & 0xf;
  424. switch (ssys_board_class(s)) {
  425. case DID0_CLASS_FURY:
  426. return pllcfg_fury[xtal];
  427. case DID0_CLASS_SANDSTORM:
  428. return pllcfg_sandstorm[xtal];
  429. default:
  430. hw_error("ssys_read: Unhandled class for PLLCFG read.\n");
  431. return 0;
  432. }
  433. }
  434. case 0x070: /* RCC2 */
  435. return s->rcc2;
  436. case 0x100: /* RCGC0 */
  437. return s->rcgc[0];
  438. case 0x104: /* RCGC1 */
  439. return s->rcgc[1];
  440. case 0x108: /* RCGC2 */
  441. return s->rcgc[2];
  442. case 0x110: /* SCGC0 */
  443. return s->scgc[0];
  444. case 0x114: /* SCGC1 */
  445. return s->scgc[1];
  446. case 0x118: /* SCGC2 */
  447. return s->scgc[2];
  448. case 0x120: /* DCGC0 */
  449. return s->dcgc[0];
  450. case 0x124: /* DCGC1 */
  451. return s->dcgc[1];
  452. case 0x128: /* DCGC2 */
  453. return s->dcgc[2];
  454. case 0x150: /* CLKVCLR */
  455. return s->clkvclr;
  456. case 0x160: /* LDOARST */
  457. return s->ldoarst;
  458. case 0x1e0: /* USER0 */
  459. return s->user0;
  460. case 0x1e4: /* USER1 */
  461. return s->user1;
  462. default:
  463. hw_error("ssys_read: Bad offset 0x%x\n", (int)offset);
  464. return 0;
  465. }
  466. }
  467. static bool ssys_use_rcc2(ssys_state *s)
  468. {
  469. return (s->rcc2 >> 31) & 0x1;
  470. }
  471. /*
  472. * Caculate the sys. clock period in ms.
  473. */
  474. static void ssys_calculate_system_clock(ssys_state *s)
  475. {
  476. if (ssys_use_rcc2(s)) {
  477. system_clock_scale = 5 * (((s->rcc2 >> 23) & 0x3f) + 1);
  478. } else {
  479. system_clock_scale = 5 * (((s->rcc >> 23) & 0xf) + 1);
  480. }
  481. }
  482. static void ssys_write(void *opaque, hwaddr offset,
  483. uint64_t value, unsigned size)
  484. {
  485. ssys_state *s = (ssys_state *)opaque;
  486. switch (offset) {
  487. case 0x030: /* PBORCTL */
  488. s->pborctl = value & 0xffff;
  489. break;
  490. case 0x034: /* LDOPCTL */
  491. s->ldopctl = value & 0x1f;
  492. break;
  493. case 0x040: /* SRCR0 */
  494. case 0x044: /* SRCR1 */
  495. case 0x048: /* SRCR2 */
  496. fprintf(stderr, "Peripheral reset not implemented\n");
  497. break;
  498. case 0x054: /* IMC */
  499. s->int_mask = value & 0x7f;
  500. break;
  501. case 0x058: /* MISC */
  502. s->int_status &= ~value;
  503. break;
  504. case 0x05c: /* RESC */
  505. s->resc = value & 0x3f;
  506. break;
  507. case 0x060: /* RCC */
  508. if ((s->rcc & (1 << 13)) != 0 && (value & (1 << 13)) == 0) {
  509. /* PLL enable. */
  510. s->int_status |= (1 << 6);
  511. }
  512. s->rcc = value;
  513. ssys_calculate_system_clock(s);
  514. break;
  515. case 0x070: /* RCC2 */
  516. if (ssys_board_class(s) == DID0_CLASS_SANDSTORM) {
  517. break;
  518. }
  519. if ((s->rcc2 & (1 << 13)) != 0 && (value & (1 << 13)) == 0) {
  520. /* PLL enable. */
  521. s->int_status |= (1 << 6);
  522. }
  523. s->rcc2 = value;
  524. ssys_calculate_system_clock(s);
  525. break;
  526. case 0x100: /* RCGC0 */
  527. s->rcgc[0] = value;
  528. break;
  529. case 0x104: /* RCGC1 */
  530. s->rcgc[1] = value;
  531. break;
  532. case 0x108: /* RCGC2 */
  533. s->rcgc[2] = value;
  534. break;
  535. case 0x110: /* SCGC0 */
  536. s->scgc[0] = value;
  537. break;
  538. case 0x114: /* SCGC1 */
  539. s->scgc[1] = value;
  540. break;
  541. case 0x118: /* SCGC2 */
  542. s->scgc[2] = value;
  543. break;
  544. case 0x120: /* DCGC0 */
  545. s->dcgc[0] = value;
  546. break;
  547. case 0x124: /* DCGC1 */
  548. s->dcgc[1] = value;
  549. break;
  550. case 0x128: /* DCGC2 */
  551. s->dcgc[2] = value;
  552. break;
  553. case 0x150: /* CLKVCLR */
  554. s->clkvclr = value;
  555. break;
  556. case 0x160: /* LDOARST */
  557. s->ldoarst = value;
  558. break;
  559. default:
  560. hw_error("ssys_write: Bad offset 0x%x\n", (int)offset);
  561. }
  562. ssys_update(s);
  563. }
  564. static const MemoryRegionOps ssys_ops = {
  565. .read = ssys_read,
  566. .write = ssys_write,
  567. .endianness = DEVICE_NATIVE_ENDIAN,
  568. };
  569. static void ssys_reset(void *opaque)
  570. {
  571. ssys_state *s = (ssys_state *)opaque;
  572. s->pborctl = 0x7ffd;
  573. s->rcc = 0x078e3ac0;
  574. if (ssys_board_class(s) == DID0_CLASS_SANDSTORM) {
  575. s->rcc2 = 0;
  576. } else {
  577. s->rcc2 = 0x07802810;
  578. }
  579. s->rcgc[0] = 1;
  580. s->scgc[0] = 1;
  581. s->dcgc[0] = 1;
  582. ssys_calculate_system_clock(s);
  583. }
  584. static int stellaris_sys_post_load(void *opaque, int version_id)
  585. {
  586. ssys_state *s = opaque;
  587. ssys_calculate_system_clock(s);
  588. return 0;
  589. }
  590. static const VMStateDescription vmstate_stellaris_sys = {
  591. .name = "stellaris_sys",
  592. .version_id = 2,
  593. .minimum_version_id = 1,
  594. .minimum_version_id_old = 1,
  595. .post_load = stellaris_sys_post_load,
  596. .fields = (VMStateField[]) {
  597. VMSTATE_UINT32(pborctl, ssys_state),
  598. VMSTATE_UINT32(ldopctl, ssys_state),
  599. VMSTATE_UINT32(int_mask, ssys_state),
  600. VMSTATE_UINT32(int_status, ssys_state),
  601. VMSTATE_UINT32(resc, ssys_state),
  602. VMSTATE_UINT32(rcc, ssys_state),
  603. VMSTATE_UINT32_V(rcc2, ssys_state, 2),
  604. VMSTATE_UINT32_ARRAY(rcgc, ssys_state, 3),
  605. VMSTATE_UINT32_ARRAY(scgc, ssys_state, 3),
  606. VMSTATE_UINT32_ARRAY(dcgc, ssys_state, 3),
  607. VMSTATE_UINT32(clkvclr, ssys_state),
  608. VMSTATE_UINT32(ldoarst, ssys_state),
  609. VMSTATE_END_OF_LIST()
  610. }
  611. };
  612. static int stellaris_sys_init(uint32_t base, qemu_irq irq,
  613. stellaris_board_info * board,
  614. uint8_t *macaddr)
  615. {
  616. ssys_state *s;
  617. s = (ssys_state *)g_malloc0(sizeof(ssys_state));
  618. s->irq = irq;
  619. s->board = board;
  620. /* Most devices come preprogrammed with a MAC address in the user data. */
  621. s->user0 = macaddr[0] | (macaddr[1] << 8) | (macaddr[2] << 16);
  622. s->user1 = macaddr[3] | (macaddr[4] << 8) | (macaddr[5] << 16);
  623. memory_region_init_io(&s->iomem, &ssys_ops, s, "ssys", 0x00001000);
  624. memory_region_add_subregion(get_system_memory(), base, &s->iomem);
  625. ssys_reset(s);
  626. vmstate_register(NULL, -1, &vmstate_stellaris_sys, s);
  627. return 0;
  628. }
  629. /* I2C controller. */
  630. typedef struct {
  631. SysBusDevice busdev;
  632. i2c_bus *bus;
  633. qemu_irq irq;
  634. MemoryRegion iomem;
  635. uint32_t msa;
  636. uint32_t mcs;
  637. uint32_t mdr;
  638. uint32_t mtpr;
  639. uint32_t mimr;
  640. uint32_t mris;
  641. uint32_t mcr;
  642. } stellaris_i2c_state;
  643. #define STELLARIS_I2C_MCS_BUSY 0x01
  644. #define STELLARIS_I2C_MCS_ERROR 0x02
  645. #define STELLARIS_I2C_MCS_ADRACK 0x04
  646. #define STELLARIS_I2C_MCS_DATACK 0x08
  647. #define STELLARIS_I2C_MCS_ARBLST 0x10
  648. #define STELLARIS_I2C_MCS_IDLE 0x20
  649. #define STELLARIS_I2C_MCS_BUSBSY 0x40
  650. static uint64_t stellaris_i2c_read(void *opaque, hwaddr offset,
  651. unsigned size)
  652. {
  653. stellaris_i2c_state *s = (stellaris_i2c_state *)opaque;
  654. switch (offset) {
  655. case 0x00: /* MSA */
  656. return s->msa;
  657. case 0x04: /* MCS */
  658. /* We don't emulate timing, so the controller is never busy. */
  659. return s->mcs | STELLARIS_I2C_MCS_IDLE;
  660. case 0x08: /* MDR */
  661. return s->mdr;
  662. case 0x0c: /* MTPR */
  663. return s->mtpr;
  664. case 0x10: /* MIMR */
  665. return s->mimr;
  666. case 0x14: /* MRIS */
  667. return s->mris;
  668. case 0x18: /* MMIS */
  669. return s->mris & s->mimr;
  670. case 0x20: /* MCR */
  671. return s->mcr;
  672. default:
  673. hw_error("strllaris_i2c_read: Bad offset 0x%x\n", (int)offset);
  674. return 0;
  675. }
  676. }
  677. static void stellaris_i2c_update(stellaris_i2c_state *s)
  678. {
  679. int level;
  680. level = (s->mris & s->mimr) != 0;
  681. qemu_set_irq(s->irq, level);
  682. }
  683. static void stellaris_i2c_write(void *opaque, hwaddr offset,
  684. uint64_t value, unsigned size)
  685. {
  686. stellaris_i2c_state *s = (stellaris_i2c_state *)opaque;
  687. switch (offset) {
  688. case 0x00: /* MSA */
  689. s->msa = value & 0xff;
  690. break;
  691. case 0x04: /* MCS */
  692. if ((s->mcr & 0x10) == 0) {
  693. /* Disabled. Do nothing. */
  694. break;
  695. }
  696. /* Grab the bus if this is starting a transfer. */
  697. if ((value & 2) && (s->mcs & STELLARIS_I2C_MCS_BUSBSY) == 0) {
  698. if (i2c_start_transfer(s->bus, s->msa >> 1, s->msa & 1)) {
  699. s->mcs |= STELLARIS_I2C_MCS_ARBLST;
  700. } else {
  701. s->mcs &= ~STELLARIS_I2C_MCS_ARBLST;
  702. s->mcs |= STELLARIS_I2C_MCS_BUSBSY;
  703. }
  704. }
  705. /* If we don't have the bus then indicate an error. */
  706. if (!i2c_bus_busy(s->bus)
  707. || (s->mcs & STELLARIS_I2C_MCS_BUSBSY) == 0) {
  708. s->mcs |= STELLARIS_I2C_MCS_ERROR;
  709. break;
  710. }
  711. s->mcs &= ~STELLARIS_I2C_MCS_ERROR;
  712. if (value & 1) {
  713. /* Transfer a byte. */
  714. /* TODO: Handle errors. */
  715. if (s->msa & 1) {
  716. /* Recv */
  717. s->mdr = i2c_recv(s->bus) & 0xff;
  718. } else {
  719. /* Send */
  720. i2c_send(s->bus, s->mdr);
  721. }
  722. /* Raise an interrupt. */
  723. s->mris |= 1;
  724. }
  725. if (value & 4) {
  726. /* Finish transfer. */
  727. i2c_end_transfer(s->bus);
  728. s->mcs &= ~STELLARIS_I2C_MCS_BUSBSY;
  729. }
  730. break;
  731. case 0x08: /* MDR */
  732. s->mdr = value & 0xff;
  733. break;
  734. case 0x0c: /* MTPR */
  735. s->mtpr = value & 0xff;
  736. break;
  737. case 0x10: /* MIMR */
  738. s->mimr = 1;
  739. break;
  740. case 0x1c: /* MICR */
  741. s->mris &= ~value;
  742. break;
  743. case 0x20: /* MCR */
  744. if (value & 1)
  745. hw_error(
  746. "stellaris_i2c_write: Loopback not implemented\n");
  747. if (value & 0x20)
  748. hw_error(
  749. "stellaris_i2c_write: Slave mode not implemented\n");
  750. s->mcr = value & 0x31;
  751. break;
  752. default:
  753. hw_error("stellaris_i2c_write: Bad offset 0x%x\n",
  754. (int)offset);
  755. }
  756. stellaris_i2c_update(s);
  757. }
  758. static void stellaris_i2c_reset(stellaris_i2c_state *s)
  759. {
  760. if (s->mcs & STELLARIS_I2C_MCS_BUSBSY)
  761. i2c_end_transfer(s->bus);
  762. s->msa = 0;
  763. s->mcs = 0;
  764. s->mdr = 0;
  765. s->mtpr = 1;
  766. s->mimr = 0;
  767. s->mris = 0;
  768. s->mcr = 0;
  769. stellaris_i2c_update(s);
  770. }
  771. static const MemoryRegionOps stellaris_i2c_ops = {
  772. .read = stellaris_i2c_read,
  773. .write = stellaris_i2c_write,
  774. .endianness = DEVICE_NATIVE_ENDIAN,
  775. };
  776. static const VMStateDescription vmstate_stellaris_i2c = {
  777. .name = "stellaris_i2c",
  778. .version_id = 1,
  779. .minimum_version_id = 1,
  780. .minimum_version_id_old = 1,
  781. .fields = (VMStateField[]) {
  782. VMSTATE_UINT32(msa, stellaris_i2c_state),
  783. VMSTATE_UINT32(mcs, stellaris_i2c_state),
  784. VMSTATE_UINT32(mdr, stellaris_i2c_state),
  785. VMSTATE_UINT32(mtpr, stellaris_i2c_state),
  786. VMSTATE_UINT32(mimr, stellaris_i2c_state),
  787. VMSTATE_UINT32(mris, stellaris_i2c_state),
  788. VMSTATE_UINT32(mcr, stellaris_i2c_state),
  789. VMSTATE_END_OF_LIST()
  790. }
  791. };
  792. static int stellaris_i2c_init(SysBusDevice * dev)
  793. {
  794. stellaris_i2c_state *s = FROM_SYSBUS(stellaris_i2c_state, dev);
  795. i2c_bus *bus;
  796. sysbus_init_irq(dev, &s->irq);
  797. bus = i2c_init_bus(&dev->qdev, "i2c");
  798. s->bus = bus;
  799. memory_region_init_io(&s->iomem, &stellaris_i2c_ops, s,
  800. "i2c", 0x1000);
  801. sysbus_init_mmio(dev, &s->iomem);
  802. /* ??? For now we only implement the master interface. */
  803. stellaris_i2c_reset(s);
  804. vmstate_register(&dev->qdev, -1, &vmstate_stellaris_i2c, s);
  805. return 0;
  806. }
  807. /* Analogue to Digital Converter. This is only partially implemented,
  808. enough for applications that use a combined ADC and timer tick. */
  809. #define STELLARIS_ADC_EM_CONTROLLER 0
  810. #define STELLARIS_ADC_EM_COMP 1
  811. #define STELLARIS_ADC_EM_EXTERNAL 4
  812. #define STELLARIS_ADC_EM_TIMER 5
  813. #define STELLARIS_ADC_EM_PWM0 6
  814. #define STELLARIS_ADC_EM_PWM1 7
  815. #define STELLARIS_ADC_EM_PWM2 8
  816. #define STELLARIS_ADC_FIFO_EMPTY 0x0100
  817. #define STELLARIS_ADC_FIFO_FULL 0x1000
  818. typedef struct
  819. {
  820. SysBusDevice busdev;
  821. MemoryRegion iomem;
  822. uint32_t actss;
  823. uint32_t ris;
  824. uint32_t im;
  825. uint32_t emux;
  826. uint32_t ostat;
  827. uint32_t ustat;
  828. uint32_t sspri;
  829. uint32_t sac;
  830. struct {
  831. uint32_t state;
  832. uint32_t data[16];
  833. } fifo[4];
  834. uint32_t ssmux[4];
  835. uint32_t ssctl[4];
  836. uint32_t noise;
  837. qemu_irq irq[4];
  838. } stellaris_adc_state;
  839. static uint32_t stellaris_adc_fifo_read(stellaris_adc_state *s, int n)
  840. {
  841. int tail;
  842. tail = s->fifo[n].state & 0xf;
  843. if (s->fifo[n].state & STELLARIS_ADC_FIFO_EMPTY) {
  844. s->ustat |= 1 << n;
  845. } else {
  846. s->fifo[n].state = (s->fifo[n].state & ~0xf) | ((tail + 1) & 0xf);
  847. s->fifo[n].state &= ~STELLARIS_ADC_FIFO_FULL;
  848. if (tail + 1 == ((s->fifo[n].state >> 4) & 0xf))
  849. s->fifo[n].state |= STELLARIS_ADC_FIFO_EMPTY;
  850. }
  851. return s->fifo[n].data[tail];
  852. }
  853. static void stellaris_adc_fifo_write(stellaris_adc_state *s, int n,
  854. uint32_t value)
  855. {
  856. int head;
  857. /* TODO: Real hardware has limited size FIFOs. We have a full 16 entry
  858. FIFO fir each sequencer. */
  859. head = (s->fifo[n].state >> 4) & 0xf;
  860. if (s->fifo[n].state & STELLARIS_ADC_FIFO_FULL) {
  861. s->ostat |= 1 << n;
  862. return;
  863. }
  864. s->fifo[n].data[head] = value;
  865. head = (head + 1) & 0xf;
  866. s->fifo[n].state &= ~STELLARIS_ADC_FIFO_EMPTY;
  867. s->fifo[n].state = (s->fifo[n].state & ~0xf0) | (head << 4);
  868. if ((s->fifo[n].state & 0xf) == head)
  869. s->fifo[n].state |= STELLARIS_ADC_FIFO_FULL;
  870. }
  871. static void stellaris_adc_update(stellaris_adc_state *s)
  872. {
  873. int level;
  874. int n;
  875. for (n = 0; n < 4; n++) {
  876. level = (s->ris & s->im & (1 << n)) != 0;
  877. qemu_set_irq(s->irq[n], level);
  878. }
  879. }
  880. static void stellaris_adc_trigger(void *opaque, int irq, int level)
  881. {
  882. stellaris_adc_state *s = (stellaris_adc_state *)opaque;
  883. int n;
  884. for (n = 0; n < 4; n++) {
  885. if ((s->actss & (1 << n)) == 0) {
  886. continue;
  887. }
  888. if (((s->emux >> (n * 4)) & 0xff) != 5) {
  889. continue;
  890. }
  891. /* Some applications use the ADC as a random number source, so introduce
  892. some variation into the signal. */
  893. s->noise = s->noise * 314159 + 1;
  894. /* ??? actual inputs not implemented. Return an arbitrary value. */
  895. stellaris_adc_fifo_write(s, n, 0x200 + ((s->noise >> 16) & 7));
  896. s->ris |= (1 << n);
  897. stellaris_adc_update(s);
  898. }
  899. }
  900. static void stellaris_adc_reset(stellaris_adc_state *s)
  901. {
  902. int n;
  903. for (n = 0; n < 4; n++) {
  904. s->ssmux[n] = 0;
  905. s->ssctl[n] = 0;
  906. s->fifo[n].state = STELLARIS_ADC_FIFO_EMPTY;
  907. }
  908. }
  909. static uint64_t stellaris_adc_read(void *opaque, hwaddr offset,
  910. unsigned size)
  911. {
  912. stellaris_adc_state *s = (stellaris_adc_state *)opaque;
  913. /* TODO: Implement this. */
  914. if (offset >= 0x40 && offset < 0xc0) {
  915. int n;
  916. n = (offset - 0x40) >> 5;
  917. switch (offset & 0x1f) {
  918. case 0x00: /* SSMUX */
  919. return s->ssmux[n];
  920. case 0x04: /* SSCTL */
  921. return s->ssctl[n];
  922. case 0x08: /* SSFIFO */
  923. return stellaris_adc_fifo_read(s, n);
  924. case 0x0c: /* SSFSTAT */
  925. return s->fifo[n].state;
  926. default:
  927. break;
  928. }
  929. }
  930. switch (offset) {
  931. case 0x00: /* ACTSS */
  932. return s->actss;
  933. case 0x04: /* RIS */
  934. return s->ris;
  935. case 0x08: /* IM */
  936. return s->im;
  937. case 0x0c: /* ISC */
  938. return s->ris & s->im;
  939. case 0x10: /* OSTAT */
  940. return s->ostat;
  941. case 0x14: /* EMUX */
  942. return s->emux;
  943. case 0x18: /* USTAT */
  944. return s->ustat;
  945. case 0x20: /* SSPRI */
  946. return s->sspri;
  947. case 0x30: /* SAC */
  948. return s->sac;
  949. default:
  950. hw_error("strllaris_adc_read: Bad offset 0x%x\n",
  951. (int)offset);
  952. return 0;
  953. }
  954. }
  955. static void stellaris_adc_write(void *opaque, hwaddr offset,
  956. uint64_t value, unsigned size)
  957. {
  958. stellaris_adc_state *s = (stellaris_adc_state *)opaque;
  959. /* TODO: Implement this. */
  960. if (offset >= 0x40 && offset < 0xc0) {
  961. int n;
  962. n = (offset - 0x40) >> 5;
  963. switch (offset & 0x1f) {
  964. case 0x00: /* SSMUX */
  965. s->ssmux[n] = value & 0x33333333;
  966. return;
  967. case 0x04: /* SSCTL */
  968. if (value != 6) {
  969. hw_error("ADC: Unimplemented sequence %" PRIx64 "\n",
  970. value);
  971. }
  972. s->ssctl[n] = value;
  973. return;
  974. default:
  975. break;
  976. }
  977. }
  978. switch (offset) {
  979. case 0x00: /* ACTSS */
  980. s->actss = value & 0xf;
  981. break;
  982. case 0x08: /* IM */
  983. s->im = value;
  984. break;
  985. case 0x0c: /* ISC */
  986. s->ris &= ~value;
  987. break;
  988. case 0x10: /* OSTAT */
  989. s->ostat &= ~value;
  990. break;
  991. case 0x14: /* EMUX */
  992. s->emux = value;
  993. break;
  994. case 0x18: /* USTAT */
  995. s->ustat &= ~value;
  996. break;
  997. case 0x20: /* SSPRI */
  998. s->sspri = value;
  999. break;
  1000. case 0x28: /* PSSI */
  1001. hw_error("Not implemented: ADC sample initiate\n");
  1002. break;
  1003. case 0x30: /* SAC */
  1004. s->sac = value;
  1005. break;
  1006. default:
  1007. hw_error("stellaris_adc_write: Bad offset 0x%x\n", (int)offset);
  1008. }
  1009. stellaris_adc_update(s);
  1010. }
  1011. static const MemoryRegionOps stellaris_adc_ops = {
  1012. .read = stellaris_adc_read,
  1013. .write = stellaris_adc_write,
  1014. .endianness = DEVICE_NATIVE_ENDIAN,
  1015. };
  1016. static const VMStateDescription vmstate_stellaris_adc = {
  1017. .name = "stellaris_adc",
  1018. .version_id = 1,
  1019. .minimum_version_id = 1,
  1020. .minimum_version_id_old = 1,
  1021. .fields = (VMStateField[]) {
  1022. VMSTATE_UINT32(actss, stellaris_adc_state),
  1023. VMSTATE_UINT32(ris, stellaris_adc_state),
  1024. VMSTATE_UINT32(im, stellaris_adc_state),
  1025. VMSTATE_UINT32(emux, stellaris_adc_state),
  1026. VMSTATE_UINT32(ostat, stellaris_adc_state),
  1027. VMSTATE_UINT32(ustat, stellaris_adc_state),
  1028. VMSTATE_UINT32(sspri, stellaris_adc_state),
  1029. VMSTATE_UINT32(sac, stellaris_adc_state),
  1030. VMSTATE_UINT32(fifo[0].state, stellaris_adc_state),
  1031. VMSTATE_UINT32_ARRAY(fifo[0].data, stellaris_adc_state, 16),
  1032. VMSTATE_UINT32(ssmux[0], stellaris_adc_state),
  1033. VMSTATE_UINT32(ssctl[0], stellaris_adc_state),
  1034. VMSTATE_UINT32(fifo[1].state, stellaris_adc_state),
  1035. VMSTATE_UINT32_ARRAY(fifo[1].data, stellaris_adc_state, 16),
  1036. VMSTATE_UINT32(ssmux[1], stellaris_adc_state),
  1037. VMSTATE_UINT32(ssctl[1], stellaris_adc_state),
  1038. VMSTATE_UINT32(fifo[2].state, stellaris_adc_state),
  1039. VMSTATE_UINT32_ARRAY(fifo[2].data, stellaris_adc_state, 16),
  1040. VMSTATE_UINT32(ssmux[2], stellaris_adc_state),
  1041. VMSTATE_UINT32(ssctl[2], stellaris_adc_state),
  1042. VMSTATE_UINT32(fifo[3].state, stellaris_adc_state),
  1043. VMSTATE_UINT32_ARRAY(fifo[3].data, stellaris_adc_state, 16),
  1044. VMSTATE_UINT32(ssmux[3], stellaris_adc_state),
  1045. VMSTATE_UINT32(ssctl[3], stellaris_adc_state),
  1046. VMSTATE_UINT32(noise, stellaris_adc_state),
  1047. VMSTATE_END_OF_LIST()
  1048. }
  1049. };
  1050. static int stellaris_adc_init(SysBusDevice *dev)
  1051. {
  1052. stellaris_adc_state *s = FROM_SYSBUS(stellaris_adc_state, dev);
  1053. int n;
  1054. for (n = 0; n < 4; n++) {
  1055. sysbus_init_irq(dev, &s->irq[n]);
  1056. }
  1057. memory_region_init_io(&s->iomem, &stellaris_adc_ops, s,
  1058. "adc", 0x1000);
  1059. sysbus_init_mmio(dev, &s->iomem);
  1060. stellaris_adc_reset(s);
  1061. qdev_init_gpio_in(&dev->qdev, stellaris_adc_trigger, 1);
  1062. vmstate_register(&dev->qdev, -1, &vmstate_stellaris_adc, s);
  1063. return 0;
  1064. }
  1065. /* Board init. */
  1066. static stellaris_board_info stellaris_boards[] = {
  1067. { "LM3S811EVB",
  1068. 0,
  1069. 0x0032000e,
  1070. 0x001f001f, /* dc0 */
  1071. 0x001132bf,
  1072. 0x01071013,
  1073. 0x3f0f01ff,
  1074. 0x0000001f,
  1075. BP_OLED_I2C
  1076. },
  1077. { "LM3S6965EVB",
  1078. 0x10010002,
  1079. 0x1073402e,
  1080. 0x00ff007f, /* dc0 */
  1081. 0x001133ff,
  1082. 0x030f5317,
  1083. 0x0f0f87ff,
  1084. 0x5000007f,
  1085. BP_OLED_SSI | BP_GAMEPAD
  1086. }
  1087. };
  1088. static void stellaris_init(const char *kernel_filename, const char *cpu_model,
  1089. stellaris_board_info *board)
  1090. {
  1091. static const int uart_irq[] = {5, 6, 33, 34};
  1092. static const int timer_irq[] = {19, 21, 23, 35};
  1093. static const uint32_t gpio_addr[7] =
  1094. { 0x40004000, 0x40005000, 0x40006000, 0x40007000,
  1095. 0x40024000, 0x40025000, 0x40026000};
  1096. static const int gpio_irq[7] = {0, 1, 2, 3, 4, 30, 31};
  1097. MemoryRegion *address_space_mem = get_system_memory();
  1098. qemu_irq *pic;
  1099. DeviceState *gpio_dev[7];
  1100. qemu_irq gpio_in[7][8];
  1101. qemu_irq gpio_out[7][8];
  1102. qemu_irq adc;
  1103. int sram_size;
  1104. int flash_size;
  1105. i2c_bus *i2c;
  1106. DeviceState *dev;
  1107. int i;
  1108. int j;
  1109. flash_size = ((board->dc0 & 0xffff) + 1) << 1;
  1110. sram_size = (board->dc0 >> 18) + 1;
  1111. pic = armv7m_init(address_space_mem,
  1112. flash_size, sram_size, kernel_filename, cpu_model);
  1113. if (board->dc1 & (1 << 16)) {
  1114. dev = sysbus_create_varargs("stellaris-adc", 0x40038000,
  1115. pic[14], pic[15], pic[16], pic[17], NULL);
  1116. adc = qdev_get_gpio_in(dev, 0);
  1117. } else {
  1118. adc = NULL;
  1119. }
  1120. for (i = 0; i < 4; i++) {
  1121. if (board->dc2 & (0x10000 << i)) {
  1122. dev = sysbus_create_simple("stellaris-gptm",
  1123. 0x40030000 + i * 0x1000,
  1124. pic[timer_irq[i]]);
  1125. /* TODO: This is incorrect, but we get away with it because
  1126. the ADC output is only ever pulsed. */
  1127. qdev_connect_gpio_out(dev, 0, adc);
  1128. }
  1129. }
  1130. stellaris_sys_init(0x400fe000, pic[28], board, nd_table[0].macaddr.a);
  1131. for (i = 0; i < 7; i++) {
  1132. if (board->dc4 & (1 << i)) {
  1133. gpio_dev[i] = sysbus_create_simple("pl061_luminary", gpio_addr[i],
  1134. pic[gpio_irq[i]]);
  1135. for (j = 0; j < 8; j++) {
  1136. gpio_in[i][j] = qdev_get_gpio_in(gpio_dev[i], j);
  1137. gpio_out[i][j] = NULL;
  1138. }
  1139. }
  1140. }
  1141. if (board->dc2 & (1 << 12)) {
  1142. dev = sysbus_create_simple("stellaris-i2c", 0x40020000, pic[8]);
  1143. i2c = (i2c_bus *)qdev_get_child_bus(dev, "i2c");
  1144. if (board->peripherals & BP_OLED_I2C) {
  1145. i2c_create_slave(i2c, "ssd0303", 0x3d);
  1146. }
  1147. }
  1148. for (i = 0; i < 4; i++) {
  1149. if (board->dc2 & (1 << i)) {
  1150. sysbus_create_simple("pl011_luminary", 0x4000c000 + i * 0x1000,
  1151. pic[uart_irq[i]]);
  1152. }
  1153. }
  1154. if (board->dc2 & (1 << 4)) {
  1155. dev = sysbus_create_simple("pl022", 0x40008000, pic[7]);
  1156. if (board->peripherals & BP_OLED_SSI) {
  1157. void *bus;
  1158. DeviceState *sddev;
  1159. DeviceState *ssddev;
  1160. /* Some boards have both an OLED controller and SD card connected to
  1161. * the same SSI port, with the SD card chip select connected to a
  1162. * GPIO pin. Technically the OLED chip select is connected to the
  1163. * SSI Fss pin. We do not bother emulating that as both devices
  1164. * should never be selected simultaneously, and our OLED controller
  1165. * ignores stray 0xff commands that occur when deselecting the SD
  1166. * card.
  1167. */
  1168. bus = qdev_get_child_bus(dev, "ssi");
  1169. sddev = ssi_create_slave(bus, "ssi-sd");
  1170. ssddev = ssi_create_slave(bus, "ssd0323");
  1171. gpio_out[GPIO_D][0] = qemu_irq_split(qdev_get_gpio_in(sddev, 0),
  1172. qdev_get_gpio_in(ssddev, 0));
  1173. gpio_out[GPIO_C][7] = qdev_get_gpio_in(ssddev, 1);
  1174. /* Make sure the select pin is high. */
  1175. qemu_irq_raise(gpio_out[GPIO_D][0]);
  1176. }
  1177. }
  1178. if (board->dc4 & (1 << 28)) {
  1179. DeviceState *enet;
  1180. qemu_check_nic_model(&nd_table[0], "stellaris");
  1181. enet = qdev_create(NULL, "stellaris_enet");
  1182. qdev_set_nic_properties(enet, &nd_table[0]);
  1183. qdev_init_nofail(enet);
  1184. sysbus_mmio_map(SYS_BUS_DEVICE(enet), 0, 0x40048000);
  1185. sysbus_connect_irq(SYS_BUS_DEVICE(enet), 0, pic[42]);
  1186. }
  1187. if (board->peripherals & BP_GAMEPAD) {
  1188. qemu_irq gpad_irq[5];
  1189. static const int gpad_keycode[5] = { 0xc8, 0xd0, 0xcb, 0xcd, 0x1d };
  1190. gpad_irq[0] = qemu_irq_invert(gpio_in[GPIO_E][0]); /* up */
  1191. gpad_irq[1] = qemu_irq_invert(gpio_in[GPIO_E][1]); /* down */
  1192. gpad_irq[2] = qemu_irq_invert(gpio_in[GPIO_E][2]); /* left */
  1193. gpad_irq[3] = qemu_irq_invert(gpio_in[GPIO_E][3]); /* right */
  1194. gpad_irq[4] = qemu_irq_invert(gpio_in[GPIO_F][1]); /* select */
  1195. stellaris_gamepad_init(5, gpad_irq, gpad_keycode);
  1196. }
  1197. for (i = 0; i < 7; i++) {
  1198. if (board->dc4 & (1 << i)) {
  1199. for (j = 0; j < 8; j++) {
  1200. if (gpio_out[i][j]) {
  1201. qdev_connect_gpio_out(gpio_dev[i], j, gpio_out[i][j]);
  1202. }
  1203. }
  1204. }
  1205. }
  1206. }
  1207. /* FIXME: Figure out how to generate these from stellaris_boards. */
  1208. static void lm3s811evb_init(QEMUMachineInitArgs *args)
  1209. {
  1210. const char *cpu_model = args->cpu_model;
  1211. const char *kernel_filename = args->kernel_filename;
  1212. stellaris_init(kernel_filename, cpu_model, &stellaris_boards[0]);
  1213. }
  1214. static void lm3s6965evb_init(QEMUMachineInitArgs *args)
  1215. {
  1216. const char *cpu_model = args->cpu_model;
  1217. const char *kernel_filename = args->kernel_filename;
  1218. stellaris_init(kernel_filename, cpu_model, &stellaris_boards[1]);
  1219. }
  1220. static QEMUMachine lm3s811evb_machine = {
  1221. .name = "lm3s811evb",
  1222. .desc = "Stellaris LM3S811EVB",
  1223. .init = lm3s811evb_init,
  1224. DEFAULT_MACHINE_OPTIONS,
  1225. };
  1226. static QEMUMachine lm3s6965evb_machine = {
  1227. .name = "lm3s6965evb",
  1228. .desc = "Stellaris LM3S6965EVB",
  1229. .init = lm3s6965evb_init,
  1230. DEFAULT_MACHINE_OPTIONS,
  1231. };
  1232. static void stellaris_machine_init(void)
  1233. {
  1234. qemu_register_machine(&lm3s811evb_machine);
  1235. qemu_register_machine(&lm3s6965evb_machine);
  1236. }
  1237. machine_init(stellaris_machine_init);
  1238. static void stellaris_i2c_class_init(ObjectClass *klass, void *data)
  1239. {
  1240. SysBusDeviceClass *sdc = SYS_BUS_DEVICE_CLASS(klass);
  1241. sdc->init = stellaris_i2c_init;
  1242. }
  1243. static const TypeInfo stellaris_i2c_info = {
  1244. .name = "stellaris-i2c",
  1245. .parent = TYPE_SYS_BUS_DEVICE,
  1246. .instance_size = sizeof(stellaris_i2c_state),
  1247. .class_init = stellaris_i2c_class_init,
  1248. };
  1249. static void stellaris_gptm_class_init(ObjectClass *klass, void *data)
  1250. {
  1251. SysBusDeviceClass *sdc = SYS_BUS_DEVICE_CLASS(klass);
  1252. sdc->init = stellaris_gptm_init;
  1253. }
  1254. static const TypeInfo stellaris_gptm_info = {
  1255. .name = "stellaris-gptm",
  1256. .parent = TYPE_SYS_BUS_DEVICE,
  1257. .instance_size = sizeof(gptm_state),
  1258. .class_init = stellaris_gptm_class_init,
  1259. };
  1260. static void stellaris_adc_class_init(ObjectClass *klass, void *data)
  1261. {
  1262. SysBusDeviceClass *sdc = SYS_BUS_DEVICE_CLASS(klass);
  1263. sdc->init = stellaris_adc_init;
  1264. }
  1265. static const TypeInfo stellaris_adc_info = {
  1266. .name = "stellaris-adc",
  1267. .parent = TYPE_SYS_BUS_DEVICE,
  1268. .instance_size = sizeof(stellaris_adc_state),
  1269. .class_init = stellaris_adc_class_init,
  1270. };
  1271. static void stellaris_register_types(void)
  1272. {
  1273. type_register_static(&stellaris_i2c_info);
  1274. type_register_static(&stellaris_gptm_info);
  1275. type_register_static(&stellaris_adc_info);
  1276. }
  1277. type_init(stellaris_register_types)