测试环境:ubuntu10.4;linux-2.6.32;mini2440
挂到 platform_bus总线上,要有两个,一个是设备,另外一个是驱动。
一.首先在板级配置文件中添加platform_devices,板级配置文件路径:
arch/arm/mach-s3c2440/mach-mini2440.c
首先添加platform_devices结构体:
- static struct platform_device globalfifo_device ={
- .name = "globalfifo",
- .id = -1,
- };
再添加到结构体platform_devices到mini2440_devices指针数组中:
- static struct platform_device *mini2440_devices[] __initdata = {
- &s3c_device_usb,
- &s3c_device_rtc,
- &s3c_device_lcd,
- &s3c_device_wdt,
- &s3c_device_i2c0,
- &s3c_device_iis,
- &mini2440_device_eth,
- &s3c24xx_uda134x,
- &s3c_device_nand,
- &s3c_device_sdi,
- &s3c_device_usbgadget,
- &globalfifo_device,
- };
以上就完成了就platform_devices结构体的添加,设备注册由函数platform_add_devices调用数组mini2440_devices.
二:写驱动文件globalfifo.c,附件
这里贴出init和probe函数,因为下面将会打印这两个函数的log消息,执行init函数说明,该驱动文件被编译,执行probe函数,说明驱动找到对应device
- static int __init globalfifo_init(void)
- {
- printk("globalfifo init init init init init init\n");
- return platform_driver_register(&globalfifo_device_driver);
- }
- static void __exit globalfifo_exit(void)
- {
- platform_driver_unregister(&globalfifo_device_driver);
- }
- static int __devinit globalfifo_probe(struct platform_device *pdev)
- {
- int ret;
- dev_t devno = MKDEV(globalfifo_major, 0);
- //申请设备号
- if (globalfifo_major)
- ret = register_chrdev_region(devno, 1, "globalfifo");
- else //动态申请设备号
- {
- ret = alloc_chrdev_region(&devno, 0, 1, "globalfifo");
- globalfifo_major = MAJOR(devno);
- }
- printk("globalfifo probe probe probe probe probe probe\n");
- if (ret < 0)
- return ret;
- /* 动态申请设备结构体的内存 */
- globalfifo_devp = kmalloc(sizeof(struct globalfifo_dev), GFP_KERNEL);
- if (!globalfifo_devp)
- {
- ret = -ENOMEM;
- goto fail_malloc;
- }
- memset(globalfifo_devp, 0, sizeof(struct globalfifo_dev));
- globalfifo_setup_cdev(globalfifo_devp, 0);
- init_MUTEX(&globalfifo_devp->sem); //初始化信号量
- init_waitqueue_head(&globalfifo_devp->r_wait); //初始化读等待队列头
- init_waitqueue_head(&globalfifo_devp->w_wait); // 初始化写等待队列头
- return 0;
- fail_malloc:unregister_chrdev_region(devno, 1);
- return ret;
- }
三.把这两个文件放到linux-2.6.32内核中
(1)直接用修改的mach-mini2440.c文件覆盖原来的文件即可
(2)个人把globalfifo.c放到linux-2.6.32.2/drivers/platform/目录下,并且修改对应目录下的Makefile和Kconfig;
Makefile添加:
obj-$(CONFIG_GLOBALFIFO) += globalfifo.o
Kconfig添加
config GLOBALFIFO
bool "globalfifo"
default y
help
add platform_driver globalfifo.
当然以上有些内容根据自己需求添加。四.直接编译内核 make zImage
然后下载内核文件zImage到开发板中;在开机时候我截取了部分片段:
上面可以看出打印了init函数和probe函数的打印log消息
并且在系统启动起来,在/sys/devices/platform/下面会有设备globfifo
看图,有图有真相文中所提附件:
globalfifo.rar
阅读(1991) | 评论(0) | 转发(0) |