现象:
修改后:
文档:
测试命令(需要kernel打开 CONFIG_DEVMEM=y):
读取: devmem2 $((0x6511000 + 0x0088)) w
写入: devmem2 $((0x6511000 + 0x0088)) w 0x7000000
代码:
// 包含start_bit,end_bit,如果一次修改多位,例如修改0,1,2三位的值为111,则参数为 (value,0,2,0x111)
typedef unsigned int u32;
u32 modify_bits(u32 value, int start_bit, int end_bit, u32 new_value)
{
// 创建一个掩码,用于清除指定范围内的位
u32 mask = ~(((1U << (end_bit - start_bit + 1)) - 1) << start_bit);
value &= mask; // 清除指定范围内的位
// 将新值左移到正确的位置
new_value <<= start_bit;
// 将新值与原始值进行按位或操作,以设置新值
value |= new_value;
return value;
}
// 修改寄存器,解决LCD屏幕显示异常问题
static void update_lcd(void) {
static GPIO_TYPE gpio_lcd = 0xffffffff;
resource_size_t reg_lcd = 0x06511000;
if (!(gpio_lcd = ioremap(reg_lcd, 0x1000))) {
pr_err("io remap failed\n");
return -EBUSY;
}
void __iomem *reg_addr_lcd = (void __iomem *)(gpio_lcd+0x88);
u32 value_lcd = readl(reg_addr_lcd);
value_lcd = modify_bits(value_lcd, 24, 26, 0x7); // 0x7000000
writel(value_lcd, reg_addr_lcd);
iounmap(gpio_lcd);
}