Port, Pin 설정

STM 개발 보드의 Port와 Pin 설정을 위해 회로도를 확인한다. SPI의 NSS, SCK, MISO, MOSI 라인이 각각 PI1, PI2, PI3, PI4에 연결되어 있으므로 해당 설정을 적용하기 위해 다음을 수정한다.

$ vi linux/arch/arm/mach-stm32/iomux.c

본 글에서는 SPI2 인터페이스를 연결하여 SPI 디바이스를 제어할 것이다. iomux.c에 보면 다음과 같은 소스코드가 있다. 해당 소스 코드의 Port와 Pin을 회로도 라인과 맞게 설정한다.

#if defined(CONFIG_STM32_SPI2)
        gpio_dsc.port = 8;  /* CLCK */
        gpio_dsc.pin  = 1;
        stm32f2_gpio_config(&gpio_dsc, STM32F2_GPIO_ROLE_SPI2);
 
        gpio_dsc.port = 8;  /* DI */
        gpio_dsc.pin  = 2;
        stm32f2_gpio_config(&gpio_dsc, STM32F2_GPIO_ROLE_SPI2);
 
        gpio_dsc.port = 8;  /* DO */
        gpio_dsc.pin  = 3;
        stm32f2_gpio_config(&gpio_dsc, STM32F2_GPIO_ROLE_SPI2);
 
        gpio_dsc.port = 8;  /* CS */
        gpio_dsc.pin  = 0;
        stm32f2_gpio_config(&gpio_dsc, STM32F2_GPIO_ROLE_OUT);
#endif

장치 등록

Platform Device로 장치를 등록하기 위해 다음을 수정한다.

$ vi linux/arch/arm/mach-stm32/spi.c

위 소스파일에 보면 stm32_spi_init() 함수가 존재한다. 해당 함수의 마지막에 다음 소스코드를 추가한다.

else if(p == PLATFORM_STM32_STM3240G_EVAL)
{
    static struct spi_stm32_slv 
        spi_stm32_slv_test = {
            .cs_gpio = 0, 
            .timeout = 3,
        };
    static struct spi_board_info 
        spi_stm32_test_info = {
            .modalias = "spidev",
            .max_speed_hz = 10 * 1000 * 1000,
            .bus_num = 1,
            .chip_select = 0,
            .controller_data = &spi_stm32_slv_test,
            .mode = SPI_MODE_1,
        };
 
    spi_register_board_info(&spi_stm32_test_info, 
            sizeof(spi_stm32_test_info) / 
            sizeof(struct spi_board_info));
}

리눅스 커널 설정

STM 보드의 SPI를 사용하기 위해서는 커널 설정이 요구된다.

Device Drivers --->
   [*] SPI support --->
      <*> STM32 SPI Controller
      <*> User mode SPI device driver support

먼저 STM32에서 제공하는 SPI 디바이스 드라이버 사용을 위해서는 “STM32 SPI Controller”를 Enable 시키고 mdev를 이용해 device node를 찾기 위해서는 “User mode SPI device driver support”를 Enable 해야 한다.

STM32 에서 제공하는 SPI 인터페이스를 Enable 하기 위해서는 위와 같은 설정이 요구된다.

참고