Embedded PCI and Linux
The netdimm CPU architecture consists of a microprocessor, memory, network interface, PCI interface and serial communication ports. The backplane architecture consists of three dimmPCI slots, one desktop PCI slot and associated I/O connectors. Figures 2 and 3 show the key components for the netdimm and passive backplane, respectively.
The first-generation product is a complete single-board computer based on a Motorola Dragonball VZ microcontroller. The MC68VZ328 is based on a 68K core and runs at higher speeds and lower power than previous components. The VZ328 is used in many of the most popular PDAs on the market today and has many features integrated into the device including:
chip-select logic and 8-16-bit bus interface
clock generation module (CGM) and power control
76 GPIO lines grouped into ten ports
two pulse-width modulators (PWM 1 and PWM 2)
two general-purpose timers
two serial peripheral interfaces (SPI 1 and SPI 2)
two UARTs (UART 1 and UART 2) and infrared communication support
DRAM controller that supports EDO RAM, Fast Page Mode and SDRAM
in-circuit emulation module
The total memory capacity of the netdimm product is 40MB. This is composed of two parts: volatile and nonvolatile. The volatile memory capacity of the netdimm is 32MB Synchronous Dynamic RAM (SDRAM). When Linux was considered in the design process, one of the requirements that contributed to an early design iteration was the memory footprint. This requirement influenced the microprocessor selection because of the need for an integrated SDRAM controller.
The nonvolatile memory storage is limited to 8MB and is made up using Flash-based memory. Total kernel requirements are 450KB, and our root filesystem requirement is 150-400KB, depending on which standard Linux components are required for the application. This leaves approximately 7MB of RAM free for user application and data.
Our kernel is stored using the ROM filesystem and is set to execute in place. Nonvolatile memory requirements can be reduced in part by using CRAMFS. CRAMFS is a special type of filesystem that uses compression to store information. The executables are decompressed to RAM for execution.
A 10Mbps 10Base-T network interface has been incorporated into the first-generation netdimm product. In addition to Ethernet, one serial RS-232 port and one serial RS-485 port have been included.
A system management bus of sorts has been incorporated using the industry-standard, serial peripheral interface (SPI) physical layer. This bus can be used for communicating with low-bandwidth peripherals.
The PCI architecture used on our first-generation module is dictated principally by the Motorola Dragonball's (VZ328) inability to support multiple masters on the address and control buses. One could insert buffers to isolate the VZ328 address and control signals. Such an implementation would suffer however, because another external device that gains control of the bus would not have access to the peripherals internal to the VZ328. These include functions such as chip-select logic and, most importantly, the SDRAM memory interface. Therefore, little is to be gained by adding the external buffer logic.
A solution exists where a dual-ported memory is used to interface the PCI bus with the Dragonball microprocessor (Figure 4). Cypress Semiconductor offers a component with a dual-ported memory and PCI Master/Target interface combined into one integrated circuit. The Cypress Cy7C09449 acts as a bridge in this implementation. This results in two distinct address spaces: one for the VZ328 and one for the PCI.
An interesting observation at this point is that deviations from industry-standard architectures, including the implementation disclosed herein, would be a monumental undertaking were it not for the fact that source code is available for Linux.
- New Products
- Encrypt Your Dog (Mutt and GPG)
- Practical Tiny Core in the Fire Service
- Give new life to old phones and tablets with these tips!
- DevOps for Dummies
- Open Axiom
- New Products
- Tech Tip: Really Simple HTTP Server with Python
- Returning Values from Bash Functions
- Readers' Choice Awards 2014 Poll