OpenOCD
bcm2835gpio.c File Reference
Include dependency graph for bcm2835gpio.c:

Go to the source code of this file.

Data Structures

struct  initial_gpio_state
 

Macros

#define BCM2835_GPIO_BASE   (bcm2835_peri_base + 0x200000) /* GPIO controller */
 
#define BCM2835_GPIO_CLEAR_REG_BITS(offset, bit_mask)    (*(pio_base + (offset)) &= ~(bit_mask))
 
#define BCM2835_GPIO_CLR_ADDR(gpio_pin_num)   (pio_base + 10 + ((gpio_pin_num) / 32))
 
#define BCM2835_GPIO_LEVEL_ADDR(gpio_pin_num)   (pio_base + 13 + ((gpio_pin_num) / 32))
 
#define BCM2835_GPIO_MODE_ADDR(gpio_pin_num)   (pio_base + ((gpio_pin_num) / 10))
 
#define BCM2835_GPIO_MODE_INPUT   0
 
#define BCM2835_GPIO_MODE_OUTPUT   1
 
#define BCM2835_GPIO_REG_READ(offset)    (*(pio_base + (offset)))
 
#define BCM2835_GPIO_REG_WRITE(offset, value)    (*(pio_base + (offset)) = (value))
 
#define BCM2835_GPIO_SET_ADDR(gpio_pin_num)   (pio_base + 7 + ((gpio_pin_num) / 32))
 
#define BCM2835_GPIO_SET_REG_BITS(offset, bit_mask)    (*(pio_base + (offset)) |= (bit_mask))
 
#define BCM2835_PADS_GPIO_0_27   (bcm2835_peri_base + 0x100000)
 
#define BCM2835_PADS_GPIO_0_27_OFFSET   (0x2c / 4)
 

Functions

static void bcm2835_delay (void)
 
static bool bcm2835_get_level (unsigned int gpio_pin_num)
 
static const char * bcm2835_get_mem_dev (void)
 
static unsigned int bcm2835_get_mode (unsigned int gpio_pin_num)
 
static void bcm2835_gpio_clear (unsigned int gpio_pin_num)
 
static void bcm2835_gpio_set (unsigned int gpio_pin_num)
 
static void bcm2835_gpio_synchronize (void)
 
static void bcm2835_set_input (unsigned int gpio_pin_num)
 
static void bcm2835_set_mode (unsigned int gpio_pin_num, unsigned char mode)
 
static void bcm2835_set_output (unsigned int gpio_pin_num)
 
static void bcm2835_swdio_drive (bool is_output)
 
static int bcm2835_swdio_read (void)
 
static int bcm2835gpio_blink (bool on)
 
static int bcm2835gpio_init (void)
 
static bool bcm2835gpio_jtag_mode_possible (void)
 
static int bcm2835gpio_khz (int khz, int *jtag_speed)
 
static void bcm2835gpio_munmap (void)
 
static int bcm2835gpio_quit (void)
 
static enum bb_value bcm2835gpio_read (void)
 
static int bcm2835gpio_reset (int trst, int srst)
 
static int bcm2835gpio_speed (int speed)
 
static int bcm2835gpio_speed_div (int speed, int *khz)
 
static bool bcm2835gpio_swd_mode_possible (void)
 
static int bcm2835gpio_swd_write_fast (int swclk, int swdio)
 
static int bcm2835gpio_swd_write_generic (int swclk, int swdio)
 
static int bcm2835gpio_write (int tck, int tms, int tdi)
 
 COMMAND_HANDLER (bcm2835gpio_handle_peripheral_base)
 
 COMMAND_HANDLER (bcm2835gpio_handle_peripheral_mem_dev)
 
 COMMAND_HANDLER (bcm2835gpio_handle_speed_coeffs)
 
static void initialize_gpio (enum adapter_gpio_config_index idx)
 
static bool is_gpio_config_valid (enum adapter_gpio_config_index idx)
 
static void restore_gpio (enum adapter_gpio_config_index idx)
 
static void set_gpio_value (const struct adapter_gpio_config *gpio_config, int value)
 

Variables

static const struct adapter_gpio_configadapter_gpio_config
 
static off_t bcm2835_peri_base = 0x20000000
 
static char * bcm2835_peri_mem_dev
 
struct adapter_driver bcm2835gpio_adapter_driver
 
static const struct bitbang_interface bcm2835gpio_bitbang_swd_write_fast
 
static const struct bitbang_interface bcm2835gpio_bitbang_swd_write_generic
 
static const struct command_registration bcm2835gpio_command_handlers []
 
static struct jtag_interface bcm2835gpio_interface
 
static const struct command_registration bcm2835gpio_subcommand_handlers []
 
static int dev_mem_fd
 
struct {
   volatile uint32_t *   swclk_clr_set_addr [2]
 
   uint32_t   swclk_mask
 
   bool   swdio_active_low
 
   volatile uint32_t *   swdio_clr_set_addr [2]
 
   uint32_t   swdio_level_shift_bits
 
   uint32_t   swdio_mask
 
   volatile uint32_t *   swdio_mode_addr
 
   uint32_t   swdio_mode_input_mask
 
   uint32_t   swdio_mode_output_mask
 
   volatile uint32_t *   swdio_read_level_addr
 
   volatile uint32_t *   tck_clr_set_addr [2]
 
   uint32_t   tck_mask
 
   volatile uint32_t *   tdi_clr_set_addr [2]
 
   uint32_t   tdi_mask
 
   bool   tdo_active_low
 
   uint32_t   tdo_level_shift_bits
 
   volatile uint32_t *   tdo_read_level_addr
 
   volatile uint32_t *   tms_clr_set_addr [2]
 
   uint32_t   tms_mask
 
gpio_control
 
static uint32_t initial_drive_strength_etc
 
static struct initial_gpio_state initial_gpio_state [ADAPTER_GPIO_IDX_NUM]
 
static unsigned int jtag_delay
 
static volatile uint32_t * pads_base = MAP_FAILED
 
static volatile uint32_t * pio_base = MAP_FAILED
 
static int speed_coeff = 113714
 
static int speed_offset = 28
 

Macro Definition Documentation

◆ BCM2835_GPIO_BASE

#define BCM2835_GPIO_BASE   (bcm2835_peri_base + 0x200000) /* GPIO controller */

Definition at line 24 of file bcm2835gpio.c.

◆ BCM2835_GPIO_CLEAR_REG_BITS

#define BCM2835_GPIO_CLEAR_REG_BITS (   offset,
  bit_mask 
)     (*(pio_base + (offset)) &= ~(bit_mask))

Definition at line 43 of file bcm2835gpio.c.

◆ BCM2835_GPIO_CLR_ADDR

#define BCM2835_GPIO_CLR_ADDR (   gpio_pin_num)    (pio_base + 10 + ((gpio_pin_num) / 32))

Definition at line 48 of file bcm2835gpio.c.

◆ BCM2835_GPIO_LEVEL_ADDR

#define BCM2835_GPIO_LEVEL_ADDR (   gpio_pin_num)    (pio_base + 13 + ((gpio_pin_num) / 32))

Definition at line 49 of file bcm2835gpio.c.

◆ BCM2835_GPIO_MODE_ADDR

#define BCM2835_GPIO_MODE_ADDR (   gpio_pin_num)    (pio_base + ((gpio_pin_num) / 10))

Definition at line 46 of file bcm2835gpio.c.

◆ BCM2835_GPIO_MODE_INPUT

#define BCM2835_GPIO_MODE_INPUT   0

Definition at line 30 of file bcm2835gpio.c.

◆ BCM2835_GPIO_MODE_OUTPUT

#define BCM2835_GPIO_MODE_OUTPUT   1

Definition at line 31 of file bcm2835gpio.c.

◆ BCM2835_GPIO_REG_READ

#define BCM2835_GPIO_REG_READ (   offset)     (*(pio_base + (offset)))

Definition at line 34 of file bcm2835gpio.c.

◆ BCM2835_GPIO_REG_WRITE

#define BCM2835_GPIO_REG_WRITE (   offset,
  value 
)     (*(pio_base + (offset)) = (value))

Definition at line 37 of file bcm2835gpio.c.

◆ BCM2835_GPIO_SET_ADDR

#define BCM2835_GPIO_SET_ADDR (   gpio_pin_num)    (pio_base + 7 + ((gpio_pin_num) / 32))

Definition at line 47 of file bcm2835gpio.c.

◆ BCM2835_GPIO_SET_REG_BITS

#define BCM2835_GPIO_SET_REG_BITS (   offset,
  bit_mask 
)     (*(pio_base + (offset)) |= (bit_mask))

Definition at line 40 of file bcm2835gpio.c.

◆ BCM2835_PADS_GPIO_0_27

#define BCM2835_PADS_GPIO_0_27   (bcm2835_peri_base + 0x100000)

Definition at line 26 of file bcm2835gpio.c.

◆ BCM2835_PADS_GPIO_0_27_OFFSET

#define BCM2835_PADS_GPIO_0_27_OFFSET   (0x2c / 4)

Definition at line 27 of file bcm2835gpio.c.

Function Documentation

◆ bcm2835_delay()

static void bcm2835_delay ( void  )
inlinestatic

◆ bcm2835_get_level()

static bool bcm2835_get_level ( unsigned int  gpio_pin_num)
inlinestatic

Definition at line 96 of file bcm2835gpio.c.

References BCM2835_GPIO_REG_READ.

Referenced by bcm2835gpio_read().

◆ bcm2835_get_mem_dev()

static const char* bcm2835_get_mem_dev ( void  )
inlinestatic

Definition at line 132 of file bcm2835gpio.c.

References bcm2835_peri_mem_dev.

Referenced by bcm2835gpio_init(), and COMMAND_HANDLER().

◆ bcm2835_get_mode()

static unsigned int bcm2835_get_mode ( unsigned int  gpio_pin_num)
inlinestatic

Definition at line 90 of file bcm2835gpio.c.

References BCM2835_GPIO_REG_READ.

Referenced by bcm2835gpio_read().

◆ bcm2835_gpio_clear()

static void bcm2835_gpio_clear ( unsigned int  gpio_pin_num)
inlinestatic

Definition at line 127 of file bcm2835gpio.c.

References BCM2835_GPIO_REG_WRITE.

Referenced by restore_gpio(), and set_gpio_value().

◆ bcm2835_gpio_set()

static void bcm2835_gpio_set ( unsigned int  gpio_pin_num)
inlinestatic

Definition at line 121 of file bcm2835gpio.c.

References BCM2835_GPIO_REG_WRITE.

Referenced by restore_gpio(), and set_gpio_value().

◆ bcm2835_gpio_synchronize()

static void bcm2835_gpio_synchronize ( void  )
inlinestatic

◆ bcm2835_set_input()

static void bcm2835_set_input ( unsigned int  gpio_pin_num)
inlinestatic

Definition at line 102 of file bcm2835gpio.c.

References BCM2835_GPIO_CLEAR_REG_BITS.

Referenced by bcm2835_set_mode(), bcm2835gpio_read(), and set_gpio_value().

◆ bcm2835_set_mode()

static void bcm2835_set_mode ( unsigned int  gpio_pin_num,
unsigned char  mode 
)
inlinestatic

Definition at line 108 of file bcm2835gpio.c.

References BCM2835_GPIO_SET_REG_BITS, bcm2835_set_input(), and mode.

Referenced by bcm2835_set_output(), and restore_gpio().

◆ bcm2835_set_output()

static void bcm2835_set_output ( unsigned int  gpio_pin_num)
inlinestatic

Definition at line 115 of file bcm2835gpio.c.

References BCM2835_GPIO_MODE_OUTPUT, and bcm2835_set_mode().

Referenced by bcm2835gpio_read(), and set_gpio_value().

◆ bcm2835_swdio_drive()

static void bcm2835_swdio_drive ( bool  is_output)
static

◆ bcm2835_swdio_read()

static int bcm2835_swdio_read ( void  )
static

Definition at line 325 of file bcm2835gpio.c.

References gpio_control.

◆ bcm2835gpio_blink()

static int bcm2835gpio_blink ( bool  on)
static

Definition at line 468 of file bcm2835gpio.c.

◆ bcm2835gpio_init()

◆ bcm2835gpio_jtag_mode_possible()

static bool bcm2835gpio_jtag_mode_possible ( void  )
static

◆ bcm2835gpio_khz()

static int bcm2835gpio_khz ( int  khz,
int *  jtag_speed 
)
static

Definition at line 331 of file bcm2835gpio.c.

References DIV_ROUND_UP, ERROR_FAIL, ERROR_OK, LOG_DEBUG, speed_coeff, and speed_offset.

◆ bcm2835gpio_munmap()

static void bcm2835gpio_munmap ( void  )
static

Definition at line 455 of file bcm2835gpio.c.

References pads_base, and pio_base.

◆ bcm2835gpio_quit()

static int bcm2835gpio_quit ( void  )
static

Definition at line 647 of file bcm2835gpio.c.

◆ bcm2835gpio_read()

◆ bcm2835gpio_reset()

static int bcm2835gpio_reset ( int  trst,
int  srst 
)
static

◆ bcm2835gpio_speed()

static int bcm2835gpio_speed ( int  speed)
static

Definition at line 352 of file bcm2835gpio.c.

References ERROR_OK, and jtag_delay.

◆ bcm2835gpio_speed_div()

static int bcm2835gpio_speed_div ( int  speed,
int *  khz 
)
static

Definition at line 344 of file bcm2835gpio.c.

References ERROR_OK, speed_coeff, and speed_offset.

◆ bcm2835gpio_swd_mode_possible()

static bool bcm2835gpio_swd_mode_possible ( void  )
static

Definition at line 446 of file bcm2835gpio.c.

References ADAPTER_GPIO_IDX_SWCLK, ADAPTER_GPIO_IDX_SWDIO, and is_gpio_config_valid().

Referenced by bcm2835gpio_init().

◆ bcm2835gpio_swd_write_fast()

static int bcm2835gpio_swd_write_fast ( int  swclk,
int  swdio 
)
static

Definition at line 263 of file bcm2835gpio.c.

References bcm2835_delay(), bcm2835_gpio_synchronize(), ERROR_OK, and gpio_control.

◆ bcm2835gpio_swd_write_generic()

static int bcm2835gpio_swd_write_generic ( int  swclk,
int  swdio 
)
static

◆ bcm2835gpio_write()

static int bcm2835gpio_write ( int  tck,
int  tms,
int  tdi 
)
static

Definition at line 249 of file bcm2835gpio.c.

References bcm2835_delay(), bcm2835_gpio_synchronize(), ERROR_OK, and gpio_control.

◆ COMMAND_HANDLER() [1/3]

COMMAND_HANDLER ( bcm2835gpio_handle_peripheral_base  )

Definition at line 382 of file bcm2835gpio.c.

◆ COMMAND_HANDLER() [2/3]

COMMAND_HANDLER ( bcm2835gpio_handle_peripheral_mem_dev  )

◆ COMMAND_HANDLER() [3/3]

COMMAND_HANDLER ( bcm2835gpio_handle_speed_coeffs  )

◆ initialize_gpio()

static void initialize_gpio ( enum adapter_gpio_config_index  idx)
static

Definition at line 208 of file bcm2835gpio.c.

Referenced by bcm2835gpio_init().

◆ is_gpio_config_valid()

◆ restore_gpio()

◆ set_gpio_value()

Variable Documentation

◆ adapter_gpio_config

Definition at line 60 of file bcm2835gpio.c.

◆ bcm2835_peri_base

off_t bcm2835_peri_base = 0x20000000
static

Definition at line 23 of file bcm2835gpio.c.

◆ bcm2835_peri_mem_dev

char* bcm2835_peri_mem_dev
static

Definition at line 22 of file bcm2835gpio.c.

Referenced by bcm2835_get_mem_dev(), and COMMAND_HANDLER().

◆ bcm2835gpio_adapter_driver

struct adapter_driver bcm2835gpio_adapter_driver
Initial value:
= {
.name = "bcm2835gpio",
.transport_ids = TRANSPORT_JTAG | TRANSPORT_SWD,
.transport_preferred_id = TRANSPORT_JTAG,
.speed_div = bcm2835gpio_speed_div,
.jtag_ops = &bcm2835gpio_interface,
.swd_ops = &bitbang_swd,
}
static const struct command_registration bcm2835gpio_command_handlers[]
Definition: bcm2835gpio.c:422
static int bcm2835gpio_init(void)
Definition: bcm2835gpio.c:494
static int bcm2835gpio_khz(int khz, int *jtag_speed)
Definition: bcm2835gpio.c:331
static int bcm2835gpio_reset(int trst, int srst)
Definition: bcm2835gpio.c:287
static struct jtag_interface bcm2835gpio_interface
Definition: bcm2835gpio.c:683
static int bcm2835gpio_quit(void)
Definition: bcm2835gpio.c:647
static int bcm2835gpio_speed_div(int speed, int *khz)
Definition: bcm2835gpio.c:344
static int bcm2835gpio_speed(int speed)
Definition: bcm2835gpio.c:352
const struct swd_driver bitbang_swd
Definition: bitbang.c:614
#define TRANSPORT_SWD
Definition: transport.h:20
#define TRANSPORT_JTAG
Definition: transport.h:19

Definition at line 647 of file bcm2835gpio.c.

◆ bcm2835gpio_bitbang_swd_write_fast

const struct bitbang_interface bcm2835gpio_bitbang_swd_write_fast
static
Initial value:
= {
.swdio_read = bcm2835_swdio_read,
.swdio_drive = bcm2835_swdio_drive,
}
static void bcm2835_swdio_drive(bool is_output)
Definition: bcm2835gpio.c:309
static int bcm2835gpio_write(int tck, int tms, int tdi)
Definition: bcm2835gpio.c:249
static enum bb_value bcm2835gpio_read(void)
Definition: bcm2835gpio.c:243
static int bcm2835_swdio_read(void)
Definition: bcm2835gpio.c:325
static int bcm2835gpio_blink(bool on)
Definition: bcm2835gpio.c:468
static int bcm2835gpio_swd_write_fast(int swclk, int swdio)
Definition: bcm2835gpio.c:263

Definition at line 468 of file bcm2835gpio.c.

Referenced by bcm2835gpio_init().

◆ bcm2835gpio_bitbang_swd_write_generic

const struct bitbang_interface bcm2835gpio_bitbang_swd_write_generic
static
Initial value:
= {
.swdio_read = bcm2835_swdio_read,
.swdio_drive = bcm2835_swdio_drive,
}
static int bcm2835gpio_swd_write_generic(int swclk, int swdio)
Definition: bcm2835gpio.c:276

Definition at line 468 of file bcm2835gpio.c.

Referenced by bcm2835gpio_init().

◆ bcm2835gpio_command_handlers

const struct command_registration bcm2835gpio_command_handlers[]
static
Initial value:
= {
{
.name = "bcm2835gpio",
.mode = COMMAND_ANY,
.help = "perform bcm2835gpio management",
.usage = "",
},
}
static const struct command_registration bcm2835gpio_subcommand_handlers[]
Definition: bcm2835gpio.c:396
#define COMMAND_REGISTRATION_DONE
Use this as the last entry in an array of command_registration records.
Definition: command.h:251
@ COMMAND_ANY
Definition: command.h:42
const char * usage
a string listing the options and arguments, required or optional
Definition: command.h:239

Definition at line 382 of file bcm2835gpio.c.

◆ bcm2835gpio_interface

struct jtag_interface bcm2835gpio_interface
static
Initial value:
= {
.supported = DEBUG_CAP_TMS_SEQ,
.execute_queue = bitbang_execute_queue,
}
int bitbang_execute_queue(struct jtag_command *cmd_queue)
Definition: bitbang.c:293
#define DEBUG_CAP_TMS_SEQ
Definition: interface.h:188

Definition at line 647 of file bcm2835gpio.c.

◆ bcm2835gpio_subcommand_handlers

const struct command_registration bcm2835gpio_subcommand_handlers[]
static
Initial value:
= {
{
.name = "speed_coeffs",
.handler = &bcm2835gpio_handle_speed_coeffs,
.mode = COMMAND_CONFIG,
.help = "SPEED_COEFF and SPEED_OFFSET for delay calculations.",
.usage = "[SPEED_COEFF SPEED_OFFSET]",
},
{
.name = "peripheral_mem_dev",
.handler = &bcm2835gpio_handle_peripheral_mem_dev,
.mode = COMMAND_CONFIG,
.help = "device to map memory mapped GPIOs from.",
.usage = "[device]",
},
{
.name = "peripheral_base",
.handler = &bcm2835gpio_handle_peripheral_base,
.mode = COMMAND_CONFIG,
.help = "peripheral base to access GPIOs, not needed with /dev/gpiomem.",
.usage = "[base]",
},
}
@ COMMAND_CONFIG
Definition: command.h:41

Definition at line 382 of file bcm2835gpio.c.

◆ dev_mem_fd

int dev_mem_fd
static

Definition at line 51 of file bcm2835gpio.c.

Referenced by bcm2835gpio_init().

◆ 

◆ initial_drive_strength_etc

uint32_t initial_drive_strength_etc
static

Definition at line 65 of file bcm2835gpio.c.

Referenced by bcm2835gpio_init().

◆ initial_gpio_state

◆ jtag_delay

unsigned int jtag_delay
static

Definition at line 58 of file bcm2835gpio.c.

Referenced by bcm2835_delay(), and bcm2835gpio_speed().

◆ pads_base

volatile uint32_t* pads_base = MAP_FAILED
static

Definition at line 53 of file bcm2835gpio.c.

Referenced by bcm2835gpio_init(), and bcm2835gpio_munmap().

◆ pio_base

volatile uint32_t* pio_base = MAP_FAILED
static

Definition at line 52 of file bcm2835gpio.c.

Referenced by bcm2835gpio_init(), and bcm2835gpio_munmap().

◆ speed_coeff

int speed_coeff = 113714
static

Definition at line 56 of file bcm2835gpio.c.

Referenced by bcm2835gpio_khz(), bcm2835gpio_speed_div(), and COMMAND_HANDLER().

◆ speed_offset

int speed_offset = 28
static

Definition at line 57 of file bcm2835gpio.c.

Referenced by bcm2835gpio_khz(), bcm2835gpio_speed_div(), and COMMAND_HANDLER().

◆ swclk_clr_set_addr

volatile uint32_t* swclk_clr_set_addr[2]

Definition at line 76 of file bcm2835gpio.c.

◆ swclk_mask

uint32_t swclk_mask

Definition at line 77 of file bcm2835gpio.c.

◆ swdio_active_low

bool swdio_active_low

Definition at line 72 of file bcm2835gpio.c.

◆ swdio_clr_set_addr

volatile uint32_t* swdio_clr_set_addr[2]

Definition at line 68 of file bcm2835gpio.c.

◆ swdio_level_shift_bits

uint32_t swdio_level_shift_bits

Definition at line 71 of file bcm2835gpio.c.

◆ swdio_mask

uint32_t swdio_mask

Definition at line 69 of file bcm2835gpio.c.

◆ swdio_mode_addr

volatile uint32_t* swdio_mode_addr

Definition at line 73 of file bcm2835gpio.c.

◆ swdio_mode_input_mask

uint32_t swdio_mode_input_mask

Definition at line 74 of file bcm2835gpio.c.

◆ swdio_mode_output_mask

uint32_t swdio_mode_output_mask

Definition at line 75 of file bcm2835gpio.c.

◆ swdio_read_level_addr

volatile uint32_t* swdio_read_level_addr

Definition at line 70 of file bcm2835gpio.c.

◆ tck_clr_set_addr

volatile uint32_t* tck_clr_set_addr[2]

Definition at line 82 of file bcm2835gpio.c.

◆ tck_mask

uint32_t tck_mask

Definition at line 83 of file bcm2835gpio.c.

◆ tdi_clr_set_addr

volatile uint32_t* tdi_clr_set_addr[2]

Definition at line 78 of file bcm2835gpio.c.

◆ tdi_mask

uint32_t tdi_mask

Definition at line 79 of file bcm2835gpio.c.

Referenced by rlink_scan().

◆ tdo_active_low

bool tdo_active_low

Definition at line 86 of file bcm2835gpio.c.

◆ tdo_level_shift_bits

uint32_t tdo_level_shift_bits

Definition at line 85 of file bcm2835gpio.c.

◆ tdo_read_level_addr

volatile uint32_t* tdo_read_level_addr

Definition at line 84 of file bcm2835gpio.c.

◆ tms_clr_set_addr

volatile uint32_t* tms_clr_set_addr[2]

Definition at line 80 of file bcm2835gpio.c.

◆ tms_mask

uint32_t tms_mask

Definition at line 81 of file bcm2835gpio.c.