手机版
你好,游客 登录 注册 搜索
背景:
阅读新闻

在Ubuntu上为Android系统编写Linux内核驱动程序

[日期:2011-07-21] 来源:Linux社区  作者:Luoshengyang [字体: ]

最后,定义模块加载和卸载方法,这里只要是执行设备注册和初始化操作:

  1. /*初始化设备*/  
  2. static int  __hello_setup_dev(struct hello_Android_dev* dev) {  
  3.     int err;  
  4.     dev_t devno = MKDEV(hello_major, hello_minor);  
  5.   
  6.     memset(dev, 0, sizeof(struct hello_android_dev));  
  7.   
  8.     cdev_init(&(dev->dev), &hello_fops);  
  9.     dev->dev.owner = THIS_MODULE;  
  10.     dev->dev.ops = &hello_fops;          
  11.   
  12.     /*注册字符设备*/  
  13.     err = cdev_add(&(dev->dev),devno, 1);  
  14.     if(err) {  
  15.         return err;  
  16.     }          
  17.   
  18.     /*初始化信号量和寄存器val的值*/  
  19.     init_MUTEX(&(dev->sem));  
  20.     dev->val = 0;  
  21.   
  22.     return 0;  
  23. }  
  24.   
  25. /*模块加载方法*/  
  26. static int __init hello_init(void){   
  27.     int err = -1;  
  28.     dev_t dev = 0;  
  29.     struct device* temp = NULL;  
  30.   
  31.     printk(KERN_ALERT"Initializing hello device./n");          
  32.   
  33.     /*动态分配主设备和从设备号*/  
  34.     err = alloc_chrdev_region(&dev, 0, 1, HELLO_DEVICE_NODE_NAME);  
  35.     if(err < 0) {  
  36.         printk(KERN_ALERT"Failed to alloc char dev region./n");  
  37.         goto fail;  
  38.     }  
  39.   
  40.     hello_major = MAJOR(dev);  
  41.     hello_minor = MINOR(dev);          
  42.   
  43.     /*分配helo设备结构体变量*/  
  44.     hello_dev = kmalloc(sizeof(struct hello_android_dev), GFP_KERNEL);  
  45.     if(!hello_dev) {  
  46.         err = -ENOMEM;  
  47.         printk(KERN_ALERT"Failed to alloc hello_dev./n");  
  48.         goto unregister;  
  49.     }          
  50.   
  51.     /*初始化设备*/  
  52.     err = __hello_setup_dev(hello_dev);  
  53.     if(err) {  
  54.         printk(KERN_ALERT"Failed to setup dev: %d./n", err);  
  55.         goto cleanup;  
  56.     }          
  57.   
  58.     /*在/sys/class/目录下创建设备类别目录hello*/  
  59.     hello_class = class_create(THIS_MODULE, HELLO_DEVICE_CLASS_NAME);  
  60.     if(IS_ERR(hello_class)) {  
  61.         err = PTR_ERR(hello_class);  
  62.         printk(KERN_ALERT"Failed to create hello class./n");  
  63.         goto destroy_cdev;  
  64.     }          
  65.   
  66.     /*在/dev/目录和/sys/class/hello目录下分别创建设备文件hello*/  
  67.     temp = device_create(hello_class, NULL, dev, "%s", HELLO_DEVICE_FILE_NAME);  
  68.     if(IS_ERR(temp)) {  
  69.         err = PTR_ERR(temp);  
  70.         printk(KERN_ALERT"Failed to create hello device.");  
  71.         goto destroy_class;  
  72.     }          
  73.   
  74.     /*在/sys/class/hello/hello目录下创建属性文件val*/  
  75.     err = device_create_file(temp, &dev_attr_val);  
  76.     if(err < 0) {  
  77.         printk(KERN_ALERT"Failed to create attribute val.");                  
  78.         goto destroy_device;  
  79.     }  
  80.   
  81.     dev_set_drvdata(temp, hello_dev);          
  82.   
  83.     /*创建/proc/hello文件*/  
  84.     hello_create_proc();  
  85.   
  86.     printk(KERN_ALERT"Succedded to initialize hello device./n");  
  87.     return 0;  
  88.   
  89. destroy_device:  
  90.     device_destroy(hello_class, dev);  
  91.   
  92. destroy_class:  
  93.     class_destroy(hello_class);  
  94.   
  95. destroy_cdev:  
  96.     cdev_del(&(hello_dev->dev));  
  97.   
  98. cleanup:  
  99.     kfree(hello_dev);  
  100.   
  101. unregister:  
  102.     unregister_chrdev_region(MKDEV(hello_major, hello_minor), 1);  
  103.   
  104. fail:  
  105.     return err;  
  106. }  
  107.   
  108. /*模块卸载方法*/  
  109. static void __exit hello_exit(void) {  
  110.     dev_t devno = MKDEV(hello_major, hello_minor);  
  111.   
  112.     printk(KERN_ALERT"Destroy hello device./n");          
  113.   
  114.     /*删除/proc/hello文件*/  
  115.     hello_remove_proc();          
  116.   
  117.     /*销毁设备类别和设备*/  
  118.     if(hello_class) {  
  119.         device_destroy(hello_class, MKDEV(hello_major, hello_minor));  
  120.         class_destroy(hello_class);  
  121.     }          
  122.   
  123.     /*删除字符设备和释放设备内存*/  
  124.     if(hello_dev) {  
  125.         cdev_del(&(hello_dev->dev));  
  126.         kfree(hello_dev);  
  127.     }          
  128.   
  129.     /*释放设备号*/  
  130.     unregister_chrdev_region(devno, 1);  
  131. }  
  132.   
  133. MODULE_LICENSE("GPL");  
  134. MODULE_DESCRIPTION("First Android Driver");  
  135.   
  136. module_init(hello_init);  
  137. module_exit(hello_exit);  
linux
相关资讯       Ubuntu教程  Android教程 
本文评论   查看全部评论 (1)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款
第 1 楼
* 夜风雪 发表于 2013/4/24 17:31:35
觉得里面有错误