💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
学习驱动一定要掌握驱动的模型,platform总线在内核中用的非常频繁,还有一个是Input输入子系统,platform总线的好处是,inux从2.6起就加入了一套新的驱动管理和注册的机制platform平台总线,是一条虚拟的总线,设备用platform_device表示,驱动用platform_driver进行注册。于传统的bus/device/driver机制相比,platform由内核进行统一管理,在驱动中使用资源,提高了代码的安全性和可移植性。当硬件部分的时序变了或者芯片替换了,我们只需要修改硬件部分的代码,还有一部分代码是属于内核的稳定部分是不用修改的,这就是一种通用的接口。 ~~~ 1、定义一个platform_device,并注册      /* 硬件部分 */ 2、定义一个platform_driver,并注册    /* 稳定部分 */ ~~~ ~~~ bus_dev_drv模型 dev:(属于不稳定的部分) platform_device_register(&led_dev); static struct resource led_resource[] = { platform_device_unregister(&led_dev); static struct resource led_resource[] = {     [0] = {         .start = 0x56000010,           //gpio_con gpio_dat两个寄存器占八个字节         .end   = 0x56000010 + 8 - 1,//所以需要映射长八个字节         .flags = IORESOURCE_MEM,     },     [1] = {         .start  = 8,         .end   = 8,         .flags = IORESOURCE_IRQ,     } }; static void led_release(struct device * dev) { } static struct platform_device led_dev = { .name         = "myled", .id       = -1, .num_resources    = ARRAY_SIZE(led_resource), .resource     = led_resource, .dev = {  .release = led_release,  }, }; drv:(稳定的部分) struct platform_driver led_drv = { .probe  = led_probe, .remove  = led_remove, .driver  = { .name = "myled", } }; platform_driver_register(&led_drv); platform_driver_unregister(&led_drv); res = platform_get_resource(pdev, IORESOURCE_MEM, 0); res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);//这两个函数用开获取资源 ~~~ tips:在这里这个结构体里面的name必须和dev里面的name一致,只有相同的时候才会调用led_probe其他的跟写普通的字符设备驱动是不变的 这里建讲解一个小的技巧,当映射多个连续的地址时候,我们定义成结构体,映射成结构体的地址 ~~~ struct s3c_ts_regs { unsigned long adccon; unsigned long adctsc; unsigned long adcdly; unsigned long adcdat0; unsigned long adcdat1; unsigned long adcupdn; }; ~~~ struct s3c_ts_regs    *s3c_ts_regs;   /* 定义结构体指针,结构体成员必须是4字节对齐 */ s3c_ts_regs = ioremap(0x58000000, sizeof(struct s3c_ts_regs));