RasPi Direct Hardware Access
Integrated peripheral access without operating system drivers.
 All Data Structures Files Functions Variables Typedefs Enumerations Macros Groups Pages
hw.h
Go to the documentation of this file.
1 
86 #ifndef RASPI_HW_H
87 #define RASPI_HW_H
88 
89 #include <stdint.h>
90 
112 typedef struct {
113  uint32_t IRQ;
114  uint32_t ENABLES;
117 #define AUX_OFFSET 0x215000
118 
133 typedef struct {
134  uint32_t IO;
135  uint32_t IER;
136  uint32_t IIR;
137  uint32_t LCR;
138  uint32_t MCR;
139  uint32_t LSR;
140  uint32_t MSR;
141  uint32_t SCRATCH;
142  uint32_t CNTL;
143  uint32_t STAT;
144  uint32_t BAUD;
147 #define UART1_OFFSET 0x215040
148 
164 typedef struct {
165  uint32_t CNTL0;
166  uint32_t CNTL1;
167  uint32_t STAT;
168  uint32_t maybe_PEEK;
169  uint32_t IO;
170  uint32_t PEEK; // contradiction in datasheet
171  uint32_t reserved_0x18[2];
172  uint32_t maybe_IO[4];
173  uint32_t maybe_TXHOLD[4];
176 #define SPI1_OFFSET 0x215080
177 
178 
196 #define SPI2_OFFSET 0x2150c0
197 
198 
209 typedef struct {
210  uint32_t C;
211  uint32_t S;
212  uint32_t DLEN;
213  uint32_t A;
214  uint32_t FIFO;
215  uint32_t DIV;
216  uint32_t DEL;
217  uint32_t CLKT;
220 #define BSC0_OFFSET 0x205000
221 
222 
235 #define BSC1_OFFSET 0x804000
236 
237 
245 #define BSC2_OFFSET 0x805000
246 
247 
254 typedef struct {
255  uint32_t TI;
256  uint32_t SOURCE_AD;
257  uint32_t DEST_AD;
258  uint32_t TXFR_LEN;
259  uint32_t STRIDE;
260  uint32_t NEXTCONBK;
261  uint32_t DEBUG; // actually a DMA engine register; ignored in the CB
262  uint32_t reserved_0x1c;
264 
265 
271 typedef struct {
272  uint32_t CS;
273  uint32_t CONBLK_AD;
275  uint32_t reserved_0x28[54];
278 #define DMA15_OFFSET 0xe05000
279 
280 
288 #define DMA_OFFSET 0x007000
289 
290 
296 typedef struct {
297  uint32_t INT_STATUS;
298  uint32_t reserved_0x04[3];
299  uint32_t ENABLE;
302 #define DMA_GLOBAL_OFFSET 0x007fe0
303 
304 
310 typedef struct {
311  union {
312  uint32_t U;
313  struct raspi_RNG_CTRL_reg {
314  // Generate random numbers. Enabled after reset.
315  uint32_t RBGEN:1;
316  // Double speed RNG. Reduces randomness.
317  uint32_t RBG2X:1;
318  uint32_t reserved:30;
319  } B;
320  } CTRL;
321  union {
322  uint32_t U;
323  struct raspi_RNG_STATUS_reg {
324  // Warm up count.
325  uint32_t WARM_CNT:20;
326  uint32_t reserved:4;
327  // Number of valid words in FIFO.
328  uint32_t VAL:8;
329  } B;
330  } STATUS;
331  uint32_t DATA;
332  union {
333  uint32_t U;
334  struct raspi_RNG_FF_THRES_reg {
335  // Assert interrupt at this many words in FIFO.
336  uint32_t FF_THRESH:8;
337  uint32_t reserved:24;
338  } B;
339  } FF_THRES;
340  union {
341  uint32_t U;
342  struct raspi_RNG_INT_MASK_reg {
343  // Mask FIFO interrupt.
344  uint32_t INT_OFF:1;
345  uint32_t reserved:31;
346  } B;
347  } INT_MASK;
350 #define RNG_OFFSET 0x104000
351 
352 
368 typedef struct {
369  uint32_t ARG2;
370  uint32_t BLKSIZECNT;
371  uint32_t ARG1;
372  uint32_t CMDTM;
373  uint32_t RESP[4];
374  uint32_t DATA;
375  uint32_t STATUS;
376  uint32_t CONTROL0;
377  uint32_t CONTROL1;
378  uint32_t INTERRUPT;
379  uint32_t IRPT_MASK;
380  uint32_t IRPT_EN;
381  uint32_t CONTROL2;
382  uint32_t reserved_0x40[4];
383  uint32_t FORCE_IRPT;
384  uint32_t reserved_0x54[7];
385  uint32_t BOOT_TIMEOUT;
386  uint32_t DBG_SEL;
387  uint32_t reserved_0x78[2];
388  uint32_t EXRDFIFO_CFG;
389  uint32_t EXRDFIFO_EN;
390  uint32_t TUNE_STEP;
391  uint32_t TUNE_STEP_STD;
392  uint32_t TUNE_STEP_DDR;
393  uint32_t reserved_0x94[19];
394  uint32_t SPI_INT_SPT;
395  uint32_t reserved_0xf4[2];
396  uint32_t SLOTISR_VER;
399 #define EMMC_OFFSET 0x300000
400 
401 
459 typedef struct {
460  uint32_t FSEL[6];
461  uint32_t reserved_0x18;
462  uint32_t SET[2];
463  uint32_t reserved_0x24;
464  uint32_t CLR[2];
465  uint32_t reserved_0x30;
466  uint32_t LEV[2];
467  uint32_t reserved_0x3c;
468  uint32_t EDS[2];
469  uint32_t reserved_0x48;
470  uint32_t REN[2];
471  uint32_t reserved_0x54;
472  uint32_t FEN[2];
473  uint32_t reserved_0x60;
474  uint32_t HEN[2];
475  uint32_t reserved_0x6c;
476  uint32_t LEN[2];
477  uint32_t reserved_0x78;
478  uint32_t AREN[2];
479  uint32_t reserved_0x84;
480  uint32_t AFEN[2];
481  uint32_t reserved_0x90;
482  uint32_t PUD;
483  uint32_t PUDCLK[2];
484  uint32_t reserved_0xa0[4];
485  uint32_t Test;
488 #define GPIO_OFFSET 0x200000
489 
490 
505 typedef struct {
506  struct {
507  uint32_t CTL;
508  uint32_t DIV;
509  } CM[3];
512 #define GPCLK_OFFSET 0x101070
513 
514 
520 typedef struct {
521  uint32_t pending_basic;
522  uint32_t pending[2];
523  uint32_t FIQ;
524  uint32_t enable[2];
525  uint32_t enable_basic;
526  uint32_t disable[2];
527  uint32_t disable_basic;
530 #define IRQ_OFFSET 0x00b200
531 
532 
545 typedef struct {
546  union {
547  uint32_t U;
548  struct raspi_PCM_CS_reg {
549  uint32_t EN:1;
550  uint32_t RXON:1;
551  uint32_t TXON:1;
552  uint32_t TXCLR:1;
553  uint32_t RXCLR:1;
554  uint32_t TXTHR:2;
555  uint32_t RXTHR:2;
556  uint32_t DMAEN:1;
557  uint32_t reserved0:3;
558  uint32_t TXSYNC:1;
559  uint32_t RXSYNC:1;
560  uint32_t TXERR:1;
561  uint32_t RXERR:1;
562  uint32_t TXW:1;
563  uint32_t RXR:1;
564  uint32_t TXD:1;
565  uint32_t RXD:1;
566  uint32_t TXE:1;
567  uint32_t RXF:1;
568  uint32_t RXSEX:1;
569  uint32_t SYNC:1;
570  uint32_t STBY:1;
571  uint32_t reserved1:6;
572  } B;
573  } CS;
574  uint32_t FIFO;
575  union {
576  uint32_t U;
577  struct raspi_PCM_MODE_reg {
578  uint32_t FSLEN:10;
579  uint32_t FLEN:10;
580  uint32_t FSI:1;
581  uint32_t FSM:1;
582  uint32_t CLKI:1;
583  uint32_t CLKM:1;
584  uint32_t FTXP:1;
585  uint32_t FRXP:1;
586  uint32_t PDME:1;
587  uint32_t PDMN:1;
588  uint32_t CLK_DIS:1;
589  uint32_t reserved:3;
590  } B;
591  } MODE;
592  union {
593  uint32_t U;
594  struct raspi_PCM_RXC_reg {
595  uint32_t CH2WID:4;
596  uint32_t CH2POS:10;
597  uint32_t CH2EN:1;
598  uint32_t CH2WEX:1;
599  uint32_t CH1WID:4;
600  uint32_t CH1POS:10;
601  uint32_t CH1EN:1;
602  uint32_t CH1WEX:1;
603  } B;
604  } RXC;
605  union {
606  uint32_t U;
607  struct raspi_PCM_TXC_reg {
608  uint32_t CH2WID:4;
609  uint32_t CH2POS:10;
610  uint32_t CH2EN:1;
611  uint32_t CH2WEX:1;
612  uint32_t CH1WID:4;
613  uint32_t CH1POS:10;
614  uint32_t CH1EN:1;
615  uint32_t CH1WEX:1;
616  } B;
617  } TXC;
618  union {
619  uint32_t U;
620  struct raspi_PCM_DREQ_reg {
621  uint32_t RX:7;
622  uint32_t reserved0:1;
623  uint32_t TX:7;
624  uint32_t reserved1:1;
625  uint32_t RX_PANIC:7;
626  uint32_t reserved2:1;
627  uint32_t TX_PANIC:7;
628  uint32_t reserved3:1;
629  } B;
630  } DREQ;
631  union {
632  uint32_t U;
633  struct raspi_PCM_INTEN_reg {
634  uint32_t TXW:1;
635  uint32_t RXR:1;
636  uint32_t TXERR:1;
637  uint32_t RXERR:1;
638  uint32_t reserved:28;
639  } B;
640  } INTEN;
641  union {
642  uint32_t U;
643  struct raspi_PCM_INTSTC_reg {
644  uint32_t TXW:1;
645  uint32_t RXR:1;
646  uint32_t TXERR:1;
647  uint32_t RXERR:1;
648  uint32_t reserved:28;
649  } B;
650  } INTSTC;
651  union {
652  uint32_t U;
653  struct raspi_PCM_GRAY_reg {
654  uint32_t EN:1;
655  uint32_t CLR:1;
656  uint32_t FLUSH:1;
657  uint32_t reserved0:1;
658  uint32_t RXLEVEL:6;
659  uint32_t FLUSHED:6;
660  uint32_t RXFIFOLEVEL:6;
661  uint32_t reserved1:10;
662  } B;
663  } GRAY;
666 #define PCM_OFFSET 0x203000
667 
668 
679 typedef struct {
680  uint32_t CTL;
681  uint32_t STA;
682  uint32_t DMAC;
683  uint32_t RNG1;
684  uint32_t DAT1;
685  uint32_t FIF1;
686  uint32_t RNG2;
687  uint32_t DAT2;
690 #define PWM_OFFSET 0x20c000
691 
692 
706 typedef struct {
707  union {
708  uint32_t U;
709  struct raspi_SPI0_CS_reg {
710  uint32_t CS:2;
711  uint32_t CPHA:1;
712  uint32_t CPOL:1;
713  uint32_t CLEAR:2;
714  uint32_t CSPOL:1;
715  uint32_t TA:1;
716  uint32_t DMAEN:1;
717  uint32_t INTD:1;
718  uint32_t INTR:1;
719  uint32_t ADCS:1;
720  uint32_t REN:1;
721  uint32_t LEN:1;
722  uint32_t LMONO:1;
723  uint32_t TE_EN:1;
724  uint32_t DONE:1;
725  uint32_t RXD:1;
726  uint32_t TXD:1;
727  uint32_t RXR:1;
728  uint32_t RXF:1;
729  uint32_t CSPOL0:1;
730  uint32_t CSPOL1:1;
731  uint32_t CSPOL2:1;
732  uint32_t DMA_LEN:1;
733  uint32_t LEN_LONG:1;
734  uint32_t reserved:6;
735  } B;
736  } CS;
737  uint32_t FIFO;
738  union {
739  uint32_t U;
740  struct raspi_SPI0_CLK_reg {
741  uint32_t CDIV:16;
742  uint32_t reserved:16;
743  } B;
744  } CLK;
745  union {
746  uint32_t U;
747  struct raspi_SPI0_DLEN_reg {
748  uint32_t LEN:16;
749  uint32_t reserved:16;
750  } B;
751  } DLEN;
752  union {
753  uint32_t U;
754  struct raspi_SPI0_LTOH_reg {
755  uint32_t TOH:16;
756  uint32_t reserved:16;
757  } B;
758  } LTOH;
759  union {
760  uint32_t U;
761  struct raspi_SPI0_DC_reg {
762  uint32_t TDREQ:8;
763  uint32_t TPANIC:8;
764  uint32_t RDREQ:8;
765  uint32_t RDPANIC:8;
766  } B;
767  } DC;
770 #define SPI0_OFFSET 0x204000
771 
772 
785 typedef struct {
786  uint32_t DR;
787  uint32_t RSR;
788  uint32_t SLV;
789  uint32_t CR;
790  uint32_t FR;
791  uint32_t IFLS;
792  uint32_t IMSC;
793  uint32_t RIS;
794  uint32_t MIS;
795  uint32_t ICR;
796  uint32_t DMACR;
797  uint32_t TDR;
798  uint32_t GPUSTAT;
799  uint32_t HCTRL;
800  uint32_t DEBUG1;
801  uint32_t DEBUG2;
804 #define BSCSL_OFFSET 0x214000
805 
806 
812 typedef struct {
813  union {
814  uint32_t U;
815  struct raspi_ST_CS_reg {
816  uint32_t M0:1;
817  uint32_t M1:1;
818  uint32_t M2:1;
819  uint32_t M3:1;
820  uint32_t reserved:28;
821  } B;
822  } CS;
823  uint32_t CLO;
824  uint32_t CHI;
825  uint32_t C[4];
826 } raspi_ST_regs;
828 #define ST_OFFSET 0x003000
829 
830 
843 typedef struct {
844  union {
845  uint32_t U;
846  struct raspi_UART0_DR_reg {
847  uint32_t DATA:8;
848  uint32_t FE:1;
849  uint32_t PE:1;
850  uint32_t BE:1;
851  uint32_t OE:1;
852  uint32_t reserved:20;
853  } B;
854  } DR;
855  union {
856  uint32_t U;
857  struct raspi_UART0_RSRECR_reg {
858  uint32_t FE:1;
859  uint32_t PE:1;
860  uint32_t BE:1;
861  uint32_t OE:1;
862  uint32_t reserved:28;
863  } B;
864  } RSRECR;
865  uint32_t reserved_0x08[4];
866  union {
867  uint32_t U;
868  struct raspi_UART0_FR_reg {
869  uint32_t CTS:1;
870  uint32_t DSR:1;
871  uint32_t DCD:1;
872  uint32_t BUSY:1;
873  uint32_t RXFE:1;
874  uint32_t TXFF:1;
875  uint32_t RXFF:1;
876  uint32_t TXFE:1;
877  uint32_t RI:1;
878  uint32_t reserved:23;
879  } B;
880  } FR;
881  uint32_t reserved_0x1c;
882  uint32_t ILPR; // disabled
883  union {
884  uint32_t U;
885  struct raspi_UART0_IBRD_reg {
886  uint32_t IBRD:16;
887  uint32_t reserved:16;
888  } B;
889  } IBRD;
890  union {
891  uint32_t U;
892  struct raspi_UART0_FBRD_reg {
893  uint32_t FBRD:6;
894  uint32_t reserved:26;
895  } B;
896  } FBRD;
897  union {
898  uint32_t U;
899  struct raspi_UART0_LCRH_reg {
900  uint32_t BRK:1;
901  uint32_t PEN:1;
902  uint32_t EPS:1;
903  uint32_t STP2:1;
904  uint32_t FEN:1;
905  uint32_t WLEN:2;
906  uint32_t SPS:1;
907  uint32_t reserved:24;
908  } B;
909  } LCRH;
910  union {
911  uint32_t U;
912  struct raspi_UART0_CR_reg {
913  uint32_t UARTEN:1;
914  uint32_t SIREN:1;
915  uint32_t SIRLP:1;
916  uint32_t reserved0:4;
917  uint32_t LBE:1;
918  uint32_t TXE:1;
919  uint32_t RXE:1;
920  uint32_t DTR:1;
921  uint32_t RTS:1;
922  uint32_t OUT1:1;
923  uint32_t OUT2:1;
924  uint32_t RTSEN:1;
925  uint32_t CTSEN:1;
926  uint32_t reserved1:16;
927  } B;
928  } CR;
929  union {
930  uint32_t U;
931  struct raspi_UART0_IFLS_reg {
932  uint32_t TXIFLSEL:3;
933  uint32_t RXIFLSEL:3;
934  uint32_t TXIFPSEL:3;
935  uint32_t RXIFPSEL:3;
936  uint32_t reserved:20;
937  } B;
938  } IFLS;
939  union {
940  uint32_t U;
941  struct raspi_UART0_IMSC_reg {
942  uint32_t RIMM:1;
943  uint32_t CTSMIM:1;
944  uint32_t DCDMIM:1;
945  uint32_t DSRMIM:1;
946  uint32_t RXIM:1;
947  uint32_t TXIM:1;
948  uint32_t RTIM:1;
949  uint32_t FEIM:1;
950  uint32_t PEIM:1;
951  uint32_t BEIM:1;
952  uint32_t OEIM:1;
953  uint32_t reserved:21;
954  } B;
955  } IMSC;
956  union {
957  uint32_t U;
958  struct raspi_UART0_RIS_reg {
959  uint32_t RIRMIS:1;
960  uint32_t CTSRMIS:1;
961  uint32_t DCDRMIS:1;
962  uint32_t DSRRMIS:1;
963  uint32_t RXRIS:1;
964  uint32_t TXRIS:1;
965  uint32_t RTRIS:1;
966  uint32_t FERIS:1;
967  uint32_t PERIS:1;
968  uint32_t BERIS:1;
969  uint32_t OERIS:1;
970  uint32_t reserved:21;
971  } B;
972  } RIS;
973  union {
974  uint32_t U;
975  struct raspi_UART0_MIS_reg {
976  uint32_t RIMMIS:1;
977  uint32_t CTSMMIS:1;
978  uint32_t DCDMMIS:1;
979  uint32_t DSRMMIS:1;
980  uint32_t RXMIS:1;
981  uint32_t TXMIS:1;
982  uint32_t RTMIS:1;
983  uint32_t FEMIS:1;
984  uint32_t PEMIS:1;
985  uint32_t BEMIS:1;
986  uint32_t OEMIS:1;
987  uint32_t reserved:21;
988  } B;
989  } MIS;
990  union {
991  uint32_t U;
992  struct raspi_UART0_ICR_reg {
993  uint32_t RIMIC:1;
994  uint32_t CTSMIC:1;
995  uint32_t DCDMIC:1;
996  uint32_t DSRMIC:1;
997  uint32_t RXIC:1;
998  uint32_t TXIC:1;
999  uint32_t RTIC:1;
1000  uint32_t FEIC:1;
1001  uint32_t PEIC:1;
1002  uint32_t BEIC:1;
1003  uint32_t OEIC:1;
1004  uint32_t reserved:21;
1005  } B;
1006  } ICR;
1007  uint32_t DMACR; // disabled
1008  uint32_t reserved_0x4c[14];
1009  union {
1010  uint32_t U;
1011  struct raspi_UART0_ITCR_reg {
1012  uint32_t ITCR0:1;
1013  uint32_t ITCR1:1;
1014  uint32_t reserved:30;
1015  } B;
1016  } ITCR;
1017  union {
1018  uint32_t U;
1019  struct raspi_UART0_ITIP_reg {
1020  uint32_t ITIP0:1;
1021  uint32_t reserved0:2;
1022  uint32_t ITIP3:1;
1023  uint32_t reserved1:28;
1024  } B;
1025  } ITIP;
1026  union {
1027  uint32_t U;
1028  struct raspi_UART0_ITOP_reg {
1029  uint32_t ITOP0:1;
1030  uint32_t reserved0:2;
1031  uint32_t ITOP3:1;
1032  uint32_t reserved1:2;
1033  uint32_t ITOP6:1;
1034  uint32_t ITOP7:1;
1035  uint32_t ITOP8:1;
1036  uint32_t ITOP9:1;
1037  uint32_t ITOP10:1;
1038  uint32_t ITOP11:1;
1039  uint32_t reserved2:20;
1040  } B;
1041  } ITOP;
1042  union {
1043  uint32_t U;
1044  struct raspi_UART0_TDR_reg {
1045  uint32_t TDR10_0:11;
1046  uint32_t reserved0:21;
1047  } B;
1048  } TDR;
1051 #define UART0_OFFSET 0x201000
1052 
1053 
1059 typedef struct {
1060  uint32_t Load;
1061  uint32_t Value;
1062  uint32_t Control;
1063  uint32_t IRQClearAck;
1064  uint32_t RawIRQ;
1065  uint32_t MaskedIRQ;
1066  uint32_t Reload;
1067  uint32_t Predivider;
1068  uint32_t Freerunning;
1071 #define TIMER_OFFSET 0x00b400
1072 
1073 
1079 typedef struct {
1080  uint32_t unknown[32];
1081  uint32_t MDIO_CNTL;
1082  uint32_t MDIO_GEN;
1083  uint32_t VBUS_DRV;
1084 } raspi_USB_regs;
1086 #define USB_OFFSET 0x980000
1087 
1088 
1094 typedef struct {
1095  uint32_t Command;
1096  uint32_t Argument;
1097  uint32_t Timeout;
1098  uint32_t ClkDiv;
1099  uint32_t Response[4];
1100  uint32_t Status;
1101  uint32_t Unknown_0x24[3];
1102  uint32_t VDD;
1103  uint32_t EDM;
1104  uint32_t HostConfig;
1105  uint32_t HBCT;
1106  uint32_t Data;
1107  uint32_t Unknown_0x44[3];
1108  uint32_t HBLC;
1109 } raspi_MMC_regs;
1111 #define MMC_OFFSET 0x202000
1112 
1113 
1119 typedef struct {
1120  union {
1121  uint32_t U;
1122  struct raspi_CM_CTL_reg {
1123  uint32_t SRC:4;
1124  uint32_t ENAB:1;
1125  uint32_t KILL:1;
1126  uint32_t reserved0:1;
1127  uint32_t BUSY:1;
1128  uint32_t FLIP:1;
1129  uint32_t MASH:2;
1130  uint32_t reserved1:13;
1131  uint32_t PASSWD:8;
1132  } B;
1133  } CTL;
1134  union {
1135  uint32_t U;
1136  struct raspi_CM_DIV_reg {
1137  uint32_t DIVF:12;
1138  uint32_t DIVI:12;
1139  uint32_t PASSWD:8;
1140  } B;
1141  } DIV;
1142 } raspi_CM_reg;
1144 typedef enum {
1145  CM_GND = 0,
1146  CM_OSC = 1,
1147  CM_PLLA = 4,
1148  CM_PLLC = 5,
1149  CM_PLLD = 6,
1150  CM_HDMI = 7
1153 typedef enum {
1154  CM_VPU = 1,
1155  CM_H264 = 5,
1156  CM_UNK_0x30 = 6,
1157  CM_V3D = 7,
1158  CM_CAM0_LP = 8,
1159  CM_DSI_ESC = 11,
1160  CM_DPI = 13,
1161  CM_GP0 = 14,
1162  CM_GP1 = 15,
1163  CM_GP2 = 16,
1164  CM_HSM = 17,
1165  CM_ISP = 18,
1166  CM_PCM = 19,
1167  CM_PWM = 20,
1168  CM_SLIM = 21,
1169  CM_SMI = 22,
1170  CM_EMMC = 24,
1171  CM_TSENS = 28,
1172  CM_TIME = 29,
1173  CM_UART = 30,
1174  CM_VEC = 31,
1175  CM_UNK_0x190 = 50,
1176  CM_ARM = 54,
1177  CM_UNK_0x1C0 = 56
1178 } raspi_CM_reg_t;
1180 #define CM_PASSWD (0x5a)
1181 
1184 #define CM_OFFSET 0x101000
1185 
1186 
1192 typedef struct {
1193  uint32_t unknown_0x00[0x1c];
1194  union {
1195  uint32_t U;
1196  struct raspi_PM_RSTC_reg {
1197  uint32_t reserved0:1;
1198  uint32_t RESET1:1;
1199  uint32_t reserved1:2;
1200  uint32_t WRCFG:2;
1201  uint32_t reserved2:2;
1202  uint32_t RESET2:1;
1203  uint32_t reserved3:15;
1204  uint32_t PASSWD:8;
1205  } B;
1206  } RSTC;
1207  union {
1208  uint32_t U;
1209  struct raspi_PM_RSTS_reg {
1210  uint32_t HADDRQ:1;
1211  uint32_t HADDRF:1;
1212  uint32_t HADDRH:1;
1213  uint32_t reserved0:1;
1214  uint32_t HADWRQ:1;
1215  uint32_t HADWRF:1;
1216  uint32_t HADWRH:1;
1217  uint32_t reserved1:1;
1218  uint32_t HADDSRQ:1;
1219  uint32_t HADDSRF:1;
1220  uint32_t HADDSRH:1;
1221  uint32_t reserved2:1;
1222  uint32_t HADPOR:1;
1223  uint32_t reserved3:19;
1224  } B;
1225  } RSTS;
1226  union {
1227  uint32_t U;
1228  struct raspi_PM_WDOG_reg {
1229  uint32_t TIME_SET:20;
1230  uint32_t reserved:4;
1231  uint32_t PASSWD:8;
1232  } B;
1233  } WDOG;
1234 } raspi_PM_regs;
1236 typedef enum {
1237  PM_CLR = 0,
1238  PM_SET = 1,
1239  PM_FULL_RESET = 2
1242 #define PM_PASSWD (0x5a)
1243 
1244 #define PM_OFFSET 0x100000
1245 
1246 
1248 
1249 #define reg(src) raspi_##src##_regs src;
1250 #define pad(src,dest) uint8_t reserved_##src##_##dest[((dest##_OFFSET)-(src##_OFFSET)-sizeof(raspi_##src##_regs))]
1251 #define HW_END_OFFSET 0xf00000
1252 
1260 typedef volatile struct {
1262  uint8_t reserved_BEGIN[ST_OFFSET];
1264  // 0x000000 Multicore Sync
1265  // 0x001000 Compact Camera Port 2 TX
1266  // 0x002000 Videocore Interrupt Controller
1267  reg(ST); // 0x003000
1268  pad(ST, DMA); // 0x004000 " txp"
1269  // 0x005000 "jpeg"
1270  // 0x006000 Message-based Parallel Host Interface
1271  reg(DMA); // 0x007000
1272  pad(DMA, DMA_GLOBAL);
1273  reg(DMA_GLOBAL);
1274  pad(DMA_GLOBAL, IRQ); // 0x009000 "ARBA"
1275  // 0x00a000 "brdg"
1276  reg(IRQ); // 0x00b200
1277  pad(IRQ, TIMER);
1278  reg(TIMER); // 0x00b400
1279  pad(TIMER, PM);
1280  reg(PM); // 0x100000
1281  pad(PM, CM);
1282  reg(CM); // 0x101000 (includes GPCLK at 0x101070)
1283  pad(CM, RNG); // 0x102000 "a2w"
1284  // 0x103000 Audio Video Standard
1285  reg(RNG); // 0x104000
1286  pad(RNG, GPIO);
1287  reg(GPIO); // 0x200000
1288  pad(GPIO, UART0);
1289  reg(UART0); // 0x201000
1290  pad(UART0, MMC);
1291  reg(MMC); // 0x202000
1292  pad(MMC, PCM);
1293  reg(PCM); // 0x203000
1294  pad(PCM, SPI0);
1295  reg(SPI0); // 0x204000
1296  pad(SPI0, BSC0);
1297  reg(BSC0); // 0x205000
1298  pad(BSC0, PWM); // 0x206000 "pixv"
1299  // 0x207000 "pixv"
1300  // 0x208000 "dpi"
1301  // 0x209000 Display Serial Interface
1302  reg(PWM); // 0x20c000
1303  pad(PWM, BSCSL); // 0x20d000 "perm"
1304  // 0x20e000 "tec"
1305  // 0x20f000 "otp0"
1306  // 0x210000 SLIMbus
1307  // 0x211000 "cpg"
1308  // 0x212000 ?
1309  // 0x213000 "AVSP"
1310  reg(BSCSL); // 0x214000
1311  pad(BSCSL, AUX);
1312  reg(AUX); // 0x215000
1313  pad(AUX, UART1);
1314  reg(UART1); // 0x215040
1315  pad(UART1, SPI1);
1316  reg(SPI1); // 0x215080
1317  pad(SPI1, SPI2);
1318  reg(SPI2); // 0x2150c0
1319  pad(SPI2, EMMC);
1320  reg(EMMC); // 0x300000
1321  pad(EMMC, BSC1); // 0x400000 ddrv
1322  // 0x600000 SMI
1323  // 0x800000 "ucam"
1324  // 0x802000 "cmi"
1325  reg(BSC1); // 0x804000
1326  pad(BSC1, BSC2);
1327  reg(BSC2); // 0x805000
1328  pad(BSC2, USB); // 0x806000 "veca"
1329  // 0x807000 "pixv"
1330  // 0x808000 "hdmi"
1331  // 0x809000 "hdcp"
1332  // 0x80a000 "arbr"
1333  // 0x900000 "dbus"
1334  // 0x910000 "ave0"
1335  reg(USB); // 0x980000
1336  pad(USB, DMA15); // 0xe00000 SDRAM Controller
1337  // 0xe01000 L2 Cache Controller
1338  // 0xe02000 L1 Cache Controller
1339  // 0xe04000 "arbr"
1340  reg(DMA15); // 0xe05000
1341  pad(DMA15, HW_END); // 0xe06000 dram?
1342  // 0xe07000 "dcrc"
1343  // 0xe08000 "AXIP"
1345 
1346 
1348 extern raspi_peripherals *pHW;
1349 
1361 #define HW (*pHW)
1362 
1363 
1366 extern int raspi_map_hw(void);
1367 
1369 #define CORE_CLOCK 250000000
1370 // TODO: Dynamically read from clock manager registers where required.
1371 
1372 #ifdef __arm__
1373 
1378 #define memory_barrier() asm volatile ("mcr p15, #0, %[zero], c7, c10, #5" :: [zero] "r" (0))
1379 
1381 #define synchronization_barrier() asm volatile ("mcr p15, #0, %[zero], c7, c10, #4" :: [zero] "r" (0))
1382 
1383 #else
1384 #define memory_barrier()
1385 #define synchronization_barrier()
1386 #endif
1387 
1388 
1391 #define ARM(x) ((x)+0x20000000ul)
1392 
1395 #define BUS(x) ((x)+0x7e000000ul)
1396 
1397 
1407 
1408 
1409 typedef enum {
1410  Input = 0,
1411  Output = 1,
1412  Alt0 = 4,
1413  Alt1 = 5,
1414  Alt2 = 6,
1415  Alt3 = 7,
1416  Alt4 = 3,
1417  Alt5 = 2
1419 
1420 
1422 static inline void gpio_configure(int gpio, raspi_GPIO_function function)
1423 {
1424  uint32_t tmp = HW.GPIO.FSEL[gpio/10] & ~(7 << ((gpio%10)*3));
1425  HW.GPIO.FSEL[gpio/10] = tmp | (function&7) << ((gpio%10)*3);
1426 }
1427 
1428 
1430 static inline void gpio_set(int gpio)
1431 {
1432  HW.GPIO.SET[gpio/32] = 1<<(gpio%32);
1433 }
1434 
1435 
1437 static inline void gpio_clear(int gpio)
1438 {
1439  HW.GPIO.CLR[gpio/32] = 1<<(gpio%32);
1440 }
1441 
1442 
1444 static inline uint32_t gpio_read(int gpio)
1445 {
1446  return HW.GPIO.LEV[gpio/32] & (1<<(gpio%32));
1447 }
1448 
1459 
1460 typedef uint32_t st_time_t;
1461 
1462 
1464 typedef uint32_t st_delta_t;
1465 
1466 
1469 #define ST_NOW ((st_time_t)HW.ST.CLO)
1470 
1471 
1473 #define ST_1s ((st_delta_t)1000000)
1474 
1475 
1477 #define ST_1ms (ST_1s/1000)
1478 
1479 
1481 #define ST_1us (ST_1s/1000000)
1482 
1483 
1485 static inline int st_elapsed(st_time_t before, st_time_t after, st_delta_t diff)
1486 {
1487  // this is safe across unsigned integer overflows
1488  return ((after) - (before) >= (diff));
1489 }
1490 
1491 
1493 static inline void st_delay(st_delta_t delay)
1494 {
1495  st_time_t start = ST_NOW;
1496  while (!st_elapsed(start, ST_NOW, delay));
1497 }
1498 
1503 #endif