- 论坛徽章:
- 0
|
各位高手:
本人目前在写一个操作led灯的IC驱动,但是在使用GPIO模拟时序时,会被打断,使用spin_lock_irqsave也不起作用,代码如下:
#define DELAY_TDS udelay(10)
#define DELAY_THLB udelay(2)
#define DELAY_TLLB udelay(4)
#define DELAY_THHB udelay(4)
#define DELAY_TLHB udelay(2)
#define DELAY_TEODL udelay(2)
#define DELAY_TEODH udelay(400)
#define DELAY_TSD mdelay(2)
void ktd202x_send_bit(struct ktd202x_data *data,int bit_data)
{
if (bit_data == 0) {
gpio_set_value(data->ctrl_gpio, 0);
DELAY_TLLB;
gpio_set_value(data->ctrl_gpio, 1);
DELAY_THLB;
} else {
gpio_set_value(data->ctrl_gpio, 0);
DELAY_TLHB;
gpio_set_value(data->ctrl_gpio, 1);
DELAY_THHB;
}
}
/* Write a complete command including address, data and EOD */
void ktd202x_send_data(struct ktd202x_data *data,unsigned char byte_address, unsigned char byte_data)
{
int n;
unsigned long flags;
printk(KERN_ERR"address = %d,data = %d\n" ,byte_address,byte_data);
spin_lock_irqsave(&data->led_lock, flags);
/* Set Ctrl High */
gpio_set_value(data->ctrl_gpio, 1);
DELAY_TDS;
/* Write Byte Address (only 4 bits) */
/* MSB first, start at xxxx 1xxx */
for (n = 0; n < 4; n++) {
ktd2024_send_bit(data,(byte_address & 0x0 ? 1 : 0);
byte_address = byte_address << 1;
}
/* Write Byte Data (8 bits) */
/* MSB first, start at 1xxx xxxx */
for (n = 0; n < 8; n++) {
ktd2024_send_bit(data,(byte_data & 0x80) ? 1 : 0);
byte_data = byte_data << 1;
}
/* Write EOD */
gpio_set_value(data->ctrl_gpio, 0);
DELAY_TEODL;
gpio_set_value(data->ctrl_gpio, 1);
spin_unlock_irqrestore(&data->led_lock, flags);
DELAY_TEODH;
}
这个应该如何解决,是否还有其他方式去写这个IC的寄存器?请高手指点. |
|