Disabled external gits
This commit is contained in:
67
cs309-psoc/lab_3_1/sw/hps/application/hps_soc_system.h
Normal file
67
cs309-psoc/lab_3_1/sw/hps/application/hps_soc_system.h
Normal file
@@ -0,0 +1,67 @@
|
||||
#ifndef _ALTERA_HPS_SOC_SYSTEM_H_
|
||||
#define _ALTERA_HPS_SOC_SYSTEM_H_
|
||||
|
||||
/*
|
||||
* This file was automatically generated by the swinfo2header utility.
|
||||
*
|
||||
* Created from SOPC Builder system 'soc_system' in
|
||||
* file 'hw/quartus/soc_system.sopcinfo'.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file contains macros for module 'hps_0' and devices
|
||||
* connected to the following master:
|
||||
* h2f_lw_axi_master
|
||||
*
|
||||
* Do not include this header file and another header file created for a
|
||||
* different module or master group at the same time.
|
||||
* Doing so may result in duplicate macro names.
|
||||
* Instead, use the system header file which has macros with unique names.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Macros for device 'lepton_0', class 'lepton'
|
||||
* The macros are prefixed with 'LEPTON_0_'.
|
||||
* The prefix is the slave descriptor.
|
||||
*/
|
||||
#define LEPTON_0_COMPONENT_TYPE lepton
|
||||
#define LEPTON_0_COMPONENT_NAME lepton_0
|
||||
#define LEPTON_0_BASE 0x40000
|
||||
#define LEPTON_0_SPAN 32768
|
||||
#define LEPTON_0_END 0x47fff
|
||||
|
||||
/*
|
||||
* Macros for device 'mcp3204_0', class 'mcp3204'
|
||||
* The macros are prefixed with 'MCP3204_0_'.
|
||||
* The prefix is the slave descriptor.
|
||||
*/
|
||||
#define MCP3204_0_COMPONENT_TYPE mcp3204
|
||||
#define MCP3204_0_COMPONENT_NAME mcp3204_0
|
||||
#define MCP3204_0_BASE 0x49000
|
||||
#define MCP3204_0_SPAN 16
|
||||
#define MCP3204_0_END 0x4900f
|
||||
|
||||
/*
|
||||
* Macros for device 'pwm_1', class 'pwm'
|
||||
* The macros are prefixed with 'PWM_1_'.
|
||||
* The prefix is the slave descriptor.
|
||||
*/
|
||||
#define PWM_1_COMPONENT_TYPE pwm
|
||||
#define PWM_1_COMPONENT_NAME pwm_1
|
||||
#define PWM_1_BASE 0x49010
|
||||
#define PWM_1_SPAN 16
|
||||
#define PWM_1_END 0x4901f
|
||||
|
||||
/*
|
||||
* Macros for device 'pwm_0', class 'pwm'
|
||||
* The macros are prefixed with 'PWM_0_'.
|
||||
* The prefix is the slave descriptor.
|
||||
*/
|
||||
#define PWM_0_COMPONENT_TYPE pwm
|
||||
#define PWM_0_COMPONENT_NAME pwm_0
|
||||
#define PWM_0_BASE 0x49020
|
||||
#define PWM_0_SPAN 16
|
||||
#define PWM_0_END 0x4902f
|
||||
|
||||
|
||||
#endif /* _ALTERA_HPS_SOC_SYSTEM_H_ */
|
24
cs309-psoc/lab_3_1/sw/hps/application/iorw.h
Normal file
24
cs309-psoc/lab_3_1/sw/hps/application/iorw.h
Normal file
@@ -0,0 +1,24 @@
|
||||
#ifndef __IORW_H__
|
||||
#define __IORW_H__
|
||||
|
||||
#ifdef __nios2_arch__
|
||||
#include <io.h>
|
||||
|
||||
#define io_write_8(base, ofst, data) (IOWR_8DIRECT((base), (ofst), (data)))
|
||||
#define io_write_16(base, ofst, data) (IOWR_16DIRECT((base), (ofst), (data)))
|
||||
#define io_write_32(base, ofst, data) (IOWR_32DIRECT((base), (ofst), (data)))
|
||||
#define io_read_8(base, ofst) (IORD_8DIRECT((base), (ofst)))
|
||||
#define io_read_16(base, ofst) (IORD_16DIRECT((base), (ofst)))
|
||||
#define io_read_32(base, ofst) (IORD_32DIRECT((base), (ofst)))
|
||||
#else
|
||||
#include <socal/socal.h>
|
||||
|
||||
#define io_write_8(base, ofst, data) (alt_write_byte((uintptr_t) (base) + (ofst), (data)))
|
||||
#define io_write_16(base, ofst, data) (alt_write_hword((uintptr_t) (base) + (ofst), (data)))
|
||||
#define io_write_32(base, ofst, data) (alt_write_word((uintptr_t) (base) + (ofst), (data)))
|
||||
#define io_read_8(base, ofst) (alt_read_byte((uintptr_t) (base) + (ofst)))
|
||||
#define io_read_16(base, ofst) (alt_read_hword((uintptr_t) (base) + (ofst)))
|
||||
#define io_read_32(base, ofst) (alt_read_word((uintptr_t) (base) + (ofst)))
|
||||
#endif
|
||||
|
||||
#endif
|
96
cs309-psoc/lab_3_1/sw/hps/application/lab_3_0/app.c
Normal file
96
cs309-psoc/lab_3_1/sw/hps/application/lab_3_0/app.c
Normal file
@@ -0,0 +1,96 @@
|
||||
#include <socal/hps.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <hps_soc_system.h>
|
||||
|
||||
#include "pantilt/pantilt.h"
|
||||
#include "joysticks/joysticks.h"
|
||||
#include "lepton/lepton.h"
|
||||
|
||||
|
||||
#define SLEEP_DURATION (1000)
|
||||
|
||||
// Servos
|
||||
#define PANTILT_PWM_V_CENTER_DUTY_CYCLE_US ((PANTILT_PWM_V_MIN_DUTY_CYCLE_US + PANTILT_PWM_V_MAX_DUTY_CYCLE_US) / 2)
|
||||
#define PANTILT_PWM_H_CENTER_DUTY_CYCLE_US ((PANTILT_PWM_H_MIN_DUTY_CYCLE_US + PANTILT_PWM_H_MAX_DUTY_CYCLE_US) / 2)
|
||||
|
||||
// Right joystick horizontal threshold for triggering lepton capture
|
||||
#define LEPTON_RIGHT_JOYSTICK_HORIZONTAL_TRIGGER_THRESHOLD ((uint32_t) (0.8 * JOYSTICKS_MAX_VALUE))
|
||||
|
||||
uint32_t interpolate(uint32_t input,
|
||||
uint32_t input_min,
|
||||
uint32_t input_max,
|
||||
uint32_t output_min,
|
||||
uint32_t output_max) {
|
||||
return (input - input_min) * (output_max - output_min) / (input_max - input_min) + output_min;
|
||||
}
|
||||
|
||||
void handle_pantilt(pantilt_dev *pantilt, joysticks_dev *joysticks) {
|
||||
// Read LEFT joystick position
|
||||
uint32_t left_joystick_v = joysticks_read_left_vertical(joysticks);
|
||||
uint32_t left_joystick_h = joysticks_read_left_horizontal(joysticks);
|
||||
|
||||
// Interpolate LEFT joystick position between SERVO_x_MIN_DUTY_CYCLE_US
|
||||
// and SERVO_x_MAX_DUTY_CYCLE_US
|
||||
uint32_t pantilt_v_duty_us = interpolate(left_joystick_v,
|
||||
JOYSTICKS_MIN_VALUE,
|
||||
JOYSTICKS_MAX_VALUE,
|
||||
PANTILT_PWM_V_MIN_DUTY_CYCLE_US,
|
||||
PANTILT_PWM_V_MAX_DUTY_CYCLE_US);
|
||||
uint32_t pantilt_h_duty_us = interpolate(left_joystick_h,
|
||||
JOYSTICKS_MIN_VALUE,
|
||||
JOYSTICKS_MAX_VALUE,
|
||||
PANTILT_PWM_H_MIN_DUTY_CYCLE_US,
|
||||
PANTILT_PWM_H_MAX_DUTY_CYCLE_US);
|
||||
|
||||
// Configure servos with interpolated joystick values
|
||||
pantilt_configure_vertical(pantilt, pantilt_v_duty_us);
|
||||
pantilt_configure_horizontal(pantilt, pantilt_h_duty_us);
|
||||
}
|
||||
|
||||
void handle_lepton(joysticks_dev *joysticks, lepton_dev *lepton) {
|
||||
uint32_t h = joysticks_read_right_horizontal(joysticks);
|
||||
uint32_t v = joysticks_read_right_vertical(joysticks);
|
||||
|
||||
// If the norm of the joystick's movement is greater than half of the max value, we capture
|
||||
if (4 * h * h + v * v >= MCP3204_MAX_VALUE * MCP3204_MAX_VALUE) {
|
||||
do {
|
||||
lepton_start_capture(lepton);
|
||||
lepton_wait_until_eof(lepton);
|
||||
} while(lepton_error_check(lepton));
|
||||
|
||||
lepton_save_capture(lepton, true, stdout);
|
||||
}
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
// Hardware control structures
|
||||
pantilt_dev pantilt = pantilt_inst((void*) PWM_0_BASE, (void*) PWM_1_BASE);
|
||||
joysticks_dev joysticks = joysticks_inst((void*) MCP3204_0_BASE);
|
||||
lepton_dev lepton = lepton_inst((void*) LEPTON_0_BASE);
|
||||
|
||||
// Initialize hardware
|
||||
pantilt_init(&pantilt);
|
||||
joysticks_init(&joysticks);
|
||||
lepton_init(&lepton);
|
||||
|
||||
// Center servos.
|
||||
pantilt_configure_vertical(&pantilt, PANTILT_PWM_V_CENTER_DUTY_CYCLE_US);
|
||||
pantilt_configure_horizontal(&pantilt, PANTILT_PWM_H_CENTER_DUTY_CYCLE_US);
|
||||
pantilt_start_vertical(&pantilt);
|
||||
pantilt_start_horizontal(&pantilt);
|
||||
|
||||
// Control servos with LEFT joystick, capture thermal image with RIGHT joystick.
|
||||
while (true) {
|
||||
handle_pantilt(&pantilt, &joysticks);
|
||||
handle_lepton(&joysticks, &lepton);
|
||||
|
||||
// Sleep for a while to avoid excessive sensitivity
|
||||
uint32_t i = 0;
|
||||
for (; i < SLEEP_DURATION; i++);
|
||||
}
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
@@ -0,0 +1,79 @@
|
||||
#include "joysticks.h"
|
||||
|
||||
#define JOYSTICK_RIGHT_VRY_MCP3204_CHANNEL (0)
|
||||
#define JOYSTICK_RIGHT_VRX_MCP3204_CHANNEL (1)
|
||||
#define JOYSTICK_LEFT_VRY_MCP3204_CHANNEL (2)
|
||||
#define JOYSTICK_LEFT_VRX_MCP3204_CHANNEL (3)
|
||||
|
||||
/**
|
||||
* joysticks_inst
|
||||
*
|
||||
* Instantiate a joysticks device structure.
|
||||
*
|
||||
* @param base Base address of the MCP3204 component connected to the joysticks.
|
||||
*/
|
||||
joysticks_dev joysticks_inst(void *mcp3204_base) {
|
||||
joysticks_dev dev;
|
||||
dev.mcp3204 = mcp3204_inst((void *) mcp3204_base);
|
||||
|
||||
return dev;
|
||||
}
|
||||
|
||||
/**
|
||||
* joysticks_init
|
||||
*
|
||||
* Initializes the joysticks device.
|
||||
*
|
||||
* @param dev joysticks device structure.
|
||||
*/
|
||||
void joysticks_init(joysticks_dev *dev) {
|
||||
mcp3204_init(&(dev->mcp3204));
|
||||
}
|
||||
|
||||
/**
|
||||
* joysticks_read_left_vertical
|
||||
*
|
||||
* Returns the vertical position of the left joystick. Return value ranges
|
||||
* between JOYSTICKS_MIN_VALUE and JOYSTICKS_MAX_VALUE.
|
||||
*
|
||||
* @param dev joysticks device structure.
|
||||
*/
|
||||
uint32_t joysticks_read_left_vertical(joysticks_dev *dev) {
|
||||
return JOYSTICKS_MAX_VALUE - mcp3204_read(&dev->mcp3204, JOYSTICK_RIGHT_VRY_MCP3204_CHANNEL);
|
||||
}
|
||||
|
||||
/**
|
||||
* joysticks_read_left_horizontal
|
||||
*
|
||||
* Returns the horizontal position of the left joystick. Return value ranges
|
||||
* between JOYSTICKS_MIN_VALUE and JOYSTICKS_MAX_VALUE.
|
||||
*
|
||||
* @param dev joysticks device structure.
|
||||
*/
|
||||
uint32_t joysticks_read_left_horizontal(joysticks_dev *dev) {
|
||||
return mcp3204_read(&dev->mcp3204, JOYSTICK_LEFT_VRX_MCP3204_CHANNEL);
|
||||
}
|
||||
|
||||
/**
|
||||
* joysticks_read_right_vertical
|
||||
*
|
||||
* Returns the vertical position of the right joystick. Return value ranges
|
||||
* between JOYSTICKS_MIN_VALUE and JOYSTICKS_MAX_VALUE.
|
||||
*
|
||||
* @param dev joysticks device structure.
|
||||
*/
|
||||
uint32_t joysticks_read_right_vertical(joysticks_dev *dev) {
|
||||
return JOYSTICKS_MAX_VALUE - mcp3204_read(&dev->mcp3204, JOYSTICK_RIGHT_VRY_MCP3204_CHANNEL);
|
||||
}
|
||||
|
||||
/**
|
||||
* joysticks_read_right_horizontal
|
||||
*
|
||||
* Returns the horizontal position of the left joystick. Return value ranges
|
||||
* between JOYSTICKS_MIN_VALUE and JOYSTICKS_MAX_VALUE.
|
||||
*
|
||||
* @param dev joysticks device structure.
|
||||
*/
|
||||
uint32_t joysticks_read_right_horizontal(joysticks_dev *dev) {
|
||||
return mcp3204_read(&dev->mcp3204, JOYSTICK_RIGHT_VRX_MCP3204_CHANNEL);
|
||||
}
|
@@ -0,0 +1,27 @@
|
||||
#ifndef __JOYSTICKS_H__
|
||||
#define __JOYSTICKS_H__
|
||||
|
||||
#include "mcp3204/mcp3204.h"
|
||||
|
||||
/* joysticks device structure */
|
||||
typedef struct joysticks_dev {
|
||||
mcp3204_dev mcp3204; /* MCP3204 device handle */
|
||||
} joysticks_dev;
|
||||
|
||||
/*******************************************************************************
|
||||
* Public API
|
||||
******************************************************************************/
|
||||
|
||||
#define JOYSTICKS_MIN_VALUE (MCP3204_MIN_VALUE)
|
||||
#define JOYSTICKS_MAX_VALUE (MCP3204_MAX_VALUE)
|
||||
|
||||
joysticks_dev joysticks_inst(void *mcp3204_base);
|
||||
|
||||
void joysticks_init(joysticks_dev *dev);
|
||||
|
||||
uint32_t joysticks_read_left_vertical(joysticks_dev *dev);
|
||||
uint32_t joysticks_read_left_horizontal(joysticks_dev *dev);
|
||||
uint32_t joysticks_read_right_vertical(joysticks_dev *dev);
|
||||
uint32_t joysticks_read_right_horizontal(joysticks_dev *dev);
|
||||
|
||||
#endif /* __JOYSTICKS_H__ */
|
@@ -0,0 +1,44 @@
|
||||
#include "mcp3204.h"
|
||||
#include "iorw.h"
|
||||
|
||||
#define MCP3204_NUM_CHANNELS (4)
|
||||
|
||||
/**
|
||||
* mcp3204_inst
|
||||
*
|
||||
* Instantiate a mcp3204 device structure.
|
||||
*
|
||||
* @param base Base address of the component.
|
||||
*/
|
||||
mcp3204_dev mcp3204_inst(void *base) {
|
||||
mcp3204_dev dev;
|
||||
dev.base = base;
|
||||
|
||||
return dev;
|
||||
}
|
||||
|
||||
/**
|
||||
* mcp3204_init
|
||||
*
|
||||
* Initializes the mcp3204 device.
|
||||
*
|
||||
* @param dev mcp3204 device structure.
|
||||
*/
|
||||
void mcp3204_init(mcp3204_dev *dev) {
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* mcp3204_read
|
||||
*
|
||||
* Reads the register corresponding to the supplied channel parameter.
|
||||
*
|
||||
* @param dev mcp3204 device structure.
|
||||
* @param channel channel to be read
|
||||
*/
|
||||
uint32_t mcp3204_read(mcp3204_dev *dev, uint32_t channel) {
|
||||
if (channel >= 4)
|
||||
return 0;
|
||||
|
||||
return io_read_32(dev->base, channel * 4);
|
||||
}
|
@@ -0,0 +1,23 @@
|
||||
#ifndef __MCP3204_H__
|
||||
#define __MCP3204_H__
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/* mcp3204 device structure */
|
||||
typedef struct mcp3204_dev {
|
||||
void *base; /* Base address of component */
|
||||
} mcp3204_dev;
|
||||
|
||||
/*******************************************************************************
|
||||
* Public API
|
||||
******************************************************************************/
|
||||
|
||||
#define MCP3204_MIN_VALUE (0)
|
||||
#define MCP3204_MAX_VALUE (4095)
|
||||
|
||||
mcp3204_dev mcp3204_inst(void *base);
|
||||
|
||||
void mcp3204_init(mcp3204_dev *dev);
|
||||
uint32_t mcp3204_read(mcp3204_dev *dev, uint32_t channel);
|
||||
|
||||
#endif /* __MCP3204_H__ */
|
@@ -0,0 +1,9 @@
|
||||
#ifndef __MCP3204_REGS_H__
|
||||
#define __MCP3204_REGS_H__
|
||||
|
||||
#define MCP3204_CHANNEL_0_OFST (0 * 4) /* RO */
|
||||
#define MCP3204_CHANNEL_1_OFST (1 * 4) /* RO */
|
||||
#define MCP3204_CHANNEL_2_OFST (2 * 4) /* RO */
|
||||
#define MCP3204_CHANNEL_3_OFST (3 * 4) /* RO */
|
||||
|
||||
#endif /* __MCP3204_REGS_H__ */
|
117
cs309-psoc/lab_3_1/sw/hps/application/lab_3_0/lepton/lepton.c
Normal file
117
cs309-psoc/lab_3_1/sw/hps/application/lab_3_0/lepton/lepton.c
Normal file
@@ -0,0 +1,117 @@
|
||||
#include <assert.h>
|
||||
#include <inttypes.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "lepton_regs.h"
|
||||
#include "lepton.h"
|
||||
#include "iorw.h"
|
||||
|
||||
/**
|
||||
* lepton_inst
|
||||
*
|
||||
* Instantiate a lepton device structure.
|
||||
*
|
||||
* @param base Base address of the component.
|
||||
*/
|
||||
lepton_dev lepton_inst(void *base) {
|
||||
lepton_dev dev;
|
||||
dev.base = base;
|
||||
|
||||
return dev;
|
||||
}
|
||||
|
||||
/**
|
||||
* lepton_init
|
||||
*
|
||||
* Initializes the lepton device.
|
||||
*
|
||||
* @param dev lepton device structure.
|
||||
*/
|
||||
void lepton_init(lepton_dev *dev) {
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* lepton_start_capture
|
||||
*
|
||||
* Instructs the device to start the frame capture process.
|
||||
*
|
||||
* @param dev lepton device structure.
|
||||
*/
|
||||
void lepton_start_capture(lepton_dev *dev) {
|
||||
io_write_16(dev->base, LEPTON_REGS_COMMAND_OFST, 0x1);
|
||||
}
|
||||
|
||||
/**
|
||||
* lepton_error_check
|
||||
*
|
||||
* @abstract Check for errors at the device level.
|
||||
* @param dev lepton device structure.
|
||||
* @return true if there was an error, and false otherwise.
|
||||
*/
|
||||
bool lepton_error_check(lepton_dev *dev) {
|
||||
return (io_read_16(dev->base, LEPTON_REGS_STATUS_OFST) & 0x2) != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* lepton_wait_until_eof
|
||||
*
|
||||
* Waits until the frame being captured has been fully received and saved in the
|
||||
* internal memory.
|
||||
*
|
||||
* @param dev lepton device structure.
|
||||
*/
|
||||
void lepton_wait_until_eof(lepton_dev *dev) {
|
||||
while (io_read_16(dev->base, LEPTON_REGS_STATUS_OFST) & 0x1);
|
||||
}
|
||||
|
||||
/**
|
||||
* lepton_save_capture
|
||||
*
|
||||
* Saves the captured frame on the host filesystem under the supplied filename.
|
||||
* The frame will be saved in PGM format.
|
||||
*
|
||||
* @param dev lepton device structure.
|
||||
* @param adjusted Setting this parameter to false will cause RAW sensor data to
|
||||
* be written to the file.
|
||||
* Setting this parameter to true will cause a preprocessed image
|
||||
* (with a stretched dynamic range) to be saved to the file.
|
||||
*
|
||||
* @param fname the output file name.
|
||||
*/
|
||||
void lepton_save_capture(lepton_dev *dev, bool adjusted, FILE* file) {
|
||||
assert(file);
|
||||
|
||||
const uint8_t num_rows = 60;
|
||||
const uint8_t num_cols = 80;
|
||||
|
||||
uint16_t offset = LEPTON_REGS_RAW_BUFFER_OFST;
|
||||
uint16_t max_value = io_read_16(dev->base, LEPTON_REGS_MAX_OFST);
|
||||
if (adjusted) {
|
||||
offset = LEPTON_REGS_ADJUSTED_BUFFER_OFST;
|
||||
max_value = 0x3fff;
|
||||
}
|
||||
|
||||
/* Write PGM header */
|
||||
fprintf(file, "P2\n%" PRIu8 " %" PRIu8 "\n%" PRIu16, num_cols, num_rows, max_value);
|
||||
|
||||
/* Write body */
|
||||
uint8_t row = 0;
|
||||
for (row = 0; row < num_rows; ++row) {
|
||||
fprintf(file, "\n");
|
||||
|
||||
uint8_t col = 0;
|
||||
for (col = 0; col < num_cols; ++col) {
|
||||
if (col > 0) {
|
||||
fprintf(file, " ");
|
||||
}
|
||||
|
||||
uint16_t current_ofst = offset + (row * num_cols + col) * sizeof(uint16_t);
|
||||
uint16_t pix_value = io_read_16(dev->base, current_ofst);
|
||||
fprintf(file, "%" PRIu16, pix_value);
|
||||
}
|
||||
}
|
||||
|
||||
assert(!fclose(file));
|
||||
}
|
@@ -0,0 +1,23 @@
|
||||
#ifndef __LEPTON_H__
|
||||
#define __LEPTON_H__
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
/* lepton device structure */
|
||||
typedef struct {
|
||||
void *base; /* Base address of the component */
|
||||
} lepton_dev;
|
||||
|
||||
/*******************************************************************************
|
||||
* Public API
|
||||
******************************************************************************/
|
||||
|
||||
lepton_dev lepton_inst(void *base);
|
||||
|
||||
void lepton_init(lepton_dev *dev);
|
||||
void lepton_start_capture(lepton_dev *dev);
|
||||
void lepton_wait_until_eof(lepton_dev *dev);
|
||||
bool lepton_error_check(lepton_dev *dev);
|
||||
void lepton_save_capture(lepton_dev *dev, bool adjusted, FILE* file);
|
||||
|
||||
#endif /* __LEPTON_H__ */
|
@@ -0,0 +1,25 @@
|
||||
#ifndef __LEPTON_REGS_H__
|
||||
#define __LEPTON_REGS_H__
|
||||
|
||||
/* Register offsets */
|
||||
#define LEPTON_REGS_COMMAND_OFST ( 0 * 2) /* WO */
|
||||
#define LEPTON_REGS_STATUS_OFST ( 1 * 2) /* RO */
|
||||
#define LEPTON_REGS_MIN_OFST ( 2 * 2) /* RO */
|
||||
#define LEPTON_REGS_MAX_OFST ( 3 * 2) /* RO */
|
||||
#define LEPTON_REGS_SUM_LSB_OFST ( 4 * 2) /* RO */
|
||||
#define LEPTON_REGS_SUM_MSB_OFST ( 5 * 2) /* RO */
|
||||
#define LEPTON_REGS_ROW_IDX_OFST ( 6 * 2) /* RO */
|
||||
#define LEPTON_REGS_RAW_BUFFER_OFST ( 8 * 2) /* RO */
|
||||
#define LEPTON_REGS_ADJUSTED_BUFFER_OFST (8192 * 2) /* RO */
|
||||
|
||||
/* Command register */
|
||||
#define LEPTON_COMMAND_START (0x0001)
|
||||
|
||||
/* Status register */
|
||||
#define LEPTON_STATUS_CAPTURE_IN_PROGRESS_MASK (1 << 0)
|
||||
#define LEPTON_STATUS_ERROR_MASK (1 << 1)
|
||||
|
||||
#define LEPTON_REGS_BUFFER_NUM_PIXELS (80 * 60)
|
||||
#define LEPTON_REGS_BUFFER_BYTELENGTH (LEPTON_REGS_BUFFER_NUM_PIXELS * 2)
|
||||
|
||||
#endif /* __LEPTON_REGS_H__ */
|
109
cs309-psoc/lab_3_1/sw/hps/application/lab_3_0/pantilt/pantilt.c
Normal file
109
cs309-psoc/lab_3_1/sw/hps/application/lab_3_0/pantilt/pantilt.c
Normal file
@@ -0,0 +1,109 @@
|
||||
#include "pantilt.h"
|
||||
|
||||
/**
|
||||
* pantilt_inst
|
||||
*
|
||||
* Instantiate a pantilt device structure.
|
||||
*
|
||||
* @param pwm_v_base Base address of the vertical PWM component.
|
||||
* @param pwm_h_base Base address of the horizontal PWM component.
|
||||
*/
|
||||
pantilt_dev pantilt_inst(void *pwm_v_base, void *pwm_h_base) {
|
||||
pantilt_dev dev;
|
||||
dev.pwm_v = pwm_inst(pwm_v_base);
|
||||
dev.pwm_h = pwm_inst(pwm_h_base);
|
||||
|
||||
return dev;
|
||||
}
|
||||
|
||||
/**
|
||||
* pantilt_init
|
||||
*
|
||||
* Initializes the pantilt device.
|
||||
*
|
||||
* @param dev pantilt device structure.
|
||||
*/
|
||||
void pantilt_init(pantilt_dev *dev) {
|
||||
pwm_init(&(dev->pwm_v));
|
||||
pwm_init(&(dev->pwm_h));
|
||||
}
|
||||
|
||||
/**
|
||||
* pantilt_configure_vertical
|
||||
*
|
||||
* Configure the vertical PWM component.
|
||||
*
|
||||
* @param dev pantilt device structure.
|
||||
* @param duty_cycle pwm duty cycle in us.
|
||||
*/
|
||||
void pantilt_configure_vertical(pantilt_dev *dev, uint32_t duty_cycle) {
|
||||
// Need to compensate for inverted servo rotation.
|
||||
duty_cycle = PANTILT_PWM_V_MAX_DUTY_CYCLE_US - duty_cycle + PANTILT_PWM_V_MIN_DUTY_CYCLE_US;
|
||||
|
||||
pwm_configure(&(dev->pwm_v),
|
||||
duty_cycle,
|
||||
PANTILT_PWM_PERIOD_US,
|
||||
PANTILT_PWM_CLOCK_FREQ_HZ);
|
||||
}
|
||||
|
||||
/**
|
||||
* pantilt_configure_horizontal
|
||||
*
|
||||
* Configure the horizontal PWM component.
|
||||
*
|
||||
* @param dev pantilt device structure.
|
||||
* @param duty_cycle pwm duty cycle in us.
|
||||
*/
|
||||
void pantilt_configure_horizontal(pantilt_dev *dev, uint32_t duty_cycle) {
|
||||
// Need to compensate for inverted servo rotation.
|
||||
duty_cycle = PANTILT_PWM_H_MAX_DUTY_CYCLE_US - duty_cycle + PANTILT_PWM_H_MIN_DUTY_CYCLE_US;
|
||||
|
||||
pwm_configure(&(dev->pwm_h),
|
||||
duty_cycle,
|
||||
PANTILT_PWM_PERIOD_US,
|
||||
PANTILT_PWM_CLOCK_FREQ_HZ);
|
||||
}
|
||||
|
||||
/**
|
||||
* pantilt_start_vertical
|
||||
*
|
||||
* Starts the vertical pwm controller.
|
||||
*
|
||||
* @param dev pantilt device structure.
|
||||
*/
|
||||
void pantilt_start_vertical(pantilt_dev *dev) {
|
||||
pwm_start(&(dev->pwm_v));
|
||||
}
|
||||
|
||||
/**
|
||||
* pantilt_start_horizontal
|
||||
*
|
||||
* Starts the horizontal pwm controller.
|
||||
*
|
||||
* @param dev pantilt device structure.
|
||||
*/
|
||||
void pantilt_start_horizontal(pantilt_dev *dev) {
|
||||
pwm_start(&(dev->pwm_h));
|
||||
}
|
||||
|
||||
/**
|
||||
* pantilt_stop_vertical
|
||||
*
|
||||
* Stops the vertical pwm controller.
|
||||
*
|
||||
* @param dev pantilt device structure.
|
||||
*/
|
||||
void pantilt_stop_vertical(pantilt_dev *dev) {
|
||||
pwm_stop(&(dev->pwm_v));
|
||||
}
|
||||
|
||||
/**
|
||||
* pantilt_stop_horizontal
|
||||
*
|
||||
* Stops the horizontal pwm controller.
|
||||
*
|
||||
* @param dev pantilt device structure.
|
||||
*/
|
||||
void pantilt_stop_horizontal(pantilt_dev *dev) {
|
||||
pwm_stop(&(dev->pwm_h));
|
||||
}
|
@@ -0,0 +1,39 @@
|
||||
#ifndef __PANTILT_H__
|
||||
#define __PANTILT_H__
|
||||
|
||||
#include "pwm/pwm.h"
|
||||
|
||||
/* joysticks device structure */
|
||||
typedef struct pantilt_dev {
|
||||
pwm_dev pwm_v; /* Vertical PWM device handle */
|
||||
pwm_dev pwm_h; /* Horizontal PWM device handle */
|
||||
} pantilt_dev;
|
||||
|
||||
/*******************************************************************************
|
||||
* Public API
|
||||
******************************************************************************/
|
||||
|
||||
#define PANTILT_PWM_CLOCK_FREQ_HZ (50000000) // 50.00 MHz
|
||||
|
||||
#define PANTILT_PWM_PERIOD_US (25000) // 25.00 ms
|
||||
|
||||
/* Vertical servo */
|
||||
#define PANTILT_PWM_V_MIN_DUTY_CYCLE_US (950) // 0.95 ms
|
||||
#define PANTILT_PWM_V_MAX_DUTY_CYCLE_US (2150) // 2.15 ms
|
||||
|
||||
/* Horizontal servo */
|
||||
#define PANTILT_PWM_H_MIN_DUTY_CYCLE_US (1000) // 1.00 ms
|
||||
#define PANTILT_PWM_H_MAX_DUTY_CYCLE_US (2000) // 2.00 ms
|
||||
|
||||
pantilt_dev pantilt_inst(void *pwm_v_base, void *pwm_h_base);
|
||||
|
||||
void pantilt_init(pantilt_dev *dev);
|
||||
|
||||
void pantilt_configure_vertical(pantilt_dev *dev, uint32_t duty_cycle);
|
||||
void pantilt_configure_horizontal(pantilt_dev *dev, uint32_t duty_cycle);
|
||||
void pantilt_start_vertical(pantilt_dev *dev);
|
||||
void pantilt_start_horizontal(pantilt_dev *dev);
|
||||
void pantilt_stop_vertical(pantilt_dev *dev);
|
||||
void pantilt_stop_horizontal(pantilt_dev *dev);
|
||||
|
||||
#endif /* __PANTILT_H__ */
|
@@ -0,0 +1,68 @@
|
||||
#include "pwm.h"
|
||||
#include "pwm_regs.h"
|
||||
#include "iorw.h"
|
||||
|
||||
#define MICROSEC_TO_CLK(time, freq) ((time) * ((freq) / 1000000))
|
||||
|
||||
/**
|
||||
* pwm_inst
|
||||
*
|
||||
* Instantiate a pwm device structure.
|
||||
*
|
||||
* @param base Base address of the component.
|
||||
*/
|
||||
pwm_dev pwm_inst(void *base) {
|
||||
pwm_dev dev;
|
||||
|
||||
dev.base = base;
|
||||
|
||||
return dev;
|
||||
}
|
||||
|
||||
/**
|
||||
* pwm_init
|
||||
*
|
||||
* Initializes the pwm device. This function stops the controller.
|
||||
*
|
||||
* @param dev pwm device structure.
|
||||
*/
|
||||
void pwm_init(pwm_dev *dev) {
|
||||
pwm_stop(dev);
|
||||
}
|
||||
|
||||
/**
|
||||
* pwm_configure
|
||||
*
|
||||
* Configure pwm component.
|
||||
*
|
||||
* @param dev pwm device structure.
|
||||
* @param duty_cycle pwm duty cycle in us.
|
||||
* @param period pwm period in us.
|
||||
* @param module_frequency frequency at which the component is clocked.
|
||||
*/
|
||||
void pwm_configure(pwm_dev *dev, uint32_t duty_cycle, uint32_t period, uint32_t module_frequency) {
|
||||
io_write_32(dev->base, PWM_PERIOD_OFST, MICROSEC_TO_CLK(period, module_frequency));
|
||||
io_write_32(dev->base, PWM_DUTY_CYCLE_OFST, MICROSEC_TO_CLK(duty_cycle, module_frequency));
|
||||
}
|
||||
|
||||
/**
|
||||
* pwm_start
|
||||
*
|
||||
* Starts the pwm controller.
|
||||
*
|
||||
* @param dev pwm device structure.
|
||||
*/
|
||||
void pwm_start(pwm_dev *dev) {
|
||||
io_write_32(dev->base, PWM_CTRL_OFST, PWM_CTRL_START_MASK);
|
||||
}
|
||||
|
||||
/**
|
||||
* pwm_stop
|
||||
*
|
||||
* Stops the pwm controller.
|
||||
*
|
||||
* @param dev pwm device structure.
|
||||
*/
|
||||
void pwm_stop(pwm_dev *dev) {
|
||||
io_write_32(dev->base, PWM_CTRL_OFST, PWM_CTRL_START_MASK);
|
||||
}
|
@@ -0,0 +1,21 @@
|
||||
#ifndef __PWM_H__
|
||||
#define __PWM_H__
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/* pwm device structure */
|
||||
typedef struct pwm_dev {
|
||||
void *base; /* Base address of component */
|
||||
} pwm_dev;
|
||||
|
||||
/*******************************************************************************
|
||||
* Public API
|
||||
******************************************************************************/
|
||||
pwm_dev pwm_inst(void *base);
|
||||
|
||||
void pwm_init(pwm_dev *dev);
|
||||
void pwm_configure(pwm_dev *dev, uint32_t duty_cycle, uint32_t period, uint32_t module_frequency);
|
||||
void pwm_start(pwm_dev *dev);
|
||||
void pwm_stop(pwm_dev *dev);
|
||||
|
||||
#endif /* __PWM_H__ */
|
@@ -0,0 +1,11 @@
|
||||
#ifndef __PWM_REGS_H__
|
||||
#define __PWM_REGS_H__
|
||||
|
||||
#define PWM_PERIOD_OFST (0 * 4) /* RW */
|
||||
#define PWM_DUTY_CYCLE_OFST (1 * 4) /* RW */
|
||||
#define PWM_CTRL_OFST (2 * 4) /* WO */
|
||||
|
||||
#define PWM_CTRL_STOP_MASK (0)
|
||||
#define PWM_CTRL_START_MASK (1)
|
||||
|
||||
#endif /* __PWM_REGS_H__ */
|
22
cs309-psoc/lab_3_1/sw/hps/linux/rootfs/config_post_install.sh
Executable file
22
cs309-psoc/lab_3_1/sw/hps/linux/rootfs/config_post_install.sh
Executable file
@@ -0,0 +1,22 @@
|
||||
#!/bin/bash -x
|
||||
# apt sources
|
||||
# uncomment the "deb" lines (no need to uncomment "deb src" lines)
|
||||
|
||||
# Edit the “/etc/apt/sources.list” file to configure the package manager. This
|
||||
# file contains a list of mirrors that the package manager queries. By default,
|
||||
# this file has all fields commented out, so the package manager will not have
|
||||
# access to any mirrors. The following command uncomments all commented out
|
||||
# lines starting with "deb". These contain the mirrors we are interested in.
|
||||
sudo perl -pi -e 's/^#+\s+(deb\s+http)/$1/g' "/etc/apt/sources.list"
|
||||
|
||||
# When writing our linux applications, we want to use ARM DS-5’s remote
|
||||
# debugging feature to automatically transfer our binaries to the target device
|
||||
# and to start a debugging session. The remote debugging feature requires an SSH
|
||||
# server and a remote gdb server to be available on the target. These are easy
|
||||
# to install as we have a package manager available
|
||||
sudo apt update
|
||||
sudo apt -y install ssh gdbserver
|
||||
|
||||
# Allow root SSH login with password (needed so we can use ARM DS-5 for remote
|
||||
# debugging)
|
||||
sudo perl -pi -e 's/^(PermitRootLogin) without-password$/$1 yes/g' "/etc/ssh/sshd_config"
|
74
cs309-psoc/lab_3_1/sw/hps/linux/rootfs/config_system.sh
Executable file
74
cs309-psoc/lab_3_1/sw/hps/linux/rootfs/config_system.sh
Executable file
@@ -0,0 +1,74 @@
|
||||
#!/bin/bash -x
|
||||
# Configure the locale to have proper language support.
|
||||
localedef -i en_US -c -f UTF-8 en_US.UTF-8
|
||||
dpkg-reconfigure locales
|
||||
# Configure the timezone.
|
||||
echo "Europe/Zurich" > "/etc/timezone"
|
||||
dpkg-reconfigure -f noninteractive tzdata
|
||||
# Set the machine’s hostname.
|
||||
echo "DE0-Nano-SoC" > "/etc/hostname"
|
||||
tee "/etc/hosts" >"/dev/null" <<EOF
|
||||
127.0.0.1 localhost
|
||||
127.0.1.1 DE0-Nano-SoC
|
||||
EOF
|
||||
# Create the “/etc/network/interfaces” file that describes the network
|
||||
# interfaces available on the board.
|
||||
tee "/etc/network/interfaces" > "/dev/null" <<EOF
|
||||
# interfaces(5) file used by ifup(8) and ifdown(8)
|
||||
# The loopback network interface
|
||||
auto lo
|
||||
iface lo inet loopback
|
||||
# The primary network interface
|
||||
auto eth0
|
||||
iface eth0 inet dhcp
|
||||
EOF
|
||||
# DNS configuration for name resolution. We use google's public DNS server here.
|
||||
sudo tee "/etc/resolv.conf" > "/dev/null" <<EOF
|
||||
nameserver 8.8.8.8
|
||||
EOF
|
||||
# Configure Ubuntu Core to display a login shell on the serial console once the
|
||||
# kernel boots. We had previously configured U-Boot to supply the command-line
|
||||
# argument "console=ttyS0,115200" to the linux kernel. This argument instructs
|
||||
# the kernel to use serial console “ttyS0” as the boot shell, so here we choose
|
||||
# to use the same serial console for the login shell
|
||||
tee "/etc/init/ttyS0.conf" > "/dev/null" <<EOF
|
||||
# ttyS0 - getty
|
||||
#
|
||||
# This service maintains a getty on ttyS0
|
||||
description "Get a getty on ttyS0"
|
||||
start on runlevel [2345]
|
||||
stop on runlevel [016]
|
||||
respawn
|
||||
exec /sbin/getty -L 115200 ttyS0 vt102
|
||||
EOF
|
||||
# Create a user and a password. In this example, we create a user called
|
||||
# “sahand” with password "1234". Note that we compute an encrypted version of
|
||||
# the password, because useradd does not allow plain text passwords to be used
|
||||
# in non-interactive mode.
|
||||
username="sahand"
|
||||
password="1234"
|
||||
encrypted_password="$(perl -e 'printf("%s\n", crypt($ARGV[0], "password"))' "${password}")"
|
||||
useradd -m -p "${encrypted_password}" -s "/bin/bash" "${username}"
|
||||
# Ubuntu requires the admin to be part of the "adm" and "sudo" groups, so add
|
||||
# the previously-created user to the 2 groups.
|
||||
addgroup ${username} adm
|
||||
addgroup ${username} sudo
|
||||
# Set root password to "1234" (same as previously-created user).
|
||||
echo -e "${password}\n${password}\n" | passwd root
|
||||
# Remove "/rootfs_config.sh" from /etc/rc.local to avoid reconfiguring system on
|
||||
# next boot
|
||||
tee "/etc/rc.local" > "/dev/null" <<EOF
|
||||
#!/bin/sh -e
|
||||
#
|
||||
# rc.local
|
||||
#
|
||||
# This script is executed at the end of each multiuser runlevel.
|
||||
# Make sure that the script will "exit 0" on success or any other
|
||||
# value on error.
|
||||
#
|
||||
# In order to enable or disable this script just change the execution
|
||||
# bits.
|
||||
#
|
||||
# By default this script does nothing.
|
||||
exit 0
|
||||
EOF
|
Reference in New Issue
Block a user