我有个在early_initcall启动一个定时器,去操作GPIO喂外部看门狗的需求,但我用下面的代码,不能操作GPIO.请问应该如何改来操作GPIO
#if 1#include <linux/timer.h>//P0_0#define GPIO_BASE_ADDR 0x11030000 // 假设的 GPIO 基地址,根据实际情况调整#define GPIO_DIRECTION_OFFSET 0x120 // 假设 GPIO 方向寄存器偏移#define GPIO_DATA_OFFSET 0x10 // 假设 GPIO 数据寄存器偏移#define GPIO_PIN 0x00 // 假设 GPIO 数据寄存器偏移static struct timer_list my_timer;static unsigned char s_ucGpioVal = 0; #define PM_OUTPUT 0x2 /* Output Mode (disable Input) */#define PM_MASK 0x03static int rzg2l_gpio_set_value( int value){ void __iomem *vpReg; unsigned char ucVal; vpReg = GPIO_BASE_ADDR + GPIO_DATA_OFFSET; ucVal = ioread8(vpReg); if (value){ ucVal |= 1; } else{ ucVal &= 0xFE; } iowrite8(ucVal,vpReg); return 0;}static int rzg2l_gpio_set_out(void){ void __iomem *vpReg; unsigned short usVal; vpReg = GPIO_BASE_ADDR + GPIO_DIRECTION_OFFSET; usVal = ioread16(vpReg); usVal = usVal & ~(PM_MASK << (GPIO_PIN * 2)); usVal = usVal | (PM_OUTPUT << (GPIO_PIN * 2)); iowrite32(usVal,vpReg); return 0;}static void my_timer_callback(struct timer_list *t) { // 定时器回调函数 printk("my_timer_callback\n"); #if 1 // 1. 设置 GPIO 为输出 rzg2l_gpio_set_out();#if 1 // 2. 设置 GPIO 输出高电平 if(s_ucGpioVal==0){ s_ucGpioVal = 1; rzg2l_gpio_set_value(s_ucGpioVal); }else{ s_ucGpioVal = 0; rzg2l_gpio_set_value(s_ucGpioVal); }#endif#endif // 如果需要重复定时,可以在这里重新启动定时器 mod_timer(&my_timer, jiffies + msecs_to_jiffies(1000));} static void __init liyang_init(void) { printk("liyang_init\n"); timer_setup(&my_timer, my_timer_callback, 0); mod_timer(&my_timer, jiffies + msecs_to_jiffies(1000));}early_initcall(liyang_init);#endif