t113-c-内核字符型设备驱动篇

发布时间 2023-07-05 16:18:17作者: 悠闲的小莫

那么既然ko的驱动已经可以运行,那么我们来写几个简单的操作设备树的内核驱动

字符型设备驱动和应用层

这俩种代码是分开的,设备驱动调用的是内核的地址,而应用层则是相当于虚拟地址,所以应用层传递参数的时候不能直接付给指针,要调用相对于的参数

内核->驱动->应用

驱动的编写

找到sdk内的例程,按照例程去写ko文件

ko文件的编写

先照着写一份结构体,写上拥有者、打开、写入、读取、释放的操作函数

应用层编写

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

//一个参数个数一个参数字符串
int main(int argc,char *argv[])
{
    int flie;
    size_t count;
    char readbuffer[100];
    flie = open(argv[1],O_RDWR);
    if(flie<0)
    {
        printf("failed to open\r\n");
    }
    else
    {
        printf("open it\r\n");
    }

    count = read(flie,readbuffer,50);//返回实际读取的数量,如果为副则失败
    if(count<0)
    {
        printf("failed to read\r\n");
    }
    else
    {
        printf("read it\r\n");
    }

    count = write(flie,"nihao",6);
    if(count<0)//如果为负数失败并且错误类型保存在全局变量errno中,
    {
        printf("failed to read\r\n");
    }
    else
    {
        printf("write it\r\n");
    }

    count = close(flie);
    if(count<0)//如果为负数失败并且错误类型保存在全局变量errno中,
    {
        printf("close to read\r\n");
    }
    else
    {
        printf("close it\r\n");
    }

    return 0;
}

编写makefile

KEDIR = /home/momo/T113/Tina-Linux/lichee/linux-5.4
CROSS_COMPILESS = /home/momo/T113/Tina-Linux/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-musl/toolchain/bin/arm-openwrt-linux-muslgnueabi-

CURRENT-PATH := $(shell pwd)

obj-m := chabasemo.o

build: kernel_modules

kernel_modules:
			${MAKE} ARCH=arm CROSS_COMPILE=$(CROSS_COMPILESS) -C ${KEDIR} M=${CURRENT-PATH} modules
			$(CROSS_COMPILESS)gcc -o chabase chabase.c 
clean:
			${MAKE} ARCH=arm CROSS_COMPILE=$(CROSS_COMPILESS) -C ${KEDIR} M=${CURRENT-PATH} clean
			rm -rf modules.order
			rm -f chabase

cmake后就可以得到ko和可执行文件

记住要用

make ARCH=arm CROSS_COMPILE=~/T113/Tina-Linux/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-musl/toolchain/bin/arm-openwrt-linux-muslgnueabi-

命令

运行

通过modinfo查看ko文件详细信息