This file is indexed.

/usr/include/simavr/avr_adc.h is in libsimavr-dev 1.5+dfsg1-2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
/*
	avr_adc.h

	Copyright 2008, 2009 Michel Pollet <buserror@gmail.com>

 	This file is part of simavr.

	simavr is free software: you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation, either version 3 of the License, or
	(at your option) any later version.

	simavr is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with simavr.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef __AVR_ADC_H___
#define __AVR_ADC_H___

#ifdef __cplusplus
extern "C" {
#endif

#include "sim_avr.h"

/*
 * simavr ADC allows external code to feed real voltages to the
 * simulator, and the simulator uses it's 'real' reference voltage
 * to do the right thing and return the 'proper' 10 bits ADC value
 * to the AVR firmware.
 *
 * To send values to the ADC, register your code to wait for the
 * ADC_IRQ_OUT_TRIGGER irq, and at that point send any of the
 * ADC_IRQ_ADC* with Millivolts as value.
 *
 * External trigger is not done yet.
 */

enum {
	// input IRQ values. Values are /always/ volts * 1000 (millivolts)
	ADC_IRQ_ADC0 = 0, ADC_IRQ_ADC1, ADC_IRQ_ADC2, ADC_IRQ_ADC3,
	ADC_IRQ_ADC4, ADC_IRQ_ADC5, ADC_IRQ_ADC6, ADC_IRQ_ADC7,
	ADC_IRQ_ADC8, ADC_IRQ_ADC9, ADC_IRQ_ADC10, ADC_IRQ_ADC11,
	ADC_IRQ_ADC12, ADC_IRQ_ADC13, ADC_IRQ_ADC14, ADC_IRQ_ADC15,
	ADC_IRQ_TEMP,			// see the datasheet
	ADC_IRQ_IN_TRIGGER,
	ADC_IRQ_OUT_TRIGGER,	// sends a avr_adc_mux_t
	ADC_IRQ_COUNT
};

// Get the internal IRQ corresponding to the INT
#define AVR_IOCTL_ADC_GETIRQ AVR_IOCTL_DEF('a','d','c',' ')

/*
 * Definition of a ADC mux mode.
 */
enum {
	ADC_MUX_NONE = 0,		// Nothing. return 0
	ADC_MUX_NOISE,			// Nothing. return something random
	ADC_MUX_SINGLE,			// Normal ADC pin reading
	ADC_MUX_DIFF,			// differential channels (src-diff)
	ADC_MUX_TEMP,			// internal temp sensor
	ADC_MUX_REF,			// reference voltage (in src * 100)
	ADC_MUX_VCC4,			// VCC/4
};
typedef struct avr_adc_mux_t {
	unsigned long kind : 3, gain : 8, diff : 8, src : 13;
} avr_adc_mux_t;

enum {
	ADC_VREF_AREF	= 0,	// default mode
	ADC_VREF_VCC,
	ADC_VREF_AVCC,
	ADC_VREF_V110	= 1100,
	ADC_VREF_V256	= 2560,
};

// ADC trigger sources
typedef enum {
	avr_adts_none = 0,
	avr_adts_free_running,
	avr_adts_analog_comparator_0,
	avr_adts_analog_comparator_1,
	avr_adts_analog_comparator_2,
	avr_adts_analog_comparator_3,
	avr_adts_external_interrupt_0,
	avr_adts_timer_0_compare_match_a,
	avr_adts_timer_0_compare_match_b,
	avr_adts_timer_0_overflow,
	avr_adts_timer_1_compare_match_b,
	avr_adts_timer_1_overflow,
	avr_adts_timer_1_capture_event,
	avr_adts_pin_change_interrupt,
	avr_adts_psc_module_0_sync_signal,
	avr_adts_psc_module_1_sync_signal,
	avr_adts_psc_module_2_sync_signal,
} avr_adts_type;

typedef struct avr_adc_t {
	avr_io_t		io;

	uint8_t 		r_admux;
	// if the last bit exists in the mux, we are an extended ADC
	avr_regbit_t	mux[6];
	avr_regbit_t	ref[3];		// reference voltages bits
	uint16_t		ref_values[7]; // ADC_VREF_*

	avr_regbit_t 	adlar;		// left/right adjustment bit

	uint8_t			r_adcsra;	// ADC Control and Status Register A
	avr_regbit_t 	aden;		// ADC Enabled
	avr_regbit_t 	adsc;		// ADC Start Conversion
	avr_regbit_t 	adate;		// ADC Auto Trigger Enable

	avr_regbit_t	adps[3];	// Prescaler bits. Note that it's a frequency bit shift

	uint8_t			r_adcl, r_adch;	// Data Registers

	uint8_t			r_adcsrb;	// ADC Control and Status Register B
	avr_regbit_t	adts[4];	// Timing Source
	avr_adts_type	adts_op[16];    // ADTS type
	uint8_t		adts_mode;      // the extracted ADTS mode
	avr_regbit_t 	bin;		// Bipolar Input Mode (tinyx5 have it)
	avr_regbit_t 	ipr;		// Input Polarity Reversal (tinyx5 have it)

	// use ADIF and ADIE bits
	avr_int_vector_t adc;

	/*
	 * runtime bits
	 */
	avr_adc_mux_t	muxmode[64];// maximum 6 bits of mux modes
	uint16_t		adc_values[8];	// current values on the ADCs
	uint16_t		temp;		// temp sensor reading
	uint8_t			first;
	uint8_t			read_status;	// marked one when adcl is read
} avr_adc_t;

void avr_adc_init(avr_t * avr, avr_adc_t * port);


/*
 * Helper macros for the Cores definition of muxes
 */
#define AVR_ADC_SINGLE(_chan) { \
		.kind = ADC_MUX_SINGLE, \
		.src = (_chan), \
	}
#define AVR_ADC_DIFF(_a,_b,_g) { \
		.kind = ADC_MUX_DIFF, \
		.src = (_a), \
		.diff = (_b), \
		.gain = (_g), \
	}
#define AVR_ADC_REF(_t) { \
		.kind = ADC_MUX_REF, \
		.src = (_t), \
	}
#define AVR_ADC_TEMP() { \
		.kind = ADC_MUX_TEMP, \
	}

#define AVR_ADC_VCC4() { \
		.kind = ADC_MUX_VCC4, \
	}

#ifdef __cplusplus
};
#endif

#endif /* __AVR_ADC_H___ */