ひでみのアイデア帳

くだらないことなんだけど、忘れないために・・・

ADIドライバのエラー

linux-xlnx+ADI7511ドライバマージのエラーが見えてきた。

何度かトライすると下記のようなエラーメッセージなった。


DEBUG: Executing shell function do_compile

NOTE: make -j 4 uImage CC=arm-poky-linux-gnueabi-gcc  -mno-thumb-interwork -marm LD=arm-poky-linux-gnueabi-ld.bfd   UIMAGE_LOADADDR=0x8000

  CHK     include/generated/uapi/linux/version.h

  CHK     include/generated/utsrelease.h

  CC      scripts/mod/devicetable-offsets.s

  GEN     scripts/mod/devicetable-offsets.h

  HOSTCC  scripts/mod/file2alias.o

  HOSTLD  scripts/mod/modpost

make[1]: `include/generated/mach-types.h'' is up to date.

  CALL    scripts/checksyscalls.sh

  CHK     include/generated/compile.h

  CHK     kernel/config_data.h

  CC      sound/soc/adi/adv7511_hdmi.o

  CC      drivers/gpu/drm/adi_axi_hdmi/axi_hdmi_crtc.o

sound/soc/adi/adv7511_hdmi.c:41:13: error: ''SND_SOC_DAIFMT_SPDIF'' undeclared here (not in a function)

  .dai_fmt = SND_SOC_DAIFMT_SPDIF |

             ^

make[3]: *** [sound/soc/adi/adv7511_hdmi.o] Error 1

make[2]: *** [sound/soc/adi] Error 2

make[1]: *** [sound/soc] Error 2

make: *** [sound] Error 2

make: *** Waiting for unfinished jobs....

drivers/gpu/drm/adi_axi_hdmi/axi_hdmi_crtc.c: In function ''axi_hdmi_crtc_update'':

drivers/gpu/drm/adi_axi_hdmi/axi_hdmi_crtc.c:53:28: error: ''struct xilinx_dma_config'' has no member named ''hsize''

   axi_hdmi_crtc->dma_config.hsize = mode->hdisplay * fb->bits_per_pixel / 8;

                            ^

drivers/gpu/drm/adi_axi_hdmi/axi_hdmi_crtc.c:54:28: error: ''struct xilinx_dma_config'' has no member named ''vsize''

   axi_hdmi_crtc->dma_config.vsize = mode->vdisplay;

                            ^

drivers/gpu/drm/adi_axi_hdmi/axi_hdmi_crtc.c:55:28: error: ''struct xilinx_dma_config'' has no member named ''stride''

   axi_hdmi_crtc->dma_config.stride = fb->pitches[0];

                            ^

make[4]: *** [drivers/gpu/drm/adi_axi_hdmi/axi_hdmi_crtc.o] Error 1

make[3]: *** [drivers/gpu/drm/adi_axi_hdmi] Error 2

make[2]: *** [drivers/gpu/drm] Error 2

make[1]: *** [drivers/gpu] Error 2

make: *** [drivers] Error 2

ERROR: oe_runmake failed

WARNING: /mnt/disk1/yocto/yocto_2013.8_3/poky/build/tmp/work/zedboard_aquaxis-poky-linux-gnueabi/linux-xlnx/3.10-xilinx+git7f5d01bf5fbac64ac42781d061582fa51dd14a37-r1/temp/run.do_compile.7181:1 exit 1 from

  exit 1

ERROR: Function failed: do_compile (log file is located at /mnt/disk1/yocto/yocto_2013.8_3/poky/build/tmp/work/zedboard_aquaxis-poky-linux-gnueabi/linux-xlnx/3.10-xilinx+git7f5d01bf5fbac64ac42781d061582fa51dd14a37-r1/temp/log.do_compile.7181)


つまり、

ひとつはsound/soc/adi/adv7511_hdmi.cのSND_SOC_DAIFMT_SPDIFが見つからないこと。

もうひとつはdrivers/gpu/drm/adi_axi_hdmi/axi_hdmi_crtc.cのaxi_hdmi_crtc->dma_config構造体っぽい。

SND_SOC_DAIFMT_SPDIFが無い件

前者はADIのLinuxリポジトリと見比べるしか無い。

SND_SOC_DAIFMT_SPDIFはおそらく、標準ヘッダの中に書かれてるっぽい。

ADIのLinuxリポジトリを検索すると下記のようになったので標準ヘッダに書かれているのは正解だった。

drivers/gpu/drm/i2c/adv7511_audio.c:157:    case SND_SOC_DAIFMT_SPDIF:

sound/soc/adi/adv7511_hdmi.c:41:    .dai_fmt = SND_SOC_DAIFMT_SPDIF |

include/sound/soc-dai.h:36:#define SND_SOC_DAIFMT_SPDIF        8 / SPDIF /

しかし、Driverにも使っている部分があったな。

meldでdiffを表示してみると・・・

差分が表示されない。

こういうことあるんだ・・・

改めて、diffコマンドで、

< #define SND_SOC_DAIFMT_SPDIF        8 / SPDIF /

これだけなのでmeldの件は良いとして、これはファイル差し替えで解決だな。

axi_hdmi_crtc->dma_config構造体

構造体が悪いのはなんだろうか?

これもADIのLinuxリポジトリと差分を取るしかなさそうだ。

これはdrivers/gpu以下を単純に探してみると下記になった。

axi_hdmi_crtc.c:53:        axi_hdmi_crtc->dma_config.hsize = mode->hdisplay * fb->bits_per_pixel / 8;

axi_hdmi_crtc.c:54:        axi_hdmi_crtc->dma_config.vsize = mode->vdisplay;

axi_hdmi_crtc.c:55:        axi_hdmi_crtc->dma_config.stride = fb->pitches[0];

axi_hdmi_crtc.c:58:            (unsigned long)&axi_hdmi_crtc->dma_config),

58行目は下記なのでこれもどこか標準のところにあるんだな。

        dmaengine_device_control(axi_hdmi_crtc->dma, DMA_SLAVE_CONFIG,

            (unsigned long)&axi_hdmi_crtc->dma_config),

って、axi_dmaだけど・・・

こんな感じの構造体です。

struct axi_hdmi_crtc {

    struct drm_crtc drm_crtc;

    struct dma_chan *dma;

    struct xilinx_dma_config dma_config;

    int mode;

};

ここからcontainer_ofでdrm_crtcを抜き出して、dma_configにしているようです。

朝の解析はここまで後は夜に解析する。