2019年8月14日 星期三

Linux GPIO Host Controller驅動程式



目前課程影片進行到CH3-3 Linux GPIO Host Controller驅動程式,有一些問題如下:

  1. 01_LED中chr_led.c使用gpio_set_value對GPIO Pin設定輸出值,往Kernel Source Code追: gpio_set_value -> __gpio_set_value -> gpiod_set_raw_value -> _gpiod_set_raw_value ->


    static void _gpiod_set_raw_value(struct gpio_desc *desc, bool value)
    {
            struct gpio_chip        *chip;

            chip = desc->chip;
            trace_gpio_value(desc_to_gpio(desc), 0, value);
            if (test_bit(FLAG_OPEN_DRAIN, &desc->flags))
                    _gpio_set_open_drain_value(desc, value);
            else if (test_bit(FLAG_OPEN_SOURCE, &desc->flags))
                    _gpio_set_open_source_value(desc, value);
            else
                    chip->set(chip, gpio_chip_hwgpio(desc), value);
    }

    追到最後是課程影片中提到的struct gpio_chip,但是課程提供的Image中找不到bcm2708_gpio.c這個檔案,struct gpio_chip中的function應該都是實作在這個檔案中?
        ~/linux-rpi-4.4.y/drivers/bcma/driver_gpio.c  ==> gpio chip driver 
  1. 根據課程影片,gpio_set_value是上層API,由Kernel定義。struct gpio_chip中的function pointer實作則為底層硬體相關,這個部分理論上應該是SoC廠實作並提供給客戶嗎?想知道業界實務上怎麼分配?實務上,如果拿到一塊公版,SoC Vendor會提供整包Linux或Android Source Code,我們只需要針對自己選擇的外接硬體寫驅動程式嗎?
       
            
  1. SoC Vendor是否連Driver Template都會一起提供於整包OS Source Code中,只需要修改對應硬體部分?譬如,選擇的Display不同,選擇的Sensor不同,只需要在module_init()中修改初始化代碼?

             晶片廠通常提供的BSP ,會做好大部份SoC Driver. 若是自己自行外接的, 則要靠自己去撰寫或移植

             同類型硬體其Driver 寫法差異不大,所以可以參考現有的code去修改即可.. 

沒有留言 :

張貼留言