AP_HAL_Linux: Move RPi version check to util class

- Moved the version check functions to util.
 - Removed a redundant version check.
 - Removed redundant version check functions from RCInput.
This commit is contained in:
dgrat 2015-09-23 17:52:07 +02:00 committed by Andrew Tridgell
parent 2590db378a
commit 15b3717d89
8 changed files with 114 additions and 84 deletions

View File

@ -38,6 +38,7 @@ namespace Linux {
class LinuxSemaphore;
class LinuxScheduler;
class LinuxUtil;
class LinuxUtilNavio;
class ToneAlarm; //limit the scope of ToneAlarm driver to Linux_HAL only
}

View File

@ -31,6 +31,7 @@
#include "Scheduler.h"
#include "ToneAlarmDriver.h"
#include "Util.h"
#include "Util_Navio.h"
#endif // __AP_HAL_LINUX_PRIVATE_H__

View File

@ -3,6 +3,8 @@
#if CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_NAVIO || CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_RASPILOT
#include "GPIO.h"
#include "Util_Navio.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@ -13,7 +15,6 @@
#include <sys/mman.h>
#include <sys/stat.h>
#define MAX_SIZE_LINE 50
using namespace Linux;
@ -21,42 +22,9 @@ static const AP_HAL::HAL& hal = AP_HAL_BOARD_DRIVER;
LinuxGPIO_RPI::LinuxGPIO_RPI()
{}
int LinuxGPIO_RPI::getRaspberryPiVersion() const
{
char buffer[MAX_SIZE_LINE];
const char* hardware_description_entry = "Hardware";
const char* v1 = "BCM2708";
const char* v2 = "BCM2709";
char* flag;
FILE* fd;
fd = fopen("/proc/cpuinfo", "r");
while (fgets(buffer, MAX_SIZE_LINE, fd) != NULL) {
flag = strstr(buffer, hardware_description_entry);
if (flag != NULL) {
if (strstr(buffer, v2) != NULL) {
printf("Raspberry Pi 2 with BCM2709!\n");
fclose(fd);
return 2;
} else if (strstr(buffer, v1) != NULL) {
printf("Raspberry Pi 1 with BCM2708!\n");
fclose(fd);
return 1;
}
}
}
/* defaults to 1 */
fprintf(stderr, "Could not detect RPi version, defaulting to 1\n");
fclose(fd);
return 1;
}
void LinuxGPIO_RPI::init()
{
int rpi_version = getRaspberryPiVersion();
int rpi_version = static_cast<LinuxUtilNavio*>(hal.util)->get_rpi_version();
uint32_t gpio_address = rpi_version == 1 ? GPIO_BASE(BCM2708_PERI_BASE) : GPIO_BASE(BCM2709_PERI_BASE);
uint32_t pwm_address = rpi_version == 1 ? PWM_BASE(BCM2708_PERI_BASE) : PWM_BASE(BCM2709_PERI_BASE);
uint32_t clk_address = rpi_version == 1 ? CLOCK_BASE(BCM2708_PERI_BASE) : CLOCK_BASE(BCM2709_PERI_BASE);

View File

@ -1,4 +1,3 @@
#ifndef __AP_HAL_LINUX_GPIO_RPI_H__
#define __AP_HAL_LINUX_GPIO_RPI_H__
@ -74,7 +73,6 @@ private:
volatile uint32_t *gpio;
volatile uint32_t *pwm;
volatile uint32_t *clk;
int getRaspberryPiVersion() const;
void setPWM0Period(uint32_t time_us);
void setPWM0Duty(uint8_t percent);

View File

@ -119,7 +119,11 @@ static Empty::EmptyRCOutput rcoutDriver;
#endif
static LinuxScheduler schedulerInstance;
#if CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_NAVIO
static LinuxUtilNavio utilInstance;
#else
static LinuxUtil utilInstance;
#endif
HAL_Linux::HAL_Linux() :
AP_HAL::HAL(

View File

@ -2,6 +2,9 @@
#if CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_NAVIO
#include "GPIO.h"
#include "RCInput_Navio.h"
#include "Util_Navio.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
@ -18,7 +21,7 @@
#include <sys/stat.h>
#include <sys/mman.h>
#include <assert.h>
#include "RCInput_Navio.h"
//Parametres
#define RCIN_NAVIO_BUFFER_LENGTH 8
@ -188,37 +191,6 @@ uint32_t Memory_table::get_page_count() const
return _page_count;
}
// More memory mapping
int get_raspberry_pi_version()
{
char buffer[RCIN_NAVIO_MAX_SIZE_LINE];
const char* hardware_description_entry = "Hardware";
const char* v1 = "BCM2708";
const char* v2 = "BCM2709";
char* flag;
FILE* fd;
fd = fopen("/proc/cpuinfo", "r");
while (fgets(buffer, RCIN_NAVIO_MAX_SIZE_LINE, fd) != NULL) {
flag = strstr(buffer, hardware_description_entry);
if (flag != NULL) {
if (strstr(buffer, v2) != NULL) {
printf("Raspberry Pi 2 with BCM2709!\n");
fclose(fd);
return 2;
}
else if (strstr(buffer, v1) != NULL) {
printf("Raspberry Pi 1 with BCM2708!\n");
fclose(fd);
return 1;
}
}
}
return 0;
}
//Physical addresses of peripheral depends on Raspberry Pi's version
void LinuxRCInput_Navio::set_physical_addresses(int version)
{
@ -420,7 +392,7 @@ LinuxRCInput_Navio::LinuxRCInput_Navio():
last_signal(228),
state(RCIN_NAVIO_INITIAL_STATE)
{
int version = get_raspberry_pi_version();
int version = static_cast<LinuxUtilNavio*>(hal.util)->get_rpi_version();
set_physical_addresses(version);
//Init memory for buffer and for DMA control blocks. See comments in "init_ctrl_data()" to understand values "2" and "113"

View File

@ -0,0 +1,69 @@
#include <AP_HAL/AP_HAL.h>
#if CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_NAVIO
#include <stdio.h>
#include <stdarg.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <time.h>
#include "Util_Navio.h"
extern const AP_HAL::HAL& hal;
using namespace Linux;
LinuxUtilNavio::LinuxUtilNavio()
{
_check_rpi_version();
}
#define MAX_SIZE_LINE 50
int LinuxUtilNavio::_check_rpi_version()
{
char buffer[MAX_SIZE_LINE];
const char* hardware_description_entry = "Hardware";
const char* v1 = "BCM2708";
const char* v2 = "BCM2709";
char* flag;
FILE* fd;
fd = fopen("/proc/cpuinfo", "r");
while (fgets(buffer, MAX_SIZE_LINE, fd) != NULL) {
flag = strstr(buffer, hardware_description_entry);
if (flag != NULL) {
if (strstr(buffer, v2) != NULL) {
printf("Raspberry Pi 2 with BCM2709!\n");
fclose(fd);
_rpi_version = 2;
return _rpi_version;
}
else if (strstr(buffer, v1) != NULL) {
printf("Raspberry Pi 1 with BCM2708!\n");
fclose(fd);
_rpi_version = 1;
return _rpi_version;
}
}
}
/* defaults to 1 */
fprintf(stderr, "Could not detect RPi version, defaulting to 1\n");
fclose(fd);
_rpi_version = 1;
return _rpi_version;
}
int LinuxUtilNavio::get_rpi_version() const
{
return _rpi_version;
}
#endif

View File

@ -0,0 +1,17 @@
#pragma once
#include "Util.h"
class Linux::LinuxUtilNavio : public Linux::LinuxUtil {
public:
LinuxUtilNavio();
/* return the Raspberry Pi version */
int get_rpi_version() const;
protected:
// Called in the constructor once
int _check_rpi_version();
private:
int _rpi_version = 0;
};