source: trunk/softs/tsar_boot/include/io.h @ 979

Last change on this file since 979 was 705, checked in by cfuguet, 11 years ago

tsar_boot:

  • Completing io utility functions to provide physical address extention capability to read and write 8 and 16 bits IO mapped registers.
  • Providing default value 0 to CLUSTER_IO preprocessor constant for compatibility with most TSAR platforms where peripherals are in cluster 0. This way, preloader parameters file does not need to be modified for these platforms.
File size: 4.5 KB
RevLine 
[704]1/**********************************************************************
[705]2 * \file    io.h
3 * \date    5 September 2012
4 * \author  Cesar Fuguet / Alain Greiner
[292]5 *
6 * Utility functions to write or read memory mapped hardware registers
[704]7 *********************************************************************/
8
[292]9#ifndef IO_H
10#define IO_H
11
[704]12#include <defs.h>
13
14/**********************************************************************
[292]15 * Read an 32 bits memory mapped hardware register
[704]16 * with physical address extension to access cluster_io
17 *********************************************************************/
[292]18static inline unsigned int ioread32(void * addr)
19{
[704]20    unsigned int value;
21    unsigned int ext = CLUSTER_IO;
22
23    asm volatile(
24        "mtc2  %2,    $24            \n"  /* PADDR_EXT <= cluster_io */
25        "lw    %0,    0(%1)          \n"  /* value <= *(ext\addr)    */
26        "mtc2  $0,    $24            \n"  /* PADDR_EXT <= 0          */
27        : "=r" (value)
[705]28        : "r" (addr), "r" (ext)
29        : "memory" );
[704]30
[705]31    return (volatile unsigned int)value;
[292]32}
33
[704]34/**********************************************************************
[292]35 * Read an 16 bits memory mapped hardware register
[704]36 *********************************************************************/
[292]37static inline unsigned short ioread16(void * addr)
38{
[705]39    unsigned short value;
40    unsigned int ext = CLUSTER_IO;
41
42    asm volatile(
43        "mtc2  %2,    $24            \n"  /* PADDR_EXT <= cluster_io */
44        "lhu   %0,    0(%1)          \n"  /* value <= *(ext\addr)    */
45        "mtc2  $0,    $24            \n"  /* PADDR_EXT <= 0          */
46        : "=r" (value)
47        : "r" (addr), "r" (ext)
48        : "memory" );
49
50    return (volatile unsigned short)value;
[292]51}
52
[704]53/**********************************************************************
[292]54 * Read an 8 bits memory mapped hardware register
[704]55 *********************************************************************/
[292]56static inline unsigned char ioread8(void * addr)
57{
[705]58    unsigned char value;
59    unsigned int ext = CLUSTER_IO;
60
61    asm volatile(
62        "mtc2  %2,    $24            \n"  /* PADDR_EXT <= cluster_io */
63        "lbu   %0,    0(%1)          \n"  /* value <= *(ext\addr)    */
64        "mtc2  $0,    $24            \n"  /* PADDR_EXT <= 0          */
65        : "=r" (value)
66        : "r" (addr), "r" (ext)
67        : "memory" );
68
69    return (volatile unsigned char)value;
[292]70}
71
[704]72/**********************************************************************
[292]73 * Write an 32 bits memory mapped hardware register
[704]74 * with physical address extension to access cluster_io
75 *********************************************************************/
[292]76static inline void iowrite32(void * addr, unsigned int value)
77{
[704]78    unsigned int ext = CLUSTER_IO;
79
80    asm volatile(
81        "mtc2  %2,    $24            \n"  /* PADDR_EXT <= cluster_io */
82        "sw    %0,    0(%1)          \n"  /* *(ext\addr) <= value    */
83        "mtc2  $0,    $24            \n"  /* PADDR_EXT <= 0          */
[705]84        "sync                        \n"  /* sync barrier            */
[704]85        :
[705]86        : "r" (value), "r" (addr), "r" (ext)
87        : "memory" );
[292]88}
89
[704]90/**********************************************************************
[292]91 * Write an 16 bits memory mapped hardware register
[704]92 *********************************************************************/
[292]93static inline void iowrite16(void * addr, unsigned short value)
94{
[705]95    unsigned int ext = CLUSTER_IO;
96
97    asm volatile(
98        "mtc2  %2,    $24            \n"  /* PADDR_EXT <= cluster_io */
99        "sh    %0,    0(%1)          \n"  /* *(ext\addr) <= value    */
100        "mtc2  $0,    $24            \n"  /* PADDR_EXT <= 0          */
101        "sync                        \n"  /* sync barrier            */
102        :
103        : "r" (value), "r" (addr), "r" (ext)
104        : "memory" );
[292]105}
106
[704]107/**********************************************************************
[292]108 * Write an 8 bits memory mapped hardware register
[704]109 *********************************************************************/
[292]110static inline void iowrite8(void * addr, unsigned char value)
111{
[705]112    unsigned int ext = CLUSTER_IO;
113
114    asm volatile(
115        "mtc2  %2,    $24            \n"  /* PADDR_EXT <= cluster_io */
116        "sb    %0,    0(%1)          \n"  /* *(ext\addr) <= value    */
117        "mtc2  $0,    $24            \n"  /* PADDR_EXT <= 0          */
118        "sync                        \n"  /* sync barrier            */
119        :
120        : "r" (value), "r" (addr), "r" (ext)
121        : "memory" );
[292]122}
123
124#endif
[705]125
126// vim: tabstop=4 : softtabstop=4 : shiftwidth=4 : expandtab
Note: See TracBrowser for help on using the repository browser.