主题 : GPIO read 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 74673
精华: 0
发帖: 15
金钱: 75 两
威望: 15 点
综合积分: 30 分
注册时间: 2012-07-27
最后登录: 2012-12-23
楼主  发表于: 2012-12-06 16:17

 GPIO read

使用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 直接讀, 這樣速度也許會快點

是否有人有經驗
感謝~
级别: 侠客
UID: 24708
精华: 0
发帖: 94
金钱: 480 两
威望: 96 点
综合积分: 188 分
注册时间: 2010-07-13
最后登录: 2023-04-23
1楼  发表于: 2012-12-06 16:39
读写的速度是怎么测的? 看示波器准吗? 这里应该还有个充放电过程吧?
好奇 读的速度怎么测?
乃要这么快的GPIO的读写速度干吗咩?
级别: 新手上路
UID: 74673
精华: 0
发帖: 15
金钱: 75 两
威望: 15 点
综合积分: 30 分
注册时间: 2012-07-27
最后登录: 2012-12-23
2楼  发表于: 2012-12-06 17:18
看示波器
是因為控制外部硬體外部硬體spec要求的
级别: 侠客
UID: 24708
精华: 0
发帖: 94
金钱: 480 两
威望: 96 点
综合积分: 188 分
注册时间: 2010-07-13
最后登录: 2023-04-23
3楼  发表于: 2012-12-06 18:47
示波器怎么知道你读了?