Armadilloフォーラム

Armadillo-610のメモリマップについて

takahashi_stepone

2022年8月4日 20時08分

現在、外部モジュール(動的リンク)のデバイスドライバを開発しております。
GPIOなどの各レジスタにアクセスを行いたいのですが、
ioremapで指定するアドレスは「IMX6ULLRM.pdf」に記載されているアドレスをそのまま使用すればよろしいでしょうか?
 例えば
  GPIO data register であれば 0x0209C000 で アクセスが可能?

よろしくお願いいたします。

コメント

at_mizo

2022年8月8日 9時38分

溝渕です。

> GPIOなどの各レジスタにアクセスを行いたいのですが、
> ioremapで指定するアドレスは「IMX6ULLRM.pdf」に記載されているアドレスをそのまま使用すればよろしいでしょうか?
>  例えば
>   GPIO data register であれば 0x0209C000 で アクセスが可能?

可能と思いますが、すでに実装済みのGPIOドライバと競合するのでおすすめしません。

Linuxでは、ハードウェアアクセスの競合を避ける為に、通常1つのデバイスへのアクセスは1つのドライバが行います。

例えば、i2c-gpio(GPIOを利用したI2Cバス)ドライバでは、次のようにGPIOを扱っています。

drivers/i2c/busses/i2c-gpio.c:
static int i2c_gpio_probe(struct platform_device *pdev)
{
 :snip
	if (pdev->dev.of_node) {
		//device treeからgpioを取得0
		ret = of_i2c_gpio_get_pins(pdev->dev.of_node,
					   &sda_pin, &scl_pin);
 
 :snip
	//SDAピンのgpioを要求(これによってアクセスを排他可能)
	ret = devm_gpio_request(&pdev->dev, sda_pin, "sda");
 :snip
	//入出力方向を設定
	if (pdata->sda_is_open_drain) {
		gpio_direction_output(pdata->sda_pin, 1);

(Armadillo-640の例ですが)device treeでは上記GPIOを次のように指定しています。

arch/arm/boot/dts/armadillo-640_con9_awl13_rtc.dts:
	i2c-gpio1 {
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_i2c_gpio1>;
 
		#address-cells = <1>;
		#size-cells = <0>;
		compatible = "i2c-gpio";
		gpios = <
			&gpio3 24 GPIO_ACTIVE_HIGH	/* SDA */
			&gpio3 23 GPIO_ACTIVE_HIGH	/* SCL */
		>;
		i2c-gpio,delay-us = <2>;

ご参考になれば。