2
0

stellaris.c 44 KB

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