stellaris.c 44 KB

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