# lubancat_linux_driver **Repository Path**: yigelunzi/lubancat_linux_driver ## Basic Information - **Project Name**: lubancat_linux_driver - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-01-21 - **Last Updated**: 2024-01-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # LubanCat_RK系列驱动教程配套例程 ## 使用 把该例程linux_driver放到内核源码的同级目录下: . ├── kernel └── linux_driver linux_driver中内核模块makefile的KERNEL_DIR都是指向kernel/build。 ## 环境 PC系统:ubuntu18.04 板卡系统:ubuntu20.04 ## 配套教程 **《 嵌入式Linux驱动开发实战指南——基于LubanCat_RK系列板卡 》** W: 校验数字签名时出错。此仓库未被更新,所以仍然使用此前的索引文件。GPG 错误:https://apt.kitware.com/ubuntu bionic InRelease: 由于没有公钥,无法验证下列签名: NO_PUBKEY 1A127079A92F09ED W: 无法下载 https://apt.kitware.com/ubuntu/dists/bionic/InRelease 由于没有公钥,无法验证下列签名: NO_PUBKEY 1A127079A92F09ED W: 部分索引文件下载失败。如果忽略它们,那将转而使用旧的索引文件。 该问题可以忽略 fatal: 不是一个 git 仓库(或者任何父目录) 解决办法: 先执行 git init 即可 scp hellomodule.ko cat@192.168.137.100:/home/cat/driver 重启后正常情况下我们可以在“/proc/device-tree”或者“/sys/firmware/devicetree/base/”目录下找到设备节点同名的文件夹,证明设备树插件已经加载成功。如果没有出现相应的节点,很可能是与其他节点冲突,可以修改lubancat-test-overlay.dts的内容为配置文件中其他插件的内容再进行测试。 虽然没有找到节点,但在dev目录下找到了 将内核模块存放板卡到/lib/modules/4.19.232/kernel目录,然后执行depmod -a后,再查看modules.dep配置文件可以发现calculation.ko依赖parametermodule.ko,并且modules.dep还记录了模块的存放位置。如下图所示: modprobe加载 执行modprobe calculation命令自动将会parametermodule.ko模块加载,然后再加载calculation.ko模块。 自动加载的模块统一放到“/lib/modules/内核版本”目录下,内核版本使用’uname -r’查询,测试使用的是4.19.232; 其次使用depmod建立模块之间的依赖关系,命令’ depmod -a’; 这个时候我们就可以在modules.dep中看到模块依赖关系,可以使用如下命令查看; cat /lib/modules/4.19.232/modules.dep | grep hellomodule 自动加载模块配置文件 最后在/etc/modules或者/etc/modules-load.d/.conf中加上我们自己的模块,注意在该配置文件中,模块 不写成.ko形式 代表该模块与内核紧耦合,有些是系统必须要跟内核紧耦合,比如mm子系统, 一般写成.ko形式比较好,如果出现错误不会导致内核出现panic错误,如果集成到内核,出错了就会出现panic。 自动加载模块配置文件 然后重启开发板,lsmod就能查看到我们的模块开机就被加载到内核里面了。 sudo apt install git ssh make gcc libssl-dev liblz4-tool u-boot-tools curl expect g++ patchelf chrpath gawk texinfo chrpath diffstat binfmt-support qemu-user-static live-build bison flex fakeroot cmake gcc-multilib g++-multilib unzip device-tree-compiler python3-pip libncurses5-dev python3-pyelftools dpkg-dev 【python】错误SyntaxError: invalid syntax的解决方法总结 python版本问题,将python2切换成python3 #查看当前系统安装的Python版本有哪些 ls /usr/bin/python* #将python链接到python3 sudo ln -sf /usr/bin/python3 /usr/bin/python #重新查看默认Python版本 python -V oled屏 sdd1306驱动 使用spi比i2c快非常多 /driver/staging/fbtft/fb_ssd1306.c /driver/video/fbdev/ssd1307fb.c 其中fb_ssd1306是基于spi驱动,内核定义了一种新的设备结构fbtft,主要用于spi接口的tftlcd,例如ili9341,ili9320等, ssd1307fb.c 实现了基于iic 接口驱动,同时支持ssd1306和ssd1307两种芯片。驱动代码通过设备树来判断到底是ssd1306还是ssd1307. iic在内核源码目录中执行make menuconfig Device Drivers ----------->Graphics support ------>Frame buffer Devices --->Solomon SSD1307 framebuffer supportocation: 设备树 &i2c3 { status = "okay"; clock-frequency = <3400000>; ssd1306: ssd1306@3c { compatible = "solomon,ssd1306fb-i2c"; reg = <0x3c>; solomon,width=<128>; solomon,height=<64>; solomon,page-offset=<0>; //reset-gpios=<&gpio1 RK_PA4 GPIO_ACTIVE_LOW>; solomon,com-invdir; status = "okay"; }; }; spi │ │ -> Device Drivers │ │ -> Staging drivers (STAGING [=y]) │ │ (1) -> Support for small TFT LCD display modules (FB_TFT [=y]) 内核图形配置使用“/”进行搜索 设备树 &spi3 { status = "okay"; #address-cells = <1>; #size-cells = <0>; // SPI gpio模拟多个cs信号 pinctrl-names = "default", "high_speed"; pinctrl-0 = <&spi3_cs0 &spi3_cs1 &spi3m1_pins>; pinctrl-1 = <&spi3_cs0 &spi3_cs1 &spi3m1_pins_hs>; cs-gpios = <&gpio4 RK_PC6 GPIO_ACTIVE_LOW>, <&gpio4 RK_PC4 GPIO_ACTIVE_LOW>; ssd1306@0 { compatible = "solomon,ssd1306"; reg = <0>; spi-max-frequency = <1000000>; rotate = <0>; bgr; fps = <30>; buswidth = <8>; reset-gpios = <&gpio1 RK_PB2 GPIO_ACTIVE_LOW>; dc-gpios = <&gpio1 RK_PB1 GPIO_ACTIVE_LOW>; debug = <0>; }; /*spi_dev@00 { compatible = "rockchip,spidev"; reg = <0>; //chip select 0:cs0 1:cs1 spi-max-frequency = <24000000>; //spi output clock };*/ spi_dev@01 { compatible = "rockchip,spidev"; reg = <1>; spi-max-frequency = <24000000>; }; }; mpu6050,内核自带mpu6050 iic iio驱动 内核图形配置界面搜索 设备树 mpu6050: mpu6050@68 { compatible = "invensense,mpu6050"; reg = <0x68>; interrupt-parent = <&gpio1>; interrupts = ; mount-matrix = "-0.984807753012208", /* x0 */ "0", /* y0 */ "-0.173648177666930", /* z0 */ "0", /* x1 */ "-1", /* y1 */ "0", /* z1 */ "-0.173648177666930", /* x2 */ "0", /* y2 */ "0.984807753012208"; /* z2 */ }; 查看驱动是否加载成功 What: /sys/bus/iio/devices/iio:deviceX/in_gyro_matrix What: /sys/bus/iio/devices/iio:deviceX/in_accel_matrix What: /sys/bus/iio/devices/iio:deviceX/in_magn_matrix st7789驱动 设备树 &spi3 { status = "okay"; #address-cells = <1>; #size-cells = <0>; // SPI gpio模拟多个cs信号 pinctrl-names = "default", "high_speed"; pinctrl-0 = <&spi3_cs0 &spi3_cs1 &spi3m1_pins>; pinctrl-1 = <&spi3_cs0 &spi3_cs1 &spi3m1_pins_hs>; cs-gpios = <&gpio4 RK_PC6 GPIO_ACTIVE_LOW>, <&gpio4 RK_PC4 GPIO_ACTIVE_LOW>; ssd1306@0 { compatible = "solomon,ssd1306-no"; reg = <0>; spi-max-frequency = <24000000>; //1000000 rotate = <0>; bgr; fps = <30>; buswidth = <8>; reset-gpios = <&gpio1 RK_PB2 GPIO_ACTIVE_LOW>; dc-gpios = <&gpio1 RK_PB1 GPIO_ACTIVE_LOW>; debug = <0>; }; st7789v@1 { compatible = "sitronix,st7789v"; reg = <1>; spi-max-frequency = <36000000>;//spi-max-frequency = <100000>; rotate = <0>; rgb; fps = <60>; buswidth = <8>; reset-gpios = <&gpio3 RK_PC4 GPIO_ACTIVE_HIGH>; dc-gpios = <&gpio3 RK_PC5 GPIO_ACTIVE_HIGH>; power-supply = <&gpio3 RK_PC1 GPIO_ACTIVE_LOW>; //width=<135>; //height=<240>; debug = <0>; backlight = <&pwm10>; spi-cpol; spi-cpha; }; /*spi_dev@00 { compatible = "rockchip,spidev"; reg = <0>; //chip select 0:cs0 1:cs1 spi-max-frequency = <24000000>; //spi output clock }; spi_dev@01 { compatible = "rockchip,spidev"; reg = <1>; spi-max-frequency = <24000000>; };*/ };