Project Ne10
An Open Optimized Software Library Project for the ARM Architecture
Loading...
Searching...
No Matches
NE10_init.c
1/*
2 * Copyright 2011-15 ARM Limited and Contributors.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of ARM Limited nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY ARM LIMITED AND CONTRIBUTORS "AS IS" AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL ARM LIMITED AND CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28#include <stdio.h>
29#include <string.h>
30#include <ctype.h>
31
32#include "NE10.h"
33
34#define CPUINFO_BUFFER_SIZE (1024*4)
35
36// This local variable indicates whether or not the running platform supports ARM NEON
37ne10_result_t is_NEON_available = NE10_ERR;
38
39ne10_result_t ne10_HasNEON()
40{
41 return is_NEON_available;
42}
43
44ne10_result_t ne10_init()
45{
46 ne10_result_t status = NE10_ERR;
47#ifndef __MACH__
48 FILE* infofile = NULL; // To open the file /proc/cpuinfo
49 ne10_int8_t cpuinfo[CPUINFO_BUFFER_SIZE]; // The buffer to read in the string
50 ne10_uint32_t bytes = 0; // Numbers of bytes read from the file
51 ne10_int32_t i = 0; // Temporary loop counter
52
53 memset (cpuinfo, 0, CPUINFO_BUFFER_SIZE);
54 infofile = fopen ("/proc/cpuinfo", "r");
55
56 if (!infofile)
57 {
58 fprintf(stderr, "ERROR: couldn't read file \"/proc/cpuinfo\".\n");
59 return NE10_ERR;
60 }
61
62 bytes = fread (cpuinfo, 1, sizeof (cpuinfo), infofile);
63 fclose (infofile);
64
65 if (0 == bytes || CPUINFO_BUFFER_SIZE == bytes)
66 {
67 fprintf (stderr, "ERROR: Couldn't read the file \"/proc/cpuinfo\". NE10_init() failed.\n");
68 return NE10_ERR;
69 }
70
71 while ('\0' != cpuinfo[i])
72 {
73 cpuinfo[i] = (ne10_int8_t) tolower (cpuinfo[i]);
74 ++i;
75 }
76
77 if (0 != strstr ( (const char *)cpuinfo, "neon"))
78 {
79 is_NEON_available = NE10_OK;
80 }
81#else //__MACH__
82 is_NEON_available = NE10_OK;
83#endif //__MACH__
84
85#if defined (NE10_ENABLE_MATH)
86 status = ne10_init_math (is_NEON_available);
87 if (status != NE10_OK)
88 {
89 fprintf(stderr, "ERROR: init math failed\n");
90 return NE10_ERR;
91 }
92#endif
93
94#if defined (NE10_ENABLE_DSP)
95 status = ne10_init_dsp (is_NEON_available);
96 if (status != NE10_OK)
97 {
98 fprintf(stderr, "ERROR: init dsp failed\n");
99 return NE10_ERR;
100 }
101#endif
102
103#if defined (NE10_ENABLE_IMGPROC)
104 status = ne10_init_imgproc (is_NEON_available);
105 if (status != NE10_OK)
106 {
107 fprintf(stderr, "ERROR: init imgproc failed\n");
108 return NE10_ERR;
109 }
110#endif
111
112#if defined (NE10_ENABLE_PHYSICS)
113 status = ne10_init_physics (is_NEON_available);
114 if (status != NE10_OK)
115 {
116 fprintf(stderr, "ERROR: init imgproc failed\n");
117 return NE10_ERR;
118 }
119#endif
120
121 return NE10_OK;
122}