亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

怎樣優雅的將Docker Registry中容器鏡像遷移至Harbor

2024-06-09 16:59:46
字體:
來源:轉載
供稿:網友
前言
上一篇文章中最后在操作led燈的硬件時候,我們是直接讀的原理圖,去操作的寄存器,這種情況是我們絕大多數情況下會這樣子進行操作,而本章我們的核心重點是使用總線機制,也就是通過修改設備樹的方法來操作硬件。
 
涉及到的概念介紹
1.總線的概念
總線是處理器與一個或者多個設備之間的通道。在設備模型中,所有的設備都通過總線相連。甚至是那些內部的虛擬“平臺”總線??偩€可以相互插入,比如一個USB控制器通常是一個PCI設備。設備模型展示了總線和它們所控制的設備之間的連接。
 
1.驅動程序
1.1 總線的使用邏輯首先調用
 
為了正確地注冊到內核,所有的platform驅動程序都必須創建的主要結構體是struct platform_driver結構體。該結構體由許多回調函數和變量組成,向platform描述了platform驅動程序。所以我們需要寫一個struct platform_driver結構體。然后在其中有兩個比較重要的回調函數:probe和remove
 
int (*probe)(…)指向platform驅動程序中的探測函數的指針。當platform核心有一個它認為驅動程序需要控制的struct platform_device時,就會調用該函數。所以我們會在這個函數中寫驅動程序的邏輯。
int (*remove)(…)指向一個移除函數的指針,當struct platform_device被從系統中移除,或者platform驅動程序正在從內核中卸載時,platform核心調用該函數。
為了把struct platform_driver注冊到platform核心中,需要調用以struct platform_driver為參數的platform_driver_register函數。通常在platform驅動程序的模塊化代碼中完成該工程。
 
當platform驅動程序將要被卸載的時候,需要把struct platform_driver從內核注銷。這是通過調用platform_driver_unregister完成的。
 
1.2 完整實現代碼
 
#include <linux/module.h>
#include <linux/poll.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/miscdevice.h>
#include <linux/kernel.h>
#include <linux/major.h>
#include <linux/mutex.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/stat.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/tty.h>
#include <linux/kmod.h>
#include <linux/gfp.h>
#include <linux/gpio/consumer.h>
#include <linux/platform_device.h>
#include <linux/of_gpio.h>
#include <linux/of_irq.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/slab.h>
#include <linux/fcntl.h>
#include <linux/timer.h>
#include <linux/workqueue.h>
#include <asm/current.h>
static int major;
static struct class *sr501_class;
static struct gpio_desc *sr501_gpio;
static int irq;
static int sr501_data = 0;   
static wait_queue_head_t sr501_wq;
/* 實現對應的open/read/write等函數,填入file_operations結構體                   */
static ssize_t sr501_drv_read (struct file *file, char __user *buf, size_t size, loff_t *offset)
{
#if 0
    int val;
    int len = (size < 4)? size : 4;
     
    val = gpiod_get_value(sr501_gpio);  
    copy_to_user(buf, &val, len);
    return len;
#else
    int val;
    int len = (size < 4)? size : 4;
    /* 1. 有數據就copy_to_uesr */
    /* 2. 無數據就休眠:  放入某個鏈表 */
    wait_event_interruptible(sr501_wq, sr501_data);  
    copy_to_user(buf, &sr501_data, len);
    sr501_data = 0;
    return len;
#endif
}
 
static unsigned int sr501_drv_poll(struct file *fp, poll_table * wait)
{
    return 0;
}
/* 定義自己的file_operations結構體                                              */
static struct file_operations sr501_fops = {
    .owner   = THIS_MODULE,
    .read    = sr501_drv_read,
    .poll    = sr501_drv_poll,
};
static irqreturn_t sr501_isr(int irq, void *dev_id)
{
    printk("%s %s line %d ", __FILE__, __FUNCTION__, __LINE__);
    /* 1. 記錄數據 */
    sr501_data = 1;
    /* 2. 喚醒APP:去同一個鏈表把APP喚醒 */
    wake_up(&sr501_wq);  
    return IRQ_HANDLED;
}
/* 1. 從platform_device獲得GPIO
 * 2. gpio=>irq
 * 3. request_irq
 */
static int sr501_probe(struct platform_device *pdev)
{
    /* 1. 獲得硬件信息 */
    sr501_gpio = gpiod_get(&pdev->dev, NULL, 0);
    gpiod_direction_input(sr501_gpio);
    irq = gpiod_to_irq(sr501_gpio);
    request_irq(irq, sr501_isr, IRQF_TRIGGER_RISING|IRQF_TRIGGER_FALLING, "sr501", NULL);
    /* 注冊file_operations    */
    major = register_chrdev(0, "sr501", &sr501_fops);   
 
    sr501_class = class_create(THIS_MODULE, "sr501_class");
    if (IS_ERR(sr501_class)) {
        printk("%s %s line %d ", __FILE__, __FUNCTION__, __LINE__);
        unregister_chrdev(major, "sr501");
        return PTR_ERR(sr501_class);
    }
    /* 2. device_create */
    device_create(sr501_class, NULL, MKDEV(major, 0), NULL, "sr501");
 
    return 0;
}
static int sr501_remove(struct platform_device *pdev)
{
    device_destroy(sr501_class, MKDEV(major, 0));
    class_destroy(sr501_class);
    unregister_chrdev(major, "sr501");
}
static const struct of_device_id qzk_sr501[] = {
    { .compatible = "qzk,sr501" },
    { },
};
/* 1. 定義platform_driver */
static struct platform_driver sr501s_driver = {
    .probe      = sr501_probe,
    .remove     = sr501_remove,
    .driver     = {
        .name   = "qzk_sr501",
        .of_match_table = qzk_sr501,
    },
};
/* 2. 在入口函數注冊platform_driver */
static int __init sr501_init(void)
{
    int err;
    printk("%s %s line %d ", __FILE__, __FUNCTION__, __LINE__);
    init_waitqueue_head(&sr501_wq);
    err = platform_driver_register(&sr501s_driver);  
    return err;
}
/* 3. 有入口函數就應該有出口函數:卸載驅動程序時,就會去調用這個出口函數
 *     卸載platform_driver
 */
static void __exit sr501_exit(void)
{
    printk("%s %s line %d ", __FILE__, __FUNCTION__, __LINE__);
 
    platform_driver_unregister(&sr501s_driver);
}
/* 7. 其他完善:提供設備信息,自動創建設備節點                                     */
 
module_init(sr501_init);
module_exit(sr501_exit);
MODULE_LICENSE("GPL");
2.修改設備樹
2.1 修改思路
 
在上述驅動中of_device_id結構體中的.compatible = “qzk,sr501”,所以我們需要將設備樹中添加一個這樣的設備節點
 
2.2 修改代碼如下:
 
Linux-4.9.88/arch/arm/boot/dts/100ask_imx6ull-14x14.dts
 
HDF驅動框架探路(六):linux總線機制imx6ull驅動sr501紅外傳感器-鴻蒙HarmonyOS技術社區
3.應用側測試程序
 測試程序完成實現代碼
 
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
 
int main(int argc, char **argv)
{
    int fd;
    int val;
    fd = open("/dev/sr501", O_RDWR);
    if (fd == -1)
    {
        printf("can not open file %s ", argv[1]);
        return -1;
    }
 
    while (1)
    {
        read(fd, &val, 4);
        if (val == 0x1) {
            printf("detect people ");
        }
    }
     
    close(fd);
     
    return 0;
}
4.編譯
  make編譯驅動程序
 
KERN_DIR =  ~/imx6ullpro/Linux-4.9.88 # 板子所用內核源碼的目錄
all:
    make -C $(KERN_DIR) M=`pwd` modules
    $(CROSS_COMPILE)gcc -o sr501_test sr501_test.c
clean:
    make -C $(KERN_DIR) M=`pwd` modules clean
    rm -rf modules.order
obj-m += sr501_drv.o
直接執行make腳本執行上述Makefile生成測試程序和驅動ko文件
 

(編輯:武林網)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久国产免费| 亚洲影影院av| 91亚洲精品视频| 精品一区二区三区四区| 久精品免费视频| 欧美激情中文网| 欧美一级淫片播放口| 一区二区三区四区在线观看视频| 成人黄色在线观看| 国产成人avxxxxx在线看| 国产欧美精品一区二区| 91香蕉国产在线观看| 日本韩国欧美精品大片卡二| 精品久久香蕉国产线看观看gif| 国产亚洲欧美日韩一区二区| yellow中文字幕久久| 精品日本美女福利在线观看| 亚洲天堂网在线观看| 午夜精品福利电影| 欧美日韩国产成人在线观看| 欧美性受xxx| 国内精品久久久久久久| 国产成人精品视频在线观看| 日韩性生活视频| 精品国产精品三级精品av网址| 国产精品69久久久久| 午夜精品久久17c| 国产精品欧美亚洲777777| 欧美精品999| 91精品视频专区| 国产成人综合一区二区三区| 国产一区二区视频在线观看| 国产一区二区三区在线观看网站| 黑人狂躁日本妞一区二区三区| 俺也去精品视频在线观看| 欧美成人精品在线播放| 欧美在线免费视频| 色播久久人人爽人人爽人人片视av| 91久久精品国产91久久性色| 精品毛片三在线观看| 日韩欧美成人区| 国产视频精品免费播放| 欧美成人午夜激情视频| 欧美另类极品videosbest最新版本| 91精品国产乱码久久久久久久久| 久久久久久久久国产精品| 日本一区二区在线免费播放| 国产精品电影久久久久电影网| 91日韩在线视频| 亚洲精品欧美日韩| 日韩a**中文字幕| 91干在线观看| 91成人国产在线观看| 亚洲成人中文字幕| 欧美视频专区一二在线观看| 日本精品va在线观看| 亚洲美女精品久久| 亚洲精品网址在线观看| www国产亚洲精品久久网站| 在线日韩av观看| 久久精品99久久久久久久久| 欧美成人免费在线视频| 欧美日韩国产精品一区二区不卡中文| 国产一区二区三区日韩欧美| 欧美成年人网站| 国产精品爱啪在线线免费观看| 日韩女优在线播放| 日本久久久久久久| 日韩经典中文字幕| 欧美韩国理论所午夜片917电影| 亚洲国产天堂久久综合网| 欧美—级a级欧美特级ar全黄| 日韩有码在线播放| 国产一区二区三区免费视频| 亚洲999一在线观看www| 国产成人一区二区在线| 97精品国产aⅴ7777| 91成人免费观看网站| 亚洲第一av在线| 在线观看欧美视频| 中日韩美女免费视频网站在线观看| 97久久精品国产| 97超碰蝌蚪网人人做人人爽| 国产日韩欧美在线视频观看| 国产亚洲精品久久久久久牛牛| 国产精品久久久久7777婷婷| 另类少妇人与禽zozz0性伦| 亚洲精品xxxx| 国产精品爽爽爽| 久久久久北条麻妃免费看| 91av视频在线| 色狠狠久久aa北条麻妃| 国产精品福利无圣光在线一区| 在线视频国产日韩| 国产精品video| 久久高清视频免费| 国产精品丝袜久久久久久不卡| 亚洲精品一区二区三区不| 91sa在线看| 色琪琪综合男人的天堂aⅴ视频| 欧美麻豆久久久久久中文| 亚洲人成在线观看网站高清| 日韩欧美在线中文字幕| 最近2019年好看中文字幕视频| 亚洲老司机av| 91久久精品日日躁夜夜躁国产| 国产va免费精品高清在线观看| 国产精品一区二区三区成人| 亚洲一区二区在线| 日韩欧美在线国产| 亚洲精品中文字幕av| 欧美老女人性生活| 欧美人在线观看| 欧美激情一区二区久久久| 欧美电影免费观看高清| 黑人巨大精品欧美一区二区免费| 亚洲精品mp4| 成人黄色在线免费| 在线视频日韩精品| 久久久久久久一| 欧美国产极速在线| 欧美日韩亚洲精品一区二区三区| 国产日本欧美视频| 91视频免费网站| 国产精品人成电影| 奇米一区二区三区四区久久| 中文字幕国产亚洲| 色综合色综合网色综合| 国产视频亚洲精品| 欧美精品电影免费在线观看| 久久久久久亚洲精品中文字幕| 日韩电影中文字幕在线观看| 9.1国产丝袜在线观看| 日韩亚洲精品电影| 欧美国产精品人人做人人爱| 国产精品精品视频| 亚洲风情亚aⅴ在线发布| 久久夜色精品亚洲噜噜国产mv| 欧美亚洲视频一区二区| 国产精品日韩精品| 欧美成人午夜免费视在线看片| 欧美情侣性视频| 国产日韩在线观看av| 日韩精品在线观看一区| 91av视频在线免费观看| 97av在线视频| 国产精品白丝av嫩草影院| 国产精品自产拍在线观看| 成人动漫网站在线观看| 日韩在线观看成人| 久久伊人精品视频| 免费91麻豆精品国产自产在线观看| 国产精品视频区1| 欧美成人黄色小视频| 亚洲精品日韩av| 97精品国产97久久久久久| 亚洲国产私拍精品国模在线观看| 亚洲国产精品久久久久秋霞蜜臀| 亚洲va久久久噜噜噜久久天堂| 久久久久成人精品| 欧美精品videossex88| 51久久精品夜色国产麻豆| 欧洲美女7788成人免费视频| 欧美精品亚州精品|