Chinaunix首页 | 论坛 | 博客
  • 博客访问: 215063
  • 博文数量: 27
  • 博客积分: 527
  • 博客等级: 中士
  • 技术积分: 262
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-07 19:52
文章分类
文章存档

2013年(6)

2012年(21)

分类: LINUX

2012-09-17 23:48:39

测试环境:ubuntu10.4;linux-2.6.32;mini2440

挂到
platform_bus
总线上,要有两个,一个是设备,另外一个是驱动。

一.首先在板级配置文件中添加
platform_devices,板级配置文件路径:
arch/arm/mach-s3c2440/mach-mini2440.c

首先添加
platform_devices结构体:

点击(此处)折叠或打开

  1. static struct platform_device globalfifo_device ={
  2. .name = "globalfifo",
  3. .id = -1,
  4. };
再添加到结构体platform_devices到mini2440_devices指针数组中

点击(此处)折叠或打开

  1. static struct platform_device *mini2440_devices[] __initdata = {
  2. &s3c_device_usb,
  3. &s3c_device_rtc,
  4. &s3c_device_lcd,
  5. &s3c_device_wdt,
  6. &s3c_device_i2c0,
  7. &s3c_device_iis,
  8. &mini2440_device_eth,
  9. &s3c24xx_uda134x,
  10. &s3c_device_nand,
  11. &s3c_device_sdi,
  12. &s3c_device_usbgadget,
  13. &globalfifo_device,
  14. };
以上就完成了就platform_devices结构体的添加,设备注册由函数platform_add_devices调用数组mini2440_devices.

二:写驱动文件globalfifo.c,附件
这里贴出init和probe函数,因为下面将会打印这两个函数的log消息,执行init函数说明,该驱动文件被编译,执行probe函数,说明驱动找到对应device

点击(此处)折叠或打开

  1. static int __init globalfifo_init(void)
  2. {
  3. printk("globalfifo init init init init init init\n");
  4. return platform_driver_register(&globalfifo_device_driver);
  5. }
  6. static void __exit globalfifo_exit(void)
  7. {
  8. platform_driver_unregister(&globalfifo_device_driver);
  9. }

  10. static int __devinit globalfifo_probe(struct platform_device *pdev)
  11. {
  12. int ret;
  13. dev_t devno = MKDEV(globalfifo_major, 0);

  14. //申请设备号
  15. if (globalfifo_major)
  16. ret = register_chrdev_region(devno, 1, "globalfifo");
  17. else //动态申请设备号
  18. {
  19. ret = alloc_chrdev_region(&devno, 0, 1, "globalfifo");
  20. globalfifo_major = MAJOR(devno);
  21. }
  22. printk("globalfifo probe probe probe probe probe probe\n");

  23. if (ret < 0)
  24. return ret;
  25. /* 动态申请设备结构体的内存 */
  26. globalfifo_devp = kmalloc(sizeof(struct globalfifo_dev), GFP_KERNEL);
  27. if (!globalfifo_devp)
  28. {
  29. ret = -ENOMEM;
  30. goto fail_malloc;
  31. }

  32. memset(globalfifo_devp, 0, sizeof(struct globalfifo_dev));

  33. globalfifo_setup_cdev(globalfifo_devp, 0);

  34. init_MUTEX(&globalfifo_devp->sem); //初始化信号量
  35. init_waitqueue_head(&globalfifo_devp->r_wait); //初始化读等待队列头
  36. init_waitqueue_head(&globalfifo_devp->w_wait); // 初始化写等待队列头

  37. return 0;

  38. fail_malloc:unregister_chrdev_region(devno, 1);
  39. return ret;
  40. }


三.把这两个文件放到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) |
0

上一篇:C语言的const

下一篇:git rebase 使用

给主人留下些什么吧!~~