9
0
Fork 0
barebox/include/jtag.h

110 lines
3.9 KiB
C

/*
* include/linux/jtag.h
*
* Written Aug 2009 by Davide Rizzo <elpa.rizzo@gmail.com>
*
* This program 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 2 of the License, or
* (at your option) any later version.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/*
* This driver manages one or more jtag chains controlled by host pins.
* Jtag chains must be defined during setup using jtag_platdata structs.
* All operations must be done from user programs using ioctls to /dev/jtag
* Typical operation sequence is:
* - open() the device (normally /dev/jtag)
* - ioctl JTAG_GET_DEVICES reads how many devices in the chain
* (repeat for each chip in the chain)
* - ioctl JTAG_GET_ID identifies the chip
* - ioctl JTAG_SET_IR_LENGTH sets the instruction register length
* Before accessing the data registers, instruction registers' lenghtes
* MUST be programmed for all chips.
* After this initialization, you can execute JTAG_IR_WR, JTAG_DR_RD, JTAG_DR_WR
* commands in any sequence.
*/
#ifndef __JTAG_H__
#define __JTAG_H__
/* Controller's gpio_tdi must be connected to last device's gpio_tdo */
/* Controller's gpio_tdo must be connected to first device's gpio_tdi */
struct jtag_platdata {
unsigned int gpio_tclk;
unsigned int gpio_tms;
unsigned int gpio_tdi;
unsigned int gpio_tdo;
unsigned int gpio_trst;
int use_gpio_trst;
};
#define JTAG_NAME "jtag"
/* structures used for passing arguments to ioctl */
struct jtag_rd_id {
int device; /* Device in the chain */
unsigned long id;
};
struct jtag_cmd {
int device; /* Device in the chain (-1 = all devices) */
unsigned int bitlen; /* Bit length of the register to be transfered */
unsigned long *data; /* Data to be transfered */
};
/* Use 'j' as magic number */
#define JTAG_IOC_MAGIC 'j'
/* ioctl commands */
/* Resets jtag chain status, arg is ignored */
#define JTAG_RESET _IO(JTAG_IOC_MAGIC, 0)
/* Returns the number of devices in the jtag chain, arg is ignored. */
#define JTAG_GET_DEVICES _IO(JTAG_IOC_MAGIC, 1)
/* arg must point to a jtag_rd_id structure.
Fills up the id field with ID of selected device */
#define JTAG_GET_ID _IOR(JTAG_IOC_MAGIC, 2, struct jtag_rd_id)
/* arg must point to a struct jtag_cmd.
Programs the Instruction Register length of specified device at bitlen value.
*data is ignored. */
#define JTAG_SET_IR_LENGTH _IOW(JTAG_IOC_MAGIC, 3, struct jtag_rd_id)
/* arg must point to a struct jtag_cmd.
Writes *data in the Instruction Register of selected device, and BYPASS
instruction into Instruction Registers of all other devices in the chain.
If device == -1, the Instruction Registers of all devices are programmed
to the same value.
bitlen is always ignored, before using this command you have to program all
Instruction Register's lengthes with JTAG_SET_IR_LENGTH command. */
#define JTAG_IR_WR _IOW(JTAG_IOC_MAGIC, 4, struct jtag_cmd)
/* arg must point to a struct jtag_cmd.
Reads data register of selected device, with length bitlen */
#define JTAG_DR_RD _IOR(JTAG_IOC_MAGIC, 5, struct jtag_cmd)
/* arg must point to a struct jtag_cmd.
Writes data register of selected device, with length bitlen.
If device == -1, writes same data on all devices. */
#define JTAG_DR_WR _IOW(JTAG_IOC_MAGIC, 6, struct jtag_cmd)
/* Generates arg pulses on TCLK pin */
#define JTAG_CLK _IOW(JTAG_IOC_MAGIC, 7, unsigned int *)
#define JTAG_IOC_MAXNR 9
#endif /* __JTAG_H__ */