diff --git a/Product/modules/shm_dev/shm_dev.c b/Product/modules/shm_dev/shm_dev.c index dea441b50..71e3db29d 100644 --- a/Product/modules/shm_dev/shm_dev.c +++ b/Product/modules/shm_dev/shm_dev.c @@ -11,11 +11,13 @@ #include "shm_dev.h" +#define SHM_DEV_MAJOR (200) + /** * @def SHM_DEV_NAME * @brief */ -#define SHM_DEV_NAME ("shm_dev") ///< 设备节点名称 +#define SHM_DEV_NAME ("shmdev") ///< 设备节点名称 /** * @var typedef {anonOBJECT_DRV} SHM_DRV @@ -148,16 +150,10 @@ static struct file_operations shmdev_fops = { static int __init shmdev_module_init(void) { struct page *p = NULL; - dev_t dev = 0; - + int ret = 0; + printk(KERN_INFO "Hello ISG share memory manager version: %s\n", SHMDEV_VERSION); - // 自动分配设备版本号 - if(alloc_chrdev_region(&dev, 0, 1, SHM_DEV_NAME) != 0) { - printk(KERN_ERR "Alloc driver dev id error\n"); - return -ENODEV; - } - // 分配驱动程序结构内存 g_shm_dev = (PSHM_DRV)kmalloc(sizeof(SHM_DRV), GFP_KERNEL); @@ -167,9 +163,38 @@ static int __init shmdev_module_init(void) } memset(g_shm_dev, 0, sizeof(SHM_DRV)); - g_shm_dev->dev_major = MAJOR(dev); // 保存驱动版本号 atomic_set(&g_shm_dev->ref_count, 0); + // 注册字符设备 + ret = register_chrdev(SHM_DEV_MAJOR, SHM_DEV_NAME, &shmdev_fops); + + if(ret < 0) { + kfree(g_shm_dev); + printk(KERN_ERR "register_chrdev error: %d\n", ret); + return -ENOENT; + } + + printk(KERN_ERR "ret = %d, major = %u, devno = %d\n", ret, SHM_DEV_MAJOR, MKDEV(SHM_DEV_MAJOR, 0)); + + + // 创建字符设备类 + g_shm_dev->dev_class = class_create(THIS_MODULE, "shm_class"); + + if(g_shm_dev->dev_class == NULL) { + printk(KERN_ERR "class_create error\n"); + kfree(g_shm_dev); + return -ENOENT; + } + + // 创建字符设备节点 + if(device_create(g_shm_dev->dev_class, NULL, MKDEV(SHM_DEV_MAJOR, 0), + NULL, "shm_dev/shm%d", 0) == NULL) { + printk(KERN_ERR "device_create error\n"); + class_destroy(g_shm_dev->dev_class); + kfree(g_shm_dev); + return -ENOENT; + } + // 初始化共享内存 g_shm_dev->mem_size = PAGE_ALIGN(SHM_MEM_SIZE); g_shm_dev->mem_buf = (unsigned char *)__get_free_pages(GFP_KERNEL, get_order(g_shm_dev->mem_size)); @@ -191,13 +216,6 @@ static int __init shmdev_module_init(void) } memset(g_shm_dev->mem_buf, 0, g_shm_dev->mem_size); - // 注册字符设备 - register_chrdev(g_shm_dev->dev_major, SHM_DEV_NAME, &shmdev_fops); - // 创建字符设备类 - g_shm_dev->dev_class = class_create(THIS_MODULE, "obj"); - // 创建字符设备节点 - device_create(g_shm_dev->dev_class, NULL, MKDEV(g_shm_dev->dev_major, 0), - NULL, "isg_objs/shm%d", 0); // 初始化 proc 接口 shmdev_proc_init(); @@ -235,9 +253,9 @@ static void __exit shmdev_module_exit(void) free_pages((unsigned long)g_shm_dev->mem_buf, get_order(g_shm_dev->mem_size)); } - device_destroy(g_shm_dev->dev_class, MKDEV(g_shm_dev->dev_major, 0)); + device_destroy(g_shm_dev->dev_class, MKDEV(SHM_DEV_MAJOR, 0)); class_destroy(g_shm_dev->dev_class); - unregister_chrdev(g_shm_dev->dev_major, SHM_DEV_NAME); + unregister_chrdev(SHM_DEV_MAJOR, SHM_DEV_NAME); kfree(g_shm_dev); } diff --git a/Product/user/demo/main.c b/Product/user/demo/main.c index 5afc048c5..f6322699e 100644 --- a/Product/user/demo/main.c +++ b/Product/user/demo/main.c @@ -1,10 +1,67 @@ #include #include #include -#include +#include +#include +#include +#include #include "compile.h" +#define PAGE_ALIGN(addr) (((addr) + ((4096)-1)) & (~((4096) - 1))) +#define SHM_DEV_NAME ("/dev/shm_dev/shm0") + +void mmap_test_read(void) +{ + unsigned int cnt = 0; + unsigned char *pBuf; + int fd = open(SHM_DEV_NAME, O_RDWR); + + if(fd == -1) { + fprintf(stderr, "Open device %s error: %s\n", SHM_DEV_NAME, strerror(errno)); + return; + } + + pBuf = (unsigned char *)mmap(NULL, PAGE_ALIGN(1024 * 1024), PROT_READ, MAP_SHARED | MAP_LOCKED, fd, 0); + + if(pBuf == NULL) { + fprintf(stderr, "mmap memory %u error: %s\n", PAGE_ALIGN(1024 * 1024), strerror(errno)); + close(fd); + return; + } + + do { + fprintf(stdout, "[%04u]: %s\n", cnt++, (char *)pBuf); + sleep(1); + } while(1); +} + +void mmap_test_write(void) +{ + unsigned int cnt = 0; + unsigned char *pBuf; + int fd = open(SHM_DEV_NAME, O_RDWR); + + if(fd == -1) { + fprintf(stderr, "Open device %s error: %s\n", SHM_DEV_NAME, strerror(errno)); + return; + } + + pBuf = (unsigned char *)mmap(NULL, PAGE_ALIGN(1024 * 1024), PROT_WRITE, MAP_SHARED | MAP_LOCKED, fd, 0); + + if(pBuf == NULL) { + fprintf(stderr, "mmap memory %u error: %s\n", PAGE_ALIGN(1024 * 1024), strerror(errno)); + close(fd); + return; + } + + do { + memset(pBuf, 0, 512); + sprintf(pBuf, "Test %u times of share memory\n", cnt++); + sleep(1); + } while(1); +} + /** * @brief 应用程序主函数 * @param argc 输入参数个数 @@ -14,33 +71,37 @@ int main(int argc, char **argv) { int c, optidx = 0; - - cJSON *root = cJSON_CreateObject(); - static const struct option long_opts[] = { { "help", no_argument, NULL, 'h' }, { "version", no_argument, NULL, 'v' }, + { "shm_read", no_argument, NULL, 'r' }, + { "shm_write", no_argument, NULL, 'w' }, // TODO 添加其它需要处理的参数配置 {NULL, 0, NULL, 0} }; - cJSON_Delete(root); - while((c = getopt_long(argc, argv, "hv", long_opts, &optidx)) != -1) - { - switch (c) - { - case 'v': - fprintf(stdout, "User demo version: %s(%s)\n", sGATE_GIT_TAGS, sGATE_GIT_VERS); - break; - //TODO 添加其它必要处理参数过程 + while((c = getopt_long(argc, argv, "hvrw", long_opts, &optidx)) != -1) { + switch(c) { + case 'v': + fprintf(stdout, "User demo version: %s(%s)\n", sGATE_GIT_TAGS, sGATE_GIT_VERS); + break; - case '?': - case 'h': - fprintf(stdout, "Usage: %s [-h] [-v] ...\n", argv[0]); - fprintf(stdout, "options:\n"); - fprintf(stdout, "\t-v, --version show program version\n"); - fprintf(stdout, "\t-h, --help print this message\n"); - break; + //TODO 添加其它必要处理参数过程 + case 'r': + mmap_test_read(); + break; + + case 'w': + mmap_test_write(); + break; + + case '?': + case 'h': + fprintf(stdout, "Usage: %s [-h] [-v] ...\n", argv[0]); + fprintf(stdout, "options:\n"); + fprintf(stdout, "\t-v, --version show program version\n"); + fprintf(stdout, "\t-h, --help print this message\n"); + break; } }