查看: 5023|回复: 3

RioTboard 【上手试玩】编译驱动遇到问题【已解决】

[复制链接]
  • TA的每日心情
    开心
    2013-10-31 08:31
  • 签到天数: 16 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2014-5-10 07:16:30 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 gdmgb520 于 2014-5-10 07:51 编辑

    编译驱动
    1.搭建好开放环境:交叉编译工具链、uboot、源码目录,并编译好uboot和内核源码

    2.上传 globalmem.c 文件到内核源码目录下/drivers/char/ 目录

    3.修改该目录下Makefile文件,53行添加一行
    1. obj-m += globalmem.o
    复制代码
    4.设置编译器,切换到内核源码目录
    1. $ cd ~/linux-imx
    2. $ export ARCH=arm
    3. $ export CROSS_COMPILE=~/fsl-linaro-toolchain/bin/arm-fsl-linux-gnueabi-
    复制代码
    5.在内核源码目录,执行命令
    1. make modules
    复制代码
    此时输出:
    1. brain@brain-VirtualBox:~/linux-imx$ make modules
    2. CHK include/linux/version.h
    3. CHK include/generated/utsrelease.h
    4. make[1]: `include/generated/mach-types.h' is up to date.
    5. CALL scripts/checksyscalls.sh
    6. make[2]: *** No rule to make target `drivers/char/globalmem.c', needed by `drivers/char/globalmem.o'. Stop.
    7. make[1]: *** [drivers/char] Error 2
    8. make: *** [drivers] Error 2
    复制代码
    说是没有规则。

    网搜了些,尝试使用命令
    1. make M=drivers/char modules
    复制代码
    输出:
    1. make[1]: *** No rule to make target `drivers/char/globalmem.c', needed by `drivers/char/globalmem.o'.  Stop.
    2. make: *** [_module_drivers/char] Error 2
    复制代码
    请各位高手指点!!先谢谢啦!
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2013-10-31 08:31
  • 签到天数: 16 天

    连续签到: 1 天

    [LV.4]偶尔看看III

     楼主| 发表于 2014-5-10 07:50:17 | 显示全部楼层
    经过在网上搜索,发现可能的原因是
    1. No rule to make target `XXX'.

    2. No rule to make target ` XXX ', needed by `yyy'.

    3. 无法为重建目标“XXX”找到合适的规则,包括明确规则和隐含规则。



    4. 修正这个错误的方法是:在Makefile中添加一个重建目标的规则。其它可能导致这些错误的原因是Makefile中文件名拼写错误,或者破坏了源文件树(一个文件不能被重建,可能是由于依赖文件的问题)。
    复制代码
    那很可能是文件名之类的弄错,或者找不到globalmem.c文件。到linux-imx目录下查找,发现没有这个文件,可能是之前上传到另外的文件加了。重新上传该文件到 /drivers/char 目录,再次执行 make modules,开始编译了。编译生成了很多个驱动文件。
    贴下输出结果:O(∩_∩)O哈哈哈~
    1. brain@brain-VirtualBox:~/linux-imx$ make modules
    2.   CHK     include/linux/version.h
    3.   CHK     include/generated/utsrelease.h
    4. make[1]: `include/generated/mach-types.h' is up to date.
    5.   CALL    scripts/checksyscalls.sh
    6.   CC [M]  drivers/char/globalmem.o
    7. drivers/char/globalmem.c: In function 'globalmem_read':
    8. drivers/char/globalmem.c:92:9: warning: format '%d' expects argument of type 'int', but argument 3 has type 'long unsigned int' [-Wformat]
    9. drivers/char/globalmem.c: In function 'globalmem_write':
    10. drivers/char/globalmem.c:130:9: warning: format '%d' expects argument of type 'int', but argument 3 has type 'long unsigned int' [-Wformat]
    11. drivers/char/globalmem.c: At top level:
    12. drivers/char/globalmem.c:184:5: warning: initialization from incompatible pointer type [enabled by default]
    13. drivers/char/globalmem.c:184:5: warning: (near initialization for 'globalmem_fops.compat_ioctl') [enabled by default]
    14. drivers/char/globalmem.c: In function 'globalmem_init':
    15. drivers/char/globalmem.c:234:5: warning: passing argument 1 of '__mutex_init' from incompatible pointer type [enabled by default]
    16. include/linux/mutex.h:115:13: note: expected 'struct mutex *' but argument is of type 'struct semaphore *'
    17.   CC [M]  drivers/gpu/drm/drm_auth.o
    18.   CC [M]  drivers/gpu/drm/drm_buffer.o
    19.   CC [M]  drivers/gpu/drm/drm_bufs.o
    20.   CC [M]  drivers/gpu/drm/drm_cache.o
    21.   CC [M]  drivers/gpu/drm/drm_context.o
    22.   CC [M]  drivers/gpu/drm/drm_dma.o
    23.   CC [M]  drivers/gpu/drm/drm_drv.o
    24.   CC [M]  drivers/gpu/drm/drm_fops.o
    25.   CC [M]  drivers/gpu/drm/drm_gem.o
    26.   CC [M]  drivers/gpu/drm/drm_ioctl.o
    27.   CC [M]  drivers/gpu/drm/drm_irq.o
    28.   CC [M]  drivers/gpu/drm/drm_lock.o
    29.   CC [M]  drivers/gpu/drm/drm_memory.o
    30.   CC [M]  drivers/gpu/drm/drm_proc.o
    31.   CC [M]  drivers/gpu/drm/drm_stub.o
    32.   CC [M]  drivers/gpu/drm/drm_vm.o
    33.   CC [M]  drivers/gpu/drm/drm_agpsupport.o
    34.   CC [M]  drivers/gpu/drm/drm_scatter.o
    35.   CC [M]  drivers/gpu/drm/ati_pcigart.o
    36.   CC [M]  drivers/gpu/drm/drm_pci.o
    37.   CC [M]  drivers/gpu/drm/drm_platform.o
    38.   CC [M]  drivers/gpu/drm/drm_sysfs.o
    39.   CC [M]  drivers/gpu/drm/drm_hashtab.o
    40.   CC [M]  drivers/gpu/drm/drm_sman.o
    41.   CC [M]  drivers/gpu/drm/drm_mm.o
    42.   CC [M]  drivers/gpu/drm/drm_crtc.o
    43.   CC [M]  drivers/gpu/drm/drm_modes.o
    44.   CC [M]  drivers/gpu/drm/drm_edid.o
    45.   CC [M]  drivers/gpu/drm/drm_info.o
    46.   CC [M]  drivers/gpu/drm/drm_debugfs.o
    47.   CC [M]  drivers/gpu/drm/drm_encoder_slave.o
    48.   CC [M]  drivers/gpu/drm/drm_trace_points.o
    49.   CC [M]  drivers/gpu/drm/drm_global.o
    50.   LD [M]  drivers/gpu/drm/drm.o
    51.   CC [M]  drivers/gpu/drm/vivante/vivante_drv.o
    52.   LD [M]  drivers/gpu/drm/vivante/vivante.o
    53.   CC [M]  drivers/hid/hid-a4tech.o
    54.   CC [M]  drivers/hid/hid-apple.o
    55.   CC [M]  drivers/hid/hid-belkin.o
    56.   CC [M]  drivers/hid/hid-cherry.o
    57.   CC [M]  drivers/hid/hid-chicony.o
    58.   CC [M]  drivers/hid/hid-cypress.o
    59.   CC [M]  drivers/hid/hid-ezkey.o
    60.   CC [M]  drivers/hid/hid-gyration.o
    61.   CC [M]  drivers/hid/hid-lg.o
    62.   LD [M]  drivers/hid/hid-logitech.o
    63.   CC [M]  drivers/hid/hid-microsoft.o
    64.   CC [M]  drivers/hid/hid-monterey.o
    65.   CC [M]  drivers/hid/hid-pl.o
    66.   CC [M]  drivers/hid/hid-petalynx.o
    67.   CC [M]  drivers/hid/hid-samsung.o
    68.   CC [M]  drivers/hid/hid-sony.o
    69.   CC [M]  drivers/hid/hid-sunplus.o
    70.   CC [M]  drivers/i2c/algos/i2c-algo-bit.o
    71.   CC [M]  drivers/media/video/gspca/gspca.o
    72.   LD [M]  drivers/media/video/gspca/gspca_main.o
    73.   CC [M]  drivers/media/video/uvc/uvc_driver.o
    74.   CC [M]  drivers/media/video/uvc/uvc_queue.o
    75.   CC [M]  drivers/media/video/uvc/uvc_v4l2.o
    76.   CC [M]  drivers/media/video/uvc/uvc_video.o
    77.   CC [M]  drivers/media/video/uvc/uvc_ctrl.o
    78.   CC [M]  drivers/media/video/uvc/uvc_status.o
    79.   CC [M]  drivers/media/video/uvc/uvc_isight.o
    80.   LD [M]  drivers/media/video/uvc/uvcvideo.o
    81.   CC [M]  drivers/misc/mxs-perfmon.o
    82.   CC [M]  drivers/mxc/mlb/mxc_mlb150.o
    83.   CC [M]  drivers/net/wireless/ath/main.o
    84.   CC [M]  drivers/net/wireless/ath/regd.o
    85.   CC [M]  drivers/net/wireless/ath/hw.o
    86.   CC [M]  drivers/net/wireless/ath/key.o
    87.   LD [M]  drivers/net/wireless/ath/ath.o
    88.   CC [M]  drivers/net/wireless/ath/ath6kl/debug.o
    89.   CC [M]  drivers/net/wireless/ath/ath6kl/htc_hif.o
    90.   CC [M]  drivers/net/wireless/ath/ath6kl/htc.o
    91.   CC [M]  drivers/net/wireless/ath/ath6kl/bmi.o
    92.   CC [M]  drivers/net/wireless/ath/ath6kl/cfg80211.o
    93.   CC [M]  drivers/net/wireless/ath/ath6kl/init.o
    94.   CC [M]  drivers/net/wireless/ath/ath6kl/main.o
    95.   CC [M]  drivers/net/wireless/ath/ath6kl/txrx.o
    96.   CC [M]  drivers/net/wireless/ath/ath6kl/wmi.o
    97.   CC [M]  drivers/net/wireless/ath/ath6kl/node.o
    98.   CC [M]  drivers/net/wireless/ath/ath6kl/sdio.o
    99.   LD [M]  drivers/net/wireless/ath/ath6kl/ath6kl.o
    100.   CC [M]  drivers/scsi/scsi_wait_scan.o
    101.   CC [M]  drivers/usb/gadget/audio.o
    102.   CC [M]  drivers/usb/gadget/ether.o
    103.   CC [M]  drivers/usb/gadget/file_storage.o
    104.   CC [M]  drivers/usb/gadget/serial.o
    105.   LD [M]  drivers/usb/gadget/g_audio.o
    106.   LD [M]  drivers/usb/gadget/g_ether.o
    107.   LD [M]  drivers/usb/gadget/g_file_storage.o
    108.   LD [M]  drivers/usb/gadget/g_serial.o
    109.   CC [M]  lib/crc-ccitt.o
    110.   Building modules, stage 2.
    111.   MODPOST 36 modules
    112.   CC      crypto/tcrypt.mod.o
    113.   LD [M]  crypto/tcrypt.ko
    114.   CC      drivers/char/globalmem.mod.o
    115.   LD [M]  drivers/char/globalmem.ko
    116.   CC      drivers/gpu/drm/drm.mod.o
    117.   LD [M]  drivers/gpu/drm/drm.ko
    118.   CC      drivers/gpu/drm/vivante/vivante.mod.o
    119.   LD [M]  drivers/gpu/drm/vivante/vivante.ko
    120.   CC      drivers/hid/hid-a4tech.mod.o
    121.   LD [M]  drivers/hid/hid-a4tech.ko
    122.   CC      drivers/hid/hid-apple.mod.o
    123.   LD [M]  drivers/hid/hid-apple.ko
    124.   CC      drivers/hid/hid-belkin.mod.o
    125.   LD [M]  drivers/hid/hid-belkin.ko
    126.   CC      drivers/hid/hid-cherry.mod.o
    127.   LD [M]  drivers/hid/hid-cherry.ko
    128.   CC      drivers/hid/hid-chicony.mod.o
    129.   LD [M]  drivers/hid/hid-chicony.ko
    130.   CC      drivers/hid/hid-cypress.mod.o
    131.   LD [M]  drivers/hid/hid-cypress.ko
    132.   CC      drivers/hid/hid-ezkey.mod.o
    133.   LD [M]  drivers/hid/hid-ezkey.ko
    134.   CC      drivers/hid/hid-gyration.mod.o
    135.   LD [M]  drivers/hid/hid-gyration.ko
    136.   CC      drivers/hid/hid-logitech.mod.o
    137.   LD [M]  drivers/hid/hid-logitech.ko
    138.   CC      drivers/hid/hid-microsoft.mod.o
    139.   LD [M]  drivers/hid/hid-microsoft.ko
    140.   CC      drivers/hid/hid-monterey.mod.o
    141.   LD [M]  drivers/hid/hid-monterey.ko
    142.   CC      drivers/hid/hid-petalynx.mod.o
    143.   LD [M]  drivers/hid/hid-petalynx.ko
    144.   CC      drivers/hid/hid-pl.mod.o
    145.   LD [M]  drivers/hid/hid-pl.ko
    146.   CC      drivers/hid/hid-samsung.mod.o
    147.   LD [M]  drivers/hid/hid-samsung.ko
    148.   CC      drivers/hid/hid-sony.mod.o
    149.   LD [M]  drivers/hid/hid-sony.ko
    150.   CC      drivers/hid/hid-sunplus.mod.o
    151.   LD [M]  drivers/hid/hid-sunplus.ko
    152.   CC      drivers/i2c/algos/i2c-algo-bit.mod.o
    153.   LD [M]  drivers/i2c/algos/i2c-algo-bit.ko
    154.   CC      drivers/media/video/gspca/gspca_main.mod.o
    155.   LD [M]  drivers/media/video/gspca/gspca_main.ko
    156.   CC      drivers/media/video/uvc/uvcvideo.mod.o
    157.   LD [M]  drivers/media/video/uvc/uvcvideo.ko
    158.   CC      drivers/misc/mxs-perfmon.mod.o
    159.   LD [M]  drivers/misc/mxs-perfmon.ko
    160.   CC      drivers/mxc/mlb/mxc_mlb150.mod.o
    161.   LD [M]  drivers/mxc/mlb/mxc_mlb150.ko
    162.   CC      drivers/net/wireless/ath/ath.mod.o
    163.   LD [M]  drivers/net/wireless/ath/ath.ko
    164.   CC      drivers/net/wireless/ath/ath6kl/ath6kl.mod.o
    165.   LD [M]  drivers/net/wireless/ath/ath6kl/ath6kl.ko
    166.   CC      drivers/scsi/scsi_wait_scan.mod.o
    167.   LD [M]  drivers/scsi/scsi_wait_scan.ko
    168.   CC      drivers/usb/gadget/g_audio.mod.o
    169.   LD [M]  drivers/usb/gadget/g_audio.ko
    170.   CC      drivers/usb/gadget/g_ether.mod.o
    171.   LD [M]  drivers/usb/gadget/g_ether.ko
    172.   CC      drivers/usb/gadget/g_file_storage.mod.o
    173.   LD [M]  drivers/usb/gadget/g_file_storage.ko
    174.   CC      drivers/usb/gadget/g_serial.mod.o
    175.   LD [M]  drivers/usb/gadget/g_serial.ko
    176.   CC      fs/autofs4/autofs4.mod.o
    177.   LD [M]  fs/autofs4/autofs4.ko
    178.   CC      fs/nls/nls_ascii.mod.o
    179.   LD [M]  fs/nls/nls_ascii.ko
    180.   CC      fs/nls/nls_utf8.mod.o
    181.   LD [M]  fs/nls/nls_utf8.ko
    182.   CC      lib/crc-ccitt.mod.o
    183.   LD [M]  lib/crc-ccitt.ko
    复制代码
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-9-12 10:26
  • 签到天数: 12 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2014-5-10 15:59:43 | 显示全部楼层
    nice to see it
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2013-10-31 08:31
  • 签到天数: 16 天

    连续签到: 1 天

    [LV.4]偶尔看看III

     楼主| 发表于 2014-5-11 10:37:05 | 显示全部楼层
    globalmem.c文件
    1. #include <linux/module.h>
    2. #include <linux/types.h>
    3. #include <linux/fs.h>
    4. #include <linux/errno.h>
    5. #include <linux/mm.h>
    6. #include <linux/slab.h>
    7. #include <linux/sched.h>
    8. #include <linux/init.h>
    9. #include <linux/cdev.h>
    10. #include <asm/io.h>
    11. #include <asm/system.h>
    12. #include <asm/uaccess.h>

    13. #define GLOBALMEM_SIZE 0x1000 /*4KB*/
    14. #define MEM_CLEAR 0x1  /*clear globale memory*/
    15. #define GLOBALMEM_MAJOR 199 /**/

    16. static int globalmem_major = GLOBALMEM_MAJOR;

    17. struct globalmem_dev
    18. {
    19.     struct cdev cdev;
    20.     unsigned char mem[GLOBALMEM_SIZE];
    21.     struct semaphore sem;
    22. };
    23. struct globalmem_dev *globalmem_devp;

    24. int globalmem_open(struct inode* inode, struct file * filp)
    25. {
    26.     filp->private_data = globalmem_devp;
    27.     return 0;
    28. }

    29. int globalmem_release(struct inode * inode, struct file * filp)
    30. {
    31.     return 0;
    32. }

    33. //static int globalmem_ioctl(struct inode * inodep, struct file * filp, unsigned int cmd, unsigned long arg)
    34. static int globalmem_ioctl(struct file * filp, unsigned int cmd, unsigned long arg)
    35. {
    36.     struct globalmem_dev * dev = filp->private_data;

    37.     switch(cmd)
    38.     {
    39.         case MEM_CLEAR:
    40.             if(down_interruptible(&dev->sem))
    41.             {
    42.                 return -ERESTARTSYS;
    43.             }
    44.             memset(dev->mem, 0, GLOBALMEM_SIZE);
    45.             up(&dev->sem);
    46.             printk(KERN_INFO "globalmem is set to 0\n");
    47.             break;
    48.         default:
    49.             return -EINVAL;
    50.     }

    51.     return 0;
    52. }

    53. static ssize_t globalmem_read(struct file * filp, char __user * buf, size_t size, loff_t *ppos)
    54. {
    55.     unsigned long p = *ppos;
    56.     unsigned int count = size;
    57.     int ret = 0;
    58.     struct globalmem_dev *dev = filp->private_data;

    59.     if(p >= GLOBALMEM_SIZE)
    60.     {
    61.         return count ? -ENXIO:0;
    62.     }

    63.     if(count > GLOBALMEM_SIZE - p)
    64.     {
    65.         count = GLOBALMEM_SIZE - p;
    66.     }

    67.     if(down_interruptible(&dev->sem))
    68.     {
    69.         return -ERESTARTSYS;
    70.     }

    71.     if(copy_to_user(buf, (void*)(dev->mem + p), count))
    72.     {
    73.         ret = -EFAULT;
    74.     }
    75.     else
    76.     {
    77.         *ppos += count;
    78.         ret = count;
    79.         printk(KERN_EMERG "read %d byte(s) from %d\n", count, p);
    80.     }

    81.     up(&dev->sem);

    82.     return ret;
    83. }

    84. static ssize_t globalmem_write(struct file * filp, const char __user *buf, size_t size, loff_t *ppos)
    85. {
    86.     unsigned long p = *ppos;
    87.     unsigned int count = size;
    88.     int ret = 0;
    89.     struct globalmem_dev *dev = filp->private_data;

    90.     if(p >= GLOBALMEM_SIZE)
    91.     {
    92.         return (count ? -ENXIO : 0);
    93.     }
    94.     if(count > GLOBALMEM_SIZE - p)
    95.     {
    96.         count = GLOBALMEM_SIZE - p;
    97.     }

    98.     if(down_interruptible(&dev->sem))
    99.     {
    100.         return -ERESTARTSYS;
    101.     }

    102.     if(copy_from_user(dev->mem + p, buf, count))
    103.     {
    104.         ret = -EFAULT;
    105.     }
    106.     else
    107.     {
    108.         *ppos += count;
    109.         ret = count;

    110.         printk(KERN_EMERG "written %d byte(s) from %d\n", count, p);
    111.     }


    112.     up(&dev->sem);

    113.     return ret;
    114. }

    115. static loff_t globalmem_llseek(struct file * filp, loff_t offset, int orig)
    116. {
    117.     loff_t ret = 0;

    118.     switch(orig)
    119.     {
    120.         case 0:
    121.             if(offset < 0)
    122.             {
    123.                 ret = -EINVAL;
    124.                 break;
    125.             }
    126.             if((unsigned int)offset > GLOBALMEM_SIZE)
    127.             {
    128.                 ret = -EINVAL;
    129.                 break;
    130.             }
    131.             filp->f_pos = (unsigned int)offset;
    132.             ret = filp->f_pos;
    133.             break;
    134.         case 1:
    135.             if((filp->f_pos + offset) > GLOBALMEM_SIZE)
    136.             {
    137.                 ret = -EINVAL;
    138.                 break;
    139.             }
    140.             if((filp->f_pos + offset) < 0)
    141.             {
    142.                 ret = -EINVAL;
    143.                 break;
    144.             }
    145.             filp->f_pos += offset;
    146.             ret = filp->f_pos;
    147.             break;
    148.     }

    149.     return ret;
    150. }

    151. static const struct file_operations globalmem_fops =
    152. {
    153.     .owner = THIS_MODULE,
    154.     .llseek = globalmem_llseek,
    155.     .read = globalmem_read,
    156.     .write = globalmem_write,
    157.     .compat_ioctl = globalmem_ioctl,
    158.     .open = globalmem_open,
    159.     .write = globalmem_write,
    160. };
    161. static void globalmem_setup_cdev(struct globalmem_dev *dev, int index)
    162. {
    163.     int err;
    164.     int devno = MKDEV(globalmem_major, 0);

    165.     cdev_init(&dev->cdev, &globalmem_fops);
    166.     dev->cdev.owner = THIS_MODULE;
    167.     dev->cdev.ops = &globalmem_fops;
    168.     err = cdev_add(&dev->cdev, devno, 1);

    169.     if(err)
    170.     {
    171.         printk(KERN_EMERG "Error %d adding globalmem %d\n", err, index);
    172.     }
    173. }

    174. int globalmem_init(void)
    175. {
    176.     int result;
    177.     dev_t devno = MKDEV(globalmem_major, 0);

    178.     if(globalmem_major)
    179.     {
    180.         result = register_chrdev_region(devno, 1, "globalmem");
    181.     }
    182.     else
    183.     {
    184.         result = alloc_chrdev_region(&devno, 0, 1, "globalmem");
    185.         globalmem_major = MAJOR(devno);
    186.     }

    187.     if(result < 0)
    188.     {
    189.         return result;
    190.     }

    191.     globalmem_devp = kmalloc(sizeof(struct globalmem_dev), GFP_KERNEL);
    192.     if(!globalmem_devp)
    193.     {
    194.         result = -ENOMEM;
    195.         goto fail_malloc;
    196.     }
    197.     memset(globalmem_devp, 0, sizeof(struct globalmem_dev));

    198.     globalmem_setup_cdev(globalmem_devp, 0);
    199.     //init_MUTEX(&globalmem_devp->sem);
    200.     mutex_init(&globalmem_devp->sem);
    201.     return 0;

    202. fail_malloc:
    203.     unregister_chrdev_region(devno, 1);
    204.     return result;
    205. }


    206. void globalmem_exit(void)
    207. {
    208.     cdev_del(&globalmem_devp->cdev);
    209.     kfree(globalmem_devp);
    210.     unregister_chrdev_region(MKDEV(globalmem_major, 0), 1);
    211. }

    212. MODULE_AUTHOR("hmy");
    213. MODULE_LICENSE("Dual BSD/GPL");

    214. module_param(globalmem_major, int, S_IRUGO);

    215. module_init(globalmem_init);
    216. module_exit(globalmem_exit);

    复制代码
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-4-25 17:30 , Processed in 0.137319 second(s), 21 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.