.probe в коде модуля ядра Linux не выполняется - PullRequest
0 голосов
/ 20 сентября 2019

Я новичок в кодировании драйвера ядра Linux.

Я пробовал что-то похожее на код в Код драйвера в модуле ядра не выполняется? .Я использовал этот код, чтобы опробовать мой первый драйвер.

#include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/of_irq.h>
#include <linux/of_gpio.h>

#define DEVICE_NAME "hello-1.00.a"
#define DRIVER_NAME "hello"
MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(struct platform_device *pdev){
    printk(KERN_ALERT "Hello, world\n");
    return 0;
}
static int hello_exit(struct platform_device *pdev){
    printk(KERN_ALERT "Goodbye, cruel world\n");
    return 0;
}

static const struct of_device_id myled_of_match[] =
{
    {.compatible = DEVICE_NAME},
    {},
};

MODULE_DEVICE_TABLE(of, myled_of_match);

static struct platform_driver hello_driver =
  {
   .driver = {
          .name = DRIVER_NAME,
          .owner = THIS_MODULE,
          .of_match_table = myled_of_match
          },
   .probe = hello_init,
   .remove = hello_exit,
  };

module_platform_driver(hello_driver);

Мое дерево dts выглядит следующим образом, в bcm2837-rpi-3-b-plus.dts:

// SPDX-License-Identifier: GPL-2.0
/dts-v1/;
#include "bcm2837.dtsi"
#include "bcm2836-rpi.dtsi"
#include "bcm283x-rpi-lan7515.dtsi"
#include "bcm283x-rpi-usb-host.dtsi"

/ {
    compatible = "raspberrypi,3-model-b-plus", "brcm,bcm2837";
    model = "Raspberry Pi 3 Model B+";

    chosen {
        /* 8250 auxiliary UART instead of pl011 */
        stdout-path = "serial1:115200n8";
    };

    memory {
        reg = <0 0x40000000>;
    };

    leds {
        act {
            gpios = <&gpio 29 GPIO_ACTIVE_HIGH>;
        };

        pwr {
            label = "PWR";
            gpios = <&expgpio 2 GPIO_ACTIVE_LOW>;
        };
    };


    wifi_pwrseq: wifi-pwrseq {
        compatible = "mmc-pwrseq-simple";
        reset-gpios = <&expgpio 1 GPIO_ACTIVE_LOW>;
    };

    hello {
        compatible="hello-1.00.a";
        reg = <0x41220000 0x10000>;
        status = "okay";
    };
};

&firmware {
    expgpio: gpio {
        compatible = "raspberrypi,firmware-gpio";
        gpio-controller;
        #gpio-cells = <2>;
        gpio-line-names = "BT_ON",
                  "WL_ON",
                  "STATUS_LED",
                  "LAN_RUN",
                  "",
                  "CAM_GPIO0",
                  "CAM_GPIO1",
                  "";
        status = "okay";
    };
};

&hdmi {
    hpd-gpios = <&gpio 28 GPIO_ACTIVE_LOW>;
};

&pwm {
    pinctrl-names = "default";
    pinctrl-0 = <&pwm0_gpio40 &pwm1_gpio41>;
    status = "okay";
};

/* SDHCI is used to control the SDIO for wireless */
&sdhci {
    #address-cells = <1>;
    #size-cells = <0>;
    pinctrl-names = "default";
    pinctrl-0 = <&emmc_gpio34>;
    status = "okay";
    bus-width = <4>;
    non-removable;
    mmc-pwrseq = <&wifi_pwrseq>;

    brcmf: wifi@1 {
        reg = <1>;
        compatible = "brcm,bcm4329-fmac";
    };
};

/* SDHOST is used to drive the SD card */
&sdhost {
    pinctrl-names = "default";
    pinctrl-0 = <&sdhost_gpio48>;
    status = "okay";
    bus-width = <4>;
};

/* uart0 communicates with the BT module */
&uart0 {
    pinctrl-names = "default";
    pinctrl-0 = <&uart0_ctsrts_gpio30 &uart0_gpio32 &gpclk2_gpio43>;
    status = "okay";

    bluetooth {
        compatible = "brcm,bcm43438-bt";
        max-speed = <2000000>;
        shutdown-gpios = <&expgpio 0 GPIO_ACTIVE_HIGH>;
    };
};

/* uart1 is mapped to the pin header */
&uart1 {
    pinctrl-names = "default";
    pinctrl-0 = <&uart1_gpio14>;
    status = "okay";
};

Я скомпилировал код, используя следующий make-файл:

# Comment/uncomment the following line to disable/enable debugging
#DEBUG = y


# Add your debugging flag (or not) to CFLAGS
ifeq ($(DEBUG),y)
  DEBFLAGS = -O -g -DSILABS_DEBUG # "-O" is needed to expand inlines
else
  DEBFLAGS = -O2
endif


LDDINC := $(PWD)/../../kernel/include/linux
LDDINC += -I$(PWD)/../../kernel/include
LDDINC += -I$(PWD)/../../kernel/include/asm
EXTRA_CFLAGS += $(DEBFLAGS)
EXTRA_CFLAGS += -I$(LDDINC)

ifneq ($(KERNELRELEASE),)
# call from kernel build system

scull-objs := hello.o

obj-m   := hello.o

else

KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD       := $(shell pwd)

modules:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

endif


clean:
    rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions

depend .depend dep:
    $(CC) $(EXTRA_CFLAGS) -M *.c > .depend


ifeq (.depend,$(wildcard .depend))
include .depend
endif

Однако, когда я скомпилировал код ядра и обновил ядро ​​RPI, как показано ниже:

make bcm2709_defconfig
make -j4 zImage modules dtbs
sudo make modules_install
sudo cp arch/arm/boot/dts/*.dtb /boot/
sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/
sudo cp arch/arm/boot/zImage /boot/kernel2.img

(после изменения значения ядрав config.txt в / boot для kernel2) и sudo insmod hello.ko, я не получаю вывод с помощью dmesg.

Я прошу кого-то любезно указать, где я иду не так и как это правильно сделать.

Спасибо и наилучшими пожеланиями --SSB

Редактировать:Исправлена ​​ошибка в коде DTS.Это все еще не работает.Я получаю сообщение: загрузка модуля из дерева портит kernel.uname -a отчеты: raspberrypi 4.19.60-v7 + kernel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...