OpenWrt 之 MT7628 移植第三方SPI驅動

1、在OpenWrt系統上移植SPI驅動前,首先要確保SPI相關引腳未被複用爲其他功能,比如GPIO;以下操作已假定該條件成立,否則請修改相關dts和c文件中複用配置;

2、打開dts配置文件進行修改,這裏我是用的硬件爲WRTNODE2R,所以文件路徑爲:/target/linux/ramips/dts/WRTNODE2R.dts。在SPI控制器節點下添加與我們要添加的SPI設備及驅動匹配的信息,如下所示:

要注意該段代碼要添加到SPI控制器節點下,爲防止添加錯誤後面會給出這部分整段的SPI配置。

Note1 配置中“reg”屬性有2個CELL,第一個用於指定片選;

Note2 配置中“compatible”參數需要與SPI設備驅動中字段相匹配,如下爲我使用的第三方SPI設備驅動中相關配置:

#define CH43X_NAME_SPI		"ch43x_spi"

static const struct of_device_id __maybe_unused ch43x_dt_ids[] = {
	{ .compatible = "wch,ch43x",	.data = &ch43x_devtype, },
	{},
};
MODULE_DEVICE_TABLE(of, ch43x_dt_ids);

static struct spi_driver ch43x_spi_uart_driver = {
   .driver = {
	   .name   = CH43X_NAME_SPI,
	   .bus    = &spi_bus_type,
	   .owner  = THIS_MODULE,
	   .of_match_table = of_match_ptr(ch43x_dt_ids),
   },
   .probe          = ch43x_spi_probe,
   .remove         = ch43x_spi_remove,
};

在一般情況下,匹配的信息應該是代碼中“compatible ”的字符串,也即“wch,ch43x”,但這裏匹配的具有特殊性,原因可能爲系統修改過有關。匹配的是spi_drvier中,driver的name字符串,也即:"ch43x_spi";

Note3 如上的dts配置中有2行信息,是與中斷相關的。本意是想實現通過dts配置interrupts節點後,在spi設備驅動中通過struct spi_device *spi結構體中的spi->irq獲取相應IO口的中斷號實現中斷功能,奈何在本硬件平臺上用不了,之所以保留是因爲很多其他平臺可以通過這種方式來配置和獲取中斷。本平臺使用中斷方法會在其他博客中涉及。

完整SPI部分的dts配置:

spi0: spi@b00 {
			status = "okay";

			m25p80@0 {
				#address-cells = <1>;
				#size-cells = <1>;
				compatible = "w25q256";
				reg = <0 0>;
				linux,modalias = "m25p80", "w25q256";
				spi-max-frequency = <10000000>;
				m25p,chunked-io = <32>;

				partition@0 {
					label = "u-boot";
					reg = <0x0 0x30000>;
					read-only;
				};

				partition@30000 {
					label = "u-boot-env";
					reg = <0x30000 0x10000>;
					read-only;
				};

				factory: partition@40000 {
					label = "factory";
					reg = <0x40000 0x10000>;
					read-only;
				};

				partition@50000 {
					label = "firmware";
					reg = <0x50000 0x1fb0000>;
				};
			};

			spidev@1 {
				#address-cells = <1>;
				#size-cells = <1>;
	//			compatible = "wch,ch43x";
				compatible = "ch43x_spi";
				reg = <1 0>;
				spi-max-frequency = <5000000>;
				interrupt-parent = <&gpio0>;
				interrupts = <0 2>;
			};
		};

3、OpenWrt系統中添加驅動模塊

首先在目錄package/kernel下創建自己的模塊目錄ch432,目錄結構如下 :

rambo@ubuntu:~/OpenWrt/wrtnode/package/kernel$ tree ch432
ch432
├── Makefile
└── src
    ├── ch432.c
    ├── Kconfig
    └── Makefile

1 directory, 4 files

至於裏面的Makefile文件和Kconfig文件如何寫,不建議照抄我的或網上找的,直接在package/kernel拷貝其他模塊的,基於那個調整最快捷有效!而且拷貝那種最簡單的就可以。這裏拷貝button-hotplug這個驅動模塊,然後照葫蘆畫瓢,修改成編譯我們驅動的樣式。(傻瓜式做法:直接把裏面涉及到驅動文件名的統一換成你要編譯的驅動文件名就可以)比如這裏第一級的Makefile,如下:

#
# Copyright (C) 2008-2010 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#

include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk

PKG_NAME:=ch432
PKG_RELEASE:=3

include $(INCLUDE_DIR)/package.mk

define KernelPackage/ch432
  SUBMENU:=Other modules
  TITLE:=ch432 spi driver
  DEPENDS:=+kmod-input-core
  FILES:=$(PKG_BUILD_DIR)/ch432.ko
  AUTOLOAD:=$(call AutoLoad,30,ch432,1)
  KCONFIG:=
endef

define KernelPackage/ch432/description
  Kernel module to generate button uevent-s from input subsystem events.
  If your device uses GPIO buttons, see gpio-button-hotplug.
endef

EXTRA_KCONFIG:= \
	CONFIG_CH432=m

EXTRA_CFLAGS:= \
	$(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(EXTRA_KCONFIG)))) \
	$(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(EXTRA_KCONFIG)))) \

MAKE_OPTS:= \
	ARCH="$(LINUX_KARCH)" \
	CROSS_COMPILE="$(TARGET_CROSS)" \
	SUBDIRS="$(PKG_BUILD_DIR)" \
	EXTRA_CFLAGS="$(EXTRA_CFLAGS)" \
	$(EXTRA_KCONFIG)

define Build/Prepare
	mkdir -p $(PKG_BUILD_DIR)
	$(CP) ./src/* $(PKG_BUILD_DIR)/
endef

define Build/Compile
	$(MAKE) -C "$(LINUX_DIR)" \
		$(MAKE_OPTS) \
		modules
endef

$(eval $(call KernelPackage,ch432))

第二級src目錄下的Kconfig文件如下:

config CH432
    tristate "This is CH432"

Makefile如下:

obj-$(CONFIG_CH432) += ch432.o

實際上我就把這3個文件中原有的字符串“button-hotplug”換成了“ch432”而已。

Note1 你要編譯的驅動源文件和頭文件一定也要放在這個src目錄下。

4、下面配置內核,把我們添加到package中的模塊選中就可以了。執行,“make menuconfig”:

然後在“Kernel Modules” -> "Other Modules"下找到我們添加的模塊,選中它就可以了。

配置結束,下面只編譯模塊就可以了。不需要編譯整個內核。編譯命令爲:

make package/kernel/ch432/compile V=s

Note1 因爲spi驅動可以動態加載調試,所以建議編譯成模塊,不要靜態編譯,不然調試和看驅動log都不方便。

5、編譯生成的驅動模塊路徑爲:

ko原生驅動模塊路徑:

build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7628/ch432/

ipk文件路徑爲:

bin/ramips/packages/base/

將如上ko文件或者ipk拷貝到硬件上面就可以正常使用了。記得SPI驅動調試第一步,insmod之後確認spi_probe有沒有正常執行!!!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章