使用gpio_get_value 可以讀到值
但是使用readl 卻讀不到值
另外不曉得是否有人發現gpio_set_value這個function非常慢
當我去控制up & down 從示波器看這段時間是30ns
是否有辦法讓這段時間在縮短 目標是達到1ns
以下是read程式 讀GPN12值 使用readl 讀不到值
static int __init dev_init(void)
{
int ret;
ret = misc_register(&misc);
// DB0~7
gpio_request_one(PIN_DB0, GPIOF_DIR_IN, "GPN0");
gpio_request_one(PIN_DB1, GPIOF_DIR_IN, "GPN1");
gpio_request_one(PIN_DB2, GPIOF_DIR_IN, "GPN2");
gpio_request_one(PIN_DB3, GPIOF_DIR_IN, "GPN3");
gpio_request_one(PIN_DB4, GPIOF_DIR_IN, "GPN4");
gpio_request_one(PIN_DB5, GPIOF_DIR_IN, "GPN5");
gpio_request_one(PIN_DB6, GPIOF_DIR_IN, "GPN8"); // DB6
gpio_request_one(PIN_DB7, GPIOF_DIR_IN, "GPN10"); // DB7
// CONVST
gpio_request_one(PIN_CONVST, GPIOF_OUT_INIT_LOW, "GPH1");
gpio_set_value(PIN_CONVST, 1);
printk("PIN_CONVST = %d\n", gpio_get_value(PIN_CONVST));
// UNBLANK
gpio_request_one(PIN_UNBLANK, GPIOF_DIR_IN, "GPH4");
printk("PIN_UNBLANK = %d\n", gpio_get_value(PIN_UNBLANK));
printk("EOC is %d\n", gpio_get_value( S3C64XX_GPN(12)) );
gpio_set_value(PIN_CONVST, 1);
gpio_set_value(PIN_CONVST, 0);
gpio_set_value(PIN_CONVST, 1);
uint32_t index = 0;
uint32_t reg1 = readl( S3C64XX_GPNDAT );
uint32_t reg2;
printk("Reg1 is %x\n", reg1);
do
{
reg2 = readl( S3C64XX_GPNDAT );
if ( reg1 != reg2 )
printk("Different %x\n", reg2);
}while( index++ < 0x07FFFFFF );
printk (DEVICE_NAME"\tinitialized\n");
return ret;
}
另外採用gpio_get_value, 這樣就能讀到值, 不過速度太慢
while( gpio_get_value( S3C64XX_GPN(12) == 0 ) && index++ < 100000 )
{
printk("EOC is Low index %d %x %d\n", index, readl( S3C64XX_GPNDAT ), gpio_get_value( S3C64XX_GPN(12)) );
break;
}
所以才想採用readl 直接讀, 這樣速度也許會快點
是否有人有經驗
感謝~