<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      學無止境-Linux-申請設備號注意事項

      備注:學習記錄所用,若有高手不吝賜教,萬分感謝!

      申請設備號過程現在基本都是如下:

      #define N_DEVS_MINOR		32
      
      if(major) {
      		devno = MKDEV(major, 0);
      		ret = register_chrdev_region(devno, N_DEVS_MINOR, DEV_NAME);
      	}
      	else{
      		ret = alloc_chrdev_region(&devno, 0, N_DEVS_MINOR, DEV_NAME);
      		major = MAJOR(devno);
      		minor = MINOR(devno);
      	}
          if (ret)
      		goto fail_chrdev;

      網上對于設備號的解釋也基本如下:設備號分為主設備號和次設備號。其中主設備號是用來區分不同類別的設備,而次設備號用來區分一類設備中的不同個體。

      需要注意的是:以上的申請過程摻雜有次設備號在里面,所以容易忽視“同類別設備”和“個體設備”的區分;上面代碼申請的設備號實際上主要是“用來區分不同類別的設備”。

      而想要為同一類別設備的不同個體申請設備號,則應該按以下流程:

          1、按照上面的代碼申請一個設備號(也可以直接當作:同類設備的第一個個體的設備號)。

               個人理解這一步主要是用來申請“主設備號”,也就是用來區分設備的類別,此處的DEV_NAME也應該是設備類別名(如:spi),而不是個體設備名(如:spi0、spi1)。

               申請完成后應該將主設備號:major = MAJOR(devno);記錄下來,以供為其他不同個體申請設備號時使用。

          2、為其他不同個體申請設備號:

      /*為一類設備申請設備號“空間”,
      假如這一類設備一共可以有32個不同的個體*/
      #define N_DEVS_MINOR		32
      static DECLARE_BITMAP(minors, N_DEVS_MINOR); 
      
      /*從“空間”中為個體申請一個子設備號*/
      minor = find_first_zero_bit(minors, N_DEVS_MINOR);
      /*這里的主設備號,就是從第一步申請的設備號中獲取出來的*/
      devno = MKDEV(major, minor);
      
      再做其他過程,如:
      err = cdev_add(&cdev, devno, N_DEVS_MINOR);
      dev = device_create(class, NULL, devno, NULL, name);
      
      /*設備注冊完成之后,將已經申請的個體子設備號“鎖住”,
       申請主設備號(也是第一個設備的主次設備號)時,是否要鎖子設備號待驗證*/
      set_bit(minor, minors);

      所以可以這么寫:

      #define N_DEVS_MINOR		32
      static DECLARE_BITMAP(minors, N_DEVS_MINOR);
      
      /*也可以直接給定一個值,
      先“cat /proc/devices”查看當前有哪些已經被申請的設備號,
      避免沖突*/
      int major = 0;
      
      void func_register_devt()
      {
          if(major) {
              devno = MKDEV(major, 0);
              ret = register_chrdev_region(devno, N_DEVS_MINOR, DEV_NAME);
          }
          else{
              ret = alloc_chrdev_region(&devno, 0, N_DEVS_MINOR, DEV_NAME);
              major = MAJOR(devno);
              //minor = MINOR(devno); 個人認為沒必要記錄
          }
          if (ret)
              goto fail_chrdev;
      }
      
      void func_register_spi_device(char *name, int id)
      {
          int minor = 0;
          dev_t devno = 0;
       
          minor = find_first_zero_bit(minors, N_DEVS_MINOR);
          devno = MKDEV(major, minor);
          sprintf(name, "spi-%d", id);
      
          ……
          cdev_add(&cdev, devno, N_DEVS_MINOR);
          dev = device_create(class, NULL, devno, NULL, name);
          ……
      
          set_bit(minor, minors);
          
          ……
      }

       設備號申請函數調用一次即可。

       這只是一種代碼格式,只要保證申請主設備號的過程只執行一次就行。

      注:設備號充足的情況下,為每個個體都單獨申請一個主設備號也沒事。

      posted @ 2025-01-02 20:03  xMofang  閱讀(49)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 人妻精品久久无码专区涩涩| 韩国午夜福利片在线观看| 日本亲近相奷中文字幕| av无码一区二区大桥久未| 秋霞在线观看片无码免费不卡| 鄂托克旗| 一区二区三区四区自拍视频| 成人亚洲av免费在线| 久久国产成人高清精品亚洲| 插入中文字幕在线一区二区三区| 欧洲亚洲国内老熟女超碰| 国产精品视频一区二区亚瑟| 亚洲精品国产一二三区| 石原莉奈日韩一区二区三区 | 国产一区一一区高清不卡| a国产一区二区免费入口| 亚洲午夜成人精品电影在线观看| 国产精品一区二区三区卡| 无码人妻一区二区三区在线视频| 久热综合在线亚洲精品| 又黄又爽又色的少妇毛片| 国产好大好硬好爽免费不卡| 芷江| 国产熟女高潮一区二区三区 | 欧美经典人人爽人人爽人人片| 国产麻豆成人传媒免费观看| 亚洲中文无码永久免费| 国精品午夜福利视频不卡| 亚洲综合精品第一页| 国产乱色熟女一二三四区| 亚洲av午夜成人片| 亚洲精品成人片在线观看精品字幕| 九色综合国产一区二区三区| 亚洲成人高清av在线| 久久精品99国产国产精 | 亚洲国产精品久久久久婷婷老年 | 陕西省| 精品国精品国产自在久国产应用男 | 久久夜色撩人精品国产av| 91亚洲精品一区二区三区| 国产果冻豆传媒麻婆精东|