GPIO:further development
* Generalize GPIO handling. * Add libs to configure gpio's clocks and pads * Add Interrupt handling. * Introduce mmio.h and log.h Change-Id: I928e4c807d15031de2eede4b3ecff62df795f8ac
This commit is contained in:
@@ -10,10 +10,10 @@ INCS+= acpi.h audio_fw.h bitmap.h \
|
||||
config.h const.h cpufeature.h crtso.h \
|
||||
debug.h devio.h devman.h dmap.h \
|
||||
driver.h drivers.h drvlib.h ds.h \
|
||||
endpoint.h fslib.h gcov.h hash.h \
|
||||
endpoint.h fslib.h gpio.h gcov.h hash.h \
|
||||
hgfs.h ioctl.h input.h ipc.h ipcconst.h \
|
||||
keymap.h limits.h mount.h mthread.h minlib.h \
|
||||
netdriver.h optset.h partition.h portio.h \
|
||||
keymap.h limits.h log.h mmio.h mount.h mthread.h minlib.h \
|
||||
netdriver.h optset.h padconf.h partition.h portio.h \
|
||||
priv.h procfs.h profile.h queryparam.h \
|
||||
rs.h safecopies.h sched.h sef.h sffs.h \
|
||||
sound.h spin.h sys_config.h sysinfo.h \
|
||||
|
||||
34
include/minix/gpio.h
Normal file
34
include/minix/gpio.h
Normal file
@@ -0,0 +1,34 @@
|
||||
#ifndef __INCLUDE_GPIO_H__
|
||||
#define __INCLUDE_GPIO_H__
|
||||
|
||||
struct gpio
|
||||
{
|
||||
int nr; /* GPIO number */
|
||||
int mode; /* GPIO mode (input=0/output=1) */
|
||||
};
|
||||
|
||||
#define GPIO_MODE_INPUT 0
|
||||
#define GPIO_MODE_OUTPUT 1
|
||||
|
||||
int gpio_init();
|
||||
|
||||
/* request access to a gpio */
|
||||
int gpio_claim(char *owner, int nr, struct gpio **gpio);
|
||||
|
||||
/* Configure the GPIO for a certain purpose */
|
||||
int gpio_pin_mode(struct gpio *gpio, int mode);
|
||||
|
||||
/* Set the value for a GPIO */
|
||||
int gpio_set(struct gpio *gpio, int value);
|
||||
|
||||
/* Read the current value of the GPIO */
|
||||
int gpio_read(struct gpio *gpio, int *value);
|
||||
|
||||
/* Read and clear the value interrupt value of the GPIO */
|
||||
int gpio_intr_read(struct gpio *gpio, int *value);
|
||||
|
||||
/* Interrupt hook */
|
||||
int gpio_intr_message(message * m);
|
||||
|
||||
int gpio_release();
|
||||
#endif /* __INCLUDE_GPIO_H__ */
|
||||
117
include/minix/log.h
Normal file
117
include/minix/log.h
Normal file
@@ -0,0 +1,117 @@
|
||||
#ifndef __LOG_H__
|
||||
#define __LOG_H__
|
||||
/*
|
||||
* Simple logging functions
|
||||
*/
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
/*
|
||||
* LEVEL_NONE do not log anything.
|
||||
* LEVEL_WARN Information that needs to be known.
|
||||
* LEVEL_INFO Basic information like startup messages and occasional events.
|
||||
* LEVEL_DEBUG debug statements about things happening that are less expected.
|
||||
* LEVEL_TRACE Way to much information for anybody.
|
||||
*/
|
||||
|
||||
#define LEVEL_NONE 0
|
||||
#define LEVEL_WARN 1
|
||||
#define LEVEL_INFO 2
|
||||
#define LEVEL_DEBUG 3
|
||||
#define LEVEL_TRACE 4
|
||||
|
||||
static const char *level_string[5] = {
|
||||
"none",
|
||||
"warn",
|
||||
"info",
|
||||
"debug",
|
||||
"trace"
|
||||
};
|
||||
|
||||
/*
|
||||
* struct to be initialized by the user of the logging system.
|
||||
*
|
||||
* name: The name attribute is used in logging statements do differentiate
|
||||
* drivers
|
||||
*
|
||||
* log_level The level attribute describes the requested logging level. a level
|
||||
* of 1 will only print warnings while a level of 4 will print all the trace
|
||||
* information.
|
||||
*
|
||||
* log_func The logging function to use to log, log.h provides default_log
|
||||
* to display information on the kernel output buffer. As a bonus if the
|
||||
* requested log level is debug or trace the method , file and line number will
|
||||
* be printed to the steam.
|
||||
*/
|
||||
struct log
|
||||
{
|
||||
const char *name;
|
||||
int log_level;
|
||||
|
||||
/* the logging function itself */
|
||||
void (*log_func) (struct log * driver,
|
||||
int level,
|
||||
const char *file,
|
||||
const char *function, int line, const char *fmt, ...);
|
||||
|
||||
};
|
||||
|
||||
#define __log(driver,log_level, fmt, args...) \
|
||||
((driver)->log_func(driver,log_level, \
|
||||
__FILE__, __FUNCTION__, __LINE__,\
|
||||
fmt, ## args))
|
||||
|
||||
/* Log a warning */
|
||||
#define log_warn(driver, fmt, args...) \
|
||||
__log(driver, LEVEL_WARN, fmt, ## args)
|
||||
|
||||
/* Log an information message */
|
||||
#define log_info(driver, fmt, args...) \
|
||||
__log(driver, LEVEL_INFO, fmt, ## args)
|
||||
|
||||
/* log debugging output */
|
||||
#define log_debug(driver, fmt, args...) \
|
||||
__log(driver, LEVEL_DEBUG, fmt, ## args)
|
||||
|
||||
/* log trace output */
|
||||
#define log_trace(driver, fmt, args...) \
|
||||
__log(driver, LEVEL_TRACE, fmt, ## args)
|
||||
|
||||
#endif /* __LOG_H__ */
|
||||
|
||||
static void
|
||||
default_log(struct log *driver,
|
||||
int level,
|
||||
const char *file, const char *function, int line, const char *fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
|
||||
if (level > driver->log_level) {
|
||||
return;
|
||||
}
|
||||
/* If the wanted level is debug also display line/method information */
|
||||
if (driver->log_level >= LEVEL_DEBUG) {
|
||||
fprintf(stderr, "%s(%s):%s+%d(%s):", driver->name,
|
||||
level_string[level], file, line, function);
|
||||
} else {
|
||||
fprintf(stderr, "%s(%s)", driver->name, level_string[level]);
|
||||
}
|
||||
|
||||
va_start(args, fmt);
|
||||
vfprintf(stderr, fmt, args);
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
#ifdef hacks
|
||||
static void
|
||||
hexdump(unsigned char *d, unsigned int size)
|
||||
{
|
||||
int s;
|
||||
for (s = 0; s < size; s += 4) {
|
||||
fprintf(stdout, "0x%04x 0x%02X%02X%02X%02X %c%c%c%c\n", s,
|
||||
(unsigned int) d[s], (unsigned int) d[s + 1],
|
||||
(unsigned int) d[s + 2], (unsigned int) d[s + 3], d[s],
|
||||
d[s + 1], d[s + 2], d[s + 3]);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
33
include/minix/mmio.h
Normal file
33
include/minix/mmio.h
Normal file
@@ -0,0 +1,33 @@
|
||||
#ifndef __MMIO_H__
|
||||
#define __MMIO_H__
|
||||
|
||||
#define REG(x)(*((volatile uint32_t *)(x)))
|
||||
#define BIT(x)(0x1 << x)
|
||||
|
||||
/* Write a uint32_t value to a memory address. */
|
||||
static inline void
|
||||
write32(uint32_t address, uint32_t value)
|
||||
{
|
||||
REG(address) = value;
|
||||
}
|
||||
|
||||
/* Read an uint32_t from a memory address */
|
||||
static inline uint32_t
|
||||
read32(uint32_t address)
|
||||
{
|
||||
return REG(address);
|
||||
}
|
||||
|
||||
/* Set a 32 bits value depending on a mask */
|
||||
static inline void
|
||||
set32(uint32_t address, uint32_t mask, uint32_t value)
|
||||
{
|
||||
uint32_t val;
|
||||
val = read32(address);
|
||||
/* clear the bits */
|
||||
val &= ~(mask);
|
||||
/* apply the value using the mask */
|
||||
val |= (value & mask);
|
||||
write32(address, val);
|
||||
}
|
||||
#endif /* __MMIO_H__ */
|
||||
184
include/minix/padconf.h
Normal file
184
include/minix/padconf.h
Normal file
@@ -0,0 +1,184 @@
|
||||
#ifndef __PADCONF_H__
|
||||
#define __PADCONF_H__
|
||||
|
||||
#define PADCONF_REGISTERS_BASE 0x48002030
|
||||
|
||||
#define PADCONF_MUXMODE(X) (X & 0x7) /* mode 1 til 7 [2:0] */
|
||||
#define PADCONF_PULL_MODE(X) ((X & 0x3) << 3) /* 2 bits[4:3] */
|
||||
#define PADCONF_PULL_MODE_PD_DIS PADCONF_PULL_MODE(0) /* pull down disabled */
|
||||
#define PADCONF_PULL_MODE_PD_EN PADCONF_PULL_MODE(1) /* pull down enabled */
|
||||
#define PADCONF_PULL_MODE_PU_DIS PADCONF_PULL_MODE(2) /* pull up enabled */
|
||||
#define PADCONF_PULL_MODE_PU_EN PADCONF_PULL_MODE(3) /* pull up enabled */
|
||||
#define PADCONF_INPUT_ENABLE(X) ((X & 0x1) << 8) /* 1 bits[8] */
|
||||
#define PADCONF_OFF_MODE(X) ((X & 0xFE) << 9) /* 5 bits[13:9] */
|
||||
|
||||
/* padconf pin definitions */
|
||||
#define CONTROL_PADCONF_SDRC_D0 (0x00000000)
|
||||
#define CONTROL_PADCONF_SDRC_D2 (0x00000004)
|
||||
#define CONTROL_PADCONF_SDRC_D4 (0x00000008)
|
||||
#define CONTROL_PADCONF_SDRC_D6 (0x0000000C)
|
||||
#define CONTROL_PADCONF_SDRC_D8 (0x00000010)
|
||||
#define CONTROL_PADCONF_SDRC_D10 (0x00000014)
|
||||
#define CONTROL_PADCONF_SDRC_D12 (0x00000018)
|
||||
#define CONTROL_PADCONF_SDRC_D14 (0x0000001C)
|
||||
#define CONTROL_PADCONF_SDRC_D16 (0x00000020)
|
||||
#define CONTROL_PADCONF_SDRC_D18 (0x00000024)
|
||||
#define CONTROL_PADCONF_SDRC_D20 (0x00000028)
|
||||
#define CONTROL_PADCONF_SDRC_D22 (0x0000002C)
|
||||
#define CONTROL_PADCONF_SDRC_D24 (0x00000030)
|
||||
#define CONTROL_PADCONF_SDRC_D26 (0x00000034)
|
||||
#define CONTROL_PADCONF_SDRC_D28 (0x00000038)
|
||||
#define CONTROL_PADCONF_SDRC_D30 (0x0000003C)
|
||||
#define CONTROL_PADCONF_SDRC_CLK (0x00000040)
|
||||
#define CONTROL_PADCONF_SDRC_DQS1 (0x00000044)
|
||||
#define CONTROL_PADCONF_SDRC_DQS3 (0x00000048)
|
||||
#define CONTROL_PADCONF_GPMC_A2 (0x0000004C)
|
||||
#define CONTROL_PADCONF_GPMC_A4 (0x00000050)
|
||||
#define CONTROL_PADCONF_GPMC_A6 (0x00000054)
|
||||
#define CONTROL_PADCONF_GPMC_A8 (0x00000058)
|
||||
#define CONTROL_PADCONF_GPMC_A10 (0x0000005C)
|
||||
#define CONTROL_PADCONF_GPMC_D1 (0x00000060)
|
||||
#define CONTROL_PADCONF_GPMC_D3 (0x00000064)
|
||||
#define CONTROL_PADCONF_GPMC_D5 (0x00000068)
|
||||
#define CONTROL_PADCONF_GPMC_D7 (0x0000006C)
|
||||
#define CONTROL_PADCONF_GPMC_D9 (0x00000070)
|
||||
#define CONTROL_PADCONF_GPMC_D11 (0x00000074)
|
||||
#define CONTROL_PADCONF_GPMC_D13 (0x00000078)
|
||||
#define CONTROL_PADCONF_GPMC_D15 (0x0000007C)
|
||||
#define CONTROL_PADCONF_GPMC_NCS1 (0x00000080)
|
||||
#define CONTROL_PADCONF_GPMC_NCS3 (0x00000084)
|
||||
#define CONTROL_PADCONF_GPMC_NCS5 (0x00000088)
|
||||
#define CONTROL_PADCONF_GPMC_NCS7 (0x0000008C)
|
||||
#define CONTROL_PADCONF_GPMC_NADV_ALE (0x00000090)
|
||||
#define CONTROL_PADCONF_GPMC_NWE (0x00000094)
|
||||
#define CONTROL_PADCONF_GPMC_NBE1 (0x00000098)
|
||||
#define CONTROL_PADCONF_GPMC_WAIT0 (0x0000009C)
|
||||
#define CONTROL_PADCONF_GPMC_WAIT2 (0x000000A0)
|
||||
#define CONTROL_PADCONF_DSS_PCLK (0x000000A4)
|
||||
#define CONTROL_PADCONF_DSS_VSYNC (0x000000A8)
|
||||
#define CONTROL_PADCONF_DSS_DATA0 (0x000000AC)
|
||||
#define CONTROL_PADCONF_DSS_DATA2 (0x000000B0)
|
||||
#define CONTROL_PADCONF_DSS_DATA4 (0x000000B4)
|
||||
#define CONTROL_PADCONF_DSS_DATA6 (0x000000B8)
|
||||
#define CONTROL_PADCONF_DSS_DATA8 (0x000000BC)
|
||||
#define CONTROL_PADCONF_DSS_DATA10 (0x000000C0)
|
||||
#define CONTROL_PADCONF_DSS_DATA12 (0x000000C4)
|
||||
#define CONTROL_PADCONF_DSS_DATA14 (0x000000C8)
|
||||
#define CONTROL_PADCONF_DSS_DATA16 (0x000000CC)
|
||||
#define CONTROL_PADCONF_DSS_DATA18 (0x000000D0)
|
||||
#define CONTROL_PADCONF_DSS_DATA20 (0x000000D4)
|
||||
#define CONTROL_PADCONF_DSS_DATA22 (0x000000D8)
|
||||
#define CONTROL_PADCONF_CAM_HS (0x000000DC)
|
||||
#define CONTROL_PADCONF_CAM_XCLKA (0x000000E0)
|
||||
#define CONTROL_PADCONF_CAM_FLD (0x000000E4)
|
||||
#define CONTROL_PADCONF_CAM_D1 (0x000000E8)
|
||||
#define CONTROL_PADCONF_CAM_D3 (0x000000EC)
|
||||
#define CONTROL_PADCONF_CAM_D5 (0x000000F0)
|
||||
#define CONTROL_PADCONF_CAM_D7 (0x000000F4)
|
||||
#define CONTROL_PADCONF_CAM_D9 (0x000000F8)
|
||||
#define CONTROL_PADCONF_CAM_D11 (0x000000FC)
|
||||
#define CONTROL_PADCONF_CAM_WEN (0x00000100)
|
||||
#define CONTROL_PADCONF_CSI2_DX0 (0x00000104)
|
||||
#define CONTROL_PADCONF_CSI2_DX1 (0x00000108)
|
||||
#define CONTROL_PADCONF_MCBSP2_FSX (0x0000010C)
|
||||
#define CONTROL_PADCONF_MCBSP2_DR (0x00000110)
|
||||
#define CONTROL_PADCONF_MMC1_CLK (0x00000114)
|
||||
#define CONTROL_PADCONF_MMC1_DAT0 (0x00000118)
|
||||
#define CONTROL_PADCONF_MMC1_DAT2 (0x0000011C)
|
||||
#define CONTROL_PADCONF_MMC2_CLK (0x00000128)
|
||||
#define CONTROL_PADCONF_MMC2_DAT0 (0x0000012C)
|
||||
#define CONTROL_PADCONF_MMC2_DAT2 (0x00000130)
|
||||
#define CONTROL_PADCONF_MMC2_DAT4 (0x00000134)
|
||||
#define CONTROL_PADCONF_MMC2_DAT6 (0x00000138)
|
||||
#define CONTROL_PADCONF_MCBSP3_DX (0x0000013C)
|
||||
#define CONTROL_PADCONF_MCBSP3_CLKX (0x00000140)
|
||||
#define CONTROL_PADCONF_UART2_CTS (0x00000144)
|
||||
#define CONTROL_PADCONF_UART2_TX (0x00000148)
|
||||
#define CONTROL_PADCONF_UART1_TX (0x0000014C)
|
||||
#define CONTROL_PADCONF_UART1_CTS (0x00000150)
|
||||
#define CONTROL_PADCONF_MCBSP4_CLKX (0x00000154)
|
||||
#define CONTROL_PADCONF_MCBSP4_DX (0x00000158)
|
||||
#define CONTROL_PADCONF_MCBSP1_CLKR (0x0000015C)
|
||||
#define CONTROL_PADCONF_MCBSP1_DX (0x00000160)
|
||||
#define CONTROL_PADCONF_MCBSP_CLKS (0x00000164)
|
||||
#define CONTROL_PADCONF_MCBSP1_CLKX (0x00000168)
|
||||
#define CONTROL_PADCONF_UART3_RTS_SD (0x0000016C)
|
||||
#define CONTROL_PADCONF_UART3_TX_IRTX (0x00000170)
|
||||
#define CONTROL_PADCONF_HSUSB0_STP (0x00000174)
|
||||
#define CONTROL_PADCONF_HSUSB0_NXT (0x00000178)
|
||||
#define CONTROL_PADCONF_HSUSB0_DATA1 (0x0000017C)
|
||||
#define CONTROL_PADCONF_HSUSB0_DATA3 (0x00000180)
|
||||
#define CONTROL_PADCONF_HSUSB0_DATA5 (0x00000184)
|
||||
#define CONTROL_PADCONF_HSUSB0_DATA7 (0x00000188)
|
||||
#define CONTROL_PADCONF_I2C1_SDA (0x0000018C)
|
||||
#define CONTROL_PADCONF_I2C2_SDA (0x00000190)
|
||||
#define CONTROL_PADCONF_I2C3_SDA (0x00000194)
|
||||
#define CONTROL_PADCONF_MCSPI1_CLK (0x00000198)
|
||||
#define CONTROL_PADCONF_MCSPI1_SOMI (0x0000019C)
|
||||
#define CONTROL_PADCONF_MCSPI1_CS1 (0x000001A0)
|
||||
#define CONTROL_PADCONF_MCSPI1_CS3 (0x000001A4)
|
||||
#define CONTROL_PADCONF_MCSPI2_SIMO (0x000001A8)
|
||||
#define CONTROL_PADCONF_MCSPI2_CS0 (0x000001AC)
|
||||
#define CONTROL_PADCONF_SYS_NIRQ (0x000001B0)
|
||||
#define CONTROL_PADCONF_SAD2D_MCAD0 (0x000001B4)
|
||||
#define CONTROL_PADCONF_SAD2D_MCAD2 (0x000001B8)
|
||||
#define CONTROL_PADCONF_SAD2D_MCAD4 (0x000001BC)
|
||||
#define CONTROL_PADCONF_SAD2D_MCAD6 (0x000001C0)
|
||||
#define CONTROL_PADCONF_SAD2D_MCAD8 (0x000001C4)
|
||||
#define CONTROL_PADCONF_SAD2D_MCAD10 (0x000001C8)
|
||||
#define CONTROL_PADCONF_SAD2D_MCAD12 (0x000001CC)
|
||||
#define CONTROL_PADCONF_SAD2D_MCAD14 (0x000001D0)
|
||||
#define CONTROL_PADCONF_SAD2D_MCAD16 (0x000001D4)
|
||||
#define CONTROL_PADCONF_SAD2D_MCAD18 (0x000001D8)
|
||||
#define CONTROL_PADCONF_SAD2D_MCAD20 (0x000001DC)
|
||||
#define CONTROL_PADCONF_SAD2D_MCAD22 (0x000001E0)
|
||||
#define CONTROL_PADCONF_SAD2D_MCAD24 (0x000001E4)
|
||||
#define CONTROL_PADCONF_SAD2D_MCAD26 (0x000001E8)
|
||||
#define CONTROL_PADCONF_SAD2D_MCAD28 (0x000001EC)
|
||||
#define CONTROL_PADCONF_SAD2D_MCAD30 (0x000001F0)
|
||||
#define CONTROL_PADCONF_SAD2D_MCAD32 (0x000001F4)
|
||||
#define CONTROL_PADCONF_SAD2D_MCAD34 (0x000001F8)
|
||||
#define CONTROL_PADCONF_SAD2D_MCAD36 (0x000001FC)
|
||||
#define CONTROL_PADCONF_SAD2D_NRESPWRON (0x00000200)
|
||||
#define CONTROL_PADCONF_SAD2D_ARMNIRQ (0x00000204)
|
||||
#define CONTROL_PADCONF_SAD2D_SPINT (0x00000208)
|
||||
#define CONTROL_PADCONF_SAD2D_DMAREQ0 (0x0000020C)
|
||||
#define CONTROL_PADCONF_SAD2D_DMAREQ2 (0x00000210)
|
||||
#define CONTROL_PADCONF_SAD2D_NTRST (0x00000214)
|
||||
#define CONTROL_PADCONF_SAD2D_TDO (0x00000218)
|
||||
#define CONTROL_PADCONF_SAD2D_TCK (0x0000021C)
|
||||
#define CONTROL_PADCONF_SAD2D_MSTDBY (0x00000220)
|
||||
#define CONTROL_PADCONF_SAD2D_IDLEACK (0x00000224)
|
||||
#define CONTROL_PADCONF_SAD2D_SWRITE (0x00000228)
|
||||
#define CONTROL_PADCONF_SAD2D_SREAD (0x0000022C)
|
||||
#define CONTROL_PADCONF_SAD2D_SBUSFLAG (0x00000230)
|
||||
#define CONTROL_PADCONF_SDRC_CKE1 (0x00000234)
|
||||
#define CONTROL_PADCONF_SDRC_BA0 (0x00000570)
|
||||
#define CONTROL_PADCONF_SDRC_A0 (0x00000574)
|
||||
#define CONTROL_PADCONF_SDRC_A2 (0x00000578)
|
||||
#define CONTROL_PADCONF_SDRC_A4 (0x0000057C)
|
||||
#define CONTROL_PADCONF_SDRC_A6 (0x00000580)
|
||||
#define CONTROL_PADCONF_SDRC_A8 (0x00000584)
|
||||
#define CONTROL_PADCONF_SDRC_A10 (0x00000588)
|
||||
#define CONTROL_PADCONF_SDRC_A12 (0x0000058C)
|
||||
#define CONTROL_PADCONF_SDRC_A14 (0x00000590)
|
||||
#define CONTROL_PADCONF_SDRC_NCS1 (0x00000594)
|
||||
#define CONTROL_PADCONF_SDRC_NRAS (0x00000598)
|
||||
#define CONTROL_PADCONF_SDRC_NWE (0x0000059C)
|
||||
#define CONTROL_PADCONF_SDRC_DM1 (0x000005A0)
|
||||
#define CONTROL_PADCONF_SDRC_DM3 (0x000005A4)
|
||||
#define CONTROL_PADCONF_ETK_CLK (0x000005A8)
|
||||
#define CONTROL_PADCONF_ETK_D0 (0x000005AC)
|
||||
#define CONTROL_PADCONF_ETK_D2 (0x000005B0)
|
||||
#define CONTROL_PADCONF_ETK_D4 (0x000005B4)
|
||||
#define CONTROL_PADCONF_ETK_D6 (0x000005B8)
|
||||
#define CONTROL_PADCONF_ETK_D8 (0x000005BC)
|
||||
#define CONTROL_PADCONF_ETK_D10 (0x000005C0)
|
||||
#define CONTROL_PADCONF_ETK_D12 (0x000005C4)
|
||||
#define CONTROL_PADCONF_ETK_D14 (0x000005C8)
|
||||
|
||||
int padconf_init();
|
||||
int padconf_set(u32_t padconf, u32_t mask, u32_t value);
|
||||
int padconf_release();
|
||||
|
||||
#endif /* __PADCONF_H__ */
|
||||
Reference in New Issue
Block a user