1 // bcm2835.h
325 #define HIGH 0x1
327 #define LOW 0x0
330 #define BCM2835_CORE_CLK_HZ 250000000
334 #define BCM2835_PERI_BASE 0x20000000
336 #define BCM2835_ST_BASE (BCM2835_PERI_BASE + 0x3000)
338 #define BCM2835_GPIO_PADS (BCM2835_PERI_BASE + 0x100000)
340 #define BCM2835_CLOCK_BASE (BCM2835_PERI_BASE + 0x101000)
342 #define BCM2835_GPIO_BASE (BCM2835_PERI_BASE + 0x200000)
344 #define BCM2835_SPI0_BASE (BCM2835_PERI_BASE + 0x204000)
346 #define BCM2835_BSC0_BASE (BCM2835_PERI_BASE + 0x205000)
348 #define BCM2835_GPIO_PWM (BCM2835_PERI_BASE + 0x20C000)
350 #define BCM2835_BSC1_BASE (BCM2835_PERI_BASE + 0x804000)
355 extern volatile uint32_t *bcm2835_st;
359 extern volatile uint32_t *bcm2835_gpio;
363 extern volatile uint32_t *bcm2835_pwm;
367 extern volatile uint32_t *bcm2835_clk;
371 extern volatile uint32_t *bcm2835_pads;
375 extern volatile uint32_t *bcm2835_spi0;
379 extern volatile uint32_t *bcm2835_bsc0;
383 extern volatile uint32_t *bcm2835_bsc1;
386 #define BCM2835_PAGE_SIZE (4*1024)
388 #define BCM2835_BLOCK_SIZE (4*1024)
395 #define BCM2835_GPFSEL0 0x0000
396 #define BCM2835_GPFSEL1 0x0004
397 #define BCM2835_GPFSEL2 0x0008
398 #define BCM2835_GPFSEL3 0x000c
399 #define BCM2835_GPFSEL4 0x0010
400 #define BCM2835_GPFSEL5 0x0014
401 #define BCM2835_GPSET0 0x001c
402 #define BCM2835_GPSET1 0x0020
403 #define BCM2835_GPCLR0 0x0028
404 #define BCM2835_GPCLR1 0x002c
405 #define BCM2835_GPLEV0 0x0034
406 #define BCM2835_GPLEV1 0x0038
407 #define BCM2835_GPEDS0 0x0040
408 #define BCM2835_GPEDS1 0x0044
409 #define BCM2835_GPREN0 0x004c
410 #define BCM2835_GPREN1 0x0050
411 #define BCM2835_GPFEN0 0x0058
412 #define BCM2835_GPFEN1 0x005c
413 #define BCM2835_GPHEN0 0x0064
414 #define BCM2835_GPHEN1 0x0068
415 #define BCM2835_GPLEN0 0x0070
416 #define BCM2835_GPLEN1 0x0074
417 #define BCM2835_GPAREN0 0x007c
418 #define BCM2835_GPAREN1 0x0080
419 #define BCM2835_GPAFEN0 0x0088
420 #define BCM2835_GPAFEN1 0x008c
421 #define BCM2835_GPPUD 0x0094
422 #define BCM2835_GPPUDCLK0 0x0098
423 #define BCM2835_GPPUDCLK1 0x009c
427 typedef enum
429 BCM2835_GPIO_FSEL_INPT = 0b000,
430 BCM2835_GPIO_FSEL_OUTP = 0b001,
431 BCM2835_GPIO_FSEL_ALT0 = 0b100,
432 BCM2835_GPIO_FSEL_ALT1 = 0b101,
433 BCM2835_GPIO_FSEL_ALT2 = 0b110,
434 BCM2835_GPIO_FSEL_ALT3 = 0b111,
435 BCM2835_GPIO_FSEL_ALT4 = 0b011,
436 BCM2835_GPIO_FSEL_ALT5 = 0b010,
437 BCM2835_GPIO_FSEL_MASK = 0b111
438 } bcm2835FunctionSelect;
442 typedef enum
444 BCM2835_GPIO_PUD_OFF = 0b00,
445 BCM2835_GPIO_PUD_DOWN = 0b01,
446 BCM2835_GPIO_PUD_UP = 0b10
447 } bcm2835PUDControl;
450 #define BCM2835_PADS_GPIO_0_27 0x002c
451 #define BCM2835_PADS_GPIO_28_45 0x0030
452 #define BCM2835_PADS_GPIO_46_53 0x0034
455 #define BCM2835_PAD_PASSWRD (0x5A << 24)
456 #define BCM2835_PAD_SLEW_RATE_UNLIMITED 0x10
457 #define BCM2835_PAD_HYSTERESIS_ENABLED 0x08
458 #define BCM2835_PAD_DRIVE_2mA 0x00
459 #define BCM2835_PAD_DRIVE_4mA 0x01
460 #define BCM2835_PAD_DRIVE_6mA 0x02
461 #define BCM2835_PAD_DRIVE_8mA 0x03
462 #define BCM2835_PAD_DRIVE_10mA 0x04
463 #define BCM2835_PAD_DRIVE_12mA 0x05
464 #define BCM2835_PAD_DRIVE_14mA 0x06
465 #define BCM2835_PAD_DRIVE_16mA 0x07
469 typedef enum
474 } bcm2835PadGroup;
486 typedef enum
488 RPI_GPIO_P1_03 = 0,
489 RPI_GPIO_P1_05 = 1,
490 RPI_GPIO_P1_07 = 4,
491 RPI_GPIO_P1_08 = 14,
492 RPI_GPIO_P1_10 = 15,
493 RPI_GPIO_P1_11 = 17,
494 RPI_GPIO_P1_12 = 18,
495 RPI_GPIO_P1_13 = 21,
496 RPI_GPIO_P1_15 = 22,
497 RPI_GPIO_P1_16 = 23,
498 RPI_GPIO_P1_18 = 24,
499 RPI_GPIO_P1_19 = 10,
500 RPI_GPIO_P1_21 = 9,
501 RPI_GPIO_P1_22 = 25,
502 RPI_GPIO_P1_23 = 11,
503 RPI_GPIO_P1_24 = 8,
504 RPI_GPIO_P1_26 = 7,
507 RPI_V2_GPIO_P1_03 = 2,
508 RPI_V2_GPIO_P1_05 = 3,
509 RPI_V2_GPIO_P1_07 = 4,
510 RPI_V2_GPIO_P1_08 = 14,
511 RPI_V2_GPIO_P1_10 = 15,
512 RPI_V2_GPIO_P1_11 = 17,
513 RPI_V2_GPIO_P1_12 = 18,
514 RPI_V2_GPIO_P1_13 = 27,
515 RPI_V2_GPIO_P1_15 = 22,
516 RPI_V2_GPIO_P1_16 = 23,
517 RPI_V2_GPIO_P1_18 = 24,
518 RPI_V2_GPIO_P1_19 = 10,
519 RPI_V2_GPIO_P1_21 = 9,
520 RPI_V2_GPIO_P1_22 = 25,
521 RPI_V2_GPIO_P1_23 = 11,
522 RPI_V2_GPIO_P1_24 = 8,
523 RPI_V2_GPIO_P1_26 = 7,
526 RPI_V2_GPIO_P5_03 = 28,
527 RPI_V2_GPIO_P5_04 = 29,
528 RPI_V2_GPIO_P5_05 = 30,
529 RPI_V2_GPIO_P5_06 = 31,
531 } RPiGPIOPin;
536 #define BCM2835_SPI0_CS 0x0000
537 #define BCM2835_SPI0_FIFO 0x0004
538 #define BCM2835_SPI0_CLK 0x0008
539 #define BCM2835_SPI0_DLEN 0x000c
540 #define BCM2835_SPI0_LTOH 0x0010
541 #define BCM2835_SPI0_DC 0x0014
544 #define BCM2835_SPI0_CS_LEN_LONG 0x02000000
545 #define BCM2835_SPI0_CS_DMA_LEN 0x01000000
546 #define BCM2835_SPI0_CS_CSPOL2 0x00800000
547 #define BCM2835_SPI0_CS_CSPOL1 0x00400000
548 #define BCM2835_SPI0_CS_CSPOL0 0x00200000
549 #define BCM2835_SPI0_CS_RXF 0x00100000
550 #define BCM2835_SPI0_CS_RXR 0x00080000
551 #define BCM2835_SPI0_CS_TXD 0x00040000
552 #define BCM2835_SPI0_CS_RXD 0x00020000
553 #define BCM2835_SPI0_CS_DONE 0x00010000
554 #define BCM2835_SPI0_CS_TE_EN 0x00008000
555 #define BCM2835_SPI0_CS_LMONO 0x00004000
556 #define BCM2835_SPI0_CS_LEN 0x00002000
557 #define BCM2835_SPI0_CS_REN 0x00001000
558 #define BCM2835_SPI0_CS_ADCS 0x00000800
559 #define BCM2835_SPI0_CS_INTR 0x00000400
560 #define BCM2835_SPI0_CS_INTD 0x00000200
561 #define BCM2835_SPI0_CS_DMAEN 0x00000100
562 #define BCM2835_SPI0_CS_TA 0x00000080
563 #define BCM2835_SPI0_CS_CSPOL 0x00000040
564 #define BCM2835_SPI0_CS_CLEAR 0x00000030
565 #define BCM2835_SPI0_CS_CLEAR_RX 0x00000020
566 #define BCM2835_SPI0_CS_CLEAR_TX 0x00000010
567 #define BCM2835_SPI0_CS_CPOL 0x00000008
568 #define BCM2835_SPI0_CS_CPHA 0x00000004
569 #define BCM2835_SPI0_CS_CS 0x00000003
573 typedef enum
577 }bcm2835SPIBitOrder;
581 typedef enum
583 BCM2835_SPI_MODE0 = 0,
584 BCM2835_SPI_MODE1 = 1,
585 BCM2835_SPI_MODE2 = 2,
586 BCM2835_SPI_MODE3 = 3,
587 }bcm2835SPIMode;
591 typedef enum
593 BCM2835_SPI_CS0 = 0,
594 BCM2835_SPI_CS1 = 1,
595 BCM2835_SPI_CS2 = 2,
596 BCM2835_SPI_CS_NONE = 3,
597 } bcm2835SPIChipSelect;
605 typedef enum
608 BCM2835_SPI_CLOCK_DIVIDER_32768 = 32768,
609 BCM2835_SPI_CLOCK_DIVIDER_16384 = 16384,
610 BCM2835_SPI_CLOCK_DIVIDER_8192 = 8192,
611 BCM2835_SPI_CLOCK_DIVIDER_4096 = 4096,
612 BCM2835_SPI_CLOCK_DIVIDER_2048 = 2048,
613 BCM2835_SPI_CLOCK_DIVIDER_1024 = 1024,
614 BCM2835_SPI_CLOCK_DIVIDER_512 = 512,
615 BCM2835_SPI_CLOCK_DIVIDER_256 = 256,
616 BCM2835_SPI_CLOCK_DIVIDER_128 = 128,
624 } bcm2835SPIClockDivider;
629 #define BCM2835_BSC_C 0x0000
630 #define BCM2835_BSC_S 0x0004
631 #define BCM2835_BSC_DLEN 0x0008
632 #define BCM2835_BSC_A 0x000c
633 #define BCM2835_BSC_FIFO 0x0010
634 #define BCM2835_BSC_DIV 0x0014
635 #define BCM2835_BSC_DEL 0x0018
636 #define BCM2835_BSC_CLKT 0x001c
639 #define BCM2835_BSC_C_I2CEN 0x00008000
640 #define BCM2835_BSC_C_INTR 0x00000400
641 #define BCM2835_BSC_C_INTT 0x00000200
642 #define BCM2835_BSC_C_INTD 0x00000100
643 #define BCM2835_BSC_C_ST 0x00000080
644 #define BCM2835_BSC_C_CLEAR_1 0x00000020
645 #define BCM2835_BSC_C_CLEAR_2 0x00000010
646 #define BCM2835_BSC_C_READ 0x00000001
649 #define BCM2835_BSC_S_CLKT 0x00000200
650 #define BCM2835_BSC_S_ERR 0x00000100
651 #define BCM2835_BSC_S_RXF 0x00000080
652 #define BCM2835_BSC_S_TXE 0x00000040
653 #define BCM2835_BSC_S_RXD 0x00000020
654 #define BCM2835_BSC_S_TXD 0x00000010
655 #define BCM2835_BSC_S_RXR 0x00000008
656 #define BCM2835_BSC_S_TXW 0x00000004
657 #define BCM2835_BSC_S_DONE 0x00000002
658 #define BCM2835_BSC_S_TA 0x00000001
660 #define BCM2835_BSC_FIFO_SIZE 16
665 typedef enum
667 BCM2835_I2C_CLOCK_DIVIDER_2500 = 2500,
668 BCM2835_I2C_CLOCK_DIVIDER_626 = 626,
669 BCM2835_I2C_CLOCK_DIVIDER_150 = 150,
670 BCM2835_I2C_CLOCK_DIVIDER_148 = 148,
671 } bcm2835I2CClockDivider;
675 typedef enum
677 BCM2835_I2C_REASON_OK = 0x00,
678 BCM2835_I2C_REASON_ERROR_NACK = 0x01,
679 BCM2835_I2C_REASON_ERROR_CLKT = 0x02,
680 BCM2835_I2C_REASON_ERROR_DATA = 0x04,
681 } bcm2835I2CReasonCodes;
686 // The System Timer peripheral provides four 32-bit timer channels and a single 64-bit free running counter.
688 // The system timer free-running counter lower register is a read-only register that returns the current value
691 // The system timer free-running counter upper register is a read-only register that returns the current value
693 #define BCM2835_ST_CS 0x0000
694 #define BCM2835_ST_CLO 0x0004
695 #define BCM2835_ST_CHI 0x0008
779 extern int bcm2835_init(void);
783 extern int bcm2835_close(void);
791 extern void bcm2835_set_debug(uint8_t debug);
807 extern uint32_t bcm2835_peri_read(volatile uint32_t* paddr);
816 extern uint32_t bcm2835_peri_read_nb(volatile uint32_t* paddr);
825 extern void bcm2835_peri_write(volatile uint32_t* paddr, uint32_t value);
833 extern void bcm2835_peri_write_nb(volatile uint32_t* paddr, uint32_t value);
846 extern void bcm2835_peri_set_bits(volatile uint32_t* paddr, uint32_t value, uint32_t mask);
858 extern void bcm2835_gpio_fsel(uint8_t pin, uint8_t mode);
864 extern void bcm2835_gpio_set(uint8_t pin);
870 extern void bcm2835_gpio_clr(uint8_t pin);
876 extern void bcm2835_gpio_set_multi(uint32_t mask);
882 extern void bcm2835_gpio_clr_multi(uint32_t mask);
889 extern uint8_t bcm2835_gpio_lev(uint8_t pin);
898 extern uint8_t bcm2835_gpio_eds(uint8_t pin);
904 extern void bcm2835_gpio_set_eds(uint8_t pin);
913 extern void bcm2835_gpio_ren(uint8_t pin);
917 extern void bcm2835_gpio_clr_ren(uint8_t pin);
926 extern void bcm2835_gpio_fen(uint8_t pin);
930 extern void bcm2835_gpio_clr_fen(uint8_t pin);
935 extern void bcm2835_gpio_hen(uint8_t pin);
939 extern void bcm2835_gpio_clr_hen(uint8_t pin);
944 extern void bcm2835_gpio_len(uint8_t pin);
948 extern void bcm2835_gpio_clr_len(uint8_t pin);
955 extern void bcm2835_gpio_aren(uint8_t pin);
959 extern void bcm2835_gpio_clr_aren(uint8_t pin);
966 extern void bcm2835_gpio_afen(uint8_t pin);
970 extern void bcm2835_gpio_clr_afen(uint8_t pin);
977 extern void bcm2835_gpio_pud(uint8_t pud);
984 extern void bcm2835_gpio_pudclk(uint8_t pin, uint8_t on);
989 extern uint32_t bcm2835_gpio_pad(uint8_t group);
996 extern void bcm2835_gpio_set_pad(uint8_t group, uint32_t control);
1007 extern void bcm2835_delay (unsigned int millis);
1021 extern void bcm2835_delayMicroseconds (uint64_t micros);
1026 extern void bcm2835_gpio_write(uint8_t pin, uint8_t on);
1031 extern void bcm2835_gpio_write_multi(uint32_t mask, uint8_t on);
1036 extern void bcm2835_gpio_write_mask(uint32_t value, uint32_t mask);
1042 extern void bcm2835_gpio_set_pud(uint8_t pin, uint8_t pud);
1057 extern void bcm2835_spi_begin(void);
1062 extern void bcm2835_spi_end(void);
1069 extern void bcm2835_spi_setBitOrder(uint8_t order);
1075 extern void bcm2835_spi_setClockDivider(uint16_t divider);
1081 extern void bcm2835_spi_setDataMode(uint8_t mode);
1088 extern void bcm2835_spi_chipSelect(uint8_t cs);
1097 extern void bcm2835_spi_setChipSelectPolarity(uint8_t cs, uint8_t active);
1108 extern uint8_t bcm2835_spi_transfer(uint8_t value);
1120 extern void bcm2835_spi_transfernb(char* tbuf, char* rbuf, uint32_t len);
1128 extern void bcm2835_spi_transfern(char* buf, uint32_t len);
1135 extern void bcm2835_spi_writenb(char* buf, uint32_t len);
1150 extern void bcm2835_i2c_begin(void);
1155 extern void bcm2835_i2c_end(void);
1159 extern void bcm2835_i2c_setSlaveAddress(uint8_t addr);
1164 extern void bcm2835_i2c_setClockDivider(uint16_t divider);
1171 extern void bcm2835_i2c_set_baudrate(uint32_t baudrate);
1178 extern uint8_t bcm2835_i2c_write(const char * buf, uint32_t len);
1185 extern uint8_t bcm2835_i2c_read(char* buf, uint32_t len);
1200 extern uint8_t bcm2835_i2c_read_register_rs(char* regaddr, char* buf, uint32_t len);
1211 extern uint8_t bcm2835_i2c_write_read_rs(char* cmds, uint32_t cmds_len, char* buf, uint32_t buf_len);
1221 extern uint64_t bcm2835_st_read(void);
1226 extern void bcm2835_st_delay(uint64_t offset_micros, uint64_t micros);
1241 extern void bcm2835_pwm_set_clock(uint32_t divisor);
1248 extern void bcm2835_pwm_set_mode(uint8_t channel, uint8_t markspace, uint8_t enabled);
1254 extern void bcm2835_pwm_set_range(uint8_t channel, uint32_t range);
1261 extern void bcm2835_pwm_set_data(uint8_t channel, uint32_t data);
This is the header file bcm2835.h for the BCM2835 C library, providing support for interacting with the Broadcom BCM2835 chip used in Raspberry Pi. It contains definitions and function prototypes for GPIO, SPI, I2C, PWM, and system timer registers and functions. The header defines constants, structures, and enums for configuring and controlling the Raspberry Pi's peripherals."
112892654,10544933,Python网络编程:服务器架构详解,"['Python编程', '网络服务器', '异步I/O', '并发处理']
&spm=1001.2101.3001.5002&articleId=25914885&d=1&t=3&u=519c6e8480fb46d9b5b4319ac1d334b2)

被折叠的 条评论
为什么被折叠?



