打印
[应用方案]

集中采集终端

[复制链接]
楼主: powermaker2568
手机看帖
扫描二维码
随时随地手机跟帖
21
powermaker2568|  楼主 | 2021-2-21 10:03 | 只看该作者 |只看大图 回帖奖励 |倒序浏览

使用特权

评论回复
22
powermaker2568|  楼主 | 2021-2-21 10:41 | 只看该作者

使用特权

评论回复
23
powermaker2568|  楼主 | 2021-2-21 10:48 | 只看该作者

使用特权

评论回复
24
powermaker2568|  楼主 | 2021-2-21 10:49 | 只看该作者
感觉这里,还是需要使用隔离模块或者一体隔离芯片,比较简单。

使用特权

评论回复
25
powermaker2568|  楼主 | 2021-2-21 10:54 | 只看该作者

使用特权

评论回复
26
powermaker2568|  楼主 | 2021-2-21 10:59 | 只看该作者

使用特权

评论回复
27
powermaker2568|  楼主 | 2021-2-21 11:24 | 只看该作者

使用特权

评论回复
28
powermaker2568|  楼主 | 2021-2-21 11:24 | 只看该作者

使用特权

评论回复
29
powermaker2568|  楼主 | 2021-2-21 11:25 | 只看该作者

使用特权

评论回复
30
powermaker2568|  楼主 | 2021-2-21 11:26 | 只看该作者

使用特权

评论回复
31
powermaker2568|  楼主 | 2021-2-21 11:27 | 只看该作者
qboot 启动采用了双核启动方式,当第一个内核 uImage 的校验不通过时,将加载
第二块内核地址空间,启动第二个内核。
qboot 的主函数的代码如下:
int main()
{
  int i;
  unsigned int magic=0;
  unsigned int magic_clac=0, magic_datacrc=0, image_size=0;
  struct image_info image;
  unsigned int *vram;

    sysclk_init();
    init_sernuc(0);
    ser_putstr(0,"\n\rstart linux...\n\r");
    hw_init();
    board_nand_hwinit();  
    memset(&image, 0, sizeof(image));
  image.dest  = (unsigned char *)SDRAM_FRAMEBUFFER_ADDR;
  image.offset = FLASH_**_BASE;
  image.length = FLASH_**_LEN;
  load_nandflash(&image);//load ** bmp
    lcd_ctrl_init(image.dest);
  image.dest  = (unsigned char *)SDRAM_LINUX_BASE;
  uimage_head = (struct linux_uimage_header *)image.dest;
  image.offset = FLASH_LINUX_BASE;
  image.length = FLASH_LINUX_LEN;
  for (i=0;i<1;i++) {
   load_nandflash(&image); //load image into sdram
   theKernel=(void(*)(int, int, unsigned int))(SDRAM_LINUX_BASE+64);
     theKernel(0, 4576,SDRAM_LINUX_PARAMETER);
     magic = swap_uint32n(uimage_head->magic);
   if ( magic == LINUX_UIMAGE_MAGIC) {
    image_size = swap_uint32n(uimage_head->size);
    magic_datacrc = swap_uint32n(uimage_head->data_crc);
    batt_gpio_high();
    magic_clac = crc32(0, image.dest + 64, image_size);
    if (magic_clac == magic_datacrc)
    {
theKernel=(void(*)(int,int,unsigned int))(SDRAM_LINUX_BASE+64);
   }else{
     dbg_info("\n\r kernel[%d] crc32 failed!!",i);
    }
   }
   else{
    image.offset += FLASH_LINUX_LEN;
}
  }
  return 0;
}

使用特权

评论回复
32
powermaker2568|  楼主 | 2021-2-21 11:32 | 只看该作者
linux 内核定制:

Linux 内核支持各种不同的设置,根据四表集中采集终端的功能需求,对 Linux 内核
进行了裁剪,减少了内核所消耗的资源。
四表集中采集终端基于 linux-3.10 内核源码,使用了 GCC4.8.4 交叉编译器,支持
EABI。
Linux 内核定制首先使用了新唐的 NUC970 系列芯片的缺省设置。通过“ make
nuc972_defconfig”加载默认配置。
    基本系统设置
开机命令设置-以 RAM 为根文件系统的设定,这里使用的配置如图 3-3 所示:



Ethernet 网口设置
四表集中采集终端配置了网口,通过网口可以对终端进行维护及升级的功能。网口的
配置如图 3-4 所示:


使用特权

评论回复
33
powermaker2568|  楼主 | 2021-2-21 11:33 | 只看该作者
NUC970 系列带有 11 个串口,可以分别独立设置。四表集中采集终端使用了 7 个串口,
分别用来维护 console 口、485I、485II、载波抄表口、MBUSI、MBUSII 通信口,红外通信
口。具体的内核配置如图 3-5 所示:

使用特权

评论回复
34
powermaker2568|  楼主 | 2021-2-21 11:34 | 只看该作者
GPIO 驱动程序配置 NUC970 系列芯片的 GPIO 口。从 GPIOA~GPIOJ 每组的 IO 保留了 32
个编号。在 GPIO 驱动设置中,保留了系统自带的通用的 GPIO 操作接口,通过
“/sys/class/gpio/..”的方法控制 GPIO。同时在驱动中增加了“NUC970 ava GPIO
support”支持。驱动主要实现的功能:将四表集中采集终端的 GPIO 的控制相应的管脚映
射在/dev/的相应设备下。应用程序可以直接通过/dev 的设备名进行 GPIO 的访问与读写操
作。具体的 GPIO 配置如图 3-6 所示:

使用特权

评论回复
35
powermaker2568|  楼主 | 2021-2-21 11:35 | 只看该作者
CPU 运行指示灯配置
   四表集中采集终端使用了 GPIOD11 管脚实现了“heartbeat”的心跳触发器。触发器用
来指示内核是否正常运行。当内核系统正常运行情况下,led 指示灯会不停的闪烁。具体
的 LED Trigger 配置如图 3-7 所示:


使用特权

评论回复
36
powermaker2568|  楼主 | 2021-2-21 11:35 | 只看该作者
时钟配置
四表集中采集终端设计使用了 RX8205 的时钟芯片来控制终端的时钟。RX8205 使用了
I2C 接口。驱动中进行了 Real Time Clock 的相关的配置。同时修改了驱动的 dev.c 的 I2C
的信息配置为:
{I2C_BOARD_INFO( "rx8025", 0x32),}, 如图 3-8 所示:


使用特权

评论回复
37
powermaker2568|  楼主 | 2021-2-21 11:36 | 只看该作者
Watchdog 驱动
   四表集中采集终端使用了 MAX706 芯片实现 wdg 的功能。在驱动中,增加了 MAX706 的
相关设备的驱动功能。MAX706 芯片需要在 1.5s 内对 WDG 管脚拉低,否则会导致芯片 RESET
输出。因此在驱动的入口函数调用中,使用了 subsys_initcall_sync(max706t_WDG_init);
提高驱动的调用优先级到 4,提供驱动加载速度。WDG 的内核基本配置如图 3-9 所示:


使用特权

评论回复
38
powermaker2568|  楼主 | 2021-2-21 11:37 | 只看该作者
SPI 驱动
四表集中采集终端设置中使用了 ATT7022E 多功能高精度的三相电能专用计量芯片来
实现设备的计量数据采集。同时使用了终端嵌入式安全控制模块 T-ESAM,两个设备共用了
SPI 接口。在硬件设计上通过不同的 CS 信号,来实现不同设备之间的访问。
在 SPI 设 备 驱 动 中 p  =  devm_pinctrl_get_select(&pdev->dev,  "spi0"); 通 过
nuc970_mfp_set_port_b(6,0); 将 GPIOB_6 初始化为 GPIO,应用程序通过控制片选,来实
现 RN8209 与 T-ESAM 芯片的操作。SPI 设备的初始化参数为:

#ifdef CONFIG_SPI_SPIDEV
        {
                .modalias = "spidev",
                .max_speed_hz = 75000000,
                .bus_num = 0,
                .mode = SPI_MODE_1,
        },
#endif
#if defined(CONFIG_SPI_NUC970_P0_NORMAL)
master->mode_bits = (SPI_MODE_1 | SPI_TX_DUAL | SPI_RX_DUAL | SPI_CS_HIGH );
SPI 设备的基本配置如图 3-10 所示:

使用特权

评论回复
39
powermaker2568|  楼主 | 2021-2-21 11:41 | 只看该作者
linux 文件系统
四表集中采集终端设计采用 cramfs 根文件系统。使用 mkcramfs 工具生成了根文件系
统。cramfs 系统的内容解压到 ram 时可以不需要一次性全部解压,而是某个位置数据需要
被系统访问时,计算出在 cramfs 中的位置,再解压到 ram 中,然后通过内存访问方式获
取需要的数据。cramfs 的解压都是由文件系统本身来管理,用户并不需要了解具体的实现
过程。
存储空间采用了 jffs2 嵌入式闪存系统,jffs2 是一种日志型文件系统。存储四表集中采集
终端的程序、接口库、通信数据、采集参数等设置功能。如图 3-11 所示:




使用特权

评论回复
40
powermaker2568|  楼主 | 2021-2-21 11:41 | 只看该作者
应用程序设计上使用了标准的 C 语言方式。主要功能包括规约接口库、驱动设备库及
应用程序库。接口库采用了动态库方式。应用程序设计时考虑到采用静态库方式存在的占
用内存及存储空间较大的缺点,因此这里设计采用了动态库的设计方式。动态库的优点在
于编译时并不被编译到目标文件中,只是在需要时动态调用加载到内存中,这样目标文件
会大大减小,同时动态库可以独立依赖它的应用程序,这样设计方便了软件的远程更新的
功能。四表集中采集终端的动态库加载在/nor/lib/下。应用程序加载在/nand/bin 下。其
软件功能整体框图如图 4-1 所示:





使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则