串口控制IO口操作.
#su
mount -t debugfs debugfs /sys/kernel/debug
cd /sys/kernel/debug/aml_reg/
read reg:
echo abs_physical_addr > paddr
cat paddr
write reg:
echo abs_physical_addr value > paddr // value should be hex but do not have 0x head
dump reg:
echo abs_physical_addr cnt > dump
abs_physical_addr 的物理地址计算方法:
通过查看uboot/arch/arm/include/asm/arch-gxb/secure_apb.h 文件
比如GPIOY_9 对应的是reg1, #define PREG_PAD_GPIO1_EN_N (0xc8834400 + (0x0f << 2))
对应的物理地址是: 0xc8834400+0x0f*4=0xc883443c
GPIOY_9代码修改:uboot里面
clrbits_le32(PERIPHS_PIN_MUX_1, 1 << 6);//清除pinmux reg1_6
clrbits_le32(PERIPHS_PIN_MUX_2, 1 << 16);//清除pinmux reg2_16
clrbits_le32(PERIPHS_PIN_MUX_3, 1 << 5);//清除pinmux reg3_5
clrbits_le32(PREG_PAD_GPIO1_EN_N, 1 << 9);//设置为输出模式
clrbits_le32(PREG_PAD_GPIO1_O, 1 << 9);//输出0
内核里面的控制:
void __iomem *base;
host->base = ioremap(0xc8834400, 0x200);//0x200 表示长度
u32 ret;
ret= readl(host->base + (0x10 << 2));
ret |= (1 << 9);
writel(ret, host->base + (0x10 << 2)); writel(ret, host->base + (0x10 << 2));
#su
mount -t debugfs debugfs /sys/kernel/debug
cd /sys/kernel/debug/aml_reg/
read reg:
echo abs_physical_addr > paddr
cat paddr
write reg:
echo abs_physical_addr value > paddr // value should be hex but do not have 0x head
dump reg:
echo abs_physical_addr cnt > dump
abs_physical_addr 的物理地址计算方法:
通过查看uboot/arch/arm/include/asm/arch-gxb/secure_apb.h 文件
比如GPIOY_9 对应的是reg1, #define PREG_PAD_GPIO1_EN_N (0xc8834400 + (0x0f << 2))
对应的物理地址是: 0xc8834400+0x0f*4=0xc883443c
GPIOY_9代码修改:uboot里面
clrbits_le32(PERIPHS_PIN_MUX_1, 1 << 6);//清除pinmux reg1_6
clrbits_le32(PERIPHS_PIN_MUX_2, 1 << 16);//清除pinmux reg2_16
clrbits_le32(PERIPHS_PIN_MUX_3, 1 << 5);//清除pinmux reg3_5
clrbits_le32(PREG_PAD_GPIO1_EN_N, 1 << 9);//设置为输出模式
clrbits_le32(PREG_PAD_GPIO1_O, 1 << 9);//输出0
内核里面的控制:
void __iomem *base;
host->base = ioremap(0xc8834400, 0x200);//0x200 表示长度
u32 ret;
ret= readl(host->base + (0x10 << 2));
ret |= (1 << 9);
writel(ret, host->base + (0x10 << 2)); writel(ret, host->base + (0x10 << 2));