Compare commits
No commits in common. "windows" and "v6.4" have entirely different histories.
|
@ -1,7 +1,3 @@
|
||||||
.DS_Store
|
|
||||||
.deps/
|
|
||||||
.libs/
|
|
||||||
m4/
|
|
||||||
*.diff
|
*.diff
|
||||||
*.patch
|
*.patch
|
||||||
y.output
|
y.output
|
||||||
|
@ -9,16 +5,16 @@ y.tab.h
|
||||||
lexer.c
|
lexer.c
|
||||||
config_gram.c
|
config_gram.c
|
||||||
config_gram.h
|
config_gram.h
|
||||||
|
.cvsignore
|
||||||
.depend
|
.depend
|
||||||
|
.deps
|
||||||
INSTALL
|
INSTALL
|
||||||
Makefile.in
|
Makefile.in
|
||||||
Makefile
|
Makefile
|
||||||
ac_cfg.h.in
|
ac_cfg.h.in
|
||||||
ac_cfg.h.in~
|
|
||||||
aclocal.m4
|
aclocal.m4
|
||||||
autom4te.cache
|
autom4te.cache
|
||||||
configure
|
configure
|
||||||
configure~
|
|
||||||
depcomp
|
depcomp
|
||||||
install-sh
|
install-sh
|
||||||
compile
|
compile
|
||||||
|
@ -35,33 +31,3 @@ config.log
|
||||||
config.status
|
config.status
|
||||||
config.sub
|
config.sub
|
||||||
avrdude
|
avrdude
|
||||||
libtool
|
|
||||||
ltmain.sh
|
|
||||||
ylwrap
|
|
||||||
tags
|
|
||||||
cscope.out
|
|
||||||
|
|
||||||
*.o
|
|
||||||
*.lo
|
|
||||||
*.a
|
|
||||||
*.la
|
|
||||||
|
|
||||||
# CMake
|
|
||||||
out/
|
|
||||||
build/
|
|
||||||
build_*/
|
|
||||||
|
|
||||||
# Visual Studio
|
|
||||||
.vs/
|
|
||||||
[Dd]ebug/
|
|
||||||
[Rr]elease/
|
|
||||||
x64/
|
|
||||||
x86/
|
|
||||||
*.suo
|
|
||||||
*.user
|
|
||||||
*.userosscache
|
|
||||||
*.sln.docstates
|
|
||||||
*.log
|
|
||||||
|
|
||||||
# Visual Studio code
|
|
||||||
.vscode/
|
|
|
@ -1,39 +0,0 @@
|
||||||
# EditorConfig: https://editorconfig.org
|
|
||||||
|
|
||||||
root = true
|
|
||||||
|
|
||||||
[{CMakeLists.txt,*.cmake}]
|
|
||||||
charset = utf-8
|
|
||||||
tab_width = 4
|
|
||||||
indent_size = 4
|
|
||||||
indent_style = space
|
|
||||||
trim_trailing_whitespace = true
|
|
||||||
|
|
||||||
[{bootstrap,configure.ac,avrdude.spec.in,Makefile.am}]
|
|
||||||
charset = utf-8
|
|
||||||
tab_width = 4
|
|
||||||
indent_size = 4
|
|
||||||
indent_style = tab
|
|
||||||
|
|
||||||
[avrdude.conf.in]
|
|
||||||
indent_size = 4
|
|
||||||
indent_style = space
|
|
||||||
|
|
||||||
[*.{c,h,cpp,y}]
|
|
||||||
tab_width = 4
|
|
||||||
indent_size = 4
|
|
||||||
indent_style = space
|
|
||||||
insert_final_newline = true
|
|
||||||
trim_trailing_whitespace = true
|
|
||||||
|
|
||||||
[*.md]
|
|
||||||
charset = utf-8
|
|
||||||
tab_width = 2
|
|
||||||
indent_size = 2
|
|
||||||
indent_style = space
|
|
||||||
|
|
||||||
[*.yml]
|
|
||||||
charset = utf-8
|
|
||||||
tab_width = 2
|
|
||||||
indent_size = 2
|
|
||||||
indent_style = space
|
|
|
@ -1,4 +0,0 @@
|
||||||
* text=auto eol=lf
|
|
||||||
*.sln text eol=crlf
|
|
||||||
*.vcxproj text eol=crlf
|
|
||||||
*.vcxproj.filters text eol=crlf
|
|
|
@ -1,293 +0,0 @@
|
||||||
#
|
|
||||||
# build.yml - GitHub build action for AVRDUDE
|
|
||||||
# Copyright (C) 2021 Marius Greuel
|
|
||||||
#
|
|
||||||
# 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, see <http://www.gnu.org/licenses/>.
|
|
||||||
#
|
|
||||||
|
|
||||||
name: Build
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches-ignore:
|
|
||||||
- 'onlinedocs'
|
|
||||||
pull_request:
|
|
||||||
branches-ignore:
|
|
||||||
- 'onlinedocs'
|
|
||||||
workflow_call:
|
|
||||||
|
|
||||||
env:
|
|
||||||
BUILD_TYPE: RelWithDebInfo
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
linux-x86_64:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- name: Install prerequisites
|
|
||||||
run: >-
|
|
||||||
sudo apt-get update
|
|
||||||
|
|
||||||
sudo apt-get install -y
|
|
||||||
build-essential
|
|
||||||
cmake
|
|
||||||
flex
|
|
||||||
bison
|
|
||||||
libelf-dev
|
|
||||||
libusb-dev
|
|
||||||
libusb-1.0-0-dev
|
|
||||||
libhidapi-dev
|
|
||||||
libftdi1-dev
|
|
||||||
libreadline-dev
|
|
||||||
texinfo
|
|
||||||
texlive
|
|
||||||
texi2html
|
|
||||||
- name: Configure
|
|
||||||
run: >-
|
|
||||||
cmake
|
|
||||||
-D BUILD_DOC=1
|
|
||||||
-D DEBUG_CMAKE=1
|
|
||||||
-D HAVE_LINUXGPIO=1
|
|
||||||
-D HAVE_LINUXSPI=1
|
|
||||||
-D CMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}
|
|
||||||
-B build
|
|
||||||
- name: Build
|
|
||||||
run: cmake --build build
|
|
||||||
- name: Archive build artifacts
|
|
||||||
if: always()
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: build-linux-x86_64
|
|
||||||
path: |
|
|
||||||
build/
|
|
||||||
!**/*.d
|
|
||||||
!**/*.o
|
|
||||||
- name: Archive executables
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: avrdude-linux-x86_64
|
|
||||||
path: |
|
|
||||||
build/src/avrdude
|
|
||||||
build/src/avrdude.conf
|
|
||||||
|
|
||||||
linux:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
container: debian:11
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- { arch: i386, processor: i686, prefix: i686-linux-gnu, inc-lib: i386-linux-gnu }
|
|
||||||
- { arch: armhf, processor: armhf, prefix: arm-linux-gnueabihf, inc-lib: arm-linux-gnueabihf }
|
|
||||||
- { arch: arm64, processor: aarch64, prefix: aarch64-linux-gnu, inc-lib: aarch64-linux-gnu }
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- name: Add architecture
|
|
||||||
run: |
|
|
||||||
dpkg --add-architecture ${{matrix.arch}}
|
|
||||||
apt-get update
|
|
||||||
- name: Install prerequisites
|
|
||||||
run: >-
|
|
||||||
apt-get update
|
|
||||||
|
|
||||||
apt-get install -y
|
|
||||||
git
|
|
||||||
cmake
|
|
||||||
flex
|
|
||||||
bison
|
|
||||||
crossbuild-essential-${{matrix.arch}}
|
|
||||||
libelf-dev:${{matrix.arch}}
|
|
||||||
libusb-dev:${{matrix.arch}}
|
|
||||||
libusb-1.0-0-dev:${{matrix.arch}}
|
|
||||||
libhidapi-dev:${{matrix.arch}}
|
|
||||||
libftdi1-dev:${{matrix.arch}}
|
|
||||||
libreadline-dev:${{matrix.arch}}
|
|
||||||
- name: Configure
|
|
||||||
run: >-
|
|
||||||
cmake
|
|
||||||
-D DEBUG_CMAKE=1
|
|
||||||
-D HAVE_LINUXGPIO=1
|
|
||||||
-D HAVE_LINUXSPI=1
|
|
||||||
-D CMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}
|
|
||||||
-D CMAKE_SYSTEM_NAME=Linux
|
|
||||||
-D CMAKE_SYSTEM_PROCESSOR=${{matrix.processor}}
|
|
||||||
-D CMAKE_C_COMPILER=${{matrix.prefix}}-gcc
|
|
||||||
-D CMAKE_FIND_ROOT_PATH=/usr/${{matrix.prefix}}
|
|
||||||
-D CMAKE_INCLUDE_PATH=/usr/include/${{matrix.inc-lib}}
|
|
||||||
-D CMAKE_LIBRARY_PATH=/usr/lib/${{matrix.inc-lib}}
|
|
||||||
-B build
|
|
||||||
- name: Build
|
|
||||||
run: cmake --build build
|
|
||||||
- name: Archive build artifacts
|
|
||||||
if: always()
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: build-linux-${{matrix.processor}}
|
|
||||||
path: |
|
|
||||||
build/
|
|
||||||
!**/*.d
|
|
||||||
!**/*.o
|
|
||||||
- name: Archive executables
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: avrdude-linux-${{matrix.processor}}
|
|
||||||
path: |
|
|
||||||
build/src/avrdude
|
|
||||||
build/src/avrdude.conf
|
|
||||||
|
|
||||||
macos-x86_64:
|
|
||||||
runs-on: macos-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- name: Install prerequisites
|
|
||||||
run: >-
|
|
||||||
# brew update
|
|
||||||
|
|
||||||
brew install
|
|
||||||
cmake
|
|
||||||
flex
|
|
||||||
bison
|
|
||||||
libelf
|
|
||||||
libusb
|
|
||||||
hidapi
|
|
||||||
libftdi
|
|
||||||
readline
|
|
||||||
- name: Configure
|
|
||||||
run: >-
|
|
||||||
cmake
|
|
||||||
-D CMAKE_C_FLAGS=-I/usr/local/include
|
|
||||||
-D CMAKE_EXE_LINKER_FLAGS=-L/usr/local/Cellar
|
|
||||||
-D DEBUG_CMAKE=1
|
|
||||||
-D CMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}
|
|
||||||
-B build
|
|
||||||
- name: Build
|
|
||||||
run: cmake --build build
|
|
||||||
- name: Archive build artifacts
|
|
||||||
if: always()
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: build-macos-x86_64
|
|
||||||
path: |
|
|
||||||
build/
|
|
||||||
!**/*.d
|
|
||||||
!**/*.o
|
|
||||||
- name: Archive executables
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: avrdude-macos-x86_64
|
|
||||||
path: |
|
|
||||||
build/src/avrdude
|
|
||||||
build/src/avrdude.conf
|
|
||||||
|
|
||||||
msvc:
|
|
||||||
runs-on: windows-latest
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- { arch: x86, platform: Win32 }
|
|
||||||
- { arch: x64, platform: x64 }
|
|
||||||
- { arch: arm64, platform: ARM64 }
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- name: Install prerequisites
|
|
||||||
# As Chocolatey is notoriously unreliable, install winflexbison3 directly from GitHub.
|
|
||||||
# run: choco install winflexbison3
|
|
||||||
run: |
|
|
||||||
curl https://github.com/lexxmark/winflexbison/releases/download/v2.5.24/win_flex_bison-2.5.24.zip --location --output winflexbison.zip
|
|
||||||
unzip winflexbison.zip -d ${{github.workspace}}\winflexbison
|
|
||||||
echo "${{github.workspace}}\winflexbison" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
|
||||||
- name: Configure
|
|
||||||
run: >-
|
|
||||||
cmake
|
|
||||||
-A ${{matrix.platform}}
|
|
||||||
-D DEBUG_CMAKE=1
|
|
||||||
-D CMAKE_SYSTEM_VERSION=11
|
|
||||||
-D CMAKE_C_FLAGS_RELWITHDEBINFO="/MT /GL /Zi /O2 /Ob1 /DNDEBUG"
|
|
||||||
-D CMAKE_CXX_FLAGS_RELWITHDEBINFO="/MT /GL /Zi /O2 /Ob1 /DNDEBUG"
|
|
||||||
-D CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO="/DEBUG /INCREMENTAL:NO /LTCG /OPT:REF /OPT:ICF"
|
|
||||||
-D HAVE_LIBREADLINE=HAVE_LIBREADLINE-NOTFOUND
|
|
||||||
-D CMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}
|
|
||||||
-D USE_EXTERNAL_LIBS=1
|
|
||||||
-B build
|
|
||||||
- name: Build
|
|
||||||
run: cmake --build build --config ${{env.BUILD_TYPE}}
|
|
||||||
- name: Archive build artifacts
|
|
||||||
if: always()
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: build-msvc-${{matrix.arch}}
|
|
||||||
path: |
|
|
||||||
build/
|
|
||||||
!**/_deps/
|
|
||||||
!**/*.obj
|
|
||||||
- name: Move executables
|
|
||||||
run: |
|
|
||||||
mv build/src/RelWithDebInfo/avrdude.exe build/src
|
|
||||||
mv build/src/RelWithDebInfo/avrdude.pdb build/src
|
|
||||||
- name: Archive executables
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: avrdude-msvc-${{matrix.arch}}
|
|
||||||
path: |
|
|
||||||
build/src/avrdude.exe
|
|
||||||
build/src/avrdude.pdb
|
|
||||||
build/src/avrdude.conf
|
|
||||||
|
|
||||||
mingw:
|
|
||||||
runs-on: windows-latest
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
shell: msys2 {0}
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- { sys: mingw32, env: i686 }
|
|
||||||
- { sys: mingw64, env: x86_64 }
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: msys2/setup-msys2@v2
|
|
||||||
with:
|
|
||||||
msystem: ${{matrix.sys}}
|
|
||||||
update: true
|
|
||||||
install: >-
|
|
||||||
base-devel
|
|
||||||
mingw-w64-${{matrix.env}}-gcc
|
|
||||||
mingw-w64-${{matrix.env}}-cmake
|
|
||||||
mingw-w64-${{matrix.env}}-libelf
|
|
||||||
mingw-w64-${{matrix.env}}-libusb
|
|
||||||
mingw-w64-${{matrix.env}}-libusb-compat-git
|
|
||||||
mingw-w64-${{matrix.env}}-hidapi
|
|
||||||
mingw-w64-${{matrix.env}}-libftdi
|
|
||||||
- name: Configure
|
|
||||||
run: >-
|
|
||||||
cmake
|
|
||||||
-G"MSYS Makefiles"
|
|
||||||
-D DEBUG_CMAKE=1
|
|
||||||
-D CMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}
|
|
||||||
-B build
|
|
||||||
- name: Build
|
|
||||||
run: cmake --build build
|
|
||||||
- name: Archive build artifacts
|
|
||||||
if: always()
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: build-mingw-${{matrix.env}}
|
|
||||||
path: |
|
|
||||||
build/
|
|
||||||
- name: Archive executables
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: avrdude-mingw-${{matrix.env}}
|
|
||||||
path: |
|
|
||||||
build/src/avrdude.exe
|
|
||||||
build/src/avrdude.conf
|
|
|
@ -1,78 +0,0 @@
|
||||||
#
|
|
||||||
# deploy.yml - GitHub deploy action for AVRDUDE
|
|
||||||
# Copyright (C) 2021 Marius Greuel
|
|
||||||
#
|
|
||||||
# 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, see <http://www.gnu.org/licenses/>.
|
|
||||||
#
|
|
||||||
|
|
||||||
name: Deploy
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- 'v*-windows'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
uses: mariusgreuel/avrdude/.github/workflows/build.yml@windows
|
|
||||||
|
|
||||||
release:
|
|
||||||
needs: build
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
upload_url: ${{ steps.create_release.outputs.upload_url }}
|
|
||||||
steps:
|
|
||||||
- name: Create Release
|
|
||||||
id: create_release
|
|
||||||
uses: actions/create-release@v1
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
|
|
||||||
with:
|
|
||||||
tag_name: ${{github.ref}}
|
|
||||||
release_name: AVRDUDE ${{github.ref}}
|
|
||||||
body: "See **[Release Notes](https://github.com/avrdudes/avrdude/blob/main/NEWS)** for changes"
|
|
||||||
draft: false
|
|
||||||
prerelease: false
|
|
||||||
|
|
||||||
asset-msvc:
|
|
||||||
needs: release
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- { arch: x86 }
|
|
||||||
- { arch: x64 }
|
|
||||||
- { arch: arm64 }
|
|
||||||
steps:
|
|
||||||
- name: Download artifact
|
|
||||||
uses: actions/download-artifact@v2
|
|
||||||
with:
|
|
||||||
name: avrdude-msvc-${{matrix.arch}}
|
|
||||||
|
|
||||||
- name: Create release asset
|
|
||||||
run: >-
|
|
||||||
zip -j asset.zip
|
|
||||||
avrdude.exe
|
|
||||||
avrdude.pdb
|
|
||||||
avrdude.conf
|
|
||||||
|
|
||||||
- name: Upload release asset
|
|
||||||
uses: actions/upload-release-asset@v1
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
|
|
||||||
with:
|
|
||||||
upload_url: ${{needs.release.outputs.upload_url}}
|
|
||||||
asset_path: ./asset.zip
|
|
||||||
asset_name: avrdude-${{github.ref_name}}-windows-${{matrix.arch}}.zip
|
|
||||||
asset_content_type: application/zip
|
|
21
AUTHORS
21
AUTHORS
|
@ -2,14 +2,6 @@ AVRDUDE was written by:
|
||||||
|
|
||||||
Brian S. Dean <bsd@bdmicro.com>
|
Brian S. Dean <bsd@bdmicro.com>
|
||||||
|
|
||||||
AVRDUDE is currently maintained by:
|
|
||||||
|
|
||||||
Hans Eirik Bull
|
|
||||||
Stefan Rueger
|
|
||||||
Xiaofan Chen
|
|
||||||
Marius Greuel
|
|
||||||
Joerg Wunsch
|
|
||||||
|
|
||||||
Contributors:
|
Contributors:
|
||||||
|
|
||||||
Joerg Wunsch <j@uriah.heep.sax.de>
|
Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
@ -34,17 +26,6 @@ Contributors:
|
||||||
Jan Egil Ruud <janegil.ruud@microchip.com>
|
Jan Egil Ruud <janegil.ruud@microchip.com>
|
||||||
David Mosberger <davidm@egauge.net>
|
David Mosberger <davidm@egauge.net>
|
||||||
David Sainty
|
David Sainty
|
||||||
Marius Greuel <greuelm@mgtek.com>
|
|
||||||
Dawid Buchwald <dawid.buchwald@hotmail.com>
|
|
||||||
Hans Eirik Bull
|
|
||||||
Stefan Rueger
|
|
||||||
Xiaofan Chen
|
|
||||||
|
|
||||||
Contributors to code no longer present:
|
For minor contributions, please see the ChangeLog files.
|
||||||
|
|
||||||
Dale Roberts for the giveio driver
|
|
||||||
Paula Tomlinson for the loaddrv sources
|
|
||||||
Chris Liechti for loaddrv modifications
|
|
||||||
|
|
||||||
For minor contributions, please see the ChangeLog files / Git log.
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
$Id$
|
||||||
|
|
||||||
|
How to build avrdude from SVN:
|
||||||
|
|
||||||
|
1. svn co svn://svn.savannah.nongnu.org/avrdude/trunk
|
||||||
|
|
||||||
|
2. cd trunk/avrdude
|
||||||
|
|
||||||
|
3. ./bootstrap
|
||||||
|
|
||||||
|
4. ./configure
|
||||||
|
|
||||||
|
5. make
|
396
CMakeLists.txt
396
CMakeLists.txt
|
@ -1,396 +0,0 @@
|
||||||
#
|
|
||||||
# CMakeLists.txt - CMake project for AVRDUDE
|
|
||||||
# Copyright (C) 2021 Marius Greuel
|
|
||||||
#
|
|
||||||
# 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, see <http://www.gnu.org/licenses/>.
|
|
||||||
#
|
|
||||||
|
|
||||||
# Typical usage:
|
|
||||||
# cmake -B build
|
|
||||||
# cmake --build build
|
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 3.14)
|
|
||||||
project(avrdude VERSION 7.1 LANGUAGES C)
|
|
||||||
|
|
||||||
set(CMAKE_C_STANDARD 11)
|
|
||||||
set(CMAKE_C_STANDARD_REQUIRED True)
|
|
||||||
|
|
||||||
option(BUILD_DOC "Enable building documents" OFF)
|
|
||||||
option(HAVE_LINUXGPIO "Enable Linux sysfs GPIO support" OFF)
|
|
||||||
option(HAVE_LINUXSPI "Enable Linux SPI support" OFF)
|
|
||||||
option(HAVE_PARPORT "Enable parallel port support" OFF)
|
|
||||||
option(USE_EXTERNAL_LIBS "Use external libraries from AVRDUDE GitHub repositories" OFF)
|
|
||||||
option(USE_LIBUSBWIN32 "Prefer libusb-win32 over libusb" OFF)
|
|
||||||
option(DEBUG_CMAKE "Enable debugging output for this CMake project" OFF)
|
|
||||||
option(BUILD_SHARED_LIBS "Build shared libraries" OFF)
|
|
||||||
|
|
||||||
if(WIN32)
|
|
||||||
# Prefer static libraries over DLLs on Windows
|
|
||||||
option(USE_STATIC_LIBS "Use static libraries" ON)
|
|
||||||
else()
|
|
||||||
option(USE_STATIC_LIBS "Use static libraries" OFF)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
include(CheckIncludeFile)
|
|
||||||
include(CheckSymbolExists)
|
|
||||||
include(FetchContent)
|
|
||||||
include(FindPackageMessage)
|
|
||||||
include(GNUInstallDirs)
|
|
||||||
|
|
||||||
set(CONFIG_DIR "${CMAKE_INSTALL_FULL_SYSCONFDIR}")
|
|
||||||
set(AVRDUDE_FULL_VERSION ${CMAKE_PROJECT_VERSION})
|
|
||||||
|
|
||||||
# =====================================
|
|
||||||
# Get Git commit info
|
|
||||||
# =====================================
|
|
||||||
|
|
||||||
# GIT_COMMIT_HASH -> hash of latest commit, e.g. b8b859f5
|
|
||||||
# GIT_COMMIT_DATE -> date of latest commit, e.g. 20201231
|
|
||||||
# GIT_COMMIT_YEAR -> year of latest commit, e.g. 2020
|
|
||||||
|
|
||||||
find_package(Git)
|
|
||||||
if(Git_FOUND)
|
|
||||||
execute_process(
|
|
||||||
COMMAND "${GIT_EXECUTABLE}" log -1 --format=%h
|
|
||||||
WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
|
|
||||||
OUTPUT_VARIABLE GIT_COMMIT_HASH
|
|
||||||
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
||||||
)
|
|
||||||
|
|
||||||
execute_process(
|
|
||||||
COMMAND "${GIT_EXECUTABLE}" log -1 --format=%ad --date=format:%Y%m%d
|
|
||||||
WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
|
|
||||||
OUTPUT_VARIABLE GIT_COMMIT_DATE
|
|
||||||
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
||||||
)
|
|
||||||
|
|
||||||
execute_process(
|
|
||||||
COMMAND "${GIT_EXECUTABLE}" log -1 --format=%ad --date=format:%Y
|
|
||||||
WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
|
|
||||||
OUTPUT_VARIABLE GIT_COMMIT_YEAR
|
|
||||||
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
||||||
)
|
|
||||||
|
|
||||||
execute_process(
|
|
||||||
COMMAND "${GIT_EXECUTABLE}" log -1 --tags --format=%h
|
|
||||||
WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
|
|
||||||
OUTPUT_VARIABLE GIT_TAG_HASH
|
|
||||||
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
||||||
)
|
|
||||||
|
|
||||||
# If the commit is not tagged, include the date and commit hash in the full version string.
|
|
||||||
if(NOT GIT_COMMIT_HASH STREQUAL GIT_TAG_HASH)
|
|
||||||
set(AVRDUDE_FULL_VERSION "${CMAKE_PROJECT_VERSION}-${GIT_COMMIT_DATE} (${GIT_COMMIT_HASH})")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
find_package(FLEX)
|
|
||||||
if(NOT FLEX_FOUND)
|
|
||||||
message(SEND_ERROR "This CMake project requires 'flex', which is not installed on your system." )
|
|
||||||
endif()
|
|
||||||
|
|
||||||
find_package(BISON QUIET)
|
|
||||||
if(BISON_FOUND)
|
|
||||||
find_package_message(BISON "Found BISON: ${BISON_EXECUTABLE} (found version \"${BISON_VERSION}\")" "[${BISON_EXECUTABLE}][${BISON_VERSION}]")
|
|
||||||
else()
|
|
||||||
find_program(YACC_EXECUTABLE NAMES yacc byacc DOC "path to the yacc executable")
|
|
||||||
mark_as_advanced(YACC_EXECUTABLE)
|
|
||||||
if(YACC_EXECUTABLE)
|
|
||||||
find_package_message(YACC "Found YACC: ${YACC_EXECUTABLE}" "[${YACC_EXECUTABLE}]")
|
|
||||||
else()
|
|
||||||
message(SEND_ERROR "This CMake project requires 'bison', 'yacc', or 'byacc', which is not installed on your system." )
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# =====================================
|
|
||||||
# Detect installed libraries
|
|
||||||
# =====================================
|
|
||||||
|
|
||||||
if(USE_STATIC_LIBS)
|
|
||||||
set(PREFERRED_LIBELF libelf.a elf)
|
|
||||||
set(PREFERRED_LIBUSB libusb.a usb)
|
|
||||||
set(PREFERRED_LIBUSB_1_0 libusb-1.0.a usb-1.0)
|
|
||||||
set(PREFERRED_LIBHIDAPI libhidapi.a libhidapi-libusb.a libhidapi-hidraw.a hidapi hidapi-libusb hidapi-hidraw)
|
|
||||||
set(PREFERRED_LIBFTDI libftdi.a ftdi)
|
|
||||||
set(PREFERRED_LIBFTDI1 libftdi1.a ftdi1)
|
|
||||||
set(PREFERRED_LIBREADLINE libreadline.a)
|
|
||||||
else()
|
|
||||||
set(PREFERRED_LIBELF elf)
|
|
||||||
set(PREFERRED_LIBUSB usb)
|
|
||||||
set(PREFERRED_LIBUSB_1_0 usb-1.0)
|
|
||||||
set(PREFERRED_LIBHIDAPI hidapi hidapi-libusb hidapi-hidraw)
|
|
||||||
set(PREFERRED_LIBFTDI ftdi)
|
|
||||||
set(PREFERRED_LIBFTDI1 ftdi1)
|
|
||||||
set(PREFERRED_LIBREADLINE readline)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# -------------------------------------
|
|
||||||
# Find libelf
|
|
||||||
|
|
||||||
find_library(HAVE_LIBELF NAMES ${PREFERRED_LIBELF})
|
|
||||||
if(HAVE_LIBELF)
|
|
||||||
set(LIB_LIBELF ${HAVE_LIBELF})
|
|
||||||
check_include_file(libelf.h HAVE_LIBELF_H)
|
|
||||||
check_include_file(libelf/libelf.h HAVE_LIBELF_LIBELF_H)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# -------------------------------------
|
|
||||||
# Find libusb
|
|
||||||
|
|
||||||
find_library(HAVE_LIBUSB NAMES ${PREFERRED_LIBUSB})
|
|
||||||
if(HAVE_LIBUSB)
|
|
||||||
set(LIB_LIBUSB ${HAVE_LIBUSB})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
find_library(HAVE_LIBUSB_1_0 NAMES ${PREFERRED_LIBUSB_1_0})
|
|
||||||
if(HAVE_LIBUSB_1_0)
|
|
||||||
set(LIB_LIBUSB_1_0 ${HAVE_LIBUSB_1_0})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# FreeBSD's library 'libusb' supports both the libusb-0.1 and libusb-1.0 API.
|
|
||||||
if (HAVE_LIBUSB AND CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
|
|
||||||
set(HAVE_LIBUSB_1_0 ${HAVE_LIBUSB})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
find_library(HAVE_LIBUSB_WIN32 NAMES libusb0.a usb0)
|
|
||||||
|
|
||||||
if(HAVE_LIBUSB OR HAVE_LIBUSB_1_0 OR HAVE_LIBUSB_WIN32)
|
|
||||||
check_include_file(usb.h HAVE_USB_H)
|
|
||||||
check_include_file(lusb0_usb.h HAVE_LUSB0_USB_H)
|
|
||||||
check_include_file(libusb.h HAVE_LIBUSB_H)
|
|
||||||
check_include_file(libusb-1.0/libusb.h HAVE_LIBUSB_1_0_LIBUSB_H)
|
|
||||||
|
|
||||||
if((USE_LIBUSBWIN32 OR NOT HAVE_LIBUSB) AND HAVE_LIBUSB_WIN32)
|
|
||||||
set(HAVE_LIBUSB ${HAVE_LIBUSB_WIN32})
|
|
||||||
set(LIB_LIBUSB ${HAVE_LIBUSB_WIN32})
|
|
||||||
unset(HAVE_USB_H CACHE)
|
|
||||||
elseif(NOT HAVE_USB_H)
|
|
||||||
find_path(LIBUSB_COMPAT_DIR libusb-compat/usb.h)
|
|
||||||
if(LIBUSB_COMPAT_DIR)
|
|
||||||
set(LIBUSB_COMPAT_DIR ${LIBUSB_COMPAT_DIR}/libusb-compat)
|
|
||||||
set(HAVE_USB_H 1)
|
|
||||||
else()
|
|
||||||
unset(LIBUSB_COMPAT_DIR CACHE)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# -------------------------------------
|
|
||||||
# Find libhidapi
|
|
||||||
|
|
||||||
find_library(HAVE_LIBHID NAMES hid)
|
|
||||||
if(HAVE_LIBHID)
|
|
||||||
set(LIB_LIBHID ${HAVE_LIBHID})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
find_library(HAVE_LIBHIDAPI NAMES ${PREFERRED_LIBHIDAPI})
|
|
||||||
if(HAVE_LIBHIDAPI)
|
|
||||||
set(LIB_LIBHIDAPI ${HAVE_LIBHIDAPI})
|
|
||||||
check_include_file(hidapi/hidapi.h HAVE_HIDAPI_HIDAPI_H)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# -------------------------------------
|
|
||||||
# Find libftdi
|
|
||||||
|
|
||||||
find_library(HAVE_LIBFTDI NAMES ${PREFERRED_LIBFTDI})
|
|
||||||
if(HAVE_LIBFTDI)
|
|
||||||
set(LIB_LIBFTDI ${HAVE_LIBFTDI})
|
|
||||||
set(HAVE_LIBFTDI_TYPE_232H 1)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
find_library(HAVE_LIBFTDI1 NAMES ${PREFERRED_LIBFTDI1})
|
|
||||||
if(HAVE_LIBFTDI1)
|
|
||||||
set(LIB_LIBFTDI1 ${HAVE_LIBFTDI1})
|
|
||||||
set(HAVE_LIBFTDI_TYPE_232H 1)
|
|
||||||
set(CMAKE_REQUIRED_LIBRARIES ${LIB_LIBFTDI1} ${LIB_LIBUSB} ${LIB_LIBUSB_1_0})
|
|
||||||
check_symbol_exists(ftdi_tcioflush "libftdi1/ftdi.h" HAVE_FTDI_TCIOFLUSH)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# -------------------------------------
|
|
||||||
# Find libreadline
|
|
||||||
|
|
||||||
find_library(HAVE_LIBREADLINE NAMES ${PREFERRED_LIBREADLINE})
|
|
||||||
if(HAVE_LIBREADLINE)
|
|
||||||
set(LIB_LIBREADLINE ${HAVE_LIBREADLINE})
|
|
||||||
elseif(MSVC)
|
|
||||||
set(HAVE_LIBREADLINE 1)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# =====================================
|
|
||||||
# Use external libraries if requested
|
|
||||||
# =====================================
|
|
||||||
|
|
||||||
if(USE_EXTERNAL_LIBS)
|
|
||||||
FetchContent_Declare(libelf
|
|
||||||
GIT_REPOSITORY https://github.com/avrdudes/libelf.git
|
|
||||||
GIT_TAG e5a39bf19bd6598c42e09172be5a78ceec2a065c
|
|
||||||
)
|
|
||||||
|
|
||||||
FetchContent_Declare(libusb
|
|
||||||
GIT_REPOSITORY https://github.com/avrdudes/libusb.git
|
|
||||||
GIT_TAG 632bc25d04eff563cc00de29435b9a7ed6f4654c
|
|
||||||
)
|
|
||||||
|
|
||||||
FetchContent_Declare(libhidapi
|
|
||||||
GIT_REPOSITORY https://github.com/avrdudes/libhidapi.git
|
|
||||||
GIT_TAG d1307487973c857bc158e27ecc99644b2f5e68ea
|
|
||||||
)
|
|
||||||
|
|
||||||
FetchContent_Declare(libftdi
|
|
||||||
GIT_REPOSITORY https://github.com/avrdudes/libftdi.git
|
|
||||||
GIT_TAG f9fe6e96b97c3a08efd081632c1859cb83aa14e3
|
|
||||||
)
|
|
||||||
|
|
||||||
message(STATUS "Fetching external libraries, please wait...")
|
|
||||||
FetchContent_MakeAvailable(
|
|
||||||
libelf
|
|
||||||
libusb
|
|
||||||
libhidapi
|
|
||||||
libftdi
|
|
||||||
)
|
|
||||||
|
|
||||||
message(STATUS "Using external library 'libelf'")
|
|
||||||
set(LIB_LIBELF libelf)
|
|
||||||
set(HAVE_LIBELF 1)
|
|
||||||
set(HAVE_LIBELF_H 1)
|
|
||||||
|
|
||||||
message(STATUS "Using external library 'libusb'")
|
|
||||||
set(LIB_LIBUSB libusb)
|
|
||||||
set(HAVE_LIBUSB 1)
|
|
||||||
set(HAVE_LUSB0_USB_H 1)
|
|
||||||
|
|
||||||
message(STATUS "Using external library 'libhidapi'")
|
|
||||||
set(LIB_LIBHIDAPI libhidapi)
|
|
||||||
set(HAVE_LIBHIDAPI 1)
|
|
||||||
set(HAVE_HIDAPI_HIDAPI_H 1)
|
|
||||||
|
|
||||||
message(STATUS "Using external library 'libftdi'")
|
|
||||||
set(LIB_LIBFTDI libftdi)
|
|
||||||
set(HAVE_LIBFTDI 1)
|
|
||||||
set(HAVE_LIBFTDI_TYPE_232H 1)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_subdirectory(src)
|
|
||||||
|
|
||||||
if(BUILD_DOC)
|
|
||||||
add_subdirectory(src/doc)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# =====================================
|
|
||||||
# Configuration
|
|
||||||
# =====================================
|
|
||||||
|
|
||||||
message(STATUS "Configuration summary:")
|
|
||||||
message(STATUS "----------------------")
|
|
||||||
|
|
||||||
if (DEBUG_CMAKE)
|
|
||||||
message(STATUS "CMAKE_HOST_SYSTEM: ${CMAKE_HOST_SYSTEM}")
|
|
||||||
message(STATUS "CMAKE_SYSTEM: ${CMAKE_SYSTEM}")
|
|
||||||
message(STATUS "CMAKE_FIND_ROOT_PATH: ${CMAKE_FIND_ROOT_PATH}")
|
|
||||||
message(STATUS "CMAKE_C_COMPILER: ${CMAKE_C_COMPILER}")
|
|
||||||
message(STATUS "CONFIG_DIR: ${CONFIG_DIR}")
|
|
||||||
message(STATUS "AVRDUDE_FULL_VERSION: ${AVRDUDE_FULL_VERSION}")
|
|
||||||
message(STATUS "USE_EXTERNAL_LIBS: ${USE_EXTERNAL_LIBS}")
|
|
||||||
message(STATUS "USE_LIBUSBWIN32: ${USE_LIBUSBWIN32}")
|
|
||||||
message(STATUS "HAVE_LIBELF: ${HAVE_LIBELF}")
|
|
||||||
message(STATUS "HAVE_LIBUSB: ${HAVE_LIBUSB}")
|
|
||||||
message(STATUS "HAVE_LIBUSB_1_0: ${HAVE_LIBUSB_1_0}")
|
|
||||||
message(STATUS "HAVE_LIBUSB_WIN32: ${HAVE_LIBUSB_WIN32}")
|
|
||||||
message(STATUS "HAVE_LIBHID: ${HAVE_LIBHID}")
|
|
||||||
message(STATUS "HAVE_LIBHIDAPI: ${HAVE_LIBHIDAPI}")
|
|
||||||
message(STATUS "HAVE_LIBFTDI: ${HAVE_LIBFTDI}")
|
|
||||||
message(STATUS "HAVE_LIBFTDI1: ${HAVE_LIBFTDI1}")
|
|
||||||
message(STATUS "HAVE_LIBREADLINE: ${HAVE_LIBREADLINE}")
|
|
||||||
message(STATUS "HAVE_LIBELF_H: ${HAVE_LIBELF_H}")
|
|
||||||
message(STATUS "HAVE_LIBELF_LIBELF_H: ${HAVE_LIBELF_LIBELF_H}")
|
|
||||||
message(STATUS "HAVE_USB_H: ${HAVE_USB_H}")
|
|
||||||
message(STATUS "HAVE_LUSB0_USB_H: ${HAVE_LUSB0_USB_H}")
|
|
||||||
message(STATUS "HAVE_LIBUSB_H: ${HAVE_LIBUSB_H}")
|
|
||||||
message(STATUS "HAVE_LIBUSB_1_0_LIBUSB_H: ${HAVE_LIBUSB_1_0_LIBUSB_H}")
|
|
||||||
message(STATUS "HAVE_HIDAPI_HIDAPI_H: ${HAVE_HIDAPI_HIDAPI_H}")
|
|
||||||
message(STATUS "LIBUSB_COMPAT_DIR: ${LIBUSB_COMPAT_DIR}")
|
|
||||||
message(STATUS "----------------------")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(HAVE_LIBELF)
|
|
||||||
message(STATUS "DO HAVE libelf")
|
|
||||||
else()
|
|
||||||
message(STATUS "DON'T HAVE libelf")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(HAVE_LIBUSB)
|
|
||||||
message(STATUS "DO HAVE libusb")
|
|
||||||
else()
|
|
||||||
message(STATUS "DON'T HAVE libusb")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(HAVE_LIBUSB_1_0)
|
|
||||||
message(STATUS "DO HAVE libusb_1_0")
|
|
||||||
else()
|
|
||||||
message(STATUS "DON'T HAVE libusb_1_0")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(HAVE_LIBHIDAPI)
|
|
||||||
message(STATUS "DO HAVE libhidapi")
|
|
||||||
else()
|
|
||||||
message(STATUS "DON'T HAVE libhidapi")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(HAVE_LIBFTDI)
|
|
||||||
if(HAVE_LIBFTDI1)
|
|
||||||
message(STATUS "DO HAVE libftdi (but prefer to use libftdi1)")
|
|
||||||
else()
|
|
||||||
message(STATUS "DO HAVE libftdi")
|
|
||||||
endif()
|
|
||||||
else()
|
|
||||||
message(STATUS "DON'T HAVE libftdi")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(HAVE_LIBFTDI1)
|
|
||||||
message(STATUS "DO HAVE libftdi1")
|
|
||||||
else()
|
|
||||||
message(STATUS "DON'T HAVE libftdi1")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(HAVE_LIBREADLINE)
|
|
||||||
message(STATUS "DO HAVE libreadline")
|
|
||||||
else()
|
|
||||||
message(STATUS "DON'T HAVE libreadline")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(BUILD_DOC)
|
|
||||||
message(STATUS "ENABLED doc")
|
|
||||||
else()
|
|
||||||
message(STATUS "DISABLED doc")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(HAVE_PARPORT)
|
|
||||||
message(STATUS "ENABLED parport")
|
|
||||||
else()
|
|
||||||
message(STATUS "DISABLED parport")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(HAVE_LINUXGPIO)
|
|
||||||
message(STATUS "ENABLED linuxgpio")
|
|
||||||
else()
|
|
||||||
message(STATUS "DISABLED linuxgpio")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(HAVE_LINUXSPI)
|
|
||||||
message(STATUS "ENABLED linuxspi")
|
|
||||||
else()
|
|
||||||
message(STATUS "DISABLED linuxspi")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
message(STATUS "----------------------")
|
|
|
@ -1,76 +0,0 @@
|
||||||
{
|
|
||||||
"configurations": [
|
|
||||||
{
|
|
||||||
"name": "x64-Debug",
|
|
||||||
"generator": "Ninja",
|
|
||||||
"configurationType": "Debug",
|
|
||||||
"inheritEnvironments": [ "msvc_x64_x64" ],
|
|
||||||
"buildRoot": "${projectDir}\\out\\build\\${name}",
|
|
||||||
"installRoot": "${projectDir}\\out\\install\\${name}",
|
|
||||||
"cmakeCommandArgs": "",
|
|
||||||
"buildCommandArgs": "",
|
|
||||||
"ctestCommandArgs": "",
|
|
||||||
"variables": [
|
|
||||||
{
|
|
||||||
"name": "USE_EXTERNAL_LIBS",
|
|
||||||
"value": "true",
|
|
||||||
"type": "BOOL"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "x64-Release",
|
|
||||||
"generator": "Ninja",
|
|
||||||
"configurationType": "RelWithDebInfo",
|
|
||||||
"buildRoot": "${projectDir}\\out\\build\\${name}",
|
|
||||||
"installRoot": "${projectDir}\\out\\install\\${name}",
|
|
||||||
"cmakeCommandArgs": "",
|
|
||||||
"buildCommandArgs": "",
|
|
||||||
"ctestCommandArgs": "",
|
|
||||||
"inheritEnvironments": [ "msvc_x64_x64" ],
|
|
||||||
"variables": [
|
|
||||||
{
|
|
||||||
"name": "USE_EXTERNAL_LIBS",
|
|
||||||
"value": "true",
|
|
||||||
"type": "BOOL"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "x86-Debug",
|
|
||||||
"generator": "Ninja",
|
|
||||||
"configurationType": "Debug",
|
|
||||||
"buildRoot": "${projectDir}\\out\\build\\${name}",
|
|
||||||
"installRoot": "${projectDir}\\out\\install\\${name}",
|
|
||||||
"cmakeCommandArgs": "",
|
|
||||||
"buildCommandArgs": "",
|
|
||||||
"ctestCommandArgs": "",
|
|
||||||
"inheritEnvironments": [ "msvc_x86" ],
|
|
||||||
"variables": [
|
|
||||||
{
|
|
||||||
"name": "USE_EXTERNAL_LIBS",
|
|
||||||
"value": "true",
|
|
||||||
"type": "BOOL"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "x86-Release",
|
|
||||||
"generator": "Ninja",
|
|
||||||
"configurationType": "RelWithDebInfo",
|
|
||||||
"buildRoot": "${projectDir}\\out\\build\\${name}",
|
|
||||||
"installRoot": "${projectDir}\\out\\install\\${name}",
|
|
||||||
"cmakeCommandArgs": "",
|
|
||||||
"buildCommandArgs": "",
|
|
||||||
"ctestCommandArgs": "",
|
|
||||||
"inheritEnvironments": [ "msvc_x86" ],
|
|
||||||
"variables": [
|
|
||||||
{
|
|
||||||
"name": "USE_EXTERNAL_LIBS",
|
|
||||||
"value": "true",
|
|
||||||
"type": "BOOL"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
|
@ -0,0 +1,320 @@
|
||||||
|
2021-12-16 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac (AC_INIT): Bump version to 6.4
|
||||||
|
* main.c: Remove unmaintained year numbers from Copyright
|
||||||
|
|
||||||
|
2021-12-06 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #57338: if safemode has to change fuses avrdude should exit with non-zero exit code
|
||||||
|
* main.c (main): drop unused variable `fuses_specified'
|
||||||
|
|
||||||
|
2021-12-06 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Dmitrii Chernukhin:
|
||||||
|
bug #58994: VPP PWM still enabled at the end of programming process
|
||||||
|
* pickit2.c (pickit2_disable): turn off VPP before shutting down
|
||||||
|
|
||||||
|
2021-12-05 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac (AC_INIT): Bump version date
|
||||||
|
* configure.ac (enabled_parport): Default to "no"
|
||||||
|
|
||||||
|
2021-12-03 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Alex Sverdlin:
|
||||||
|
patch #10153: linuxspi: Support "-E reset" and "-E noreset"
|
||||||
|
* linuxspi.c (linuxspi_parseexitspecs): New function
|
||||||
|
|
||||||
|
2021-11-27 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #58440: linuxgpio PIN limit too low
|
||||||
|
* libavrdude.h (PIN_MAX): bump (for HAVE_LINUXGPIO) to 400
|
||||||
|
|
||||||
|
2021-11-27 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by David Mosberger-Tang:
|
||||||
|
patch #8923: Enable TPI for linuxgpio
|
||||||
|
* linuxgpio.c (linuxgpio_initpgm): add cmd_tpi entry
|
||||||
|
|
||||||
|
2021-11-27 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by: Milan Kupcevic <milan@debian.org>
|
||||||
|
patch #8996: Remove lock byte read mask (bug#21954, bug#46759)
|
||||||
|
* avrdude.conf.in (ATmega48, ATmega88, ATmega168, ATmega328)
|
||||||
|
(ATmega32U4, ATmega640, ATmega1280, ATmega1281, ATmega2560)
|
||||||
|
(ATmega2561, ATmega8, ATtiny13, ATmega64, ATmega128, ATmega16)
|
||||||
|
(AT90CAN32, AT90CAN64, AT90CAN128, ATmega324, ATmega644)
|
||||||
|
(ATmega1284, ATmega161, ATmega162, ATmega163, ATmega169, ATmega32)
|
||||||
|
(ATmega329, ATmega649, ATmega8515, ATmega8535, ATtiny2313, ATtiny4313)
|
||||||
|
(AT90PWM2, AT90USB646, AT90USB1286, AT90USB162, AT90USB82, ATmega32U2)
|
||||||
|
(ATmega16U2, ATmega8U2, ATmega325, ATmega645, ATtiny1634): Remove
|
||||||
|
lock byte read mask (bug#46759).
|
||||||
|
|
||||||
|
2021-11-27 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Christopher Cooper:
|
||||||
|
patch #9304: [Bug #48767] Implemented WinSock variation of "ser_drain(...)" functionality
|
||||||
|
* ser_win32.c (ser_drain): Implement a network drain
|
||||||
|
function.
|
||||||
|
|
||||||
|
2021-11-27 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Lars Ollén:
|
||||||
|
* linux_spi.c (linuxspi_open): ensure correct SPI mode is
|
||||||
|
set (submitted in the audit trail of patch #9816).
|
||||||
|
|
||||||
|
2021-11-27 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* linuxspi.c: Use -B <bitclock> rather than -b <baudrate>
|
||||||
|
to specify the clock rate
|
||||||
|
|
||||||
|
2021-11-27 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Improve defaults and documentation of linuxspi
|
||||||
|
* avrdude.conf.in: use @HAVE_LINUXGPIO_BEGIN/END@ and
|
||||||
|
@HAVE_LINUXSPI_BEGIN/END@ brackets around respective config
|
||||||
|
snippets; values were already set in configure.ac.
|
||||||
|
* linuxspi.c (linuxspi_open): Provide a reasonable (for the
|
||||||
|
Raspberry Pi) default for the -P option
|
||||||
|
* avrdude.1: Extend linuxspi documentation
|
||||||
|
* doc/avrdude.texi: (Dito.)
|
||||||
|
|
||||||
|
2021-11-27 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Alex Sverdlin:
|
||||||
|
patch #10031: linuxspi: Support GPIO uAPI v2
|
||||||
|
* linuxspi.c (linuxspi_reset_mcu, linuxspi_open): Since Linux
|
||||||
|
v5.10 GPIO ABI Version 1 is optional and depends on
|
||||||
|
CONFIG_GPIO_CDEV_V1.
|
||||||
|
|
||||||
|
2021-11-27 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Alex Sverdlin:
|
||||||
|
patch #10030: linuxspi: Support inverted GPIO pin
|
||||||
|
* linuxspi.c (linuxspi_open): Clear the inversion mask on request
|
||||||
|
and set default state to avoid short glitches on the GPIO line.
|
||||||
|
|
||||||
|
2021-11-27 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Alex Sverdlin:
|
||||||
|
patch #10029: linuxspi: Report GPIO_GET_LINEHANDLE_IOCTL errors
|
||||||
|
* linuxspi.c (linuxspi_open): Report ioctl error
|
||||||
|
|
||||||
|
2021-11-27 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Alex Sverdlin:
|
||||||
|
patch #10028: linuxspi: close() only when necessary
|
||||||
|
* linuxspi.c: unify descriptor closing
|
||||||
|
|
||||||
|
2021-11-27 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Alex Sverdlin:
|
||||||
|
patch #10027: linuxspi: Add reset pulse, according to AVR programming algorithm
|
||||||
|
* linuxspi.c (linuxspi_open, linuxspi_program_enable):
|
||||||
|
movw out reset code into linuxspi_reset_mcu()
|
||||||
|
|
||||||
|
2021-11-25 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by David Mosberger-Tang:
|
||||||
|
patch #9328: ft245r.c: add TPI support (patches 5-7)
|
||||||
|
* ft245r.c (ft245r_set_bitclock): add workaround for
|
||||||
|
FT245 hardware bugs in bitclock setting
|
||||||
|
|
||||||
|
2021-11-25 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by David Mosberger-Tang:
|
||||||
|
patch #9328: ft245r.c: add TPI support (patches 5-7)
|
||||||
|
* ft245r.c: Remove the reader thread (also removes
|
||||||
|
patch #9079)
|
||||||
|
|
||||||
|
2021-11-24 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by David Mosberger-Tang:
|
||||||
|
patch #9327: ft245r.c: add TPI support (patches 1-4)
|
||||||
|
* ft245r.c (set_pin, ft245r_open): use
|
||||||
|
ft245r_send_and_discard() so ft245r_in can go away
|
||||||
|
|
||||||
|
2021-11-24 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by David Mosberger-Tang:
|
||||||
|
patch #9327: ft245r.c: add TPI support (patches 1-4)
|
||||||
|
* ft245r.c (ft245r_recv): Optimize TPI programming
|
||||||
|
speed by reducing number of USB reads.
|
||||||
|
|
||||||
|
2021-11-24 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by David Mosberger-Tang:
|
||||||
|
patch #9327: ft245r.c: add TPI support (patches 1-4)
|
||||||
|
* ft245r.c (ft245r_open): add call to
|
||||||
|
ftdi_set_latency_timer() to improve timing
|
||||||
|
|
||||||
|
2021-11-24 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by David Mosberger-Tang:
|
||||||
|
patch #9327: ft245r.c: add TPI support (patches 1-4)
|
||||||
|
* ft245r.c: add TPI support
|
||||||
|
* avrdude.conf.in (tc2030): New programmer
|
||||||
|
|
||||||
|
2021-11-24 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* ft245r.c (ft245r_open): allow for picking a default
|
||||||
|
device if none has been provided by -P
|
||||||
|
|
||||||
|
2021-11-24 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* jtag3.c (jtag3_edbg_recv_frame): Better handling for
|
||||||
|
fragment_info == 0x00 (no response available)
|
||||||
|
|
||||||
|
2021-11-23 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* jtag3.c: Use matches() instead of strncmp()
|
||||||
|
|
||||||
|
2021-11-23 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
patch #9757: Fix ATtiny817 Xplained Mini programmer
|
||||||
|
* jtag3.c (jtag3_getsync, jtag3_close): correctly extract
|
||||||
|
programmer name from list of names
|
||||||
|
|
||||||
|
2021-11-22 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by David Sainty:
|
||||||
|
patch #8719: Support Over-the-Air bootloading with XBeeBoot
|
||||||
|
* xbee.c: New programmer
|
||||||
|
* xbee.h: (Dito.)
|
||||||
|
* pgm_type.c: Add xbee.h
|
||||||
|
* avrdude.conf.in (xbee): New programmer
|
||||||
|
* Makefile.am (libavrdude_a_SOURCES): add xbee.c, xbee.h
|
||||||
|
* avrdude.1: document the new programmer
|
||||||
|
* doc/avrdude.texi: (Dito.)
|
||||||
|
|
||||||
|
2021-11-14 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Ivan Frederiks:
|
||||||
|
patch #9079: Fix ftdi_syncbb teardown (supersedes #9893)
|
||||||
|
patch #9122: Fixed MISO sampling in ftdi_syncbb
|
||||||
|
patch #9123: ftdi_syncbb: use FT245R_CYCLES in ft245r_set_bitclock()
|
||||||
|
* ft245r.c: Various fixes for FT245-bitbang programmers
|
||||||
|
|
||||||
|
2021-11-14 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by David Mosberger-Tang:
|
||||||
|
patch #9320: fix TPI RESET in bitbang.c
|
||||||
|
* bitbang.c (bitbang_initialize): wait for 128 ms after deasserting
|
||||||
|
/RESET (per datasheet), and keep /RESET low during MOSI/MISO link check
|
||||||
|
|
||||||
|
2021-11-12 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Jon Thacker:
|
||||||
|
patch #9253: Fix for giving terminal_mode commands more than 20 arguments
|
||||||
|
* term.c (tokenize): fix realloc usage, pointer returned not necessarily
|
||||||
|
the same as pointer passed
|
||||||
|
|
||||||
|
2021-11-12 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Martino Facchin:
|
||||||
|
patch #9110: Let reserved fuse bits to be read as *don't care*
|
||||||
|
* avr.c (compare_memory_masked): New function
|
||||||
|
* libavrdude.h: declare compare_memory_masked(); also, insist on C99
|
||||||
|
so <stdint.h> is required now
|
||||||
|
* main.c: Use compare_memory_masked() in safemode comparisons
|
||||||
|
|
||||||
|
2021-11-11 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Joseph Coffland:
|
||||||
|
patch #8957: Allow reading prodsig memory from stk500v2 on xmega devices
|
||||||
|
* stk500v2.c (stk600_xprog_read_byte, stk600_xprog_paged_load):
|
||||||
|
treat "prodsig" memory space as equivalent to "calibration"
|
||||||
|
|
||||||
|
2021-11-07 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Martin Thierer:
|
||||||
|
patch #10017: uspasp / tpi: Automatically clear configuration byte (fuse) before writing it
|
||||||
|
* usbasp.c (usbasp_tpi_paged_write): clear fuse region before writing it
|
||||||
|
|
||||||
|
2021-11-07 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Michael Petersen:
|
||||||
|
patch #9697: Add iseavrprog support
|
||||||
|
* avrdude.conf.in (iseavrprog): New programmer
|
||||||
|
|
||||||
|
2021-11-07 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #50630: Erase Cycle Counter options ( -y -Y n ) should be removed from usage Message
|
||||||
|
* main.c (usage): remove -y / -Y descriptions
|
||||||
|
|
||||||
|
2021-11-07 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avrdude.conf.in (ATmega8A): new device (alias for ATmega8)
|
||||||
|
|
||||||
|
2021-11-07 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #50517: Reading fails if "immediate mode" for output file format is selected - fileio: invalid operation=1
|
||||||
|
* update.c (do_op): refuse to write to "immediate format" argument
|
||||||
|
|
||||||
|
2021-11-07 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Martin Thierer:
|
||||||
|
bug #60863: avrftdi programming error probably caused by multiple, consecutive empty pages
|
||||||
|
* avrftdi.c (avrftdi_flash_write): Skip empty pages
|
||||||
|
|
||||||
|
2021-11-07 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Matwey V. Kornilov:
|
||||||
|
bug #58495: Add atmega324pb support to avrdude.conf.in
|
||||||
|
* avrdude.conf.in (ATmega324PB): new entry
|
||||||
|
|
||||||
|
2021-11-07 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #55734: USBtiny programming of ATmega328p broken by Patch #9278
|
||||||
|
* usbtiny.c (usbtiny_initialize): undo change from patch #9728
|
||||||
|
|
||||||
|
2021-11-07 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #55009: no efuses for m164a/pa
|
||||||
|
* avrdude.conf.in (ATmega164P): derive from ATmega324P
|
||||||
|
|
||||||
|
2021-11-07 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by evan Venn:
|
||||||
|
bug #59227: Add new part. How does one get a part added to the CONF file?
|
||||||
|
* avrdude.conf.in (LGT8FX88P, LGT8FX168P, LGT8FX328P): new parts
|
||||||
|
|
||||||
|
2021-11-06 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Britton Kerin:
|
||||||
|
bug #57453: [PATCH] fix reference to nonexistant -m option by changing to -U
|
||||||
|
* avrdude.1: replace -m option by -U
|
||||||
|
|
||||||
|
2021-11-06 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Andrew D'Addesio:
|
||||||
|
bug #58078: [PATCH] buspirate: remove compound literals (fixes GCC>=9)
|
||||||
|
* buspirate.c (buspirate_start_mode_bin):
|
||||||
|
avoid propagating local scope compound literals
|
||||||
|
|
||||||
|
2021-11-06 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Jan Egil Ruud:
|
||||||
|
patch #10000: Add support for extended UPDI device context
|
||||||
|
* avrdude.conf.in (pickit4_updi, snap_updi, pkobn_updi):
|
||||||
|
new programmers
|
||||||
|
* avrdude.conf.in (ATmega808, ATmega809, ATmega1608, ATmega1609)
|
||||||
|
(AVR DA, AVR DB): new devices
|
||||||
|
* jtag3.c: Add support for extended UPDI device context
|
||||||
|
* jtag3_private.h: (Dito.)
|
||||||
|
* tools/atdf-to-avrdude.xslt: Bug fixes
|
||||||
|
* usbdevs.h: Bump USBDEV_MAX_XFER_3 to 912
|
||||||
|
* doc/avrdude.texi: Document changes
|
||||||
|
* avrdude.1: (Dito)
|
||||||
|
|
||||||
|
2021-06-27 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #60753: Patch #1436 breaks multiple programmer/device combinations on MacOS BigSur
|
||||||
|
* avr.c: compare page_size > 1 instead of != 0
|
||||||
|
* stk500v2.c: (Ditto.)
|
||||||
|
|
||||||
|
2021-06-27 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by gerardoallende:
|
||||||
|
bug #59525: Bogus error message because Copy/Paste typo in stk500.c
|
||||||
|
* stk500.c (stk500_getparm): Fix bogus ID in error message
|
|
@ -0,0 +1,598 @@
|
||||||
|
2001-12-30 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* main.c: Update version.
|
||||||
|
|
||||||
|
* avrdude.conf.sample: Clarify a comment.
|
||||||
|
|
||||||
|
* avrdude.conf.sample: fix address bits
|
||||||
|
|
||||||
|
* avrdude.1: Bring up to date.
|
||||||
|
|
||||||
|
2001-12-29 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* avrdude.conf.sample: Add the AVR3 progammer.
|
||||||
|
|
||||||
|
* avr.c, avrdude.conf.sample, config_gram.y, main.c, pindefs.h:
|
||||||
|
Fix VCC assertion.
|
||||||
|
|
||||||
|
Make the BUFF pin a mask like VCC to allow multiple pins to be
|
||||||
|
asserted at the same time (STK200 has two buffer enable lines).
|
||||||
|
|
||||||
|
Add the STK200 programmer.
|
||||||
|
|
||||||
|
Fix EEPROM address line selection for several parts.
|
||||||
|
|
||||||
|
2001-12-15 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* avrdude.conf.sample: fix spelling error
|
||||||
|
|
||||||
|
2001-11-24 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* Makefile:
|
||||||
|
Change "WARNING" to "NOTE" when overwriting the avrprog.conf file.
|
||||||
|
|
||||||
|
* avrdude.1: Add my e-mail address.
|
||||||
|
|
||||||
|
* avrdude.conf.sample:
|
||||||
|
Add comments about instruction formats. Correct an instruction
|
||||||
|
specification (cut&paste error).
|
||||||
|
|
||||||
|
2001-11-21 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* avr.c, config_gram.y, lexer.l, term.c:
|
||||||
|
In interactive mode, reset the address and length if we start dumping
|
||||||
|
a memory type different than the previous one.
|
||||||
|
|
||||||
|
* avr.c, avrdude.conf.sample, config_gram.y:
|
||||||
|
Allow instruction data to be specified more flexibly, which can be
|
||||||
|
used to make the instruction input more readable in the config file.
|
||||||
|
|
||||||
|
* main.c: Bump version number.
|
||||||
|
|
||||||
|
* Makefile, avr.c, avr.h, avrdude.conf.sample, config.c, config.h:
|
||||||
|
* config_gram.y, fileio.c, fileio.h, lexer.l, main.c, term.c:
|
||||||
|
This is a major re-write of the programming algorithms. The Atmel
|
||||||
|
serial programming instructions are not very orthoganal, i.e., the
|
||||||
|
"read fuse bits" instruction on an ATMega103 is an entirely different
|
||||||
|
opcode and data format from the _same_ instruction for an ATMega163!
|
||||||
|
Thus, it becomes impossible to have a single instruction encoding
|
||||||
|
(varying the data) across the chip lines.
|
||||||
|
|
||||||
|
This set of changes allows and requires instruction encodings to be
|
||||||
|
defined on a per-part basis within the configuration file. Hopefully
|
||||||
|
I've defined the encoding scheme in a general enough way so it is
|
||||||
|
useful in describing the instruction formats for yet-to-be invented
|
||||||
|
Atmel chips. I've tried hard to make it match very closely with the
|
||||||
|
specification in Atmel's data sheets for their parts. It's a little
|
||||||
|
more verbose than what I initially hoped for, but I've tried to keep
|
||||||
|
it as concise as I could, while still remaining reasonably flexible.
|
||||||
|
|
||||||
|
2001-11-19 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* avr.c, avr.h, avrdude.conf.sample, main.c, ppi.c, term.c:
|
||||||
|
Add support for ATMega163.
|
||||||
|
|
||||||
|
Add support for reading/writing ATMega163 lock and fuse bits.
|
||||||
|
Unfortunately, in looking at the specs for other ATMega parts, they
|
||||||
|
use entirely different instruction formats for these commands. Thus,
|
||||||
|
these routines won't work for the ATMega103, for example.
|
||||||
|
|
||||||
|
Add support for sending raw command bytes via the interactive terminal
|
||||||
|
interface. This allows one to execute any programming instruction on
|
||||||
|
the target device, whether or not avrprog supports it explicitly or
|
||||||
|
not. Thus, one can use this feature to program fuse / lock bits, or
|
||||||
|
access any other feature of a current or future device that avrprog
|
||||||
|
does not know how to do.
|
||||||
|
|
||||||
|
Add in comments, an experimental instruction format in the
|
||||||
|
configuration file. If this works out, it would allow supporting new
|
||||||
|
parts and non-orthoganal instructions across existing parts without
|
||||||
|
making avrprog code changes.
|
||||||
|
|
||||||
|
2001-11-17 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* avrdude.conf.sample: Add ATMEGA163 part.
|
||||||
|
|
||||||
|
2001-11-11 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* main.c: output formatting
|
||||||
|
|
||||||
|
2001-11-05 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* ppi.c: Get ppi.h from /usr/include, not /sys.
|
||||||
|
|
||||||
|
2001-10-31 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* avr.c, avrdude.conf.sample, main.c: Correct version string.
|
||||||
|
Update read/write status more frequently.
|
||||||
|
Prefix ATMega parts with an 'm'.
|
||||||
|
|
||||||
|
2001-10-16 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* avr.c: Change ording for memory display.
|
||||||
|
|
||||||
|
* config_gram.y: comment
|
||||||
|
|
||||||
|
* avr.c, avr.h, avrdude.conf.sample, config_gram.y, lexer.l, term.c:
|
||||||
|
Fix (again, hopefully) page addressing for the ATMega parts.
|
||||||
|
|
||||||
|
Rename the poorly chosen name "bank" to "page" for page addressing.
|
||||||
|
Atmel calls it "page" in their documentation.
|
||||||
|
|
||||||
|
* config_gram.y, main.c: Fix an (non)exit.
|
||||||
|
Silence a couple of compiler warnings.
|
||||||
|
|
||||||
|
* avr.c, avr.h, avrdude.conf.sample, config_gram.y, main.c:
|
||||||
|
Fix ATMega flash addressing. Add an ATMEGA16 part. Perform sanity
|
||||||
|
checking on the memory parameters for parts that do bank addressing.
|
||||||
|
|
||||||
|
2001-10-15 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* config.c, config.h, lists.h: Add copyright.
|
||||||
|
|
||||||
|
* config_gram.y, lexer.l, lists.c: Add copyrights.
|
||||||
|
|
||||||
|
* Makefile: Attempt to install avrprog.conf.
|
||||||
|
|
||||||
|
* avrdude.conf.sample: Correct dt006 pinout.
|
||||||
|
|
||||||
|
* Makefile, lexer.l:
|
||||||
|
Try and detect an old-style config file and print an appropriate error
|
||||||
|
message and a suggestion for correcting it.
|
||||||
|
|
||||||
|
* Makefile, avr.c, avrdude.1, avrdude.conf.sample: Update the man page.
|
||||||
|
|
||||||
|
Miscellaneous minor cleanups.
|
||||||
|
|
||||||
|
2001-10-14 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* Makefile, Makefile.inc, avr.c, avr.h, avrdude.conf.sample:
|
||||||
|
* config.c, config.h, config_gram.y, lexer.l, lists.c, lists.h:
|
||||||
|
* main.c, pindefs.h, term.c:
|
||||||
|
Use lex/yacc for parsing the config file. Re-work the config file
|
||||||
|
format using a more human-readable format.
|
||||||
|
|
||||||
|
Read part descriptions from the config file now instead of hard-coding
|
||||||
|
them.
|
||||||
|
|
||||||
|
Update usage().
|
||||||
|
|
||||||
|
Cleanup unused code.
|
||||||
|
|
||||||
|
* Makefile, avr.c, avr.h, fileio.c, term.c:
|
||||||
|
First cut at supporting the ATmega 103 which uses bank addressing and
|
||||||
|
has a 128K flash.
|
||||||
|
|
||||||
|
Due to the bank addressing required, interactive update of the flash
|
||||||
|
is not supported, though the eeprom can be updated interactively.
|
||||||
|
Both memories can be programmed via non-interactive mode.
|
||||||
|
|
||||||
|
Intel Hex Record type '04' is now generated as required for outputing
|
||||||
|
memory contents that go beyond 64K.
|
||||||
|
|
||||||
|
2001-10-13 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* avr.c, avr.h, fileio.c, fileio.h, main.c, ppi.c, ppi.h, term.c:
|
||||||
|
* term.h:
|
||||||
|
Style fixes.
|
||||||
|
|
||||||
|
* avr.c, avr.h, fileio.c, fileio.h, main.c, term.c:
|
||||||
|
Commit changes in preparation for support the ATMega line.
|
||||||
|
|
||||||
|
2001-10-01 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* Makefile: Don't override CFLAGS.
|
||||||
|
|
||||||
|
* avrdude.1: Correct default pin assignment.
|
||||||
|
|
||||||
|
* avr.c, fileio.c, main.c, ppi.c, term.c:
|
||||||
|
Remove debugging code - it served its purpose.
|
||||||
|
|
||||||
|
Update copyrights.
|
||||||
|
|
||||||
|
2001-09-21 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* main.c:
|
||||||
|
Be sure to read the exit specs after the pin configuration has been
|
||||||
|
assigned, otherwise, we may apply the exit specs to the wrong pins.
|
||||||
|
|
||||||
|
* main.c: debugging
|
||||||
|
|
||||||
|
2001-09-20 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* avrdude.1, avrdude.conf.sample, main.c:
|
||||||
|
Prefix pin config entries in the config file with a "c:". Later, I
|
||||||
|
might make part descriptions read in this way and we can use a
|
||||||
|
different letter for those (p). This will make the parsing easier to
|
||||||
|
distinguish between the entry types.
|
||||||
|
|
||||||
|
* main.c: Initialize pin configuration description.
|
||||||
|
|
||||||
|
2001-09-19 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* AVRprog.pdf, Makefile, avr.c, avrdude.1, avrdude.conf.sample:
|
||||||
|
* avrdude.pdf, fileio.c, fileio.h, main.c, pindefs.h, term.c:
|
||||||
|
Make the pin definitions configurable based on entries in a config
|
||||||
|
file. This makes supporting other programmers much easier.
|
||||||
|
|
||||||
|
Rename AVRprog.pdf to avrprog.pdf.
|
||||||
|
|
||||||
|
2001-04-29 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* avrprog-programmer.jpg: Remove this image file from the repository.
|
||||||
|
|
||||||
|
2001-04-26 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* avrprog-schematic.jpg:
|
||||||
|
Remove this image, use AVRprog.pdf as the preferred schematic for the
|
||||||
|
programmer.
|
||||||
|
|
||||||
|
2001-04-25 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* AVRprog.pdf, Makefile, avrdude.1:
|
||||||
|
Add a schematic provided by Joerg Wunch and also update the manual
|
||||||
|
page (also updated by Joerg) to reference the schematic.
|
||||||
|
|
||||||
|
2001-02-25 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* Makefile, Makefile.inc: Automate dependency generation.
|
||||||
|
|
||||||
|
2001-02-08 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* main.c: Turn off ready led when finished programming.
|
||||||
|
|
||||||
|
* main.c: update version
|
||||||
|
|
||||||
|
* avr.c, main.c: Correct a few comments.
|
||||||
|
|
||||||
|
* Makefile, avr.c, term.c: Makefile : update dependencies
|
||||||
|
|
||||||
|
avr.c : correct status led updates
|
||||||
|
|
||||||
|
term.c : update status leds on write, make the address and length
|
||||||
|
arguments for dump optional.
|
||||||
|
|
||||||
|
2001-01-26 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* main.c: Version 1.1
|
||||||
|
|
||||||
|
* main.c:
|
||||||
|
Hmmm ... cvs co -D <timestamp> does not work. Change the revision
|
||||||
|
timestamp to a full date/time value.
|
||||||
|
|
||||||
|
* avr.c, fileio.c, main.c, ppi.c, term.c:
|
||||||
|
Add a -V option to display the version information about each
|
||||||
|
component module. This is intended for support purposes, so that I
|
||||||
|
can tell unambiguously what version a binary out in the field is.
|
||||||
|
|
||||||
|
Additionally, display a revision timestamp along with the version
|
||||||
|
number. This also is intended for aiding in support and is the Unix
|
||||||
|
time of the latest component module. Having this, should allow me to
|
||||||
|
do a "cvs co -D timestamp avrprog" and get exactly the source of the
|
||||||
|
version that is being reported.
|
||||||
|
|
||||||
|
* fileio.c:
|
||||||
|
Return the maximum address (+1) written as opposed to the actual
|
||||||
|
number of bytes written. The presence of an Intel Hex address
|
||||||
|
record can cause these two number to be different; but the callers
|
||||||
|
of this routine need the former.
|
||||||
|
|
||||||
|
* main.c:
|
||||||
|
Fix a place where we were exiting without applying the exit-specs.
|
||||||
|
|
||||||
|
Wrap a long line.
|
||||||
|
|
||||||
|
* avr.c, fileio.c: avr.c: Update a comment.
|
||||||
|
|
||||||
|
fileio.c: Properly handle all the Intel Hex record types that I can
|
||||||
|
find information about.
|
||||||
|
|
||||||
|
2001-01-25 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* Usage, avr.h: Get rid of the Usage file.
|
||||||
|
|
||||||
|
2001-01-24 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* Makefile, avr.c, avr.h, main.c, pindefs.h, ppi.c:
|
||||||
|
Move pin definitions to their own file.
|
||||||
|
|
||||||
|
First pass at providing feedback via the optionally connected leds. I
|
||||||
|
don't actually have any of these attached to my programmer, so I can
|
||||||
|
only guess as whether this is toggling them on and off correctly.
|
||||||
|
|
||||||
|
Also, enable and disable the optional 74367 buffer.
|
||||||
|
|
||||||
|
* avr.h, main.c, ppi.c, ppi.h, avr.c:
|
||||||
|
Rearrange the pinout for the programmer to be a little more logical.
|
||||||
|
Provide hooks to support a buffered programmer, pin 6 is now used to
|
||||||
|
enable a buffer that can be used to isolate the target system from the
|
||||||
|
parallel port pins. This is important when programming the target
|
||||||
|
in-system.
|
||||||
|
|
||||||
|
Totally change the way the pin definitions are defined. Actually
|
||||||
|
set/clear pins based on the way more intuitive pin number, instead of
|
||||||
|
PPI data register, bit number combination. A table of pin data is
|
||||||
|
used so that any hardware inversion done by the parallel port is
|
||||||
|
accounted for, what you set is actually what appears at the pin.
|
||||||
|
Retain the old method for handling Vcc, however, because the hold
|
||||||
|
method is much easier to use when setting / retrieving multiple pins
|
||||||
|
simultaneously.
|
||||||
|
|
||||||
|
2001-01-22 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* Makefile: Don't gzip the man page.
|
||||||
|
|
||||||
|
* avrdude.1: .Nm macro fix. Submitted by Joerg.
|
||||||
|
|
||||||
|
* main.c: Cosmetic, don't output a preceding linefeed for usage().
|
||||||
|
|
||||||
|
* Makefile, avr.c, avr.h, fileio.c, term.c:
|
||||||
|
Makefile : use gzip -f for man page installation so that we don't get
|
||||||
|
prompted.
|
||||||
|
|
||||||
|
avr.c avr.h fileio.c term.c :
|
||||||
|
|
||||||
|
Change the avrpart data structure so that the typedef AVRMEM is
|
||||||
|
used as an index into an array for the sizes of the memory types
|
||||||
|
and also for pointers to buffers that represent the chip data for
|
||||||
|
that memory type. This removes a lot of conditional code of the
|
||||||
|
form:
|
||||||
|
|
||||||
|
switch (memtype) {
|
||||||
|
case AVR_FLASH :
|
||||||
|
...
|
||||||
|
}
|
||||||
|
|
||||||
|
Also, re-code avr_read_byte() and avr_write_byte() to properly
|
||||||
|
handle the flash memory type without having to tell them whether
|
||||||
|
they should program the high byte or the low byte - figure that
|
||||||
|
out from the address itself. For flash memory type, these
|
||||||
|
routines now take the actual byte address instead of the word
|
||||||
|
address. This _greatly_ simplifies many otherwise simple
|
||||||
|
operations, such a reading or writing a range of memory, by not
|
||||||
|
having to worry about whether the address starts on an odd byte
|
||||||
|
or an even byte.
|
||||||
|
|
||||||
|
2001-01-20 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* avr.c, avr.h, fileio.c, fileio.h, main.c:
|
||||||
|
Return error codes instead of exiting, thus making sure that we exit
|
||||||
|
only via main() so that the exitspecs are properly applied.
|
||||||
|
|
||||||
|
When reading input data from a file, remember how many bytes were read
|
||||||
|
and write and verify only that many bytes.
|
||||||
|
|
||||||
|
Don't complain when an input file size is smaller than the memory size
|
||||||
|
we are programming. This is normal.
|
||||||
|
|
||||||
|
* fileio.c:
|
||||||
|
Correct checksum calculation; failure to account for the value of the
|
||||||
|
record type was causing non-zero record types to be calculated
|
||||||
|
incorrectly.
|
||||||
|
|
||||||
|
* Makefile, main.c: Makefile : install the man page
|
||||||
|
|
||||||
|
main.c : drop the giant usage text now that we have a man page.
|
||||||
|
|
||||||
|
* avrdude.1:
|
||||||
|
Add initial man page graciously contributed by Joerg Wunsch. Thanks
|
||||||
|
Joerg!
|
||||||
|
|
||||||
|
2001-01-19 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* term.c:
|
||||||
|
Accept abbreviations for eeprom and flash for the dump and write
|
||||||
|
commands.
|
||||||
|
|
||||||
|
Fix small bug keeping 1 character command lines from being added to
|
||||||
|
the history.
|
||||||
|
|
||||||
|
* term.c:
|
||||||
|
Implement enough state in cmd_dump so that if it is called with no
|
||||||
|
arguments, it successively dumps the next chunk of data of the same
|
||||||
|
previously specified length.
|
||||||
|
|
||||||
|
* term.c, term.h, fileio.c, fileio.h, main.c, ppi.c, ppi.h:
|
||||||
|
* Makefile, avr.c, avr.h, avrprog.c:
|
||||||
|
The program was getting too large for a single file. Split it up into
|
||||||
|
more modular pieces.
|
||||||
|
|
||||||
|
Also, accept command abbreviations as long as they are not ambiguous.
|
||||||
|
|
||||||
|
* avrprog.c:
|
||||||
|
Add ability to specify the state of the power and reset pins on
|
||||||
|
program exit. Default to leaving the pins in the state they were when
|
||||||
|
we found them.
|
||||||
|
|
||||||
|
Contributed by: Joerg Wunsch
|
||||||
|
|
||||||
|
2001-01-18 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* Makefile, avrprog.c:
|
||||||
|
Switch to using readline() for getting terminal input. I can't seem
|
||||||
|
to get the history capabilities working yet, but even so, it does
|
||||||
|
better handling of the prompt and strips newlines for us, so it's
|
||||||
|
still a win.
|
||||||
|
|
||||||
|
Add a few new commands for terminal mode: help, sig, part, erase.
|
||||||
|
Display rudimentory help using the help command.
|
||||||
|
|
||||||
|
Add some function prototypes.
|
||||||
|
|
||||||
|
* Usage, avrprog.c:
|
||||||
|
Change -c (interactive command mode) to the more intuitive -t
|
||||||
|
(terminal mode).
|
||||||
|
|
||||||
|
Make binary format the default for output.
|
||||||
|
|
||||||
|
Update the parts table with corrections for old values and add some
|
||||||
|
new values.
|
||||||
|
|
||||||
|
2001-01-15 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* avrprog.c:
|
||||||
|
Automatically verify on-chip data with what we just programmed.
|
||||||
|
|
||||||
|
* avrprog.c, Makefile:
|
||||||
|
Prepare the Makefile for integration into the FreeBSD ports tree.
|
||||||
|
|
||||||
|
Fix a few "may be used uninitialized" bugs found by -Wall.
|
||||||
|
|
||||||
|
2001-01-14 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* avrprog.c: Free a buffer.
|
||||||
|
|
||||||
|
* avrprog.c:
|
||||||
|
Use a smarter programming algorithm - read the existing data byte
|
||||||
|
first and only write the new one if it is different.
|
||||||
|
|
||||||
|
Add -n option which is a test mode in which the chip is not actually
|
||||||
|
updated. This option does not affect writes in interactive mode.
|
||||||
|
|
||||||
|
* avrprog.c: Add the "dump" and "write" interactive commands.
|
||||||
|
|
||||||
|
* avrprog.c:
|
||||||
|
Correctly produce and handle "end of record" for intel hex files.
|
||||||
|
|
||||||
|
2001-01-13 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* avrprog.c:
|
||||||
|
Re-enable writing to the chip. I should probably should make this a
|
||||||
|
command-line selectable option so that I don't keep forgetting and
|
||||||
|
committing it with it disabled.
|
||||||
|
|
||||||
|
* avrprog.c:
|
||||||
|
Add a newline before exiting due to command line errors. Perform a
|
||||||
|
bit more option compatibility testing between -c, -i, and -o.
|
||||||
|
|
||||||
|
* avrprog.c: Add input file format auto-detection support.
|
||||||
|
|
||||||
|
* Usage, avrprog.c: Say what the defaults are.
|
||||||
|
|
||||||
|
* avrprog-programmer.jpg, Usage, avrprog-schematic.jpg: New files.
|
||||||
|
|
||||||
|
* avrprog.c: Correct usage text.
|
||||||
|
|
||||||
|
* avrprog.c:
|
||||||
|
Parameterize a few additional items per chip. Print out all per-chip
|
||||||
|
parameters on startup. Use the per-chip parameters in the code
|
||||||
|
instead of hard-coded values for the 2313.
|
||||||
|
|
||||||
|
* avrprog.c: Fix filename assignment error.
|
||||||
|
|
||||||
|
Clean up debugging code a little, utilize fileio() instead of making
|
||||||
|
direct calls to b2ihex().
|
||||||
|
|
||||||
|
* avrprog.c: A lot of general code cleanup.
|
||||||
|
|
||||||
|
Re-work command line options to be more intuitive.
|
||||||
|
|
||||||
|
Support Intel Hex input and output file formats. Provide hooks to
|
||||||
|
support Motorola S-Record as well.
|
||||||
|
|
||||||
|
Add a few more part-specific parameters to the avrpart structure.
|
||||||
|
|
||||||
|
Only write the flash or eeprom if the data to be written is not 0xff.
|
||||||
|
|
||||||
|
2000-12-31 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* avrprog.c: Update a comment.
|
||||||
|
|
||||||
|
* avrprog.c:
|
||||||
|
Provide the ability to tie additionally tie pins 6-9 of the parallel
|
||||||
|
port to Vcc in order to supply more current.
|
||||||
|
|
||||||
|
Fix a typo on the size of the S1200's Flash.
|
||||||
|
|
||||||
|
Bring RESET low when programming is completed.
|
||||||
|
|
||||||
|
* avrprog.c:
|
||||||
|
Correct pin connection comments. Elaborate a bit on Vcc connection.
|
||||||
|
|
||||||
|
* avrprog.c:
|
||||||
|
Update after receiving some good feedback from Joerg Wunsch. We
|
||||||
|
should now be able to program AT90S1200's.
|
||||||
|
|
||||||
|
2000-12-30 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* avrprog.c: Don't limit eeprom addresses.
|
||||||
|
|
||||||
|
2000-12-20 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* Makefile, avrprog.c:
|
||||||
|
Add support for the 8515. Make the addition for other devices easier.
|
||||||
|
|
||||||
|
2000-08-27 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* avrprog.c:
|
||||||
|
Clear all bits except AVR_RESET when finished reading or programming
|
||||||
|
the Atmel device.
|
||||||
|
|
||||||
|
2000-08-07 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* avrprog.c: update announcement message
|
||||||
|
|
||||||
|
* avrprog.c: Update announcement message.
|
||||||
|
|
||||||
|
* avrprog.c: Return the correct return code from 'main()'.
|
||||||
|
|
||||||
|
* avrprog.c:
|
||||||
|
Add ppi_pulse() function and fix ppi_toggle() to actully toggle
|
||||||
|
instead of pulse.
|
||||||
|
|
||||||
|
Make all abnormal returns after the parallel port has been opened go
|
||||||
|
through a single exit point at the bottom of 'main()'.
|
||||||
|
|
||||||
|
2000-08-06 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* Makefile, avrprog.c: Makefile: add --pedantic compiler option
|
||||||
|
|
||||||
|
avrprog.c:
|
||||||
|
|
||||||
|
Add lots of comments, move getop() variable declarations to
|
||||||
|
the top of the program.
|
||||||
|
|
||||||
|
Add a typedef name to the AVR memory type and use it for
|
||||||
|
function declarations.
|
||||||
|
|
||||||
|
Add a usleep() delay in the sense loop to avoid becoming a cpu
|
||||||
|
hog.
|
||||||
|
|
||||||
|
Print out a version string so that folks know what version of
|
||||||
|
the software they are running.
|
||||||
|
|
||||||
|
Be sure and close the parallel device and the i/o file when
|
||||||
|
terminating abnormally.
|
||||||
|
|
||||||
|
* avrprog.c: Print out version information when invoked.
|
||||||
|
|
||||||
|
* Makefile, avrprog.c: Makefile: Add an install target.
|
||||||
|
|
||||||
|
avrprog.c:
|
||||||
|
|
||||||
|
Add license.
|
||||||
|
|
||||||
|
Document the header a bit better.
|
||||||
|
|
||||||
|
Add capability to read out and display the device signature bytes.
|
||||||
|
|
||||||
|
Add capability to power the device from the parallel port.
|
||||||
|
|
||||||
|
Eliminate debug print facility.
|
||||||
|
|
||||||
|
Provide 'avr_cmd()' function.
|
||||||
|
|
||||||
|
When memory locations don't program, generate a newline so that the
|
||||||
|
information is not overwritten and lost.
|
||||||
|
|
||||||
|
Don't print out the message about needing to specify a file if the
|
||||||
|
user is not requesting an operation that requires the file.
|
||||||
|
|
||||||
|
2000-08-05 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* avrprog.c: Pring usage when no arguments are supplied.
|
||||||
|
|
||||||
|
* Makefile, avrprog.c: Initial check-in
|
||||||
|
|
||||||
|
* Makefile, avrprog.c: New file.
|
||||||
|
|
|
@ -0,0 +1,237 @@
|
||||||
|
2002-12-12 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* main.c: minor cleanup
|
||||||
|
|
||||||
|
2002-12-07 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* avrdude.1, main.c:
|
||||||
|
If the stk500 is being used, default to using the first serial port.
|
||||||
|
|
||||||
|
2002-12-03 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* avrdude.1: Mention STK500 support.
|
||||||
|
|
||||||
|
2002-12-01 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* stk500.c: Remove unused code.
|
||||||
|
|
||||||
|
* CHANGELOG, stk500.c:
|
||||||
|
Document changes since the previous version in the CHANGELOG.
|
||||||
|
|
||||||
|
Cleanup stk500.c a bit.
|
||||||
|
|
||||||
|
* stk500.c: Fix cut and paste braino.
|
||||||
|
|
||||||
|
* avr.c, avrdude.conf.sample, main.c, pgm.h, stk500.c:
|
||||||
|
The STK500 can perform paged read/write operations even on standard
|
||||||
|
"non-paged" parts. Take advantage of that and use the faster internal
|
||||||
|
routines of the STK500 for those parts as well.
|
||||||
|
|
||||||
|
* avr.c, avr.h, avrpart.h, main.c, pgm.c, pgm.h, stk500.c:
|
||||||
|
Optimize reading and writing for the STK500 programmer if the part
|
||||||
|
supports paged reads and writes. This greatly decreases the
|
||||||
|
program/verify time from about 4.5 minutes down to about 10 seconds in
|
||||||
|
a 12K program size test case.
|
||||||
|
|
||||||
|
Print out the hardware and firmware version for the STK500 if verbose
|
||||||
|
is enabled.
|
||||||
|
|
||||||
|
* avrdude.conf.sample, avrpart.h, config_gram.y, lexer.l, pgm.h:
|
||||||
|
* ppi.c, ppi.h, stk500.c, stk500.h, stk500_private.h:
|
||||||
|
Add basic support for STK500.
|
||||||
|
|
||||||
|
2002-11-30 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* avrdude.conf.sample, config.c, config.h, config_gram.y, lexer.l:
|
||||||
|
* main.c, pgm.c, pgm.h, ppi.c, ppi.h, term.c, term.h, Makefile:
|
||||||
|
* avr.c, avr.h:
|
||||||
|
Seperate programmer operations out into a driver-like interface so
|
||||||
|
that programmers other than the direct parallel port connection can be
|
||||||
|
supported.
|
||||||
|
|
||||||
|
2002-11-23 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* CHANGELOG, main.c, term.c:
|
||||||
|
term.c - when in interactive terminal mode and dumping memory using
|
||||||
|
the 'dump <memtype>' command without any address information,
|
||||||
|
and the end of memory is reached, wrap back around to zero on
|
||||||
|
the next invocation.
|
||||||
|
|
||||||
|
CHANGELOG - describe changes
|
||||||
|
|
||||||
|
main.c - update version number
|
||||||
|
|
||||||
|
* main.c:
|
||||||
|
When getting ready to initiate communications with the AVR device,
|
||||||
|
first pull /RESET low for a short period of time before enabling the
|
||||||
|
buffer chip. This sequence allows the AVR to be reset before the
|
||||||
|
buffer is enabled to avoid a short period of time where the AVR may be
|
||||||
|
driving the programming lines at the same time the programmer tries
|
||||||
|
to. Of course, if a buffer is being used, then the /RESET line from
|
||||||
|
the programmer needs to be directly connected to the AVR /RESET line
|
||||||
|
and not via the buffer chip.
|
||||||
|
|
||||||
|
2002-11-06 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* CHANGELOG: Update changelog.
|
||||||
|
|
||||||
|
* avr.c, avr.h, main.c: Fix -Y option. Reported by Joerg Wunsch.
|
||||||
|
|
||||||
|
2002-11-01 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* CHANGELOG, main.c: Version update and CHANGELOG entry.
|
||||||
|
|
||||||
|
* avr.c:
|
||||||
|
Be backward compatible with the 2-byte rewrite cycle counter which
|
||||||
|
appeared in version 2.1.0, but was changed to a 4 byte counter in
|
||||||
|
version 2.1.1. Reminded by Joerg Wunsch.
|
||||||
|
|
||||||
|
2002-10-29 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* CHANGELOG, avrdude.1, main.c:
|
||||||
|
Add '-V' (no verify) flag requested by Joerg Wunsch. Update the man
|
||||||
|
page.
|
||||||
|
|
||||||
|
2002-10-13 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* CHANGELOG, avrdude.1: Update man page and changelog.
|
||||||
|
|
||||||
|
* main.c: Update version number.
|
||||||
|
|
||||||
|
2002-10-12 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* Makefile: Remove --pedantic and -g from the compiler options.
|
||||||
|
|
||||||
|
2002-10-11 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* avr.c, term.c:
|
||||||
|
Use a four byte value instead of a two byte value for the programming
|
||||||
|
cycle count stored at the end of EEPROM. It seems as though Atmel was
|
||||||
|
greatly conservative in claiming a 1000 count reliability for the
|
||||||
|
FLASH. I current have a part that has been reprogrammed 173330 times,
|
||||||
|
and counting.
|
||||||
|
|
||||||
|
Fix a compiler warning.
|
||||||
|
|
||||||
|
* avrdude.conf.sample:
|
||||||
|
Fix ATMega128 instruction encoding for reading the low and high fuse
|
||||||
|
bits. Thanks to Joerg Wunsch for tripping over this.
|
||||||
|
|
||||||
|
2002-08-01 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* avr.c, avrdude.1, main.c:
|
||||||
|
Move erase-rewrite cycle increment to within the chip erase routine so
|
||||||
|
that it is tracked no matter where the erase was initiated: command
|
||||||
|
line mode or interactive mode, without code duplicaiton.
|
||||||
|
|
||||||
|
* CHANGELOG: Recent updates.
|
||||||
|
|
||||||
|
* avr.c: Eliminate unused variables.
|
||||||
|
|
||||||
|
* avr.c, avr.h, avrdude.1, fileio.c, main.c:
|
||||||
|
Implement a way of tracking how many erase-rewrite cycles a part has
|
||||||
|
undergone. This utilizes the last two bytes of EEPROM to maintain a
|
||||||
|
counter that is incremented each time the part is erased.
|
||||||
|
|
||||||
|
2002-07-27 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* avr.c, main.c:
|
||||||
|
Fix a typo in a comment. Display the size of memory being written.
|
||||||
|
Display the correct memory name in an error message (previously
|
||||||
|
hardcoded).
|
||||||
|
|
||||||
|
2002-06-22 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* CHANGELOG, avrdude.conf.sample:
|
||||||
|
Add support for ATtiny15 - contributed by Asher Hoskins
|
||||||
|
<asher@crumbly.freeserve.co.uk>
|
||||||
|
|
||||||
|
2002-04-23 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* CHANGELOG: Say what changed.
|
||||||
|
|
||||||
|
2002-04-07 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* Makefile, avrdude.conf.sample:
|
||||||
|
Backup the config file to a timestamped name to keep from possibly
|
||||||
|
overwriting user-modified configs.
|
||||||
|
|
||||||
|
Add read/write instructions for all memory types for ATMEGA103,
|
||||||
|
ATMEGA128, ATMEGA16, and ATMEGA8.
|
||||||
|
|
||||||
|
2002-04-05 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* avrdude.conf.sample:
|
||||||
|
Add support for ATMEGA128; untested; requested by Jeff Gardner
|
||||||
|
<gardner@journey.com>.
|
||||||
|
|
||||||
|
2002-02-15 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* avrdude.conf.sample: Minor ordering.
|
||||||
|
|
||||||
|
* CHANGELOG, main.c: Update version numbers.
|
||||||
|
|
||||||
|
2002-02-14 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* CHANGELOG: Summarize latest updates.
|
||||||
|
|
||||||
|
* avrdude.conf.sample, config_gram.y:
|
||||||
|
Make pwroff_after_write a yes/no field instead of a numeric.
|
||||||
|
|
||||||
|
* avrdude.conf.sample: Document the pwroff_after_write flag.
|
||||||
|
|
||||||
|
* avr.c: Enable the extra part verbosity when verbosity >= 3.
|
||||||
|
|
||||||
|
* avr.c, avr.h, avrdude.conf.sample, config_gram.y, lexer.l:
|
||||||
|
* main.c, term.c:
|
||||||
|
Fix error reporting by avr_write_byte().
|
||||||
|
|
||||||
|
Fix setting of status LEDs under various write-fail conditions.
|
||||||
|
|
||||||
|
Add a flag to indicate that a memory type requires the device to
|
||||||
|
possibly be powered off and back on after a write to it. This is due
|
||||||
|
to a hardware problem on some Atmel devices, see:
|
||||||
|
|
||||||
|
http://www.atmel.com/atmel/acrobat/doc1280.pdf
|
||||||
|
|
||||||
|
Add greater verbosity to the part-display code when verbose>1 to
|
||||||
|
display avrprog's encoding of the defined programming instructions.
|
||||||
|
This is primarily for debugging purposes.
|
||||||
|
|
||||||
|
|
||||||
|
Part updates:
|
||||||
|
|
||||||
|
* add the AT90S4414 part
|
||||||
|
|
||||||
|
* add fuse and lock bit access instructions for the AT90S1200,
|
||||||
|
AT90S4434, and AT90S8515.
|
||||||
|
|
||||||
|
* add the pwroff_after_write flag to the fuse bits for the AT90S2333
|
||||||
|
and AT90S4433 parts
|
||||||
|
|
||||||
|
2002-02-09 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* avrdude.conf.sample:
|
||||||
|
Updates to the 2333 and 4433 parts, contributed by Joerg Wunsh.
|
||||||
|
|
||||||
|
2002-01-18 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* CHANGELOG: Add changelog.
|
||||||
|
|
||||||
|
2002-01-12 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
|
||||||
|
* main.c: Add (c) to copyright.
|
||||||
|
|
||||||
|
* fileio.c, fileio.h, lexer.l, lists.c, lists.h, main.c:
|
||||||
|
* pindefs.h, ppi.c, ppi.h, term.c, term.h, avr.c, avr.h:
|
||||||
|
* config.c, config.h, config_gram.y:
|
||||||
|
Update version number. Update copyright.
|
||||||
|
|
||||||
|
* avrdude.1: Update copyright and add description of "default".
|
||||||
|
|
||||||
|
Submitted by: Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avr.c, term.c:
|
||||||
|
Fix programming of write-only memories (such as lock bits on the
|
||||||
|
2313).
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,364 @@
|
||||||
|
2007-11-08 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* main.c: Partially revert the line buffered output change,
|
||||||
|
and turn stderr into unbuffered output while producing the
|
||||||
|
progress report.
|
||||||
|
|
||||||
|
2007-11-07 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* main.c: Add setup and teardown hooks to the programmer
|
||||||
|
definition. If present, call the setup hook immediately after
|
||||||
|
finding the respective programmer object, and schedule the
|
||||||
|
teardown hook to be called upon exit. This allows the
|
||||||
|
programmer implementation to dynamically allocate private
|
||||||
|
programmer data.
|
||||||
|
* pgm.c: (Ditto.)
|
||||||
|
* pgm.h: (Ditto.)
|
||||||
|
* avr910.c: Convert static programmer data into dynamically
|
||||||
|
allocated data.
|
||||||
|
* butterfly.c: (Ditto.)
|
||||||
|
* jtagmkI.c: (Ditto.)
|
||||||
|
* jtagmkII.c: (Ditto.)
|
||||||
|
* stk500v2.c: (Ditto.)
|
||||||
|
* usbasp.c: (Ditto.)
|
||||||
|
* usbtiny.c: (Ditto.)
|
||||||
|
|
||||||
|
2007-11-06 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* butterfly.c: Remove the no_show_func_info() calls, as Brian
|
||||||
|
promised some 4 years ago.
|
||||||
|
|
||||||
|
2007-11-06 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* main.c: Add the -x option to pass extended parameters to
|
||||||
|
the programmer backend.
|
||||||
|
* pgm.c: (Ditto.)
|
||||||
|
* pgm.h: (Ditto.)
|
||||||
|
* jtagmkII.c: Implement the extended parameter jtagchain=
|
||||||
|
to support JTAG daisy-chains.
|
||||||
|
* avrdude.1: Document all of the above.
|
||||||
|
* doc/avrdude.texi: (Ditto.)
|
||||||
|
|
||||||
|
2007-10-30 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac (AC_INIT): Bump version for post-release.
|
||||||
|
|
||||||
|
2007-10-29 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac (AC_INIT): Bump version, releasing avrdude-5.5.
|
||||||
|
|
||||||
|
2007-10-29 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by <bikenomad@gmail.com>:
|
||||||
|
patch #5007: Patch for line-buffering of stdout and stderr
|
||||||
|
* main.c: call setvbuf() for stdout and stderr.
|
||||||
|
|
||||||
|
2007-10-29 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by <graceindustries@gmail.com>:
|
||||||
|
patch #5953: Add AT90CAN64 and AT90CAN32 to avrdude.conf
|
||||||
|
* avrdude.conf.in: Add entry for AT90CAN64 and AT90CAN32.
|
||||||
|
|
||||||
|
2007-10-29 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Wolfgang Moser:
|
||||||
|
patch #6121: ISP support for the C2N232I device (serial port
|
||||||
|
bitbanging)
|
||||||
|
* avrdude.conf.in: Add entry for c2n232i.
|
||||||
|
|
||||||
|
2007-10-29 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by <karl.yerkes@gmail.com>:
|
||||||
|
patch #6141: accept binary format immediate values
|
||||||
|
* fileio.c: Detect a 0b prefix, and call strtoul() differently
|
||||||
|
in that case.
|
||||||
|
|
||||||
|
2007-10-29 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #21076: -vvvv serial receive prints are empty in Win32 build
|
||||||
|
* ser_win32.c (ser_recv): Drop the essentially unused variable
|
||||||
|
"len", and use the variable "read" in order to track how many
|
||||||
|
bytes have just been read in.
|
||||||
|
|
||||||
|
2007-10-29 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #21145: atmega329p not recognized
|
||||||
|
* avrdude.conf.in: Add definitions for the ATmega329P/3290P.
|
||||||
|
Same as ATmega329/3290 except of the different signature.
|
||||||
|
|
||||||
|
2007-10-29 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #21152: Unable to program atmega324p with avrdude 5.4 and AVRISP
|
||||||
|
using default configuration file.
|
||||||
|
* avrdude.conf.in: Uncomment the (bogus) stk500_devcode lines for
|
||||||
|
the ATmega164P, ATmega324P, ATmega644, and ATmega644P definitions.
|
||||||
|
This only affects users of STK500v1 firmware.
|
||||||
|
|
||||||
|
2007-10-29 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by <ladyada@gmail.com>:
|
||||||
|
Patch #6233: Add support for USBtinyISP programmer
|
||||||
|
* usbtiny.c: New file.
|
||||||
|
* usbtiny.h: (Ditto.)
|
||||||
|
* Makefile.am: Include usbtiny into the build.
|
||||||
|
* avrdude.conf.in: (Ditto.)
|
||||||
|
* config_gram.y: (Ditto.)
|
||||||
|
* lexer.l: (Ditto.)
|
||||||
|
* avrdude.1: Document the usbtiny support.
|
||||||
|
* doc/avrdude.texi: (Ditto.)
|
||||||
|
|
||||||
|
2007-10-29 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* doc/avrdude.texi: Sort list of supported programmers into
|
||||||
|
alphabetical order, add all missing programmers.
|
||||||
|
|
||||||
|
2007-07-24 Thomas Fischl <tfischl@gmx.de>
|
||||||
|
|
||||||
|
* usbasp.c: Added long addresses to support devices with more
|
||||||
|
than 64kB flash. Closes bug #20558: Long address problem with
|
||||||
|
USBasp.
|
||||||
|
|
||||||
|
2007-06-27 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* Makefile.am (EXTRA_DIST): Add ChangeLog-2004-2006.
|
||||||
|
|
||||||
|
2007-05-16 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac (AC_INIT): Bump version for post-release.
|
||||||
|
|
||||||
|
2007-05-16 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac (AC_INIT): Bump version, releasing avrdude-5.4.
|
||||||
|
|
||||||
|
2007-05-16 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avrdude.conf.in: Fix AVR910 devcodes. It seems that the AVR109
|
||||||
|
listing refers to "BOOT"-type code, while the standard codes are
|
||||||
|
different (usually one below).
|
||||||
|
|
||||||
|
2007-05-16 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avr.c (avr_read, avr_write): only use the paged_load and
|
||||||
|
paged_write backend functions iff the memory area in question has
|
||||||
|
a page_size != 0.
|
||||||
|
This is supposed to fix bug #19234: avrdude-5.3.1 segfaults when
|
||||||
|
stk500v1 tries to program an ATtiny15
|
||||||
|
|
||||||
|
2007-05-15 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avr910.c: Fall back to avr_{read,write}_byte_default(). Fixes
|
||||||
|
bug #18803: Fuse reading regression in avrdude 5.3.1 with avr910
|
||||||
|
programmer
|
||||||
|
|
||||||
|
2007-05-15 Colin O'Flynn <coflynn@newae.com>
|
||||||
|
|
||||||
|
* avrdude.conf.in: Rename the ATmega164 and ATmega324 into
|
||||||
|
ATmega164P and ATmega324P, resp. Add an entry for the ATmega644P.
|
||||||
|
Fixes bug #19769: ATmega164p not recognized
|
||||||
|
|
||||||
|
2007-05-15 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* ser_posix.c (ser_send): Don't select() on the output fd before
|
||||||
|
trying to write something to the serial line. That kind of
|
||||||
|
polling isn't very useful anyway, and it seems it breaks for the
|
||||||
|
Linux CP210x USB<->RS-232 bridge driver which is certainly a bug
|
||||||
|
in the driver, but we can just avoid that bug alltogether.
|
||||||
|
|
||||||
|
2007-05-15 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avrdude.conf.in: Fix the STK500v2 ISP delay parameter for
|
||||||
|
ATmega640/1280/1281/2560/2561. Atmel has changed the XML
|
||||||
|
files after the initial release.
|
||||||
|
|
||||||
|
2007-05-01 Colin O'Flynn <coflynn@newae.com>
|
||||||
|
|
||||||
|
* safemode.c: -Oops - bug in verbose output. Fixed.
|
||||||
|
-Fixed handling of cases where programmer cannot read fuses (AVR910)
|
||||||
|
* main.c: -Also fixing handling of cases where programmer cannot
|
||||||
|
read fuses
|
||||||
|
This should close one or more bugs (18803, 19570)
|
||||||
|
|
||||||
|
2007-05-01 Colin O'Flynn <coflynn@newae.com>
|
||||||
|
|
||||||
|
* safemode.c: Added verbose output from safemode routines.
|
||||||
|
|
||||||
|
2007-03-25 Colin O'Flynn <coflynn@newae.com>
|
||||||
|
|
||||||
|
* stk500generic.c: Forgot to close the serial port before trying to
|
||||||
|
open it again, caused problems on Windows machines.
|
||||||
|
Closes bug #19411
|
||||||
|
|
||||||
|
2007-02-26 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avrdude.conf.in: Add the AT90PWM2/3B devices.
|
||||||
|
|
||||||
|
2007-02-02 Thomas Fischl <tfischl@gmx.de>
|
||||||
|
|
||||||
|
* usbasp.c: Changed return value of function usbasp_initialize to stop
|
||||||
|
avrdude on communication errors between programmer and target.
|
||||||
|
Closes bug #18581: safemode destroys fuse bits
|
||||||
|
|
||||||
|
2007-02-01 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* config_gram.y: Remove duplicate definition of token K_WRITEPAGE
|
||||||
|
|
||||||
|
2007-01-30 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* butterfly.c: Implement ATmega256x support for butterfly/avr109.
|
||||||
|
|
||||||
|
2007-01-30 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac: Fix subdir handling. Now finally, "make
|
||||||
|
distcheck" will include the documentation into the tarball even if
|
||||||
|
the configure had been run without the --enable-doc.
|
||||||
|
|
||||||
|
2007-01-30 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* safemode.c: Obtain progname from avrdude.h rather than trying to
|
||||||
|
roll our own (duplicate) copy of it.
|
||||||
|
* avr910.c: Constify char pointers.
|
||||||
|
* avrpart.c: (Ditto.)
|
||||||
|
* avrpart.h: (Ditto.)
|
||||||
|
* butterfly.c: (Ditto.)
|
||||||
|
* config.c: (Ditto.)
|
||||||
|
* config.h: (Ditto.)
|
||||||
|
* jtagmkI.c: (Ditto.)
|
||||||
|
* jtagmkII.c: (Ditto.)
|
||||||
|
* par.c: (Ditto.)
|
||||||
|
* pgm.c: (Ditto.)
|
||||||
|
* pgm.h: (Ditto.)
|
||||||
|
* serbb_posix.c: (Ditto.)
|
||||||
|
* serbb_win32.c: (Ditto.)
|
||||||
|
* stk500.c: (Ditto.)
|
||||||
|
* stk500v2.c: (Ditto.)
|
||||||
|
* usbasp.c: (Ditto.)
|
||||||
|
|
||||||
|
2007-01-29 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avrpart.c: More backend/library abstraction and generalization:
|
||||||
|
turn the list_parts() and list_programmers() functions into
|
||||||
|
general list iteration functions that call a caller-supplied
|
||||||
|
callback for each element. Implement list_parts() and
|
||||||
|
list_programmers() as private functions in main.c based on that
|
||||||
|
approach.
|
||||||
|
* avrpart.h: (Ditto.)
|
||||||
|
* main.c: (Ditto.)
|
||||||
|
* pgm.c: (Ditto.)
|
||||||
|
* pgm.h: (Ditto.)
|
||||||
|
|
||||||
|
2007-01-25 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* Makefile.am: Rearrange everything so it is now built into a
|
||||||
|
libavrdude.a library, and link main.c against that library.
|
||||||
|
* configure.ac: Add AC_PROG_RANLIB as we are building a library
|
||||||
|
now.
|
||||||
|
|
||||||
|
2007-01-24 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Major code cleanup.
|
||||||
|
- Make all internal functions "static".
|
||||||
|
- Make sure each module's header and implementation file match.
|
||||||
|
- Remove all library-like functionality from main.c, so only
|
||||||
|
the actual frontend remains in main.c.
|
||||||
|
- Add C++ brackets to all header files.
|
||||||
|
* avr.c: (Ditto.)
|
||||||
|
* avr.h: (Ditto.)
|
||||||
|
* avr910.c: (Ditto.)
|
||||||
|
* avr910.h: (Ditto.)
|
||||||
|
* avrdude.h: (Ditto.)
|
||||||
|
* avrpart.c: (Ditto.)
|
||||||
|
* avrpart.h: (Ditto.)
|
||||||
|
* bitbang.h: (Ditto.)
|
||||||
|
* butterfly.h: (Ditto.)
|
||||||
|
* config.c: (Ditto.)
|
||||||
|
* config.h: (Ditto.)
|
||||||
|
* confwin.h: (Ditto.)
|
||||||
|
* crc16.c: (Ditto.)
|
||||||
|
* crc16.h: (Ditto.)
|
||||||
|
* fileio.c: (Ditto.)
|
||||||
|
* fileio.h: (Ditto.)
|
||||||
|
* jtagmkI.h: (Ditto.)
|
||||||
|
* jtagmkII.h: (Ditto.)
|
||||||
|
* lexer.l: (Ditto.)
|
||||||
|
* lists.h: (Ditto.)
|
||||||
|
* main.c: (Ditto.)
|
||||||
|
* par.h: (Ditto.)
|
||||||
|
* pgm.c: (Ditto.)
|
||||||
|
* pgm.h: (Ditto.)
|
||||||
|
* ppi.c: (Ditto.)
|
||||||
|
* ppi.h: (Ditto.)
|
||||||
|
* safemode.h: (Ditto.)
|
||||||
|
* serbb.h: (Ditto.)
|
||||||
|
* serial.h: (Ditto.)
|
||||||
|
* stk500.h: (Ditto.)
|
||||||
|
* stk500v2.c: (Ditto.)
|
||||||
|
* stk500v2.h: (Ditto.)
|
||||||
|
* term.c: (Ditto.)
|
||||||
|
* term.h: (Ditto.)
|
||||||
|
* usbasp.h: (Ditto.)
|
||||||
|
* update.c: New file.
|
||||||
|
* update.h: New file.
|
||||||
|
* Makefile.am: Include update.c and update.h.
|
||||||
|
|
||||||
|
2007-01-24 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Move all "extern" declarations into a centreal header file.
|
||||||
|
* Makefile.am: Add new avrdude.h.
|
||||||
|
* avrdude.h: New file.
|
||||||
|
* avr.c: Replace private extern decl's by #include "avrdude.h".
|
||||||
|
* avr910.c: (Ditto.)
|
||||||
|
* avrpart.c: (Ditto.)
|
||||||
|
* bitbang.c: (Ditto.)
|
||||||
|
* butterfly.c: (Ditto.)
|
||||||
|
* config.c: (Ditto.)
|
||||||
|
* config_gram.y: (Ditto.)
|
||||||
|
* fileio.c: (Ditto.)
|
||||||
|
* jtagmkI.c: (Ditto.)
|
||||||
|
* jtagmkII.c: (Ditto.)
|
||||||
|
* lexer.l: (Ditto.)
|
||||||
|
* main.c: (Ditto.)
|
||||||
|
* par.c: (Ditto.)
|
||||||
|
* pgm.c: (Ditto.)
|
||||||
|
* ppi.c: (Ditto.)
|
||||||
|
* ppiwin.c: (Ditto.)
|
||||||
|
* ser_avrdoper.c: (Ditto.)
|
||||||
|
* ser_posix.c: (Ditto.)
|
||||||
|
* ser_win32.c: (Ditto.)
|
||||||
|
* serbb_posix.c: (Ditto.)
|
||||||
|
* serbb_win32.c: (Ditto.)
|
||||||
|
* stk500.c: (Ditto.)
|
||||||
|
* stk500generic.c: (Ditto.)
|
||||||
|
* stk500v2.c: (Ditto.)
|
||||||
|
* term.c: (Ditto.)
|
||||||
|
* usb_libusb.c: (Ditto.)
|
||||||
|
* usbasp.c: (Ditto.)
|
||||||
|
|
||||||
|
2007-01-13 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avrdude.conf.in (ATmega8): Bump the delay values for flash
|
||||||
|
and EEPROM, based on the current Atmel XML file.
|
||||||
|
|
||||||
|
2007-01-12 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac: Improve the detection of the Win32 HID library,
|
||||||
|
and the presence of the header ddk/hidsdi.h. It now works
|
||||||
|
correctly under Cygwin and several flavours of MinGW.
|
||||||
|
* Makefile.am: Add new LIBHID pattern.
|
||||||
|
|
||||||
|
2007-01-11 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* butterfly.c (butterfly_initialize): when sending the 'T'
|
||||||
|
command (which is ignored by current AVR109 bootloaders),
|
||||||
|
send the first reply from the list of supported device
|
||||||
|
codes back rather than using avrdude.conf's idea about
|
||||||
|
an AVR910 device code. Apparently, this solves disagreements
|
||||||
|
between different versions of at least the ATmega8 AVR910
|
||||||
|
device code.
|
||||||
|
Closes bug #18727: Writing flash failed
|
||||||
|
|
||||||
|
2007-01-07 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Reported by Till Harbaum:
|
||||||
|
* avrdude.conf.in (ATtiny25/45/85): Change HVSP reset from
|
||||||
|
500 microseconds to 1 ms, matching the most recent Atmel XML
|
||||||
|
specs.
|
|
@ -0,0 +1,185 @@
|
||||||
|
2008-11-20 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avrdude.h: Change the prototype for usleep() to be more Cygwin-
|
||||||
|
friendly.
|
||||||
|
* ppiwin.c: (Ditto.)
|
||||||
|
|
||||||
|
2008-11-06 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by limor <limor@ladyada.net>
|
||||||
|
* usbtiny.c (usbtiny_cmd): Replace sizeof() by a fixed constant
|
||||||
|
4 for the result array, because otherwise it would take the size
|
||||||
|
of a pointer which miserably fails on 64-bit machines.
|
||||||
|
|
||||||
|
2008-11-05 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
patch #6609: Using PCI parallel port cards on Windows
|
||||||
|
* ppiwin.c (ppi_open): If the port parameter passed from the
|
||||||
|
-p option is neither lpt1/2/3, try interpreting it directly as
|
||||||
|
a base address.
|
||||||
|
* avrdude.1: Document the change.
|
||||||
|
* doc/avrdude.texi: (Ditto.)
|
||||||
|
|
||||||
|
2008-11-04 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #22882: Erase Cycle Counter does not work for stk500v2
|
||||||
|
* stk500v2.c (stk500v2_chip_erase,stk500hv_chip_erase): Return
|
||||||
|
the expected 0 for success rather than a protocol-dependant
|
||||||
|
number.
|
||||||
|
|
||||||
|
2008-11-04 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #22883: Chip Erase performed even with no-write flag (-n)
|
||||||
|
* main.c: Do not erase the chip if both, -e and -n options have
|
||||||
|
been specified.
|
||||||
|
|
||||||
|
2008-11-04 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #24589: AT90USB64* have wrong signature
|
||||||
|
* avrdude.conf.in: Uncomment the correct, and delete the wrong
|
||||||
|
signature for AT90USB646/647. Alas, the datasheet has never been
|
||||||
|
corrected for years.
|
||||||
|
|
||||||
|
2008-10-31 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* jtagmkII.c: Fix a serious memory corruption that happened when
|
||||||
|
using the JTAG ICE mkII (or AVR Dragon) in ISP mode. The wrong
|
||||||
|
set of per-programmer private data had been allocated (stk500v2
|
||||||
|
vs. jtagmkII) which was too small to hold the actual data.
|
||||||
|
* jtagmkII.h: (Ditto.)
|
||||||
|
* stk500v2.c: (Ditto.)
|
||||||
|
|
||||||
|
2008-07-29 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* jtagmkII.c: Implement Xmega JTAG support.
|
||||||
|
* jtagmkII_private.h: Add EMULATOR_MODE_JTAG_XMEGA.
|
||||||
|
|
||||||
|
2008-07-29 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* main.c: Remember whether the device initialization worked, and
|
||||||
|
allow to continue with -F if it failed yet do not attempt to
|
||||||
|
perform anything on the device itself. That way, -tF could be
|
||||||
|
specified for programmers like the STK500/STK600 even without a
|
||||||
|
device connected, just in order to allow changing parameters on
|
||||||
|
the programmer itself.
|
||||||
|
* avrdude.1: Document that possible use of the -F option.
|
||||||
|
* doc/avrdude.texi: (Ditto.)
|
||||||
|
|
||||||
|
2008-07-29 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* stk500v2.c (stk600_xprog_paged_write): Fix a fatal miscalculation
|
||||||
|
of the number of bytes to be written which caused a malloc chunk
|
||||||
|
corruption.
|
||||||
|
|
||||||
|
2008-07-27 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
First implementation of ATxmega support. By now, only the
|
||||||
|
PDI mode of the STK600 is supported. Single-byte EEPROM
|
||||||
|
(and flash) updates do not work yet.
|
||||||
|
* avr.c: "boot" memory is a candidate memory region for paged
|
||||||
|
operations, besides "flash" and "eeprom".
|
||||||
|
* avrdude.conf.in: add ATxmega128A1 and ATxmega128A1revD
|
||||||
|
* avrpart.h: add the AVRPART_HAS_PDI flag (used to distinguish
|
||||||
|
ATxmega parts from classic AVRs), the nvm_base part field, and
|
||||||
|
the offset field for a memory region.
|
||||||
|
* config_gram.y: add "has_pdi", "nvm_base", and "offset"
|
||||||
|
* lexer.l: (Ditto.)
|
||||||
|
* main.c: disable auto_erase for ATxmega parts
|
||||||
|
* stk500v2.c: implement the XPROG functionality, and divert to
|
||||||
|
this for ATxmega parts
|
||||||
|
* avrdude.1: Document the changes.
|
||||||
|
* doc/avrdude.texi: (Ditto.)
|
||||||
|
|
||||||
|
2008-07-25 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Fix a bunch of warnings.
|
||||||
|
* avr910.c (avr910_paged_load): possible unitialized use of
|
||||||
|
rd_size
|
||||||
|
* jtagmkI.c (jtagmkI_initialize): pointer signedness mixup
|
||||||
|
* jtagmkII.c (jtagmkII_print_parms1): propagate const'ness
|
||||||
|
of parameter
|
||||||
|
* usbasp.c (usbasp_transmit): pointer signedness mixup
|
||||||
|
* ser_avrdoper.c (usbGetReport): remove useless pointer deref
|
||||||
|
|
||||||
|
2008-07-25 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Contributed by Ville Voipio:
|
||||||
|
patch #6501: New autotools support for avrdude
|
||||||
|
* Makefile.am: add @WINDOWS_DIRS@ to SUBDIR
|
||||||
|
* bootstrap: allow for autconf-2.61 and automake-1.10, too
|
||||||
|
* configure.ac: fix @WINDOWS_DIRS@ recursion, replace
|
||||||
|
AC_PROG_CC by AM_PROG_CC_C_O, for esoteric reasons
|
||||||
|
|
||||||
|
2008-06-13 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Contributed by Janos Sallai <janos.sallai@vanderbilt.edu>:
|
||||||
|
patch #6074: added support for crossbow's MIB510 programmer
|
||||||
|
* avrdude.conf.in: Add entry for mib510.
|
||||||
|
* stk500.c: Add special hooks to handle the MIB510 programmer.
|
||||||
|
It mostly talks STK500v1 protocol but has a special hello and
|
||||||
|
goodbye sequence, and uses a fixed block size of 256 bytes.
|
||||||
|
* doc/avrdude.texi: Document support for mib510.
|
||||||
|
|
||||||
|
2008-06-07 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Contributed by Klaus Leidinger <klaus@mikrocontroller-projekte.de>:
|
||||||
|
* main.c: Realign verbose messages.
|
||||||
|
* avrpart.c: (Ditto.)
|
||||||
|
* avr910.c: Print the device code selected in verbose mode.
|
||||||
|
* butterfly.c: (Ditto.)
|
||||||
|
|
||||||
|
2008-06-07 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Contributed by Klaus Leidinger <klaus@mikrocontroller-projekte.de>:
|
||||||
|
Add check for buffermode feature, and use it if present. Can be
|
||||||
|
turned off using -x no_blockmode.
|
||||||
|
* avr910.c: Implement buffermode test and usage.
|
||||||
|
* avrdude.1: Document -x no_blockmode.
|
||||||
|
* doc/avrdude.texi: (Ditto.)
|
||||||
|
|
||||||
|
2008-03-24 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* usb_libusb.c: #undef interface for Win32
|
||||||
|
|
||||||
|
2008-03-24 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avr910.c: Add support for the -x devcode option.
|
||||||
|
* avrdude.1: Document -x devcode for avr910.
|
||||||
|
* doc/avrdude.texi: (Ditto.)
|
||||||
|
|
||||||
|
2008-03-14 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Add initial support for the Atmel STK600, for
|
||||||
|
"classic" AVRs (AT90, ATtiny, ATmega) in both,
|
||||||
|
ISP and high-voltage programming modes.
|
||||||
|
* Makefile.am: Add -lm.
|
||||||
|
* avrdude.conf.in: Add stk600, stk600pp, and stk600hvsp.
|
||||||
|
* config_gram.y: Add support for the stk600* keywords.
|
||||||
|
* lexer.l: (Ditto.)
|
||||||
|
* pgm.h: Add the "chan" parameter to set_varef().
|
||||||
|
* stk500.c: (Ditto.)
|
||||||
|
* serial.h: Add USB endpoint support to struct filedescriptor.
|
||||||
|
* stk500v2.c: Implement the meat of the STK600 support.
|
||||||
|
* stk500v2.h: Add new prototypes for stk600*() programmers.
|
||||||
|
* stk500v2_private.h: Add new constants used in the STK600.
|
||||||
|
* term.c: Add AREF channel support.
|
||||||
|
* usb_libusb.c: Automatically determine the correct write
|
||||||
|
endpoint ID, the STK600 uses 0x83 while all other tools use
|
||||||
|
0x82. Propagate the EP to use through struct filedescriptor.
|
||||||
|
* usbdevs.h: Add the STK600 USB product ID.
|
||||||
|
* tools/get-stk600-cards.xsl: XSL transformation for
|
||||||
|
targetboards.xml to obtain the list of socket and routing
|
||||||
|
card IDs, to be used in stk500v2.c (for displaying the
|
||||||
|
names).
|
||||||
|
* tools/get-stk600-devices.xsl: XSL transformation for
|
||||||
|
targetboards.xml to obtain the table of socket/routing cards
|
||||||
|
and their respective AVR device support for doc/avrdude.texi.
|
||||||
|
* avrdude.1: Document all the STK600 stuff.
|
||||||
|
* doc/avrdude.texi: Ditto. Added a new chapter for
|
||||||
|
Programmer Specific Information.
|
||||||
|
|
||||||
|
2008-01-26 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* stk500v2.c (stk500v2_recv): Make length computation unsigned so
|
||||||
|
it cannot accidentally become negative.
|
||||||
|
|
|
@ -0,0 +1,411 @@
|
||||||
|
2009-11-09 David Hoerl <dhoerl@mac.com>
|
||||||
|
|
||||||
|
* fileio.c: ihex2bin did not properly handle files > 64K bytes
|
||||||
|
* usb_libusb.c: re-enabled usb_reset for Macs (no reset causes lots of failures)
|
||||||
|
* avrdude.1: spacing issue for avr32 fixed.
|
||||||
|
|
||||||
|
2009-11-09 Michal Ludvig <mludvig@logix.net.nz>
|
||||||
|
|
||||||
|
* buspirate.c: Implemented reset= and speed= extended parameters.
|
||||||
|
* avrdude.1: Document the change.
|
||||||
|
|
||||||
|
2009-11-04 Michal Ludvig <mludvig@logix.net.nz>
|
||||||
|
|
||||||
|
* configure.ac, Makefile.am: Test if GCC accepts -Wno-pointer-sign
|
||||||
|
|
||||||
|
2009-11-04 Michal Ludvig <mludvig@logix.net.nz>
|
||||||
|
|
||||||
|
* buspirate.c: Implemented 'BinMode' support for
|
||||||
|
firmware 2.7 and higher.
|
||||||
|
* avrdude.1: Added info about BusPirate.
|
||||||
|
|
||||||
|
2009-11-03 Michal Ludvig <mludvig@logix.net.nz>
|
||||||
|
|
||||||
|
* arduino.c: Add on to bug #26703 / patch #6866 - clear DTR/RTS
|
||||||
|
when closing the port.
|
||||||
|
* Makefile.am: Silent warnings about signedness - they're useless
|
||||||
|
and annoying, especially for 'char' vars.
|
||||||
|
|
||||||
|
2009-10-22 David Hoerl <dhoerl@mac.com>
|
||||||
|
|
||||||
|
* usb_libusb.c: disabled usb_reset for Macs (same as FreeBSD)
|
||||||
|
|
||||||
|
2009-10-12 Michal Ludvig <mludvig@logix.net.nz>
|
||||||
|
|
||||||
|
* main.c: Re-added default to serial port for BusPirate.
|
||||||
|
|
||||||
|
2009-10-12 David Hoerl <dhoerl@mac.com>
|
||||||
|
|
||||||
|
* main.c: removed some avr32 code that was pushed into jtagmkII.c
|
||||||
|
* jtagmkII.c: consolodated the avr32 reset code and avr32_chipreset
|
||||||
|
* avrpart.h: modified AVRPART flags for avr32
|
||||||
|
* lexer.l: added is_avr32 flag - only way to get yacc code to set flag
|
||||||
|
* avrdude.conf.in: updated avr32 section to include "is_avr32" flag
|
||||||
|
|
||||||
|
2009-10-12 David Hoerl <dhoerl@mac.com>
|
||||||
|
|
||||||
|
* config_gram.y: Restored inadvertantly removed buspirate entry
|
||||||
|
* lexer.l: Restored inadvertantly removed buspirate entry
|
||||||
|
|
||||||
|
2009-10-12 Michal Ludvig <mludvig@logix.net.nz>
|
||||||
|
|
||||||
|
* buspirate.c: Replace GNU-only %as with %s in sscanf call.
|
||||||
|
* ser_win32.c(ser_set_dtr_rts): Fixed typo in parameter name.
|
||||||
|
* NEWS: Announce BusPirate.
|
||||||
|
|
||||||
|
2009-10-11 David Hoerl <dhoerl@mac.com>
|
||||||
|
|
||||||
|
Support for AVR32
|
||||||
|
|
||||||
|
* AUTHORS: added myself
|
||||||
|
* NEWS: announced AVR32 support
|
||||||
|
* main.c: AVR32 flag tests to avoid several code blocks
|
||||||
|
* fileio.c: mods to ihex read function to handle address offsets and
|
||||||
|
size of avr32
|
||||||
|
* jtagmkI.c: added cast to printf call to remove warning
|
||||||
|
* arduino.c: added header file to bring in prototype for usleep()
|
||||||
|
* config_gram.y: added defines for avr32, new jtag_mkii variant for avr32
|
||||||
|
* jtagmkII_private.h: new jtag_mkii message types defined (used by
|
||||||
|
avr32program)
|
||||||
|
* jtagmkII.h: extern jtagmkII_avr32_initpgm() addition
|
||||||
|
* jtagmkII.c: huge amount of code in support of avr32
|
||||||
|
* avrpart.h: additional flags to AVRPART for avr32
|
||||||
|
* usb_libusb.c: modified verbose test for USB read per-byte messages by
|
||||||
|
by one, so with verbose=3 you get just full messages, 4 gives you bytes
|
||||||
|
too
|
||||||
|
* lexer.l: additions for avr32
|
||||||
|
|
||||||
|
2009-10-10 Michal Ludvig <mludvig@logix.net.nz>
|
||||||
|
|
||||||
|
Support for Arduino auto-reset:
|
||||||
|
* serial.h, ser_avrdoper.c, ser_posix.c, ser_win32.c: Added
|
||||||
|
serial_device.set_dtr_rts implementations.
|
||||||
|
* arduino.c, stk500.c, stk500.h: Call serial_set_dtr_rts()
|
||||||
|
to reset Arduino board before program upload.
|
||||||
|
Inspired by patch #6866, resolves bug #26703
|
||||||
|
|
||||||
|
2009-10-08 Michal Ludvig <mludvig@logix.net.nz>
|
||||||
|
|
||||||
|
* buspirate.c: Optimised buspirate_cmd() - reading 1kB EEPROM now
|
||||||
|
takes only 14 sec instead of almost 2 mins with the original
|
||||||
|
implementation.
|
||||||
|
|
||||||
|
2009-10-08 Michal Ludvig <mludvig@logix.net.nz>
|
||||||
|
|
||||||
|
* buspirate.c, buspirate.h: Support for the BusPirate programmer
|
||||||
|
* config_gram.y, avrdude.conf.in, main.c, lexer.l, Makefile.am:
|
||||||
|
Glue for BusPirate.
|
||||||
|
|
||||||
|
2009-08-17 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* usb_libusb.c (usbdev_close): Repair the logic around the
|
||||||
|
conditional compilation of usb_reset() introduced in r798.
|
||||||
|
|
||||||
|
2009-07-11 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac: We are post-5.8 now.
|
||||||
|
|
||||||
|
2009-07-11 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac: Prepare for releasing version 5.8
|
||||||
|
|
||||||
|
2009-07-11 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Roger Wolff:
|
||||||
|
bug #26527: bug in unicode conversion
|
||||||
|
* ser_avrdoper.c (convertUniToAscii): when encountering a UTF-16
|
||||||
|
character that cannot be converted to ASCII, increment the UTF-16
|
||||||
|
pointer anyway when proceeding.
|
||||||
|
|
||||||
|
2009-07-11 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* jtagmkI.c (jtagmkI_send): Replace %zd format by %u since not all
|
||||||
|
implementations do understand the C99 formatting options (sigh).
|
||||||
|
* jtagmkII.c (jtagmkII_send): (Ditto.)
|
||||||
|
* stk500v2.c (stk500v2_recv): (Ditto.)
|
||||||
|
|
||||||
|
2009-07-11 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #26002: HVPP of EEPROM with AVR Dragon and ATmega8 Fails
|
||||||
|
* avrdude.conf.in (ATmega8): add page size for EEPROM.
|
||||||
|
|
||||||
|
2009-07-07 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* stk500v2.c: Fix a serious memory corruption problem resulting
|
||||||
|
out of the chaining of both, the stk500v2 and the jtagmkII
|
||||||
|
programmers for some programming hardware (JTAG ICE mkII and AVR
|
||||||
|
Dragon running in ISP, HVSP or PP mode), where both programmers
|
||||||
|
have to maintain their private programmer data.
|
||||||
|
|
||||||
|
2009-07-02 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac: Post-release (is pre-release...)
|
||||||
|
|
||||||
|
2009-07-02 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac: Prepare for releasing version 5.7
|
||||||
|
|
||||||
|
2009-07-02 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* main.c: Add my name to the copyright output when being verbose.
|
||||||
|
|
||||||
|
2009-07-02 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Contributed by Shaun Jackman <sjackman@gmail.com>
|
||||||
|
bug #21798: Fix both XSLT scripts
|
||||||
|
* tools/get-dw-params.xsl (format-hex): Add the parameter count.
|
||||||
|
* tools/get-hv-params.xsl (format_cstack): Ditto.
|
||||||
|
|
||||||
|
2009-07-02 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #21922: ATmega163 still not working in version 5.5
|
||||||
|
* avrdude.conf.in (atmega163): fill in stk500v2 parameters, correct
|
||||||
|
some flash programming parameters as well.
|
||||||
|
|
||||||
|
2009-07-02 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #22206: avrdude: ser_setspeed(): tcsetattr() failed
|
||||||
|
* ser_posix.c (ser_setspeed): Don't pass TCSAFLUSH to tcsetattr() as
|
||||||
|
it apparently fails to work on Solaris. After reading the
|
||||||
|
documentation again, it seems TCSAFLUSH and TCSANOW are indeed
|
||||||
|
mutually exclusive.
|
||||||
|
|
||||||
|
2009-07-02 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #22234: WINDOWS version: HOWTO: Specify Serial Ports Larger than COM9
|
||||||
|
* ser_win32.c (ser_open): prepend \\.\ to any COM port name, so it is
|
||||||
|
safe to be used for COM ports above 9.
|
||||||
|
|
||||||
|
2009-07-02 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #26408: Crash in stk500v2_open()
|
||||||
|
* stk500generic.c: Implement setup and teardown hooks, calling in turn
|
||||||
|
the respective hooks of the stk500v2 implementation.
|
||||||
|
|
||||||
|
2009-07-02 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #26130: Avrdude doesn't display it's version.
|
||||||
|
* main.c (usage): add a version number display to the default usage
|
||||||
|
message.
|
||||||
|
|
||||||
|
2009-07-01 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #26412: avrdude segfaults when called with a programmer that does not
|
||||||
|
support it
|
||||||
|
* main.c: do not call pgm->perform_osccal() unless it is != 0.
|
||||||
|
|
||||||
|
2009-06-24 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Contributed by Zoltan Laday:
|
||||||
|
patch #6825: xmega problems with JTAGICEmkII
|
||||||
|
* jtagmkII.c: Many fixes for Xmega devices.
|
||||||
|
* jtagmkII_private.h: Add various new constants required for
|
||||||
|
Xmega devices.
|
||||||
|
* avrdude.conf.in: New devices: ATXMEGA64A1, ATXMEGA192A1,
|
||||||
|
ATXMEGA256A1, ATXMEGA64A3, ATXMEGA128A3, ATXMEGA192A3,
|
||||||
|
ATXMEGA256A3, ATXMEGA256A3B, ATXMEGA16A4, ATXMEGA32A4,
|
||||||
|
ATXMEGA64A4, ATXMEGA128A4
|
||||||
|
* avr.c (avr_read, avr_write): Add more names for (Xmega)
|
||||||
|
memory areas that require paged operation.
|
||||||
|
|
||||||
|
2009-06-24 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* stk500v2.c (stk600_xprog_write_byte): Handle writing fuse bytes.
|
||||||
|
|
||||||
|
2009-04-28 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Carl Hamilton:
|
||||||
|
* update.c (parse_op): correctly \0-terminate buf after filling
|
||||||
|
it, before it is potentially used as the source of a call to
|
||||||
|
strlen or strcpy.
|
||||||
|
|
||||||
|
2009-04-14 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* doc/avrdude.texi: Merge the -P 0xXXX option description from
|
||||||
|
avrdude.1.
|
||||||
|
|
||||||
|
2009-04-14 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac: declare AM_PROG_CC_C_O to avoid the warning
|
||||||
|
"compiling `config_gram.c' with per-target flags
|
||||||
|
requires `AM_PROG_CC_C_O' in `configure.ac'"
|
||||||
|
|
||||||
|
2009-03-22 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #25971: "error writing to <stdout>" with multiple -U params.
|
||||||
|
* fileio.c: Do not close the input/output stream when working on an
|
||||||
|
stdio stream.
|
||||||
|
|
||||||
|
2009-02-28 Thomas Fischl <tfischl@gmx.de>
|
||||||
|
|
||||||
|
Based on patch #6484 commited by Jurgis Brigmanis:
|
||||||
|
* usbasp.c: added software control for ISP speed
|
||||||
|
* usbasp.h: (Ditto.)
|
||||||
|
|
||||||
|
2009-02-28 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avr910.c (avr910_read_byte_flash): Eliminate a static variable that
|
||||||
|
hasn't been in use for 5 years.
|
||||||
|
|
||||||
|
2009-02-27 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac: Post-release 5.6.
|
||||||
|
|
||||||
|
2009-02-27 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac: Prepare for releasing version 5.6.
|
||||||
|
|
||||||
|
2009-02-27 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Ed Okerson:
|
||||||
|
* jtagmkII.c (jtagmkII_read_byte): Fix signature reading of
|
||||||
|
Xmega.
|
||||||
|
|
||||||
|
2009-02-26 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Mikael Hermansson:
|
||||||
|
* avrdude.conf.in (ATxmega256A3): new device.
|
||||||
|
* stk500v2 (stk500v2_initialize): Enable the AVRISPmkII as a
|
||||||
|
PDI-capable device for ATxmega parts.
|
||||||
|
|
||||||
|
2009-02-25 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Lars Immisch:
|
||||||
|
patch #6750: Arduino support - new programmer-id
|
||||||
|
* arduino.c: New file, inherits stk500.c.
|
||||||
|
* arduino.h: New file.
|
||||||
|
* Makefile.am: Add arduino.c and arduino.h.
|
||||||
|
* config_gram.y: Add arduino keyword.
|
||||||
|
* lexer.l: (Ditto.)
|
||||||
|
* avrdude.conf.in: (Ditto.)
|
||||||
|
* avrdude.1: Document the new programmer type.
|
||||||
|
* doc/avrdude.texi: (Ditto.)
|
||||||
|
|
||||||
|
2009-02-25 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* stk500v2.c: Turn all non-const static data into instance data.
|
||||||
|
|
||||||
|
2009-02-25 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* Makefile.am: Move term.[ch] from the library into the CLI
|
||||||
|
application section, as it is not useful for anything else but
|
||||||
|
the CLI frontend.
|
||||||
|
|
||||||
|
2009-02-25 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avrdude.conf.in (ATmega1284P): new device.
|
||||||
|
|
||||||
|
2009-02-23 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
More fixes for Solaris, including fixes for the Sunpro compiler:
|
||||||
|
* avr.h: Remove stray semicolon.
|
||||||
|
* configure.ac: Add check for predefined types uint_t and ulong_t.
|
||||||
|
* confwin.c: Include "avrdude.h" on top to avoid empty translation
|
||||||
|
unit warning.
|
||||||
|
* ppwin.c: (Ditto.)
|
||||||
|
* ser_win32.c: (Ditto.)
|
||||||
|
* serbb_win32.c: (Ditto.)
|
||||||
|
* jtagmkII.c (jtagmkII_recv): remove unreachable "return".
|
||||||
|
* stk500.c (stk500_initialize): (Ditto.)
|
||||||
|
* par.c: Test for both, __sun__ and __sun to see whether we are
|
||||||
|
being compiled on Solaris.
|
||||||
|
* ppi.c: (Ditto.)
|
||||||
|
* stk500v2.c: Implement the DEBUG and DEBUGRECV macros in a way
|
||||||
|
that is compatible with the ISO C99 standard.
|
||||||
|
* usbtiny.c: Only typedef uint_t and ulong_t if they have not
|
||||||
|
been found already by the autoconf checks.
|
||||||
|
|
||||||
|
2009-02-23 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #22204: Solaris10/11 Undefiniertes Symbol gethostbyname socket
|
||||||
|
connect
|
||||||
|
* configure.ac: Add checks for gethostent() and socket().
|
||||||
|
While being here, remove some old cruft left from ancient days.
|
||||||
|
|
||||||
|
2009-02-22 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* lexer.l: Bump the %p size so AT&T lex will continue to work.
|
||||||
|
|
||||||
|
2009-02-19 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
(Partially) submitted by John Voltz:
|
||||||
|
bug #20004: AVRDUDE update (-U) operations do not close files
|
||||||
|
* fileio.c (fmt_autodetect, fileio): fclose() files.
|
||||||
|
|
||||||
|
2009-02-18 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* usbtiny.c: Replace all but one (very unlikely to trigger) exit(1)
|
||||||
|
by return -1.
|
||||||
|
|
||||||
|
2009-02-18 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Dick Streefland:
|
||||||
|
patch #6749: make reading from the USBtinyISP programmer more robust
|
||||||
|
* usbtiny.c: Add code to retry failed communication attempts.
|
||||||
|
|
||||||
|
2009-02-17 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Nick Hibma:
|
||||||
|
bug #22271: usb_reset in usb_libusb.c not necessary in FreeBSD 6.x
|
||||||
|
* usb_libusb.c (usbdev_close): Do not call usb_reset() on FreeBSD.
|
||||||
|
It is not necessary there.
|
||||||
|
|
||||||
|
2009-02-17 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Andrew O. Shadoura:
|
||||||
|
bug #25156: add direct SPI transfer mode
|
||||||
|
* bitbang.c: Implement direct SPI transfers.
|
||||||
|
* bitbang.h: (Ditto.)
|
||||||
|
* par.c: (Ditto.)
|
||||||
|
* pgm.c: (Ditto.)
|
||||||
|
* pgm.h: (Ditto.)
|
||||||
|
* term.c: Add the "spi" and "pgm" commands.
|
||||||
|
* avrdude.1: Document the changes.
|
||||||
|
* doc/avrdude.texi: (Ditto.)
|
||||||
|
|
||||||
|
2009-02-17 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Limor ("Lady Ada"):
|
||||||
|
bug #24749: add support for '328p
|
||||||
|
* avrdude.conf.in (ATmega328P): new device support.
|
||||||
|
|
||||||
|
2009-02-17 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by "Womo":
|
||||||
|
bug #25241: AT90USB162, AT90USB82 device support patch for avrdude-5.5
|
||||||
|
(also: bug #21745: AT90USBxx2 support)
|
||||||
|
* avrdude.conf.in (AT90USB162, AT90USB82): new device support.
|
||||||
|
|
||||||
|
2009-02-17 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Evangelos Arkalis:
|
||||||
|
patch #6069: Atmel AT89ISP Cable
|
||||||
|
* avrdude.conf.in (89isp): new programmer support.
|
||||||
|
|
||||||
|
2009-02-16 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Bob Paddock:
|
||||||
|
patch #6748: ATTiny88 Config
|
||||||
|
* avrdude.conf.in (ATtiny88): new device support.
|
||||||
|
|
||||||
|
2009-02-16 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Mark Litwack:
|
||||||
|
patch #6261: avrdude won't use dragon/debugwire to write a file
|
||||||
|
to eeprom
|
||||||
|
* jtagmkII.c (jtagmkII_paged_write): when in debugWire mode,
|
||||||
|
implement a paged write to EEPROM as a series of byte writes.
|
||||||
|
|
||||||
|
2009-02-16 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Janos Sallai:
|
||||||
|
patch #6542: paged_load fails on the MIB510 programming board
|
||||||
|
* stk500.c: Add a workaround for the different signon sequence on
|
||||||
|
MIB510 programmers.
|
||||||
|
|
||||||
|
2009-02-05 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avrdude.conf.in: Add the ATmega128RFA1.
|
||||||
|
* avrdude.1: document the addition of ATmega128RFA1.
|
||||||
|
* doc/avrdude.texi: (Ditto.)
|
||||||
|
|
|
@ -0,0 +1,354 @@
|
||||||
|
2010-12-17 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avrdude.conf.in (ATmega128RFA1): Bump two timing values in order to
|
||||||
|
improve ISP programming stability, in particular with the STK600.
|
||||||
|
|
||||||
|
2010-12-14 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* stk500v2.c (stk500v2_command): Detect warning status codes.
|
||||||
|
|
||||||
|
2010-10-22 Nils Springob <nils@nicai-systems.de>
|
||||||
|
|
||||||
|
* serial.h: serial_open() calls will now return -1 on error (no call to exit())
|
||||||
|
* buspirate.c: (Dito.)
|
||||||
|
* jtagmkII.c: (Dito.)
|
||||||
|
* butterfly.c: (Dito.)
|
||||||
|
* jtagmkI.c: (Dito.)
|
||||||
|
* arduino.c: (Dito.)
|
||||||
|
* avr910.c: (Dito.)
|
||||||
|
* stk500.c: (Dito.)
|
||||||
|
* ser_avrdoper.c: (Dito.)
|
||||||
|
* stk500v2.c: (Dito.)
|
||||||
|
* ser_posix.c: (Dito.)
|
||||||
|
* usb_libusb.c: (Dito.)
|
||||||
|
|
||||||
|
2010-07-27 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #30566: MinGW + Ubuntu 9.04
|
||||||
|
* stk500v2.c (stk500v2_open): use same condition to refer to the AVR
|
||||||
|
Doper support as used in the definition in ser_avrdoper.c.
|
||||||
|
(Thanks to Christian Starkjohann for the analysis of the problem.)
|
||||||
|
|
||||||
|
2010-07-19 Michal Ludvig <mludvig@logix.net.nz>
|
||||||
|
|
||||||
|
* buspirate.c: Added compatibility with BusPirate "NewUI" firmware 5.x
|
||||||
|
(contributed by Kari Knuuttila)
|
||||||
|
|
||||||
|
2010-07-12 Nils Springob <nils@nicai-systems.de>
|
||||||
|
|
||||||
|
* avrdude.conf.in (atmega88p): New device.
|
||||||
|
|
||||||
|
2010-06-03 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #29913: 246 Byte Bug - AVRdude crashes
|
||||||
|
doc/avrdude.texi (Troubleshooting): Mention the libusb 0.1 API
|
||||||
|
wrapper issue that is present in some Linux versions.
|
||||||
|
|
||||||
|
2010-03-19 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #29263: Can't build avrdude on windows using latest cygwin 1.7.1
|
||||||
|
* doc/avrdude.texi: Remove the recommendation for building
|
||||||
|
Win32 binaries under Cygwin; mention MinGW as an alternative
|
||||||
|
environment.
|
||||||
|
|
||||||
|
2010-03-08 Michal Ludvig <mludvig@logix.net.nz>
|
||||||
|
|
||||||
|
* ser_posix.c(ser_set_dtr_rts): Fixed DTR on/off to make
|
||||||
|
Arduino auto-reset work. (bug #29108, patch #7100)
|
||||||
|
|
||||||
|
2010-03-05 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* buspirate.c: Replace printf() by fprintf(stderr)
|
||||||
|
* safemode.c: (Dito.)
|
||||||
|
* usbtiny.c: (Dito.)
|
||||||
|
|
||||||
|
2010-01-22 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Cleanup Cygwin builds.
|
||||||
|
* windows/Makefile.am (loaddrv_LDFLAGS): remove, the -mno-cygwin
|
||||||
|
flag is supposed to be set in CFLAGS by ./configure
|
||||||
|
* configure.ac: add a check for the presence of usleep(), add a
|
||||||
|
check whether the linker accepts -static
|
||||||
|
* avrdude.h: protect prototype for usleep by !defined(HAVE_USLEEP)
|
||||||
|
* ppwin.c (usleep): protect by !defined(HAVE_USLEEP)
|
||||||
|
* main.c: silence "array subscript of type char" compiler warnings
|
||||||
|
by casting all arguments to tolower()/toupper() and isspace()/
|
||||||
|
isdigit()/ispunct() to "int"
|
||||||
|
* butterfly.c: (Dito.)
|
||||||
|
* avr910.c: (Dito.)
|
||||||
|
|
||||||
|
2010-01-19 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac: Bump for post-5.10.
|
||||||
|
|
||||||
|
2010-01-19 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac: Released version 5.10.
|
||||||
|
|
||||||
|
2010-01-19 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #28677: Cygwin's GCC no longer supports -mno-cygwin option
|
||||||
|
* configure.ac: For Win32 environments, add a check whether the
|
||||||
|
compiler understands the -mno-cygwin option. If not, don't use
|
||||||
|
it but suggest using a different compiler.
|
||||||
|
|
||||||
|
2010-01-18 David Hoerl <dhoerl@mac.com>
|
||||||
|
|
||||||
|
bug #28660: Problem with loading intel hex rom files that exceed
|
||||||
|
0x10000 bytes
|
||||||
|
* fileio.c: Fix two byte shifts.
|
||||||
|
|
||||||
|
2010-01-15 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Michael biebl:
|
||||||
|
* configure.ac: Fix FreeBSD default serial port name.
|
||||||
|
* doc/avrdude.texi: (Dito.)
|
||||||
|
|
||||||
|
2010-01-15 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* jtagmkII.c: If entering JTAG mode fails with a bad JTAG ID
|
||||||
|
message, retry with external reset applied (in case the target
|
||||||
|
is in sleep mode or has asserted the JTD bit).
|
||||||
|
|
||||||
|
2010-01-15 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Aurelien Jarno:
|
||||||
|
* configure.ac: Fix build for GNU/kFreeBSD.
|
||||||
|
* ppi.c: (Dito.)
|
||||||
|
* par.c: (Dito.)
|
||||||
|
|
||||||
|
2010-01-15 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac: Bump version for post-5.8.
|
||||||
|
|
||||||
|
2010-01-15 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac: Bump version for release 5.8.
|
||||||
|
|
||||||
|
2010-01-15 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Soren Jorvang:
|
||||||
|
bug #28611: -i delay not being applied to all serial port
|
||||||
|
bit banging state transitions
|
||||||
|
* serbb_win32.c: Apply ispdelay everywhere.
|
||||||
|
* serbb_posix.c: (Dito.)
|
||||||
|
|
||||||
|
2010-01-15 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* stk500v2_private.h: Implement TPI mode for AVRISPmkII/STK600
|
||||||
|
* config_gram.y: (Dito.)
|
||||||
|
* avrpart.h: (Dito.)
|
||||||
|
* stk500v2.c: (Dito.)
|
||||||
|
* main.c: (Dito.)
|
||||||
|
* lexer.l: (Dito.)
|
||||||
|
* avrdude.conf.in: Add ATtiny4/5/9/10
|
||||||
|
* avrdude.1: Document TPI and new device support.
|
||||||
|
* doc/avrdude.texi: (Dito.)
|
||||||
|
|
||||||
|
2010-01-14 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by clint fisher:
|
||||||
|
patch #7038: Adding Atmega32U4 Device to avrdude.conf.in
|
||||||
|
* avrdude.conf.in (atmega32u4): New device.
|
||||||
|
* avrdude.1: Document the new device support.
|
||||||
|
* doc/avrdude.texi: (Dito.)
|
||||||
|
|
||||||
|
2010-01-14 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Thomas Pircher:
|
||||||
|
patch #6927: Documentation patches
|
||||||
|
* doc/avrdude.texi: Fix various typos, and remove the last
|
||||||
|
remnants of obsoleted options -i/-o/-m/-f.
|
||||||
|
* avrdude.1: Merge typo fixes from avrdude.texi where
|
||||||
|
applicable.
|
||||||
|
|
||||||
|
2010-01-14 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avrdude.1: Update documentation to match the reality (device
|
||||||
|
support, memory areas).
|
||||||
|
* doc/avrdude.texi: Update documentation to match the
|
||||||
|
reality (device support, programmer support, memory areas).
|
||||||
|
Merge buspirate-specific comments from avrdude.1.
|
||||||
|
* jtagmkII.c: Add some firmware feature checks.
|
||||||
|
|
||||||
|
2010-01-13 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* jtagmkII.c: Implement PDI mode support for the JTAG ICE mkII
|
||||||
|
and the AVR Dragon.
|
||||||
|
* jtagmkII.h: (Dito.)
|
||||||
|
* config_gram.y: (Dito.)
|
||||||
|
* jtagmkII_private.h: (Dito.)
|
||||||
|
* avrdude.conf.in: (Dito.)
|
||||||
|
* lexer.l: (Dito.)
|
||||||
|
|
||||||
|
2010-01-13 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* stk500v2.c: Update STK600 routing and socket card data from XML
|
||||||
|
file.
|
||||||
|
|
||||||
|
2010-01-13 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* stk500v2.c: Cleanup the open/close handling to avoid accessing
|
||||||
|
unallocated memory (in the atexit handler) in case of bailing out.
|
||||||
|
* main.c: (Ditto.)
|
||||||
|
|
||||||
|
2010-01-13 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* jtagmkII.c: Stylistic changes: move #defines out into
|
||||||
|
jtagmkII_private.h, drop all #if 0 blocks, fold overly long lines,
|
||||||
|
move the *_initpgm() functions to the end of the file; while being
|
||||||
|
here, remove all trailing whitespace.
|
||||||
|
* jtagmkII_private.h: move AVR32 #defines here.
|
||||||
|
|
||||||
|
2010-01-12 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* bootstrap: autoconf 2.62 works well.
|
||||||
|
|
||||||
|
2010-01-12 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Various fixes for Xmega devices.
|
||||||
|
* avrdude.conf.in: Correctly declare EEPROM page sizes for
|
||||||
|
all Xmega devices (0x20 instead of 0x100).
|
||||||
|
* avr.c: If a memory region has a page size declared, try
|
||||||
|
using the paged IO routines regardless of the target memory
|
||||||
|
name. Xmega EEPROM requires to be written in paged mode.
|
||||||
|
Correctly use a long (rather than unsigned long) variable to
|
||||||
|
evaluate the success status of the paged mode write attempt.
|
||||||
|
* stk500v2.c: Don't apply TIF space offsets twice (bug #27995:
|
||||||
|
AVRDUDE 5.8svn fails to program and read XMEGA); use
|
||||||
|
stk500v2_loadaddr() prior to paged mode (EEPROM and flash) writes,
|
||||||
|
otherwise programming of flash areas will fail; while being there,
|
||||||
|
check the return value of stk500v2_loadaddr() everywhere; use the
|
||||||
|
correct write/erase mode bits (same as AVR Studio does).
|
||||||
|
|
||||||
|
2010-01-12 Michal Ludvig <mludvig@logix.net.nz>
|
||||||
|
|
||||||
|
* buspirate.c: Initialise firmware version to v0.0
|
||||||
|
prior to parsing the buspirate banner.
|
||||||
|
|
||||||
|
2010-01-11 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Clean-up the Xmega erase functions.
|
||||||
|
* jtagmkII_private.h: Add CMND_XMEGA_ERASE as well as
|
||||||
|
the various XMEGA_ERASE_* definitions (from updated
|
||||||
|
appnote AVR067)
|
||||||
|
* jtagmkII.c (jtagmkII_chip_erase): Correctly implement Xmega chip
|
||||||
|
erase based on CMND_XMEGA_ERASE. After erasing an Xmega part, do
|
||||||
|
*not* reinitialize the world, as a subsequent programming
|
||||||
|
operation will fail (for unknown reasons). Actually, this was
|
||||||
|
really only required for ancient AVRs, but doesn't hurt on mega
|
||||||
|
and tiny devices.
|
||||||
|
* jtagmkII.c (jtagmkII_pre_write): Remove, this turned out
|
||||||
|
to be just a chip erase.
|
||||||
|
* jtagmkII.c (jtagmkII_program_disable): Don't try reading
|
||||||
|
"hfuse" for Xmega parts; they don't have it.
|
||||||
|
* main.c (main): Re-enable auto-erase. It's been done
|
||||||
|
before (as "jtagmkII_pre_write") in jtagmkII_paged_write()
|
||||||
|
anyway. Xmega boot and application flash areas should be
|
||||||
|
handled separately in the future, so auto_erase can only
|
||||||
|
affect the area just being programmed.
|
||||||
|
|
||||||
|
2010-01-11 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* main.c (main): disable safemode for Xmega parts.
|
||||||
|
|
||||||
|
2010-01-12 Michal Ludvig <mludvig@logix.net.nz>
|
||||||
|
|
||||||
|
* buspirate.c: If the BusPirate doesn't respond
|
||||||
|
to a standard a reset command assume it was in binmode
|
||||||
|
and attempt to exit to text mode first.
|
||||||
|
|
||||||
|
2010-01-08 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* bitbang.c: Fix Win32 build error: move freq up to the file
|
||||||
|
level.
|
||||||
|
* buspirate.c: Fix Win32 build warning: include <malloc.h> to
|
||||||
|
to get a declaration for alloca().
|
||||||
|
|
||||||
|
2010-01-08 Thomas Fischl <tfischl@gmx.de>
|
||||||
|
|
||||||
|
bug #28520: Programming with USBasp with low clock speed fails
|
||||||
|
* usbasp.c: Change blocksize depending on sck frequency to
|
||||||
|
avoid usb transmition timeouts.
|
||||||
|
|
||||||
|
2010-01-08 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #27505: serbb_posix does not cope with inverted pins
|
||||||
|
* serbb_posix (serbb_highpulsepin): apply PIN_MASK when
|
||||||
|
checking pin numbers.
|
||||||
|
* serbb_win32 (serbb_highpulsepin): (Dito.)
|
||||||
|
|
||||||
|
2010-01-08 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #28516: Linux/Dragon: Error message on exit
|
||||||
|
* stk500v2.c: Fix the "bad response to GO command:
|
||||||
|
RSP_ILLEGAL_EMULATOR_MODE" message. jtagmkII_close()
|
||||||
|
has been called with the wrong pgm->cookie. Wrap it
|
||||||
|
inside stk500v2_jtagmkII_close(), adjusting the cookie
|
||||||
|
data appropriately.
|
||||||
|
|
||||||
|
2010-01-08 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Doug:
|
||||||
|
patch #7010: Win32 enhanced bitbang_delay
|
||||||
|
* bitbang.c (bitbang_calibrate_delay, bitbang_delay): On Win32,
|
||||||
|
use the high-resolution performance counter rather than the
|
||||||
|
uneducated delay loop guess if it is available on the target
|
||||||
|
hardware.
|
||||||
|
|
||||||
|
2010-01-08 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Gerard:
|
||||||
|
patch #6828: Using arbitrary BAUD rates
|
||||||
|
* ser_posix.c (serial_baud_lookup): Allow non-standard baud
|
||||||
|
rates.
|
||||||
|
* ser_win32.c (serial_baud_lookup): (Dito.)
|
||||||
|
|
||||||
|
2010-01-07 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Eric Trein:
|
||||||
|
bug #27596: AT90s2333 is not correctly supported in avrdude.conf
|
||||||
|
* avrdude.conf.in (at90s2333): add various STK500v2 parameters.
|
||||||
|
|
||||||
|
2010-01-07 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Gyorgy Szekely:
|
||||||
|
bug #28458: Buffer line is incorrectly released for PP programmers
|
||||||
|
* par.c (par_close): use par_setmany() rather than par_setpin()
|
||||||
|
for PPI_AVR_BUFF.
|
||||||
|
|
||||||
|
2010-01-07 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Lukasz Goralczyk:
|
||||||
|
bug #27507: SIGSEGV when using avrdragon (avrdude 5.8)
|
||||||
|
* stk500v2.c (stk500v2_dragon_isp_initpgm): Use
|
||||||
|
stk500v2_jtagmkII_setup/stk500v2_jtagmkII_rather than their
|
||||||
|
jtagII counterparts, to get the private data properly
|
||||||
|
initialized.
|
||||||
|
|
||||||
|
2010-01-07 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* buspirate.c: Cosmetics: remove UTF-8 dashes, adjust for 8-column
|
||||||
|
hard tabs.
|
||||||
|
|
||||||
|
2010-01-07 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* buspirate.c: add $ Id $ line.
|
||||||
|
* buspirate.h: add $ Id $ line.
|
||||||
|
|
||||||
|
2010-01-07 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Fix a few warnings that came up recently (some of them only triggered
|
||||||
|
by recent GCC versions).
|
||||||
|
* config_gram.y (parse_cmdbits): "brkt possibly used uninitialized"
|
||||||
|
(GCC errs here)
|
||||||
|
* jtagmkII.c (jtagmkII_reset32): "status possibly used uninitialized"
|
||||||
|
(I think GCC errs, too)
|
||||||
|
* buspirate.c: "pointers differ in signedness" (mismatch between
|
||||||
|
string processing and the use of "unsigned char" throughought the
|
||||||
|
AVRDUDE API)
|
||||||
|
|
||||||
|
2010-01-01 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* jtagmkII.c (jtagmkII_smc_init32): replace sleep() by usleep() for
|
||||||
|
win32 compatibility.
|
|
@ -0,0 +1,489 @@
|
||||||
|
2011-12-30 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
* avrdude.conf.in: Added is_at90s1200 option to part description
|
||||||
|
* doc/avrdude.texi: Added missing options to part definition
|
||||||
|
* config_gram.y: Fixed resetting of is_at90s1200 and is_avr32 flags
|
||||||
|
|
||||||
|
2011-12-30 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
patch #7693: Fix config file atmel URLs
|
||||||
|
* avrdude.conf.in: Updated URLs
|
||||||
|
* avrpart.h: Updated URLs
|
||||||
|
* doc/avrdude.texi: Updated URLs
|
||||||
|
|
||||||
|
2011-12-30 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* ser_posix.c (baud_lookup_table): Conditionalize the inclusion of
|
||||||
|
non-standard baud rates (only baud rates up to B38400 are
|
||||||
|
standardized by the Single UNIX Specification).
|
||||||
|
|
||||||
|
2011-12-29 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
bug #34302: Feature request : device configuration with parent classes
|
||||||
|
* config_gram.y: Added part parent rule and allow overwriting existing
|
||||||
|
data at several places
|
||||||
|
* avrdude.conf.in: Added description comment and m328/m328p as example
|
||||||
|
* avrpart.c: avr_dup_mem-functions now copy buf and tags memory block
|
||||||
|
only they are already allocated.
|
||||||
|
* lexer.l: Added parent as valid token
|
||||||
|
|
||||||
|
(not in original patch)
|
||||||
|
* avrpart.c: New function avr_dup_opcode. avr_dup_mem/avr_dup_part-
|
||||||
|
functions now duplicate the opcodes in their op-array to avoid memory leaks.
|
||||||
|
* doc/avrdude.texi: Added description of part parent feature
|
||||||
|
|
||||||
|
2011-12-29 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
patch #7687: Autogenerating programmers and parts lists for docs
|
||||||
|
(generating the parts lists, programmers lists follows later)
|
||||||
|
* doc/Makefile.am: Add rule how to create avrdude before generating parts list
|
||||||
|
|
||||||
|
2011-12-29 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
patch #7687: Autogenerating programmers and parts lists for docs
|
||||||
|
(generating the parts lists, programmers lists follows later)
|
||||||
|
* doc/avrdude.texi: Add include of generated table of parts
|
||||||
|
* doc/Makefile.am: Add generating of table of parts in parts.texi
|
||||||
|
* doc/parts_comments.txt: Adding file containing part commenz references
|
||||||
|
* avrdude.1: Remove table of parts and mention "-p ?" option
|
||||||
|
* avrpart.c: Use AVR_DESCLEN for strncasecmp at list sorting
|
||||||
|
|
||||||
|
2011-12-22 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
* configure.ac: Add writing of definition of confsubst to config.status,
|
||||||
|
so it can run alone, not only called by configure.
|
||||||
|
|
||||||
|
2011-12-17 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
patch #7680: Fixing timeout problem in ser_recv in ser_win32.c
|
||||||
|
* ser_win32.c: Return -1 at timeout in ser_recv().
|
||||||
|
|
||||||
|
2011-12-17 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
* config_gram.y: Fixed another memory leak, when define an operation
|
||||||
|
more than once
|
||||||
|
* avrdude.conf.in: Fixed double definition at ATmega6490
|
||||||
|
|
||||||
|
2011-12-17 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
* config_gram.y: Restructuring and compacting programmer definition
|
||||||
|
part of grammar (in preparation of patch #7688)
|
||||||
|
|
||||||
|
2011-12-17 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
* avrdude.conf.in: Update documentation of programmer definition
|
||||||
|
* doc/avrdude.texi: Update documentation of programmer definition
|
||||||
|
and add list of implemented programmer types
|
||||||
|
|
||||||
|
2011-12-17 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
patch #7667: Minor memory handling fixes
|
||||||
|
* config_gram.y: Added several free_token() calls.
|
||||||
|
|
||||||
|
2011-12-16 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
patch #7671: Sorting programmers and parts lists for console output
|
||||||
|
* avrdude.conf.in: change part desc of several parts to common pattern
|
||||||
|
AT(mega|tiny|xmega)[0-9]+[A-Z]* (Upper case AT, lower case in middle)
|
||||||
|
* list.[ch]: added sorting function lsort()
|
||||||
|
* pgm.[ch]: added function sort_programmers()
|
||||||
|
* avrpart.[ch]: added function sort_avrparts()
|
||||||
|
* main.c: use sort functions in list_programmers() and list_parts()
|
||||||
|
* main.c: list functions show config file info only at verbose mode
|
||||||
|
|
||||||
|
2011-10-19 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac: Replace "cvs" in version number by "svn".
|
||||||
|
|
||||||
|
2011-10-10 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #34518: loading intel hex files > 64k using record-type 4
|
||||||
|
(Extended Linear Address Record)
|
||||||
|
fileio.c: Replace the change from r928 (handling of 0x8000000
|
||||||
|
offset in AVR32 files) by a completely different logic that no
|
||||||
|
longer breaks hex files for other devices starting with an
|
||||||
|
offset; also apply a similar change to S-record files, as well
|
||||||
|
as when writing files.
|
||||||
|
fileio.c: (Ditto.)
|
||||||
|
|
||||||
|
2011-09-15 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avrftdi.c: Remove stray printf()s by fprintf(stderr)
|
||||||
|
* usbtiny.c: (Ditto.)
|
||||||
|
|
||||||
|
2011-09-15 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* main.c: Restrict the cyclecounter readout to those cases where
|
||||||
|
it has been explicitly requested (by -y or -Y), rather than always
|
||||||
|
attempting to read the last EEPROM bytes.
|
||||||
|
|
||||||
|
2011-09-15 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* stk500v2.c (stk600_xprog_paged_load, stk600_xprog_paged_write):
|
||||||
|
Fix regression in the AVRISPmkII/STK600 TPI handling introduced
|
||||||
|
by the USBasp's TPI implementation which added a pagesize even for
|
||||||
|
the minor memory regions of TPI devices. Also fix wrong offset
|
||||||
|
introduced by the memory tagging patch.
|
||||||
|
|
||||||
|
2011-09-15 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avr.c (avr_read, avr_write): Don't bail out on TPI parts if
|
||||||
|
their programmer doesn't provide a (low-level) cmd_tpi method;
|
||||||
|
instead, fall back to the normal programmer methods which are
|
||||||
|
supposed to handle the situation.
|
||||||
|
This fixes a regression where the recent bitbang-TPI implementation
|
||||||
|
broke TPI handling of STK600/AVRISPmkII.
|
||||||
|
|
||||||
|
2011-09-14 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Mega-commit to bring in memory tagging.
|
||||||
|
Each memory image byte is now tagged as it's being read from a file.
|
||||||
|
Only bytes read from a file will be written or verified (modulo page
|
||||||
|
granularity requirements).
|
||||||
|
* avrpart.h: Add memory tags.
|
||||||
|
* avrpart.c: Allocate and initialize tag area.
|
||||||
|
* update.h: Drop unused parameter "verify" from do_op().
|
||||||
|
* pgm.h: Add parameter base_addr to the paged_load and paged_write
|
||||||
|
methods, respectively.
|
||||||
|
* avr.h: New parameter to avr_read: second AVRPART to verify against.
|
||||||
|
* fileio.c: Track all memory regions that have been read from an
|
||||||
|
input file by tagging them.
|
||||||
|
* update.c: Call avr_read() with the new parameter list.
|
||||||
|
* main.c: Call avr_initmem() to initialize the memory regions, rather
|
||||||
|
than trying to duplicate an unitialized part, and then let the
|
||||||
|
original part rot away.
|
||||||
|
* avr.c: Implement the heart of the new featureset. For paged memory
|
||||||
|
areas, when writing or verifying, call the paged_write and paged_load
|
||||||
|
methods, respectively, once per page instead of on the entire memory.
|
||||||
|
When writing, only write bytes or pages that have content read from a
|
||||||
|
file. Whe verifying, only read memory bytes or pages where the
|
||||||
|
verification data have been read from a file. Only verify those bytes
|
||||||
|
that have been read from a file.
|
||||||
|
* avrftdi.c: Implement the new API for paged_load and paged_write,
|
||||||
|
respectively.
|
||||||
|
* jtagmkII.c: (Ditto.)
|
||||||
|
* butterfly.c: (Ditto.)
|
||||||
|
* jtagmkI.c: (Ditto.)
|
||||||
|
* avr910.c: (Ditto.)
|
||||||
|
* stk500.c: (Ditto.)
|
||||||
|
* usbasp.c: (Ditto.)
|
||||||
|
* stk500v2.c: (Ditto.)
|
||||||
|
* usbtiny.c: (Ditto.)
|
||||||
|
|
||||||
|
2011-09-13 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* stk500v2.c (stk500v2_command): Treat warnings as errors rather than
|
||||||
|
success.
|
||||||
|
|
||||||
|
2011-08-30 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #34027: avrdude AT90S1200 Problem (part 3 - documentation)
|
||||||
|
* avrdude.1: Document the programmer type restrictions for AT90S1200
|
||||||
|
devices.
|
||||||
|
* doc/avrdude.texi: (Ditto.)
|
||||||
|
|
||||||
|
2011-08-30 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #34027: avrdude AT90S1200 Problem (part 2 - stk500v2 and relatives)
|
||||||
|
* stk500v2.c (stk500v2_initialize): For the AT90S1200, release
|
||||||
|
/RESET for a moment before reinitializing, as this is required by
|
||||||
|
its programming protocol.
|
||||||
|
|
||||||
|
2011-08-30 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac: In AC_CHECK_LIB for libftdi, check for
|
||||||
|
ftdi_usb_get_strings() rathern than ftdi_init(), as this is a more
|
||||||
|
specific thing to search for in order to make sure getting a
|
||||||
|
recent enough libftdi.
|
||||||
|
|
||||||
|
2011-08-29 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #34027: avrdude AT90S1200 Problem (part 1 - bitbang
|
||||||
|
programmers)
|
||||||
|
* config_gram.y: Introduce new keyword "is_at90s1200".
|
||||||
|
* lexer.l: (Ditto.)
|
||||||
|
* avrdude.conf.in: Applew new keyword to the AT90S1200 device.
|
||||||
|
* avrpart.h: Introduce new flag AVRPART_IS_AT90S1200, reflecting
|
||||||
|
the is_at90s1200 configuration keyword.
|
||||||
|
* bitbang.c (bitbang_initialize): Replace existing test for
|
||||||
|
AT90S1200 by AVRPART_IS_AT90S1200
|
||||||
|
* avr.c (avr_write_byte_default): Avoid the pre-write reading for
|
||||||
|
the AT90S1200, as this appears to sometimes corrupt the high byte
|
||||||
|
by pre-programming the low byte just written into it.
|
||||||
|
|
||||||
|
2011-08-27 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac: Bump version for post-5.11.
|
||||||
|
|
||||||
|
2011-08-27 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac: Bump version for releasing AVRDUDE 5.11.
|
||||||
|
|
||||||
|
2011-08-26 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avrdude.1: Update the list of supported AVR devices.
|
||||||
|
* doc/avrdude.texi: (Ditto).
|
||||||
|
|
||||||
|
2011-08-26 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac: add -lusb as "other libraries" when checking
|
||||||
|
for libftdi.
|
||||||
|
|
||||||
|
2011-08-26 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Juergen Weigert:
|
||||||
|
patch #7056: adding support for mikrokopter bootloader to butterfly
|
||||||
|
* butterfly.c: Add some specific logic to handle the
|
||||||
|
mikrokopter.de butterfly bootloader.
|
||||||
|
* butterfly.h: Add one related function declaration.
|
||||||
|
* config_gram.y: Add butterfly_mk keyword.
|
||||||
|
* lexer.l: (Ditto.)
|
||||||
|
* avrdude.conf.in: Add entry for butterfly_mk.
|
||||||
|
|
||||||
|
2011-08-26 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Stefan Tomanek:
|
||||||
|
patch #7542: add default_bitclock to configuration files
|
||||||
|
* config.c: Add the new keyword and its handling.
|
||||||
|
* config.h: (Ditto.)
|
||||||
|
* config_gram.y: (Ditto.)
|
||||||
|
* avrdude.conf.in: (Ditto.)
|
||||||
|
* main.c: (Ditto.)
|
||||||
|
* lexer.l: (Ditto.)
|
||||||
|
* avrdude.1: Document the change.
|
||||||
|
* doc/avrdude.texi: (Ditto.)
|
||||||
|
|
||||||
|
2011-08-26 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Brett Hagman:
|
||||||
|
patch #7603: wiring - programmer type for Wiring boards
|
||||||
|
(based on STK500v2)
|
||||||
|
* wiring.c: New file.
|
||||||
|
* wiring.h: (Ditto.)
|
||||||
|
* Makefile.am: Add new files.
|
||||||
|
* stk500v2_private.h: Reorganize so some functions and struct
|
||||||
|
pdata are globally known.
|
||||||
|
* stk500v2.c: (Ditto.)
|
||||||
|
* stk500v2.h: (Ditto.)
|
||||||
|
* lexer.l: Add new programmer keywords.
|
||||||
|
* config_gram.y: (Ditto.)
|
||||||
|
* avrdude.conf.in: Add "wiring" programmer entry.
|
||||||
|
* avrdude.1: Document the new programmer.
|
||||||
|
* doc/avrdude.texi: (Ditto.)
|
||||||
|
* AUTHORS: Add Brett Hagman.
|
||||||
|
|
||||||
|
2011-08-26 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by an anonymous contributor on the mailinglist:
|
||||||
|
* avrdude.conf (jtagkey): Add a definition for the Amontec
|
||||||
|
JTAGKey
|
||||||
|
|
||||||
|
2011-08-26 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Juergen Weigert:
|
||||||
|
bug #22720: avrdude-5.5 ignores buff settings in avrdude.conf
|
||||||
|
(Note that the actual bug the subject is about has been fixed
|
||||||
|
long ago.)
|
||||||
|
* update.c (do_op): fix a diagnostic message
|
||||||
|
* pgm.h: add exit_datahigh field
|
||||||
|
* par.c: set and act upon the exit_datahigh field
|
||||||
|
* avrdude.1: document the new -E options
|
||||||
|
* doc/avrdude.texi: (Ditto.)
|
||||||
|
|
||||||
|
2011-08-26 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #33811: Parallel make fails
|
||||||
|
* Makefile.am (BUILT_SOURCES): Add this macro.
|
||||||
|
|
||||||
|
2011-08-26 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #33114: Segfault after setting the DWEN fuse with Dragon
|
||||||
|
* jtagII.c (jtagmkII_getsync): Instead of exit()ing from
|
||||||
|
deep within the tree when detecting the "need debugWIRE"
|
||||||
|
situation, properly pass this up as a return code.
|
||||||
|
* jtagII_private.h (JTAGII_GETSYNC_FAIL_GRACEFUL): New constant.
|
||||||
|
* stk500v2.c (stk500v2_jtagmkII_open): Don't tell anything
|
||||||
|
anymore when receiving a JTAGII_GETSYNC_FAIL_GRACEFUL from
|
||||||
|
jtagmkII_getsync(); silently give up (all necessary has been
|
||||||
|
said already).
|
||||||
|
|
||||||
|
2011-08-26 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Reported by Jason Hecker:
|
||||||
|
* usbasp.c (libusb_to_errno): Conditionalize some error codes
|
||||||
|
that apparently are lacking on MinGW.
|
||||||
|
|
||||||
|
2011-08-25 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Fix warnings.
|
||||||
|
* ser_avrdoper.c: add <stdlib.h> so exit() is declared.
|
||||||
|
* usbtiny.c (usbtiny_open): provide an initializer to a
|
||||||
|
"may be used uninitialized" variable (since GCC could not
|
||||||
|
fully detect the logic behind).
|
||||||
|
|
||||||
|
2011-08-25 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac: Add a check for FreeBSD's libusb-1.0
|
||||||
|
compatible library that is found in libusb.a/.so on
|
||||||
|
FreeBSD 8+.
|
||||||
|
|
||||||
|
2011-08-25 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Doug Springer, based on work by
|
||||||
|
Wolfgang Moser, Ville Voipio, Hannes Weisbach
|
||||||
|
patch #7486: Patch to add FT2232C/D, FT2232H, FT4232H,
|
||||||
|
usbvid, usbpid, usbdev for USB support - Based on #7062
|
||||||
|
* avrftdi.c: New file.
|
||||||
|
* avrftdi.h: (Ditto.)
|
||||||
|
* configure.ac: Add check for libftdi.
|
||||||
|
* config_gram.y: Add AVRFTDI and per-programmer USB string
|
||||||
|
keywords.
|
||||||
|
* lexer.l: (Ditto.)
|
||||||
|
* avrdude.conf.in: Add avrftdi and 2232HIO programmers.
|
||||||
|
* pgm.h: Add USB parameters.
|
||||||
|
* Makefile.am: Add avrftdi.c and avrftdi.h.
|
||||||
|
* AUTHORS: Mention the new authors.
|
||||||
|
* avrdude.1: Document the changes.
|
||||||
|
* doc/avrdude.texi: (Ditto.)
|
||||||
|
|
||||||
|
2011-08-23 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #29585: Fix license
|
||||||
|
* doc/avrdude.texi: Add FDL as an option to the licensing
|
||||||
|
statement, as the savannah administration would like it
|
||||||
|
that way.
|
||||||
|
|
||||||
|
2011-08-23 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Darell Tan:
|
||||||
|
patch #7244: TPI bitbang implementation
|
||||||
|
* bitbang.c: Add TPI bitbang stuff.
|
||||||
|
* bitbang.h: (Ditto.)
|
||||||
|
* avr.c: (Ditto.)
|
||||||
|
* avr.h: (Ditto.)
|
||||||
|
* pgm.c: (Ditto.)
|
||||||
|
* pgm.h: (Ditto.)
|
||||||
|
* serbb_posix.c: Wire bitbang_cmd_tpi into the struct pgm.
|
||||||
|
* serbb_win32.c: (Ditto.)
|
||||||
|
* par.c: (Ditto.)
|
||||||
|
* doc/avrdude.texi: Document the TPI bitbang support.
|
||||||
|
|
||||||
|
2011-08-17 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Grygoriy Fuchedzhy:
|
||||||
|
bug #31779: Add support for addressing usbtinyisp with -P option
|
||||||
|
* usbtiny.c (usbtiny_open): Add logic to distinguish multiple USBtinyISP
|
||||||
|
programmers by their bus:device tuple.
|
||||||
|
* doc/avrdude.texi: Document the new functionality.
|
||||||
|
* avrdude.1: (Ditto.)
|
||||||
|
|
||||||
|
2011-08-16 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Timon Van Overveldt:
|
||||||
|
bug #30268: Debugwire broken in avrdude-5.10
|
||||||
|
* jtagmkII.c (jtagmkII_initialize): only try setting up a JTAG chain when
|
||||||
|
the programmer is using JTAG.
|
||||||
|
|
||||||
|
2011-08-16 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #29636: AVRDude issues invalid CMD_CHECK_TARGET_CONNECTION
|
||||||
|
on the AVRISP-MKII
|
||||||
|
* stk500v2.c (stk500v2_program_enable): Rewrite the logic to
|
||||||
|
explain ISP activation failures.
|
||||||
|
* stk500v2_private.h: Fix the various STATUS_* constants;
|
||||||
|
AVR069 and AVR079 disagreed in their values, even though they
|
||||||
|
are apparently implementing the same logic behind.
|
||||||
|
|
||||||
|
2011-08-16 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #29650: Programming timeouts in ATmega128RFA1 are too slow
|
||||||
|
* avrdude.conf.in (ATmega128RFA1): Bump write delay values for flash and
|
||||||
|
EEPROM to 50 ms.
|
||||||
|
|
||||||
|
2011-08-16 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avrdude.conf.in (ATmega8515, ATmega8535, ATmega48, ATmega88, ATmega88P,
|
||||||
|
ATtiny88, ATmega168, ATmega168P, ATmega328P): Bump delay value for STK500v2
|
||||||
|
EEPROM write operation to 5, according to the respective XML files.
|
||||||
|
|
||||||
|
2011-08-16 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Darcy Houlahan:
|
||||||
|
bug #29694: error in avrdude.conf for attiny84 eeprom
|
||||||
|
* avrdude.conf.in (ATtiny84, ATtiny85): fix A7 bit in EEPROM write
|
||||||
|
command.
|
||||||
|
|
||||||
|
2011-08-16 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Durant Gilles:
|
||||||
|
* avrdude.conf.in (ATtiny4313): Fix flash addressing bits for manual ISP
|
||||||
|
algorithm.
|
||||||
|
|
||||||
|
2011-08-16 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Philip:
|
||||||
|
bug #31386: A "BUILD.svn" or similar "how to get started" doc would be helpful
|
||||||
|
* BUILD-FROM-SVN: New file.
|
||||||
|
|
||||||
|
2011-08-15 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Nic Jones:
|
||||||
|
bug #32539: [Documentation][Patch] Man page is misleading
|
||||||
|
re: Dragon & PDI
|
||||||
|
* doc/avrdude.texi: Update information about PDI connections
|
||||||
|
on AVR Dragon
|
||||||
|
|
||||||
|
2011-08-12 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* usbasp.c: Add <stdint.h> so this actually compiles
|
||||||
|
again.
|
||||||
|
|
||||||
|
2011-08-12 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Contributed by tixiv@gmx.net:
|
||||||
|
bug #33345: File auto detection as binary doesn't open
|
||||||
|
file in binary mode on Windows
|
||||||
|
* fileio.c: Move the decision about opening files in
|
||||||
|
binary mode until before the fopen() call.
|
||||||
|
|
||||||
|
2011-06-16 Thomas Fischl <tfischl@gmx.de>
|
||||||
|
|
||||||
|
* avrdude.conf.in: Fix part id of ATtiny9.
|
||||||
|
|
||||||
|
2011-05-28 Thomas Fischl <tfischl@gmx.de>
|
||||||
|
|
||||||
|
Based on patch #7440 commited by Slawomir Fraś:
|
||||||
|
* usbasp.c: added TPI support for USBasp
|
||||||
|
* usbasp.h: (Ditto.)
|
||||||
|
|
||||||
|
2011-05-11 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avrdude.conf.in: Add support for ATmega168P.
|
||||||
|
|
||||||
|
2011-05-11 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avrdude.conf.in: Fix abbreviated name for ATmega324PA.
|
||||||
|
|
||||||
|
2011-05-11 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Lech Perczak:
|
||||||
|
bug #30946: Added support for ATmega8/16/32U2
|
||||||
|
* avrdude.conf.in: Add ATmega8/16/32U2 entries.
|
||||||
|
|
||||||
|
2011-05-11 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by David A Lyons:
|
||||||
|
patch #7393: Adding ATtiny4313 Device to avrdude.conf.in
|
||||||
|
* avrdude.conf.in: Add ATtiny4313 data.
|
||||||
|
|
||||||
|
2011-05-11 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* usb_libusb.c: Bump timeout values to allow for slow clock
|
||||||
|
speeds.
|
||||||
|
* jtagmkII.c: (Ditto.)
|
||||||
|
|
||||||
|
2011-03-04 Eric B. Weddington <eric.weddington@atmel.com>
|
||||||
|
|
||||||
|
Thanks to Vitaly Chernookiy for the patch.
|
||||||
|
* avrdude.conf.in: Add support for atmega324pa.
|
||||||
|
* ChangeLog-2010: New file, rotate ChangeLog for new year.
|
|
@ -0,0 +1,729 @@
|
||||||
|
2012-12-18 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* usbdefs.h (USBDEV_BULK_EP_WRITE_STK600)
|
||||||
|
(USBDEV_BULK_EP_READ_STK600): new define values
|
||||||
|
* stk500v2.c (stk600_open): use the STK600 EP values,
|
||||||
|
as they are different from AVRISPmkII
|
||||||
|
|
||||||
|
2012-12-18 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #37942: Latest SVN can't program in dragon_jtag mode
|
||||||
|
* jtagmkII.c (jtagmkII_initialize): For Xmega devices, and
|
||||||
|
firmware >= 7.x, don't trigger a RESET, in order to work around a
|
||||||
|
firmware bug that appears to be present in at least firmware 7.24
|
||||||
|
for the Dragon.
|
||||||
|
|
||||||
|
2012-12-04 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* config_gram.y: Implement the "ocdrev" keyword
|
||||||
|
* avrpart.c: (Dito)
|
||||||
|
* avrpart.h: (Dito)
|
||||||
|
* lexer.l: (Dito)
|
||||||
|
* avrdude.conf.in: Add "ocdrev" key/value pairs, based
|
||||||
|
on the AS6 XML file information.
|
||||||
|
* jtag3.c: Use the ocdrev in the parameter block.
|
||||||
|
|
||||||
|
2012-12-03 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* jtag3.c: Make jtag3_command() public
|
||||||
|
* jtag3.h: (Dito.)
|
||||||
|
* jtag3_private.h: Add two new commands
|
||||||
|
* stk500v2.c: Implement the "MonCon disable" hack that
|
||||||
|
allows temporarily falling back to ISP when trying to
|
||||||
|
talk to a part that has debugWIRE enabled
|
||||||
|
|
||||||
|
2012-12-03 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
* pickit2.c: reordered #includes for non-usb configuration
|
||||||
|
|
||||||
|
2012-12-03 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* jtag3.c: Enable interactive adjustment of the various
|
||||||
|
clock frequencies (JTAG Xmega, JTAG megaAVR, PDI Xmega)
|
||||||
|
through the set_sck_period() callback.
|
||||||
|
|
||||||
|
2012-12-03 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* jtag3.c: Remove unused code that was left over from
|
||||||
|
cloning the jtagmkII.c implementation
|
||||||
|
|
||||||
|
2012-12-03 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* pgm_type.c: Add "jtagice3_isp" programmer hook
|
||||||
|
* avrdude.conf.in: Add "jtag3isp" programmer
|
||||||
|
* jtag3.c: jtag3_setparm() is now public
|
||||||
|
* jtag3.h: (Dito)
|
||||||
|
* stk500v2_private.h: Command 0x1D is CMD_SPI_MULTI only
|
||||||
|
for STK500v2, AVRISPmkII, and JTAGICEmkII; for JTAGICE3,
|
||||||
|
it's CMD_SET_SCK now; also add CMD_GET_SCK
|
||||||
|
* avrpart.c (avr_get_output_index): New function
|
||||||
|
* avrpart.h: (Dito)
|
||||||
|
* stk500v2.c: Implement the pasthrough programmer glue logic
|
||||||
|
for JTAGICE3 in ISP mode
|
||||||
|
* stk500v2.h: (Dito)
|
||||||
|
* avrdude.1: Document the JTAGICE3 support.
|
||||||
|
|
||||||
|
2012-11-30 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* jtag3.c (jtag3_read_byte, jtag3_write_byte): Remove the
|
||||||
|
m->offset from addr, JTAGICE3 doesn't need it anymore (similar
|
||||||
|
to JTAGICEmkII with 7+ firmware)
|
||||||
|
* jtag3.c (jtag3_read_byte): Allow for full-page reads of
|
||||||
|
EEPROM also for Xmega and debugWIRE, allow for signature
|
||||||
|
read in debugWIRE
|
||||||
|
|
||||||
|
2012-11-30 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* jtag3_private.h: Add two more error detail codes I stumbled
|
||||||
|
across during development
|
||||||
|
* jtag3.c: (Dito.)
|
||||||
|
* usb_libusb.c: Reduce timeouts from 100 to 10 s, still long
|
||||||
|
enough, but not getting cold feet when something goes wrong.
|
||||||
|
|
||||||
|
2012-11-29 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* jtag3.c: Handle events returned by the ICE
|
||||||
|
* usbdevs.h: Add defines that mark an event in return
|
||||||
|
from usb_recv_frame().
|
||||||
|
* usb_libusb.c: (Dito.)
|
||||||
|
|
||||||
|
2012-11-29 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avrdude.conf.in: Remove "has_jtag" from Xmega A4 and D4
|
||||||
|
devices, as they only have PDI.
|
||||||
|
* jtag3.c (jtag3_page_erase): Actually implement this.
|
||||||
|
|
||||||
|
2012-11-29 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #37265: wrong page sizes for XMega64xx in avrdude.conf
|
||||||
|
* avrdude.conf.in: Fix page sizes for all Xmega devices,
|
||||||
|
by cross-checking against Atmel Studio's device XML files
|
||||||
|
|
||||||
|
2012-11-29 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* jtag3.c: Fill in the missing pieces for Xmega support (both,
|
||||||
|
PDI and JTAG).
|
||||||
|
* jtagmkII.c (jtagmkII_set_xmega_params): Use "fuse1" rather
|
||||||
|
than "fuse0" memory space to fill in the NVM offset from, as
|
||||||
|
there is no "fuse0" on some Xmega devices.
|
||||||
|
|
||||||
|
2012-11-29 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avrdude.conf.in (ATmega256RFR2, ATmega128RFR2, ATmega64RFR2):
|
||||||
|
New devices
|
||||||
|
|
||||||
|
2012-11-28 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
First support for Atmel JTAGICE3. Guessed from USB sniffer
|
||||||
|
traces made by Knut Schwichtenberg, and by similarity to
|
||||||
|
JTAGICEmkII.
|
||||||
|
Still quite incomplete, just megaAVR/JTAG is done by now.
|
||||||
|
* jtag3.c: New file.
|
||||||
|
* jtag3.h: (Dito.)
|
||||||
|
* jtag3_private.h: (Dito.)
|
||||||
|
* pgm_type.c: Add new programmers
|
||||||
|
* avrdude.conf.in: (Dito.)
|
||||||
|
* usbdevs.h: Add new parameters
|
||||||
|
* Makefile.am: Add new files
|
||||||
|
* usb_libusb.c: Handle separate event endpoint, and larger
|
||||||
|
(USB 2.0) packet sizes
|
||||||
|
|
||||||
|
2012-11-26 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* jtagmkII.c: Change all the USB details (endpoint numbers,
|
||||||
|
max transfer size etc.) to a per-programmer adjustable value.
|
||||||
|
* serial.h: (Dito.)
|
||||||
|
* stk500v2.c: (Dito.)
|
||||||
|
* usbdevs.h: (Dito.)
|
||||||
|
* usb_libusb.c: (Dito.)
|
||||||
|
|
||||||
|
2012-11-20 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* buspirate.c: Replace outdated FSF postal address by a reference to
|
||||||
|
the GPL info on their website.
|
||||||
|
* jtagmkII.c: (Dito.)
|
||||||
|
* avrftdi.c: (Dito.)
|
||||||
|
* wiring.c: (Dito.)
|
||||||
|
* linux_ppdev.h: (Dito.)
|
||||||
|
* serbb.h: (Dito.)
|
||||||
|
* usbtiny.h: (Dito.)
|
||||||
|
* confwin.c: (Dito.)
|
||||||
|
* buspirate.h: (Dito.)
|
||||||
|
* avrftdi.h: (Dito.)
|
||||||
|
* wiring.h: (Dito.)
|
||||||
|
* jtagmkII.h: (Dito.)
|
||||||
|
* pickit2.c: (Dito.)
|
||||||
|
* config.c: (Dito.)
|
||||||
|
* term.c: (Dito.)
|
||||||
|
* confwin.h: (Dito.)
|
||||||
|
* avrdude.1: (Dito.)
|
||||||
|
* windows/Makefile.am: (Dito.)
|
||||||
|
* config.h: (Dito.)
|
||||||
|
* pickit2.h: (Dito.)
|
||||||
|
* term.h: (Dito.)
|
||||||
|
* tools/get-hv-params.xsl: (Dito.)
|
||||||
|
* tools/get-stk600-cards.xsl: (Dito.)
|
||||||
|
* tools/get-stk600-devices.xsl: (Dito.)
|
||||||
|
* tools/get-dw-params.xsl: (Dito.)
|
||||||
|
* butterfly.c: (Dito.)
|
||||||
|
* configure.ac: (Dito.)
|
||||||
|
* doc/Makefile.am: (Dito.)
|
||||||
|
* pgm_type.c: (Dito.)
|
||||||
|
* butterfly.h: (Dito.)
|
||||||
|
* jtagmkI.c: (Dito.)
|
||||||
|
* ft245r.c: (Dito.)
|
||||||
|
* COPYING: (Dito.)
|
||||||
|
* pgm_type.h: (Dito.)
|
||||||
|
* jtagmkI.h: (Dito.)
|
||||||
|
* pindefs.h: (Dito.)
|
||||||
|
* config_gram.y: (Dito.)
|
||||||
|
* arduino.c: (Dito.)
|
||||||
|
* arduino.h: (Dito.)
|
||||||
|
* ser_win32.c: (Dito.)
|
||||||
|
* serbb_win32.c: (Dito.)
|
||||||
|
* avr910.c: (Dito.)
|
||||||
|
* stk500.c: (Dito.)
|
||||||
|
* freebsd_ppi.h: (Dito.)
|
||||||
|
* avr910.h: (Dito.)
|
||||||
|
* solaris_ecpp.h: (Dito.)
|
||||||
|
* stk500.h: (Dito.)
|
||||||
|
* jtagmkII_private.h: (Dito.)
|
||||||
|
* avrdude.h: (Dito.)
|
||||||
|
* bitbang.c: (Dito.)
|
||||||
|
* bitbang.h: (Dito.)
|
||||||
|
* avrpart.c: (Dito.)
|
||||||
|
* safemode.c: (Dito.)
|
||||||
|
* stk500generic.c: (Dito.)
|
||||||
|
* serial.h: (Dito.)
|
||||||
|
* avrpart.h: (Dito.)
|
||||||
|
* jtagmkI_private.h: (Dito.)
|
||||||
|
* ppi.c: (Dito.)
|
||||||
|
* avr.c: (Dito.)
|
||||||
|
* safemode.h: (Dito.)
|
||||||
|
* stk500generic.h: (Dito.)
|
||||||
|
* ser_avrdoper.c: (Dito.)
|
||||||
|
* avr.h: (Dito.)
|
||||||
|
* ppi.h: (Dito.)
|
||||||
|
* usbasp.c: (Dito.)
|
||||||
|
* lists.c: (Dito.)
|
||||||
|
* stk500v2.c: (Dito.)
|
||||||
|
* my_ddk_hidsdi.h: (Dito.)
|
||||||
|
* tpi.h: (Dito.)
|
||||||
|
* usbasp.h: (Dito.)
|
||||||
|
* lists.h: (Dito.)
|
||||||
|
* stk500v2.h: (Dito.)
|
||||||
|
* ppiwin.c: (Dito.)
|
||||||
|
* fileio.c: (Dito.)
|
||||||
|
* ser_posix.c: (Dito.)
|
||||||
|
* fileio.h: (Dito.)
|
||||||
|
* serbb_posix.c: (Dito.)
|
||||||
|
* usbdevs.h: (Dito.)
|
||||||
|
* par.c: (Dito.)
|
||||||
|
* update.c: (Dito.)
|
||||||
|
* pgm.c: (Dito.)
|
||||||
|
* main.c: (Dito.)
|
||||||
|
* par.h: (Dito.)
|
||||||
|
* update.h: (Dito.)
|
||||||
|
* lexer.l: (Dito.)
|
||||||
|
* Makefile.am: (Dito.)
|
||||||
|
* pgm.h: (Dito.)
|
||||||
|
* usb_libusb.c: (Dito.)
|
||||||
|
* usbtiny.c: (Dito.)
|
||||||
|
|
||||||
|
2012-11-13 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
bug #35186 inverting pins with "~" doesn't work for pin lists (i.e. vcc)
|
||||||
|
bug #37727 Add support for LM3S811 dev board as a programmer
|
||||||
|
* lexer.l,config_gram.y: accepting inverted pins at pin lists
|
||||||
|
syntax: ~num or ~(num,num,...)
|
||||||
|
* par.c: par_set_many_bits is now usable with inverted pins
|
||||||
|
* avrftdi.c: fixed wrong index in ftdi_pin_name
|
||||||
|
* avrdude.conf.in: added programmer lm3s811
|
||||||
|
|
||||||
|
2012-11-04 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
* lexer.l,config_gram.y,config.[hc]: changed reading of numbers to integers
|
||||||
|
except of default_bitclock which is the only real number.
|
||||||
|
No signs are allowed as negative values do not make sense for current
|
||||||
|
config values.
|
||||||
|
* buspirate.c: include own header file buspirate.h
|
||||||
|
* doc/.cvsignore: add programmers.texi to ignore list
|
||||||
|
|
||||||
|
2012-09-06 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* doc/Makefile.am: add EXTRA_DIST, replace $(srcdir) by
|
||||||
|
$(builddir) for generated files, so "make distcheck"
|
||||||
|
works again
|
||||||
|
|
||||||
|
2012-09-05 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
* doc/Makefile.am: add $(srcdir) to name of generated files, so BSD make
|
||||||
|
find the files ( GNU make sees no difference if the
|
||||||
|
file is called version.texi or ./version.texi )
|
||||||
|
|
||||||
|
2012-08-15 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
patch #7184 Support for PICKit2 programmer
|
||||||
|
* Makefile.am: add pickit2 files
|
||||||
|
* pickit2.[ch]: new programmer implementation
|
||||||
|
* pgm_type.c: add pickit to list
|
||||||
|
* avrdude.1: documentation for pickit2
|
||||||
|
* doc/avrdude.texi: documentation for pickit2
|
||||||
|
* avrdude.conf.in: add pickit2 programmer entry
|
||||||
|
|
||||||
|
2012-08-15 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
bug #30559 Ft232 bit-bang support, see comment #30
|
||||||
|
* ft245r.c: added semaphore workaround for MacOS X,
|
||||||
|
added pthread_testcancel in reader thread
|
||||||
|
|
||||||
|
* configure.ac: added check for TYPE_232H in libftdi (not in libftdi < 0.20)
|
||||||
|
* avrftdi.c: do not use TYPE_232H if not declared
|
||||||
|
|
||||||
|
2012-08-13 Hannes Weisbach <hannes_weisbach@gmx.net>
|
||||||
|
|
||||||
|
* avrftdi.c: fixes pin_limit for different FTDI devices (there was a mixup
|
||||||
|
between 2232C and 2232H)
|
||||||
|
|
||||||
|
2012-07-29 Hannes Weisbach <hannes_weisbach@gmx.net>
|
||||||
|
|
||||||
|
* avrftdi.c: bugfixes (synchronisation) and maintenance (paged programming,
|
||||||
|
nicer output, separation of parameter checking and actual code)
|
||||||
|
|
||||||
|
2012-07-25 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* jtagmkII.c (jtagmkII_memtype): return MTYPE_FLASH rather than
|
||||||
|
MTYPE_SPM for non-Xmega flash regions
|
||||||
|
|
||||||
|
2012-07-20 Hannes Weisbach <hannes_weisbach@gmx.net>
|
||||||
|
|
||||||
|
* avrpart.c, avrpart.h: adds avr_pin_name()
|
||||||
|
|
||||||
|
2012-07-18 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac: check for libelf.h also in libelf/
|
||||||
|
* fileio.c: include <libelf/libelf.h> if configure found this
|
||||||
|
to be the case
|
||||||
|
|
||||||
|
2012-06-13 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
* configure.ac: Check for presence of <pthread.h>
|
||||||
|
* ft245r.c: Depend on HAVE_PTHREAD_H
|
||||||
|
* Makefile.am: Add -lpthread if needed.
|
||||||
|
|
||||||
|
2012-06-07 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* usbtiny.c (usbtiny_paged_load, usbtiny_paged_write):
|
||||||
|
fix breakage introduced by the recent page handling reorg;
|
||||||
|
it used to cause an infinite loop
|
||||||
|
|
||||||
|
2012-05-04 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Xmega page erase implementation for XPROG (AVRISPmkII, STK600)
|
||||||
|
* stk500v2.c (stk600_xprog_page_erase): New function.
|
||||||
|
|
||||||
|
2012-05-04 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Xmega page erase implementation for JTAGICEmkII
|
||||||
|
* jtagmkII.c: Handle flash pages sizes > 256 bytes, implement
|
||||||
|
page_erase() method
|
||||||
|
* avrdude.conf.in: Change flash pagesize for all Xmega devices
|
||||||
|
to 512 bytes
|
||||||
|
* avr.c: Implement auto_erase, using page_erase if available
|
||||||
|
* avr.h: Remove unused parameters from avr_read(), replace
|
||||||
|
unused parameter in avr_write)() by auto_erase
|
||||||
|
* stk500v2.c: Handle flash page sizes > 256 bytes
|
||||||
|
* update.c (do_op): Handle new updateflags parameter
|
||||||
|
* main.c: Implement auto_erase as page_erase if possible
|
||||||
|
* update.h (enum updateflags): New enum
|
||||||
|
* pgm.h (struct programmer_t): Add page_erase method
|
||||||
|
|
||||||
|
2012-04-26 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* jtagmkII.c (jtagmkII_paged_load, jtagmkII_paged_write): fix bug
|
||||||
|
in memory type calculation for Xmega "boot" memory region.
|
||||||
|
|
||||||
|
2012-04-25 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* update.c (parse_op): do not assume default memtype here
|
||||||
|
* main.c: after locating the part information, determine default
|
||||||
|
memtype for all update options that didn't have a memtype
|
||||||
|
specified; this is "application" for Xmega parts, and "flash" for
|
||||||
|
everything else.
|
||||||
|
|
||||||
|
2012-04-24 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* fileio.c: Rework the way ELF file sections are considered: while
|
||||||
|
scanning the program header table, the offsets from a program
|
||||||
|
header entry must never be used directly when checking the bounds
|
||||||
|
of the current AVR memory region. Instead, they must always be
|
||||||
|
checked based on the corresponding section's entry. That way,
|
||||||
|
Xmega devices now properly take into account whether the segment
|
||||||
|
fits into any of the application/apptable/boot memory region.
|
||||||
|
|
||||||
|
2012-04-20 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #30756: When setting SUT to 64ms on XMEGA, avrdude doesn't
|
||||||
|
read device signature
|
||||||
|
* main.c: When reading the signature yields 0x000000 or 0xffffff,
|
||||||
|
retry (up to twice) after some progressive delay.
|
||||||
|
|
||||||
|
2012-04-20 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avrdude.conf.in (ATxmega16D4, ATxmega32D4, ATxmega64D4,
|
||||||
|
ATxmega128D4): New devices. As Xmega D doesn't feature a fuse0
|
||||||
|
memory cell, move that one out from the generic .xmega part into
|
||||||
|
the individual Xmega A parts.
|
||||||
|
|
||||||
|
2012-04-19 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #29019: pagel/bs2 warning when uploading using stk500 to xmega
|
||||||
|
* stk500.c (stk500_initialize): Insert dummy values for PAGEL and
|
||||||
|
BS2 if they are not present in the config file, in order to be able
|
||||||
|
to proceed with the stk500_set_extended_parms() anyway.
|
||||||
|
|
||||||
|
2012-04-19 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* stk500v2_private.h (struct pdata): add boot_start
|
||||||
|
* stk500v2.c: For the "flash" pseudo-memory of Xmega devices,
|
||||||
|
distinguish addresses between "application" and "boot" area.
|
||||||
|
|
||||||
|
2012-04-18 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* fileio.c (elf2b): When checking the bounds of the current
|
||||||
|
program header segment, subtract `low' from ph[n].p_paddr in order
|
||||||
|
to correct the magic section offsets for the AVR's non-flash
|
||||||
|
memory regions.
|
||||||
|
|
||||||
|
2012-04-18 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* fileio.c (elf_get_scn): Rather than trying to just match whether
|
||||||
|
any given section maps straight to a program header segment, use a
|
||||||
|
more sophisticated decision that matches any section as long as it
|
||||||
|
fits into the segment. This is needed for situations where the
|
||||||
|
program header segment spans a larger area than the section data
|
||||||
|
provided. (This can e.g. happen in an ELF file that contains no
|
||||||
|
data at address 0, like a bootloader only.)
|
||||||
|
|
||||||
|
2012-04-13 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #28744: Can't load bootloader to xmega128a1 (part 2, fix for
|
||||||
|
firmware >= V7.x)
|
||||||
|
* jtagmkII.c: Add firmware-version dependent handling of Xmega parameters.
|
||||||
|
V7.x firmware expects the NVM offsets being specified through the Xmega
|
||||||
|
parameters command, but left out as part of the memory address itself.
|
||||||
|
* jtagmkII_private.h: Add CMND_SET_XMEGA_PARAMS, and struct xmega_device_desc.
|
||||||
|
* config_gram.y: Add mcu_base keyword.
|
||||||
|
* avrpart.h: (Dito.)
|
||||||
|
* lexer.l: (Dito.)
|
||||||
|
* avrdude.conf.in (.xmega): add mcu_base, and data memory segment.
|
||||||
|
|
||||||
|
2012-03-30 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #28744: Can't load bootloader to xmega128a1 (part 1, fix for
|
||||||
|
firmware < V7.x)
|
||||||
|
* jtagmkII.c: When going to write to the boot section of flash,
|
||||||
|
use MTYPE_BOOT_FLASH rather than MTYPE_FLASH
|
||||||
|
* jtagmkII_private.h: add MTYPE_BOOT_FLASH constant
|
||||||
|
|
||||||
|
2012-03-30 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* jtagmkII_private.h: Sort commands, response codes and events
|
||||||
|
into numerical order.
|
||||||
|
|
||||||
|
2012-03-29 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #30451: Accessing some Xmega memory sections gives not
|
||||||
|
supported error
|
||||||
|
* stk500v2.c: Handle all Xmega memory sections (except
|
||||||
|
"prodsig" which is not documented in AVR079)
|
||||||
|
* fileio.c: Treat the "boot", "application", and "apptable"
|
||||||
|
regions (which are actually subregions of "flash") all as
|
||||||
|
being flash, i.e. suppress trailing 0xFF bytes when reading
|
||||||
|
them
|
||||||
|
* avr.c: (Dito.)
|
||||||
|
|
||||||
|
2012-03-20 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* jtagmkII.c (jtagmkII_close): The GO command before signing off
|
||||||
|
turned out to be not required for normal megaAVR devices, and to
|
||||||
|
cause the exact opposite (i.e. the target stopping) on Xmega
|
||||||
|
devices being programmed to JTAG. However, programming Xmega
|
||||||
|
devcies through PDI *does* need the GO command.
|
||||||
|
|
||||||
|
2012-03-20 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac: Print a configuration summary at the end of the
|
||||||
|
configure run
|
||||||
|
|
||||||
|
2012-02-11 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
patch #7718: Merge global data of avrftdi in a private data structure
|
||||||
|
* avrftdi.[ch]: moved global data into private data structure, moved
|
||||||
|
private defines from header file into source file
|
||||||
|
|
||||||
|
2012-02-06 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
patch #7720 Bug in EEPROM write
|
||||||
|
* avrftdi.c: fixed wrong buffer address initialization in paged_write
|
||||||
|
* fileio.c: added #include <stdint.h>
|
||||||
|
|
||||||
|
2012-02-05 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
bug #30559 Ft232 bit-bang support
|
||||||
|
* ft245r.c: cancel reader thread before exiting program
|
||||||
|
|
||||||
|
2012-02-04 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
patch #7717 avrftdi_flash_write is broken
|
||||||
|
* avrftdi.c: fixed wrong buffer address initialization in paged_write
|
||||||
|
bug #35296 Extraneous newlines in output.
|
||||||
|
* main.c: fixed output of newlines at 100% progress
|
||||||
|
|
||||||
|
2012-02-03 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
patch #7715 FT4232H support
|
||||||
|
* avrdude.conf.in: added programmer 4232h
|
||||||
|
|
||||||
|
2012-02-03 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
patch #7687: Autogenerating programmers and parts lists for docs
|
||||||
|
(generating the programmers lists)
|
||||||
|
* doc/avrdude.texi: Add include of generated table of programmers
|
||||||
|
* doc/Makefile.am: Add generating of table of programmers in programmers.texi
|
||||||
|
|
||||||
|
2012-02-03 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
bug #34768 Proposition: Change the name of the AVR32 devices
|
||||||
|
* avrdude.conf.in: renamed ucr2 to uc3a0512
|
||||||
|
* avrpart.c: added cast to avoid compiler warning
|
||||||
|
|
||||||
|
2012-02-03 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* fileio.c (fileio_elf): Fix a copy'n-paste-o.
|
||||||
|
|
||||||
|
2012-02-03 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* par.c (par_desc): Move to end of file, outside the #if
|
||||||
|
HAVE_PARPORT
|
||||||
|
|
||||||
|
2012-02-02 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Implement ELF file reading (finally). Requires libelf(3) to be
|
||||||
|
present on the host system.
|
||||||
|
* configure.ac (HAVE_LIBELF): Add logic to detect presence of
|
||||||
|
libelf(3)
|
||||||
|
* Makefile.am (avrdude_LDADD): Add @LIBELF@
|
||||||
|
* fileio.h (FILEFMT): add FMT_ELF
|
||||||
|
* fileio.c: Implement ELF file reader.
|
||||||
|
* update.c (parse_op): add 'e' format specifier
|
||||||
|
* avrdude.1: Document the ELF file reading capability
|
||||||
|
* doc/avrdude.texi: (Dito.)
|
||||||
|
|
||||||
|
2012-02-01 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
bug #30559 Ft232 bit-bang support
|
||||||
|
* ft245r.[ch]: new programmer type implementation
|
||||||
|
* configure.ac: add pthread as link library
|
||||||
|
* avrdude.conf.in: added some new programmers
|
||||||
|
* Makefile.am: added new source files to compile
|
||||||
|
* pindefs.h: change PIN_MASK, PIN_INVERSE to highest bit of unsigned int
|
||||||
|
* pgm.[ch]: added generic function to print pin assignments (taken from par.c)
|
||||||
|
* par.c: moved pin assigment print function to pgm.c
|
||||||
|
|
||||||
|
2012-02-01 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* lexer.l: Sort keyword tokens into alphabetic order.
|
||||||
|
|
||||||
|
2012-01-31 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
* config_gram.y, lexer.l: removed unused ID/TKN_ID definitions
|
||||||
|
* config.[hc]: removed unused function id(), use value.type to select
|
||||||
|
values
|
||||||
|
|
||||||
|
2012-01-31 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
patch #7437 modifications to Bus Pirate module
|
||||||
|
patch #7686 Updating buspirate ascii mode to current firmware, use AUX
|
||||||
|
as clock generator, and setting of serial receive timeout
|
||||||
|
* buspirate.c: added paged_write, changed binary mode setup/detection,
|
||||||
|
added clock output on AUX pin
|
||||||
|
* avrdude.1: updated documentation
|
||||||
|
* doc/avrdude.texi: updated documentation
|
||||||
|
|
||||||
|
2012-01-31 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
Parser does not need to know all programmer types now, new programmers
|
||||||
|
will update only the table in pgm_type.c.
|
||||||
|
* config_gram.y, lexer.l: removed programmer type keywords,
|
||||||
|
use now locate_programmer_type() function
|
||||||
|
* pgm_type.[ch]: added new files for table of programmer types
|
||||||
|
* main.c: allow list of programmer types by -c ?type
|
||||||
|
* avrdude.conf.in: changed all type keywords to quoted strings
|
||||||
|
* doc/avrdude.texi: changed description of type definition, list
|
||||||
|
of valid types is now included from generated file
|
||||||
|
* doc/Makefile.am: generate list of programmer types for doc
|
||||||
|
* all programmers [hc]: add xxx_desc string for description of programmer
|
||||||
|
|
||||||
|
2012-01-30 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
* configure.ac: fixed detection of yylex_destroy availability
|
||||||
|
by checking the version number of flex; bump required autoconf
|
||||||
|
version to 2.60 (for AC_PROG_SED)
|
||||||
|
|
||||||
|
2012-01-30 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* lexer.l: Replace the old, now-defunct #define YY_NO_UNPUT by
|
||||||
|
the new %option nounput. This gets rid of a compiler warning.
|
||||||
|
|
||||||
|
2012-01-30 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Add a connection_type attribute to each programmer, rather than
|
||||||
|
trying to hard-code the default port name in main.c.
|
||||||
|
* pgm.h: Add conntype to struct pgm.
|
||||||
|
* lexer.l: Extend grammar for connection_type.
|
||||||
|
* config_gram.y: (Dito.)
|
||||||
|
* config.h: Add DEFAULT_USB, for symmetry with default_parallel
|
||||||
|
and default_serial.
|
||||||
|
* main.c: Replace old default portname hack by avrdude.conf-based
|
||||||
|
knowledge.
|
||||||
|
* usbtiny.c: Drop an old hack that's no longer necessary.
|
||||||
|
* avrdude.conf.in: Add connection_type to each programmer
|
||||||
|
definition.
|
||||||
|
|
||||||
|
2012-01-27 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
* avrdude.conf.in: used parent parts for some other parts, added
|
||||||
|
abstract .xmega part as parent for xmegas
|
||||||
|
* main.c: hide parts starting with '.' from parts list
|
||||||
|
|
||||||
|
2012-01-22 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
patch #7688: Implement parent programmers feature
|
||||||
|
* avrdude.conf.in: updated documentation comment and some programmers
|
||||||
|
have now parents
|
||||||
|
* config_gram.y: initpgm will now called at first use of programmer
|
||||||
|
in main. parser sets only the function pointer in the pgm structure.
|
||||||
|
Pin and pin lists definitions can now be empty to remove the parents
|
||||||
|
setting.
|
||||||
|
* doc/avrdude.texi: updated documentation
|
||||||
|
* main.c: added call to pgm->initpgm after locate_programmer
|
||||||
|
* pgm.[hc]: added field initpgm in structure, added function pgm_dup
|
||||||
|
|
||||||
|
2012-01-21 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
bug #21797: AT90PWM316: New part description
|
||||||
|
* avrdude.conf.in: added pwm316 with parent pwm3b but 16KB flash
|
||||||
|
|
||||||
|
2012-01-20 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac: Check for presence of lusb_usb.h as an alternative
|
||||||
|
to usb.h; libusb-win32 switched to this name in version 1.2.5.0.
|
||||||
|
* avrftdi.c: Decide whether to include <usb.h>, or <lusb0_usb.h>.
|
||||||
|
* ser_avrdoper.c: (Dito.)
|
||||||
|
* usbasp.c: (Dito.)
|
||||||
|
* usb_libusb.c: (Dito.)
|
||||||
|
* usbtiny.c: (Dito.)
|
||||||
|
|
||||||
|
2012-01-19 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
* avr.c: Unsigned variable was used for return code of paged_write/load
|
||||||
|
functions. So a negative return code led never to a fallback to byte
|
||||||
|
functions.
|
||||||
|
|
||||||
|
2012-01-17 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
bug #34302: Feature request : device configuration with parent classes
|
||||||
|
* config_gram.y: if memory section is overwritten old entry is removed
|
||||||
|
|
||||||
|
(not in original patch)
|
||||||
|
* config_gram.y: if programmer or part is defined twice, a warning is
|
||||||
|
output and the first instance is removed
|
||||||
|
|
||||||
|
General cleanup and free functions, so valgrind does not report any lost
|
||||||
|
blocks at program end.
|
||||||
|
* avrpart.[hc]: added avr_free_(opcode|mem|part) functions
|
||||||
|
* pgm.[hc]: added pgm_free function
|
||||||
|
* update.[hc]: added free_update functions
|
||||||
|
* config.[hc]: added cleanup_config function, use yylex_destroy to reset
|
||||||
|
the lexer after usage. (So it can be reused.)
|
||||||
|
* main.c: add cleanup_main function which is called by atexit() (This
|
||||||
|
frees all lists so that at program exit only really lost memory is
|
||||||
|
reported by valgrind.)
|
||||||
|
* usbasp.c: added libusb_free_device_list() and libusb_exit() calls to
|
||||||
|
avoid lost memory
|
||||||
|
* buspirate.c: moved memory allocation from initpgm to setup and added
|
||||||
|
free in teardown
|
||||||
|
* configure.ac: add definition of HAVE_YYLEX_DESTROY if $LEX is flex.
|
||||||
|
* Makefile.am: added . in front of SUBDIRS to build avrdude before trying
|
||||||
|
to use it for creating the part list for the docs.
|
||||||
|
|
||||||
|
2012-01-17 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
* usbasp.c: USB vid/pid/vendor/product from config file are used, for
|
||||||
|
id "usbasp" nibobee and old usbasp are tried as they were currently
|
||||||
|
implemented within usbasp
|
||||||
|
* avrdude.conf.in: added usb params to "usbasp", added new entry "nibobee"
|
||||||
|
with params which were hardcoded in usbasp.c, and added an entry
|
||||||
|
"usbasb-clone" which only checks vid/pid.
|
||||||
|
|
||||||
|
2012-01-10 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
bug #35261 avrftdi uses wrong interface in avrftdi_paged_(write|load)
|
||||||
|
* avrftdi.c: Fixed interface and implementation of avrftdi_paged_(write|load)
|
||||||
|
patch #7672 adding support for O-Link (FTDI based JTAG) as programmer
|
||||||
|
* avrdude.conf.in: added o-link entry
|
||||||
|
|
||||||
|
2012-01-10 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
patch #7699 Read additional config files
|
||||||
|
* main.c: Added reading of additional config files
|
||||||
|
* avrdude.1: updated man page
|
||||||
|
* doc/avrdude.texi: updated documentation
|
||||||
|
|
||||||
|
2012-01-10 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Bob Frazier:
|
||||||
|
bug #35208: avrdude 5.11 on freebsd 8.2-STABLE does not reset
|
||||||
|
Arduino Uno properly
|
||||||
|
* arduino.c (arduino_open): Bump the timeout between pulling
|
||||||
|
the DTR and RTS lines low and high.
|
||||||
|
|
||||||
|
2012-01-08 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
Fixed following findings reported by cppcheck
|
||||||
|
* avr910.c:625 (error) Possible null pointer dereference: cmd - otherwise it is redundant to check if cmd is null at line 624
|
||||||
|
* avr910.c:626 (error) Possible null pointer dereference: cmd - otherwise it is redundant to check if cmd is null at line 624
|
||||||
|
* avr910.c:168 (information) The scope of the variable 'devtype_1st' can be reduced
|
||||||
|
* avr910.c:169 (information) The scope of the variable 'dev_supported' can be reduced
|
||||||
|
* avrftdi.c:647 (error) Using sizeof for array given as function argument returns the size of pointer.
|
||||||
|
* stk500v2.c:3347 (error) Memory leak: b
|
||||||
|
* stk500v2.c:3452 (error) Memory leak: b
|
||||||
|
* usbasp.c:554 (error) Using sizeof for array given as function argument returns the size of pointer.
|
||||||
|
* usbasp.c:485 (information) The scope of the variable 'dly' can be reduced
|
||||||
|
|
||||||
|
2012-01-03 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Reported by Jason Kotzin:
|
||||||
|
* usbasp.c (usbasp_spi_paged_load, usbasp_spi_paged_write):
|
||||||
|
Fix buffer address calculation.
|
||||||
|
|
||||||
|
2012-01-03 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
patch #7629 add support for atmega48p
|
||||||
|
* avrdude.conf.in: Added m48p with parent m48 + different signature
|
||||||
|
|
||||||
|
* avrdude.conf.in: made part parents (m88p = m88 + different signature,
|
||||||
|
m168p = m168 + different signature)
|
||||||
|
|
||||||
|
2012-01-02 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
bug #21663 AT90PWM efuse incorrect
|
||||||
|
bug #30438 efuse bits written as 0 on at90pwmxx parts
|
||||||
|
* avrdude.conf.in: (pwm2, pwm2b, pwm3, pwm3b) <efuse.write>: Write
|
||||||
|
eight bits
|
||||||
|
|
||||||
|
* avrdude.conf.in: made part parents (pwm3 = pwm2, pwm3b = pwm2b,
|
||||||
|
pwm2b = pwm2 + different signature)
|
||||||
|
|
||||||
|
* ChangeLog-2011: New file, rotate ChangeLog for new year.
|
|
@ -0,0 +1,618 @@
|
||||||
|
2013-12-15 Nils Springob <nils@nicai-systems.de>
|
||||||
|
|
||||||
|
* pgm.c/pgm.h: fixed syntax error in const pointer to const
|
||||||
|
|
||||||
|
2013-12-05 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac: bump version to 6.1-svn-20131205
|
||||||
|
|
||||||
|
2013-12-05 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #40817: Elf file support (possibly) not working on 6.0.1 windows build
|
||||||
|
* fileio.c (fileio): open file in binary mode also for FMT_ELF
|
||||||
|
|
||||||
|
2013-12-04 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
Rework of bitbanging functions setpin, getpin, highpulsepin to make simplier use
|
||||||
|
of new pindefs data in pgm structure
|
||||||
|
* linuxgpio.c, bitbang.c, buspirate.c, par.c, pgm.h, term.c, serbb_*.c: changed
|
||||||
|
interface of setpin, getpin, highpulsepin to take pin function as parameter
|
||||||
|
(not the real number, which can be found by pgm->pinno[function])
|
||||||
|
|
||||||
|
2013-11-30 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
bug #40748 linuxgpio doesn't work on Raspberry PI rev. 2.
|
||||||
|
* linuxgpio.c: fixed check for unused pins to ignore the inverse flag
|
||||||
|
* pindefs.c: fixed fill_old_pinlist to not create an empty mask with inverse flag set
|
||||||
|
|
||||||
|
2013-10-18 Nils Springob <nils@nicai-systems.de>
|
||||||
|
|
||||||
|
* avrdude.conf.in (atmega1284): ATmega1284 variant added (same as ATmega1284p but with different signature)
|
||||||
|
|
||||||
|
2013-09-25 Hannes Weisbach <hannes_weisbach@gmx.net>
|
||||||
|
|
||||||
|
First part of patch #7720:
|
||||||
|
* avrdude.conf.in: Add UM232H and C232H programmers
|
||||||
|
|
||||||
|
2013-09-22 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Daniel Rozsnyo:
|
||||||
|
bug #40085: Typo fix in fuses report (for 6.1-svn-20130917)
|
||||||
|
* main.c: Fix a typo.
|
||||||
|
|
||||||
|
2013-09-19 Hannes Weisbach <hannes_weisbach@gmx.net>
|
||||||
|
|
||||||
|
task #12798: Please cleanup #ifdef notyet entries in avrftdi.c
|
||||||
|
* avrftdi.c: ditto.
|
||||||
|
avrftdi.c: Remove DRYRUN-option.
|
||||||
|
|
||||||
|
2013-09-17 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #40055: AVRDUDE segfaults when writing eeprom
|
||||||
|
* main.c: Always clear the UF_AUTO_ERASE flag if either a
|
||||||
|
non-Xmega device was found, or the programmer does not offer a
|
||||||
|
page_erase method.
|
||||||
|
|
||||||
|
2013-09-17 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac (AC_INIT): Bump version to post-6.0.
|
||||||
|
|
||||||
|
2013-09-17 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac (AC_INIT): Bump version to 6.0.
|
||||||
|
|
||||||
|
2013-09-17 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* jtag3.c (jtag3_initialize): Fix a buffer overflow by limiting
|
||||||
|
the flash page cache size to at most "readsize". For Xmegas with
|
||||||
|
a page size of 512 bytes, the maximum USB packet size was
|
||||||
|
overflowed, and subsequently, a memmove copied beyond the end of
|
||||||
|
the allocated buffer.
|
||||||
|
* jtag3.c (jtag3_read_byte): Add the correct offset also for the
|
||||||
|
various flash regions, so reading the apptable or boot regions
|
||||||
|
yields the correct data.
|
||||||
|
|
||||||
|
2013-09-16 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Joakim Lubeck:
|
||||||
|
bug #40040: Support for ATtiny20 and ATtiny40
|
||||||
|
* avrdude.conf.in: Restructure the reduced-core tiny devices
|
||||||
|
to use a common entry .reduced_core_tiny; add ATtiny20 and
|
||||||
|
ATtiny40
|
||||||
|
|
||||||
|
2013-09-15 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Joakim Lubeck:
|
||||||
|
bug #40033: Support for the XMegaE5 family
|
||||||
|
* avrdude.conf.in (ATxmega8E5, ATxmega16E5, ATxmega32E5): New
|
||||||
|
entries.
|
||||||
|
|
||||||
|
2013-09-13 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* stk500v2.c (stk500v2_set_sck_period): Revamp this to match the
|
||||||
|
description/pseudo-code in appnote AVR068.
|
||||||
|
|
||||||
|
2013-09-13 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Stephen Roe:
|
||||||
|
patch #7710: usb_libusb: Check VID/PID before opening device
|
||||||
|
* usb_libusb.c (usbdev_open): Swap the sequence of verifying the
|
||||||
|
VID:PID, and opening the device.
|
||||||
|
|
||||||
|
2013-09-13 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
patch #8176: butterfly.c (AVR109 protocol implementation) clean-up and bug-fixing
|
||||||
|
* butterfly.c (butterfly_page_erase): Add dummy function to avoid
|
||||||
|
segfault when writing to EEPROM.
|
||||||
|
|
||||||
|
2013-09-13 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #35474 Feature request: print fuse values in safemode output
|
||||||
|
* config_gram.y: New configuration token "default_safemode".
|
||||||
|
* lexer.l: (Dito.)
|
||||||
|
* avrdude.conf.in: (Dito.)
|
||||||
|
* config.h: Add variable default_safemode.
|
||||||
|
* config.c: (Dito.)
|
||||||
|
* main.c: Handle default_safemode, including -u option.
|
||||||
|
* avrdude.1: Document all this.
|
||||||
|
* doc/avrdude.texi: (Dito.)
|
||||||
|
|
||||||
|
2013-09-13 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by HubertB:
|
||||||
|
patch #7657 Add ATmega406 support for avrdude using DRAGON + JTAG
|
||||||
|
* avrdude.conf.in (ATmega406): New entry.
|
||||||
|
|
||||||
|
2013-09-13 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Marc de Hoop:
|
||||||
|
patch #7606 ATtiny43u support
|
||||||
|
* avrdude.conf.in (ATtiny43U): New entry.
|
||||||
|
|
||||||
|
2013-09-13 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
patch #5708 avrdude should make 10 synchronization attempts instead of just one
|
||||||
|
* stk500.c (stk500_getsync): Loop 10 times trying to get in
|
||||||
|
sync with the programmer.
|
||||||
|
|
||||||
|
2013-09-13 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Contributed by Ricardo Martins:
|
||||||
|
bug #36384 ATxmega32A4 usersig size
|
||||||
|
* avrdude.conf.in: Revamp all the ATxmega* entries. Add new
|
||||||
|
entries for ATxmega128A1U, ATxmega128A3U, ATxmega128A4U,
|
||||||
|
ATxmega128B1, ATxmega128B3, ATxmega128C3, ATxmega128D3,
|
||||||
|
ATxmega16A4U, ATxmega16C4, ATxmega192A3U, ATxmega192C3,
|
||||||
|
ATxmega192D3, ATxmega256A3BU, ATxmega256A3U, ATxmega256C3,
|
||||||
|
ATxmega256D3, ATxmega32A4U, ATxmega32C4, ATxmega384C3,
|
||||||
|
ATxmega384D3, ATxmega64A1U, ATxmega64A3U, ATxmega64A4U,
|
||||||
|
ATxmega64B1, ATxmega64B3, ATxmega64C3, ATxmega64D3
|
||||||
|
|
||||||
|
2013-09-13 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #35456 The progress bar for STK500V2 programmer is "wrong".
|
||||||
|
* avr.c (avr_read, avr_write): Change the progress reporting for
|
||||||
|
paged read/write from per-address to per-considered-page. This
|
||||||
|
ought to give a realistic estimation about the time still to be
|
||||||
|
spent.
|
||||||
|
|
||||||
|
2013-09-13 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #34277: avrdude reads wrong byte order if using avr911 (aka butterfly)
|
||||||
|
* butterfly.c (butterfly_read_byte_flash): Swap bytes received.
|
||||||
|
|
||||||
|
2013-09-12 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #37768 Poll usbtiny 100 times at init time to handle low-clock devices
|
||||||
|
* doc/avrdude.texi: Add a FAQ entry about how to connect to a
|
||||||
|
target where the firmware has reduced the internal clock speed.
|
||||||
|
|
||||||
|
2013-09-11 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #28344 chip_erase_delay too short for ATmega324P, 644, 644P, and 1284P
|
||||||
|
* avrdude.conf: Bump the chip_erase_delay for all ATmega*4 devices
|
||||||
|
to 55 ms. While the datasheet still claims 9 ms, all the XML files
|
||||||
|
tell either 45 or 55 ms, depending on STK600 or not.
|
||||||
|
|
||||||
|
2013-09-11 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* fileio.c (fileio): Don't exit(1) if something goes wrong; return
|
||||||
|
-1 instead. Don't refer to obsolete option -f to specify the file
|
||||||
|
format.
|
||||||
|
|
||||||
|
2013-09-10 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Matthias Trute:
|
||||||
|
bug #36901 flashing Atmega32U4 EEPROM produces garbage on chip
|
||||||
|
* avrdude.conf.in (ATmega32U4): Fix EEPROM pagesize to 4, the
|
||||||
|
datasheet is wrong here.
|
||||||
|
|
||||||
|
2013-09-09 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac: check for ar and ranlib in the target tool
|
||||||
|
namespace, rather than on the host.
|
||||||
|
|
||||||
|
2013-09-08 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Fix byte-wise EEPROM and flash writes on Xmega
|
||||||
|
* jtagmkII_private.h (MTYPE_EEPROM_XMEGA): New memory type.
|
||||||
|
* jtagmkII.c (jtagmkII_write_byte): For Xmega EEPROM, use
|
||||||
|
memory type MTYPE_EEPROM_XMEGA; for flash writes, always
|
||||||
|
write 2 bytes starting on an even address.
|
||||||
|
|
||||||
|
2013-09-08 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* term.c: Implement the "verbose" terminal mode command.
|
||||||
|
* avrdude.1: Document this.
|
||||||
|
* doc/avrdude.texi: (Dito.)
|
||||||
|
|
||||||
|
2013-09-07 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* jtag3.c (jtag3_write_byte): Do not attempt to start the paged
|
||||||
|
algorithm for EEPROM when being connected through debugWIRE.
|
||||||
|
|
||||||
|
2013-09-06 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Extend the single-byte algorithm to all devices, both flash and
|
||||||
|
EEPROM. (Flash cells must have been erased before though.)
|
||||||
|
* jtag3.c (jtag3_initialize): OCDEN no longer needs to be
|
||||||
|
considered; a session with "programming" purpose is sufficient
|
||||||
|
* jtag3.c (jtag3_write_byte): Use the paged algorithm for all
|
||||||
|
flash and EEPROM areas, not just Xmega.
|
||||||
|
|
||||||
|
2013-09-05 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Fix single-byte EEPROM updates on Xmega:
|
||||||
|
* jtag3_private.h (MTYPE_EEPROM_XMEGA): New define.
|
||||||
|
* jtag3.c (jtag3_write_byte): When updating flash or
|
||||||
|
EEPROM on Xmega devices, resort to jtag3_paged_write()
|
||||||
|
after filling and modifying the page cache.
|
||||||
|
* jtag3.c (jtag3_paged_write): use MTYPE_EEPROM_XMEGA
|
||||||
|
where appropriate.
|
||||||
|
* jtag3.c (jtag3_initialize): Open with debugging intent
|
||||||
|
for Xmega devices, so single-byte EEPROM updates will
|
||||||
|
work.
|
||||||
|
|
||||||
|
2013-09-04 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Matthias Neeracher:
|
||||||
|
bug #38732: Support for ATtiny1634
|
||||||
|
* avrdude.conf.in (ATtiny1634): New entry.
|
||||||
|
|
||||||
|
2013-09-03 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Brane Ždralo:
|
||||||
|
patch #7769: Write flash fails for AVR910 programmers
|
||||||
|
* avr910.c (avr910_paged_write): Fix flash addresses in
|
||||||
|
'A' command.
|
||||||
|
|
||||||
|
2013-09-03 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Fred (magister):
|
||||||
|
bug #38951: AVR109 use byte offset instead of word offset
|
||||||
|
patch #8045: AVR109 butterfly failing
|
||||||
|
* butterfly.c (butterfly_paged_load, butterfly_paged_write):
|
||||||
|
fix calculation of 'A' address when operating on flash memory.
|
||||||
|
It must be given in terms of 16-bit words rather than bytes.
|
||||||
|
|
||||||
|
2013-09-03 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
* avrftdi.c, avrftdi_private.h: added tx buffer size, and use
|
||||||
|
smaller block sizes as larger sometimes hang
|
||||||
|
|
||||||
|
2013-09-03 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avrdude.h: Remove the erase cycle counter (options -y / -Y).
|
||||||
|
* avr.c: (Dito.)
|
||||||
|
* main.c: (Dito.)
|
||||||
|
* avrdude.1: Undocument -y / -Y.
|
||||||
|
* doc/avrdude.texi: (Dito.)
|
||||||
|
|
||||||
|
2013-09-03 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #39691 Buffer overrun when reading EEPROM byte with JTAGICE3
|
||||||
|
* jtag3.c (jtag3_initialize): initialize the eeprom_pagesize
|
||||||
|
private attribute so the page cache will actually be usable
|
||||||
|
|
||||||
|
2013-09-03 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #38580 Current svn head, xmega and fuses, all fuses tied to fuse0
|
||||||
|
* jtag3.c (jtag3_read_byte, jtag3_write_byte): Correctly apply the
|
||||||
|
relevant part of mem->offset as the address to operate on.
|
||||||
|
|
||||||
|
2013-09-03 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* fileio.c: Fix "unused variable" warnings.
|
||||||
|
* avr.c: (Dito.)
|
||||||
|
* stk500v2.c: (Dito.)
|
||||||
|
* stk500.c: (Dito.)
|
||||||
|
* jtagmkII.c: (Dito.)
|
||||||
|
* term.c: (Dito.)
|
||||||
|
* ser_posix.c: (Dito.)
|
||||||
|
|
||||||
|
2013-09-02 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Travis Griggs:
|
||||||
|
bug #38307: Can't write usersig of an xmega256a3
|
||||||
|
* stk500v2.c (stk600_xprog_page_erase): allow erasing the usersig space.
|
||||||
|
|
||||||
|
2013-09-02 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Robert Niemi:
|
||||||
|
bug #35800: Compilation error on certain systems if parport is disabled
|
||||||
|
* linux_ppdev.h: Conditionalize inclusion of <linux/parport.h> and
|
||||||
|
<linux/ppdev.h> on HAVE_PARPORT
|
||||||
|
|
||||||
|
2013-09-02 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #39794: warnings when building avrdude 6.0rc1 under CentOS 6.4
|
||||||
|
* pickit.c (usb_open_device): Use %p rather than %X to print "handle"
|
||||||
|
which is a pointer
|
||||||
|
* jtag3.c (jtag3_initialize): Initialize "flashsize" to be sure it
|
||||||
|
proceeds with a valid value.
|
||||||
|
|
||||||
|
2013-09-02 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #39794: warnings when building avrdude 6.0rc1 under CentOS 6.4
|
||||||
|
* buspirate.c: Turn the "cmd" argument of the various methods into
|
||||||
|
a "const unsigned char *"; while doing this, declare all arrays being
|
||||||
|
passed as arguments to be pointers rather than arrays, as the latter
|
||||||
|
obfuscates the way arrays are being passed to a callee in C.
|
||||||
|
* avrftdi.c: (Dito.)
|
||||||
|
* pickit2.c: (Dito.)
|
||||||
|
* ft245r.c: (Dito.)
|
||||||
|
* avr910.c: (Dito.)
|
||||||
|
* stk500.c: (Dito.)
|
||||||
|
* bitbang.c: (Dito.)
|
||||||
|
* bitbang.h: (Dito.)
|
||||||
|
* avrftdi_tpi.c: (Dito.)
|
||||||
|
* avrftdi_tpi.h: (Dito.)
|
||||||
|
* usbasp.c: (Dito.)
|
||||||
|
* stk500v2.c: (Dito.)
|
||||||
|
* pgm.h: (Dito.)
|
||||||
|
* usbtiny.c: (Dito.)
|
||||||
|
|
||||||
|
2013-09-02 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #38023: avrdude doesn't return an error code when attempting
|
||||||
|
to upload an invalid Intel HEX file
|
||||||
|
* fileio.c (ihex2b): Turn the "No end of file record found" warning
|
||||||
|
into an error if no valid record was found at all.
|
||||||
|
|
||||||
|
2013-09-02 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Claus-Justus Heine:
|
||||||
|
bug #38713: Compilation of the documentation breaks with texinfo-5
|
||||||
|
* doc/avrdude.texi: Turn @itemx into @item, add @headitem to STK600
|
||||||
|
Routing/Socket card table
|
||||||
|
|
||||||
|
2013-09-02 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* usbasp.c: Add trace output for -vvv to non-TPI functions, too.
|
||||||
|
|
||||||
|
2013-09-01 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* usbasp.c (usbasp_tpi_paged_load): Calculate correct
|
||||||
|
buffer address.
|
||||||
|
* usbasp.c (usbasp_tpi_paged_write): Calculate correct
|
||||||
|
buffer address; don't issue a SECTION_ERASE command for
|
||||||
|
each page (a CHIP_ERASE has been done before anyway);
|
||||||
|
remove the code that attempted to handle partial page
|
||||||
|
writes, as all writes are now done with a full page.
|
||||||
|
|
||||||
|
2013-09-01 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* usbasp.c: Add more trace output, by now only for the TPI
|
||||||
|
functions.
|
||||||
|
|
||||||
|
2013-08-31 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* usbasp.c (usbasp_transmit): Add -vvvv trace output.
|
||||||
|
|
||||||
|
2013-08-30 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #39893: Verification failure with AVRISPmkII and Xmega
|
||||||
|
* stk500v2.c (stk600_xprog_page_erase): Fix argument that is
|
||||||
|
passed to stk600_xprog_memtype()
|
||||||
|
|
||||||
|
2013-07-11 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* fileio.c (elf2b): replace elf_getshstrndx() by
|
||||||
|
elf_getshdrstrndx() as the former one is deprecated
|
||||||
|
|
||||||
|
2013-06-19 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
use bitbanging on ftdi mpsse when wrong pins are used
|
||||||
|
* avrftdi.c, avrftdi_private.h: added additional pin check
|
||||||
|
and bitbanging fallback
|
||||||
|
* pindefs.[ch]: added a flag to enable/disable output
|
||||||
|
* ft245r.c: changes because of added flag above
|
||||||
|
|
||||||
|
2013-05-17 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by "Malte" and John McCorquodale:
|
||||||
|
patch #7876 JTAGICE mkII fails to connect to attiny if debugwire
|
||||||
|
is enabled AND target has a very slow clock
|
||||||
|
* jtagmkII.c (jtagmkII_getsync): When leaving debugWIRE mode
|
||||||
|
temporarily, immediately retry with ISP, rather than leaving.
|
||||||
|
* stk500v2 (stk500v2_program_enable): Implemented similar logic
|
||||||
|
for the JTAGICE3.
|
||||||
|
|
||||||
|
2013-05-16 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
* configure.ac: reactivate check for TYPE_232H, which does not
|
||||||
|
exist in libftdi < 0.20
|
||||||
|
* avrftdi*.*: changed include check for libftdi/libusb, deactivate
|
||||||
|
232H if not available
|
||||||
|
* ft245r.c: changed include check for libftdi/libusb
|
||||||
|
|
||||||
|
2013-05-08 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* main.c (main): Add option -l logfile.
|
||||||
|
* avrdude.1: Document -l option.
|
||||||
|
* doc/avrdude.texi: (Dito.)
|
||||||
|
|
||||||
|
2013-05-15 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
* configure.ac: if both found libftdi and libftdi1 use only libftdi1
|
||||||
|
* avrdude.conf.in: fixed buff pins of avrftdi programmers (low
|
||||||
|
active buffer need now inverted numbers)
|
||||||
|
* avrftdi*.*: accept also old libftdi (0.20 still works with it),
|
||||||
|
added powerup to initialize
|
||||||
|
* ft245r.c: accept libftdi1, code cleanup and make it more similar
|
||||||
|
to avrfdti (os they might be merged someday)
|
||||||
|
|
||||||
|
2013-05-08 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac (AC_INIT): Bump version to 6.0rc1.
|
||||||
|
|
||||||
|
2013-05-07 Hannes Weisbach <hannes_weisbach@gmx.net>
|
||||||
|
|
||||||
|
* avrftdi_private.h: Change size of pin_checklist to N_PINS (from N_PINS-1)
|
||||||
|
* avrftdi.c: Adapt code to new size of pin_checklist. Remove pins_check()
|
||||||
|
from set_pin().
|
||||||
|
Add pgm->power[up|down] functions as well as fill pgm->enable|disable with
|
||||||
|
proper content as suggested by Rene Liebscher.
|
||||||
|
|
||||||
|
2013-05-05 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
* pindefs.h: use unsigned int if stdint.h is not available and UINT_MAX is 0xffffffff
|
||||||
|
otherwise use unsinged long
|
||||||
|
* ft245r.c: added support for more pin functions led, vcc, buff
|
||||||
|
|
||||||
|
2013-05-06 Hannes Weisbach <hannes_weisbach@gmx.net>
|
||||||
|
|
||||||
|
* avrftdi_tpi.c: instead of private set_pin() function pointer use the one
|
||||||
|
declared in struct PROGRAMMER.
|
||||||
|
* avrftdi_private.h: remove set_pin function pointer. Add pin_checklist_t
|
||||||
|
member to check pgm->setpin calls during runtime.
|
||||||
|
* avrftdi.c: remove set_pin function pointer init, add pgm->setpin init.
|
||||||
|
Convert avrftdi to new 0-based pindefs infrastructure.
|
||||||
|
* avrdude.conf.in: Change all avrftdi-based programmers' pin definitions to
|
||||||
|
0-based.
|
||||||
|
|
||||||
|
2013-05-06 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* pindefs.h: Include "ac_cfg.h" before testing for HAVE_* macros.
|
||||||
|
|
||||||
|
2013-05-05 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
* main.c: revert to rev 1159 (doing pgm_display after pgm_open)
|
||||||
|
* avrpart.[ch]: moved avr_pin_name to pindefs.[ch]
|
||||||
|
* pgm.c: moved pins_to_str to pindefs.[ch], added initialization of
|
||||||
|
new pin definitions in pgm_new()
|
||||||
|
* pindefs.[ch]: added moved functions from other files, added a lot of
|
||||||
|
documentation, reformatted files using astyle to have consistent spacing,
|
||||||
|
added a new generic check function for pins
|
||||||
|
* ft245r.c: used new generic pin check function
|
||||||
|
|
||||||
|
2013-05-03 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
Create new pin definition data structures to support 0-based pin numbers,
|
||||||
|
and mixed inverse/non-inverse pin lists.
|
||||||
|
* avrftdi.c,buspirate.c,linuxgpio.c,par.c,serbb_*.c: added function call
|
||||||
|
to fill old pinno entries from new pin definitions.
|
||||||
|
* pindefs.[hc]: added data struct and helper functions for new pin definitions
|
||||||
|
* avrdude.conf.in: pins in entries using ftdi_syncbb are now 0-based
|
||||||
|
* config_gram.y: allow combinations of inverted and non-inverted pins in pin lists
|
||||||
|
* ft245r.c: reworked to work directly with the new pin definitions,
|
||||||
|
pins are now 0-based, inverse pins are supported, buff is supported
|
||||||
|
* pgm.[ch]: added new pin definitions field to programmer structure,
|
||||||
|
adapted pin display functions
|
||||||
|
|
||||||
|
2013-05-03 Hannes Weisbach <hannes_weisbach@gmx.net>
|
||||||
|
|
||||||
|
* avrftdi_private.h: Remove update forward declaration from avrftdi_print to
|
||||||
|
avrftdi_log.
|
||||||
|
* avrftdi_tpi.c: Do all I/O in terms of pgm->cmd_tpi()-calls instead of
|
||||||
|
avrftdi_tpi_[read,write]_byte().
|
||||||
|
Remove unnecessary set_pin call to set MOSI high, speeds up I/O.
|
||||||
|
Removes SKEY array, moves it to tpi.h.
|
||||||
|
Integrate new avr_tpi_[program_enable,chip_erase]() and functions into
|
||||||
|
avrftdi_tpi.
|
||||||
|
* avrftdi_tpi.h: Remove avrftdi_tpi_[program_enable,chip_erase] forward
|
||||||
|
declarations.
|
||||||
|
* avr.c: Adds avr_tpi_chip_erase() generic TPI chip erase function.
|
||||||
|
Adds avr_tpi_program_enable() - generic TPI external programming enable
|
||||||
|
function. Sets guard time, reads identification register, sends SKEY command
|
||||||
|
and key, checks NVMEN bit. The required guard time has to be passed as
|
||||||
|
parameter.
|
||||||
|
* tpi.h: Adds SKEY array including CMD_SKEY in "correct" order.
|
||||||
|
|
||||||
|
2013-05-02 Hannes Weisbach <hannes_weisbach@gmx.net>
|
||||||
|
|
||||||
|
* avrftdi_private.h: Add libusb-1.0 include to fix include order in windows.
|
||||||
|
* NEWS: Add notice avrftdi supporting TPI
|
||||||
|
* avr.c: Fix avr_tpi_poll_nvmbsy() - poll read data instead of return code
|
||||||
|
* avrftdi_private.h, avrftdi.c: move logging #defines to from avrftdi.c to
|
||||||
|
avrftdi_private.h, so that they are available for avrftdi_tpi, too.
|
||||||
|
|
||||||
|
2013-04-30 Hannes Weisbach <hannes_weisbach@gmx.net>
|
||||||
|
|
||||||
|
* tpi.h: Add definition for TPI Identification Code
|
||||||
|
* avrftdi_tpi.c: Add TPI-support for FTDI-based programmers
|
||||||
|
* avrftdi_private.h: Add common include file for FTDI-based programmers
|
||||||
|
|
||||||
|
2013-04-28 Hannes Weisbach <hannes_weisbach@gmx.net>
|
||||||
|
|
||||||
|
* avrftdic: Rework of textual output. Messages are divided by severity and
|
||||||
|
printed accordingly to the verbosity, as specified by the user. The provided
|
||||||
|
severity level are (ERROR, WARN, INFO, DEBUG, TRACE). Where "ERROR" messages
|
||||||
|
are always printed. Shortcut-macros including function, from which the
|
||||||
|
output was generated, and line number were also added.
|
||||||
|
Some log messages were updated and other code warnings removed.
|
||||||
|
|
||||||
|
2013-04-27 Hannes Weisbach <hannes_weisbach@gmx.net>
|
||||||
|
|
||||||
|
* configure.ac: Add libftdi1 library check, remove TYPE_232H DECL check
|
||||||
|
* Makefile.am: Add @LIBFTDI1@ to avrdude_LDADD
|
||||||
|
* avrftdi.c: Update from libftdi0 to libftdi1. Use libftdi1's function to
|
||||||
|
find a device by vid/pid/serial instead of doing it ourself and add/update
|
||||||
|
error messages. avrftdi_print is changed so that a message is printed when
|
||||||
|
the verbosity level is greater or equal the message level, to have always-on
|
||||||
|
messages.
|
||||||
|
Fix a bug where the RX fifo of the FTDI chip is full, resulting in STALL/NAK
|
||||||
|
of the ongoing OUT request and subsequently timeout, because an IN request
|
||||||
|
cannot be issued due to the synchronous part of libftdi. This should fix
|
||||||
|
#38831 and #38659.
|
||||||
|
|
||||||
|
2013-04-25 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac(AC_CONFIG_HEADERS): Replace the old AM_CONFIG_HEADER
|
||||||
|
by this; automake 1.13+ barfs.
|
||||||
|
|
||||||
|
2013-03-12 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avrdude.conf.in (ATmega2564RFR2, ATmega1284RFR2, ATmega644RFR2):
|
||||||
|
New devices
|
||||||
|
|
||||||
|
2013-01-30 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
patch #7724 Add TPI support for Bus Pirate using bitbang mode
|
||||||
|
* buspirate.[ch]: added support for BusPirate Bitbanging
|
||||||
|
* pgm_type.c: added entry for buspirate_bb
|
||||||
|
* avrdude.conf.in: added entry for buspirate_bb
|
||||||
|
|
||||||
|
2013-01-30 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
patch #7936 Patch to support BusPirate AVR Extended Commands mode
|
||||||
|
* buspirate.c: added support for BusPirate AVR Extended Commands mode
|
||||||
|
* avrdude.1: added doc for nopagedread parameter
|
||||||
|
* doc/avrdude.texi: added doc for nopagedread parameter
|
||||||
|
|
||||||
|
2013-01-30 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
patch #7723 Bus Pirate “raw-wire” mode which can run down to 5 kHz
|
||||||
|
* buspirate.c: added raw wire mode
|
||||||
|
* avrdude.1: added doc for rawfreq parameter
|
||||||
|
* doc/avrdude.texi: added doc for rawfreq parameter
|
||||||
|
|
||||||
|
2013-01-30 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
bug #37977 Support for Openmoko Debug Board
|
||||||
|
* avrdude.conf.in: added openmoko entry
|
||||||
|
|
||||||
|
2013-01-29 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
patch #7932 Read USBtiny VID and PID from avrdude.conf if provided.
|
||||||
|
* avrdude.conf.in: added usbpid, usbvid to usbtiny
|
||||||
|
* usbtiny.[ch]: use usbpid, usbpid if provided in config file
|
||||||
|
|
||||||
|
2013-01-26 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #38172: avrftdi: Incorrect information in avrdude.conf
|
||||||
|
* avrdude.conf.in (avrftdi): fix comments about ACBUS vs. ADBUS;
|
||||||
|
add a comment that the MPSSE signals are fixed by the FTDI
|
||||||
|
hardware and cannot be changed
|
||||||
|
|
||||||
|
2013-01-09 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
patch #7165 Add support for bitbanging GPIO lines using the Linux sysf GPIO interface
|
||||||
|
* doc/avrdude.texi,avrdude.1: added doc for linuxgpio
|
||||||
|
* avrdude.conf.in: added template for linuxgpio programmer
|
||||||
|
* config_gram.y: pin numbers restricted to [PIN_MIN, PIN_MAX]
|
||||||
|
* pindefs.h: added PIN_MIN, PIN_MAX, removed unused LED_ON/OFF
|
||||||
|
* configure.ac: configure option enable-linuxgpio, print of enabled options
|
||||||
|
* linuxgpio.[ch]: new source for linuxgpio programmer
|
||||||
|
* Makefile.am: added linuxgpio to sources list
|
||||||
|
* pgm_type.c: added linuxgpio to programmer types list
|
||||||
|
|
||||||
|
2013-01-08 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* jtagmkI.c (jtagmkI_prmsg): replace a putchar() by putc(...stderr)
|
||||||
|
* jtagmkII.c (jtagmkII_prmsg): (Dito.)
|
||||||
|
* jtag3.c (jtag3_prevent, jtag3_prmsg): (Dito.)
|
||||||
|
|
||||||
|
2013-01-02 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* usb_libusb.c (usbdev_open): Downgrade the max transfer size for
|
||||||
|
the main data endpoints when being forced so by the USB; this can
|
||||||
|
happen when attaching the JTAGICE3 to a USB 1.1 connection
|
||||||
|
* jtag3.c (jtag3_initialize): When detecting a downgraded max
|
||||||
|
transfer size on the JTAGICE3 (presumably, due to being connected
|
||||||
|
to USB 1.1 only), bail out as its firmware cannot properly handle
|
||||||
|
this (by now)
|
||||||
|
|
||||||
|
2013-01-02 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* ChangeLog: annual ChangeLog rotation time
|
|
@ -0,0 +1,697 @@
|
||||||
|
2014-11-26 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* ser_win32.c (net_send): Properly declare argument 2 as being a
|
||||||
|
pointer to const data.
|
||||||
|
|
||||||
|
2014-11-25 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
patch #8380: adds 500k 1M 2M baud to ser_posix.c
|
||||||
|
* ser_posix.c: Add a hack to allow for arbitrary baud rates on
|
||||||
|
Linux
|
||||||
|
|
||||||
|
2014-11-25 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
patch #8437: [PATCH] Serial-over-ethernet for Win32
|
||||||
|
* configure.ac: Check for ws2_32 library
|
||||||
|
* ser_win32.c: Add hooks for forwarding serial data over
|
||||||
|
TCP connections
|
||||||
|
* avrdude.1: Drop previous restriction of -P net:
|
||||||
|
* doc/avrdude.conf: (Dito.)
|
||||||
|
|
||||||
|
2014-11-24 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #42908: no external reset at JTAGICE3
|
||||||
|
* jtag3.c (jtag3_initialize): Retry with external reset applied if
|
||||||
|
the first sign-on attempt fails.
|
||||||
|
|
||||||
|
2014-11-23 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* main.c: Allow the -B option argument to be suffixed with Hz,
|
||||||
|
kHz, or MHz, in order to specify a bitclock frequency rather than
|
||||||
|
period.
|
||||||
|
* avrdude.1: Document the -B option changes.
|
||||||
|
* doc/avrdude.texi: (Dito.)
|
||||||
|
|
||||||
|
2014-11-23 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #40870: config nitpick: ATtiny25/45/85 have 1 calibration byte not 2
|
||||||
|
* avrdude.conf.in (ATtiny25, ATtiny45, ATtiny85): Fix size of
|
||||||
|
"calibration" memory area
|
||||||
|
|
||||||
|
2014-11-23 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #43137: Writing and reading incorrect pages when using jtagicemkI
|
||||||
|
* jtagmkI.c (jtagmkI_paged_write, jtagmkI_paged_load): correctly
|
||||||
|
calculate the size of a partial (non-pagesize) buffer
|
||||||
|
|
||||||
|
2014-11-23 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #43078: AVRDUDE crashes after sucessfully reading/writing eeprom
|
||||||
|
* jtag3.c (jtag3_edbg_recv_frame): Return correct length as
|
||||||
|
reported in the response packet, rather than full 512 byte which
|
||||||
|
are always reported by the CMSIS-DAP layer. Miscalculations
|
||||||
|
based on the wrongly reported length caused heap corruption
|
||||||
|
elsewhere, so this is presumably also a fix for bug #43078.
|
||||||
|
|
||||||
|
2014-11-20 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #41561: AVRDUDE 6.0.1/USBasp doesn't write first bytes of
|
||||||
|
flash page
|
||||||
|
* usbasp.c (usbasp_spi_paged_write): Remove USBASP_BLOCKFLAG_LAST.
|
||||||
|
It is no longer needed, as we always write full pages now in paged
|
||||||
|
write mode.
|
||||||
|
|
||||||
|
2014-11-19 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #43626: Inconsistent timeouts in stk500v2
|
||||||
|
* stk500v2.c (stk500v2_recv): Add a reference to the bug report
|
||||||
|
but don't change anything, lest to break it somehow
|
||||||
|
|
||||||
|
2014-11-14 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
patch #8529 2 more ftdi_syncbb devices
|
||||||
|
* avrdude.conf.in: added 2 new programmers
|
||||||
|
|
||||||
|
2014-11-14 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
bug #40142 Floating point exception on Ubuntu 10.04
|
||||||
|
* avr.c: avoid division by zero in report_progress(), eg. when
|
||||||
|
writing an empty eeprom file were total becomes 0
|
||||||
|
|
||||||
|
2014-11-13 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
patch #8504 buspirate: Also support "cpufreq" extended parameter
|
||||||
|
in binary mode
|
||||||
|
* buspirate.c: applied patch + switch off at disable (even when
|
||||||
|
a reset follows) + some general whitespace/tab cleanup
|
||||||
|
|
||||||
|
2014-10-15 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #37441: lockbits in ATxmega + avrdude = problem
|
||||||
|
* fileio.c: replace strmcp(..., "lock") by strncmp(..., "lock", 4)
|
||||||
|
where applicable
|
||||||
|
* jtag3.c: (Dito.)
|
||||||
|
* jtagmkII.c: (Dito.)
|
||||||
|
|
||||||
|
2014-10-07 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #42267: jtag3isp fails to read lock and fuse bytes directly
|
||||||
|
after changing lock byte
|
||||||
|
* stk500v2.c (stk500isp_write_byte): As a workaround for broken
|
||||||
|
tool firmware, add 10 ms of delay before returning from any
|
||||||
|
single-byte write operation.
|
||||||
|
|
||||||
|
2014-10-06 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* stk500v2.c: Use stk500isp_read_byte/stk500isp_write_byte for
|
||||||
|
every byte-wide access (rather than JTAGICE3 only). This finally
|
||||||
|
obsoletes the use of the prehistoric SPI_MULTI command where
|
||||||
|
AVRDUDE used to assemble all the low-level ISP stuff by itself.
|
||||||
|
|
||||||
|
2014-10-06 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #22248: Read efuse error
|
||||||
|
* avrdude.conf.in (m168, m328, m48, m88, t1634, t26, t261, t461,
|
||||||
|
t861, t88): In efuse (or hfuse for t26) read operation, turn all
|
||||||
|
bits in byte 3 from "x" to "o" (output); this is a first step
|
||||||
|
towards fixing the symptoms mentioned in the bug, by unifying the
|
||||||
|
behaviour between different AVRs. Not touched are the historic
|
||||||
|
devices where the fuses are not documented to form a full byte
|
||||||
|
each (2333, 4433, 4434, 8535, m103, m161, m163).
|
||||||
|
|
||||||
|
2014-09-22 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #43268: usb_drain() call causes LUFA AVR-ISP MKII Code to Fail
|
||||||
|
* usb_libusb.c (usbdev_drain): Make this a dummy function only.
|
||||||
|
|
||||||
|
2014-08-19 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
patch #7694 Add support for the atmega32m1
|
||||||
|
* avrdude.conf.in: added ATmega32M1
|
||||||
|
|
||||||
|
2014-08-18 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
patch #8440 Print part id after signature
|
||||||
|
When printing the part signature also print the part id.
|
||||||
|
* avrpart.c (locate_part_by_signature): New function.
|
||||||
|
* libavrdude.h (locate_part_by_signature): New function.
|
||||||
|
* main.c (main): Use the new function to find the part and print its id.
|
||||||
|
|
||||||
|
2014-08-18 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
patch #8511 Fix reset on FT245R
|
||||||
|
* ft245r.c: applied patch
|
||||||
|
|
||||||
|
2014-08-18 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
bug #43002 usbasp debug output typo
|
||||||
|
* usbasp.c: fixed typos
|
||||||
|
|
||||||
|
2014-07-16 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #42662 clang warnings under FreeBSD 10.x
|
||||||
|
* avrftdi.h: Fix header guard macro name.
|
||||||
|
* pgm_type.c (programmers_types): Remove duplicate "const".
|
||||||
|
|
||||||
|
2014-07-16 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
bug #42662 clang warnings under FreeBSD 10.x
|
||||||
|
* avrftdi.c: remove warnings
|
||||||
|
* buspirate.c: (Dito.)
|
||||||
|
* dfu.c: (Dito.)
|
||||||
|
* fileio.c: (Dito.)
|
||||||
|
* libavrdude.h: (Dito.)
|
||||||
|
* pickit2.c: (Dito.)
|
||||||
|
* safemode.c: (Dito.)
|
||||||
|
* ser_avrdoper.c: (Dito.)
|
||||||
|
* ser_posix.c: (Dito.)
|
||||||
|
* ser_win32.c: (Dito.)
|
||||||
|
* stk500v2.c: (Dito.)
|
||||||
|
* usb_libusb.c: (Dito.)
|
||||||
|
* usbasp.c: (Dito.)
|
||||||
|
|
||||||
|
* config_gram.y: fix problem when using parent part with usbpid lists
|
||||||
|
(existing list was extended not overwritten)
|
||||||
|
|
||||||
|
2014-07-11 Axel Wachtler <axel@uracoli.de>
|
||||||
|
|
||||||
|
* avrftdi.c: rollback to vfprintf, fixed error from -r1305, (patch #8463)
|
||||||
|
|
||||||
|
2014-06-23 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
* linux_ppdev.h: added missing msg level for avrdude_message
|
||||||
|
in ppi_claim/ppi_release macros
|
||||||
|
* avrftdi.c: added break at end of default
|
||||||
|
|
||||||
|
2014-06-21 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
patch #8419 fix ftdi_syncbb hang with libftdi 1
|
||||||
|
* ft245r.c: set pthread cancel type to asynchronous, reorder ftdi_usb_close/deinit
|
||||||
|
|
||||||
|
2014-06-17 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
* avrftdi_private.h: added missing msg level for avrdude_message
|
||||||
|
in E/E_VOID macros
|
||||||
|
|
||||||
|
2014-06-17 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
Removing exit calls from config parser
|
||||||
|
* config.h: cleanup, left only internally needed definitions
|
||||||
|
* config.c: removed exit calls, use yyerror and yywarning
|
||||||
|
* config_gram.y: (Dito.)
|
||||||
|
* lexer.l: (Dito.)
|
||||||
|
* libavrdude.h: removed internal definitions of config parser
|
||||||
|
* main.c: removed yyerror, it is now in config.c
|
||||||
|
* jtagmkII.c: added missing free in error case
|
||||||
|
* pgm.c: replaced exits by returns
|
||||||
|
* pickit2.c: add missing return
|
||||||
|
|
||||||
|
2014-06-13 Axel Wachtler <axel@uracoli.de>
|
||||||
|
|
||||||
|
start removing global "verbose" variable, for avrdude library.
|
||||||
|
* arduino.c: added verbose level in avrdude_message()
|
||||||
|
* avr910.c: (Dito.)
|
||||||
|
* avr.c: (Dito.)
|
||||||
|
* avrdude.h: (Dito.)
|
||||||
|
* avrftdi.c: (Dito.)
|
||||||
|
* avrpart.c: (Dito.)
|
||||||
|
* bitbang.c: (Dito.)
|
||||||
|
* buspirate.c: (Dito.)
|
||||||
|
* butterfly.c: (Dito.)
|
||||||
|
* config.c: (Dito.)
|
||||||
|
* config_gram.y: (Dito.)
|
||||||
|
* dfu.c: (Dito.)
|
||||||
|
* fileio.c: (Dito.)
|
||||||
|
* flip1.c: (Dito.)
|
||||||
|
* flip2.c: (Dito.)
|
||||||
|
* ft245r.c: (Dito.)
|
||||||
|
* jtag3.c: (Dito.)
|
||||||
|
* jtagmkI.c: (Dito.)
|
||||||
|
* jtagmkII.c: (Dito.)
|
||||||
|
* lexer.l: (Dito.)
|
||||||
|
* libavrdude.h: (Dito.)
|
||||||
|
* linuxgpio.c: (Dito.)
|
||||||
|
* main.c: (Dito.)
|
||||||
|
* par.c: (Dito.)
|
||||||
|
* pgm.c: (Dito.)
|
||||||
|
* pickit2.c: (Dito.)
|
||||||
|
* pindefs.c: (Dito.)
|
||||||
|
* ppi.c: (Dito.)
|
||||||
|
* ppiwin.c: (Dito.)
|
||||||
|
* safemode.c: (Dito.)
|
||||||
|
* ser_avrdoper.c: (Dito.)
|
||||||
|
* serbb_posix.c: (Dito.)
|
||||||
|
* serbb_win32.c: (Dito.)
|
||||||
|
* ser_posix.c: (Dito.)
|
||||||
|
* ser_win32.c: (Dito.)
|
||||||
|
* stk500.c: (Dito.)
|
||||||
|
* stk500generic.c: (Dito.)
|
||||||
|
* stk500v2.c: (Dito.)
|
||||||
|
* term.c: (Dito.)
|
||||||
|
* update.c: (Dito.)
|
||||||
|
* usbasp.c: (Dito.)
|
||||||
|
* usb_libusb.c: (Dito.)
|
||||||
|
* usbtiny.c: (Dito.)
|
||||||
|
* wiring.c: (Dito.)
|
||||||
|
|
||||||
|
2014-06-11 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
bug #42516 spelling-error-in-binary
|
||||||
|
* stk500v2.c, avrftdi.c, usbasp.c: fixed spelling errors
|
||||||
|
|
||||||
|
2014-06-01 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
bug #42337 avrdude.conf updates for UM232H/CM232H
|
||||||
|
* avrdude.conf.in: fixed entries as proposed
|
||||||
|
|
||||||
|
2014-05-19 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #41854: avrdude 6.1 does not compile on systems without libUSB
|
||||||
|
Submitted by Didrik Madheden:
|
||||||
|
* flip1.c: Provide dummy functions for the #ifndef HAVE_LIBUSB case
|
||||||
|
* flip2.c: (Dito.)
|
||||||
|
|
||||||
|
2014-05-19 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* libavrdude.h: Join the former "public" header files (avr.h avrpart.h pindefs.h
|
||||||
|
serial.h fileio.h safemode.h update.h pgm_type.h config.h confwin.h lists.h) into
|
||||||
|
a single header that can be included by anyone wanting to link against the
|
||||||
|
library
|
||||||
|
* avr.h: Remove file.
|
||||||
|
* avrpart.h: (Dito.)
|
||||||
|
* pindefs.h: (Dito.)
|
||||||
|
* serial.h: (Dito.)
|
||||||
|
* fileio.h: (Dito.)
|
||||||
|
* safemode.h: (Dito.)
|
||||||
|
* update.h: (Dito.)
|
||||||
|
* pgm.h: (Dito.)
|
||||||
|
* pgm_type.h: (Dito.)
|
||||||
|
* config.h: (Dito.)
|
||||||
|
* confwin.h: (Dito.)
|
||||||
|
* lists.h: (Dito.)
|
||||||
|
* Makefile.am: Adapt for new include file constellation; install shared lib
|
||||||
|
* configure.ac: Bump version date
|
||||||
|
* arduino.c: #include <libavrdude.h> rather than a bunch of different headers
|
||||||
|
* avr910.c: (Dito.)
|
||||||
|
* avr910.h: (Dito.)
|
||||||
|
* avr.c: (Dito.)
|
||||||
|
* avrftdi.c: (Dito.)
|
||||||
|
* avrftdi_private.h: (Dito.)
|
||||||
|
* avrftdi_tpi.c: (Dito.)
|
||||||
|
* avrftdi_tpi.h: (Dito.)
|
||||||
|
* avr.h: (Dito.)
|
||||||
|
* avrpart.c: (Dito.)
|
||||||
|
* avrpart.h: (Dito.)
|
||||||
|
* bitbang.c: (Dito.)
|
||||||
|
* buspirate.c: (Dito.)
|
||||||
|
* butterfly.c: (Dito.)
|
||||||
|
* config.c: (Dito.)
|
||||||
|
* config_gram.y: (Dito.)
|
||||||
|
* config.h: (Dito.)
|
||||||
|
* confwin.c: (Dito.)
|
||||||
|
* confwin.h: (Dito.)
|
||||||
|
* dfu.c: (Dito.)
|
||||||
|
* fileio.c: (Dito.)
|
||||||
|
* fileio.h: (Dito.)
|
||||||
|
* flip1.c: (Dito.)
|
||||||
|
* flip1.h: (Dito.)
|
||||||
|
* flip2.c: (Dito.)
|
||||||
|
* flip2.h: (Dito.)
|
||||||
|
* ft245r.c: (Dito.)
|
||||||
|
* ft245r.h: (Dito.)
|
||||||
|
* jtag3.c: (Dito.)
|
||||||
|
* jtagmkI.c: (Dito.)
|
||||||
|
* jtagmkII.c: (Dito.)
|
||||||
|
* lexer.l: (Dito.)
|
||||||
|
* libavrdude.h: (Dito.)
|
||||||
|
* linuxgpio.c: (Dito.)
|
||||||
|
* lists.c: (Dito.)
|
||||||
|
* lists.h: (Dito.)
|
||||||
|
* main.c: (Dito.)
|
||||||
|
* par.c: (Dito.)
|
||||||
|
* pgm.c: (Dito.)
|
||||||
|
* pgm_type.c: (Dito.)
|
||||||
|
* pgm_type.h: (Dito.)
|
||||||
|
* pickit2.c: (Dito.)
|
||||||
|
* pickit2.h: (Dito.)
|
||||||
|
* pindefs.c: (Dito.)
|
||||||
|
* pindefs.h: (Dito.)
|
||||||
|
* ppi.c: (Dito.)
|
||||||
|
* ppiwin.c: (Dito.)
|
||||||
|
* safemode.c: (Dito.)
|
||||||
|
* safemode.h: (Dito.)
|
||||||
|
* ser_avrdoper.c: (Dito.)
|
||||||
|
* serbb_posix.c: (Dito.)
|
||||||
|
* serbb_win32.c: (Dito.)
|
||||||
|
* serial.h: (Dito.)
|
||||||
|
* ser_posix.c: (Dito.)
|
||||||
|
* ser_win32.c: (Dito.)
|
||||||
|
* stk500.c: (Dito.)
|
||||||
|
* stk500generic.c: (Dito.)
|
||||||
|
* stk500v2.c: (Dito.)
|
||||||
|
* stk500v2_private.h: (Dito.)
|
||||||
|
* term.c: (Dito.)
|
||||||
|
* term.h: (Dito.)
|
||||||
|
* update.c: (Dito.)
|
||||||
|
* update.h: (Dito.)
|
||||||
|
* usbasp.c: (Dito.)
|
||||||
|
* usbasp.h: (Dito.)
|
||||||
|
* usb_libusb.c: (Dito.)
|
||||||
|
* usbtiny.c: (Dito.)
|
||||||
|
* usbtiny.h: (Dito.)
|
||||||
|
* wiring.c: (Dito.)
|
||||||
|
|
||||||
|
2014-05-19 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* main.c: Cleanup unused include files.
|
||||||
|
|
||||||
|
2014-05-19 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* linux_ppdev.h: Caught two more instances of exit()
|
||||||
|
* configure.ac: Add AC_CONFIG_MACRO_DIR as suggested by libtoolize
|
||||||
|
* Makefile.am: add -I m4 to ACLOCAL_AMFLAGS as suggested by libtoolize
|
||||||
|
|
||||||
|
2014-05-16 Axel Wachtler <axel@uracoli.de>
|
||||||
|
|
||||||
|
* arduino.c: Replacing all occurences of fprintf(stderr,...) with avrdude_message(...)
|
||||||
|
in potential library functions.
|
||||||
|
* avr910.c: (Dito.)
|
||||||
|
* avr.c: (Dito.)
|
||||||
|
* avrdude.h: (Dito.)
|
||||||
|
* avrftdi.c: (Dito.)
|
||||||
|
* avrftdi_private.h: (Dito.)
|
||||||
|
* avrpart.c: (Dito.)
|
||||||
|
* bitbang.c: (Dito.)
|
||||||
|
* buspirate.c: (Dito.)
|
||||||
|
* butterfly.c: (Dito.)
|
||||||
|
* config.c: (Dito.)
|
||||||
|
* config_gram.y: (Dito.)
|
||||||
|
* dfu.c: (Dito.)
|
||||||
|
* fileio.c: (Dito.)
|
||||||
|
* flip1.c: (Dito.)
|
||||||
|
* flip2.c: (Dito.)
|
||||||
|
* ft245r.c: (Dito.)
|
||||||
|
* jtag3.c: (Dito.)
|
||||||
|
* jtagmkI.c: (Dito.)
|
||||||
|
* jtagmkII.c: (Dito.)
|
||||||
|
* lexer.l: (Dito.)
|
||||||
|
* linuxgpio.c: (Dito.)
|
||||||
|
* linux_ppdev.h: (Dito.)
|
||||||
|
* main.c: (Dito.)
|
||||||
|
* par.c: (Dito.)
|
||||||
|
* pgm.c: (Dito.)
|
||||||
|
* pickit2.c: (Dito.)
|
||||||
|
* pindefs.c: (Dito.)
|
||||||
|
* ppi.c: (Dito.)
|
||||||
|
* ppiwin.c: (Dito.)
|
||||||
|
* safemode.c: (Dito.)
|
||||||
|
* ser_avrdoper.c: (Dito.)
|
||||||
|
* serbb_posix.c: (Dito.)
|
||||||
|
* serbb_win32.c: (Dito.)
|
||||||
|
* ser_posix.c: (Dito.)
|
||||||
|
* ser_win32.c: (Dito.)
|
||||||
|
* stk500.c: (Dito.)
|
||||||
|
* stk500generic.c: (Dito.)
|
||||||
|
* stk500v2.c: (Dito.)
|
||||||
|
* term.c: (Dito.)
|
||||||
|
* update.c: (Dito.)
|
||||||
|
* usbasp.c: (Dito.)
|
||||||
|
* usb_libusb.c: (Dito.)
|
||||||
|
* usbtiny.c: (Dito.)
|
||||||
|
* wiring.c: (Dito.)
|
||||||
|
|
||||||
|
2014-05-16 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac: Bump version, add libtool hooks
|
||||||
|
* Makefile.am: First attempt to define building a shared library
|
||||||
|
(not to be installed by now)
|
||||||
|
|
||||||
|
2014-05-16 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* dfu.c (dfu_open, dfu_init): Fix signature of the dummy functions
|
||||||
|
(in the !HAVE_LIBUSB case) to match prototypes.
|
||||||
|
|
||||||
|
2014-05-16 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avr910.c: Replace all occurences of exit() in potential library
|
||||||
|
functions by appropriate return values
|
||||||
|
* avrftdi.c: (Dito.)
|
||||||
|
* bitbang.c: (Dito.)
|
||||||
|
* bitbang.h: (Dito.)
|
||||||
|
* buspirate.c: (Dito.)
|
||||||
|
* butterfly.c: (Dito.)
|
||||||
|
* config.c: (Dito.)
|
||||||
|
* flip2.c: (Dito.)
|
||||||
|
* ft245r.c: (Dito.)
|
||||||
|
* jtagmkI.c: (Dito.)
|
||||||
|
* jtagmkII.c: (Dito.)
|
||||||
|
* linuxgpio.c: (Dito.)
|
||||||
|
* main.c: (Dito.)
|
||||||
|
* par.c: (Dito.)
|
||||||
|
* pgm.c: (Dito.)
|
||||||
|
* pickit2.c: (Dito.)
|
||||||
|
* pindefs.c: (Dito.)
|
||||||
|
* pindefs.h: (Dito.)
|
||||||
|
* ser_avrdoper.c: (Dito.)
|
||||||
|
* ser_posix.c: (Dito.)
|
||||||
|
* ser_win32.c: (Dito.)
|
||||||
|
* serbb_posix.c: (Dito.)
|
||||||
|
* serbb_win32.c: (Dito.)
|
||||||
|
* stk500.c: (Dito.)
|
||||||
|
* stk500v2.c: (Dito.)
|
||||||
|
|
||||||
|
2014-05-07 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
bug #42310: New part description for AT90PWM216
|
||||||
|
* avrdude.conf.in: added pwm216 entry
|
||||||
|
|
||||||
|
2014-05-07 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
bug #42158: Linux GPIO - Source Typo
|
||||||
|
* pindefs.h: fixed typo
|
||||||
|
|
||||||
|
2014-04-14 Rene Liebscher <R.Liebscher@gmx.de>
|
||||||
|
|
||||||
|
bug #42056: double free or corruption triggered at exit
|
||||||
|
* pgm.c: copy usbpid list in pgm_dup
|
||||||
|
|
||||||
|
2014-04-05 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avrdude.1: Remove the note that users might edit the system-wide
|
||||||
|
config file. This file will be overwritten by the next
|
||||||
|
installation, so it's not a good idea to manually modify it.
|
||||||
|
Using the -C +file option is a much better way for user
|
||||||
|
modifications.
|
||||||
|
* doc/avrdude.texi: (Dito.)
|
||||||
|
* avrdude.conf.in: Add a warning to not modify the file manually.
|
||||||
|
|
||||||
|
2014-03-13 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac (AC_INIT): Bump version for post-6.1.
|
||||||
|
|
||||||
|
2014-03-12 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac (AC_INIT): Bump version to 6.1.
|
||||||
|
|
||||||
|
2014-03-12 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* pgm.c (pgm_free): Cleanup police: destroy the p->usbpid
|
||||||
|
list when freeing the programmer struct.
|
||||||
|
|
||||||
|
2014-03-12 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #40782: Verify errors for object size > 16 k on x32e5 due
|
||||||
|
to typo in avrdude.conf
|
||||||
|
* avrdude.conf.in (ATmega8E5, ATmega32E5): fix boot location
|
||||||
|
|
||||||
|
2014-02-28 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avrdude.conf.in (atmelice, atmelice_pdi, atmelice_dw, atmelice_isp):
|
||||||
|
New entries.
|
||||||
|
* avrdude.1: Document the Atmel-ICE addition.
|
||||||
|
* doc/avrdude.texi: (Dito.)
|
||||||
|
* usbdevs.c (USB_DEVICE_ATMEL_ICE): New entry.
|
||||||
|
|
||||||
|
2014-02-28 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* main.c: Bump copyright year.
|
||||||
|
|
||||||
|
2014-02-28 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* jtag3.c (jtag3_recv): avoid memmov'ing more data than available
|
||||||
|
|
||||||
|
2014-02-27 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avrdude.1: Documentation update for EDBG.
|
||||||
|
* doc/avrdude.texi: (Dito.)
|
||||||
|
|
||||||
|
2014-02-27 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* jtag3.c: For EDBG protocol, always use 512-byte block I/O. The
|
||||||
|
lower layers will split this according to the EP's maxsize. This
|
||||||
|
makes it work over USB 1.1 connections (albeit very slowly, due to
|
||||||
|
the interrupt transfers used).
|
||||||
|
|
||||||
|
2014-02-27 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* config_gram.y: Turn the usbpid parameter of the programmer into
|
||||||
|
a list of PIDs. Make the JTAGICE3 programmer handle a list of
|
||||||
|
PIDs, by trying each of them in sequence. Use a single, central
|
||||||
|
jtag3_open_common() function to handle the common code of all
|
||||||
|
jtag3_open_* functions. Centralize all USB VID/PID definitions in
|
||||||
|
usbdevs.h.
|
||||||
|
* flip1.c: (Dito.)
|
||||||
|
* ft245r.c: (Dito.)
|
||||||
|
* stk500v2.c: (Dito.)
|
||||||
|
* jtag3.c: (Dito.)
|
||||||
|
* jtag3.h: (Dito.)
|
||||||
|
* flip2.c: (Dito.)
|
||||||
|
* usbdevs.h: (Dito.)
|
||||||
|
* pgm.c: (Dito.)
|
||||||
|
* serial.h: (Dito.)
|
||||||
|
* pgm.h: (Dito.)
|
||||||
|
* usbtiny.c: (Dito.)
|
||||||
|
* usbasp.c: (Dito.)
|
||||||
|
* avrftdi.c: (Dito.)
|
||||||
|
* usbtiny.h: (Dito.)
|
||||||
|
* avrdude.conf.in: (Dito.)
|
||||||
|
* usbasp.h: (Dito.)
|
||||||
|
* usb_libusb.c: (Dito.)
|
||||||
|
|
||||||
|
2014-02-27 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* usb_libusb.c (usbdev_open): Replace all calls to exit(1) by
|
||||||
|
return -1
|
||||||
|
|
||||||
|
2014-02-26 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* jtag3_private.h: Add EDBG/CMSIS-DAP specific constants.
|
||||||
|
* jtag3.c: Add EDBG/CMSIS-DAP protocol implementation.
|
||||||
|
* serial.h: (Dito.)
|
||||||
|
* usbdevs.h: (Dito.)
|
||||||
|
* usb_libusb.c: (Dito.)
|
||||||
|
* configure.ac: (Dito.)
|
||||||
|
* avrdude.conf.in: Add JTAGICE3 and XplainedPro entries using
|
||||||
|
EDBG.
|
||||||
|
* configure.ac: Bump version date.
|
||||||
|
|
||||||
|
2014-02-22 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* usb_libusb.c (usbdev_recv_frame): Fix a bug where a new recv
|
||||||
|
request was issued even though all desired data had aldready
|
||||||
|
been received.
|
||||||
|
|
||||||
|
2014-02-21 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* serial.h: Change the second parameter of the ser_open method
|
||||||
|
from "baud" into a "union pinfo", so the USB parameters can be
|
||||||
|
passed without hacks.
|
||||||
|
* arduino.c: (Dito.)
|
||||||
|
* avr910.c: (Dito.)
|
||||||
|
* buspirate.c: (Dito.)
|
||||||
|
* butterfly.c: (Dito.)
|
||||||
|
* jtag3.c: (Dito.)
|
||||||
|
* jtagmkI.c: (Dito.)
|
||||||
|
* jtagmkII.c: (Dito.)
|
||||||
|
* ser_avrdoper.c: (Dito.)
|
||||||
|
* ser_posix.c: (Dito.)
|
||||||
|
* ser_win32.c: (Dito.)
|
||||||
|
* stk500.c: (Dito.)
|
||||||
|
* stk500v2.c: (Dito.)
|
||||||
|
* usb_libusb.c: (Dito.)
|
||||||
|
* wiring.c: (Dito.)
|
||||||
|
|
||||||
|
2014-01-30 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
[bug #41402] dfu.c missing include <stdint.h>
|
||||||
|
* dfu.c: include <stdint.h> where uint16_t is defined
|
||||||
|
|
||||||
|
2014-01-28 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avrdude.conf.in (ATmega256RFR2 et al.): Fix EEPROM size.
|
||||||
|
|
||||||
|
2014-01-27 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
[bug #41357] OS X: Avrdude messes with the usb stack?
|
||||||
|
* usb_libusb.c (usbdev_close): Only issue the usb_reset() for
|
||||||
|
Linux systems, as these are the only ones that seem to require
|
||||||
|
it under some circumstances.
|
||||||
|
|
||||||
|
2014-01-22 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac (libelf): check against elf_getshdrstrndx() rather
|
||||||
|
than just elf_begin() only, so it is clear we found a sufficiently
|
||||||
|
recent libelf to work with.
|
||||||
|
|
||||||
|
2014-01-22 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Contributed by Alan Horstmann:
|
||||||
|
bug #40897: AT Mega2560 not correctly programmed with stk500(v1) ISP (solution patch)
|
||||||
|
* stk500.c: Implement extended address byte handling.
|
||||||
|
* avrdude.conf.in (ATmega2560): enable stk500_devcode so
|
||||||
|
STK500v1 protocol actually starts at all.
|
||||||
|
|
||||||
|
2014-01-17 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* flip1.c: Implement the meat of FLIP version 1 protocol.
|
||||||
|
* avrdude.1: Document the new protocol.
|
||||||
|
* doc/avrdude.texi: (Dito.)
|
||||||
|
|
||||||
|
2014-01-17 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* flip2.c (flip2_page_erase): Remove unimplemented function.
|
||||||
|
* dfu.h: Correctly conditionalize <usb.h> vs. <lusb0_usb.h>;
|
||||||
|
add adjustable timeout (struct dfu_dev); add dfu_abort()
|
||||||
|
* dfu.c (dfu_abort): New function; implement adjustable timeout.
|
||||||
|
|
||||||
|
2014-01-17 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac (libhid): Turn from AC_TRY_RUN into
|
||||||
|
AC_TRY_COMPILE, so it also works for cross-compilation
|
||||||
|
setups.
|
||||||
|
|
||||||
|
2014-01-16 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* dfu.c (dfu_init): Move the descriptor checks up into the
|
||||||
|
FLIP protocol implementation.
|
||||||
|
* flip2.c (flip2_initialize): (Dito.)
|
||||||
|
* flip1.c (flip1_initialize): (Dito.)
|
||||||
|
|
||||||
|
2014-01-16 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* flip2.c: Rename from flip.c
|
||||||
|
* flip2.h: Rename from flip.h
|
||||||
|
* Makefile.am: Reflect the renaming.
|
||||||
|
* dfu.c: Update information how to get GPL.
|
||||||
|
* dfu.h: (Dito.)
|
||||||
|
|
||||||
|
2014-01-16 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* flip.c (flip2_initialize): Check user is running on an Xmega
|
||||||
|
device.
|
||||||
|
|
||||||
|
2014-01-15 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* flip.c: Added some verbose-level messages (-vv)
|
||||||
|
* dfu.c: Added some verbose-level messages (-vvvv)
|
||||||
|
|
||||||
|
2014-01-15 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Kirill Levchenko:
|
||||||
|
patch #7896: DFU FLIPv2 programming support
|
||||||
|
* pgm_type.c: Add the flip2 programmer type.
|
||||||
|
* config_gram.y: Allow for the usbid keyword in a device definition.
|
||||||
|
* avrdude.conf.in: Add usbpid values to those Xmega devices where
|
||||||
|
applicable.
|
||||||
|
* avrpart.h: Add usbpid device field.
|
||||||
|
* dfu.c: (New file.)
|
||||||
|
* dfu.h: (New file.)
|
||||||
|
* flip.c: (New file.)
|
||||||
|
* flip.h: (New file.)
|
||||||
|
* Makefile.am: Add new files.
|
||||||
|
* doc/avrdude.texi: Document the changes.
|
||||||
|
* avrdude.1: (Dito.)
|
||||||
|
|
||||||
|
2014-01-15 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* ChangeLog-2013: Annual changelog rotation.
|
|
@ -0,0 +1,54 @@
|
||||||
|
2015-12-15 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avrdude.1 (-C): Do not suggest users might change the
|
||||||
|
default config file. It will be overwritten by updates.
|
||||||
|
|
||||||
|
2015-12-09 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #46610: Floating point exception (core dumped) arch linux rpi2
|
||||||
|
bug #46483: version 6.2. ser_open(): can't set attributes for device
|
||||||
|
* ser_posix.c: Back out change from patch #8380
|
||||||
|
|
||||||
|
2015-11-16 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac: Bump for post-release 6.2.
|
||||||
|
|
||||||
|
2015-11-16 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac: Released version 6.2.
|
||||||
|
|
||||||
|
2015-10-31 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Martino Facchin:
|
||||||
|
bug #45727: Wrong atmega8u2 flash parameters
|
||||||
|
* avrdude.conf.in (ATmega8U2): correct page and block size
|
||||||
|
|
||||||
|
2015-10-31 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Pasquale Cocchini:
|
||||||
|
bug #46020: Add TIAO TUMPA to the conf file.
|
||||||
|
* avrdude.conf.in (tumpa): New entry.
|
||||||
|
|
||||||
|
2015-10-31 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Pasquale Cocchini:
|
||||||
|
bug #46021: Please add read in the memory lock section of ATtiny85
|
||||||
|
* avrdude.conf.in (ATtiny25/45/85): add read pattern for lock bits
|
||||||
|
|
||||||
|
2015-10-31 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* Makefile.am (libavrdude_a_SOURCES): reflect recent changes
|
||||||
|
(pgm.h is gone, config.h is new).
|
||||||
|
|
||||||
|
2015-04-09 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #44717: avrdude creates empty flash dump
|
||||||
|
* update.c (do_op): When about to write an empty flash dump file,
|
||||||
|
warn about this to avoid surprises.
|
||||||
|
* avrdude.1: Document the truncation of trailing 0xFF bytes for
|
||||||
|
flash memory areas.
|
||||||
|
* doc/avrdude.texi: (Dito.)
|
||||||
|
|
||||||
|
2015-04-09 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Annual ChangeLog rotation.
|
|
@ -0,0 +1,95 @@
|
||||||
|
2016-09-14 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* stk500v2.c (DEBUG, DEBUGRECV): define these unconditionally,
|
||||||
|
as MSG_TRACE2 messages.
|
||||||
|
|
||||||
|
2016-05-10 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Hannes Jochriem:
|
||||||
|
* avrdude.conf.in (ehajo-isp): New programmer.
|
||||||
|
|
||||||
|
2016-04-20 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac (libftdi1): Rather than hardcoding the library
|
||||||
|
providing the libusb-1.0 API, use the result from the previous
|
||||||
|
probe. This helps detecting libftdi1 on FreeBSD where the
|
||||||
|
libusb-1.0 API is provided by the system's libusb.
|
||||||
|
|
||||||
|
2016-04-18 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* usb_hidapi.c (usbhid_open): Correctly calculate the
|
||||||
|
offset for serial number matching
|
||||||
|
|
||||||
|
2016-03-28 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #47550: Linux GPIO broken
|
||||||
|
* linuxgpio.c: Replace %ud by %u in snprintf calls.
|
||||||
|
|
||||||
|
2016-03-02 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* usb_hidapi.c (usbhid_recv): Bump read timeout to 300 ms.
|
||||||
|
|
||||||
|
2016-02-20 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* jtag3.c: add support for libhidapi as (optional) transport for
|
||||||
|
CMSIS-DAP compliant debuggers (JTAGICE3 with firmware 3+,
|
||||||
|
AtmelICE, EDBG, mEDBG)
|
||||||
|
* usb_hidapi.c: (New file)
|
||||||
|
* libavrdude.h: Mention usbhid_serdev
|
||||||
|
* configure.ac: Bump version date
|
||||||
|
|
||||||
|
2016-02-18 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
(Obtained from patch #8717: pattch for mcprog and libhidapi support)
|
||||||
|
* configure.ac: Probe for libhidapi
|
||||||
|
* Makefile.am: Add @LIBHIDAPI@
|
||||||
|
|
||||||
|
2016-02-16 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* doc/avrdude.texi: Bump copyright year.
|
||||||
|
|
||||||
|
2016-02-16 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac: Bump for post-release 6.3.
|
||||||
|
|
||||||
|
2016-02-16 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac: Released version 6.3.
|
||||||
|
|
||||||
|
2016-02-15 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
patch #8894: Spelling in 6.2 doc
|
||||||
|
* doc/avrdude.texi: Various spelling fixes.
|
||||||
|
|
||||||
|
2016-02-15 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
patch #8895: Spelling in 6.2 code
|
||||||
|
* avrftdi.c (avrftdi_open): Spell fix.
|
||||||
|
|
||||||
|
2016-02-15 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
patch #8896: Silence cppcheck warnings in 6.2 code
|
||||||
|
* linuxgpio.c: Use %ud to print GPIO values.
|
||||||
|
|
||||||
|
2016-02-15 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
patch #8735: ATtiny28 support in avrdude.conf
|
||||||
|
* avrdude.conf.in (ATtiny28): New device.
|
||||||
|
|
||||||
|
2016-02-15 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avrdude.conf.in (ATmega48PB, ATmega88PB, ATmega168PB): New
|
||||||
|
devices.
|
||||||
|
|
||||||
|
2016-02-15 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
patch #8435: Implementing mEDBG CMSIS-DAP protocol
|
||||||
|
* usb_libusb.c: Add endpoint IDs for Xplained Mini, correctly
|
||||||
|
transfer trailing ZLP when needed
|
||||||
|
* avrdude.conf.in (xplainedmini, xplainedmini_dw): New entries.
|
||||||
|
* jtag3.c (jtag3_edbg_send, jtag3_edbg_recv_frame): Implement
|
||||||
|
fragmentation needed for the 64-byte EP size of the Xplained Mini
|
||||||
|
* avrdude.1: Document the change
|
||||||
|
* doc/avrdude.texi: (Dito.)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
2017-12-30 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Jan Egil Ruud <janegil.ruud@microchip.com>
|
||||||
|
patch #9507: Fix UPDI chip erase
|
||||||
|
* jtag3.c (jtag3_chip_erase_updi): New function
|
||||||
|
* jtag3_private.h: More constants
|
||||||
|
|
||||||
|
2017-12-30 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Jan Egil Ruud <janegil.ruud@microchip.com>
|
||||||
|
patch #9508: Add PowerDebugger and XPlained Mini in UPDI mode
|
||||||
|
* avrdude.conf.in (xplainedmini_updi, powerdebugger,
|
||||||
|
powerdebugger_pdi, powerdebugger_updi, powerdebugger_dw,
|
||||||
|
powerdebugger_isp): New programmers
|
||||||
|
|
||||||
|
2017-12-29 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* bootstrap: Detect whether libtoolize is named
|
||||||
|
`glibtoolize' (MacOS)
|
||||||
|
|
||||||
|
2017-11-30 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* configure.ac: Bump version date, due to UPDI addition
|
||||||
|
|
||||||
|
2017-11-29 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Jan Egil Ruud <janegil.ruud@microchip.com>
|
||||||
|
patch #9482: Add support for UPDI and AVR8X
|
||||||
|
* avrdude.conf.in (xplainedpro_updi): New programmer
|
||||||
|
* avrdude.conf.in (.avr8x, ATtiny1617, ATtiny817): New device
|
||||||
|
family and devices
|
||||||
|
* config_gram.y: add K_OCD_BASE and K_HAS_UPDI
|
||||||
|
* lexer.l: (Ditto.)
|
||||||
|
* doc/avrdude.texi: Document "has_updi" flag
|
||||||
|
* jtag3.c: Implement UPDI
|
||||||
|
* jtag3.h: (Ditto.)
|
||||||
|
* jtag3_private.h: (Ditto.)
|
||||||
|
* libavrdude.h: Add ocd_base value and AVRPART_HAS_UPDI flag
|
||||||
|
* pgm_type.c: Add jtagice3_updi
|
||||||
|
|
||||||
|
2017-11-29 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Jan Egil Ruud <janegil.ruud@microchip.com>
|
||||||
|
* avrdude.conf.in (ATmega328PB): New part
|
||||||
|
|
||||||
|
2017-11-13 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #48084: Avoid compiled-in timestamp for reproducible release builds
|
||||||
|
* main.c: Remove "compiled on/at" string
|
||||||
|
|
||||||
|
2017-03-05 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
bug #47718: "lfuse reads as" not displayed in verbose mode - SOLUTION
|
||||||
|
Reported by Roger A. Krupski:
|
||||||
|
* safemode.c: Display lfuse at correct MSG level
|
||||||
|
|
|
@ -0,0 +1,148 @@
|
||||||
|
2018-01-21 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
patch #8444: Proposal for modifications in -B and -U command options managment
|
||||||
|
* update.c (parse_op): Default -U filename to RBIN for output
|
||||||
|
files
|
||||||
|
|
||||||
|
2018-01-18 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Simone:
|
||||||
|
patch #8128: Added new option to configure.ac script
|
||||||
|
* configure.ac (disable-libusb_1_0): New option
|
||||||
|
|
||||||
|
2018-01-18 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Jan Egil Ruud:
|
||||||
|
patch #9542: Correct "usersig" on avr8x devices
|
||||||
|
* avrdude.conf.in (.avr8x_tiny, .avr8x_mega): rename "userrow" to
|
||||||
|
"usersig", and fix its page size for .avr8x_mega
|
||||||
|
* jtag3.c: Remove all "userrow" handling
|
||||||
|
|
||||||
|
2018-01-17 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Reinhard Max
|
||||||
|
patch #8311: Add IPv6 support to the -Pnet:host:port option
|
||||||
|
* ser_posix.c (net_open): Rewrite to use getaddrinfo()
|
||||||
|
rather than gethostbyname()
|
||||||
|
* avrdude.1: Document IPv6 feature
|
||||||
|
* doc/avrdude.texi: (Dito)
|
||||||
|
|
||||||
|
2018-01-16 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Maciej:
|
||||||
|
patch #9185: Add extended_param to usbasp.c - erasing
|
||||||
|
configuration section in ATtiny 4...40 (TPI)
|
||||||
|
* usbasp.c: Implement extended parameter parsing, and modify
|
||||||
|
usbasp_tpi_chip_erase() appropriately
|
||||||
|
* avrdude.1: Document USBasp extended parameters
|
||||||
|
* doc/avrdude.texi: (Dito)
|
||||||
|
|
||||||
|
2018-01-16 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Tom Carney:
|
||||||
|
patch #8219: Fix boot_start for xmega devices on jtagmkII
|
||||||
|
* jtagmkII.c (jtagmkII_initialize): Determine boarder between
|
||||||
|
application and boot area correctly.
|
||||||
|
|
||||||
|
2018-01-16 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Jan Egil Ruud <janegil.ruud@microchip.com>
|
||||||
|
patch #9507: Fix UPDI chip erase
|
||||||
|
* libavrdude.h (PROGRAMMER): add unlock method
|
||||||
|
* avr.c (avr_unlock): Generic unlock function
|
||||||
|
* jtag3.c: Implement unlock feature; avoid calling
|
||||||
|
jtag3_edbg_prepare() and jtag3_edbg_signoff() on XplainedMini
|
||||||
|
boards to work around a bug in early firmware versions;
|
||||||
|
implement "userrow" memory region
|
||||||
|
* main.c: Call avr_unlock() rather than avr_chip_erase() when
|
||||||
|
encountering a locked UPDI chip
|
||||||
|
|
||||||
|
2018-01-16 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Nicolas BRULEZ
|
||||||
|
patch #8910: ATxmega32c4 and ATxmega16c4 have wrong signatures
|
||||||
|
bug #41388: ATxmega32c4 and ATxmega16c4 have wrong signatures
|
||||||
|
* avrdude.conf.in (ATxmega16C4, ATxmega32C4): Fix signatures
|
||||||
|
|
||||||
|
2018-01-15 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Dennis Reimers:
|
||||||
|
patch #8580: FT245r support to select device by serial number
|
||||||
|
* ft245r.c (ft245r_open): Add serial number parsing.
|
||||||
|
|
||||||
|
2018-01-15 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Axel Simon:
|
||||||
|
patch #9033: avrdoper backend uses libhidapi instead of libusb
|
||||||
|
* ser_avrdoper: Add libhidapi implementation
|
||||||
|
* stk500v2.c: Adapt #ifdefs for LIBHIDAPI
|
||||||
|
* avrdude.1: Document change
|
||||||
|
* doc/avrdude.texi: (Dito)
|
||||||
|
|
||||||
|
2018-01-13 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by David Mosberger-Tang
|
||||||
|
patch #8924: Enable TPI for usbtiny
|
||||||
|
* usbtiny.c: Extend to handle TPI targets
|
||||||
|
* configure.ac: Probe for <netinet/in.h>
|
||||||
|
|
||||||
|
2018-01-12 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Yegor Yefremov:
|
||||||
|
patch #9222: Enable silent build
|
||||||
|
* configure.ac: Add AM_SILENT_RULES
|
||||||
|
* Makefile.am: Document how to run "make" to get verbose
|
||||||
|
build messages
|
||||||
|
|
||||||
|
2018-01-12 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by: Kjetil Kjeka:
|
||||||
|
patch #9317: Support atmega64m1 as part
|
||||||
|
* avrdue.conf.in (ATmega64M1): New entry.
|
||||||
|
|
||||||
|
2018-01-12 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Submitted David Griffith:
|
||||||
|
patch #9530: Update URL to Ladyada's USBtinyISP page.
|
||||||
|
* avrdude.conf.in (usbtiny): Update URL
|
||||||
|
|
||||||
|
2018-01-12 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Milan Kupcevic:
|
||||||
|
patch #9423: Support ATtiny841 and ATtiny441
|
||||||
|
bug #47376: ATtiny841 description missing in configuration file
|
||||||
|
bug #49455: support for tiny441
|
||||||
|
* avrdude.conf.in (ATtiny841, ATtiny441): New entries
|
||||||
|
|
||||||
|
2018-01-10 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Morten Engelhardt Olsen
|
||||||
|
patch #9506: Script to create device configuration stub from Atmel ATDF files
|
||||||
|
* tools/atdf-to-avrdude.xslt: New script
|
||||||
|
|
||||||
|
2018-01-10 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Jan Egil Ruud <janegil.ruud@microchip.com>
|
||||||
|
patch #9507: Fix UPDI chip erase
|
||||||
|
* lexer.l (family_id): New keyword.
|
||||||
|
* config_gram.y: (Ditto)
|
||||||
|
* doc/avrdude.texi: Document new keyword
|
||||||
|
* avrdude.conf.in: Add family_id for avr8x devices
|
||||||
|
* avr.c: Pass error code up.
|
||||||
|
* jtag3.c: Pass error code from memory read up; implement
|
||||||
|
jtag3_read_sib()
|
||||||
|
* libavrdude.h: Add new items.
|
||||||
|
* main.c: Implement different chip erase handling required
|
||||||
|
for UPDI devices.
|
||||||
|
|
||||||
|
2018-01-10 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Jan Egil Ruud <janegil.ruud@microchip.com>
|
||||||
|
patch #9506: Script to create device configuration stub from Atmel ATDF files
|
||||||
|
* avrdude.conf.in (ATtiny202, ATtiny204, ATtiny402, ATtiny404)
|
||||||
|
(ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604)
|
||||||
|
(ATtiny1606, ATtiny1607, ATtiny212, ATtiny214, ATtiny412)
|
||||||
|
(ATTiny414, ATtiny416, ATtiny417, ATtiny814, ATtiny816)
|
||||||
|
(ATtiny1614, ATtiny1616, ATtiny3214, ATtiny3216, ATtiny3217)
|
||||||
|
(ATmega3208, ATmega3209, ATmega4808, ATmega4809): New devices
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
2019-12-17 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Britton Kerin:
|
||||||
|
bug #57428: [PATCH] document when 'arduino' or 'wiring' should be used, and -D requirement of latter
|
||||||
|
* avrdude.1: Clarify
|
||||||
|
* doc/avrdude.texi: (dito)
|
||||||
|
|
||||||
|
2019-01-05 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Milan Kupcevic:
|
||||||
|
patch #9735: spelling error fix: psuedo -> pseudo
|
||||||
|
* avrpart.c (avr_display): Spelling fix
|
||||||
|
|
||||||
|
2019-01-05 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Martino Facchin:
|
||||||
|
patch #9728: Fix UsbTiny programmer
|
||||||
|
* usbtiny.c (usbtiny_initialize): Only consider
|
||||||
|
pgm->program_enable successful if returning 0
|
||||||
|
|
|
@ -0,0 +1,104 @@
|
||||||
|
2020-09-22 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Reported by Hannes Wallnöfer:
|
||||||
|
* avrdude.conf.in (m32m1): add "size" parameter in "efuse"
|
||||||
|
section
|
||||||
|
|
||||||
|
2020-09-20 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Björn Mellström
|
||||||
|
patch #9744: Patch for ATMega324A support
|
||||||
|
* avrdude.conf.in (m324a): New entry.
|
||||||
|
|
||||||
|
2020-09-20 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Ronald Sutherland
|
||||||
|
patch #9811: ATmega328pb has efuse bit 3
|
||||||
|
* avrdude.conf.in (m328pb): Add own efuse definition
|
||||||
|
|
||||||
|
2020-09-19 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Ralf Ramsauer
|
||||||
|
patch #9816: Implement new programmer type: linuxspi
|
||||||
|
* linuxspi.c: (New file.)
|
||||||
|
* linuxspi.h: (New file.)
|
||||||
|
* Makefile.am: Add new files
|
||||||
|
* configure.ac: Add "linuxspi" --enable option
|
||||||
|
* avrdude.conf.in: Add "linuxspi" programmer template
|
||||||
|
* pgm_type.c: Include linuxspi programmer
|
||||||
|
* doc/avrdude.texi: Document new programmer
|
||||||
|
* avrdude.1: (Dito.)
|
||||||
|
|
||||||
|
2020-09-18 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Marcin Miskiewic
|
||||||
|
patch #9963: UsbAsp 3 MHz patch for UsbAsp-flash firmware
|
||||||
|
* usbasp.c: Implement 3 MHz clock option including capability check
|
||||||
|
* usbasp.h: (Dito.)
|
||||||
|
|
||||||
|
2020-09-18 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Sven Schwermer:
|
||||||
|
patch #9966: Add JTAGICE3 in UPDI mode
|
||||||
|
* avrdude.conf (jtag3updi): New entry.
|
||||||
|
|
||||||
|
2020-09-18 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Joel Ray Holveck
|
||||||
|
patch #9732: usbtiny_paged_load overflows buffer e.g. when reading EEPROM
|
||||||
|
* usbtiny.c (usbtiny_paged_load, usbtiny_paged_write): ensure chunk
|
||||||
|
does not overflow memory area
|
||||||
|
|
||||||
|
2020-09-16 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Adrian Klieber:
|
||||||
|
patch #9818: correct typos in SVN rev 1429
|
||||||
|
* buspirate.c: Fix typos.
|
||||||
|
* fileio.c: Fix typos.
|
||||||
|
* jtagmkII.c: Fix typos.
|
||||||
|
* main.c: Fix typos.
|
||||||
|
* term.c: Fix typos.
|
||||||
|
* usbasp.c: Fix typos.
|
||||||
|
* usbtiny.h: Fix typos.
|
||||||
|
|
||||||
|
2020-09-16 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Adrian Klieber:
|
||||||
|
patch #9820: Fix some out-of-bounds/uninitialized issues
|
||||||
|
* stk500v2.c (stk500v2_display): fix uninitialized variables
|
||||||
|
* stk500v2.c (stk500v2_set_sck_period_mk2): fix loop limits
|
||||||
|
* pickit2.c (pickit2_open): Use pgm->desc to store description (WIN32 only)
|
||||||
|
* config_gram.y (K_PAGE_SIZE): ensure page_size is > 0
|
||||||
|
* avrpart.c (avr_new_memtype): initialize page_size to 1
|
||||||
|
|
||||||
|
2020-09-10 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* config_gram.y (K_DESC): Enforce correct length in strncpy()
|
||||||
|
* config_gram.y (K_MEMORY): (Dito.)
|
||||||
|
|
||||||
|
2020-09-10 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* avrpart.c (avr_new_memtype): ensure page_size is at least 1
|
||||||
|
* config_gram.y (K_PAGE_SIZE): (Dito.)
|
||||||
|
|
||||||
|
2020-03-14 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by Adrian Klieber:
|
||||||
|
patch #9819: Address several leaks in SVN rev 1429
|
||||||
|
* config.c: Fix potential memory leak
|
||||||
|
* jtagmkII.c: (Dito.)
|
||||||
|
* stk500v2.c: (Dito.)
|
||||||
|
* update.c: (Dito.)
|
||||||
|
* windows/loaddrv.c: Fix file descriptor leak.
|
||||||
|
|
||||||
|
2020-03-11 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Submitted by: kautism
|
||||||
|
patch #9893: [PATCH] Reader reads ftdi handle after main thread close it
|
||||||
|
* ft245r.c: Wait until reader thread has been stopped before closing FTDI
|
||||||
|
|
||||||
|
2020-03-11 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Fix compiler warnings
|
||||||
|
* avr.c: misleading indentation after spin loop
|
||||||
|
* fileio.c: EM_AVR32 might be defined in system <libelf.h>
|
55
INSTALL
55
INSTALL
|
@ -1,4 +1,57 @@
|
||||||
Installation Instructions
|
Installation Instructions
|
||||||
*************************
|
*************************
|
||||||
|
|
||||||
See README.md.
|
Use `./configure; make all; sudo make install' for Unix-like systems.
|
||||||
|
|
||||||
|
Depending on your requirements, the following prerequisites are
|
||||||
|
needed:
|
||||||
|
|
||||||
|
* libelf including header files (for directly reading ELF files)
|
||||||
|
* libusb 0.1 or 1.0 (or compatible), including header files
|
||||||
|
* libftdi or libftdi1 (for direct access to FTDI devices)
|
||||||
|
* libhidapi or libhid (for access to recent Atmel/Microchip dongles)
|
||||||
|
|
||||||
|
If the header and/or library files for one of those are found in
|
||||||
|
non-default locations, you can add them to configure, e.g.
|
||||||
|
|
||||||
|
`./configure CPPFLAGS=-I/opt/local/include LDFLAGS=-L/opt/local/lib'
|
||||||
|
|
||||||
|
as an example for MacOS using Macports. MacOS Brew requires
|
||||||
|
|
||||||
|
`./configure CPPFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/Cellar'
|
||||||
|
|
||||||
|
instead. (LDFLAGS and CPPFLAGS can also be supplied as environment
|
||||||
|
variables to configure.)
|
||||||
|
|
||||||
|
At the end of the configure script, a configuration summary is issued,
|
||||||
|
like this:
|
||||||
|
|
||||||
|
Configuration summary:
|
||||||
|
----------------------
|
||||||
|
DO HAVE libelf
|
||||||
|
DO HAVE libusb
|
||||||
|
DO HAVE libusb_1_0
|
||||||
|
DO HAVE libftdi1
|
||||||
|
DON'T HAVE libftdi
|
||||||
|
DON'T HAVE libhid
|
||||||
|
DO HAVE libhidapi
|
||||||
|
DO HAVE pthread
|
||||||
|
DISABLED doc
|
||||||
|
DISABLED parport
|
||||||
|
DISABLED linuxgpio
|
||||||
|
DISABLED linuxspi
|
||||||
|
|
||||||
|
Make sure all the features you are interested in have been found.
|
||||||
|
|
||||||
|
For BSD-like systems, using GNU make (gmake) is not mandatory but
|
||||||
|
appears to cause less troubles with the quite complex dependency graph
|
||||||
|
that might be produced by autoconf/automake.
|
||||||
|
|
||||||
|
For Windows, right now, a toolset like MinGW is required to compile
|
||||||
|
AVRDUDE.
|
||||||
|
|
||||||
|
Obviously, a working C compiler is needed. Tested compilers so far
|
||||||
|
include GCC (in various versions) and Clang. The compiler needs to
|
||||||
|
support (at least) C99 language level. For MacOS, either Xcode or the
|
||||||
|
(smaller) Xcode Command Line tools are needed, for Windows, some port
|
||||||
|
of GCC that supports generating native Windows executables.
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
|
|
||||||
#
|
#
|
||||||
# avrdude - A Downloader/Uploader for AVR device programmers
|
# avrdude - A Downloader/Uploader for AVR device programmers
|
||||||
# Copyright (C) 2003, 2004 Theodore A. Roth <troth@openavr.org>
|
# Copyright (C) 2003, 2004 Theodore A. Roth <troth@openavr.org>
|
||||||
|
@ -31,6 +30,22 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
EXTRA_DIST = \
|
EXTRA_DIST = \
|
||||||
|
ChangeLog \
|
||||||
|
ChangeLog-2001 \
|
||||||
|
ChangeLog-2002 \
|
||||||
|
ChangeLog-2003 \
|
||||||
|
ChangeLog-2004-2006 \
|
||||||
|
ChangeLog-2007 \
|
||||||
|
ChangeLog-2008 \
|
||||||
|
ChangeLog-2009 \
|
||||||
|
ChangeLog-2010 \
|
||||||
|
ChangeLog-2011 \
|
||||||
|
ChangeLog-2012 \
|
||||||
|
ChangeLog-2013 \
|
||||||
|
ChangeLog-2014 \
|
||||||
|
ChangeLog-2015 \
|
||||||
|
ChangeLog-2016 \
|
||||||
|
ChangeLog-2017 \
|
||||||
avrdude.1 \
|
avrdude.1 \
|
||||||
avrdude.spec \
|
avrdude.spec \
|
||||||
bootstrap
|
bootstrap
|
||||||
|
@ -42,13 +57,14 @@ CLEANFILES = \
|
||||||
|
|
||||||
BUILT_SOURCES = $(CLEANFILES)
|
BUILT_SOURCES = $(CLEANFILES)
|
||||||
|
|
||||||
#SUBDIRS = doc
|
#SUBDIRS = doc @WINDOWS_DIRS@
|
||||||
#DIST_SUBDIRS = doc
|
#DIST_SUBDIRS = doc windows
|
||||||
|
|
||||||
# . lets build this directory before the following in SUBDIRS
|
# . lets build this directory before the following in SUBDIRS
|
||||||
SUBDIRS = .
|
SUBDIRS = .
|
||||||
# doc comes here, and we want to use the built avrdude to generate the parts list
|
# doc comes here, and we want to use the built avrdude to generate the parts list
|
||||||
SUBDIRS += @SUBDIRS_AC@
|
SUBDIRS += @SUBDIRS_AC@
|
||||||
|
SUBDIRS += @WINDOWS_DIRS@
|
||||||
DIST_SUBDIRS = @DIST_SUBDIRS_AC@
|
DIST_SUBDIRS = @DIST_SUBDIRS_AC@
|
||||||
|
|
||||||
AM_YFLAGS = -d
|
AM_YFLAGS = -d
|
||||||
|
@ -93,7 +109,6 @@ libavrdude_a_SOURCES = \
|
||||||
avr.c \
|
avr.c \
|
||||||
avr910.c \
|
avr910.c \
|
||||||
avr910.h \
|
avr910.h \
|
||||||
avrcache.c \
|
|
||||||
avrdude.h \
|
avrdude.h \
|
||||||
avrftdi.c \
|
avrftdi.c \
|
||||||
avrftdi.h \
|
avrftdi.h \
|
||||||
|
@ -138,8 +153,7 @@ libavrdude_a_SOURCES = \
|
||||||
linuxspi.h \
|
linuxspi.h \
|
||||||
linux_ppdev.h \
|
linux_ppdev.h \
|
||||||
lists.c \
|
lists.c \
|
||||||
micronucleus.c \
|
my_ddk_hidsdi.h \
|
||||||
micronucleus.h \
|
|
||||||
par.c \
|
par.c \
|
||||||
par.h \
|
par.h \
|
||||||
pgm.c \
|
pgm.c \
|
||||||
|
@ -150,6 +164,7 @@ libavrdude_a_SOURCES = \
|
||||||
ppi.c \
|
ppi.c \
|
||||||
ppi.h \
|
ppi.h \
|
||||||
ppiwin.c \
|
ppiwin.c \
|
||||||
|
safemode.c \
|
||||||
serbb.h \
|
serbb.h \
|
||||||
serbb_posix.c \
|
serbb_posix.c \
|
||||||
serbb_win32.c \
|
serbb_win32.c \
|
||||||
|
@ -165,26 +180,9 @@ libavrdude_a_SOURCES = \
|
||||||
stk500v2_private.h \
|
stk500v2_private.h \
|
||||||
stk500generic.c \
|
stk500generic.c \
|
||||||
stk500generic.h \
|
stk500generic.h \
|
||||||
teensy.c \
|
|
||||||
teensy.h \
|
|
||||||
tpi.h \
|
tpi.h \
|
||||||
usbasp.c \
|
usbasp.c \
|
||||||
usbasp.h \
|
usbasp.h \
|
||||||
serialupdi.c \
|
|
||||||
serialupdi.h \
|
|
||||||
updi_constants.h \
|
|
||||||
updi_link.c \
|
|
||||||
updi_link.h \
|
|
||||||
updi_state.c \
|
|
||||||
updi_state.h \
|
|
||||||
updi_readwrite.c \
|
|
||||||
updi_readwrite.h \
|
|
||||||
updi_nvm.c \
|
|
||||||
updi_nvm.h \
|
|
||||||
urclock.c \
|
|
||||||
urclock.h \
|
|
||||||
urclock_hash.h \
|
|
||||||
urclock_private.h \
|
|
||||||
usbdevs.h \
|
usbdevs.h \
|
||||||
usb_hidapi.c \
|
usb_hidapi.c \
|
||||||
usb_libusb.c \
|
usb_libusb.c \
|
||||||
|
@ -202,13 +200,6 @@ include_HEADERS = libavrdude.h
|
||||||
|
|
||||||
avrdude_SOURCES = \
|
avrdude_SOURCES = \
|
||||||
main.c \
|
main.c \
|
||||||
whereami.c \
|
|
||||||
whereami.h \
|
|
||||||
avrintel.c \
|
|
||||||
avrintel.h \
|
|
||||||
developer_opts.c \
|
|
||||||
developer_opts.h \
|
|
||||||
developer_opts_private.h \
|
|
||||||
term.c \
|
term.c \
|
||||||
term.h
|
term.h
|
||||||
|
|
500
NEWS
500
NEWS
|
@ -2,505 +2,9 @@ $Id$
|
||||||
|
|
||||||
Approximate change log for AVRDUDE by version.
|
Approximate change log for AVRDUDE by version.
|
||||||
|
|
||||||
(For detailed changes, see the version control system logs.)
|
(For more detailed changes, see the ChangeLog file.)
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
Changes since version 7.1:
|
|
||||||
|
|
||||||
* Major changes compared to the previous version:
|
|
||||||
|
|
||||||
* New devices supported: none
|
|
||||||
|
|
||||||
* New programmers supported:
|
|
||||||
|
|
||||||
* Issues fixed:
|
|
||||||
|
|
||||||
* Pull requests:
|
|
||||||
|
|
||||||
* Internals:
|
|
||||||
|
|
||||||
|
|
||||||
Changes in version 7.1:
|
|
||||||
|
|
||||||
* Major changes compared to the previous version:
|
|
||||||
|
|
||||||
- Provide a new programmer -c urclock for bootloader urprotocol
|
|
||||||
+ Urclock fully supports vector bootloaders at no extra code size
|
|
||||||
+ Uprotocol
|
|
||||||
https://github.com/stefanrueger/urboot/blob/main/urprotocol.md
|
|
||||||
allows programming much shorter bootloaders with more features:
|
|
||||||
* Exports a pgm_write_page(sram, progmem) function that the
|
|
||||||
application can call at FLASHEND-4+1 to use flash as storage
|
|
||||||
* Supports EEPROM reads/writes
|
|
||||||
* Protects itself from overwriting
|
|
||||||
* Vector bootloaders: can protect the reset vector
|
|
||||||
* Offers Chip Erase function (quicker than uploading 0xff's)
|
|
||||||
+ Urclock when compiled with libreadline supports bootloaders in
|
|
||||||
terminal mode (preventing them from WDT timeout)
|
|
||||||
+ The -c urclock programmer provides a metadata interface that
|
|
||||||
allows unused flash to be used as storage
|
|
||||||
+ avrdude -c urclock is backward compatible with avrdude -c arduino
|
|
||||||
|
|
||||||
- Add TPI support for Microchip tools #1205
|
|
||||||
|
|
||||||
- Add C-strings, C characters and double to terminal write
|
|
||||||
|
|
||||||
- Provide write flash in the terminal (using a cache)
|
|
||||||
|
|
||||||
- Provide page erase in the terminal as pgerase
|
|
||||||
|
|
||||||
- Add support for NetBSD and OpenBSD to build.sh
|
|
||||||
|
|
||||||
* New devices supported: none
|
|
||||||
|
|
||||||
* New programmers supported:
|
|
||||||
|
|
||||||
- urclock = Urclock programmer for bootloaders using urprotocol
|
|
||||||
- xplainedmini_tpi = Atmel AVR XplainedMini in TPI mode
|
|
||||||
- xplainedpro_pdi = Atmel AVR XplainedPro in PDI mode
|
|
||||||
- atmelice_tpi = Atmel-ICE (ARM/AVR) in TPI mode
|
|
||||||
- powerdebugger_tpi = Atmel PowerDebugger (ARM/AVR) in TPI mode
|
|
||||||
- pickit4 = MPLAB(R) PICkit 4 in JTAG mode
|
|
||||||
- pickit4_tpi = MPLAB(R) PICkit 4 in TPI mode
|
|
||||||
- snap = MPLAB(R) SNAP in JTAG mode
|
|
||||||
- snap_tpi = MPLAB(R) SNAP in TPI mode
|
|
||||||
- arduino_gemma = Arduino Gemma bootloader disguised as USBtiny
|
|
||||||
- adafruit_gemma = Adafruit Trinket Gemma bootloader disguised as USBtiny
|
|
||||||
- digilent-hs2 = Digilient JTAG HS2 (MPSSE)
|
|
||||||
- tigard = Tigard interface board
|
|
||||||
|
|
||||||
* Issues fixed:
|
|
||||||
|
|
||||||
- Fix micronucleus bootloader to check for unresponsive USB
|
|
||||||
devices #945
|
|
||||||
- Fix src/CMakeLists.txt to honor CMAKE_INSTALL_LIBDIR #972
|
|
||||||
- [bug #43898] atmega644p remains stopped after JTAG
|
|
||||||
transaction #366
|
|
||||||
- Wrong timings for ATmega328PB and other parts in avrdude.conf
|
|
||||||
#976
|
|
||||||
- FT232R based programmer ATmega2560 Flash Reading Problem #995
|
|
||||||
also #474
|
|
||||||
- Enable avrdude to send full input file incl trailing 0xff
|
|
||||||
#936
|
|
||||||
- Portname default for linuxspi programmer not recognized #926
|
|
||||||
- JTAG1 unable to write fuse and lock bits #443
|
|
||||||
- Unknown option '-s' on command line (legacy) #1032
|
|
||||||
- STK500/arduino/xbee programmers fail EEPROM r/w for some
|
|
||||||
parts #967 also #421
|
|
||||||
- Design issue: jtag2updi is hardcoded to fail for parts with
|
|
||||||
has_pdi = yes #1037
|
|
||||||
- Option parse error: after -U flash:w:program_to_upload.hex,
|
|
||||||
subsequent -V ignored #441
|
|
||||||
- Automatic verification is designed to fail for stdin #1044
|
|
||||||
- Display correct number of bytes when input file has holes
|
|
||||||
#1005
|
|
||||||
- Cmake installs avrdude.1 in the wrong place on Linux #1064
|
|
||||||
- avr910 -qq prompt too verbose #1081
|
|
||||||
- avrftdi.c: paged write can fail at addr 0 #1073
|
|
||||||
- Permission denied accessing /sys/class/gpio/gpioX/direction
|
|
||||||
would leave pin exported #472 also #372
|
|
||||||
- Raspberry Pi sysfs bug workaround for linuxgpio driver #386
|
|
||||||
- Fix CMake avrdude.conf dependency to avrdude.conf.in #1035
|
|
||||||
- CMake infrastructure does not handle documentation #947
|
|
||||||
- New feature: ability to reset FLIPv2 targets #733
|
|
||||||
- Fix Extended address not sent with avr109/butterfly #360
|
|
||||||
and #454
|
|
||||||
- Enable AVR JTAG ICE mkI program EEPROM in terminal mode
|
|
||||||
#1054
|
|
||||||
- Make flash writes work in terminal mode #1020
|
|
||||||
- Add support for XMEGA specific AVR109 protocol extensions
|
|
||||||
used by XBoot #200
|
|
||||||
- jtag2updi can not write EEPROM in terminal mode #1116
|
|
||||||
- Make UPDI programmers less verbose during initialization
|
|
||||||
#1084
|
|
||||||
- Quell mode isn't handled systematically #1114
|
|
||||||
- Mixing the progress bar with warning messages #1136
|
|
||||||
- Inconsistent terminal output re stdout and stderr #1130
|
|
||||||
- Supress the warning for Microchip SNAP #1135
|
|
||||||
- ATtiny85 communication problem with default bitclock #1133
|
|
||||||
- [Regression] Optiboot for "modern AVRs" no longer works #1120
|
|
||||||
- Cannot access EEPROM on some bootloader/part combos #970
|
|
||||||
- -U writes sometimes more bytes to flash/memory than input
|
|
||||||
file has #1050
|
|
||||||
- debugWire using dragon_dw and jtag2dw not working #1168
|
|
||||||
- && echo OK does not work after -c urclock #1192
|
|
||||||
- Serial drain timeout needs calibrating for -c urclock #1193
|
|
||||||
- avrdude -U file.elf misses second and following suitable
|
|
||||||
sections in elf segements #1204
|
|
||||||
- Avrdude on macOS has problems with libedit #1173
|
|
||||||
- urclock support for optiboot_x and optiboot_dx #1200
|
|
||||||
- Terminal does not continue read/dump correctly #1201
|
|
||||||
- JTAG3 programmer info not available in ISP mode #1212
|
|
||||||
- Extra avrdude> prompt with -qqt in terminal mode #1214
|
|
||||||
- PICkit4 and SNAP serial numbers not read by Avrdude #1038
|
|
||||||
- Optiboot EEPROM support cannot be detected by avrdude #1224
|
|
||||||
- megaAVR JTAG programming doesn't work for SNAP and PICkit4
|
|
||||||
#1052
|
|
||||||
- urclock/FTDI communication issues #1245
|
|
||||||
- stk500v2.c dumps core on open #1254
|
|
||||||
- linuxgpio cannot use pin 0 #1228
|
|
||||||
- Remove non-working butterfly page erase function
|
|
||||||
- linuxgpio and linuxspi: input files with unset bytes don't program
|
|
||||||
correctly #1263 #455
|
|
||||||
|
|
||||||
* Pull requests:
|
|
||||||
|
|
||||||
- Fix .Dd macro in manpage #949
|
|
||||||
- fix M1 homebrew path #950
|
|
||||||
- CMake Enhancements #962
|
|
||||||
- Reduce programmer desc string length in avrdude.conf
|
|
||||||
to < 80 characters #1000
|
|
||||||
- Dragon JTAG fix #979
|
|
||||||
- adding support for all Linux baud rates v.2 #993
|
|
||||||
- Replace internal knowledge in jtag3.c by a public API #996
|
|
||||||
- JTAG3 UPDI EEPROM fix #1013
|
|
||||||
- Treat x bits in .conf SPI commands as 0 #943
|
|
||||||
- Fix avrftdi support for ATmega2560 et al #998
|
|
||||||
- Fix avrdude.conf timings for ATmega328PB and other parts #1001
|
|
||||||
- Fix PICKit2 ATmega2560 flash paged flash read #1023
|
|
||||||
- Fix ft245r paged read for ATmega2560 et al #1018
|
|
||||||
- Add option -A that supresses trailing 0xff optimisation
|
|
||||||
and automatically do so for -c arduino #936
|
|
||||||
- Fix linuxspi default port #933
|
|
||||||
- Add support for high-voltage UPDI im jtag3.c #1015
|
|
||||||
- Fix terminal write edge cases; add one read mode; add quell
|
|
||||||
command #1025
|
|
||||||
- Fix usbtiny read for parts with more than 64 kB flash #1029
|
|
||||||
- CMakeLists.txt: fix build without C++ #1016
|
|
||||||
- Provide file format I: Intel HEX with comments that ignores
|
|
||||||
checksum errors #1030
|
|
||||||
- Enable writing fuse and lock bits for AVR-JTAGICE #1031
|
|
||||||
- Ignore -s flag as safemode is no longer supported #1033
|
|
||||||
- Developer options to describe parts and
|
|
||||||
extend avrdude.conf syntax #1040
|
|
||||||
- Deprecate original STK500 v1 protocol in favour of optiboot
|
|
||||||
and Arduino as ISP #1046
|
|
||||||
- Add jtagmkii_updi programmer option #1048
|
|
||||||
- Enable stdin verification, display correct number of bytes
|
|
||||||
written/verified, check -U memory names against spelling
|
|
||||||
errors and exit but skip -U memory updates with known
|
|
||||||
memories that the part lacks #1053
|
|
||||||
- Handle invalid -U file format specifiers for input #1042
|
|
||||||
- Implement a dry run for -U updates before opening the
|
|
||||||
programmer #1056
|
|
||||||
- Implement -c <wildcard>/dev_options for printing avrdude.conf
|
|
||||||
show comments with -p*/s or -c*/s; Reduce -p */r raw output;
|
|
||||||
specifying the full memory name now always works; stop
|
|
||||||
listing programmers where id starts with dot #1059
|
|
||||||
- Fix logfile short option in man-page; fix install dir for man
|
|
||||||
page #1063
|
|
||||||
- Use const for programmer functions where useful; add second
|
|
||||||
argument for programmer enable interface function
|
|
||||||
void (*enable)(PROGRAMMER *pgm, const AVRPART *p) #1078
|
|
||||||
- Make avr910 programmer initialize() less verbose #1083
|
|
||||||
- Fix flash paged write for avrftdi.c #1074
|
|
||||||
- Fix 4 parts wrt to their interfaces in avrdude.conf; rewrite
|
|
||||||
avrdude.conf.in file from avrdude -c* -p* output; reformat
|
|
||||||
conditional programmers in avrdude.conf.in using -c*; fix
|
|
||||||
reset=dedicated|io; entries #1086
|
|
||||||
- Add prog_modes, a bitwise or of prgramming modes, to part and
|
|
||||||
programmer definitions; add to part definition
|
|
||||||
+ mcuid, a unique id in 0..2039 for 8-bit AVR
|
|
||||||
+ n_interrupts, the number of interrupts
|
|
||||||
+ n_page_erase, if set, the # of pages erased for NVM erase
|
|
||||||
implement a simple calculator in config_gram.y for numeric
|
|
||||||
values; set part prog_modes, mcuid, n_interrupts and
|
|
||||||
n_page_erase in avrdude.conf.in; add external intelligence
|
|
||||||
about AVRs avrintel.[ch] to the project and warn during
|
|
||||||
parsing if mcuid is incompatible with it #1091
|
|
||||||
- Fix permission denied error in linuxgpio programmer #917
|
|
||||||
- Add a programmer arduino_gemma for the Arduino Gemma
|
|
||||||
bootloader and another one, adafruit_gemma, for the Adafruit
|
|
||||||
Trinket Gemma bootloader in avrdude.conf; #1093
|
|
||||||
- Add digilent-hs2 programmer in avrdude.conf #1094
|
|
||||||
- Fix dependency chain between avrdude.conf.in and
|
|
||||||
avrdude.conf #1095
|
|
||||||
- Build docs with CMake #1096
|
|
||||||
- New feature so user can print all compatible parts for a
|
|
||||||
programmer using -p\? -c programmer and vice versa #1099
|
|
||||||
- Add extended parameter disable_no_cs for linuxspi programmer
|
|
||||||
#1100
|
|
||||||
- Fix avr109 extended address #1101
|
|
||||||
- Add support for Flip 2 reset on exit #1102
|
|
||||||
- Support for Power Debugger analog readings in terminal mode
|
|
||||||
#1105
|
|
||||||
- Provide cached byte-wise read/write API #1106
|
|
||||||
- AVR109: support for prodsig read and usersig read/write #1108
|
|
||||||
- Add missing AVR variants the original JTAG ICE supports #1109
|
|
||||||
- Improve help message in terminal and provide new command
|
|
||||||
pgerase #1113
|
|
||||||
- Fix pointer truncation for Windows x64 #1119
|
|
||||||
- Fix jtag3_page_erase for targets with UPDI #1112
|
|
||||||
- Fix writing of last word on DWORD TPI parts #1115
|
|
||||||
- Use byte-wise read/write when page size is 1 in terminal
|
|
||||||
cache #1121
|
|
||||||
- Suppress Teensy USB communication error message on reboot #1122
|
|
||||||
- Fix UPDI erase when target is locked #1125
|
|
||||||
- Review and overhaul AVRDUDE's messaging system #1126
|
|
||||||
- Look for ~/.config/avrdude/avrdude.rc then ~/.avrduderc #1131
|
|
||||||
- Revamp terminal output (progress bar, callback and
|
|
||||||
stdout/stderr) #1132
|
|
||||||
- Detect PICkit4 and SNAP in PIC mode #1138
|
|
||||||
- Mention -B in the error message #1139
|
|
||||||
- Support optiboot, optiboot_dx and optiboot_x bootloaders for
|
|
||||||
-c arduino #1140
|
|
||||||
- Always use paged access for programmers that serve
|
|
||||||
bootloaders #1141
|
|
||||||
- Add libreadline-dev for Linux github action build #1146
|
|
||||||
- Implementation of SerialUPDI page erase operation #1151
|
|
||||||
- Fix Type 2 HV UPDI #1164
|
|
||||||
- Rewrite authors/copyrights #1182
|
|
||||||
- Add fallback for EM_AVR #1181
|
|
||||||
- Add a workaround for issue 1173 #1185
|
|
||||||
- Add xplainedpro_pdi programmer #1147
|
|
||||||
- Provide Urclock programmer #1171
|
|
||||||
- Fix JTAGICE mkII (not initializing after chip erase) #1172
|
|
||||||
- Ensure default_programmer from config files is used #1174
|
|
||||||
- Make terminal write's automatic number width less surprising
|
|
||||||
#1175
|
|
||||||
- Print HAVE_LIBREADLINE status when making the project #1184
|
|
||||||
- Pad pages with input file contents before avr_write() #1188
|
|
||||||
- Deprecate mosi/miso in favour of sdo/sdi #1189
|
|
||||||
- Provide bootloader-hash tool #1190
|
|
||||||
- Fix JTAGICE mkII parameters for parts with bootloaders #1191
|
|
||||||
- Fix shell exit value when chip erase is delayed #1194
|
|
||||||
- Support autobaud for urclock programmer #1198
|
|
||||||
- Fix userrow size and page_size for ATtiny3216/7 #1199
|
|
||||||
- Added TPI support for Microchip tools #1205
|
|
||||||
- Fix reading of .elf files #1206
|
|
||||||
- Use libedit only in interactive mode #1207
|
|
||||||
- Add urclock support for bootloaders in low flash #1208
|
|
||||||
- Terminal read improvements #1209
|
|
||||||
- Print meaningful error when a too slow ISP clock is detected #1216
|
|
||||||
- Check alternative USB PID for PICkit4/SNAP in PIC mode #1219
|
|
||||||
- Remove extraneous avrdude> prompt at end of terminal session #1220
|
|
||||||
- Read programmer serial number from libusb or hidusb #1223
|
|
||||||
- Hint at -xeepromrw option in EEPROM error messages #1226
|
|
||||||
- Add JTAG support for PICkit4 and Snap. #1233
|
|
||||||
- Mention developer options in documentation and Usage() #1234
|
|
||||||
- Print expected signature on signature mismatch #1237
|
|
||||||
- To work around Issue #1107 #1240
|
|
||||||
- Update build.sh for NetBSD #1241
|
|
||||||
- Add FT2232H support for Windows, Tigard programmer #1242
|
|
||||||
- Modify recv timeouts to accommodate urclock sync with ftdi
|
|
||||||
#1246
|
|
||||||
- CMake updates #1243
|
|
||||||
- Silence conf path detection debug output #1247
|
|
||||||
- Make WIN32 ser_recv() fail on time-out #1248
|
|
||||||
- Guard urclock_getsync() against initial spurious input #1251
|
|
||||||
- Change definition of NO_PIN to 1+PIN_MAX #1231
|
|
||||||
- Fix partial matches for locate_mem() and do_cmd() #1256
|
|
||||||
- Add abbreviated q command in terminal
|
|
||||||
- Move static usbsn into serdev struct and remove serno #1258
|
|
||||||
- Clean up avrdude.conf.in fixing a couple of bugs #1260
|
|
||||||
- Add readline library replacement for MSVC #1264
|
|
||||||
- Ensure full words are loaded for ISP programming #1265
|
|
||||||
- Silence page erase in cache code #1266
|
|
||||||
- Update to latest MSVC fork of hidapi to include bug fixes
|
|
||||||
#1269
|
|
||||||
|
|
||||||
* Internals:
|
|
||||||
|
|
||||||
- Implement -c <wildcard>/dev_opts and -p <wildcard>/dev_opts
|
|
||||||
for printing avrdude.conf programmer and part entries
|
|
||||||
|
|
||||||
- Added shorter alternative ISP commands for avrdude.conf
|
|
||||||
|
|
||||||
- Reformatted avrdude.conf to canonical form
|
|
||||||
|
|
||||||
- Reviewed API for prgrammer functions: use const for
|
|
||||||
programmer functions where useful; add second argument for
|
|
||||||
void (*enable)(PROGRAMMER *pgm, const AVRPART *p) #1078
|
|
||||||
|
|
||||||
- Reviewed messaging system making warnings and errors explicit
|
|
||||||
and treat them systematically
|
|
||||||
|
|
||||||
|
|
||||||
Changes in version 7.0:
|
|
||||||
|
|
||||||
* Major changes compared to the previous version:
|
|
||||||
|
|
||||||
- Completely revamped Windows support, including MSVC
|
|
||||||
- Started to add CMake (by now, parallel with autoconf/automake)
|
|
||||||
- New-architecture devices (AVR8X mega and tiny) can access all
|
|
||||||
fuses, and memory display shows meaningful alias names
|
|
||||||
- The "safemode" feature has been removed. The major class of
|
|
||||||
programmers it has been designed for (lowlevel bitbang
|
|
||||||
programmers on parallel or serial ports) virtually doesn't exist
|
|
||||||
anymore, and the fuse combination that was covered by it do not
|
|
||||||
match the fuses of modern AVR devices anyway.
|
|
||||||
- avrdude.conf is now being looked up in the location of the
|
|
||||||
executable file first, before considering the configured default
|
|
||||||
location; this eases a "portable use" where the entire suite is
|
|
||||||
not installed into its configured default location. (Basically
|
|
||||||
only relevant for unixoid systems; on Windows, this search order
|
|
||||||
has been used for many years already.)
|
|
||||||
|
|
||||||
* New devices supported:
|
|
||||||
|
|
||||||
- ATtiny828, ATtiny87, ATtiny167, ATtiny48, ATtiny102, ATtiny104
|
|
||||||
- LGT8F88P, LGT8F168P, LGT8F328P (fixed names of these parts)
|
|
||||||
- ATmeg164A, ATmega169A, ATmega169P, ATmega169PA, ATmega329A,
|
|
||||||
ATmega329PA, ATmega3290, ATmega3290A, ATmega3290PA, ATmega649A,
|
|
||||||
ATmega649P, ATmega6490A, ATmega6490P, ATmega165, ATmega165A,
|
|
||||||
ATmega165P, ATmega165PA, ATmega325A, ATmega325P, ATmega325PA,
|
|
||||||
ATmega645A, ATmega645P, ATmega3250A, ATmega3250P, ATmega3250PA,
|
|
||||||
ATmega6450A, ATmega6450P
|
|
||||||
- ATmega48A/48PA/88A/88PA/168A/168PA, ATmega164A/644A/644PA,
|
|
||||||
ATmega16A/32A/64A/128A, ATtiny13A, ATtiny24A/44A/84A,
|
|
||||||
ATtiny261A/461A/861A, ATtiny828R, ATtiny2313A, ATtiny1634R
|
|
||||||
- ATtiny3224, ATtiny3226 and ATtiny3227
|
|
||||||
- AVR16DD14/20/28/32, AVR32DD14/20/28/32 and AVR64DD14/20/28/32
|
|
||||||
- AVR8EA28/32, AVR16EA28/32/48, AVR32EA28/32/48 and AVR64EA28/32/64
|
|
||||||
- ATmega16U4
|
|
||||||
|
|
||||||
|
|
||||||
* New programmers supported:
|
|
||||||
|
|
||||||
- SerialUPDI (UPDI devices connected to serial port with few
|
|
||||||
passive parts)
|
|
||||||
- PicKit4 / SNAP (now also in ISP and PDI mode)
|
|
||||||
- Teensy bootloader (PR #802)
|
|
||||||
- Micronucleus bootloader (PR #786)
|
|
||||||
- ft232h (generic variant, PR #842)
|
|
||||||
- Kristech KT-LINK FT2232H interface with IO switching and voltage
|
|
||||||
buffers (PR #930)
|
|
||||||
|
|
||||||
* Issues fixed:
|
|
||||||
|
|
||||||
- Curiosity Nano and terminal mode #790 (only the actual bugs
|
|
||||||
reported)
|
|
||||||
- CMake doesn't correctly handle conditionals in avrdude.conf.in
|
|
||||||
#776
|
|
||||||
- CMake doesn't detect FreeBSD's libusb-1.0 (compatibility) #775
|
|
||||||
- CMake doesn't correctly handle conditionals in avrdude.conf.in
|
|
||||||
#776
|
|
||||||
- CMake: Recognize more than just bison #785
|
|
||||||
- [bug #26007] ATTiny167 not supported #150
|
|
||||||
- [bug #47375] ATtiny102/104 descriptions missing in configuration
|
|
||||||
file #409
|
|
||||||
- No error message when connecting to a not-connected AVRISP mkII
|
|
||||||
programmer #813
|
|
||||||
- [bug #53180] missing programmer or bad -P option argument
|
|
||||||
doesn't result in error message #471
|
|
||||||
- ATmega328P reported as lgt8fx328p #812
|
|
||||||
- [bug #48004] Dead link for linuxgpio in avrdude description #419
|
|
||||||
- Segmentation fault when writing ATtiny104 fuse #823
|
|
||||||
- USBasp returns ERANGE for unknown error #848
|
|
||||||
- Compiler warnings #856
|
|
||||||
- Can't get serialupdi to work #874
|
|
||||||
- Rework HID support for Windows #881
|
|
||||||
- List of signing keys? #884
|
|
||||||
- Pickit4 UPDI is writing at offset 0x4000 into flash instead of 0x0000. #892
|
|
||||||
- SerialUPDI programmer can't write to usersig/userrow in terminal mode #889
|
|
||||||
- Signature read command for ATmega165* was wrong (no-id)
|
|
||||||
- Cannot use non-standard baud rates for uploading on MacOS #771
|
|
||||||
- Wrong values in avrdude.conf #897
|
|
||||||
- AVR-Eclipse plugin broken by missing -u commandline option #890
|
|
||||||
- Timeout passed to hid_read_timeout() is too short for instances
|
|
||||||
where the EDBG AVRISP 'Enter Programming Mode' command fails #900
|
|
||||||
- Terminal write mode doesn't support string input (yet) #913
|
|
||||||
- Terminal mode: memory fill with strings may cause Avrdude to crash. #922
|
|
||||||
- Some parts have wrong or missing ISP commands #915
|
|
||||||
- Incorrect -b conversion for linuxspi programmer #927
|
|
||||||
- ATtiny43U calibration memory size #921
|
|
||||||
|
|
||||||
* Pull requests:
|
|
||||||
|
|
||||||
- GitHub Migration #765
|
|
||||||
- Update toplevel files. #767
|
|
||||||
- GitHub Migration part 2 #768
|
|
||||||
- Remove 'windows' folder with giveio.sys driver #769
|
|
||||||
- SerialUPDI implementation - release candidate 1 #772
|
|
||||||
- Fix typos #777
|
|
||||||
- Fix memory leaks #779
|
|
||||||
- As promised, documentation for SerialUPDI programmer #782
|
|
||||||
- Improve CMake project #783
|
|
||||||
- Fix avr_read() for page reads #784
|
|
||||||
- Serialupdi manpage #787
|
|
||||||
- Add PicKit4 and SNAP programmers #791
|
|
||||||
- Use yacc/byacc as an alternative to bison, closes #785 #793
|
|
||||||
- Derive program version string from last commit #794
|
|
||||||
- Find 'avrdude.conf' based on absolute path to executable #780
|
|
||||||
- buspirate: fix -Wtautological-constant-out-of-range-compare #796
|
|
||||||
- avrftdi: don't use the deprecated ftdi_usb_purge_buffers routine #792
|
|
||||||
- Ignore ctags index file #804
|
|
||||||
- term: fix memleakOnRealloc #806
|
|
||||||
- Add missing ATtiny targets to avrdude.conf #803
|
|
||||||
- Add support for Teensy bootloader #802
|
|
||||||
- Conffile clean up #801
|
|
||||||
- Fix typos all over the code #807
|
|
||||||
- Add MSVC builds and better WinUSB/FTDI support #798
|
|
||||||
- buspirate: fix invalidScanfArgType_int warning #808
|
|
||||||
- Ignore ac_cfg.h.in~ #810
|
|
||||||
- Notify open failure #814
|
|
||||||
- Print expected part #817
|
|
||||||
- pindefs: conform to the function declaration #818
|
|
||||||
- Add support for Micronucleus bootloader #786
|
|
||||||
- Remove ac_cfg.h from libavrdude.h #820
|
|
||||||
- CMake: enable dynamic-link library for libavrdude #826
|
|
||||||
- Fix for TPI fuse write (issue #823) #828
|
|
||||||
- Add missing ATmega__5 and ATmega__9 targets to avrdude.conf #809
|
|
||||||
- Add missing ATmega and ATtiny targets #832
|
|
||||||
- Added missing RTS/DTR management feature to serialupdi
|
|
||||||
programmer #811
|
|
||||||
- Add missing tinyAVR-2, AVR DD and AVR EA targets #836
|
|
||||||
- Add a new programmer ft232h #842
|
|
||||||
- Reduce verbosity when setting fuses and uploading programs #845
|
|
||||||
- jtagmkii: Reduce the number of sync attempts to 10 + print
|
|
||||||
number of attempts #844
|
|
||||||
- CMake: add initial support for installing lib and include files #829
|
|
||||||
- Add SPI support to USBtiny #816
|
|
||||||
- Add more memory sections to read from #815
|
|
||||||
- Add a build script for Unix-like systems #849
|
|
||||||
- Fix receive buffer implementation in ftdi_syncbb programmer #843
|
|
||||||
- CMake: split configuration in two files #852
|
|
||||||
- Set number of connection retry attempts for Arduino/STK500
|
|
||||||
programmer #854
|
|
||||||
- Fix libusb-1.0 error strings #850
|
|
||||||
- Assign proper type to msg[] in errstr() #857
|
|
||||||
- Fix Arduino retry attempts #855
|
|
||||||
- CMake: use CMAKE_CURRENT_BINARY_DIR to locate avrdude.conf #858
|
|
||||||
- Remove the "safemode" feature. #859
|
|
||||||
- Add support for reading from more memory sections #863
|
|
||||||
- Alias keyword #868
|
|
||||||
- Add fuse name aliases to avrdude.conf + tweak update.c #869
|
|
||||||
- Print JTAG3 clocks after configuration + string formatting #853
|
|
||||||
- Tweak programmer info formatting strings #872
|
|
||||||
- Remove libhid support in ser_avrdoper.c in favor of libhidapi #882
|
|
||||||
- Reduce jtag3 output verbosity #877
|
|
||||||
- Fix Curiosity Nano target voltage #878
|
|
||||||
- Smallest possible fix for PL2303HX #885
|
|
||||||
- Add missing USBtiny derived programmers #873
|
|
||||||
- Cleanup of POSIX serial init code #886
|
|
||||||
- Avrdude terminal write improvements #880
|
|
||||||
- Add userrow and usersig aliases #888
|
|
||||||
- For UPDI devices do not add offset when accessing flash. #895
|
|
||||||
- Support both userrow and usersig names #893
|
|
||||||
- Fix ugly terminal write bug #896
|
|
||||||
- Improve terminal read functionality #894
|
|
||||||
- Macos nonstandard baudrates #898
|
|
||||||
- Fix errors in Avrdude.conf #899
|
|
||||||
- Minor terminal write improvements #902
|
|
||||||
- Term docs #903
|
|
||||||
- Add progressbar for read and write command #912
|
|
||||||
- Add MacOS serial/parallel port note #908
|
|
||||||
- Add ATmega16U4 to avrdude.conf #910
|
|
||||||
- Mask out unused ATmega32U4 efuse bits #909
|
|
||||||
- Increased timeout passed to hid_read_timeout() #901
|
|
||||||
- Add terminal write string functionality #914
|
|
||||||
- Update documentation link to new URL #929
|
|
||||||
- Fix terminal write buffer overflow issue #924
|
|
||||||
- Fix linuxspi baud to clock period calculation #931
|
|
||||||
- Added KT-LINK FT2232H interface with IO switching and voltage buffers. #930
|
|
||||||
|
|
||||||
* Internals:
|
|
||||||
|
|
||||||
- Development moved to Github
|
|
||||||
- Addition of "alias" keyword to avrdude.conf.in syntax; used
|
|
||||||
for fuse name aliases right now
|
|
||||||
|
|
||||||
|
|
||||||
Version 6.4:
|
Version 6.4:
|
||||||
|
|
||||||
* Major changes compared to the previous version:
|
* Major changes compared to the previous version:
|
||||||
|
@ -1239,7 +743,7 @@ Version 4.3.0:
|
||||||
* Added "Troubleshooting"-Appendix to the manual.
|
* Added "Troubleshooting"-Appendix to the manual.
|
||||||
|
|
||||||
* Add ATmega8515 support.
|
* Add ATmega8515 support.
|
||||||
Contributed by: Matthias Weißer <matthias@matwei.de>
|
Contributed by: Matthias Weißer <matthias@matwei.de>
|
||||||
|
|
||||||
* Add ATmega64 support.
|
* Add ATmega64 support.
|
||||||
Contributed by: Erik Christiansen <erik@dd.nec.com.au>
|
Contributed by: Erik Christiansen <erik@dd.nec.com.au>
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
See the documentation file for the details.
|
||||||
|
|
||||||
|
The latest version of AVRDUDE is always available here:
|
||||||
|
|
||||||
|
http://savannah.nongnu.org/projects/avrdude
|
||||||
|
|
||||||
|
|
||||||
|
Important environment variables for ./configure:
|
||||||
|
================================================
|
||||||
|
|
||||||
|
CPPFLAGS: C preprocessor flags (*not* "C++")
|
||||||
|
|
||||||
|
This is the place to put additional (non-standard) -I options into.
|
||||||
|
For example, if your Windows system has LibUSB-Win32 installed into
|
||||||
|
\\WINDOWS\ProgramFiles\LibUSB-Win32, use
|
||||||
|
|
||||||
|
CPPFLAGS=-I/WINDOWS/ProgramFiles/LibUSB-Win32/include
|
||||||
|
|
||||||
|
to tell configure where to search for the header files. (The use of
|
||||||
|
forward slashes rather than backslashes can often simplify things.
|
||||||
|
Note that the Windows system services internally treat both the same.
|
||||||
|
It's only cmd.exe which requires backslashes as the directory
|
||||||
|
separator.)
|
||||||
|
|
||||||
|
LDFLAGS: Linker options
|
||||||
|
|
||||||
|
This is the place to make additional library locations known to the
|
||||||
|
linker. To continue the above example, use
|
||||||
|
|
||||||
|
LDFLAGS=-L/WINDOWS/ProgramFiles/LibUSB-Win32/lib/gcc
|
||||||
|
|
||||||
|
to make the linker search for "libusb.a" in that directory.
|
||||||
|
|
||||||
|
|
||||||
|
Linux users: make sure the header files are installed
|
||||||
|
=====================================================
|
||||||
|
|
||||||
|
While many Linux distributions install the libraries needed by AVRDUDE
|
||||||
|
(libusb, libelf) by default, they leave out the corresponding header
|
||||||
|
files. Consequently, the configure script won't find them, so these
|
||||||
|
libraries could not be used.
|
||||||
|
|
||||||
|
Usually, the packages with the header files (and static libraries) are
|
||||||
|
derived from the regular package name by appending "-devel". Thus,
|
||||||
|
make sure you have "libusb-devel" and "libelf-devel" installed before
|
||||||
|
running the configure script. (Same goes for libftdi.)
|
|
@ -1,64 +0,0 @@
|
||||||
# AVRDUDE
|
|
||||||
|
|
||||||
[![Build Status](https://github.com/avrdudes/avrdude/actions/workflows/build.yml/badge.svg)](https://github.com/avrdudes/avrdude/actions/workflows/build.yml)
|
|
||||||
|
|
||||||
AVRDUDE - AVR Downloader Uploader - is a program for downloading and uploading
|
|
||||||
the on-chip memories of Microchip’s [AVR microcontrollers](https://en.wikipedia.org/wiki/AVR_microcontrollers).
|
|
||||||
It can program the Flash and EEPROM, and where supported by the programming
|
|
||||||
protocol, it can program fuse and lock bits.
|
|
||||||
AVRDUDE also supplies a direct instruction mode allowing one to issue any
|
|
||||||
programming instruction to the AVR chip regardless of whether AVRDUDE
|
|
||||||
implements that specific feature of a particular chip.
|
|
||||||
|
|
||||||
AVRDUDE was originally written in 2003 by Brian S. Dean. Since 2006, AVRDUDE has been maintained by Jörg Wunsch,
|
|
||||||
with the help of [various contributors](./AUTHORS).
|
|
||||||
|
|
||||||
The latest version of AVRDUDE is always available here:\
|
|
||||||
<https://github.com/avrdudes/avrdude>
|
|
||||||
|
|
||||||
## Documentation
|
|
||||||
|
|
||||||
Documentation for current and previous releases is [on Github Pages](https://avrdudes.github.io/avrdude/).
|
|
||||||
|
|
||||||
## Getting AVRDUDE for Windows
|
|
||||||
|
|
||||||
To get AVRDUDE for Windows, install the latest version from the [Releases](http://download.savannah.gnu.org/releases/avrdude/) page.
|
|
||||||
|
|
||||||
Alternatively, you may [build AVRDUDE](https://github.com/avrdudes/avrdude/wiki) yourself from source.
|
|
||||||
|
|
||||||
## Getting AVRDUDE for Linux
|
|
||||||
|
|
||||||
To install AVRDUDE for Linux, install the package `avrdude` by running the following commands:
|
|
||||||
|
|
||||||
```console
|
|
||||||
sudo apt-get install avrdude
|
|
||||||
```
|
|
||||||
|
|
||||||
Alternatively, you may [build AVRDUDE](https://github.com/avrdudes/avrdude/wiki) yourself from source.
|
|
||||||
|
|
||||||
## Getting AVRDUDE for MacOS
|
|
||||||
|
|
||||||
On MacOS, AVRDUDE can be installed through Mac Ports.
|
|
||||||
|
|
||||||
Alternatively, you may [build AVRDUDE](https://github.com/avrdudes/avrdude/wiki) yourself from source.
|
|
||||||
|
|
||||||
## Using AVRDUDE
|
|
||||||
|
|
||||||
AVRDUDE is a command-line application. Run the command `avrdude` without any arguments for a list of options.
|
|
||||||
|
|
||||||
A typical command to program your HEX file into your AVR microcontroller looks like this:
|
|
||||||
|
|
||||||
```console
|
|
||||||
avrdude -c <programmer> -p <part> -U flash:w:<file>:i
|
|
||||||
```
|
|
||||||
|
|
||||||
For instance, to program an **Arduino Uno** connected to the serial port **COM1** with a HEX file called `blink.hex`,
|
|
||||||
you would run the following command:
|
|
||||||
|
|
||||||
```console
|
|
||||||
avrdude -c arduino -P COM1 -b 115200 -p atmega328p -D -U flash:w:objs/blink.hex:i
|
|
||||||
```
|
|
||||||
|
|
||||||
There are many different programmers and options that may be required for the programming to succeed.
|
|
||||||
|
|
||||||
For more information, refer to the [AVRDUDE documentation](https://avrdudes.github.io/avrdude/).
|
|
224
README.md
224
README.md
|
@ -1,224 +0,0 @@
|
||||||
# AVRDUDE for Windows
|
|
||||||
|
|
||||||
[![Build Status](https://github.com/mariusgreuel/avrdude/actions/workflows/build.yml/badge.svg?branch=windows)](https://github.com/mariusgreuel/avrdude/actions/workflows/build.yml)
|
|
||||||
|
|
||||||
This is a fork of AVRDUDE from <https://github.com/avrdudes/avrdude>.
|
|
||||||
|
|
||||||
The purpose of this fork is to add better support for Windows to bring it on par with the Linux version of AVRDUDE.
|
|
||||||
|
|
||||||
Noteable changes include:
|
|
||||||
|
|
||||||
- [Support Atmel AVR programmers out of the box](#support-atmel-avr-programmers-out-of-the-box)
|
|
||||||
- [Support Micronucleus bootloader](#support-micronucleus-bootloader)
|
|
||||||
- [Support Teensy HalfKay bootloader](#support-teensy-halfkay-bootloader)
|
|
||||||
- [Support COM port discovery via USB VID/PID](#support-com-port-discovery-via-usb-vidpid)
|
|
||||||
- [Support Arduino Leonardo bootloader auto-reset](#support-arduino-leonardo-bootloader-auto-reset)
|
|
||||||
- [Support WinUSB devices via custom libusb](#support-winusb-devices-via-custom-libusb)
|
|
||||||
- [Support FTDI devices via custom libftdi](#support-ftdi-devices-via-custom-libftdi)
|
|
||||||
- [Support HID devices via libhidapi](#support-hid-devices-via-libhidapi)
|
|
||||||
- [Support Visual Studio](#support-visual-studio)
|
|
||||||
- [Miscellaneous bug-fixes and patches](#miscellaneous-bug-fixes-and-patches)
|
|
||||||
|
|
||||||
The original AVRDUDE project homepage can be found here <https://github.com/avrdudes/avrdude>.
|
|
||||||
|
|
||||||
## Documentation
|
|
||||||
|
|
||||||
Documentation for current and previous releases is [on Github Pages](https://avrdudes.github.io/avrdude/).
|
|
||||||
|
|
||||||
## Download
|
|
||||||
|
|
||||||
To get the latest version of **AVRDUDE for Windows**, go to the [releases folder](https://github.com/mariusgreuel/avrdude/releases):
|
|
||||||
|
|
||||||
<https://github.com/mariusgreuel/avrdude/releases>
|
|
||||||
|
|
||||||
## Feature Details
|
|
||||||
|
|
||||||
### Support Atmel AVR programmers out of the box
|
|
||||||
|
|
||||||
This build contains support for Atmel AVR programmers, such as
|
|
||||||
|
|
||||||
- [Atmel-ICE](https://www.microchip.com/DevelopmentTools/ProductDetails/ATATMEL-ICE) (Part Number: ATATMEL-ICE)
|
|
||||||
- [Atmel AVRISP mkII](https://www.microchip.com/DevelopmentTools/ProductDetails/PartNO/ATAVRISP2) (Part Number: ATAVRISP2)
|
|
||||||
|
|
||||||
This build does not rely on **libusb** drivers. Instead the default Atmel drivers can be used, allowing you to use AVRDUDE and Atmel Studio 7 side-by-side, without switching drivers.
|
|
||||||
|
|
||||||
If you previously changed the driver of your programmer to libusb, you should use **Windows Device Manager** to uninstall the device, and then reinstall using the default Windows drivers.
|
|
||||||
|
|
||||||
### Support Micronucleus bootloader
|
|
||||||
|
|
||||||
This build adds support for the [Micronucleus bootloader](https://github.com/micronucleus/micronucleus), so you do no longer need a separate command-line utility when working with devices that use the Micronucleus bootloader.
|
|
||||||
|
|
||||||
The Micronucleus bootloader is typically used on small ATtiny boards, such as **Digispark** (ATtiny85), **Digispark Pro** (ATtiny167), and the respective clones.
|
|
||||||
By default, it uses the USB VID/PID **16D0:0753** (MCS Digistump).
|
|
||||||
|
|
||||||
Since this bootloader is optimized for size, it implements writing to flash memory only.
|
|
||||||
As it does not support reading, you need to use the **-V** option to prevent AVRDUDE from verifing the flash memory. To have AVRDUDE wait for the device to be connected, use the extended option '-x wait'.
|
|
||||||
|
|
||||||
#### Example: Flashing a Micronucleus bootloader device
|
|
||||||
|
|
||||||
```console
|
|
||||||
avrdude -c micronucleus -p t85 -x wait -V -U flash:w:main.hex:i
|
|
||||||
```
|
|
||||||
|
|
||||||
### Support Teensy HalfKay bootloader
|
|
||||||
|
|
||||||
This build adds support for the [Teensy HalfKay bootloader](https://www.pjrc.com/teensy/halfkay_protocol.html), so you do no longer need a the Teensy Loader tool when working with Teensy devices.
|
|
||||||
|
|
||||||
Since this bootloader is optimized for size, it implements writing to flash memory only.
|
|
||||||
As it does not support reading, you need to use the **-V** option to prevent AVRDUDE from verifing the flash memory. To have AVRDUDE wait for the device to be connected, use the extended option '-x wait'.
|
|
||||||
|
|
||||||
Supported devices are:
|
|
||||||
|
|
||||||
- Teensy 1.0 (AT90USB162)
|
|
||||||
- Teensy 2.0 (ATmega32U4)
|
|
||||||
- Teensy++ 1.0 (AT90USB646)
|
|
||||||
- Teensy++ 2.0 (AT90USB1286)
|
|
||||||
|
|
||||||
#### Example: Flashing a Teensy 2.0 device
|
|
||||||
|
|
||||||
```console
|
|
||||||
avrdude -c teensy -p m32u4 -x wait -V -U flash:w:main.hex:i
|
|
||||||
```
|
|
||||||
|
|
||||||
### Support COM port discovery via USB VID/PID
|
|
||||||
|
|
||||||
Most Arduino boards use a USB-based virtual COM port, which is connected to some sort of bootloader. Since COM port numbers (COM1, COM2, ...) are determined by Windows, you first need to use Windows device manager to figure out the COM port before you can use AVRDUDE to flash the board. Alternatively, you may use Windows device manager to assign a COM port of your choice to the USB device. Additionally, the COM port of your Arduino board may change over time, for instance if you plug the device in a different USB port.
|
|
||||||
|
|
||||||
To simplify the discovery of your Arduino board, I provided the possibility to specify the USB vendor and product ID instead of the COM port.
|
|
||||||
|
|
||||||
For instance, to connect to an Arduino Leonardo, use the following command:
|
|
||||||
|
|
||||||
```console
|
|
||||||
avrdude -c avr109 -P usb:2341:0036 -p m32u4
|
|
||||||
```
|
|
||||||
|
|
||||||
Since the USB vendor and device ID **2341:0036** is the identical for all Leonardo boards, the command above will work regardless of which COM port was actually assigned to your board.
|
|
||||||
|
|
||||||
Note that can cannot use this method if you have more than one device of the same type (i.e. that share the same USB VID/PID) plugged into your computer. Also, some devices ship various versions of firmwares using different VID/PID.
|
|
||||||
|
|
||||||
To figure out the USB VID and PID, you may use **Windows devices manager** (see the **Hardware IDs** of the **Details tab** of the USB device), or look it up in the official list of Arduino devices:
|
|
||||||
<https://github.com/arduino/ArduinoCore-avr/blob/master/boards.txt>
|
|
||||||
|
|
||||||
USB VID/PID pairs for some popular boards and the respective commands are:
|
|
||||||
|
|
||||||
- Arduino Uno Rev 3: **2A03:0043** -> `avrdude -c arduino -P usb:2A03:0043 -p m328p`
|
|
||||||
- Arduino Micro: **2341:0037** -> `avrdude -c avr109 -P usb:2341:0037 -p m32u4`
|
|
||||||
- Arduino Leonardo: **2341:0036** -> `avrdude -c avr109 -P usb:2341:0036 -p m32u4`
|
|
||||||
- Sparkfun Pro Micro (5V): **1B4F:9205** -> `avrdude -c avr109 -P usb:1B4F:9205 -p m32u4`
|
|
||||||
- Sparkfun Pro Micro (3.3V): **1B4F:9203** -> `avrdude -c avr109 -P usb:1B4F:9203 -p m32u4`
|
|
||||||
- Adafruit Circuit Playground: **239A:0011** -> `avrdude -c avr109 -P usb:239A:0011 -p m32u4`
|
|
||||||
|
|
||||||
### Support Arduino Leonardo bootloader auto-reset
|
|
||||||
|
|
||||||
Before any Arduino board may be flashed via the bootloader, you need to kick it into bootloader mode first. This can done manually by pressing the reset button, or automatically via an special auto-reset mechanism: For boards with a USB to serial converter chip (such as Arduino Uno or Nano), the tool needs to pull the DTR signal to low, which will briefly pull the RESET pin of the microcontroller to low. For boards with a direct USB connection (such as Arduino Leonardo or Micro), the sketch typically implements a serial port via a USB composite device with a virtual COM port. To perform the auto-reset, the sketch implements a hack that resets the device into bootloader mode when the COM port is opened with a baudrate of 1200bps. To make matters even more complicated, the bootloader COM port has a different USB VID:PID pair than the sketch COM port, which causes the COM port to change while performing the reset.
|
|
||||||
|
|
||||||
To simplify the process of auto-resetting the board, this version will auto-reset the device when AVRDUDE detects that the device is running in sketch mode. Note that the sketch is required to implement a USB composite device with a virtual COM port with a matching USB VID:PID, which is implemented in the Arduino core software.
|
|
||||||
|
|
||||||
### Support WinUSB devices via custom libusb
|
|
||||||
|
|
||||||
Since AVRDUDE originated from Unix, the USB support in AVRDUDE is built upon the Unix-based USB library [libusb](https://sourceforge.net/projects/libusb/). In order to support Windows, libusb has been ported to Windows [libusb-win32](https://sourceforge.net/projects/libusb-win32/).
|
|
||||||
|
|
||||||
The downside of using libusb-win32 is that it requires the user to manually install a kernel-mode driver (libusb0.sys or libusbk.sys) instead of the manufacturer supplied Windows driver. There are several hacks to accomplish this, such as the [Zadig driver installation utility](https://zadig.akeo.ie/), which installs a self-signed root certificate in the Windows driver store due to the lack of proper driver installation packages.
|
|
||||||
|
|
||||||
This build contains a custom library called **libwinusb**, which implements a sub-set of the libusb-win32 API. The libwinusb implementation supports both the **winusb.sys** driver, and the **libusb0.sys** driver as well. This patch has a number of advantages, such as
|
|
||||||
|
|
||||||
- Many USB devices that ship with WinUSB drivers, such as Atmel programmer, will run out of the box.
|
|
||||||
- Works with both WinUSB and libusb: You can use either Windows built-in WinUSB driver to access your USB devices, or keep using the libusb drivers if you have them installed already.
|
|
||||||
- No static dependency to libusb0.dll: You cannot run the original version AVRDUDE, unless you previously installed libusb. On systems where libusb is not installed, this build eliminates the error "The code execution cannot proceed because libusb0.dll was not found. Reinstalling the program may fix this problem".
|
|
||||||
|
|
||||||
#### Microsoft OS descriptors and firmware examples
|
|
||||||
|
|
||||||
Windows provides a mechanism to automatically load the built-in WinUSB driver without providing a driver installation package (INF file). The automatic WinUSB driver installation is triggered via a special [Microsoft OS descriptor](https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors) that must be present in the firmware of the USB device.
|
|
||||||
|
|
||||||
To demonstrate how this works, I added Microsoft OS descriptors to the following projects:
|
|
||||||
|
|
||||||
- **USBasp** - USB programmer for Atmel AVR controllers: <https://github.com/mariusgreuel/USBasp>
|
|
||||||
|
|
||||||
- **FabISP** a.k.a **USBtinyISP** - A fab-able in-system programmer: <https://github.com/mariusgreuel/FabISP>
|
|
||||||
|
|
||||||
- **Micronucleus** - ATtiny USB bootloader with a strong emphasis on bootloader compactness: <https://github.com/mariusgreuel/micronucleus>
|
|
||||||
|
|
||||||
### Support FTDI devices via custom libftdi
|
|
||||||
|
|
||||||
In order to support FTDI devices, AVRDUDE uses the Unix-based library [libftdi1](https://www.intra2net.com/en/developer/libftdi/). Similar to libusb, the libftdi1 library does not play nice on Windows: On Windows, FTDI devices load the manufacturer supplied driver via plug-and-play. The FTDI drivers implement an API via the FTDI D2XX DLLs. However, libftdi1 cannot use the D2XX interface, so it will not work with the plug-and-play drivers.
|
|
||||||
|
|
||||||
This build contains a patches library of **libftdi**. The patches load the D2XX DLLs to support FTDI devices, so FTDI devices will just work.
|
|
||||||
|
|
||||||
### Support HID devices via libhidapi
|
|
||||||
|
|
||||||
This build include the WIN32 version of libhidapi, and some patches, to allow HID devices to work out of the box.
|
|
||||||
|
|
||||||
### Support Visual Studio
|
|
||||||
|
|
||||||
This build adds support for **Microsoft Visual Studio**. Building AVRDUDE with Microsoft Visual C/C++ will give you the best user and debugging experience while working on Windows.
|
|
||||||
|
|
||||||
### Miscellaneous bug-fixes and patches
|
|
||||||
|
|
||||||
- This build fixes [bug #54159: Buffer overflow in usbtiny.c](http://savannah.nongnu.org/bugs/?54159), which causes AVRDUDE to crash when using the USBtiny programmer.
|
|
||||||
|
|
||||||
- Support new microcontroller: ATtiny167
|
|
||||||
|
|
||||||
## Releases
|
|
||||||
|
|
||||||
You can find the latest releases of **AVRDUDE for Windows** here:
|
|
||||||
|
|
||||||
<https://github.com/mariusgreuel/avrdude/releases>
|
|
||||||
|
|
||||||
## Users manual
|
|
||||||
|
|
||||||
You can find the original users manual (does not contain AVRDUDE for Windows extras) of AVRDUDE here:
|
|
||||||
|
|
||||||
<https://www.nongnu.org/avrdude/user-manual/avrdude.html>
|
|
||||||
|
|
||||||
## Build
|
|
||||||
|
|
||||||
The build instructions have been moved here:\
|
|
||||||
<https://github.com/avrdudes/avrdude/wiki>
|
|
||||||
|
|
||||||
### Building AVRDUDE for Windows using MSVC
|
|
||||||
|
|
||||||
#### Windows Prerequisites
|
|
||||||
|
|
||||||
In order to build AVRDUDE on Windows, you need:
|
|
||||||
|
|
||||||
- Flex and Bison installed, for instance via [Chocolatey](https://chocolatey.org/)
|
|
||||||
- Microsoft Visual Studio 2019 with **Desktop development with C++** and **CMake** enabled
|
|
||||||
|
|
||||||
#### Windows Build Instructions
|
|
||||||
|
|
||||||
To build AVRDUDE on Windows, do the following:
|
|
||||||
|
|
||||||
- `git clone --branch windows https://github.com/mariusgreuel/avrdude`
|
|
||||||
- Open the folder **avrdude** using the menu item **File->Open->Folder**
|
|
||||||
- Build the project using the menu item **Build->Build All**
|
|
||||||
|
|
||||||
### Linux udev rules
|
|
||||||
|
|
||||||
If you intent to use either the Micronucleus or Teensy bootloader, you should edit the udev rules so that you can run AVRDUDE without root.
|
|
||||||
|
|
||||||
For instance, if you are on Ubuntu and you installed the avrdude package, you would edit `/lib/udev/rules.d/60-avrdude.rules` and add the following rules:
|
|
||||||
|
|
||||||
```console
|
|
||||||
# Micronucleus Bootloader
|
|
||||||
SUBSYSTEM=="usb", ATTR{idVendor}=="16d0", ATTR{idProduct}=="0753", TAG+="uaccess"
|
|
||||||
# Teensy Bootloader
|
|
||||||
SUBSYSTEM=="usb", ATTR{idVendor}=="16c0", ATTR{idProduct}=="0478", TAG+="uaccess"
|
|
||||||
```
|
|
||||||
|
|
||||||
## Troubleshooting Tips & Tricks
|
|
||||||
|
|
||||||
### Atmel DFU Device driver broken
|
|
||||||
|
|
||||||
The current version of the Atmel DFU drivers that are distributed via the Windows Update are goofed up (@Atmel: It might have something to do with the fact that you commented out the CopyFiles sections!).
|
|
||||||
Symptoms are:
|
|
||||||
|
|
||||||
- You cannot use AVRDUDE to connect to an Atmel DFU device, and you get the error message "No matching USB device found".
|
|
||||||
- When installing the drivers via Windows Update, you get the error message "Windows encountered a problem installing the drivers for your device" and "A service installation section in this INF is invalid."
|
|
||||||
- In Windows Device Manager, the Atmel DFU device shows up as an unknown device.
|
|
||||||
|
|
||||||
You should use an older driver package that does not contain this bug.
|
|
||||||
|
|
||||||
### Outdated libusb0 driver
|
|
||||||
|
|
||||||
The most current version of libusb0.sys is 1.2.6.0, signed on 12/17/2012 by Travis Lee Robinson. If you are using an older version (check with Windows Device Manager), you may not be able to connect to your USB devices using the libusb0 driver.
|
|
||||||
|
|
|
@ -38,13 +38,14 @@
|
||||||
#include "arduino.h"
|
#include "arduino.h"
|
||||||
|
|
||||||
/* read signature bytes - arduino version */
|
/* read signature bytes - arduino version */
|
||||||
static int arduino_read_sig_bytes(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *m) {
|
static int arduino_read_sig_bytes(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m)
|
||||||
|
{
|
||||||
unsigned char buf[32];
|
unsigned char buf[32];
|
||||||
|
|
||||||
/* Signature byte reads are always 3 bytes. */
|
/* Signature byte reads are always 3 bytes. */
|
||||||
|
|
||||||
if (m->size < 3) {
|
if (m->size < 3) {
|
||||||
pmsg_error("memsize too small for sig byte read");
|
avrdude_message(MSG_INFO, "%s: memsize too small for sig byte read", progname);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -56,16 +57,19 @@ static int arduino_read_sig_bytes(const PROGRAMMER *pgm, const AVRPART *p, const
|
||||||
if (serial_recv(&pgm->fd, buf, 5) < 0)
|
if (serial_recv(&pgm->fd, buf, 5) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
if (buf[0] == Resp_STK_NOSYNC) {
|
if (buf[0] == Resp_STK_NOSYNC) {
|
||||||
pmsg_error("programmer is out of sync\n");
|
avrdude_message(MSG_INFO, "%s: stk500_cmd(): programmer is out of sync\n",
|
||||||
|
progname);
|
||||||
return -1;
|
return -1;
|
||||||
} else if (buf[0] != Resp_STK_INSYNC) {
|
} else if (buf[0] != Resp_STK_INSYNC) {
|
||||||
msg_error("\n");
|
avrdude_message(MSG_INFO, "\n%s: arduino_read_sig_bytes(): (a) protocol error, "
|
||||||
pmsg_error("protocol expects sync byte 0x%02x but got 0x%02x\n", Resp_STK_INSYNC, buf[0]);
|
"expect=0x%02x, resp=0x%02x\n",
|
||||||
return -2;
|
progname, Resp_STK_INSYNC, buf[0]);
|
||||||
|
return -2;
|
||||||
}
|
}
|
||||||
if (buf[4] != Resp_STK_OK) {
|
if (buf[4] != Resp_STK_OK) {
|
||||||
msg_error("\n");
|
avrdude_message(MSG_INFO, "\n%s: arduino_read_sig_bytes(): (a) protocol error, "
|
||||||
pmsg_error("protocol expects OK byte 0x%02x but got 0x%02x\n", Resp_STK_OK, buf[4]);
|
"expect=0x%02x, resp=0x%02x\n",
|
||||||
|
progname, Resp_STK_OK, buf[4]);
|
||||||
return -3;
|
return -3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -76,11 +80,11 @@ static int arduino_read_sig_bytes(const PROGRAMMER *pgm, const AVRPART *p, const
|
||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int arduino_open(PROGRAMMER *pgm, const char *port) {
|
static int arduino_open(PROGRAMMER * pgm, char * port)
|
||||||
|
{
|
||||||
union pinfo pinfo;
|
union pinfo pinfo;
|
||||||
strcpy(pgm->port, port);
|
strcpy(pgm->port, port);
|
||||||
pinfo.serialinfo.baud = pgm->baudrate? pgm->baudrate: 115200;
|
pinfo.baud = pgm->baudrate? pgm->baudrate: 115200;
|
||||||
pinfo.serialinfo.cflags = SERIAL_8N1;
|
|
||||||
if (serial_open(port, pinfo, &pgm->fd)==-1) {
|
if (serial_open(port, pinfo, &pgm->fd)==-1) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -113,7 +117,8 @@ static void arduino_close(PROGRAMMER * pgm)
|
||||||
|
|
||||||
const char arduino_desc[] = "Arduino programmer";
|
const char arduino_desc[] = "Arduino programmer";
|
||||||
|
|
||||||
void arduino_initpgm(PROGRAMMER *pgm) {
|
void arduino_initpgm(PROGRAMMER * pgm)
|
||||||
|
{
|
||||||
/* This is mostly a STK500; just the signature is read
|
/* This is mostly a STK500; just the signature is read
|
||||||
differently than on real STK500v1
|
differently than on real STK500v1
|
||||||
and the DTR signal is set when opening the serial port
|
and the DTR signal is set when opening the serial port
|
||||||
|
@ -124,6 +129,4 @@ void arduino_initpgm(PROGRAMMER *pgm) {
|
||||||
pgm->read_sig_bytes = arduino_read_sig_bytes;
|
pgm->read_sig_bytes = arduino_read_sig_bytes;
|
||||||
pgm->open = arduino_open;
|
pgm->open = arduino_open;
|
||||||
pgm->close = arduino_close;
|
pgm->close = arduino_close;
|
||||||
|
|
||||||
disable_trailing_ff_removal(); /* so that arduino bootloader can ignore chip erase */
|
|
||||||
}
|
}
|
|
@ -22,7 +22,7 @@
|
||||||
#define arduino_h__
|
#define arduino_h__
|
||||||
|
|
||||||
extern const char arduino_desc[];
|
extern const char arduino_desc[];
|
||||||
void arduino_initpgm(PROGRAMMER *pgm);
|
void arduino_initpgm (PROGRAMMER * pgm);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -57,7 +57,8 @@ struct pdata
|
||||||
static void avr910_setup(PROGRAMMER * pgm)
|
static void avr910_setup(PROGRAMMER * pgm)
|
||||||
{
|
{
|
||||||
if ((pgm->cookie = malloc(sizeof(struct pdata))) == 0) {
|
if ((pgm->cookie = malloc(sizeof(struct pdata))) == 0) {
|
||||||
pmsg_error("out of memory allocating private data\n");
|
avrdude_message(MSG_INFO, "%s: avr910_setup(): Out of memory allocating private data\n",
|
||||||
|
progname);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
memset(pgm->cookie, 0, sizeof(struct pdata));
|
memset(pgm->cookie, 0, sizeof(struct pdata));
|
||||||
|
@ -70,34 +71,40 @@ static void avr910_teardown(PROGRAMMER * pgm)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int avr910_send(const PROGRAMMER *pgm, char *buf, size_t len) {
|
static int avr910_send(PROGRAMMER * pgm, char * buf, size_t len)
|
||||||
|
{
|
||||||
return serial_send(&pgm->fd, (unsigned char *)buf, len);
|
return serial_send(&pgm->fd, (unsigned char *)buf, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int avr910_recv(const PROGRAMMER *pgm, char *buf, size_t len) {
|
static int avr910_recv(PROGRAMMER * pgm, char * buf, size_t len)
|
||||||
|
{
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
rv = serial_recv(&pgm->fd, (unsigned char *)buf, len);
|
rv = serial_recv(&pgm->fd, (unsigned char *)buf, len);
|
||||||
if (rv < 0) {
|
if (rv < 0) {
|
||||||
pmsg_error("programmer is not responding\n");
|
avrdude_message(MSG_INFO, "%s: avr910_recv(): programmer is not responding\n",
|
||||||
|
progname);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int avr910_drain(const PROGRAMMER *pgm, int display) {
|
static int avr910_drain(PROGRAMMER * pgm, int display)
|
||||||
|
{
|
||||||
return serial_drain(&pgm->fd, display);
|
return serial_drain(&pgm->fd, display);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int avr910_vfy_cmd_sent(const PROGRAMMER *pgm, char *errmsg) {
|
static int avr910_vfy_cmd_sent(PROGRAMMER * pgm, char * errmsg)
|
||||||
|
{
|
||||||
char c;
|
char c;
|
||||||
|
|
||||||
avr910_recv(pgm, &c, 1);
|
avr910_recv(pgm, &c, 1);
|
||||||
if (c != '\r') {
|
if (c != '\r') {
|
||||||
pmsg_error("programmer did not respond to command: %s\n", errmsg);
|
avrdude_message(MSG_INFO, "%s: error: programmer did not respond to command: %s\n",
|
||||||
|
progname, errmsg);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -107,7 +114,8 @@ static int avr910_vfy_cmd_sent(const PROGRAMMER *pgm, char *errmsg) {
|
||||||
/*
|
/*
|
||||||
* issue the 'chip erase' command to the AVR device
|
* issue the 'chip erase' command to the AVR device
|
||||||
*/
|
*/
|
||||||
static int avr910_chip_erase(const PROGRAMMER *pgm, const AVRPART *p) {
|
static int avr910_chip_erase(PROGRAMMER * pgm, AVRPART * p)
|
||||||
|
{
|
||||||
avr910_send(pgm, "e", 1);
|
avr910_send(pgm, "e", 1);
|
||||||
if (avr910_vfy_cmd_sent(pgm, "chip erase") < 0)
|
if (avr910_vfy_cmd_sent(pgm, "chip erase") < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -121,13 +129,15 @@ static int avr910_chip_erase(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int avr910_enter_prog_mode(const PROGRAMMER *pgm) {
|
static int avr910_enter_prog_mode(PROGRAMMER * pgm)
|
||||||
|
{
|
||||||
avr910_send(pgm, "P", 1);
|
avr910_send(pgm, "P", 1);
|
||||||
return avr910_vfy_cmd_sent(pgm, "enter prog mode");
|
return avr910_vfy_cmd_sent(pgm, "enter prog mode");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int avr910_leave_prog_mode(const PROGRAMMER *pgm) {
|
static int avr910_leave_prog_mode(PROGRAMMER * pgm)
|
||||||
|
{
|
||||||
avr910_send(pgm, "L", 1);
|
avr910_send(pgm, "L", 1);
|
||||||
return avr910_vfy_cmd_sent(pgm, "leave prog mode");
|
return avr910_vfy_cmd_sent(pgm, "leave prog mode");
|
||||||
}
|
}
|
||||||
|
@ -136,7 +146,8 @@ static int avr910_leave_prog_mode(const PROGRAMMER *pgm) {
|
||||||
/*
|
/*
|
||||||
* issue the 'program enable' command to the AVR device
|
* issue the 'program enable' command to the AVR device
|
||||||
*/
|
*/
|
||||||
static int avr910_program_enable(const PROGRAMMER *pgm, const AVRPART *p) {
|
static int avr910_program_enable(PROGRAMMER * pgm, AVRPART * p)
|
||||||
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -144,7 +155,8 @@ static int avr910_program_enable(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
/*
|
/*
|
||||||
* initialize the AVR device and prepare it to accept commands
|
* initialize the AVR device and prepare it to accept commands
|
||||||
*/
|
*/
|
||||||
static int avr910_initialize(const PROGRAMMER *pgm, const AVRPART *p) {
|
static int avr910_initialize(PROGRAMMER * pgm, AVRPART * p)
|
||||||
|
{
|
||||||
char id[8];
|
char id[8];
|
||||||
char sw[2];
|
char sw[2];
|
||||||
char hw[2];
|
char hw[2];
|
||||||
|
@ -173,16 +185,16 @@ static int avr910_initialize(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
avr910_send(pgm, "p", 1);
|
avr910_send(pgm, "p", 1);
|
||||||
avr910_recv(pgm, &type, 1);
|
avr910_recv(pgm, &type, 1);
|
||||||
|
|
||||||
msg_notice("Programmer id = %s; type = %c\n", id, type);
|
avrdude_message(MSG_INFO, "Found programmer: Id = \"%s\"; type = %c\n", id, type);
|
||||||
msg_notice("Software version = %c.%c; ", sw[0], sw[1]);
|
avrdude_message(MSG_INFO, " Software Version = %c.%c; ", sw[0], sw[1]);
|
||||||
msg_notice("Hardware version = %c.%c\n", hw[0], hw[1]);
|
avrdude_message(MSG_INFO, "Hardware Version = %c.%c\n", hw[0], hw[1]);
|
||||||
|
|
||||||
/* See if programmer supports autoincrement of address. */
|
/* See if programmer supports autoincrement of address. */
|
||||||
|
|
||||||
avr910_send(pgm, "a", 1);
|
avr910_send(pgm, "a", 1);
|
||||||
avr910_recv(pgm, &PDATA(pgm)->has_auto_incr_addr, 1);
|
avr910_recv(pgm, &PDATA(pgm)->has_auto_incr_addr, 1);
|
||||||
if (PDATA(pgm)->has_auto_incr_addr == 'Y')
|
if (PDATA(pgm)->has_auto_incr_addr == 'Y')
|
||||||
msg_notice("programmer supports auto addr increment\n");
|
avrdude_message(MSG_INFO, "Programmer supports auto addr increment.\n");
|
||||||
|
|
||||||
/* Check support for buffered memory access, ignore if not available */
|
/* Check support for buffered memory access, ignore if not available */
|
||||||
|
|
||||||
|
@ -194,8 +206,8 @@ static int avr910_initialize(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
PDATA(pgm)->buffersize = (unsigned int)(unsigned char)c<<8;
|
PDATA(pgm)->buffersize = (unsigned int)(unsigned char)c<<8;
|
||||||
avr910_recv(pgm, &c, 1);
|
avr910_recv(pgm, &c, 1);
|
||||||
PDATA(pgm)->buffersize += (unsigned int)(unsigned char)c;
|
PDATA(pgm)->buffersize += (unsigned int)(unsigned char)c;
|
||||||
msg_notice("programmer supports buffered memory access with "
|
avrdude_message(MSG_INFO, "Programmer supports buffered memory access with "
|
||||||
"buffersize = %u bytes\n",
|
"buffersize = %u bytes.\n",
|
||||||
PDATA(pgm)->buffersize);
|
PDATA(pgm)->buffersize);
|
||||||
PDATA(pgm)->use_blockmode = 1;
|
PDATA(pgm)->use_blockmode = 1;
|
||||||
} else {
|
} else {
|
||||||
|
@ -212,7 +224,7 @@ static int avr910_initialize(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
/* Get list of devices that the programmer supports. */
|
/* Get list of devices that the programmer supports. */
|
||||||
|
|
||||||
avr910_send(pgm, "t", 1);
|
avr910_send(pgm, "t", 1);
|
||||||
msg_notice2("\nProgrammer supports the following devices:\n");
|
avrdude_message(MSG_INFO, "\nProgrammer supports the following devices:\n");
|
||||||
devtype_1st = 0;
|
devtype_1st = 0;
|
||||||
while (1) {
|
while (1) {
|
||||||
avr910_recv(pgm, &c, 1);
|
avr910_recv(pgm, &c, 1);
|
||||||
|
@ -222,22 +234,20 @@ static int avr910_initialize(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
break;
|
break;
|
||||||
part = locate_part_by_avr910_devcode(part_list, c);
|
part = locate_part_by_avr910_devcode(part_list, c);
|
||||||
|
|
||||||
msg_notice2(" Device code: 0x%02x = %s\n", c & 0xff, part? part->desc: "(unknown)");
|
avrdude_message(MSG_INFO, " Device code: 0x%02x = %s\n", c, part ? part->desc : "(unknown)");
|
||||||
|
|
||||||
/* FIXME: Need to lookup devcode and report the device. */
|
/* FIXME: Need to lookup devcode and report the device. */
|
||||||
|
|
||||||
if (p->avr910_devcode == c)
|
if (p->avr910_devcode == c)
|
||||||
dev_supported = 1;
|
dev_supported = 1;
|
||||||
};
|
};
|
||||||
msg_notice2("\n");
|
avrdude_message(MSG_INFO, "\n");
|
||||||
|
|
||||||
if (!dev_supported) {
|
if (!dev_supported) {
|
||||||
if(ovsigck)
|
avrdude_message(MSG_INFO, "%s: %s: selected device is not supported by programmer: %s\n",
|
||||||
pmsg_warning("selected device is not supported by programmer %s\n", p->id);
|
progname, ovsigck? "warning": "error", p->id);
|
||||||
else {
|
if (!ovsigck)
|
||||||
pmsg_error("selected device is not supported by programmer %s\n", p->id);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
/* If the user forced the selection, use the first device
|
/* If the user forced the selection, use the first device
|
||||||
type that is supported by the programmer. */
|
type that is supported by the programmer. */
|
||||||
|
@ -254,7 +264,8 @@ static int avr910_initialize(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
avr910_send(pgm, buf, 2);
|
avr910_send(pgm, buf, 2);
|
||||||
avr910_vfy_cmd_sent(pgm, "select device");
|
avr910_vfy_cmd_sent(pgm, "select device");
|
||||||
|
|
||||||
pmsg_notice("avr910_devcode selected: 0x%02x\n", (unsigned) buf[1]);
|
avrdude_message(MSG_NOTICE, "%s: avr910_devcode selected: 0x%02x\n",
|
||||||
|
progname, (unsigned)buf[1]);
|
||||||
|
|
||||||
avr910_enter_prog_mode(pgm);
|
avr910_enter_prog_mode(pgm);
|
||||||
|
|
||||||
|
@ -262,14 +273,16 @@ static int avr910_initialize(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void avr910_disable(const PROGRAMMER *pgm) {
|
static void avr910_disable(PROGRAMMER * pgm)
|
||||||
|
{
|
||||||
/* Do nothing. */
|
/* Do nothing. */
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void avr910_enable(PROGRAMMER *pgm, const AVRPART *p) {
|
static void avr910_enable(PROGRAMMER * pgm)
|
||||||
|
{
|
||||||
/* Do nothing. */
|
/* Do nothing. */
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
@ -280,7 +293,7 @@ static void avr910_enable(PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
* transmit an AVR device command and return the results; 'cmd' and
|
* transmit an AVR device command and return the results; 'cmd' and
|
||||||
* 'res' must point to at least a 4 byte data buffer
|
* 'res' must point to at least a 4 byte data buffer
|
||||||
*/
|
*/
|
||||||
static int avr910_cmd(const PROGRAMMER *pgm, const unsigned char *cmd,
|
static int avr910_cmd(PROGRAMMER * pgm, const unsigned char *cmd,
|
||||||
unsigned char *res)
|
unsigned char *res)
|
||||||
{
|
{
|
||||||
char buf[5];
|
char buf[5];
|
||||||
|
@ -305,7 +318,8 @@ static int avr910_cmd(const PROGRAMMER *pgm, const unsigned char *cmd,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int avr910_parseextparms(const PROGRAMMER *pgm, const LISTID extparms) {
|
static int avr910_parseextparms(PROGRAMMER * pgm, LISTID extparms)
|
||||||
|
{
|
||||||
LNODEID ln;
|
LNODEID ln;
|
||||||
const char *extended_param;
|
const char *extended_param;
|
||||||
int rv = 0;
|
int rv = 0;
|
||||||
|
@ -317,23 +331,27 @@ static int avr910_parseextparms(const PROGRAMMER *pgm, const LISTID extparms) {
|
||||||
int devcode;
|
int devcode;
|
||||||
if (sscanf(extended_param, "devcode=%i", &devcode) != 1 ||
|
if (sscanf(extended_param, "devcode=%i", &devcode) != 1 ||
|
||||||
devcode <= 0 || devcode > 255) {
|
devcode <= 0 || devcode > 255) {
|
||||||
pmsg_error("invalid devcode '%s'\n", extended_param);
|
avrdude_message(MSG_INFO, "%s: avr910_parseextparms(): invalid devcode '%s'\n",
|
||||||
|
progname, extended_param);
|
||||||
rv = -1;
|
rv = -1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
pmsg_notice2("avr910_parseextparms(): devcode overwritten as 0x%02x\n", devcode);
|
avrdude_message(MSG_NOTICE2, "%s: avr910_parseextparms(): devcode overwritten as 0x%02x\n",
|
||||||
|
progname, devcode);
|
||||||
PDATA(pgm)->devcode = devcode;
|
PDATA(pgm)->devcode = devcode;
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (strncmp(extended_param, "no_blockmode", strlen("no_blockmode")) == 0) {
|
if (strncmp(extended_param, "no_blockmode", strlen("no_blockmode")) == 0) {
|
||||||
pmsg_notice2("avr910_parseextparms(-x): no testing for Blockmode\n");
|
avrdude_message(MSG_NOTICE2, "%s: avr910_parseextparms(-x): no testing for Blockmode\n",
|
||||||
|
progname);
|
||||||
PDATA(pgm)->test_blockmode = 0;
|
PDATA(pgm)->test_blockmode = 0;
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
pmsg_error("invalid extended parameter '%s'\n", extended_param);
|
avrdude_message(MSG_INFO, "%s: avr910_parseextparms(): invalid extended parameter '%s'\n",
|
||||||
|
progname, extended_param);
|
||||||
rv = -1;
|
rv = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -341,7 +359,8 @@ static int avr910_parseextparms(const PROGRAMMER *pgm, const LISTID extparms) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int avr910_open(PROGRAMMER *pgm, const char *port) {
|
static int avr910_open(PROGRAMMER * pgm, char * port)
|
||||||
|
{
|
||||||
union pinfo pinfo;
|
union pinfo pinfo;
|
||||||
/*
|
/*
|
||||||
* If baudrate was not specified use 19.200 Baud
|
* If baudrate was not specified use 19.200 Baud
|
||||||
|
@ -351,8 +370,7 @@ static int avr910_open(PROGRAMMER *pgm, const char *port) {
|
||||||
}
|
}
|
||||||
|
|
||||||
strcpy(pgm->port, port);
|
strcpy(pgm->port, port);
|
||||||
pinfo.serialinfo.baud = pgm->baudrate;
|
pinfo.baud = pgm->baudrate;
|
||||||
pinfo.serialinfo.cflags = SERIAL_8N1;
|
|
||||||
if (serial_open(port, pinfo, &pgm->fd)==-1) {
|
if (serial_open(port, pinfo, &pgm->fd)==-1) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -374,12 +392,14 @@ static void avr910_close(PROGRAMMER * pgm)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void avr910_display(const PROGRAMMER *pgm, const char *p) {
|
static void avr910_display(PROGRAMMER * pgm, const char * p)
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void avr910_set_addr(const PROGRAMMER *pgm, unsigned long addr) {
|
static void avr910_set_addr(PROGRAMMER * pgm, unsigned long addr)
|
||||||
|
{
|
||||||
char cmd[3];
|
char cmd[3];
|
||||||
|
|
||||||
cmd[0] = 'A';
|
cmd[0] = 'A';
|
||||||
|
@ -391,7 +411,7 @@ static void avr910_set_addr(const PROGRAMMER *pgm, unsigned long addr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int avr910_write_byte(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *m,
|
static int avr910_write_byte(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||||
unsigned long addr, unsigned char value)
|
unsigned long addr, unsigned char value)
|
||||||
{
|
{
|
||||||
char cmd[2];
|
char cmd[2];
|
||||||
|
@ -424,7 +444,7 @@ static int avr910_write_byte(const PROGRAMMER *pgm, const AVRPART *p, const AVRM
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int avr910_read_byte_flash(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *m,
|
static int avr910_read_byte_flash(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||||
unsigned long addr, unsigned char * value)
|
unsigned long addr, unsigned char * value)
|
||||||
{
|
{
|
||||||
char buf[2];
|
char buf[2];
|
||||||
|
@ -447,7 +467,7 @@ static int avr910_read_byte_flash(const PROGRAMMER *pgm, const AVRPART *p, const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int avr910_read_byte_eeprom(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *m,
|
static int avr910_read_byte_eeprom(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||||
unsigned long addr, unsigned char * value)
|
unsigned long addr, unsigned char * value)
|
||||||
{
|
{
|
||||||
avr910_set_addr(pgm, addr);
|
avr910_set_addr(pgm, addr);
|
||||||
|
@ -458,7 +478,7 @@ static int avr910_read_byte_eeprom(const PROGRAMMER *pgm, const AVRPART *p, cons
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int avr910_read_byte(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *m,
|
static int avr910_read_byte(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||||
unsigned long addr, unsigned char * value)
|
unsigned long addr, unsigned char * value)
|
||||||
{
|
{
|
||||||
if (strcmp(m->desc, "flash") == 0) {
|
if (strcmp(m->desc, "flash") == 0) {
|
||||||
|
@ -473,7 +493,7 @@ static int avr910_read_byte(const PROGRAMMER *pgm, const AVRPART *p, const AVRME
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int avr910_paged_write_flash(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *m,
|
static int avr910_paged_write_flash(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||||
unsigned int page_size,
|
unsigned int page_size,
|
||||||
unsigned int addr, unsigned int n_bytes)
|
unsigned int addr, unsigned int n_bytes)
|
||||||
{
|
{
|
||||||
|
@ -532,8 +552,8 @@ static int avr910_paged_write_flash(const PROGRAMMER *pgm, const AVRPART *p, con
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int avr910_paged_write_eeprom(const PROGRAMMER *pgm, const AVRPART *p,
|
static int avr910_paged_write_eeprom(PROGRAMMER * pgm, AVRPART * p,
|
||||||
const AVRMEM * m,
|
AVRMEM * m,
|
||||||
unsigned int page_size,
|
unsigned int page_size,
|
||||||
unsigned int addr, unsigned int n_bytes)
|
unsigned int addr, unsigned int n_bytes)
|
||||||
{
|
{
|
||||||
|
@ -561,7 +581,7 @@ static int avr910_paged_write_eeprom(const PROGRAMMER *pgm, const AVRPART *p,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int avr910_paged_write(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *m,
|
static int avr910_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||||
unsigned int page_size,
|
unsigned int page_size,
|
||||||
unsigned int addr, unsigned int n_bytes)
|
unsigned int addr, unsigned int n_bytes)
|
||||||
{
|
{
|
||||||
|
@ -621,7 +641,7 @@ static int avr910_paged_write(const PROGRAMMER *pgm, const AVRPART *p, const AVR
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int avr910_paged_load(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *m,
|
static int avr910_paged_load(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||||
unsigned int page_size,
|
unsigned int page_size,
|
||||||
unsigned int addr, unsigned int n_bytes)
|
unsigned int addr, unsigned int n_bytes)
|
||||||
{
|
{
|
||||||
|
@ -698,11 +718,12 @@ static int avr910_paged_load(const PROGRAMMER *pgm, const AVRPART *p, const AVRM
|
||||||
|
|
||||||
/* Signature byte reads are always 3 bytes. */
|
/* Signature byte reads are always 3 bytes. */
|
||||||
|
|
||||||
static int avr910_read_sig_bytes(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *m) {
|
static int avr910_read_sig_bytes(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m)
|
||||||
|
{
|
||||||
unsigned char tmp;
|
unsigned char tmp;
|
||||||
|
|
||||||
if (m->size < 3) {
|
if (m->size < 3) {
|
||||||
pmsg_error("memsize too small for sig byte read");
|
avrdude_message(MSG_INFO, "%s: memsize too small for sig byte read", progname);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -718,7 +739,8 @@ static int avr910_read_sig_bytes(const PROGRAMMER *pgm, const AVRPART *p, const
|
||||||
|
|
||||||
const char avr910_desc[] = "Serial programmers using protocol described in application note AVR910";
|
const char avr910_desc[] = "Serial programmers using protocol described in application note AVR910";
|
||||||
|
|
||||||
void avr910_initpgm(PROGRAMMER *pgm) {
|
void avr910_initpgm(PROGRAMMER * pgm)
|
||||||
|
{
|
||||||
strcpy(pgm->type, "avr910");
|
strcpy(pgm->type, "avr910");
|
||||||
|
|
||||||
/*
|
/*
|
|
@ -26,7 +26,7 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern const char avr910_desc[];
|
extern const char avr910_desc[];
|
||||||
void avr910_initpgm(PROGRAMMER *pgm);
|
void avr910_initpgm (PROGRAMMER * pgm);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
|
@ -18,7 +18,7 @@
|
||||||
.\"
|
.\"
|
||||||
.\" $Id$
|
.\" $Id$
|
||||||
.\"
|
.\"
|
||||||
.Dd July 12, 2022
|
.Dd DATE November 22, 2021
|
||||||
.Os
|
.Os
|
||||||
.Dt AVRDUDE 1
|
.Dt AVRDUDE 1
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
|
@ -31,7 +31,6 @@
|
||||||
.Op Fl B Ar bitclock
|
.Op Fl B Ar bitclock
|
||||||
.Op Fl c Ar programmer-id
|
.Op Fl c Ar programmer-id
|
||||||
.Op Fl C Ar config-file
|
.Op Fl C Ar config-file
|
||||||
.Op Fl A
|
|
||||||
.Op Fl D
|
.Op Fl D
|
||||||
.Op Fl e
|
.Op Fl e
|
||||||
.Oo Fl E Ar exitspec Ns
|
.Oo Fl E Ar exitspec Ns
|
||||||
|
@ -39,12 +38,14 @@
|
||||||
.Oc
|
.Oc
|
||||||
.Op Fl F
|
.Op Fl F
|
||||||
.Op Fl i Ar delay
|
.Op Fl i Ar delay
|
||||||
.Op Fl l Ar logfile
|
.Op Fl n logfile
|
||||||
.Op Fl n
|
.Op Fl n
|
||||||
.Op Fl O
|
.Op Fl O
|
||||||
.Op Fl P Ar port
|
.Op Fl P Ar port
|
||||||
.Op Fl q
|
.Op Fl q
|
||||||
|
.Op Fl s
|
||||||
.Op Fl t
|
.Op Fl t
|
||||||
|
.Op Fl u
|
||||||
.Op Fl U Ar memtype:op:filename:filefmt
|
.Op Fl U Ar memtype:op:filename:filefmt
|
||||||
.Op Fl v
|
.Op Fl v
|
||||||
.Op Fl x Ar extended_param
|
.Op Fl x Ar extended_param
|
||||||
|
@ -75,12 +76,10 @@ so, for the
|
||||||
based programmer, the MCU signals
|
based programmer, the MCU signals
|
||||||
.Ql /RESET ,
|
.Ql /RESET ,
|
||||||
.Ql SCK ,
|
.Ql SCK ,
|
||||||
.Ql SDI
|
.Ql MISO
|
||||||
and
|
and
|
||||||
.Ql SDO
|
.Ql MOSI
|
||||||
of the AVR's SPI interface need to be connected to the
|
need to be connected to the parallel port. Optionally, some otherwise
|
||||||
parallel port; older boards might use the labels MOSI for SDO or MISO for SDI.
|
|
||||||
Optionally, some otherwise
|
|
||||||
unused output pins of the parallel port can be used to supply power
|
unused output pins of the parallel port can be used to supply power
|
||||||
for the MCU part, so it is also possible to construct a passive
|
for the MCU part, so it is also possible to construct a passive
|
||||||
stand-alone programming device. Some status LEDs indicating the
|
stand-alone programming device. Some status LEDs indicating the
|
||||||
|
@ -100,14 +99,14 @@ work at all, or to work abysmally slow.
|
||||||
.Pp
|
.Pp
|
||||||
If you happen to have a Linux system with at least 4 hardware GPIOs
|
If you happen to have a Linux system with at least 4 hardware GPIOs
|
||||||
available (like almost all embedded Linux boards) you can do without
|
available (like almost all embedded Linux boards) you can do without
|
||||||
any additional hardware - just connect them to the SDO, SDI, RESET
|
any additional hardware - just connect them to the MOSI, MISO, RESET
|
||||||
and SCK pins on the AVR and use the linuxgpio programmer type. It bitbangs
|
and SCK pins on the AVR and use the linuxgpio programmer type. It bitbangs
|
||||||
the lines using the Linux sysfs GPIO interface. Of course, care should
|
the lines using the Linux sysfs GPIO interface. Of course, care should
|
||||||
be taken about voltage level compatibility. Also, although not strictly
|
be taken about voltage level compatibility. Also, although not strictrly
|
||||||
required, it is strongly advisable to protect the GPIO pins from
|
required, it is strongly advisable to protect the GPIO pins from
|
||||||
overcurrent situations in some way. The simplest would be to just put
|
overcurrent situations in some way. The simplest would be to just put
|
||||||
some resistors in series or better yet use a 3-state buffer driver like
|
some resistors in series or better yet use a 3-state buffer driver like
|
||||||
the 74HC244. Have a look at http://kolev.info/blog/2013/01/06/avrdude-linuxgpio/ for a more
|
the 74HC244. Have a look at http://kolev.info/avrdude-linuxgpio for a more
|
||||||
detailed tutorial about using this programmer type.
|
detailed tutorial about using this programmer type.
|
||||||
.Pp
|
.Pp
|
||||||
Under a Linux installation with direct access to the SPI bus and GPIO
|
Under a Linux installation with direct access to the SPI bus and GPIO
|
||||||
|
@ -116,7 +115,7 @@ programmer type can be used to directly connect to and program a chip
|
||||||
using the built in interfaces on the computer. The requirements to use
|
using the built in interfaces on the computer. The requirements to use
|
||||||
this type are that an SPI interface is exposed along with one GPIO
|
this type are that an SPI interface is exposed along with one GPIO
|
||||||
pin. The GPIO serves as the reset output since the Linux SPI drivers
|
pin. The GPIO serves as the reset output since the Linux SPI drivers
|
||||||
do not hold chip select down when a transfer is not occurring and thus
|
do not hold slave select down when a transfer is not occuring and thus
|
||||||
it cannot be used as the reset pin. A readily available level
|
it cannot be used as the reset pin. A readily available level
|
||||||
translator should be used between the SPI bus/reset GPIO and the chip
|
translator should be used between the SPI bus/reset GPIO and the chip
|
||||||
to avoid potentially damaging the computer's SPI controller in the
|
to avoid potentially damaging the computer's SPI controller in the
|
||||||
|
@ -149,23 +148,9 @@ programming mode. The programmer type is ``wiring''. Note that the -D option
|
||||||
will likely be required in this case, because the bootloader will rewrite the
|
will likely be required in this case, because the bootloader will rewrite the
|
||||||
program memory, but no true chip erase can be performed.
|
program memory, but no true chip erase can be performed.
|
||||||
.Pp
|
.Pp
|
||||||
Serial bootloaders that run a skeleton of the STK500 1.x protocol are
|
The Arduino (which is very similar to the STK500 1.x) is supported via
|
||||||
supported via their own programmer type ``arduino''. This programmer works
|
its own programmer type specification ``arduino''. This programmer works for
|
||||||
for the Arduino Uno Rev3 or any AVR that runs the Optiboot bootloader.
|
the Arduino Uno Rev3.
|
||||||
.Pp
|
|
||||||
Urprotocol is a leaner version of the STK500 1.x protocol that is designed
|
|
||||||
to be backwards compatible with STK500 v1.x, and allows bootloaders to be
|
|
||||||
much smaller, e.g., as implemented in the urboot project
|
|
||||||
https://github.com/stefanrueger/urboot. The programmer type ``urclock''
|
|
||||||
caters for these urboot programmers. Owing to its backward compatibility,
|
|
||||||
bootloaders that can be served by the arduino programmer can normally
|
|
||||||
also be served by the urclock programmer. This may require specifying the
|
|
||||||
size of (to avrdude) unknown bootloaders in bytes using the
|
|
||||||
.Fl x Ar bootsize=<n>
|
|
||||||
option, which is necessary for the urclock programmer to enable it to
|
|
||||||
protect the bootloader from being overwritten. If an unknown bootloader
|
|
||||||
has EEPROM read/write capability then the option -x eepromrw informs
|
|
||||||
avrdude -c urclock of that capability.
|
|
||||||
.Pp
|
.Pp
|
||||||
The BusPirate is a versatile tool that can also be used as an AVR programmer.
|
The BusPirate is a versatile tool that can also be used as an AVR programmer.
|
||||||
A single BusPirate can be connected to up to 3 independent AVRs. See
|
A single BusPirate can be connected to up to 3 independent AVRs. See
|
||||||
|
@ -194,7 +179,7 @@ has a revision 1 hardware and firmware version of at least 5.37 (decimal).
|
||||||
For ATxmega devices, the JTAGICE3 is supported in PDI mode.
|
For ATxmega devices, the JTAGICE3 is supported in PDI mode.
|
||||||
.Pp
|
.Pp
|
||||||
Atmel-ICE (ARM/AVR) is supported in all modes (JTAG, PDI for Xmega, debugWIRE,
|
Atmel-ICE (ARM/AVR) is supported in all modes (JTAG, PDI for Xmega, debugWIRE,
|
||||||
ISP, UPDI).
|
ISP).
|
||||||
.Pp
|
.Pp
|
||||||
Atmel's XplainedPro boards, using the EDBG protocol (CMSIS-DAP compatible),
|
Atmel's XplainedPro boards, using the EDBG protocol (CMSIS-DAP compatible),
|
||||||
are supported using the "jtag3" programmer type.
|
are supported using the "jtag3" programmer type.
|
||||||
|
@ -225,55 +210,18 @@ has been compiled in
|
||||||
.Nm avrdude ,
|
.Nm avrdude ,
|
||||||
the avrftdi device adds support for many programmers using FTDI's 2232C/D/H
|
the avrftdi device adds support for many programmers using FTDI's 2232C/D/H
|
||||||
and 4232H parts running in MPSSE mode, which hard-codes (in the chip)
|
and 4232H parts running in MPSSE mode, which hard-codes (in the chip)
|
||||||
SCK to bit 1, SDO to bit 2, and SDI to bit 3. Reset is usually bit 4.
|
SCK to bit 1, MOSI to bit 2, and MISO to bit 3. Reset is usually bit 4.
|
||||||
.Pp
|
.Pp
|
||||||
The Atmel DFU bootloader is supported in both, FLIP protocol version 1
|
The Atmel DFU bootloader is supported in both, FLIP protocol version 1
|
||||||
(AT90USB* and ATmega*U* devices), as well as version 2 (Xmega devices).
|
(AT90USB* and ATmega*U* devices), as well as version 2 (Xmega devices).
|
||||||
See below for some hints about FLIP version 1 protocol behaviour.
|
See below for some hints about FLIP version 1 protocol behaviour.
|
||||||
.Pp
|
.Pp
|
||||||
The MPLAB(R) PICkit 4 and MPLAB(R) SNAP, are supported in JTAG, TPI, ISP,
|
The MPLAB(R) PICkit 4, MPLAB(R) SNAP, and Curiosity Nano boards are
|
||||||
PDI and UPDI mode.
|
supported in UPDI mode. The Curiosity Nano board is dubbed
|
||||||
The Curiosity Nano board is supported in UPDI mode. It is dubbed
|
|
||||||
.Dq PICkit on Board ,
|
.Dq PICkit on Board ,
|
||||||
thus the name
|
thus the name
|
||||||
.Pa pkobn_updi .
|
.Pa pkobn_updi .
|
||||||
.Pp
|
.Pp
|
||||||
SerialUPDI programmer implementation is based on Microchip's
|
|
||||||
.Em pymcuprog Li https://github.com/microchip-pic-avr-tools/pymcuprog
|
|
||||||
utility, but it also contains some performance improvements included in
|
|
||||||
Spence Konde's
|
|
||||||
.Em DxCore
|
|
||||||
Arduino core
|
|
||||||
.Li https://github.com/SpenceKonde/DxCore .
|
|
||||||
In a nutshell, this programmer consists of simple USB->UART adapter, diode
|
|
||||||
and couple of resistors. It uses serial connection to provide UPDI interface.
|
|
||||||
See the texinfo documentation for more details and known issues.
|
|
||||||
.Pp
|
|
||||||
The jtag2updi programmer is supported,
|
|
||||||
and can program AVRs with a UPDI interface.
|
|
||||||
Jtag2updi is just a firmware that can be uploaded to an AVR,
|
|
||||||
which enables it to interface with avrdude using the jtagice mkii protocol
|
|
||||||
via a serial link.
|
|
||||||
.Li https://github.com/ElTangas/jtag2updi
|
|
||||||
.Pp
|
|
||||||
The Micronucleus bootloader is supported for both protocol version V1
|
|
||||||
and V2. As the bootloader does not support reading from flash memory,
|
|
||||||
use the
|
|
||||||
.Fl V
|
|
||||||
option to prevent AVRDUDE from verifying the flash memory.
|
|
||||||
See the section on
|
|
||||||
.Em extended parameters
|
|
||||||
for Micronucleus specific options.
|
|
||||||
.Pp
|
|
||||||
The Teensy bootloader is supported for all AVR boards.
|
|
||||||
As the bootloader does not support reading from flash memory,
|
|
||||||
use the
|
|
||||||
.Fl V
|
|
||||||
option to prevent AVRDUDE from verifying the flash memory.
|
|
||||||
See the section on
|
|
||||||
.Em extended parameters
|
|
||||||
for Teensy specific options.
|
|
||||||
.Pp
|
|
||||||
Input files can be provided, and output files can be written in
|
Input files can be provided, and output files can be written in
|
||||||
different file formats, such as raw binary files containing the data
|
different file formats, such as raw binary files containing the data
|
||||||
to download to the chip, Intel hex format, or Motorola S-record
|
to download to the chip, Intel hex format, or Motorola S-record
|
||||||
|
@ -310,7 +258,7 @@ file. Finally, a ``terminal'' mode is available that allows one to
|
||||||
interactively communicate with the MCU, and to display or program
|
interactively communicate with the MCU, and to display or program
|
||||||
individual memory cells.
|
individual memory cells.
|
||||||
On the STK500 and STK600 programmer, several operational parameters (target supply
|
On the STK500 and STK600 programmer, several operational parameters (target supply
|
||||||
voltage, target Aref voltage, programming clock) can be examined and changed
|
voltage, target Aref voltage, master clock) can be examined and changed
|
||||||
from within terminal mode as well.
|
from within terminal mode as well.
|
||||||
.Ss Options
|
.Ss Options
|
||||||
In order to control all the different operation modi, a number of options
|
In order to control all the different operation modi, a number of options
|
||||||
|
@ -318,15 +266,10 @@ need to be specified to
|
||||||
.Nm avrdude .
|
.Nm avrdude .
|
||||||
.Bl -tag -offset indent -width indent
|
.Bl -tag -offset indent -width indent
|
||||||
.It Fl p Ar partno
|
.It Fl p Ar partno
|
||||||
This option specifies the MCU connected to the programmer. The MCU
|
This is the only option that is mandatory for every invocation of
|
||||||
descriptions are read from the config file. For currently supported MCUs use
|
.Nm avrdude .
|
||||||
? as partno, which will print a list of partno ids and official part names.
|
It specifies the type of the MCU connected to the programmer. These are read from the config file.
|
||||||
Both can be used with the -p option. If -p ? is specified with a specific
|
For currently supported MCU types use ? as partno, this will print a list of partno ids and official part names on the terminal. (Both can be used with the -p option.)
|
||||||
programmer, see -c below, then only those parts are output that the
|
|
||||||
programmer expects to be able to handle, together with the programming
|
|
||||||
interface(s) that can be used in that combination. In reality there can be
|
|
||||||
deviations from this list, particularly if programming is directly via a
|
|
||||||
bootloader.
|
|
||||||
.Pp
|
.Pp
|
||||||
Following parts need special attention:
|
Following parts need special attention:
|
||||||
.Bl -tag -width "ATmega1234"
|
.Bl -tag -width "ATmega1234"
|
||||||
|
@ -345,29 +288,22 @@ and bit-bang programmers.
|
||||||
The ATtiny11 can only be
|
The ATtiny11 can only be
|
||||||
programmed in high-voltage serial mode.
|
programmed in high-voltage serial mode.
|
||||||
.El
|
.El
|
||||||
.It Fl p Ar wildcard/flags
|
|
||||||
Run developer options for MCUs that are matched by wildcard. Whilst
|
|
||||||
their main use is for developers some flags can be of utility for users, e.g.,
|
|
||||||
avrdude -p m328p/S outputs AVRDUDE's understanding of ATmega328P MCU properties;
|
|
||||||
for more information run avrdude -p x/h.
|
|
||||||
.It Fl b Ar baudrate
|
.It Fl b Ar baudrate
|
||||||
Override the RS-232 connection baud rate specified in the respective
|
Override the RS-232 connection baud rate specified in the respective
|
||||||
programmer's entry of the configuration file.
|
programmer's entry of the configuration file.
|
||||||
.It Fl B Ar bitclock
|
.It Fl B Ar bitclock
|
||||||
Specify the bit clock period for the JTAG, PDI, TPI, UPDI, or ISP
|
Specify the bit clock period for the JTAG interface or the ISP clock (JTAG ICE only).
|
||||||
interface. The value is a floating-point number in microseconds.
|
The value is a floating-point number in microseconds.
|
||||||
Alternatively, the value might be suffixed with "Hz", "kHz" or
|
Alternatively, the value might be suffixed with "Hz", "kHz", or "MHz",
|
||||||
"MHz" in order to specify the bit clock frequency rather than a
|
in order to specify the bit clock frequency, rather than a period.
|
||||||
period. Some programmers default their bit clock value to a 1
|
The default value of the JTAG ICE results in about 1 microsecond bit
|
||||||
microsecond bit clock period, suitable for target MCUs running at 4
|
clock period, suitable for target MCUs running at 4 MHz clock and
|
||||||
MHz clock and above. Slower MCUs need a correspondingly higher bit
|
above.
|
||||||
clock period. Some programmers reset their bit clock value to the
|
Unlike certain parameters in the STK500, the JTAG ICE resets all its
|
||||||
default value when the programming software signs off, whilst others
|
parameters to default values when the programming software signs
|
||||||
store the last used bit clock value. It is recommended to always
|
off from the ICE, so for MCUs running at lower clock speeds, this
|
||||||
specify the bit clock if read/write speed is important.
|
parameter must be specified on the command-line.
|
||||||
You can use the 'default_bitclock' keyword in your
|
You can use the 'default_bitclock' keyword in your
|
||||||
.Pa ${HOME}/.config/avrdude/avrdude.rc
|
|
||||||
or
|
|
||||||
.Pa ${HOME}/.avrduderc
|
.Pa ${HOME}/.avrduderc
|
||||||
file to assign a default value to keep from having to specify this
|
file to assign a default value to keep from having to specify this
|
||||||
option on every invocation.
|
option on every invocation.
|
||||||
|
@ -381,23 +317,11 @@ through the use of a config file to make
|
||||||
work with different programmers as long as the programmer supports the
|
work with different programmers as long as the programmer supports the
|
||||||
Atmel AVR serial program method. You can use the 'default_programmer'
|
Atmel AVR serial program method. You can use the 'default_programmer'
|
||||||
keyword in your
|
keyword in your
|
||||||
.Pa ${HOME}/.config/avrdude/avrdude.rc
|
|
||||||
or
|
|
||||||
.Pa ${HOME}/.avrduderc
|
.Pa ${HOME}/.avrduderc
|
||||||
file to assign a default programmer to keep from having to specify
|
file to assign a default programmer to keep from having to specify
|
||||||
this option on every invocation.
|
this option on every invocation.
|
||||||
A full list of all supported programmers is output to the terminal
|
A full list of all supported programmers is output to the terminal
|
||||||
by using ? as programmer-id.
|
by using ? as programmer-id.
|
||||||
If -c ? is specified with a specific part, see
|
|
||||||
-p above, then only those programmers are output that expect
|
|
||||||
to be able to handle this part, together with the programming interface(s) that can be
|
|
||||||
used in that combination. In reality there can be deviations from this list,
|
|
||||||
particularly if programming is directly via a bootloader.
|
|
||||||
.It Fl c Ar wildcard/flags
|
|
||||||
Run developer options for programmers that are matched by wildcard. Whilst
|
|
||||||
their main use is for developers some flags can be of utility for users, e.g.,
|
|
||||||
avrdude -c usbtiny/S shows AVRDUDE's understanding of usbtiny's properties;
|
|
||||||
for more information run avrdude -c x/h.
|
|
||||||
.It Fl C Ar config-file
|
.It Fl C Ar config-file
|
||||||
Use the specified config file to load configuration data. This file
|
Use the specified config file to load configuration data. This file
|
||||||
contains all programmer and part definitions that
|
contains all programmer and part definitions that
|
||||||
|
@ -416,20 +340,6 @@ files. This can be used to add entries to the configuration
|
||||||
without patching your system wide configuration file. It can be used
|
without patching your system wide configuration file. It can be used
|
||||||
several times, the files are read in same order as given on the command
|
several times, the files are read in same order as given on the command
|
||||||
line.
|
line.
|
||||||
.It Fl A
|
|
||||||
Disable the automatic removal of trailing-0xFF sequences in file
|
|
||||||
input that is to be programmed to flash and in AVR reads from
|
|
||||||
flash memory. Normally, trailing 0xFFs can be discarded, as flash
|
|
||||||
programming requires the memory be erased to 0xFF beforehand.
|
|
||||||
.Fl A
|
|
||||||
should be used when the programmer hardware, or bootloader
|
|
||||||
software for that matter, does not carry out chip erase and
|
|
||||||
instead handles the memory erase on a page level. Popular
|
|
||||||
Arduino bootloaders exhibit this behaviour; for this reason
|
|
||||||
.Fl A
|
|
||||||
is engaged by default when specifying
|
|
||||||
. Fl c
|
|
||||||
arduino.
|
|
||||||
.It Fl D
|
.It Fl D
|
||||||
Disable auto erase for flash. When the
|
Disable auto erase for flash. When the
|
||||||
.Fl U
|
.Fl U
|
||||||
|
@ -443,10 +353,6 @@ use page erase before writing each page so no explicit chip erase
|
||||||
is required.
|
is required.
|
||||||
Note however that any page not affected by the current operation
|
Note however that any page not affected by the current operation
|
||||||
will retain its previous contents.
|
will retain its previous contents.
|
||||||
Setting
|
|
||||||
.Fl D
|
|
||||||
implies
|
|
||||||
.Fl A.
|
|
||||||
.It Fl e
|
.It Fl e
|
||||||
Causes a chip erase to be executed. This will reset the contents of the
|
Causes a chip erase to be executed. This will reset the contents of the
|
||||||
flash ROM and EEPROM to the value
|
flash ROM and EEPROM to the value
|
||||||
|
@ -459,7 +365,7 @@ contents would exclusively cause bits to be programmed from the value
|
||||||
.Ql 1
|
.Ql 1
|
||||||
to
|
to
|
||||||
.Ql 0 .
|
.Ql 0 .
|
||||||
Note that in order to reprogram EEPROM cells, no explicit prior chip
|
Note that in order to reprogram EERPOM cells, no explicit prior chip
|
||||||
erase is required since the MCU provides an auto-erase cycle in that
|
erase is required since the MCU provides an auto-erase cycle in that
|
||||||
case before programming the cell.
|
case before programming the cell.
|
||||||
.It Xo Fl E Ar exitspec Ns
|
.It Xo Fl E Ar exitspec Ns
|
||||||
|
@ -492,17 +398,11 @@ MCU type, a previous invocation of
|
||||||
.Nm
|
.Nm
|
||||||
with this option specified is one of the possible ways to guarantee this
|
with this option specified is one of the possible ways to guarantee this
|
||||||
condition.
|
condition.
|
||||||
.Em reset
|
|
||||||
is supported by the linuxspi and flip2 programmer options, as well as all
|
|
||||||
parallel port based programmers.
|
|
||||||
.It Ar noreset
|
.It Ar noreset
|
||||||
The
|
The
|
||||||
.Ql /RESET
|
.Ql /RESET
|
||||||
line will be deactivated at program exit, thus allowing the MCU target
|
line will be deactivated at program exit, thus allowing the MCU target
|
||||||
program to run while the programming hardware remains connected.
|
program to run while the programming hardware remains connected.
|
||||||
.Em noreset
|
|
||||||
is supported by the linuxspi and flip2 programmer options, as well as all
|
|
||||||
parallel port based programmers.
|
|
||||||
.It Ar vcc
|
.It Ar vcc
|
||||||
This option will leave those parallel port pins active
|
This option will leave those parallel port pins active
|
||||||
.Pq \&i. \&e. Em high
|
.Pq \&i. \&e. Em high
|
||||||
|
@ -538,8 +438,6 @@ actual connection to a target controller), this option can be used
|
||||||
together with
|
together with
|
||||||
.Fl t
|
.Fl t
|
||||||
to continue in terminal mode.
|
to continue in terminal mode.
|
||||||
Moreover, the option allows to continue despite failed initialization
|
|
||||||
of connection between a programmer and a target.
|
|
||||||
.It Fl i Ar delay
|
.It Fl i Ar delay
|
||||||
For bitbang-type programmers, delay for approximately
|
For bitbang-type programmers, delay for approximately
|
||||||
.Ar delay
|
.Ar delay
|
||||||
|
@ -624,9 +522,9 @@ be specified as
|
||||||
Libhidapi support is required on Unix and Mac OS but not on Windows. For more
|
Libhidapi support is required on Unix and Mac OS but not on Windows. For more
|
||||||
information about AVR-Doper see http://www.obdev.at/avrusb/avrdoper.html.
|
information about AVR-Doper see http://www.obdev.at/avrusb/avrdoper.html.
|
||||||
.Pp
|
.Pp
|
||||||
For the USBtinyISP, which is a simplistic device not implementing
|
For the USBtinyISP, which is a simplicistic device not implementing
|
||||||
serial numbers, multiple devices can be distinguished by their
|
serial numbers, multiple devices can be distinguished by their
|
||||||
location in the USB hierarchy. See the respective
|
location in the USB hierarchy. See the the respective
|
||||||
.Em Troubleshooting
|
.Em Troubleshooting
|
||||||
entry in the detailed documentation for examples.
|
entry in the detailed documentation for examples.
|
||||||
.Pp
|
.Pp
|
||||||
|
@ -672,15 +570,41 @@ Note: The ability to handle IPv6 hostnames and addresses is limited to
|
||||||
Posix systems (by now).
|
Posix systems (by now).
|
||||||
.It Fl q
|
.It Fl q
|
||||||
Disable (or quell) output of the progress bar while reading or writing
|
Disable (or quell) output of the progress bar while reading or writing
|
||||||
to the device. Specify it more often for even quieter operations.
|
to the device. Specify it a second time for even quieter operation.
|
||||||
.It Fl s, u
|
.It Fl s
|
||||||
These options used to control the obsolete "safemode" feature which
|
Disable safemode prompting. When safemode discovers that one or more
|
||||||
is no longer present. They are silently ignored for backwards compatibility.
|
fuse bits have unintentionally changed, it will prompt for
|
||||||
|
confirmation regarding whether or not it should attempt to recover the
|
||||||
|
fuse bit(s). Specifying this flag disables the prompt and assumes
|
||||||
|
that the fuse bit(s) should be recovered without asking for
|
||||||
|
confirmation first.
|
||||||
.It Fl t
|
.It Fl t
|
||||||
Tells
|
Tells
|
||||||
.Nm
|
.Nm
|
||||||
to enter the interactive ``terminal'' mode instead of up- or downloading
|
to enter the interactive ``terminal'' mode instead of up- or downloading
|
||||||
files. See below for a detailed description of the terminal mode.
|
files. See below for a detailed description of the terminal mode.
|
||||||
|
.It Fl u
|
||||||
|
Disable the safemode fuse bit checks. Safemode is enabled by default
|
||||||
|
and is intended to prevent unintentional fuse bit changes. When
|
||||||
|
enabled, safemode will issue a warning if the any fuse bits are found
|
||||||
|
to be different at program exit than they were when
|
||||||
|
.Nm
|
||||||
|
was invoked. Safemode won't alter fuse bits itself, but rather will
|
||||||
|
prompt for instructions, unless the terminal is non-interactive, in
|
||||||
|
which case safemode is disabled. See the
|
||||||
|
.Fl s
|
||||||
|
option to disable safemode prompting.
|
||||||
|
.Pp
|
||||||
|
If one of the configuration files has a line
|
||||||
|
.Dl "default_safemode = no;"
|
||||||
|
safemode is disabled by default.
|
||||||
|
The
|
||||||
|
.Fl u
|
||||||
|
option's effect is negated in that case, i. e. it
|
||||||
|
.Em enables
|
||||||
|
safemode.
|
||||||
|
.Pp
|
||||||
|
Safemode is always disabled for AVR32, Xmega and TPI devices.
|
||||||
.It Xo Fl U Ar memtype Ns
|
.It Xo Fl U Ar memtype Ns
|
||||||
.Ar \&: Ns Ar op Ns
|
.Ar \&: Ns Ar op Ns
|
||||||
.Ar \&: Ns Ar filename Ns
|
.Ar \&: Ns Ar filename Ns
|
||||||
|
@ -759,8 +683,6 @@ can be one of:
|
||||||
.Bl -tag -width sss
|
.Bl -tag -width sss
|
||||||
.It Ar i
|
.It Ar i
|
||||||
Intel Hex
|
Intel Hex
|
||||||
.It Ar I
|
|
||||||
Intel Hex with comments on download and tolerance of checksum errors on upload
|
|
||||||
.It Ar s
|
.It Ar s
|
||||||
Motorola S-record
|
Motorola S-record
|
||||||
.It Ar r
|
.It Ar r
|
||||||
|
@ -785,17 +707,14 @@ fuse bit settings.
|
||||||
hexadecimal; each value will get the string
|
hexadecimal; each value will get the string
|
||||||
.Em 0x
|
.Em 0x
|
||||||
prepended.
|
prepended.
|
||||||
Only valid on output.
|
|
||||||
.It Ar o
|
.It Ar o
|
||||||
octal; each value will get a
|
octal; each value will get a
|
||||||
.Em 0
|
.Em 0
|
||||||
prepended unless it is less than 8 in which case it gets no prefix.
|
prepended unless it is less than 8 in which case it gets no prefix.
|
||||||
Only valid on output.
|
|
||||||
.It Ar b
|
.It Ar b
|
||||||
binary; each value will get the string
|
binary; each value will get the string
|
||||||
.Em 0b
|
.Em 0b
|
||||||
prepended.
|
prepended.
|
||||||
Only valid on output.
|
|
||||||
.El
|
.El
|
||||||
.Pp
|
.Pp
|
||||||
The default is to use auto detection for input files, and raw binary
|
The default is to use auto detection for input files, and raw binary
|
||||||
|
@ -845,128 +764,30 @@ abbreviated to the shortest unambiguous form. Terminal mode provides
|
||||||
a command history using
|
a command history using
|
||||||
.Xr readline 3 ,
|
.Xr readline 3 ,
|
||||||
so previously entered command lines can be recalled and edited. The
|
so previously entered command lines can be recalled and edited. The
|
||||||
following commands are currently implemented for all programmers:
|
following commands are currently implemented:
|
||||||
.Bl -tag -offset indent -width indent
|
.Bl -tag -offset indent -width indent
|
||||||
.It Ar dump memory addr len
|
.It Ar dump memtype addr nbytes
|
||||||
Read
|
Read
|
||||||
.Ar len
|
.Ar nbytes
|
||||||
bytes from the specified memory area, and display them in the usual
|
bytes from the specified memory area, and display them in the usual
|
||||||
hexadecimal and ASCII form.
|
hexadecimal and ASCII form.
|
||||||
.It Ar dump memory addr ...
|
.It Ar dump
|
||||||
Read all bytes from the specified memory starting at address
|
|
||||||
.Ar addr,
|
|
||||||
and display them.
|
|
||||||
.It Ar dump memory addr
|
|
||||||
Read 256 bytes from the specified memory area, and display them.
|
|
||||||
.It Ar dump memory ...
|
|
||||||
Read all bytes from the specified memory, and display them.
|
|
||||||
.It Ar dump memory
|
|
||||||
Continue dumping the memory contents for another
|
Continue dumping the memory contents for another
|
||||||
.Ar 256
|
.Ar nbytes
|
||||||
bytes where the previous
|
where the previous
|
||||||
.Ar dump
|
.Ar dump
|
||||||
command left off.
|
command left off.
|
||||||
.It Ar read
|
.It Ar write memtype addr byte1 ... byteN
|
||||||
can be used as an alias for dump
|
|
||||||
.It Ar write memory addr data[,] {data[,]}
|
|
||||||
Manually program the respective memory cells, starting at address
|
Manually program the respective memory cells, starting at address
|
||||||
.Ar addr ,
|
.Ar addr ,
|
||||||
using the data items provided.
|
using the values
|
||||||
The terminal implements reading from and writing to flash and EEPROM type
|
.Ar byte1
|
||||||
memories normally through a cache and paged access functions. All other
|
through
|
||||||
memories are directly written to without use of a cache. Some
|
.Ar byteN .
|
||||||
older parts without paged access will also have flash and EEPROM directly
|
This feature is not implemented for bank-addressed memories such as
|
||||||
accessed without cache.
|
the flash memory of ATMega devices.
|
||||||
.Pp
|
|
||||||
.Ar data
|
|
||||||
can be hexadecimal, octal or decimal integers, floating point numbers
|
|
||||||
or C-style strings and characters. For integers, an optional case-insensitive
|
|
||||||
suffix specifies the data size: HH 8 bit, H/S 16 bit, L 32 bit, LL 64 bit.
|
|
||||||
Suffix D indicates a 64-bit double, F a 32-bit float, whilst a floating point
|
|
||||||
number without suffix defaults to 32-bit float. Hexadecimal floating point
|
|
||||||
notation is supported. An ambiguous trailing suffix, e.g., 0x1.8D, is read as
|
|
||||||
no-suffix float where D is part of the mantissa; use a zero exponent 0x1.8p0D
|
|
||||||
to clarify.
|
|
||||||
.Pp
|
|
||||||
An optional U suffix makes integers unsigned. Ordinary 0x hex integers are
|
|
||||||
always treated as unsigned. +0x or -0x hex numbers are treated as signed
|
|
||||||
unless they have a U suffix. Unsigned integers cannot be larger than 2^64-1.
|
|
||||||
If n is an unsigned integer then -n is also a valid unsigned integer as in C.
|
|
||||||
Signed integers must fall into the [-2^63, 2^63-1] range or a correspondingly
|
|
||||||
smaller range when a suffix specifies a smaller type.
|
|
||||||
.Pp
|
|
||||||
Ordinary 0x hex integers with n hex digits (counting leading zeros) use the
|
|
||||||
smallest size of one, two, four and eight bytes that can accommodate any
|
|
||||||
n-digit hex integer. If an integer suffix specifies a size explicitly the
|
|
||||||
corresponding number of least significant bytes are written, and a warning
|
|
||||||
shown if the number does not fit into the desired representation. Otherwise,
|
|
||||||
unsigned integers occupy the smallest of one, two, four or eight bytes
|
|
||||||
needed. Signed numbers are allowed to fit into the smallest signed or
|
|
||||||
smallest unsigned representation: For example, 255 is stored as one byte as
|
|
||||||
255U would fit in one byte, though as a signed number it would not fit into a
|
|
||||||
one-byte interval [-128, 127]. The number -1 is stored in one byte whilst -1U
|
|
||||||
needs eight bytes as it is the same as 0xFFFFffffFFFFffffU.
|
|
||||||
.Pp
|
|
||||||
One trailing comma at the end of
|
|
||||||
.Ar data
|
|
||||||
items is ignored to facilitate copy & paste of lists.
|
|
||||||
.It Ar write memory addr len data[,] {data[,]} ...
|
|
||||||
The ellipsis ... form writes <len> bytes padded by repeating the last
|
|
||||||
.Ar data
|
|
||||||
item.
|
|
||||||
.It Ar flush
|
|
||||||
Synchronise with the device all pending cached writes to EEPROM or flash.
|
|
||||||
With some programmer and part combinations, flash (and sometimes EEPROM,
|
|
||||||
too) looks like a NOR memory, ie, one can only write 0 bits, not 1 bits.
|
|
||||||
When this is detected, either page erase is deployed (e.g., with parts that
|
|
||||||
have PDI/UPDI interfaces), or if that is not available, both EEPROM and
|
|
||||||
flash caches are fully read in, a chip erase command is issued and both
|
|
||||||
EEPROM and flash are written back to the device. Hence, it can take
|
|
||||||
minutes to ensure that a single previously cleared bit is set and,
|
|
||||||
therefore, this command should be used sparingly.
|
|
||||||
.It Ar abort
|
|
||||||
Normally, caches are only ever
|
|
||||||
actually written to the device when using the
|
|
||||||
.Ar flush
|
|
||||||
command, at the end of the terminal session after typing
|
|
||||||
.Ar quit ,
|
|
||||||
or after EOF on input is encountered. The abort command resets
|
|
||||||
the cache discarding all previous writes to the flash and EEPROM cache.
|
|
||||||
.It Ar erase
|
.It Ar erase
|
||||||
Perform a chip erase and discard all pending writes to EEPROM and flash.
|
Perform a chip erase.
|
||||||
.It Ar sig
|
|
||||||
Display the device signature bytes.
|
|
||||||
.It Ar part
|
|
||||||
Display the current part settings and parameters. Includes chip
|
|
||||||
specific information including all memory types supported by the
|
|
||||||
device, read/write timing, etc.
|
|
||||||
.It Ar verbose Op Ar level
|
|
||||||
Change (when
|
|
||||||
.Ar level
|
|
||||||
is provided), or display the verbosity level.
|
|
||||||
The initial verbosity level is controlled by the number of
|
|
||||||
.Fl v
|
|
||||||
options given on the commandline.
|
|
||||||
.It Ar quell Op Ar level
|
|
||||||
Change (when
|
|
||||||
.Ar level
|
|
||||||
is provided), or display the quell level. 1 is used to suppress progress reports.
|
|
||||||
2 or higher yields in progressively quieter operations.
|
|
||||||
The initial quell level is controlled by the number of
|
|
||||||
.Fl q
|
|
||||||
options given on the commandline.
|
|
||||||
.It Ar \&?
|
|
||||||
.It Ar help
|
|
||||||
Give a short on-line summary of the available commands.
|
|
||||||
.It Ar quit
|
|
||||||
Leave terminal mode and thus
|
|
||||||
.Nm avrdude .
|
|
||||||
.El
|
|
||||||
.Pp
|
|
||||||
The terminal commands below may only be implemented on some specific programmers, and may therefore not be available in the help menu.
|
|
||||||
.Bl -tag -offset indent -width indent
|
|
||||||
.It pgerase memory addr
|
|
||||||
Erase one page of the memory specified.
|
|
||||||
.It Ar send b1 b2 b3 b4
|
.It Ar send b1 b2 b3 b4
|
||||||
Send raw instruction codes to the AVR device. If you need access to a
|
Send raw instruction codes to the AVR device. If you need access to a
|
||||||
feature of an AVR part that is not directly supported by
|
feature of an AVR part that is not directly supported by
|
||||||
|
@ -975,18 +796,24 @@ this command allows you to use it, even though
|
||||||
.Nm
|
.Nm
|
||||||
does not implement the command. When using direct SPI mode, up to 3 bytes
|
does not implement the command. When using direct SPI mode, up to 3 bytes
|
||||||
can be omitted.
|
can be omitted.
|
||||||
|
.It Ar sig
|
||||||
|
Display the device signature bytes.
|
||||||
.It Ar spi
|
.It Ar spi
|
||||||
Enter direct SPI mode. The
|
Enter direct SPI mode. The
|
||||||
.Em pgmled
|
.Em pgmled
|
||||||
pin acts as chip select.
|
pin acts as slave select.
|
||||||
.Em Supported on parallel bitbang programmers, and partially by USBtiny.
|
.Em Only supported on parallel bitbang programmers.
|
||||||
|
.It Ar part
|
||||||
|
Display the current part settings and parameters. Includes chip
|
||||||
|
specific information including all memory types supported by the
|
||||||
|
device, read/write timing, etc.
|
||||||
.It Ar pgm
|
.It Ar pgm
|
||||||
Return to programming mode (from direct SPI mode).
|
Return to programming mode (from direct SPI mode).
|
||||||
.It Ar vtarg voltage
|
.It Ar vtarg voltage
|
||||||
Set the target's supply voltage to
|
Set the target's supply voltage to
|
||||||
.Ar voltage
|
.Ar voltage
|
||||||
Volts.
|
Volts.
|
||||||
.Em Supported on the STK500 and STK600 programmer.
|
.Em Only supported on the STK500 and STK600 programmer.
|
||||||
.It Ar varef Oo Ar channel Oc Ar voltage
|
.It Ar varef Oo Ar channel Oc Ar voltage
|
||||||
Set the adjustable voltage source to
|
Set the adjustable voltage source to
|
||||||
.Ar voltage
|
.Ar voltage
|
||||||
|
@ -998,9 +825,9 @@ On the Atmel STK600, two reference voltages are available, which
|
||||||
can be selected by the optional
|
can be selected by the optional
|
||||||
.Ar channel
|
.Ar channel
|
||||||
argument (either 0 or 1).
|
argument (either 0 or 1).
|
||||||
.Em Supported on the STK500 and STK600 programmer.
|
.Em Only supported on the STK500 and STK600 programmer.
|
||||||
.It Ar fosc freq Ns Op M Ns \&| Ns k
|
.It Ar fosc freq Ns Op M Ns \&| Ns k
|
||||||
Set the programming oscillator to
|
Set the master oscillator to
|
||||||
.Ar freq
|
.Ar freq
|
||||||
Hz.
|
Hz.
|
||||||
An optional trailing letter
|
An optional trailing letter
|
||||||
|
@ -1008,16 +835,17 @@ An optional trailing letter
|
||||||
multiplies by 1E6, a trailing letter
|
multiplies by 1E6, a trailing letter
|
||||||
.Ar \&k
|
.Ar \&k
|
||||||
by 1E3.
|
by 1E3.
|
||||||
.Em Supported on the STK500 and STK600 programmer.
|
.Em Only supported on the STK500 and STK600 programmer.
|
||||||
.It Ar fosc off
|
.It Ar fosc off
|
||||||
Turn the programming oscillator off.
|
Turn the master oscillator off.
|
||||||
.Em Supported on the STK500 and STK600 programmer.
|
.Em Only supported on the STK500 and STK600 programmer.
|
||||||
.It Ar sck period
|
.It Ar sck period
|
||||||
.Em STK500 and STK600 programmer:
|
.Em STK500 and STK600 programmer only:
|
||||||
Set the SCK clock period to
|
Set the SCK clock period to
|
||||||
.Ar period
|
.Ar period
|
||||||
microseconds.
|
microseconds.
|
||||||
.Em JTAG ICE:
|
.Pp
|
||||||
|
.Em JTAG ICE only:
|
||||||
Set the JTAG ICE bit clock period to
|
Set the JTAG ICE bit clock period to
|
||||||
.Ar period
|
.Ar period
|
||||||
microseconds.
|
microseconds.
|
||||||
|
@ -1027,12 +855,24 @@ software signs off from the JTAG ICE.
|
||||||
This parameter can also be used on the JTAG ICE mkII, JTAGICE3, and Atmel-ICE to specify the
|
This parameter can also be used on the JTAG ICE mkII, JTAGICE3, and Atmel-ICE to specify the
|
||||||
ISP clock period when operating the ICE in ISP mode.
|
ISP clock period when operating the ICE in ISP mode.
|
||||||
.It Ar parms
|
.It Ar parms
|
||||||
.Em STK500 and STK600 programmer:
|
.Em STK500 and STK600 programmer only:
|
||||||
Display the current voltage and programming oscillator parameters.
|
Display the current voltage and master oscillator parameters.
|
||||||
.Em JTAG ICE:
|
.Pp
|
||||||
|
.Em JTAG ICE only:
|
||||||
Display the current target supply voltage and JTAG bit clock rate/period.
|
Display the current target supply voltage and JTAG bit clock rate/period.
|
||||||
.Em Other programmers:
|
.It Ar verbose Op Ar level
|
||||||
Display the programmer specific parameters.
|
Change (when
|
||||||
|
.Ar level
|
||||||
|
is provided), or display the verbosity level.
|
||||||
|
The initial verbosity level is controlled by the number of
|
||||||
|
.Fl v
|
||||||
|
options given on the commandline.
|
||||||
|
.It Ar \&?
|
||||||
|
.It Ar help
|
||||||
|
Give a short on-line summary of the available commands.
|
||||||
|
.It Ar quit
|
||||||
|
Leave terminal mode and thus
|
||||||
|
.Nm avrdude .
|
||||||
.El
|
.El
|
||||||
.Ss Default Parallel port pin connections
|
.Ss Default Parallel port pin connections
|
||||||
(these can be changed, see the
|
(these can be changed, see the
|
||||||
|
@ -1044,8 +884,8 @@ ll.
|
||||||
2-5 Vcc (optional power supply to MCU)
|
2-5 Vcc (optional power supply to MCU)
|
||||||
7 /RESET (to MCU)
|
7 /RESET (to MCU)
|
||||||
8 SCK (to MCU)
|
8 SCK (to MCU)
|
||||||
9 SDO (to MCU)
|
9 MOSI (to MCU)
|
||||||
10 SDI (from MCU)
|
10 MISO (from MCU)
|
||||||
18-25 GND
|
18-25 GND
|
||||||
.TE
|
.TE
|
||||||
.Ss debugWire limitations
|
.Ss debugWire limitations
|
||||||
|
@ -1112,13 +952,9 @@ versions of the bootloader.
|
||||||
.It Ar JTAG ICE mkII
|
.It Ar JTAG ICE mkII
|
||||||
.It Ar JTAGICE3
|
.It Ar JTAGICE3
|
||||||
.It Ar Atmel-ICE
|
.It Ar Atmel-ICE
|
||||||
.It Ar Power Debugger
|
|
||||||
.It Ar PICkit 4
|
|
||||||
.It Ar MPLAB SNAP
|
|
||||||
.It Ar AVR Dragon
|
.It Ar AVR Dragon
|
||||||
When using the JTAG ICE mkII, JTAGICE3, Atmel-ICE, PICkit 4, MPLAB SNAP,
|
When using the JTAG ICE mkII, JTAGICE3, Atmel-ICE or AVR Dragon in JTAG mode, the
|
||||||
Power Debugger or AVR Dragon in JTAG mode, the following extended parameter
|
following extended parameter is accepted:
|
||||||
is accepted:
|
|
||||||
.Bl -tag -offset indent -width indent
|
.Bl -tag -offset indent -width indent
|
||||||
.It Ar jtagchain=UB,UA,BB,BA
|
.It Ar jtagchain=UB,UA,BB,BA
|
||||||
Setup the JTAG scan chain for
|
Setup the JTAG scan chain for
|
||||||
|
@ -1133,14 +969,6 @@ bits after the target AVR, respectively.
|
||||||
Each AVR unit within the chain shifts by 4 bits.
|
Each AVR unit within the chain shifts by 4 bits.
|
||||||
Other JTAG units might require a different bit shift count.
|
Other JTAG units might require a different bit shift count.
|
||||||
.El
|
.El
|
||||||
.Pp
|
|
||||||
The PICkit 4 and the Power Debugger also supports high-voltage UPDI programming.
|
|
||||||
This is used to enable a UPDI pin that has previously been set to RESET or
|
|
||||||
GPIO mode. High-voltage UPDI can be utilized by using an extended parameter:
|
|
||||||
.Bl -tag -offset indent -width indent
|
|
||||||
.It Ar hvupdi
|
|
||||||
Enable high-voltage UPDI initialization for targets that supports this.
|
|
||||||
.El
|
|
||||||
.It Ar AVR910
|
.It Ar AVR910
|
||||||
.Bl -tag -offset indent -width indent
|
.Bl -tag -offset indent -width indent
|
||||||
.It Ar devcode=VALUE
|
.It Ar devcode=VALUE
|
||||||
|
@ -1166,125 +994,12 @@ only if your
|
||||||
.Ar AVR910
|
.Ar AVR910
|
||||||
programmer creates errors during initial sequence.
|
programmer creates errors during initial sequence.
|
||||||
.El
|
.El
|
||||||
.It Ar Arduino
|
|
||||||
.Bl -tag -offset indent -width indent
|
|
||||||
.It Ar attemps[=<1..99>]
|
|
||||||
Specify how many connection retry attemps to perform before exiting.
|
|
||||||
Defaults to 10 if not specified.
|
|
||||||
.El
|
|
||||||
.It Ar Urclock
|
|
||||||
.Bl -tag -offset indent -width indent
|
|
||||||
.It Ar showall
|
|
||||||
Show all info for the connected part, then exit. The -xshow... options
|
|
||||||
below can be used to assemble a bespoke response consisting of a subset
|
|
||||||
(or only one item) of all available relevant information about the
|
|
||||||
connected part and bootloader.
|
|
||||||
.It Ar showid
|
|
||||||
Show a unique Urclock ID stored in either flash or EEPROM of the MCU, then exit.
|
|
||||||
.It Ar id=<E|F>.<addr>.<len>
|
|
||||||
Historically, the Urclock ID was a six-byte unique little-endian number
|
|
||||||
stored in Urclock boards at EEPROM address 257. The location of this
|
|
||||||
number can be set by the -xid=<E|F>.<addr>.<len> extended parameter. E
|
|
||||||
stands for EEPROM and F stands for flash. A negative address addr counts
|
|
||||||
from the end of EEPROM and flash, respectively. The length len of the
|
|
||||||
Urclock ID can be between 1 and 8 bytes.
|
|
||||||
.It Ar showdate
|
|
||||||
Show the last-modified date of the input file for the flash application,
|
|
||||||
then exit. If the input file was stdin, the date will be that of the
|
|
||||||
programming. Date and filename are part of the metadata that the urclock
|
|
||||||
programmer stores by default in high flash just under the bootloader; see also
|
|
||||||
-xnometadata.
|
|
||||||
.It Ar showfilename
|
|
||||||
Show the input filename (or title) of the last flash writing session, then exit.
|
|
||||||
.It Ar title=<string>
|
|
||||||
When set, <string> will be used in lieu of the input filename. The maximum
|
|
||||||
string length for the title/filename field is 254 bytes including
|
|
||||||
terminating nul.
|
|
||||||
.It Ar showapp
|
|
||||||
Show the size of the programmed application, then exit.
|
|
||||||
.It Ar showstore
|
|
||||||
Show the size of the unused flash between the application and metadata, then exit.
|
|
||||||
.It Ar showmeta
|
|
||||||
Show the size of the metadata just below the bootloader, then exit.
|
|
||||||
.It Ar showboot
|
|
||||||
Show the size of the bootloader, then exit.
|
|
||||||
.It Ar showversion
|
|
||||||
Show bootloader version and capabilities, then exit.
|
|
||||||
.It Ar showvector
|
|
||||||
Show the vector number and name of the interrupt table vector used by the
|
|
||||||
bootloader for starting the application, then exit. For hardware-supported
|
|
||||||
bootloaders this will be vector 0 (Reset), and for vector bootloaders this
|
|
||||||
will be any other vector number of the interrupt vector table or the slot
|
|
||||||
just behind the vector table with the name VBL_ADDITIONAL_VECTOR.
|
|
||||||
.It Ar showpart
|
|
||||||
Show the part for which the bootloader was compiled, then exit.
|
|
||||||
.It Ar bootsize=<size>
|
|
||||||
Manual override for bootloader size. Urboot bootloaders put the number of
|
|
||||||
used bootloader pages into a table at the top of the bootloader section,
|
|
||||||
ie, typically top of flash, so the urclock programmer can look up the
|
|
||||||
bootloader size itself. In backward-compatibility mode, when programming
|
|
||||||
via other bootloaders, this option can be used to tell the programmer the
|
|
||||||
size, and therefore the location, of the bootloader.
|
|
||||||
.It Ar vectornum=<arg>
|
|
||||||
Manual override for vector number. Urboot bootloaders put the vector
|
|
||||||
number used by a vector bootloader into a table at the top of flash, so
|
|
||||||
this option is normally not needed for urboot bootloaders. However, it is
|
|
||||||
useful in backward-compatibility mode (or when the urboot bootloader does
|
|
||||||
not offer flash read). Specifying a vector number in these circumstances
|
|
||||||
implies a vector bootloader whilst the default assumption would be a
|
|
||||||
hardware-supported bootloader.
|
|
||||||
.It Ar eepromrw
|
|
||||||
Manual override for asserting EEPROM read/write capability. Not normally
|
|
||||||
needed for urboot bootloaders, but useful for in backward-compatibility
|
|
||||||
mode if the bootloader offers EEPROM read/write.
|
|
||||||
.It Ar emulate_ce
|
|
||||||
If an urboot bootloader does not offer a chip erase command it will tell
|
|
||||||
the urclock programmer so during handshake. In this case the urclock
|
|
||||||
programmer emulates a chip erase, if warranted by user command line
|
|
||||||
options, by filling the remainder of unused flash below the bootloader
|
|
||||||
with 0xff. If this option is specified, the urclock programmer will assume
|
|
||||||
that the bootloader cannot erase the chip itself. The option is useful
|
|
||||||
for backwards-compatible bootloaders that do not implement chip erase.
|
|
||||||
.It Ar restore
|
|
||||||
Upload unchanged flash input files and trim below the bootloader if
|
|
||||||
needed. This is most useful when one has a backup of the full flash and
|
|
||||||
wants to play that back onto the device. No metadata are written in this
|
|
||||||
case and no vector patching happens either if it is a vector bootloader.
|
|
||||||
However, for vector bootloaders, even under the option -xrestore an
|
|
||||||
input file will not be uploaded for which the reset vector does not point
|
|
||||||
to the vector bootloader. This is to avoid writing an input file to the
|
|
||||||
device that would render the vector bootloader not functional as it would
|
|
||||||
not be reached after reset.
|
|
||||||
.It Ar initstore
|
|
||||||
On writing to flash fill the store space between the flash application and
|
|
||||||
the metadata section with 0xff.
|
|
||||||
.It Ar nofilename
|
|
||||||
On writing to flash do not store the application input filename (nor a title).
|
|
||||||
.It Ar nodate
|
|
||||||
On writing to flash do not store the application input filename (nor a
|
|
||||||
title) and no date either.
|
|
||||||
.It Ar nometadata
|
|
||||||
On writing to flash do not store any metadata. The full flash below the
|
|
||||||
bootloader is available for the application. In particular, no data store
|
|
||||||
frame is programmed.
|
|
||||||
.It Ar delay=<n>
|
|
||||||
Add a <n> ms delay after reset. This can be useful if a board takes a
|
|
||||||
particularly long time to exit from external reset. <n> can be negative,
|
|
||||||
in which case the default 120 ms delay after issuing reset will be
|
|
||||||
shortened accordingly.
|
|
||||||
.It Ar strict
|
|
||||||
Urclock has a faster, but slightly different strategy than -c arduino to
|
|
||||||
synchronise with the bootloader; some stk500v1 bootloaders cannot cope
|
|
||||||
with this, and they need the -xstrict option.
|
|
||||||
.It Ar help
|
|
||||||
Show this help menu and exit
|
|
||||||
.El
|
|
||||||
.It Ar buspirate
|
.It Ar buspirate
|
||||||
.Bl -tag -offset indent -width indent
|
.Bl -tag -offset indent -width indent
|
||||||
.It Ar reset={cs,aux,aux2}
|
.It Ar reset={cs,aux,aux2}
|
||||||
The default setup assumes the BusPirate's CS output pin connected to
|
The default setup assumes the BusPirate's CS output pin connected to
|
||||||
the RESET pin on AVR side. It is however possible to have multiple AVRs
|
the RESET pin on AVR side. It is however possible to have multiple AVRs
|
||||||
connected to the same BP with SDI, SDO and SCK lines common for all of them.
|
connected to the same BP with MISO, MOSI and SCK lines common for all of them.
|
||||||
In such a case one AVR should have its RESET connected to BusPirate's
|
In such a case one AVR should have its RESET connected to BusPirate's
|
||||||
.Pa CS
|
.Pa CS
|
||||||
pin, second AVR's RESET connected to BusPirate's
|
pin, second AVR's RESET connected to BusPirate's
|
||||||
|
@ -1358,26 +1073,6 @@ Especially in ascii mode this happens very often, so setting a smaller value
|
||||||
can speed up programming a lot.
|
can speed up programming a lot.
|
||||||
The default value is 100ms. Using 10ms might work in most cases.
|
The default value is 100ms. Using 10ms might work in most cases.
|
||||||
.El
|
.El
|
||||||
.It Ar Micronucleus bootloader
|
|
||||||
.Bl -tag -offset indent -width indent
|
|
||||||
.It Ar wait[=<timeout>]
|
|
||||||
If the device is not connected, wait for the device to be plugged in.
|
|
||||||
The optional
|
|
||||||
.Ar timeout
|
|
||||||
specifies the connection time-out in seconds.
|
|
||||||
If no time-out is specified, AVRDUDE will wait indefinitely until the
|
|
||||||
device is plugged in.
|
|
||||||
.El
|
|
||||||
.It Ar Teensy bootloader
|
|
||||||
.Bl -tag -offset indent -width indent
|
|
||||||
.It Ar wait[=<timeout>]
|
|
||||||
If the device is not connected, wait for the device to be plugged in.
|
|
||||||
The optional
|
|
||||||
.Ar timeout
|
|
||||||
specifies the connection time-out in seconds.
|
|
||||||
If no time-out is specified, AVRDUDE will wait indefinitely until the
|
|
||||||
device is plugged in.
|
|
||||||
.El
|
|
||||||
.It Ar Wiring
|
.It Ar Wiring
|
||||||
When using the Wiring programmer type, the
|
When using the Wiring programmer type, the
|
||||||
following optional extended parameter is accepted:
|
following optional extended parameter is accepted:
|
||||||
|
@ -1397,9 +1092,9 @@ Connection to the PICkit2 programmer:
|
||||||
RST - VPP/MCLR (1)
|
RST - VPP/MCLR (1)
|
||||||
VDD - VDD Target (2) -- possibly optional if AVR self powered
|
VDD - VDD Target (2) -- possibly optional if AVR self powered
|
||||||
GND - GND (3)
|
GND - GND (3)
|
||||||
SDI - PGD (4)
|
MISO - PGD (4)
|
||||||
SCLK - PDC (5)
|
SCLK - PDC (5)
|
||||||
SDO - AUX (6)
|
MOSI - AUX (6)
|
||||||
|
|
||||||
.Ed
|
.Ed
|
||||||
Extended commandline parameters:
|
Extended commandline parameters:
|
||||||
|
@ -1435,63 +1130,22 @@ line, and the XBee DIN pin (pin 3) must be connected to the MCU's
|
||||||
.Ql TXD
|
.Ql TXD
|
||||||
line.
|
line.
|
||||||
.El
|
.El
|
||||||
.It Ar STK500
|
|
||||||
.Bl -tag -offset indent -width indent
|
|
||||||
.It Ar attemps[=<1..99>]
|
|
||||||
Specify how many connection retry attemps to perform before exiting.
|
|
||||||
Defaults to 10 if not specified.
|
|
||||||
.El
|
|
||||||
.It Ar serialupdi
|
|
||||||
Extended parameters:
|
|
||||||
.Bl -tag -offset indent -width indent
|
|
||||||
.It Ar rtsdtr=low|high
|
|
||||||
Forces RTS/DTR lines to assume low or high state during the whole
|
|
||||||
programming session. Some programmers might use this signal to
|
|
||||||
indicate UPDI programming state, but this is strictly hardware
|
|
||||||
specific.
|
|
||||||
.Pp
|
|
||||||
When not provided, driver/OS default value will be used.
|
|
||||||
.El
|
|
||||||
.It Ar linuxspi
|
|
||||||
Extended parameter:
|
|
||||||
.Bl -tag -offset indent -width indent
|
|
||||||
.It Ar disable_no_cs
|
|
||||||
Ensures the programmer does not use the SPI_NO_CS bit for the SPI
|
|
||||||
driver. This parameter is useful for kernels that do not support
|
|
||||||
the CS line being managed outside the application.
|
|
||||||
.El
|
|
||||||
.El
|
.El
|
||||||
.Sh FILES
|
.Sh FILES
|
||||||
.Bl -tag -offset indent -width /dev/ppi0XXX
|
.Bl -tag -offset indent -width /dev/ppi0XXX
|
||||||
.It Pa /dev/ppi0
|
.It Pa /dev/ppi0
|
||||||
Default device to be used for communication with the programming
|
default device to be used for communication with the programming
|
||||||
hardware
|
hardware
|
||||||
.It Pa avrdude.conf
|
.It Pa ${PREFIX}/etc/avrdude.conf
|
||||||
Programmer and parts configuration file
|
programmer and parts configuration file
|
||||||
.Pp
|
|
||||||
On Windows systems, this file is looked up in the same directory as the
|
|
||||||
executable file.
|
|
||||||
On all other systems, the file is first looked up in
|
|
||||||
.Pa ../etc/ ,
|
|
||||||
relative to the path of the executable, then in the same directory as
|
|
||||||
the executable itself, and finally in the system default location
|
|
||||||
.Pa ${PREFIX}/etc/avrdude.conf .
|
|
||||||
.It Pa ${XDG_CONFIG_HOME}/avrdude/avrdude.rc
|
|
||||||
Local programmer and parts configuration file (per-user overrides); it follows the same syntax as
|
|
||||||
.Pa avrdude.conf ;
|
|
||||||
if the
|
|
||||||
.Pa ${XDG_CONFIG_HOME}
|
|
||||||
environment variable is not set or empty, the directory
|
|
||||||
.Pa ${HOME}/.config/
|
|
||||||
is used instead.
|
|
||||||
.It Pa ${HOME}/.avrduderc
|
.It Pa ${HOME}/.avrduderc
|
||||||
Alternative location of the per-user configuration file if above file does not exist
|
programmer and parts configuration file (per-user overrides)
|
||||||
.It Pa ~/.inputrc
|
.It Pa ~/.inputrc
|
||||||
Initialization file for the
|
Initialization file for the
|
||||||
.Xr readline 3
|
.Xr readline 3
|
||||||
library
|
library
|
||||||
.It Pa <prefix>/doc/avrdude/avrdude.pdf
|
.It Pa ${PREFIX}/share/doc/avrdude/avrdude.pdf
|
||||||
User manual
|
Schematic of programming hardware
|
||||||
.El
|
.El
|
||||||
.\" .Sh EXAMPLES
|
.\" .Sh EXAMPLES
|
||||||
.Sh DIAGNOSTICS
|
.Sh DIAGNOSTICS
|
||||||
|
@ -1538,7 +1192,7 @@ This man page by
|
||||||
.el Joerg Wunsch.
|
.el Joerg Wunsch.
|
||||||
.Sh BUGS
|
.Sh BUGS
|
||||||
Please report bugs via
|
Please report bugs via
|
||||||
.Dl "https://github.com/avrdudes/avrdude/issues"
|
.Dl "http://savannah.nongnu.org/bugs/?group=avrdude" .
|
||||||
.Pp
|
.Pp
|
||||||
The JTAG ICE programmers currently cannot write to the flash ROM
|
The JTAG ICE programmers currently cannot write to the flash ROM
|
||||||
one byte at a time.
|
one byte at a time.
|
||||||
|
@ -1555,9 +1209,6 @@ The USBasp and USBtinyISP drivers do not offer any option to distinguish multipl
|
||||||
devices connected simultaneously, so effectively only a single device
|
devices connected simultaneously, so effectively only a single device
|
||||||
is supported.
|
is supported.
|
||||||
.Pp
|
.Pp
|
||||||
Chip Select must be externally held low for direct SPI when
|
|
||||||
using USBtinyISP, and send must be a multiple of four bytes.
|
|
||||||
.Pp
|
|
||||||
The avrftdi driver allows one to select specific devices using any combination of vid,pid
|
The avrftdi driver allows one to select specific devices using any combination of vid,pid
|
||||||
serial number (usbsn) vendor description (usbvendoror part description (usbproduct)
|
serial number (usbsn) vendor description (usbvendoror part description (usbproduct)
|
||||||
as seen with lsusb or whatever tool used to view USB device information. Multiple
|
as seen with lsusb or whatever tool used to view USB device information. Multiple
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,63 @@
|
||||||
|
/*
|
||||||
|
* avrdude - A Downloader/Uploader for AVR device programmers
|
||||||
|
* Copyright (C) 2007 Joerg Wunsch
|
||||||
|
*
|
||||||
|
* 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, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
#ifndef avrdude_h
|
||||||
|
#define avrdude_h
|
||||||
|
|
||||||
|
extern char * progname; /* name of program, for messages */
|
||||||
|
extern char progbuf[]; /* spaces same length as progname */
|
||||||
|
|
||||||
|
extern int ovsigck; /* override signature check (-F) */
|
||||||
|
extern int verbose; /* verbosity level (-v, -vv, ...) */
|
||||||
|
extern int quell_progress; /* quiteness level (-q, -qq) */
|
||||||
|
|
||||||
|
int avrdude_message(const int msglvl, const char *format, ...);
|
||||||
|
|
||||||
|
#define MSG_INFO (0) /* no -v option, can be supressed with -qq */
|
||||||
|
#define MSG_NOTICE (1) /* displayed with -v */
|
||||||
|
#define MSG_NOTICE2 (2) /* displayed with -vv, used rarely */
|
||||||
|
#define MSG_DEBUG (3) /* displayed with -vvv */
|
||||||
|
#define MSG_TRACE (4) /* displayed with -vvvv, show trace commuication */
|
||||||
|
#define MSG_TRACE2 (5) /* displayed with -vvvvv */
|
||||||
|
|
||||||
|
#if defined(WIN32NATIVE)
|
||||||
|
|
||||||
|
#include "ac_cfg.h"
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(HAVE_USLEEP)
|
||||||
|
int usleep(unsigned int us);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(HAVE_GETTIMEOFDAY)
|
||||||
|
struct timezone;
|
||||||
|
int gettimeofday(struct timeval *tv, struct timezone *tz);
|
||||||
|
#endif /* HAVE_GETTIMEOFDAY */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* defined(WIN32NATIVE) */
|
||||||
|
|
||||||
|
#endif
|
|
@ -50,24 +50,28 @@
|
||||||
|
|
||||||
#ifdef DO_NOT_BUILD_AVRFTDI
|
#ifdef DO_NOT_BUILD_AVRFTDI
|
||||||
|
|
||||||
static int avrftdi_noftdi_open(PROGRAMMER *pgm, const char *name) {
|
static int avrftdi_noftdi_open (struct programmer_t *pgm, char * name)
|
||||||
pmsg_error("no libftdi or libusb support; install libftdi1/libusb-1.0 or libftdi/libusb and run configure/make again\n");
|
{
|
||||||
|
avrdude_message(MSG_INFO, "%s: Error: no libftdi or libusb support. Install libftdi1/libusb-1.0 or libftdi/libusb and run configure/make again.\n",
|
||||||
|
progname);
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void avrftdi_initpgm(PROGRAMMER *pgm) {
|
void avrftdi_initpgm(PROGRAMMER * pgm)
|
||||||
|
{
|
||||||
strcpy(pgm->type, "avrftdi");
|
strcpy(pgm->type, "avrftdi");
|
||||||
pgm->open = avrftdi_noftdi_open;
|
pgm->open = avrftdi_noftdi_open;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
enum { FTDI_SCK = 0, FTDI_SDO, FTDI_SDI, FTDI_RESET };
|
enum { FTDI_SCK = 0, FTDI_MOSI, FTDI_MISO, FTDI_RESET };
|
||||||
|
|
||||||
static int write_flush(avrftdi_t *);
|
static int write_flush(avrftdi_t *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* returns a human-readable name for a pin number. The name should match with
|
* returns a human-readable name for a pin number. the name should match with
|
||||||
* the pin names used in FTDI datasheets.
|
* the pin names used in FTDI datasheets.
|
||||||
*/
|
*/
|
||||||
static char*
|
static char*
|
||||||
|
@ -121,7 +125,7 @@ ftdi_pin_name(avrftdi_t* pdata, struct pindef_t pin)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* output function, to save if(vebose>level)-constructs. Also prefixes output
|
* output function, to save if(vebose>level)-constructs. also prefixes output
|
||||||
* with "avrftdi function-name(line-number):" to identify were messages came
|
* with "avrftdi function-name(line-number):" to identify were messages came
|
||||||
* from.
|
* from.
|
||||||
* This function is the backend of the log_*-macros, but it can be used
|
* This function is the backend of the log_*-macros, but it can be used
|
||||||
|
@ -138,14 +142,14 @@ void avrftdi_log(int level, const char * func, int line,
|
||||||
if(!skip_prefix)
|
if(!skip_prefix)
|
||||||
{
|
{
|
||||||
switch(level) {
|
switch(level) {
|
||||||
case ERR: msg_error("E "); break;
|
case ERR: avrdude_message(MSG_INFO, "E "); break;
|
||||||
case WARN: msg_error("W "); break;
|
case WARN: avrdude_message(MSG_INFO, "W "); break;
|
||||||
case INFO: msg_error("I "); break;
|
case INFO: avrdude_message(MSG_INFO, "I "); break;
|
||||||
case DEBUG: msg_error("D "); break;
|
case DEBUG: avrdude_message(MSG_INFO, "D "); break;
|
||||||
case TRACE: msg_error("T "); break;
|
case TRACE: avrdude_message(MSG_INFO, "T "); break;
|
||||||
default: msg_error(" "); break;
|
default: avrdude_message(MSG_INFO, " "); break;
|
||||||
}
|
}
|
||||||
msg_error("%s(%d): ", func, line);
|
avrdude_message(MSG_INFO, "%s(%d): ", func, line);
|
||||||
}
|
}
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
vfprintf(stderr, fmt, ap);
|
vfprintf(stderr, fmt, ap);
|
||||||
|
@ -159,25 +163,25 @@ void avrftdi_log(int level, const char * func, int line,
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* helper function to print a binary buffer *buf of size len. Begin and end of
|
* helper function to print a binary buffer *buf of size len. begin and end of
|
||||||
* the dump are enclosed in the string contained in *desc. Offset denotes the
|
* the dump are enclosed in the string contained in *desc. offset denotes the
|
||||||
* number of bytes which are printed on the first line (may be 0). After that
|
* number of bytes which are printed on the first line (may be 0). after that
|
||||||
* width bytes are printed on each line
|
* width bytes are printed on each line
|
||||||
*/
|
*/
|
||||||
static void buf_dump(const unsigned char *buf, int len, char *desc,
|
static void buf_dump(const unsigned char *buf, int len, char *desc,
|
||||||
int offset, int width)
|
int offset, int width)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
msg_info("%s begin:\n", desc);
|
avrdude_message(MSG_INFO, "%s begin:\n", desc);
|
||||||
for (i = 0; i < offset; i++)
|
for (i = 0; i < offset; i++)
|
||||||
msg_info("%02x ", buf[i]);
|
avrdude_message(MSG_INFO, "%02x ", buf[i]);
|
||||||
msg_info("\n");
|
avrdude_message(MSG_INFO, "\n");
|
||||||
for (i++; i <= len; i++) {
|
for (i++; i <= len; i++) {
|
||||||
msg_info("%02x ", buf[i-1]);
|
avrdude_message(MSG_INFO, "%02x ", buf[i-1]);
|
||||||
if((i-offset) != 0 && (i-offset)%width == 0)
|
if((i-offset) != 0 && (i-offset)%width == 0)
|
||||||
msg_info("\n");
|
avrdude_message(MSG_INFO, "\n");
|
||||||
}
|
}
|
||||||
msg_info("%s end\n", desc);
|
avrdude_message(MSG_INFO, "%s end\n", desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -216,17 +220,15 @@ static int set_frequency(avrftdi_t* ftdi, uint32_t freq)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This function sets or clears any pin, except SCK, SDI and SDO. Depending
|
* This function sets or clears any pin, except SCK, MISO and MOSI. Depending
|
||||||
* on the pin configuration, a non-zero value sets the pin in the 'active'
|
* on the pin configuration, a non-zero value sets the pin in the 'active'
|
||||||
* state (high active, low active) and a zero value sets the pin in the
|
* state (high active, low active) and a zero value sets the pin in the
|
||||||
* inactive state.
|
* inactive state.
|
||||||
* Because we configured the pin direction mask earlier, nothing bad can happen
|
* Because we configured the pin direction mask earlier, nothing bad can happen
|
||||||
* here.
|
* here.
|
||||||
*/
|
*/
|
||||||
static int set_pin(const PROGRAMMER *pgm, int pinfunc, int value) {
|
static int set_pin(PROGRAMMER * pgm, int pinfunc, int value)
|
||||||
if(pinfunc < 0 || pinfunc >= N_PINS)
|
{
|
||||||
return -1;
|
|
||||||
|
|
||||||
avrftdi_t* pdata = to_pdata(pgm);
|
avrftdi_t* pdata = to_pdata(pgm);
|
||||||
struct pindef_t pin = pgm->pin[pinfunc];
|
struct pindef_t pin = pgm->pin[pinfunc];
|
||||||
|
|
||||||
|
@ -248,50 +250,54 @@ static int set_pin(const PROGRAMMER *pgm, int pinfunc, int value) {
|
||||||
/*
|
/*
|
||||||
* Mandatory callbacks which boil down to GPIO.
|
* Mandatory callbacks which boil down to GPIO.
|
||||||
*/
|
*/
|
||||||
static int set_led_pgm(const PROGRAMMER *pgm, int value) {
|
static int set_led_pgm(struct programmer_t * pgm, int value)
|
||||||
|
{
|
||||||
return set_pin(pgm, PIN_LED_PGM, value);
|
return set_pin(pgm, PIN_LED_PGM, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int set_led_rdy(const PROGRAMMER *pgm, int value) {
|
static int set_led_rdy(struct programmer_t * pgm, int value)
|
||||||
|
{
|
||||||
return set_pin(pgm, PIN_LED_RDY, value);
|
return set_pin(pgm, PIN_LED_RDY, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int set_led_err(const PROGRAMMER *pgm, int value) {
|
static int set_led_err(struct programmer_t * pgm, int value)
|
||||||
|
{
|
||||||
return set_pin(pgm, PIN_LED_ERR, value);
|
return set_pin(pgm, PIN_LED_ERR, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int set_led_vfy(const PROGRAMMER *pgm, int value) {
|
static int set_led_vfy(struct programmer_t * pgm, int value)
|
||||||
|
{
|
||||||
return set_pin(pgm, PIN_LED_VFY, value);
|
return set_pin(pgm, PIN_LED_VFY, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void avrftdi_enable(PROGRAMMER *pgm, const AVRPART *p) {
|
static void avrftdi_enable(PROGRAMMER * pgm)
|
||||||
|
{
|
||||||
set_pin(pgm, PPI_AVR_BUFF, ON);
|
set_pin(pgm, PPI_AVR_BUFF, ON);
|
||||||
|
|
||||||
// Switch to TPI initialisation in avrftdi_tpi.c
|
|
||||||
if(p->prog_modes & PM_TPI)
|
|
||||||
avrftdi_tpi_initpgm(pgm);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void avrftdi_disable(const PROGRAMMER *pgm) {
|
static void avrftdi_disable(PROGRAMMER * pgm)
|
||||||
|
{
|
||||||
set_pin(pgm, PPI_AVR_BUFF, OFF);
|
set_pin(pgm, PPI_AVR_BUFF, OFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void avrftdi_powerup(const PROGRAMMER *pgm) {
|
static void avrftdi_powerup(PROGRAMMER * pgm)
|
||||||
|
{
|
||||||
set_pin(pgm, PPI_AVR_VCC, ON);
|
set_pin(pgm, PPI_AVR_VCC, ON);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void avrftdi_powerdown(const PROGRAMMER *pgm) {
|
static void avrftdi_powerdown(PROGRAMMER * pgm)
|
||||||
|
{
|
||||||
set_pin(pgm, PPI_AVR_VCC, OFF);
|
set_pin(pgm, PPI_AVR_VCC, OFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int set_data(const PROGRAMMER *pgm, unsigned char *buf, unsigned char data, bool read_data) {
|
static inline int set_data(PROGRAMMER * pgm, unsigned char *buf, unsigned char data, bool read_data) {
|
||||||
int j;
|
int j;
|
||||||
int buf_pos = 0;
|
int buf_pos = 0;
|
||||||
unsigned char bit = 0x80;
|
unsigned char bit = 0x80;
|
||||||
avrftdi_t* pdata = to_pdata(pgm);
|
avrftdi_t* pdata = to_pdata(pgm);
|
||||||
|
|
||||||
for (j=0; j<8; j++) {
|
for (j=0; j<8; j++) {
|
||||||
pdata->pin_value = SET_BITS_0(pdata->pin_value,pgm,PIN_AVR_SDO,data & bit);
|
pdata->pin_value = SET_BITS_0(pdata->pin_value,pgm,PIN_AVR_MOSI,data & bit);
|
||||||
pdata->pin_value = SET_BITS_0(pdata->pin_value,pgm,PIN_AVR_SCK,0);
|
pdata->pin_value = SET_BITS_0(pdata->pin_value,pgm,PIN_AVR_SCK,0);
|
||||||
buf[buf_pos++] = SET_BITS_LOW;
|
buf[buf_pos++] = SET_BITS_LOW;
|
||||||
buf[buf_pos++] = (pdata->pin_value) & 0xff;
|
buf[buf_pos++] = (pdata->pin_value) & 0xff;
|
||||||
|
@ -318,7 +324,7 @@ static inline int set_data(const PROGRAMMER *pgm, unsigned char *buf, unsigned c
|
||||||
return buf_pos;
|
return buf_pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline unsigned char extract_data(const PROGRAMMER *pgm, unsigned char *buf, int offset) {
|
static inline unsigned char extract_data(PROGRAMMER * pgm, unsigned char *buf, int offset) {
|
||||||
int j;
|
int j;
|
||||||
unsigned char bit = 0x80;
|
unsigned char bit = 0x80;
|
||||||
unsigned char r = 0;
|
unsigned char r = 0;
|
||||||
|
@ -326,7 +332,7 @@ static inline unsigned char extract_data(const PROGRAMMER *pgm, unsigned char *b
|
||||||
buf += offset * 16; // 2 bytes per bit, 8 bits
|
buf += offset * 16; // 2 bytes per bit, 8 bits
|
||||||
for (j=0; j<8; j++) {
|
for (j=0; j<8; j++) {
|
||||||
uint16_t in = buf[0] | (buf[1] << 8);
|
uint16_t in = buf[0] | (buf[1] << 8);
|
||||||
if (GET_BITS_0(in,pgm,PIN_AVR_SDI)) {
|
if (GET_BITS_0(in,pgm,PIN_AVR_MISO)) {
|
||||||
r |= bit;
|
r |= bit;
|
||||||
}
|
}
|
||||||
buf += 2; // 2 bytes per input
|
buf += 2; // 2 bytes per input
|
||||||
|
@ -336,7 +342,7 @@ static inline unsigned char extract_data(const PROGRAMMER *pgm, unsigned char *b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int avrftdi_transmit_bb(const PROGRAMMER *pgm, unsigned char mode, const unsigned char *buf,
|
static int avrftdi_transmit_bb(PROGRAMMER * pgm, unsigned char mode, const unsigned char *buf,
|
||||||
unsigned char *data, int buf_size)
|
unsigned char *data, int buf_size)
|
||||||
{
|
{
|
||||||
size_t remaining = buf_size;
|
size_t remaining = buf_size;
|
||||||
|
@ -345,13 +351,10 @@ static int avrftdi_transmit_bb(const PROGRAMMER *pgm, unsigned char mode, const
|
||||||
size_t blocksize = pdata->rx_buffer_size/2; // we are reading 2 bytes per data byte
|
size_t blocksize = pdata->rx_buffer_size/2; // we are reading 2 bytes per data byte
|
||||||
|
|
||||||
// determine a maximum size of data block
|
// determine a maximum size of data block
|
||||||
size_t max_size = MIN(pdata->ftdic->max_packet_size, (unsigned int) pdata->tx_buffer_size);
|
size_t max_size = MIN(pdata->ftdic->max_packet_size,pdata->tx_buffer_size);
|
||||||
// select block size so that resulting commands does not exceed max_size if possible
|
// select block size so that resulting commands does not exceed max_size if possible
|
||||||
blocksize = MAX(1,(max_size-7)/((8*2*6)+(8*1*2)));
|
blocksize = MAX(1,(max_size-7)/((8*2*6)+(8*1*2)));
|
||||||
// msg_info("blocksize %d \n", blocksize);
|
//avrdude_message(MSG_INFO, "blocksize %d \n",blocksize);
|
||||||
|
|
||||||
unsigned char* send_buffer = alloca((8 * 2 * 6) * blocksize + (8 * 1 * 2) * blocksize + 7);
|
|
||||||
unsigned char* recv_buffer = alloca(2 * 16 * blocksize);
|
|
||||||
|
|
||||||
while(remaining)
|
while(remaining)
|
||||||
{
|
{
|
||||||
|
@ -361,9 +364,11 @@ static int avrftdi_transmit_bb(const PROGRAMMER *pgm, unsigned char mode, const
|
||||||
// (8*2) outputs per data byte, 6 transmit bytes per output (SET_BITS_LOW/HIGH),
|
// (8*2) outputs per data byte, 6 transmit bytes per output (SET_BITS_LOW/HIGH),
|
||||||
// (8*1) inputs per data byte, 2 transmit bytes per input (GET_BITS_LOW/HIGH),
|
// (8*1) inputs per data byte, 2 transmit bytes per input (GET_BITS_LOW/HIGH),
|
||||||
// 1x SEND_IMMEDIATE
|
// 1x SEND_IMMEDIATE
|
||||||
|
unsigned char send_buffer[(8*2*6)*transfer_size+(8*1*2)*transfer_size+7];
|
||||||
int len = 0;
|
int len = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
for(size_t i = 0 ; i < transfer_size; i++) {
|
for(i = 0 ; i< transfer_size; i++) {
|
||||||
len += set_data(pgm, send_buffer + len, buf[written+i], (mode & MPSSE_DO_READ) != 0);
|
len += set_data(pgm, send_buffer + len, buf[written+i], (mode & MPSSE_DO_READ) != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -379,15 +384,16 @@ static int avrftdi_transmit_bb(const PROGRAMMER *pgm, unsigned char mode, const
|
||||||
|
|
||||||
E(ftdi_write_data(pdata->ftdic, send_buffer, len) != len, pdata->ftdic);
|
E(ftdi_write_data(pdata->ftdic, send_buffer, len) != len, pdata->ftdic);
|
||||||
if (mode & MPSSE_DO_READ) {
|
if (mode & MPSSE_DO_READ) {
|
||||||
|
unsigned char recv_buffer[2*16*transfer_size];
|
||||||
int n;
|
int n;
|
||||||
size_t k = 0;
|
int k = 0;
|
||||||
do {
|
do {
|
||||||
n = ftdi_read_data(pdata->ftdic, &recv_buffer[k], 2*16*transfer_size - k);
|
n = ftdi_read_data(pdata->ftdic, &recv_buffer[k], 2*16*transfer_size - k);
|
||||||
E(n < 0, pdata->ftdic);
|
E(n < 0, pdata->ftdic);
|
||||||
k += n;
|
k += n;
|
||||||
} while (k < transfer_size);
|
} while (k < transfer_size);
|
||||||
|
|
||||||
for(size_t i = 0 ; i< transfer_size; i++) {
|
for(i = 0 ; i< transfer_size; i++) {
|
||||||
data[written + i] = extract_data(pgm, recv_buffer, i);
|
data[written + i] = extract_data(pgm, recv_buffer, i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -430,7 +436,7 @@ static int avrftdi_transmit_mpsse(avrftdi_t* pdata, unsigned char mode, const un
|
||||||
{
|
{
|
||||||
size_t transfer_size = (remaining > blocksize) ? blocksize : remaining;
|
size_t transfer_size = (remaining > blocksize) ? blocksize : remaining;
|
||||||
|
|
||||||
E((size_t) ftdi_write_data(pdata->ftdic, (unsigned char*)&buf[written], transfer_size) != transfer_size, pdata->ftdic);
|
E(ftdi_write_data(pdata->ftdic, (unsigned char*)&buf[written], transfer_size) != transfer_size, pdata->ftdic);
|
||||||
#if 0
|
#if 0
|
||||||
if(remaining < blocksize)
|
if(remaining < blocksize)
|
||||||
E(ftdi_write_data(pdata->ftdic, &si, sizeof(si)) != sizeof(si), pdata->ftdic);
|
E(ftdi_write_data(pdata->ftdic, &si, sizeof(si)) != sizeof(si), pdata->ftdic);
|
||||||
|
@ -438,7 +444,7 @@ static int avrftdi_transmit_mpsse(avrftdi_t* pdata, unsigned char mode, const un
|
||||||
|
|
||||||
if (mode & MPSSE_DO_READ) {
|
if (mode & MPSSE_DO_READ) {
|
||||||
int n;
|
int n;
|
||||||
size_t k = 0;
|
int k = 0;
|
||||||
do {
|
do {
|
||||||
n = ftdi_read_data(pdata->ftdic, &data[written + k], transfer_size - k);
|
n = ftdi_read_data(pdata->ftdic, &data[written + k], transfer_size - k);
|
||||||
E(n < 0, pdata->ftdic);
|
E(n < 0, pdata->ftdic);
|
||||||
|
@ -454,7 +460,7 @@ static int avrftdi_transmit_mpsse(avrftdi_t* pdata, unsigned char mode, const un
|
||||||
return written;
|
return written;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int avrftdi_transmit(const PROGRAMMER *pgm, unsigned char mode, const unsigned char *buf,
|
static inline int avrftdi_transmit(PROGRAMMER * pgm, unsigned char mode, const unsigned char *buf,
|
||||||
unsigned char *data, int buf_size)
|
unsigned char *data, int buf_size)
|
||||||
{
|
{
|
||||||
avrftdi_t* pdata = to_pdata(pgm);
|
avrftdi_t* pdata = to_pdata(pgm);
|
||||||
|
@ -513,7 +519,8 @@ static int write_flush(avrftdi_t* pdata)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int avrftdi_check_pins_bb(const PROGRAMMER *pgm, bool output) {
|
static int avrftdi_check_pins_bb(PROGRAMMER * pgm, bool output)
|
||||||
|
{
|
||||||
int pin;
|
int pin;
|
||||||
|
|
||||||
/* pin checklist. */
|
/* pin checklist. */
|
||||||
|
@ -524,7 +531,7 @@ static int avrftdi_check_pins_bb(const PROGRAMMER *pgm, bool output) {
|
||||||
/* value for 8/12/16 bit wide interface */
|
/* value for 8/12/16 bit wide interface */
|
||||||
int valid_mask = ((1 << pdata->pin_limit) - 1);
|
int valid_mask = ((1 << pdata->pin_limit) - 1);
|
||||||
|
|
||||||
log_debug("Using valid mask bitbanging: 0x%08x\n", valid_mask);
|
log_debug("Using valid mask bibanging: 0x%08x\n", valid_mask);
|
||||||
static struct pindef_t valid_pins;
|
static struct pindef_t valid_pins;
|
||||||
valid_pins.mask[0] = valid_mask;
|
valid_pins.mask[0] = valid_mask;
|
||||||
valid_pins.inverse[0] = valid_mask ;
|
valid_pins.inverse[0] = valid_mask ;
|
||||||
|
@ -540,7 +547,8 @@ static int avrftdi_check_pins_bb(const PROGRAMMER *pgm, bool output) {
|
||||||
return pins_check(pgm, pin_checklist, N_PINS, output);
|
return pins_check(pgm, pin_checklist, N_PINS, output);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int avrftdi_check_pins_mpsse(const PROGRAMMER *pgm, bool output) {
|
static int avrftdi_check_pins_mpsse(PROGRAMMER * pgm, bool output)
|
||||||
|
{
|
||||||
int pin;
|
int pin;
|
||||||
|
|
||||||
/* pin checklist. */
|
/* pin checklist. */
|
||||||
|
@ -548,16 +556,16 @@ static int avrftdi_check_pins_mpsse(const PROGRAMMER *pgm, bool output) {
|
||||||
|
|
||||||
avrftdi_t* pdata = to_pdata(pgm);
|
avrftdi_t* pdata = to_pdata(pgm);
|
||||||
|
|
||||||
/* SCK/SDO/SDI are fixed and not invertible? */
|
/* SCK/MOSI/MISO are fixed and not invertable?*/
|
||||||
/* TODO: inverted SCK/SDI/SDO */
|
/* TODO: inverted SCK/MISO/MOSI */
|
||||||
static const struct pindef_t valid_pins_SCK = {{0x01},{0x00}};
|
static const struct pindef_t valid_pins_SCK = {{0x01},{0x00}} ;
|
||||||
static const struct pindef_t valid_pins_SDO = {{0x02},{0x00}};
|
static const struct pindef_t valid_pins_MOSI = {{0x02},{0x00}} ;
|
||||||
static const struct pindef_t valid_pins_SDI = {{0x04},{0x00}};
|
static const struct pindef_t valid_pins_MISO = {{0x04},{0x00}} ;
|
||||||
|
|
||||||
/* value for 8/12/16 bit wide interface for other pins */
|
/* value for 8/12/16 bit wide interface for other pins */
|
||||||
int valid_mask = ((1 << pdata->pin_limit) - 1);
|
int valid_mask = ((1 << pdata->pin_limit) - 1);
|
||||||
/* mask out SCK/SDI/SDO */
|
/* mask out SCK/MISO/MOSI */
|
||||||
valid_mask &= ~((1 << FTDI_SCK) | (1 << FTDI_SDO) | (1 << FTDI_SDI));
|
valid_mask &= ~((1 << FTDI_SCK) | (1 << FTDI_MOSI) | (1 << FTDI_MISO));
|
||||||
|
|
||||||
log_debug("Using valid mask mpsse: 0x%08x\n", valid_mask);
|
log_debug("Using valid mask mpsse: 0x%08x\n", valid_mask);
|
||||||
static struct pindef_t valid_pins_others;
|
static struct pindef_t valid_pins_others;
|
||||||
|
@ -574,17 +582,18 @@ static int avrftdi_check_pins_mpsse(const PROGRAMMER *pgm, bool output) {
|
||||||
/* now set mpsse specific pins */
|
/* now set mpsse specific pins */
|
||||||
pin_checklist[PIN_AVR_SCK].mandatory = 1;
|
pin_checklist[PIN_AVR_SCK].mandatory = 1;
|
||||||
pin_checklist[PIN_AVR_SCK].valid_pins = &valid_pins_SCK;
|
pin_checklist[PIN_AVR_SCK].valid_pins = &valid_pins_SCK;
|
||||||
pin_checklist[PIN_AVR_SDO].mandatory = 1;
|
pin_checklist[PIN_AVR_MOSI].mandatory = 1;
|
||||||
pin_checklist[PIN_AVR_SDO].valid_pins = &valid_pins_SDO;
|
pin_checklist[PIN_AVR_MOSI].valid_pins = &valid_pins_MOSI;
|
||||||
pin_checklist[PIN_AVR_SDI].mandatory = 1;
|
pin_checklist[PIN_AVR_MISO].mandatory = 1;
|
||||||
pin_checklist[PIN_AVR_SDI].valid_pins = &valid_pins_SDI;
|
pin_checklist[PIN_AVR_MISO].valid_pins = &valid_pins_MISO;
|
||||||
pin_checklist[PIN_AVR_RESET].mandatory = 1;
|
pin_checklist[PIN_AVR_RESET].mandatory = 1;
|
||||||
|
|
||||||
/* assumes all checklists above have same number of entries */
|
/* assumes all checklists above have same number of entries */
|
||||||
return pins_check(pgm, pin_checklist, N_PINS, output);
|
return pins_check(pgm, pin_checklist, N_PINS, output);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int avrftdi_pin_setup(const PROGRAMMER *pgm) {
|
static int avrftdi_pin_setup(PROGRAMMER * pgm)
|
||||||
|
{
|
||||||
int pin;
|
int pin;
|
||||||
|
|
||||||
/*************
|
/*************
|
||||||
|
@ -602,31 +611,30 @@ static int avrftdi_pin_setup(const PROGRAMMER *pgm) {
|
||||||
avrftdi_check_pins_bb(pgm, true);
|
avrftdi_check_pins_bb(pgm, true);
|
||||||
log_err("Pin configuration for FTDI MPSSE must be:\n");
|
log_err("Pin configuration for FTDI MPSSE must be:\n");
|
||||||
log_err("%s: 0, %s: 1, %s: 2 (is: %s, %s, %s)\n", avr_pin_name(PIN_AVR_SCK),
|
log_err("%s: 0, %s: 1, %s: 2 (is: %s, %s, %s)\n", avr_pin_name(PIN_AVR_SCK),
|
||||||
avr_pin_name(PIN_AVR_SDO), avr_pin_name(PIN_AVR_SDI),
|
avr_pin_name(PIN_AVR_MOSI), avr_pin_name(PIN_AVR_MISO),
|
||||||
pins_to_str(&pgm->pin[PIN_AVR_SCK]),
|
pins_to_str(&pgm->pin[PIN_AVR_SCK]),
|
||||||
pins_to_str(&pgm->pin[PIN_AVR_SDO]),
|
pins_to_str(&pgm->pin[PIN_AVR_MOSI]),
|
||||||
pins_to_str(&pgm->pin[PIN_AVR_SDI]));
|
pins_to_str(&pgm->pin[PIN_AVR_MISO]));
|
||||||
log_err("If other pin configuration is used, fallback to slower bitbanging mode is used.\n");
|
log_err("If other pin configuration is used, fallback to slower bitbanging mode is used.\n");
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
pdata->use_bitbanging = !pin_check_mpsse;
|
pdata->use_bitbanging = !pin_check_mpsse;
|
||||||
if (pdata->use_bitbanging)
|
if (pdata->use_bitbanging) log_info("Because of pin configuration fallback to bitbanging mode.\n");
|
||||||
log_info("Because of pin configuration fallback to bitbanging mode.\n");
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* TODO: No need to fail for a wrongly configured led or something.
|
* TODO: No need to fail for a wrongly configured led or something.
|
||||||
* Maybe we should only fail for SCK; SDI, SDO, RST (and probably
|
* Maybe we should only fail for SCK; MISO, MOSI, RST (and probably
|
||||||
* VCC and BUFF).
|
* VCC and BUFF).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* everything is an output, except SDI */
|
/* everything is an output, except MISO */
|
||||||
for(pin = 0; pin < N_PINS; ++pin) {
|
for(pin = 0; pin < N_PINS; ++pin) {
|
||||||
pdata->pin_direction |= pgm->pin[pin].mask[0];
|
pdata->pin_direction |= pgm->pin[pin].mask[0];
|
||||||
pdata->pin_value = SET_BITS_0(pdata->pin_value, pgm, pin, OFF);
|
pdata->pin_value = SET_BITS_0(pdata->pin_value, pgm, pin, OFF);
|
||||||
}
|
}
|
||||||
pdata->pin_direction &= ~pgm->pin[PIN_AVR_SDI].mask[0];
|
pdata->pin_direction &= ~pgm->pin[PIN_AVR_MISO].mask[0];
|
||||||
|
|
||||||
for(pin = PIN_LED_ERR; pin < N_PINS; ++pin) {
|
for(pin = PIN_LED_ERR; pin < N_PINS; ++pin) {
|
||||||
pdata->led_mask |= pgm->pin[pin].mask[0];
|
pdata->led_mask |= pgm->pin[pin].mask[0];
|
||||||
|
@ -639,9 +647,10 @@ static int avrftdi_pin_setup(const PROGRAMMER *pgm) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int avrftdi_open(PROGRAMMER *pgm, const char *port) {
|
static int avrftdi_open(PROGRAMMER * pgm, char *port)
|
||||||
|
{
|
||||||
int vid, pid, interface, index, err;
|
int vid, pid, interface, index, err;
|
||||||
const char *serial, *desc;
|
char * serial, *desc;
|
||||||
|
|
||||||
avrftdi_t* pdata = to_pdata(pgm);
|
avrftdi_t* pdata = to_pdata(pgm);
|
||||||
|
|
||||||
|
@ -661,7 +670,8 @@ static int avrftdi_open(PROGRAMMER *pgm, const char *port) {
|
||||||
if (usbpid) {
|
if (usbpid) {
|
||||||
pid = *(int *)(ldata(usbpid));
|
pid = *(int *)(ldata(usbpid));
|
||||||
if (lnext(usbpid))
|
if (lnext(usbpid))
|
||||||
pmsg_warning("using PID 0x%04x, ignoring remaining PIDs in list\n", pid);
|
avrdude_message(MSG_INFO, "%s: Warning: using PID 0x%04x, ignoring remaining PIDs in list\n",
|
||||||
|
progname, pid);
|
||||||
} else
|
} else
|
||||||
pid = USB_DEVICE_FT2232;
|
pid = USB_DEVICE_FT2232;
|
||||||
|
|
||||||
|
@ -695,7 +705,7 @@ static int avrftdi_open(PROGRAMMER *pgm, const char *port) {
|
||||||
if(err) {
|
if(err) {
|
||||||
log_err("Error %d occurred: %s\n", err, ftdi_get_error_string(pdata->ftdic));
|
log_err("Error %d occurred: %s\n", err, ftdi_get_error_string(pdata->ftdic));
|
||||||
//stupid hack, because avrdude calls pgm->close() even when pgm->open() fails
|
//stupid hack, because avrdude calls pgm->close() even when pgm->open() fails
|
||||||
//and usb_dev is initialized to the last usb device from probing
|
//and usb_dev is intialized to the last usb device from probing
|
||||||
pdata->ftdic->usb_dev = NULL;
|
pdata->ftdic->usb_dev = NULL;
|
||||||
return err;
|
return err;
|
||||||
} else {
|
} else {
|
||||||
|
@ -710,11 +720,7 @@ static int avrftdi_open(PROGRAMMER *pgm, const char *port) {
|
||||||
/* set SPI mode */
|
/* set SPI mode */
|
||||||
E(ftdi_set_bitmode(pdata->ftdic, 0, BITMODE_RESET) < 0, pdata->ftdic);
|
E(ftdi_set_bitmode(pdata->ftdic, 0, BITMODE_RESET) < 0, pdata->ftdic);
|
||||||
E(ftdi_set_bitmode(pdata->ftdic, pdata->pin_direction & 0xff, BITMODE_MPSSE) < 0, pdata->ftdic);
|
E(ftdi_set_bitmode(pdata->ftdic, pdata->pin_direction & 0xff, BITMODE_MPSSE) < 0, pdata->ftdic);
|
||||||
#ifdef HAVE_FTDI_TCIOFLUSH
|
|
||||||
E(ftdi_tcioflush(pdata->ftdic), pdata->ftdic);
|
|
||||||
#else
|
|
||||||
E(ftdi_usb_purge_buffers(pdata->ftdic), pdata->ftdic);
|
E(ftdi_usb_purge_buffers(pdata->ftdic), pdata->ftdic);
|
||||||
#endif
|
|
||||||
|
|
||||||
write_flush(pdata);
|
write_flush(pdata);
|
||||||
|
|
||||||
|
@ -751,11 +757,7 @@ static int avrftdi_open(PROGRAMMER *pgm, const char *port) {
|
||||||
pdata->tx_buffer_size = 1024;
|
pdata->tx_buffer_size = 1024;
|
||||||
break;
|
break;
|
||||||
#else
|
#else
|
||||||
#ifdef _MSC_VER
|
|
||||||
#pragma message("No support for 232H, use a newer libftdi, version >= 0.20")
|
|
||||||
#else
|
|
||||||
#warning No support for 232H, use a newer libftdi, version >= 0.20
|
#warning No support for 232H, use a newer libftdi, version >= 0.20
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
case TYPE_4232H:
|
case TYPE_4232H:
|
||||||
pdata->pin_limit = 8;
|
pdata->pin_limit = 8;
|
||||||
|
@ -806,10 +808,11 @@ static void avrftdi_close(PROGRAMMER * pgm)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int avrftdi_initialize(const PROGRAMMER *pgm, const AVRPART *p) {
|
static int avrftdi_initialize(PROGRAMMER * pgm, AVRPART * p)
|
||||||
|
{
|
||||||
avrftdi_powerup(pgm);
|
avrftdi_powerup(pgm);
|
||||||
|
|
||||||
if(p->prog_modes & PM_TPI)
|
if(p->flags & AVRPART_HAS_TPI)
|
||||||
{
|
{
|
||||||
/* see avrftdi_tpi.c */
|
/* see avrftdi_tpi.c */
|
||||||
avrftdi_tpi_initialize(pgm, p);
|
avrftdi_tpi_initialize(pgm, p);
|
||||||
|
@ -828,25 +831,28 @@ static int avrftdi_initialize(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
|
|
||||||
/*setting rst back to 0 */
|
/*setting rst back to 0 */
|
||||||
set_pin(pgm, PIN_AVR_RESET, OFF);
|
set_pin(pgm, PIN_AVR_RESET, OFF);
|
||||||
/*wait at least 20ms before issuing spi commands to avr */
|
/*wait at least 20ms bevor issuing spi commands to avr */
|
||||||
usleep(20 * 1000);
|
usleep(20 * 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
return pgm->program_enable(pgm, p);
|
return pgm->program_enable(pgm, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void avrftdi_display(const PROGRAMMER *pgm, const char *p) {
|
static void avrftdi_display(PROGRAMMER * pgm, const char *p)
|
||||||
// print the full pin definitions as in ft245r ?
|
{
|
||||||
|
// print the full pin definitiions as in ft245r ?
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int avrftdi_cmd(const PROGRAMMER *pgm, const unsigned char *cmd, unsigned char *res) {
|
static int avrftdi_cmd(PROGRAMMER * pgm, const unsigned char *cmd, unsigned char *res)
|
||||||
|
{
|
||||||
return avrftdi_transmit(pgm, MPSSE_DO_READ | MPSSE_DO_WRITE, cmd, res, 4);
|
return avrftdi_transmit(pgm, MPSSE_DO_READ | MPSSE_DO_WRITE, cmd, res, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int avrftdi_program_enable(const PROGRAMMER *pgm, const AVRPART *p) {
|
static int avrftdi_program_enable(PROGRAMMER * pgm, AVRPART * p)
|
||||||
|
{
|
||||||
int i;
|
int i;
|
||||||
unsigned char buf[4];
|
unsigned char buf[4];
|
||||||
|
|
||||||
|
@ -877,7 +883,8 @@ static int avrftdi_program_enable(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int avrftdi_chip_erase(const PROGRAMMER *pgm, const AVRPART *p) {
|
static int avrftdi_chip_erase(PROGRAMMER * pgm, AVRPART * p)
|
||||||
|
{
|
||||||
unsigned char cmd[4];
|
unsigned char cmd[4];
|
||||||
unsigned char res[4];
|
unsigned char res[4];
|
||||||
|
|
||||||
|
@ -899,20 +906,10 @@ static int avrftdi_chip_erase(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
|
|
||||||
/* Load extended address byte command */
|
/* Load extended address byte command */
|
||||||
static int
|
static int
|
||||||
avrftdi_lext(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *m, unsigned int address) {
|
avrftdi_lext(PROGRAMMER *pgm, AVRPART *p, AVRMEM *m, unsigned int address)
|
||||||
/* nothing to do if load extended address command unavailable */
|
{
|
||||||
if(m->op[AVR_OP_LOAD_EXT_ADDR] == NULL)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
avrftdi_t *pdata = to_pdata(pgm);
|
|
||||||
unsigned char buf[] = { 0x00, 0x00, 0x00, 0x00 };
|
unsigned char buf[] = { 0x00, 0x00, 0x00, 0x00 };
|
||||||
|
|
||||||
/* only send load extended address command if high byte changed */
|
|
||||||
if(pdata->lext_byte == (uint8_t) (address>>16))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
pdata->lext_byte = (uint8_t) (address>>16);
|
|
||||||
|
|
||||||
avr_set_bits(m->op[AVR_OP_LOAD_EXT_ADDR], buf);
|
avr_set_bits(m->op[AVR_OP_LOAD_EXT_ADDR], buf);
|
||||||
avr_set_addr(m->op[AVR_OP_LOAD_EXT_ADDR], buf, address);
|
avr_set_addr(m->op[AVR_OP_LOAD_EXT_ADDR], buf, address);
|
||||||
|
|
||||||
|
@ -926,7 +923,7 @@ avrftdi_lext(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *m, unsigned
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int avrftdi_eeprom_write(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *m,
|
static int avrftdi_eeprom_write(PROGRAMMER *pgm, AVRPART *p, AVRMEM *m,
|
||||||
unsigned int page_size, unsigned int addr, unsigned int len)
|
unsigned int page_size, unsigned int addr, unsigned int len)
|
||||||
{
|
{
|
||||||
unsigned char cmd[] = { 0x00, 0x00, 0x00, 0x00 };
|
unsigned char cmd[] = { 0x00, 0x00, 0x00, 0x00 };
|
||||||
|
@ -948,16 +945,14 @@ static int avrftdi_eeprom_write(const PROGRAMMER *pgm, const AVRPART *p, const A
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int avrftdi_eeprom_read(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *m,
|
static int avrftdi_eeprom_read(PROGRAMMER *pgm, AVRPART *p, AVRMEM *m,
|
||||||
unsigned int page_size, unsigned int addr, unsigned int len)
|
unsigned int page_size, unsigned int addr, unsigned int len)
|
||||||
{
|
{
|
||||||
unsigned char cmd[4];
|
unsigned char cmd[4];
|
||||||
|
unsigned char buffer[len], *bufptr = buffer;
|
||||||
unsigned int add;
|
unsigned int add;
|
||||||
unsigned char* buffer = alloca(len);
|
|
||||||
unsigned char* bufptr = buffer;
|
|
||||||
|
|
||||||
memset(buffer, 0, len);
|
|
||||||
|
|
||||||
|
memset(buffer, 0, sizeof(buffer));
|
||||||
for (add = addr; add < addr + len; add++)
|
for (add = addr; add < addr + len; add++)
|
||||||
{
|
{
|
||||||
memset(cmd, 0, sizeof(cmd));
|
memset(cmd, 0, sizeof(cmd));
|
||||||
|
@ -974,19 +969,20 @@ static int avrftdi_eeprom_read(const PROGRAMMER *pgm, const AVRPART *p, const AV
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int avrftdi_flash_write(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *m,
|
static int avrftdi_flash_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||||
unsigned int page_size, unsigned int addr, unsigned int len)
|
unsigned int page_size, unsigned int addr, unsigned int len)
|
||||||
{
|
{
|
||||||
|
int use_lext_address = m->op[AVR_OP_LOAD_EXT_ADDR] != NULL;
|
||||||
|
|
||||||
unsigned int word;
|
unsigned int word;
|
||||||
unsigned int poll_index;
|
unsigned int poll_index;
|
||||||
|
unsigned int buf_size;
|
||||||
|
|
||||||
unsigned char poll_byte;
|
unsigned char poll_byte;
|
||||||
unsigned char *buffer = &m->buf[addr];
|
unsigned char *buffer = &m->buf[addr];
|
||||||
unsigned int buf_size = 4 * len + 4;
|
unsigned char buf[4*len+4], *bufptr = buf;
|
||||||
unsigned char* buf = alloca(buf_size);
|
|
||||||
unsigned char* bufptr = buf;
|
|
||||||
|
|
||||||
memset(buf, 0, buf_size);
|
memset(buf, 0, sizeof(buf));
|
||||||
|
|
||||||
/* pre-check opcodes */
|
/* pre-check opcodes */
|
||||||
if (m->op[AVR_OP_LOADPAGE_LO] == NULL) {
|
if (m->op[AVR_OP_LOADPAGE_LO] == NULL) {
|
||||||
|
@ -998,19 +994,29 @@ static int avrftdi_flash_write(const PROGRAMMER *pgm, const AVRPART *p, const AV
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(page_size != (unsigned int) m->page_size) {
|
if(page_size != m->page_size) {
|
||||||
log_warn("Parameter page_size is %d, ", page_size);
|
log_warn("Parameter page_size is %d, ", page_size);
|
||||||
log_warn("but m->page_size is %d. Using the latter.\n", m->page_size);
|
log_warn("but m->page_size is %d. Using the latter.\n", m->page_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
page_size = m->page_size;
|
page_size = m->page_size;
|
||||||
|
|
||||||
/* on large-flash devices > 128k issue extended address command when needed */
|
/* if we do cross a 64k word boundary (or write the
|
||||||
if(avrftdi_lext(pgm, p, m, addr/2) < 0)
|
* first page), we need to issue a 'load extended
|
||||||
return -1;
|
* address byte' command, which is defined as 0x4d
|
||||||
|
* 0x00 <address byte> 0x00. As far as i know, this
|
||||||
|
* is only available on 256k parts. 64k word is 128k
|
||||||
|
* bytes.
|
||||||
|
* write the command only once.
|
||||||
|
*/
|
||||||
|
if(use_lext_address && (((addr/2) & 0xffff0000))) {
|
||||||
|
if (0 > avrftdi_lext(pgm, p, m, addr/2))
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
/* prepare the command stream for the whole page */
|
/* prepare the command stream for the whole page */
|
||||||
/* addr is in bytes, but we program in words. */
|
/* addr is in bytes, but we program in words. addr/2 should be something
|
||||||
|
* like addr >> WORD_SHIFT, though */
|
||||||
for(word = addr/2; word < (len + addr)/2; word++)
|
for(word = addr/2; word < (len + addr)/2; word++)
|
||||||
{
|
{
|
||||||
log_debug("-< bytes = %d of %d\n", word * 2, len + addr);
|
log_debug("-< bytes = %d of %d\n", word * 2, len + addr);
|
||||||
|
@ -1039,14 +1045,15 @@ static int avrftdi_flash_write(const PROGRAMMER *pgm, const AVRPART *p, const AV
|
||||||
bufptr += 4;
|
bufptr += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* find a poll byte. We cannot poll a value of 0xff, so look
|
/* find a poll byte. we cannot poll a value of 0xff, so look
|
||||||
* for a value != 0xff
|
* for a value != 0xff
|
||||||
*/
|
*/
|
||||||
for(poll_index = addr+len-1; poll_index+1 > addr; poll_index--)
|
for(poll_index = addr+len-1; poll_index > addr-1; poll_index--)
|
||||||
if(m->buf[poll_index] != 0xff)
|
if(m->buf[poll_index] != 0xff)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if(poll_index+1 > addr) {
|
if((poll_index < addr + len) && m->buf[poll_index] != 0xff)
|
||||||
|
{
|
||||||
buf_size = bufptr - buf;
|
buf_size = bufptr - buf;
|
||||||
|
|
||||||
if(verbose > TRACE)
|
if(verbose > TRACE)
|
||||||
|
@ -1083,18 +1090,21 @@ static int avrftdi_flash_write(const PROGRAMMER *pgm, const AVRPART *p, const AV
|
||||||
/*
|
/*
|
||||||
*Reading from flash
|
*Reading from flash
|
||||||
*/
|
*/
|
||||||
static int avrftdi_flash_read(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *m,
|
static int avrftdi_flash_read(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||||
unsigned int page_size, unsigned int addr, unsigned int len)
|
unsigned int page_size, unsigned int addr, unsigned int len)
|
||||||
{
|
{
|
||||||
OPCODE * readop;
|
OPCODE * readop;
|
||||||
|
int byte, word;
|
||||||
|
int use_lext_address = m->op[AVR_OP_LOAD_EXT_ADDR] != NULL;
|
||||||
|
unsigned int address = addr/2;
|
||||||
|
|
||||||
unsigned int buf_size = 4 * len + 4;
|
unsigned char o_buf[4*len+4];
|
||||||
unsigned char* o_buf = alloca(buf_size);
|
unsigned char i_buf[4*len+4];
|
||||||
unsigned char* i_buf = alloca(buf_size);
|
unsigned int index;
|
||||||
|
|
||||||
|
|
||||||
memset(o_buf, 0, buf_size);
|
memset(o_buf, 0, sizeof(o_buf));
|
||||||
memset(i_buf, 0, buf_size);
|
memset(i_buf, 0, sizeof(i_buf));
|
||||||
|
|
||||||
/* pre-check opcodes */
|
/* pre-check opcodes */
|
||||||
if (m->op[AVR_OP_READ_LO] == NULL) {
|
if (m->op[AVR_OP_READ_LO] == NULL) {
|
||||||
|
@ -1106,11 +1116,13 @@ static int avrftdi_flash_read(const PROGRAMMER *pgm, const AVRPART *p, const AVR
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(avrftdi_lext(pgm, p, m, addr/2) < 0)
|
if(use_lext_address && ((address & 0xffff0000))) {
|
||||||
return -1;
|
if (0 > avrftdi_lext(pgm, p, m, address))
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
/* word addressing! */
|
/* word addressing! */
|
||||||
for(unsigned int word = addr/2, index = 0; word < (addr + len)/2; word++)
|
for(word = addr/2, index = 0; word < (addr + len)/2; word++)
|
||||||
{
|
{
|
||||||
/* one byte is transferred via a 4-byte opcode.
|
/* one byte is transferred via a 4-byte opcode.
|
||||||
* TODO: reduce magic numbers
|
* TODO: reduce magic numbers
|
||||||
|
@ -1141,7 +1153,7 @@ static int avrftdi_flash_read(const PROGRAMMER *pgm, const AVRPART *p, const AVR
|
||||||
memset(&m->buf[addr], 0, page_size);
|
memset(&m->buf[addr], 0, page_size);
|
||||||
|
|
||||||
/* every (read) op is 4 bytes in size and yields one byte of memory data */
|
/* every (read) op is 4 bytes in size and yields one byte of memory data */
|
||||||
for(unsigned int byte = 0; byte < page_size; byte++) {
|
for(byte = 0; byte < page_size; byte++) {
|
||||||
if(byte & 1)
|
if(byte & 1)
|
||||||
readop = m->op[AVR_OP_READ_HI];
|
readop = m->op[AVR_OP_READ_HI];
|
||||||
else
|
else
|
||||||
|
@ -1159,7 +1171,7 @@ static int avrftdi_flash_read(const PROGRAMMER *pgm, const AVRPART *p, const AVR
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int avrftdi_paged_write(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *m,
|
static int avrftdi_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||||
unsigned int page_size, unsigned int addr, unsigned int n_bytes)
|
unsigned int page_size, unsigned int addr, unsigned int n_bytes)
|
||||||
{
|
{
|
||||||
if (strcmp(m->desc, "flash") == 0)
|
if (strcmp(m->desc, "flash") == 0)
|
||||||
|
@ -1170,7 +1182,7 @@ static int avrftdi_paged_write(const PROGRAMMER *pgm, const AVRPART *p, const AV
|
||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int avrftdi_paged_load(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *m,
|
static int avrftdi_paged_load(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||||
unsigned int page_size, unsigned int addr, unsigned int n_bytes)
|
unsigned int page_size, unsigned int addr, unsigned int n_bytes)
|
||||||
{
|
{
|
||||||
if (strcmp(m->desc, "flash") == 0)
|
if (strcmp(m->desc, "flash") == 0)
|
||||||
|
@ -1186,11 +1198,7 @@ avrftdi_setup(PROGRAMMER * pgm)
|
||||||
{
|
{
|
||||||
avrftdi_t* pdata;
|
avrftdi_t* pdata;
|
||||||
|
|
||||||
|
pgm->cookie = malloc(sizeof(avrftdi_t));
|
||||||
if(!(pgm->cookie = calloc(sizeof(avrftdi_t), 1))) {
|
|
||||||
log_err("Error allocating memory.\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
pdata = to_pdata(pgm);
|
pdata = to_pdata(pgm);
|
||||||
|
|
||||||
pdata->ftdic = ftdi_new();
|
pdata->ftdic = ftdi_new();
|
||||||
|
@ -1204,7 +1212,6 @@ avrftdi_setup(PROGRAMMER * pgm)
|
||||||
pdata->pin_value = 0;
|
pdata->pin_value = 0;
|
||||||
pdata->pin_direction = 0;
|
pdata->pin_direction = 0;
|
||||||
pdata->led_mask = 0;
|
pdata->led_mask = 0;
|
||||||
pdata->lext_byte = 0xff;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1219,7 +1226,9 @@ avrftdi_teardown(PROGRAMMER * pgm)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void avrftdi_initpgm(PROGRAMMER *pgm) {
|
void avrftdi_initpgm(PROGRAMMER * pgm)
|
||||||
|
{
|
||||||
|
|
||||||
strcpy(pgm->type, "avrftdi");
|
strcpy(pgm->type, "avrftdi");
|
||||||
|
|
||||||
/*
|
/*
|
|
@ -29,7 +29,7 @@ extern "C" {
|
||||||
|
|
||||||
|
|
||||||
extern const char avrftdi_desc[];
|
extern const char avrftdi_desc[];
|
||||||
void avrftdi_initpgm(PROGRAMMER *pgm);
|
void avrftdi_initpgm (PROGRAMMER * pgm);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
|
@ -0,0 +1,86 @@
|
||||||
|
#pragma once
|
||||||
|
#include "ac_cfg.h"
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#if defined(HAVE_LIBFTDI1) && defined(HAVE_LIBUSB_1_0)
|
||||||
|
# if defined(HAVE_LIBUSB_1_0_LIBUSB_H)
|
||||||
|
# include <libusb-1.0/libusb.h>
|
||||||
|
# else
|
||||||
|
# include <libusb.h>
|
||||||
|
# endif
|
||||||
|
# include <libftdi1/ftdi.h>
|
||||||
|
# undef HAVE_LIBFTDI_TYPE_232H
|
||||||
|
# define HAVE_LIBFTDI_TYPE_232H 1
|
||||||
|
#elif defined(HAVE_LIBFTDI) && defined(HAVE_USB_H)
|
||||||
|
/* ftdi.h includes usb.h */
|
||||||
|
#include <ftdi.h>
|
||||||
|
#else
|
||||||
|
#warning No libftdi or libusb support. Install libftdi1/libusb-1.0 or libftdi/libusb and run configure/make again.
|
||||||
|
#define DO_NOT_BUILD_AVRFTDI
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef DO_NOT_BUILD_AVRFTDI
|
||||||
|
|
||||||
|
enum { ERR, WARN, INFO, DEBUG, TRACE };
|
||||||
|
|
||||||
|
#define __log(lvl, fmt, ...) \
|
||||||
|
do { \
|
||||||
|
avrftdi_log(lvl, __func__, __LINE__, fmt, ##__VA_ARGS__); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define log_err(fmt, ...) __log(ERR, fmt, ##__VA_ARGS__)
|
||||||
|
#define log_warn(fmt, ...) __log(WARN, fmt, ##__VA_ARGS__)
|
||||||
|
#define log_info(fmt, ...) __log(INFO, fmt, ##__VA_ARGS__)
|
||||||
|
#define log_debug(fmt, ...) __log(DEBUG, fmt, ##__VA_ARGS__)
|
||||||
|
#define log_trace(fmt, ...) __log(TRACE, fmt, ##__VA_ARGS__)
|
||||||
|
|
||||||
|
#define E(x, ftdi) \
|
||||||
|
do { \
|
||||||
|
if ((x)) \
|
||||||
|
{ \
|
||||||
|
avrdude_message(MSG_INFO, "%s:%d %s() %s: %s (%d)\n\t%s\n", \
|
||||||
|
__FILE__, __LINE__, __FUNCTION__, \
|
||||||
|
#x, strerror(errno), errno, ftdi_get_error_string(ftdi)); \
|
||||||
|
return -1; \
|
||||||
|
} \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define E_VOID(x, ftdi) \
|
||||||
|
do { \
|
||||||
|
if ((x)) \
|
||||||
|
{ \
|
||||||
|
avrdude_message(MSG_INFO, "%s:%d %s() %s: %s (%d)\n\t%s\n", \
|
||||||
|
__FILE__, __LINE__, __FUNCTION__, \
|
||||||
|
#x, strerror(errno), errno, ftdi_get_error_string(ftdi)); \
|
||||||
|
} \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define to_pdata(pgm) \
|
||||||
|
((avrftdi_t *)((pgm)->cookie))
|
||||||
|
|
||||||
|
typedef struct avrftdi_s {
|
||||||
|
/* pointer to struct maintained by libftdi to identify the device */
|
||||||
|
struct ftdi_context* ftdic;
|
||||||
|
/* bitmask of values for pins. bit 0 represents pin 0 ([A|B]DBUS0) */
|
||||||
|
uint16_t pin_value;
|
||||||
|
/* bitmask of pin direction. a '1' make a pin an output.
|
||||||
|
* bit 0 corresponds to pin 0. */
|
||||||
|
uint16_t pin_direction;
|
||||||
|
/* don't know. not useful. someone put it in. */
|
||||||
|
uint16_t led_mask;
|
||||||
|
/* total number of pins supported by a programmer. varies with FTDI chips */
|
||||||
|
int pin_limit;
|
||||||
|
/* internal RX buffer of the device. needed for INOUT transfers */
|
||||||
|
int rx_buffer_size;
|
||||||
|
int tx_buffer_size;
|
||||||
|
/* use bitbanging instead of mpsse spi */
|
||||||
|
bool use_bitbanging;
|
||||||
|
} avrftdi_t;
|
||||||
|
|
||||||
|
void avrftdi_log(int level, const char * func, int line, const char * fmt, ...);
|
||||||
|
|
||||||
|
#endif /* DO_NOT_BUILD_AVRFDTI */
|
||||||
|
|
|
@ -15,8 +15,8 @@
|
||||||
|
|
||||||
#ifndef DO_NOT_BUILD_AVRFTDI
|
#ifndef DO_NOT_BUILD_AVRFTDI
|
||||||
|
|
||||||
static void avrftdi_tpi_disable(const PROGRAMMER *);
|
static void avrftdi_tpi_disable(PROGRAMMER *);
|
||||||
static int avrftdi_tpi_program_enable(const PROGRAMMER *pgm, const AVRPART *p);
|
static int avrftdi_tpi_program_enable(PROGRAMMER * pgm, AVRPART * p);
|
||||||
|
|
||||||
#ifdef notyet
|
#ifdef notyet
|
||||||
static void
|
static void
|
||||||
|
@ -63,16 +63,27 @@ avrftdi_debug_frame(uint16_t frame)
|
||||||
#endif /* notyet */
|
#endif /* notyet */
|
||||||
|
|
||||||
int
|
int
|
||||||
avrftdi_tpi_initialize(const PROGRAMMER *pgm, const AVRPART *p) {
|
avrftdi_tpi_initialize(PROGRAMMER * pgm, AVRPART * p)
|
||||||
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
avrftdi_t* pdata = to_pdata(pgm);
|
avrftdi_t* pdata = to_pdata(pgm);
|
||||||
unsigned char buf[] = { MPSSE_DO_WRITE | MPSSE_WRITE_NEG | MPSSE_LSB, 0x01, 0x00, 0xff, 0xff };
|
unsigned char buf[] = { MPSSE_DO_WRITE | MPSSE_WRITE_NEG | MPSSE_LSB, 0x01, 0x00, 0xff, 0xff };
|
||||||
|
|
||||||
|
log_info("Using TPI interface\n");
|
||||||
|
|
||||||
|
pgm->program_enable = avrftdi_tpi_program_enable;
|
||||||
|
pgm->cmd_tpi = avrftdi_cmd_tpi;
|
||||||
|
pgm->chip_erase = avr_tpi_chip_erase;
|
||||||
|
pgm->disable = avrftdi_tpi_disable;
|
||||||
|
|
||||||
|
pgm->paged_load = NULL;
|
||||||
|
pgm->paged_write = NULL;
|
||||||
|
|
||||||
log_info("Setting /Reset pin low\n");
|
log_info("Setting /Reset pin low\n");
|
||||||
pgm->setpin(pgm, PIN_AVR_RESET, OFF);
|
pgm->setpin(pgm, PIN_AVR_RESET, OFF);
|
||||||
pgm->setpin(pgm, PIN_AVR_SCK, OFF);
|
pgm->setpin(pgm, PIN_AVR_SCK, OFF);
|
||||||
pgm->setpin(pgm, PIN_AVR_SDO, ON);
|
pgm->setpin(pgm, PIN_AVR_MOSI, ON);
|
||||||
usleep(20 * 1000);
|
usleep(20 * 1000);
|
||||||
|
|
||||||
pgm->setpin(pgm, PIN_AVR_RESET, ON);
|
pgm->setpin(pgm, PIN_AVR_RESET, ON);
|
||||||
|
@ -90,44 +101,13 @@ avrftdi_tpi_initialize(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void avrftdi_tpi_initpgm(PROGRAMMER *pgm) {
|
|
||||||
log_info("Using TPI interface\n");
|
|
||||||
|
|
||||||
pgm->program_enable = avrftdi_tpi_program_enable;
|
|
||||||
pgm->cmd_tpi = avrftdi_cmd_tpi;
|
|
||||||
pgm->chip_erase = avr_tpi_chip_erase;
|
|
||||||
pgm->disable = avrftdi_tpi_disable;
|
|
||||||
|
|
||||||
pgm->paged_load = NULL;
|
|
||||||
pgm->paged_write = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#define TPI_PARITY_MASK 0x2000
|
#define TPI_PARITY_MASK 0x2000
|
||||||
|
|
||||||
static inline int count1s(unsigned int x)
|
|
||||||
{
|
|
||||||
#if defined(__GNUC__)
|
|
||||||
return __builtin_popcount(x);
|
|
||||||
#else
|
|
||||||
int count = 0;
|
|
||||||
|
|
||||||
while (x)
|
|
||||||
{
|
|
||||||
count += x & 1;
|
|
||||||
x >>= 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return count;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint16_t
|
static uint16_t
|
||||||
tpi_byte2frame(uint8_t byte)
|
tpi_byte2frame(uint8_t byte)
|
||||||
{
|
{
|
||||||
uint16_t frame = 0xc00f;
|
uint16_t frame = 0xc00f;
|
||||||
int parity = count1s(byte) & 1;
|
int parity = __builtin_popcount(byte) & 1;
|
||||||
|
|
||||||
frame |= ((byte << 5) & 0x1fe0);
|
frame |= ((byte << 5) & 0x1fe0);
|
||||||
|
|
||||||
|
@ -143,7 +123,7 @@ tpi_frame2byte(uint16_t frame, uint8_t * byte)
|
||||||
/* drop idle and start bit(s) */
|
/* drop idle and start bit(s) */
|
||||||
*byte = (frame >> 5) & 0xff;
|
*byte = (frame >> 5) & 0xff;
|
||||||
|
|
||||||
int parity = count1s(*byte) & 1;
|
int parity = __builtin_popcount(*byte) & 1;
|
||||||
int parity_rcvd = (frame & TPI_PARITY_MASK) ? 1 : 0;
|
int parity_rcvd = (frame & TPI_PARITY_MASK) ? 1 : 0;
|
||||||
|
|
||||||
return parity != parity_rcvd;
|
return parity != parity_rcvd;
|
||||||
|
@ -151,7 +131,8 @@ tpi_frame2byte(uint16_t frame, uint8_t * byte)
|
||||||
|
|
||||||
#ifdef notyet
|
#ifdef notyet
|
||||||
static int
|
static int
|
||||||
avrftdi_tpi_break(const PROGRAMMER *pgm) {
|
avrftdi_tpi_break(PROGRAMMER * pgm)
|
||||||
|
{
|
||||||
unsigned char buffer[] = { MPSSE_DO_WRITE | MPSSE_WRITE_NEG | MPSSE_LSB, 1, 0, 0, 0 };
|
unsigned char buffer[] = { MPSSE_DO_WRITE | MPSSE_WRITE_NEG | MPSSE_LSB, 1, 0, 0, 0 };
|
||||||
E(ftdi_write_data(to_pdata(pgm)->ftdic, buffer, sizeof(buffer)) != sizeof(buffer), to_pdata(pgm)->ftdic);
|
E(ftdi_write_data(to_pdata(pgm)->ftdic, buffer, sizeof(buffer)) != sizeof(buffer), to_pdata(pgm)->ftdic);
|
||||||
|
|
||||||
|
@ -160,7 +141,8 @@ avrftdi_tpi_break(const PROGRAMMER *pgm) {
|
||||||
#endif /* notyet */
|
#endif /* notyet */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
avrftdi_tpi_write_byte(const PROGRAMMER *pgm, unsigned char byte) {
|
avrftdi_tpi_write_byte(PROGRAMMER * pgm, unsigned char byte)
|
||||||
|
{
|
||||||
uint16_t frame;
|
uint16_t frame;
|
||||||
|
|
||||||
struct ftdi_context* ftdic = to_pdata(pgm)->ftdic;
|
struct ftdi_context* ftdic = to_pdata(pgm)->ftdic;
|
||||||
|
@ -186,7 +168,8 @@ avrftdi_tpi_write_byte(const PROGRAMMER *pgm, unsigned char byte) {
|
||||||
#define TPI_IDLE_BITS 2
|
#define TPI_IDLE_BITS 2
|
||||||
|
|
||||||
static int
|
static int
|
||||||
avrftdi_tpi_read_byte(const PROGRAMMER *pgm, unsigned char *byte) {
|
avrftdi_tpi_read_byte(PROGRAMMER * pgm, unsigned char * byte)
|
||||||
|
{
|
||||||
uint16_t frame;
|
uint16_t frame;
|
||||||
|
|
||||||
/* use 2 guard bits, 2 default idle bits + 12 frame bits = 16 bits total */
|
/* use 2 guard bits, 2 default idle bits + 12 frame bits = 16 bits total */
|
||||||
|
@ -230,12 +213,13 @@ avrftdi_tpi_read_byte(const PROGRAMMER *pgm, unsigned char *byte) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
avrftdi_tpi_program_enable(const PROGRAMMER *pgm, const AVRPART *p) {
|
avrftdi_tpi_program_enable(PROGRAMMER * pgm, AVRPART * p)
|
||||||
|
{
|
||||||
return avr_tpi_program_enable(pgm, p, TPIPCR_GT_2b);
|
return avr_tpi_program_enable(pgm, p, TPIPCR_GT_2b);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
avrftdi_cmd_tpi(const PROGRAMMER *pgm, const unsigned char *cmd, int cmd_len,
|
avrftdi_cmd_tpi(PROGRAMMER * pgm, const unsigned char *cmd, int cmd_len,
|
||||||
unsigned char *res, int res_len)
|
unsigned char *res, int res_len)
|
||||||
{
|
{
|
||||||
int i, err = 0;
|
int i, err = 0;
|
||||||
|
@ -258,7 +242,8 @@ avrftdi_cmd_tpi(const PROGRAMMER *pgm, const unsigned char *cmd, int cmd_len,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
avrftdi_tpi_disable(const PROGRAMMER *pgm) {
|
avrftdi_tpi_disable(PROGRAMMER * pgm)
|
||||||
|
{
|
||||||
unsigned char cmd[] = {TPI_OP_SSTCS(TPIPCR), 0};
|
unsigned char cmd[] = {TPI_OP_SSTCS(TPIPCR), 0};
|
||||||
pgm->cmd_tpi(pgm, cmd, sizeof(cmd), NULL, 0);
|
pgm->cmd_tpi(pgm, cmd, sizeof(cmd), NULL, 0);
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
//int avrftdi_tpi_write_byte(PROGRAMMER * pgm, unsigned char byte);
|
||||||
|
//int avrftdi_tpi_read_byte(PROGRAMMER * pgm, unsigned char * byte);
|
||||||
|
int avrftdi_cmd_tpi(PROGRAMMER * pgm, const unsigned char *cmd, int cmd_len,
|
||||||
|
unsigned char *res, int res_len);
|
||||||
|
int avrftdi_tpi_initialize(PROGRAMMER * pgm, AVRPART * p);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,681 @@
|
||||||
|
|
||||||
|
/*
|
||||||
|
* avrdude - A Downloader/Uploader for AVR device programmers
|
||||||
|
* Copyright (C) 2000-2004 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
* Copyright (C) 2006 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
*
|
||||||
|
* 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, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "avrdude.h"
|
||||||
|
#include "libavrdude.h"
|
||||||
|
|
||||||
|
/***
|
||||||
|
*** Elementary functions dealing with OPCODE structures
|
||||||
|
***/
|
||||||
|
|
||||||
|
OPCODE * avr_new_opcode(void)
|
||||||
|
{
|
||||||
|
OPCODE * m;
|
||||||
|
|
||||||
|
m = (OPCODE *)malloc(sizeof(*m));
|
||||||
|
if (m == NULL) {
|
||||||
|
avrdude_message(MSG_INFO, "avr_new_opcode(): out of memory\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(m, 0, sizeof(*m));
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static OPCODE * avr_dup_opcode(OPCODE * op)
|
||||||
|
{
|
||||||
|
OPCODE * m;
|
||||||
|
|
||||||
|
/* this makes life easier */
|
||||||
|
if (op == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
m = (OPCODE *)malloc(sizeof(*m));
|
||||||
|
if (m == NULL) {
|
||||||
|
avrdude_message(MSG_INFO, "avr_dup_opcode(): out of memory\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(m, op, sizeof(*m));
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
void avr_free_opcode(OPCODE * op)
|
||||||
|
{
|
||||||
|
free(op);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* avr_set_bits()
|
||||||
|
*
|
||||||
|
* Set instruction bits in the specified command based on the opcode.
|
||||||
|
*/
|
||||||
|
int avr_set_bits(OPCODE * op, unsigned char * cmd)
|
||||||
|
{
|
||||||
|
int i, j, bit;
|
||||||
|
unsigned char mask;
|
||||||
|
|
||||||
|
for (i=0; i<32; i++) {
|
||||||
|
if (op->bit[i].type == AVR_CMDBIT_VALUE) {
|
||||||
|
j = 3 - i / 8;
|
||||||
|
bit = i % 8;
|
||||||
|
mask = 1 << bit;
|
||||||
|
if (op->bit[i].value)
|
||||||
|
cmd[j] = cmd[j] | mask;
|
||||||
|
else
|
||||||
|
cmd[j] = cmd[j] & ~mask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* avr_set_addr()
|
||||||
|
*
|
||||||
|
* Set address bits in the specified command based on the opcode, and
|
||||||
|
* the address.
|
||||||
|
*/
|
||||||
|
int avr_set_addr(OPCODE * op, unsigned char * cmd, unsigned long addr)
|
||||||
|
{
|
||||||
|
int i, j, bit;
|
||||||
|
unsigned long value;
|
||||||
|
unsigned char mask;
|
||||||
|
|
||||||
|
for (i=0; i<32; i++) {
|
||||||
|
if (op->bit[i].type == AVR_CMDBIT_ADDRESS) {
|
||||||
|
j = 3 - i / 8;
|
||||||
|
bit = i % 8;
|
||||||
|
mask = 1 << bit;
|
||||||
|
value = addr >> op->bit[i].bitno & 0x01;
|
||||||
|
if (value)
|
||||||
|
cmd[j] = cmd[j] | mask;
|
||||||
|
else
|
||||||
|
cmd[j] = cmd[j] & ~mask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* avr_set_input()
|
||||||
|
*
|
||||||
|
* Set input data bits in the specified command based on the opcode,
|
||||||
|
* and the data byte.
|
||||||
|
*/
|
||||||
|
int avr_set_input(OPCODE * op, unsigned char * cmd, unsigned char data)
|
||||||
|
{
|
||||||
|
int i, j, bit;
|
||||||
|
unsigned char value;
|
||||||
|
unsigned char mask;
|
||||||
|
|
||||||
|
for (i=0; i<32; i++) {
|
||||||
|
if (op->bit[i].type == AVR_CMDBIT_INPUT) {
|
||||||
|
j = 3 - i / 8;
|
||||||
|
bit = i % 8;
|
||||||
|
mask = 1 << bit;
|
||||||
|
value = data >> op->bit[i].bitno & 0x01;
|
||||||
|
if (value)
|
||||||
|
cmd[j] = cmd[j] | mask;
|
||||||
|
else
|
||||||
|
cmd[j] = cmd[j] & ~mask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* avr_get_output()
|
||||||
|
*
|
||||||
|
* Retreive output data bits from the command results based on the
|
||||||
|
* opcode data.
|
||||||
|
*/
|
||||||
|
int avr_get_output(OPCODE * op, unsigned char * res, unsigned char * data)
|
||||||
|
{
|
||||||
|
int i, j, bit;
|
||||||
|
unsigned char value;
|
||||||
|
unsigned char mask;
|
||||||
|
|
||||||
|
for (i=0; i<32; i++) {
|
||||||
|
if (op->bit[i].type == AVR_CMDBIT_OUTPUT) {
|
||||||
|
j = 3 - i / 8;
|
||||||
|
bit = i % 8;
|
||||||
|
mask = 1 << bit;
|
||||||
|
value = ((res[j] & mask) >> bit) & 0x01;
|
||||||
|
value = value << op->bit[i].bitno;
|
||||||
|
if (value)
|
||||||
|
*data = *data | value;
|
||||||
|
else
|
||||||
|
*data = *data & ~value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* avr_get_output_index()
|
||||||
|
*
|
||||||
|
* Calculate the byte number of the output data based on the
|
||||||
|
* opcode data.
|
||||||
|
*/
|
||||||
|
int avr_get_output_index(OPCODE * op)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
for (i=0; i<32; i++) {
|
||||||
|
if (op->bit[i].type == AVR_CMDBIT_OUTPUT) {
|
||||||
|
j = 3 - i / 8;
|
||||||
|
return j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static char * avr_op_str(int op)
|
||||||
|
{
|
||||||
|
switch (op) {
|
||||||
|
case AVR_OP_READ : return "READ"; break;
|
||||||
|
case AVR_OP_WRITE : return "WRITE"; break;
|
||||||
|
case AVR_OP_READ_LO : return "READ_LO"; break;
|
||||||
|
case AVR_OP_READ_HI : return "READ_HI"; break;
|
||||||
|
case AVR_OP_WRITE_LO : return "WRITE_LO"; break;
|
||||||
|
case AVR_OP_WRITE_HI : return "WRITE_HI"; break;
|
||||||
|
case AVR_OP_LOADPAGE_LO : return "LOADPAGE_LO"; break;
|
||||||
|
case AVR_OP_LOADPAGE_HI : return "LOADPAGE_HI"; break;
|
||||||
|
case AVR_OP_LOAD_EXT_ADDR : return "LOAD_EXT_ADDR"; break;
|
||||||
|
case AVR_OP_WRITEPAGE : return "WRITEPAGE"; break;
|
||||||
|
case AVR_OP_CHIP_ERASE : return "CHIP_ERASE"; break;
|
||||||
|
case AVR_OP_PGM_ENABLE : return "PGM_ENABLE"; break;
|
||||||
|
default : return "<unknown opcode>"; break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static char * bittype(int type)
|
||||||
|
{
|
||||||
|
switch (type) {
|
||||||
|
case AVR_CMDBIT_IGNORE : return "IGNORE"; break;
|
||||||
|
case AVR_CMDBIT_VALUE : return "VALUE"; break;
|
||||||
|
case AVR_CMDBIT_ADDRESS : return "ADDRESS"; break;
|
||||||
|
case AVR_CMDBIT_INPUT : return "INPUT"; break;
|
||||||
|
case AVR_CMDBIT_OUTPUT : return "OUTPUT"; break;
|
||||||
|
default : return "<unknown bit type>"; break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/***
|
||||||
|
*** Elementary functions dealing with AVRMEM structures
|
||||||
|
***/
|
||||||
|
|
||||||
|
AVRMEM * avr_new_memtype(void)
|
||||||
|
{
|
||||||
|
AVRMEM * m;
|
||||||
|
|
||||||
|
m = (AVRMEM *)malloc(sizeof(*m));
|
||||||
|
if (m == NULL) {
|
||||||
|
avrdude_message(MSG_INFO, "avr_new_memtype(): out of memory\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(m, 0, sizeof(*m));
|
||||||
|
m->page_size = 1; // ensure not 0
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allocate and initialize memory buffers for each of the device's
|
||||||
|
* defined memory regions.
|
||||||
|
*/
|
||||||
|
int avr_initmem(AVRPART * p)
|
||||||
|
{
|
||||||
|
LNODEID ln;
|
||||||
|
AVRMEM * m;
|
||||||
|
|
||||||
|
for (ln=lfirst(p->mem); ln; ln=lnext(ln)) {
|
||||||
|
m = ldata(ln);
|
||||||
|
m->buf = (unsigned char *) malloc(m->size);
|
||||||
|
if (m->buf == NULL) {
|
||||||
|
avrdude_message(MSG_INFO, "%s: can't alloc buffer for %s size of %d bytes\n",
|
||||||
|
progname, m->desc, m->size);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
m->tags = (unsigned char *) malloc(m->size);
|
||||||
|
if (m->tags == NULL) {
|
||||||
|
avrdude_message(MSG_INFO, "%s: can't alloc buffer for %s size of %d bytes\n",
|
||||||
|
progname, m->desc, m->size);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
AVRMEM * avr_dup_mem(AVRMEM * m)
|
||||||
|
{
|
||||||
|
AVRMEM * n;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
n = avr_new_memtype();
|
||||||
|
|
||||||
|
*n = *m;
|
||||||
|
|
||||||
|
if (m->buf != NULL) {
|
||||||
|
n->buf = (unsigned char *)malloc(n->size);
|
||||||
|
if (n->buf == NULL) {
|
||||||
|
avrdude_message(MSG_INFO, "avr_dup_mem(): out of memory (memsize=%d)\n",
|
||||||
|
n->size);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
memcpy(n->buf, m->buf, n->size);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m->tags != NULL) {
|
||||||
|
n->tags = (unsigned char *)malloc(n->size);
|
||||||
|
if (n->tags == NULL) {
|
||||||
|
avrdude_message(MSG_INFO, "avr_dup_mem(): out of memory (memsize=%d)\n",
|
||||||
|
n->size);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
memcpy(n->tags, m->tags, n->size);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < AVR_OP_MAX; i++) {
|
||||||
|
n->op[i] = avr_dup_opcode(n->op[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
void avr_free_mem(AVRMEM * m)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
if (m->buf != NULL) {
|
||||||
|
free(m->buf);
|
||||||
|
m->buf = NULL;
|
||||||
|
}
|
||||||
|
if (m->tags != NULL) {
|
||||||
|
free(m->tags);
|
||||||
|
m->tags = NULL;
|
||||||
|
}
|
||||||
|
for(i=0;i<sizeof(m->op)/sizeof(m->op[0]);i++)
|
||||||
|
{
|
||||||
|
if (m->op[i] != NULL)
|
||||||
|
{
|
||||||
|
avr_free_opcode(m->op[i]);
|
||||||
|
m->op[i] = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(m);
|
||||||
|
}
|
||||||
|
|
||||||
|
AVRMEM * avr_locate_mem(AVRPART * p, char * desc)
|
||||||
|
{
|
||||||
|
AVRMEM * m, * match;
|
||||||
|
LNODEID ln;
|
||||||
|
int matches;
|
||||||
|
int l;
|
||||||
|
|
||||||
|
l = strlen(desc);
|
||||||
|
matches = 0;
|
||||||
|
match = NULL;
|
||||||
|
for (ln=lfirst(p->mem); ln; ln=lnext(ln)) {
|
||||||
|
m = ldata(ln);
|
||||||
|
if (strncmp(desc, m->desc, l) == 0) {
|
||||||
|
match = m;
|
||||||
|
matches++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (matches == 1)
|
||||||
|
return match;
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void avr_mem_display(const char * prefix, FILE * f, AVRMEM * m, int type,
|
||||||
|
int verbose)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
char * optr;
|
||||||
|
|
||||||
|
if (m == NULL) {
|
||||||
|
fprintf(f,
|
||||||
|
"%s Block Poll Page Polled\n"
|
||||||
|
"%sMemory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack\n"
|
||||||
|
"%s----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------\n",
|
||||||
|
prefix, prefix, prefix);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (verbose > 2) {
|
||||||
|
fprintf(f,
|
||||||
|
"%s Block Poll Page Polled\n"
|
||||||
|
"%sMemory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack\n"
|
||||||
|
"%s----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------\n",
|
||||||
|
prefix, prefix, prefix);
|
||||||
|
}
|
||||||
|
fprintf(f,
|
||||||
|
"%s%-11s %4d %5d %5d %4d %-6s %6d %4d %6d %5d %5d 0x%02x 0x%02x\n",
|
||||||
|
prefix, m->desc, m->mode, m->delay, m->blocksize, m->pollindex,
|
||||||
|
m->paged ? "yes" : "no",
|
||||||
|
m->size,
|
||||||
|
m->page_size,
|
||||||
|
m->num_pages,
|
||||||
|
m->min_write_delay,
|
||||||
|
m->max_write_delay,
|
||||||
|
m->readback[0],
|
||||||
|
m->readback[1]);
|
||||||
|
if (verbose > 4) {
|
||||||
|
avrdude_message(MSG_TRACE2, "%s Memory Ops:\n"
|
||||||
|
"%s Oeration Inst Bit Bit Type Bitno Value\n"
|
||||||
|
"%s ----------- -------- -------- ----- -----\n",
|
||||||
|
prefix, prefix, prefix);
|
||||||
|
for (i=0; i<AVR_OP_MAX; i++) {
|
||||||
|
if (m->op[i]) {
|
||||||
|
for (j=31; j>=0; j--) {
|
||||||
|
if (j==31)
|
||||||
|
optr = avr_op_str(i);
|
||||||
|
else
|
||||||
|
optr = " ";
|
||||||
|
fprintf(f,
|
||||||
|
"%s %-11s %8d %8s %5d %5d\n",
|
||||||
|
prefix, optr, j,
|
||||||
|
bittype(m->op[i]->bit[j].type),
|
||||||
|
m->op[i]->bit[j].bitno,
|
||||||
|
m->op[i]->bit[j].value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Elementary functions dealing with AVRPART structures
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
AVRPART * avr_new_part(void)
|
||||||
|
{
|
||||||
|
AVRPART * p;
|
||||||
|
|
||||||
|
p = (AVRPART *)malloc(sizeof(AVRPART));
|
||||||
|
if (p == NULL) {
|
||||||
|
avrdude_message(MSG_INFO, "new_part(): out of memory\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(p, 0, sizeof(*p));
|
||||||
|
|
||||||
|
p->id[0] = 0;
|
||||||
|
p->desc[0] = 0;
|
||||||
|
p->reset_disposition = RESET_DEDICATED;
|
||||||
|
p->retry_pulse = PIN_AVR_SCK;
|
||||||
|
p->flags = AVRPART_SERIALOK | AVRPART_PARALLELOK | AVRPART_ENABLEPAGEPROGRAMMING;
|
||||||
|
p->config_file[0] = 0;
|
||||||
|
p->lineno = 0;
|
||||||
|
memset(p->signature, 0xFF, 3);
|
||||||
|
p->ctl_stack_type = CTL_STACK_NONE;
|
||||||
|
p->ocdrev = -1;
|
||||||
|
|
||||||
|
p->mem = lcreat(NULL, 0);
|
||||||
|
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
AVRPART * avr_dup_part(AVRPART * d)
|
||||||
|
{
|
||||||
|
AVRPART * p;
|
||||||
|
LISTID save;
|
||||||
|
LNODEID ln;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
p = avr_new_part();
|
||||||
|
save = p->mem;
|
||||||
|
|
||||||
|
*p = *d;
|
||||||
|
|
||||||
|
p->mem = save;
|
||||||
|
|
||||||
|
for (ln=lfirst(d->mem); ln; ln=lnext(ln)) {
|
||||||
|
ladd(p->mem, avr_dup_mem(ldata(ln)));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < AVR_OP_MAX; i++) {
|
||||||
|
p->op[i] = avr_dup_opcode(p->op[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
void avr_free_part(AVRPART * d)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
ldestroy_cb(d->mem, (void(*)(void *))avr_free_mem);
|
||||||
|
d->mem = NULL;
|
||||||
|
for(i=0;i<sizeof(d->op)/sizeof(d->op[0]);i++)
|
||||||
|
{
|
||||||
|
if (d->op[i] != NULL)
|
||||||
|
{
|
||||||
|
avr_free_opcode(d->op[i]);
|
||||||
|
d->op[i] = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(d);
|
||||||
|
}
|
||||||
|
|
||||||
|
AVRPART * locate_part(LISTID parts, char * partdesc)
|
||||||
|
{
|
||||||
|
LNODEID ln1;
|
||||||
|
AVRPART * p = NULL;
|
||||||
|
int found;
|
||||||
|
|
||||||
|
found = 0;
|
||||||
|
|
||||||
|
for (ln1=lfirst(parts); ln1 && !found; ln1=lnext(ln1)) {
|
||||||
|
p = ldata(ln1);
|
||||||
|
if ((strcasecmp(partdesc, p->id) == 0) ||
|
||||||
|
(strcasecmp(partdesc, p->desc) == 0))
|
||||||
|
found = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (found)
|
||||||
|
return p;
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
AVRPART * locate_part_by_avr910_devcode(LISTID parts, int devcode)
|
||||||
|
{
|
||||||
|
LNODEID ln1;
|
||||||
|
AVRPART * p = NULL;
|
||||||
|
|
||||||
|
for (ln1=lfirst(parts); ln1; ln1=lnext(ln1)) {
|
||||||
|
p = ldata(ln1);
|
||||||
|
if (p->avr910_devcode == devcode)
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
AVRPART * locate_part_by_signature(LISTID parts, unsigned char * sig,
|
||||||
|
int sigsize)
|
||||||
|
{
|
||||||
|
LNODEID ln1;
|
||||||
|
AVRPART * p = NULL;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (sigsize == 3) {
|
||||||
|
for (ln1=lfirst(parts); ln1; ln1=lnext(ln1)) {
|
||||||
|
p = ldata(ln1);
|
||||||
|
for (i=0; i<3; i++)
|
||||||
|
if (p->signature[i] != sig[i])
|
||||||
|
break;
|
||||||
|
if (i == 3)
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Iterate over the list of avrparts given as "avrparts", and
|
||||||
|
* call the callback function cb for each entry found. cb is being
|
||||||
|
* passed the following arguments:
|
||||||
|
* . the name of the avrpart (for -p)
|
||||||
|
* . the descriptive text given in the config file
|
||||||
|
* . the name of the config file this avrpart has been defined in
|
||||||
|
* . the line number of the config file this avrpart has been defined at
|
||||||
|
* . the "cookie" passed into walk_avrparts() (opaque client data)
|
||||||
|
*/
|
||||||
|
void walk_avrparts(LISTID avrparts, walk_avrparts_cb cb, void *cookie)
|
||||||
|
{
|
||||||
|
LNODEID ln1;
|
||||||
|
AVRPART * p;
|
||||||
|
|
||||||
|
for (ln1 = lfirst(avrparts); ln1; ln1 = lnext(ln1)) {
|
||||||
|
p = ldata(ln1);
|
||||||
|
cb(p->id, p->desc, p->config_file, p->lineno, cookie);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Compare function to sort the list of programmers
|
||||||
|
*/
|
||||||
|
static int sort_avrparts_compare(AVRPART * p1,AVRPART * p2)
|
||||||
|
{
|
||||||
|
if(p1 == NULL || p2 == NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return strncasecmp(p1->desc,p2->desc,AVR_DESCLEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Sort the list of programmers given as "programmers"
|
||||||
|
*/
|
||||||
|
void sort_avrparts(LISTID avrparts)
|
||||||
|
{
|
||||||
|
lsort(avrparts,(int (*)(void*, void*)) sort_avrparts_compare);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static char * reset_disp_str(int r)
|
||||||
|
{
|
||||||
|
switch (r) {
|
||||||
|
case RESET_DEDICATED : return "dedicated";
|
||||||
|
case RESET_IO : return "possible i/o";
|
||||||
|
default : return "<invalid>";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void avr_display(FILE * f, AVRPART * p, const char * prefix, int verbose)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
char * buf;
|
||||||
|
const char * px;
|
||||||
|
LNODEID ln;
|
||||||
|
AVRMEM * m;
|
||||||
|
|
||||||
|
fprintf(f,
|
||||||
|
"%sAVR Part : %s\n"
|
||||||
|
"%sChip Erase delay : %d us\n"
|
||||||
|
"%sPAGEL : P%02X\n"
|
||||||
|
"%sBS2 : P%02X\n"
|
||||||
|
"%sRESET disposition : %s\n"
|
||||||
|
"%sRETRY pulse : %s\n"
|
||||||
|
"%sserial program mode : %s\n"
|
||||||
|
"%sparallel program mode : %s\n"
|
||||||
|
"%sTimeout : %d\n"
|
||||||
|
"%sStabDelay : %d\n"
|
||||||
|
"%sCmdexeDelay : %d\n"
|
||||||
|
"%sSyncLoops : %d\n"
|
||||||
|
"%sByteDelay : %d\n"
|
||||||
|
"%sPollIndex : %d\n"
|
||||||
|
"%sPollValue : 0x%02x\n"
|
||||||
|
"%sMemory Detail :\n\n",
|
||||||
|
prefix, p->desc,
|
||||||
|
prefix, p->chip_erase_delay,
|
||||||
|
prefix, p->pagel,
|
||||||
|
prefix, p->bs2,
|
||||||
|
prefix, reset_disp_str(p->reset_disposition),
|
||||||
|
prefix, avr_pin_name(p->retry_pulse),
|
||||||
|
prefix, (p->flags & AVRPART_SERIALOK) ? "yes" : "no",
|
||||||
|
prefix, (p->flags & AVRPART_PARALLELOK) ?
|
||||||
|
((p->flags & AVRPART_PSEUDOPARALLEL) ? "pseudo" : "yes") : "no",
|
||||||
|
prefix, p->timeout,
|
||||||
|
prefix, p->stabdelay,
|
||||||
|
prefix, p->cmdexedelay,
|
||||||
|
prefix, p->synchloops,
|
||||||
|
prefix, p->bytedelay,
|
||||||
|
prefix, p->pollindex,
|
||||||
|
prefix, p->pollvalue,
|
||||||
|
prefix);
|
||||||
|
|
||||||
|
px = prefix;
|
||||||
|
i = strlen(prefix) + 5;
|
||||||
|
buf = (char *)malloc(i);
|
||||||
|
if (buf == NULL) {
|
||||||
|
/* ugh, this is not important enough to bail, just ignore it */
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
strcpy(buf, prefix);
|
||||||
|
strcat(buf, " ");
|
||||||
|
px = buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (verbose <= 2) {
|
||||||
|
avr_mem_display(px, f, NULL, 0, verbose);
|
||||||
|
}
|
||||||
|
for (ln=lfirst(p->mem); ln; ln=lnext(ln)) {
|
||||||
|
m = ldata(ln);
|
||||||
|
avr_mem_display(px, f, m, i, verbose);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buf)
|
||||||
|
free(buf);
|
||||||
|
}
|
|
@ -17,7 +17,7 @@
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
/* $Id$ */
|
/* $Id$ */
|
||||||
|
|
||||||
#include "ac_cfg.h"
|
#include "ac_cfg.h"
|
||||||
|
|
||||||
|
@ -28,12 +28,9 @@
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
#if defined(WIN32)
|
#if !defined(WIN32NATIVE)
|
||||||
#define WIN32_LEAN_AND_MEAN
|
# include <signal.h>
|
||||||
#include <windows.h>
|
# include <sys/time.h>
|
||||||
#else
|
|
||||||
#include <signal.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "avrdude.h"
|
#include "avrdude.h"
|
||||||
|
@ -46,7 +43,7 @@
|
||||||
|
|
||||||
static int delay_decrement;
|
static int delay_decrement;
|
||||||
|
|
||||||
#if defined(WIN32)
|
#if defined(WIN32NATIVE)
|
||||||
static int has_perfcount;
|
static int has_perfcount;
|
||||||
static LARGE_INTEGER freq;
|
static LARGE_INTEGER freq;
|
||||||
#else
|
#else
|
||||||
|
@ -60,14 +57,14 @@ static void alarmhandler(int signo)
|
||||||
done = 1;
|
done = 1;
|
||||||
signal(SIGALRM, saved_alarmhandler);
|
signal(SIGALRM, saved_alarmhandler);
|
||||||
}
|
}
|
||||||
#endif /* WIN32 */
|
#endif /* WIN32NATIVE */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Calibrate the microsecond delay loop below.
|
* Calibrate the microsecond delay loop below.
|
||||||
*/
|
*/
|
||||||
static void bitbang_calibrate_delay(void)
|
static void bitbang_calibrate_delay(void)
|
||||||
{
|
{
|
||||||
#if defined(WIN32)
|
#if defined(WIN32NATIVE)
|
||||||
/*
|
/*
|
||||||
* If the hardware supports a high-resolution performance counter,
|
* If the hardware supports a high-resolution performance counter,
|
||||||
* we ultimately prefer that one, as it gives quite accurate delays
|
* we ultimately prefer that one, as it gives quite accurate delays
|
||||||
|
@ -76,7 +73,8 @@ static void bitbang_calibrate_delay(void)
|
||||||
if (QueryPerformanceFrequency(&freq))
|
if (QueryPerformanceFrequency(&freq))
|
||||||
{
|
{
|
||||||
has_perfcount = 1;
|
has_perfcount = 1;
|
||||||
pmsg_notice2("using performance counter for bitbang delays\n");
|
avrdude_message(MSG_NOTICE2, "%s: Using performance counter for bitbang delays\n",
|
||||||
|
progname);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -89,14 +87,16 @@ static void bitbang_calibrate_delay(void)
|
||||||
* auto-calibration figures seen on various Unix systems on
|
* auto-calibration figures seen on various Unix systems on
|
||||||
* comparable hardware.
|
* comparable hardware.
|
||||||
*/
|
*/
|
||||||
pmsg_notice2("using guessed per-microsecond delay count for bitbang delays\n");
|
avrdude_message(MSG_NOTICE2, "%s: Using guessed per-microsecond delay count for bitbang delays\n",
|
||||||
|
progname);
|
||||||
delay_decrement = 100;
|
delay_decrement = 100;
|
||||||
}
|
}
|
||||||
#else /* !WIN32 */
|
#else /* !WIN32NATIVE */
|
||||||
struct itimerval itv;
|
struct itimerval itv;
|
||||||
volatile int i;
|
volatile int i;
|
||||||
|
|
||||||
pmsg_notice2("calibrating delay loop ...");
|
avrdude_message(MSG_NOTICE2, "%s: Calibrating delay loop...",
|
||||||
|
progname);
|
||||||
i = 0;
|
i = 0;
|
||||||
done = 0;
|
done = 0;
|
||||||
saved_alarmhandler = signal(SIGALRM, alarmhandler);
|
saved_alarmhandler = signal(SIGALRM, alarmhandler);
|
||||||
|
@ -122,9 +122,9 @@ static void bitbang_calibrate_delay(void)
|
||||||
* Calculate back from 100 ms to 1 us.
|
* Calculate back from 100 ms to 1 us.
|
||||||
*/
|
*/
|
||||||
delay_decrement = -i / 100000;
|
delay_decrement = -i / 100000;
|
||||||
msg_notice2(" calibrated to %d cycles per us\n",
|
avrdude_message(MSG_NOTICE2, " calibrated to %d cycles per us\n",
|
||||||
delay_decrement);
|
delay_decrement);
|
||||||
#endif /* WIN32 */
|
#endif /* WIN32NATIVE */
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -134,7 +134,7 @@ static void bitbang_calibrate_delay(void)
|
||||||
*/
|
*/
|
||||||
void bitbang_delay(unsigned int us)
|
void bitbang_delay(unsigned int us)
|
||||||
{
|
{
|
||||||
#if defined(WIN32)
|
#if defined(WIN32NATIVE)
|
||||||
LARGE_INTEGER countNow, countEnd;
|
LARGE_INTEGER countNow, countEnd;
|
||||||
|
|
||||||
if (has_perfcount)
|
if (has_perfcount)
|
||||||
|
@ -147,20 +147,21 @@ void bitbang_delay(unsigned int us)
|
||||||
}
|
}
|
||||||
else /* no performance counters -- run normal uncalibrated delay */
|
else /* no performance counters -- run normal uncalibrated delay */
|
||||||
{
|
{
|
||||||
#endif /* WIN32 */
|
#endif /* WIN32NATIVE */
|
||||||
volatile unsigned int del = us * delay_decrement;
|
volatile unsigned int del = us * delay_decrement;
|
||||||
|
|
||||||
while (del > 0)
|
while (del > 0)
|
||||||
del--;
|
del--;
|
||||||
#if defined(WIN32)
|
#if defined(WIN32NATIVE)
|
||||||
}
|
}
|
||||||
#endif /* WIN32 */
|
#endif /* WIN32NATIVE */
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* transmit and receive a byte of data to/from the AVR device
|
* transmit and receive a byte of data to/from the AVR device
|
||||||
*/
|
*/
|
||||||
static unsigned char bitbang_txrx(const PROGRAMMER *pgm, unsigned char byte) {
|
static unsigned char bitbang_txrx(PROGRAMMER * pgm, unsigned char byte)
|
||||||
|
{
|
||||||
int i;
|
int i;
|
||||||
unsigned char r, b, rbyte;
|
unsigned char r, b, rbyte;
|
||||||
|
|
||||||
|
@ -172,9 +173,9 @@ static unsigned char bitbang_txrx(const PROGRAMMER *pgm, unsigned char byte) {
|
||||||
* one pgm->setpin()-call resp. par clrpin()-call, then
|
* one pgm->setpin()-call resp. par clrpin()-call, then
|
||||||
* - SCK is high for 2T
|
* - SCK is high for 2T
|
||||||
* - SCK is low for 2T
|
* - SCK is low for 2T
|
||||||
* - SDO setuptime is 1T
|
* - MOSI setuptime is 1T
|
||||||
* - SDO holdtime is 3T
|
* - MOSI holdtime is 3T
|
||||||
* - SCK low to SDI read is 2T to 3T
|
* - SCK low to MISO read is 2T to 3T
|
||||||
* So we are within programming specs (expect for AT90S1200),
|
* So we are within programming specs (expect for AT90S1200),
|
||||||
* if and only if T>t_CLCL (t_CLCL=clock period of target system).
|
* if and only if T>t_CLCL (t_CLCL=clock period of target system).
|
||||||
*
|
*
|
||||||
|
@ -186,7 +187,7 @@ static unsigned char bitbang_txrx(const PROGRAMMER *pgm, unsigned char byte) {
|
||||||
b = (byte >> i) & 0x01;
|
b = (byte >> i) & 0x01;
|
||||||
|
|
||||||
/* set the data input line as desired */
|
/* set the data input line as desired */
|
||||||
pgm->setpin(pgm, PIN_AVR_SDO, b);
|
pgm->setpin(pgm, PIN_AVR_MOSI, b);
|
||||||
|
|
||||||
pgm->setpin(pgm, PIN_AVR_SCK, 1);
|
pgm->setpin(pgm, PIN_AVR_SCK, 1);
|
||||||
|
|
||||||
|
@ -194,7 +195,7 @@ static unsigned char bitbang_txrx(const PROGRAMMER *pgm, unsigned char byte) {
|
||||||
* read the result bit (it is either valid from a previous falling
|
* read the result bit (it is either valid from a previous falling
|
||||||
* edge or it is ignored in the current context)
|
* edge or it is ignored in the current context)
|
||||||
*/
|
*/
|
||||||
r = pgm->getpin(pgm, PIN_AVR_SDI);
|
r = pgm->getpin(pgm, PIN_AVR_MISO);
|
||||||
|
|
||||||
pgm->setpin(pgm, PIN_AVR_SCK, 0);
|
pgm->setpin(pgm, PIN_AVR_SCK, 0);
|
||||||
|
|
||||||
|
@ -204,23 +205,25 @@ static unsigned char bitbang_txrx(const PROGRAMMER *pgm, unsigned char byte) {
|
||||||
return rbyte;
|
return rbyte;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int bitbang_tpi_clk(const PROGRAMMER *pgm) {
|
static int bitbang_tpi_clk(PROGRAMMER * pgm)
|
||||||
|
{
|
||||||
unsigned char r = 0;
|
unsigned char r = 0;
|
||||||
pgm->setpin(pgm, PIN_AVR_SCK, 1);
|
pgm->setpin(pgm, PIN_AVR_SCK, 1);
|
||||||
|
|
||||||
r = pgm->getpin(pgm, PIN_AVR_SDI);
|
r = pgm->getpin(pgm, PIN_AVR_MISO);
|
||||||
|
|
||||||
pgm->setpin(pgm, PIN_AVR_SCK, 0);
|
pgm->setpin(pgm, PIN_AVR_SCK, 0);
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
void bitbang_tpi_tx(const PROGRAMMER *pgm, unsigned char byte) {
|
void bitbang_tpi_tx(PROGRAMMER * pgm, unsigned char byte)
|
||||||
|
{
|
||||||
int i;
|
int i;
|
||||||
unsigned char b, parity;
|
unsigned char b, parity;
|
||||||
|
|
||||||
/* start bit */
|
/* start bit */
|
||||||
pgm->setpin(pgm, PIN_AVR_SDO, 0);
|
pgm->setpin(pgm, PIN_AVR_MOSI, 0);
|
||||||
bitbang_tpi_clk(pgm);
|
bitbang_tpi_clk(pgm);
|
||||||
|
|
||||||
parity = 0;
|
parity = 0;
|
||||||
|
@ -229,26 +232,27 @@ void bitbang_tpi_tx(const PROGRAMMER *pgm, unsigned char byte) {
|
||||||
parity ^= b;
|
parity ^= b;
|
||||||
|
|
||||||
/* set the data input line as desired */
|
/* set the data input line as desired */
|
||||||
pgm->setpin(pgm, PIN_AVR_SDO, b);
|
pgm->setpin(pgm, PIN_AVR_MOSI, b);
|
||||||
bitbang_tpi_clk(pgm);
|
bitbang_tpi_clk(pgm);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* parity bit */
|
/* parity bit */
|
||||||
pgm->setpin(pgm, PIN_AVR_SDO, parity);
|
pgm->setpin(pgm, PIN_AVR_MOSI, parity);
|
||||||
bitbang_tpi_clk(pgm);
|
bitbang_tpi_clk(pgm);
|
||||||
|
|
||||||
/* 2 stop bits */
|
/* 2 stop bits */
|
||||||
pgm->setpin(pgm, PIN_AVR_SDO, 1);
|
pgm->setpin(pgm, PIN_AVR_MOSI, 1);
|
||||||
bitbang_tpi_clk(pgm);
|
bitbang_tpi_clk(pgm);
|
||||||
bitbang_tpi_clk(pgm);
|
bitbang_tpi_clk(pgm);
|
||||||
}
|
}
|
||||||
|
|
||||||
int bitbang_tpi_rx(const PROGRAMMER *pgm) {
|
int bitbang_tpi_rx(PROGRAMMER * pgm)
|
||||||
|
{
|
||||||
int i;
|
int i;
|
||||||
unsigned char b, rbyte, parity;
|
unsigned char b, rbyte, parity;
|
||||||
|
|
||||||
/* make sure pin is on for "pullup" */
|
/* make sure pin is on for "pullup" */
|
||||||
pgm->setpin(pgm, PIN_AVR_SDO, 1);
|
pgm->setpin(pgm, PIN_AVR_MOSI, 1);
|
||||||
|
|
||||||
/* wait for start bit (up to 10 bits) */
|
/* wait for start bit (up to 10 bits) */
|
||||||
b = 1;
|
b = 1;
|
||||||
|
@ -258,7 +262,7 @@ int bitbang_tpi_rx(const PROGRAMMER *pgm) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (b != 0) {
|
if (b != 0) {
|
||||||
pmsg_error("start bit not received correctly\n");
|
avrdude_message(MSG_INFO, "bitbang_tpi_rx: start bit not received correctly\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -273,7 +277,7 @@ int bitbang_tpi_rx(const PROGRAMMER *pgm) {
|
||||||
|
|
||||||
/* parity bit */
|
/* parity bit */
|
||||||
if (bitbang_tpi_clk(pgm) != parity) {
|
if (bitbang_tpi_clk(pgm) != parity) {
|
||||||
pmsg_error("parity bit is wrong\n");
|
avrdude_message(MSG_INFO, "bitbang_tpi_rx: parity bit is wrong\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -282,29 +286,33 @@ int bitbang_tpi_rx(const PROGRAMMER *pgm) {
|
||||||
b &= bitbang_tpi_clk(pgm);
|
b &= bitbang_tpi_clk(pgm);
|
||||||
b &= bitbang_tpi_clk(pgm);
|
b &= bitbang_tpi_clk(pgm);
|
||||||
if (b != 1) {
|
if (b != 1) {
|
||||||
pmsg_error("stop bits not received correctly\n");
|
avrdude_message(MSG_INFO, "bitbang_tpi_rx: stop bits not received correctly\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return rbyte;
|
return rbyte;
|
||||||
}
|
}
|
||||||
|
|
||||||
int bitbang_rdy_led(const PROGRAMMER *pgm, int value) {
|
int bitbang_rdy_led(PROGRAMMER * pgm, int value)
|
||||||
|
{
|
||||||
pgm->setpin(pgm, PIN_LED_RDY, !value);
|
pgm->setpin(pgm, PIN_LED_RDY, !value);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int bitbang_err_led(const PROGRAMMER *pgm, int value) {
|
int bitbang_err_led(PROGRAMMER * pgm, int value)
|
||||||
|
{
|
||||||
pgm->setpin(pgm, PIN_LED_ERR, !value);
|
pgm->setpin(pgm, PIN_LED_ERR, !value);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int bitbang_pgm_led(const PROGRAMMER *pgm, int value) {
|
int bitbang_pgm_led(PROGRAMMER * pgm, int value)
|
||||||
|
{
|
||||||
pgm->setpin(pgm, PIN_LED_PGM, !value);
|
pgm->setpin(pgm, PIN_LED_PGM, !value);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int bitbang_vfy_led(const PROGRAMMER *pgm, int value) {
|
int bitbang_vfy_led(PROGRAMMER * pgm, int value)
|
||||||
|
{
|
||||||
pgm->setpin(pgm, PIN_LED_VFY, !value);
|
pgm->setpin(pgm, PIN_LED_VFY, !value);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -314,7 +322,7 @@ int bitbang_vfy_led(const PROGRAMMER *pgm, int value) {
|
||||||
* transmit an AVR device command and return the results; 'cmd' and
|
* transmit an AVR device command and return the results; 'cmd' and
|
||||||
* 'res' must point to at least a 4 byte data buffer
|
* 'res' must point to at least a 4 byte data buffer
|
||||||
*/
|
*/
|
||||||
int bitbang_cmd(const PROGRAMMER *pgm, const unsigned char *cmd,
|
int bitbang_cmd(PROGRAMMER * pgm, const unsigned char *cmd,
|
||||||
unsigned char *res)
|
unsigned char *res)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -325,21 +333,21 @@ int bitbang_cmd(const PROGRAMMER *pgm, const unsigned char *cmd,
|
||||||
|
|
||||||
if(verbose >= 2)
|
if(verbose >= 2)
|
||||||
{
|
{
|
||||||
msg_notice2("bitbang_cmd(): [ ");
|
avrdude_message(MSG_NOTICE2, "bitbang_cmd(): [ ");
|
||||||
for(i = 0; i < 4; i++)
|
for(i = 0; i < 4; i++)
|
||||||
msg_notice2("%02X ", cmd[i]);
|
avrdude_message(MSG_NOTICE2, "%02X ", cmd[i]);
|
||||||
msg_notice2("] [ ");
|
avrdude_message(MSG_NOTICE2, "] [ ");
|
||||||
for(i = 0; i < 4; i++)
|
for(i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
msg_notice2("%02X ", res[i]);
|
avrdude_message(MSG_NOTICE2, "%02X ", res[i]);
|
||||||
}
|
}
|
||||||
msg_notice2("]\n");
|
avrdude_message(MSG_NOTICE2, "]\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int bitbang_cmd_tpi(const PROGRAMMER *pgm, const unsigned char *cmd,
|
int bitbang_cmd_tpi(PROGRAMMER * pgm, const unsigned char *cmd,
|
||||||
int cmd_len, unsigned char *res, int res_len)
|
int cmd_len, unsigned char *res, int res_len)
|
||||||
{
|
{
|
||||||
int i, r;
|
int i, r;
|
||||||
|
@ -360,15 +368,15 @@ int bitbang_cmd_tpi(const PROGRAMMER *pgm, const unsigned char *cmd,
|
||||||
|
|
||||||
if(verbose >= 2)
|
if(verbose >= 2)
|
||||||
{
|
{
|
||||||
msg_notice2("bitbang_cmd_tpi(): [ ");
|
avrdude_message(MSG_NOTICE2, "bitbang_cmd_tpi(): [ ");
|
||||||
for(i = 0; i < cmd_len; i++)
|
for(i = 0; i < cmd_len; i++)
|
||||||
msg_notice2("%02X ", cmd[i]);
|
avrdude_message(MSG_NOTICE2, "%02X ", cmd[i]);
|
||||||
msg_notice2("] [ ");
|
avrdude_message(MSG_NOTICE2, "] [ ");
|
||||||
for(i = 0; i < res_len; i++)
|
for(i = 0; i < res_len; i++)
|
||||||
{
|
{
|
||||||
msg_notice2("%02X ", res[i]);
|
avrdude_message(MSG_NOTICE2, "%02X ", res[i]);
|
||||||
}
|
}
|
||||||
msg_notice2("]\n");
|
avrdude_message(MSG_NOTICE2, "]\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
pgm->pgm_led(pgm, OFF);
|
pgm->pgm_led(pgm, OFF);
|
||||||
|
@ -381,7 +389,7 @@ int bitbang_cmd_tpi(const PROGRAMMER *pgm, const unsigned char *cmd,
|
||||||
* transmit bytes via SPI and return the results; 'cmd' and
|
* transmit bytes via SPI and return the results; 'cmd' and
|
||||||
* 'res' must point to data buffers
|
* 'res' must point to data buffers
|
||||||
*/
|
*/
|
||||||
int bitbang_spi(const PROGRAMMER *pgm, const unsigned char *cmd,
|
int bitbang_spi(PROGRAMMER * pgm, const unsigned char *cmd,
|
||||||
unsigned char *res, int count)
|
unsigned char *res, int count)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -396,15 +404,15 @@ int bitbang_spi(const PROGRAMMER *pgm, const unsigned char *cmd,
|
||||||
|
|
||||||
if(verbose >= 2)
|
if(verbose >= 2)
|
||||||
{
|
{
|
||||||
msg_notice2("bitbang_cmd(): [ ");
|
avrdude_message(MSG_NOTICE2, "bitbang_cmd(): [ ");
|
||||||
for(i = 0; i < count; i++)
|
for(i = 0; i < count; i++)
|
||||||
msg_notice2("%02X ", cmd[i]);
|
avrdude_message(MSG_NOTICE2, "%02X ", cmd[i]);
|
||||||
msg_notice2("] [ ");
|
avrdude_message(MSG_NOTICE2, "] [ ");
|
||||||
for(i = 0; i < count; i++)
|
for(i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
msg_notice2("%02X ", res[i]);
|
avrdude_message(MSG_NOTICE2, "%02X ", res[i]);
|
||||||
}
|
}
|
||||||
msg_notice2("]\n");
|
avrdude_message(MSG_NOTICE2, "]\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -414,12 +422,13 @@ int bitbang_spi(const PROGRAMMER *pgm, const unsigned char *cmd,
|
||||||
/*
|
/*
|
||||||
* issue the 'chip erase' command to the AVR device
|
* issue the 'chip erase' command to the AVR device
|
||||||
*/
|
*/
|
||||||
int bitbang_chip_erase(const PROGRAMMER *pgm, const AVRPART *p) {
|
int bitbang_chip_erase(PROGRAMMER * pgm, AVRPART * p)
|
||||||
|
{
|
||||||
unsigned char cmd[4];
|
unsigned char cmd[4];
|
||||||
unsigned char res[4];
|
unsigned char res[4];
|
||||||
AVRMEM *mem;
|
AVRMEM *mem;
|
||||||
|
|
||||||
if (p->prog_modes & PM_TPI) {
|
if (p->flags & AVRPART_HAS_TPI) {
|
||||||
pgm->pgm_led(pgm, ON);
|
pgm->pgm_led(pgm, ON);
|
||||||
|
|
||||||
while (avr_tpi_poll_nvmbsy(pgm));
|
while (avr_tpi_poll_nvmbsy(pgm));
|
||||||
|
@ -431,7 +440,8 @@ int bitbang_chip_erase(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
/* Set Pointer Register */
|
/* Set Pointer Register */
|
||||||
mem = avr_locate_mem(p, "flash");
|
mem = avr_locate_mem(p, "flash");
|
||||||
if (mem == NULL) {
|
if (mem == NULL) {
|
||||||
pmsg_error("no flash memory to erase for part %s\n", p->desc);
|
avrdude_message(MSG_INFO, "No flash memory to erase for part %s\n",
|
||||||
|
p->desc);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
bitbang_tpi_tx(pgm, TPI_CMD_SSTPR | 0);
|
bitbang_tpi_tx(pgm, TPI_CMD_SSTPR | 0);
|
||||||
|
@ -451,7 +461,8 @@ int bitbang_chip_erase(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p->op[AVR_OP_CHIP_ERASE] == NULL) {
|
if (p->op[AVR_OP_CHIP_ERASE] == NULL) {
|
||||||
pmsg_error("chip erase instruction not defined for part %s\n", p->desc);
|
avrdude_message(MSG_INFO, "chip erase instruction not defined for part \"%s\"\n",
|
||||||
|
p->desc);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -472,12 +483,13 @@ int bitbang_chip_erase(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
/*
|
/*
|
||||||
* issue the 'program enable' command to the AVR device
|
* issue the 'program enable' command to the AVR device
|
||||||
*/
|
*/
|
||||||
int bitbang_program_enable(const PROGRAMMER *pgm, const AVRPART *p) {
|
int bitbang_program_enable(PROGRAMMER * pgm, AVRPART * p)
|
||||||
|
{
|
||||||
unsigned char cmd[4];
|
unsigned char cmd[4];
|
||||||
unsigned char res[4];
|
unsigned char res[4];
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (p->prog_modes & PM_TPI) {
|
if (p->flags & AVRPART_HAS_TPI) {
|
||||||
/* enable NVM programming */
|
/* enable NVM programming */
|
||||||
bitbang_tpi_tx(pgm, TPI_CMD_SKEY);
|
bitbang_tpi_tx(pgm, TPI_CMD_SKEY);
|
||||||
for (i = sizeof(tpi_skey) - 1; i >= 0; i--)
|
for (i = sizeof(tpi_skey) - 1; i >= 0; i--)
|
||||||
|
@ -490,7 +502,8 @@ int bitbang_program_enable(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p->op[AVR_OP_PGM_ENABLE] == NULL) {
|
if (p->op[AVR_OP_PGM_ENABLE] == NULL) {
|
||||||
pmsg_error("program enable instruction not defined for part %s\n", p->desc);
|
avrdude_message(MSG_INFO, "program enable instruction not defined for part \"%s\"\n",
|
||||||
|
p->desc);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -507,7 +520,8 @@ int bitbang_program_enable(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
/*
|
/*
|
||||||
* initialize the AVR device and prepare it to accept commands
|
* initialize the AVR device and prepare it to accept commands
|
||||||
*/
|
*/
|
||||||
int bitbang_initialize(const PROGRAMMER *pgm, const AVRPART *p) {
|
int bitbang_initialize(PROGRAMMER * pgm, AVRPART * p)
|
||||||
|
{
|
||||||
int rc;
|
int rc;
|
||||||
int tries;
|
int tries;
|
||||||
int i;
|
int i;
|
||||||
|
@ -517,11 +531,12 @@ int bitbang_initialize(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
pgm->powerup(pgm);
|
pgm->powerup(pgm);
|
||||||
usleep(20000);
|
usleep(20000);
|
||||||
|
|
||||||
/* TPIDATA is a single line, so SDI & SDO should be connected */
|
/* TPIDATA is a single line, so MISO & MOSI should be connected */
|
||||||
if (p->prog_modes & PM_TPI) {
|
if (p->flags & AVRPART_HAS_TPI) {
|
||||||
/* make sure cmd_tpi() is defined */
|
/* make sure cmd_tpi() is defined */
|
||||||
if (pgm->cmd_tpi == NULL) {
|
if (pgm->cmd_tpi == NULL) {
|
||||||
pmsg_error("%s programmer does not support TPI\n", pgm->type);
|
avrdude_message(MSG_INFO, "%s: Error: %s programmer does not support TPI\n",
|
||||||
|
progname, pgm->type);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -532,29 +547,29 @@ int bitbang_initialize(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
/* RESET must be LOW in case the existing code is driving the TPI pins: */
|
/* RESET must be LOW in case the existing code is driving the TPI pins: */
|
||||||
pgm->setpin(pgm, PIN_AVR_RESET, 0);
|
pgm->setpin(pgm, PIN_AVR_RESET, 0);
|
||||||
|
|
||||||
msg_notice2("doing SDO-SDI link check\n");
|
avrdude_message(MSG_NOTICE2, "doing MOSI-MISO link check\n");
|
||||||
|
|
||||||
pgm->setpin(pgm, PIN_AVR_SDO, 0);
|
pgm->setpin(pgm, PIN_AVR_MOSI, 0);
|
||||||
if (pgm->getpin(pgm, PIN_AVR_SDI) != 0) {
|
if (pgm->getpin(pgm, PIN_AVR_MISO) != 0) {
|
||||||
pmsg_error("SDO->SDI 0 failed\n");
|
avrdude_message(MSG_INFO, "MOSI->MISO 0 failed\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
pgm->setpin(pgm, PIN_AVR_SDO, 1);
|
pgm->setpin(pgm, PIN_AVR_MOSI, 1);
|
||||||
if (pgm->getpin(pgm, PIN_AVR_SDI) != 1) {
|
if (pgm->getpin(pgm, PIN_AVR_MISO) != 1) {
|
||||||
pmsg_error("SDO->SDI 1 failed\n");
|
avrdude_message(MSG_INFO, "MOSI->MISO 1 failed\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
msg_notice2("SDO-SDI link present\n");
|
avrdude_message(MSG_NOTICE2, "MOSI-MISO link present\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
pgm->setpin(pgm, PIN_AVR_SCK, 0);
|
pgm->setpin(pgm, PIN_AVR_SCK, 0);
|
||||||
pgm->setpin(pgm, PIN_AVR_RESET, 0);
|
pgm->setpin(pgm, PIN_AVR_RESET, 0);
|
||||||
usleep(20000);
|
usleep(20000);
|
||||||
|
|
||||||
if (p->prog_modes & PM_TPI) {
|
if (p->flags & AVRPART_HAS_TPI) {
|
||||||
/* keep TPIDATA high for 16 clock cycles */
|
/* keep TPIDATA high for 16 clock cycles */
|
||||||
pgm->setpin(pgm, PIN_AVR_SDO, 1);
|
pgm->setpin(pgm, PIN_AVR_MOSI, 1);
|
||||||
for (i = 0; i < 16; i++)
|
for (i = 0; i < 16; i++)
|
||||||
pgm->highpulsepin(pgm, PIN_AVR_SCK);
|
pgm->highpulsepin(pgm, PIN_AVR_SCK);
|
||||||
|
|
||||||
|
@ -566,7 +581,7 @@ int bitbang_initialize(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
bitbang_tpi_tx(pgm, TPI_CMD_SLDCS | TPI_REG_TPIIR);
|
bitbang_tpi_tx(pgm, TPI_CMD_SLDCS | TPI_REG_TPIIR);
|
||||||
rc = bitbang_tpi_rx(pgm);
|
rc = bitbang_tpi_rx(pgm);
|
||||||
if (rc != 0x80) {
|
if (rc != 0x80) {
|
||||||
pmsg_error("TPIIR not correct\n");
|
avrdude_message(MSG_INFO, "TPIIR not correct\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -600,7 +615,7 @@ int bitbang_initialize(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
* can't sync with the device, maybe it's not attached?
|
* can't sync with the device, maybe it's not attached?
|
||||||
*/
|
*/
|
||||||
if (rc) {
|
if (rc) {
|
||||||
pmsg_error("AVR device not responding\n");
|
avrdude_message(MSG_INFO, "%s: AVR device not responding\n", progname);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -608,14 +623,11 @@ int bitbang_initialize(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int verify_pin_assigned(const PROGRAMMER *pgm, int pinfunc, char *desc) {
|
static int verify_pin_assigned(PROGRAMMER * pgm, int pin, char * desc)
|
||||||
if(pinfunc < 0 || pinfunc >= N_PINS) {
|
{
|
||||||
pmsg_error("invalid pin function number %d\n", pinfunc);
|
if (pgm->pinno[pin] == 0) {
|
||||||
return -1;
|
avrdude_message(MSG_INFO, "%s: error: no pin has been assigned for %s\n",
|
||||||
}
|
progname, desc);
|
||||||
|
|
||||||
if ((pgm->pinno[pinfunc] & PIN_MASK) > PIN_MAX) {
|
|
||||||
pmsg_error("no pin has been assigned for %s\n", desc);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -625,19 +637,21 @@ static int verify_pin_assigned(const PROGRAMMER *pgm, int pinfunc, char *desc) {
|
||||||
/*
|
/*
|
||||||
* Verify all prerequisites for a bit-bang programmer are present.
|
* Verify all prerequisites for a bit-bang programmer are present.
|
||||||
*/
|
*/
|
||||||
int bitbang_check_prerequisites(const PROGRAMMER *pgm) {
|
int bitbang_check_prerequisites(PROGRAMMER *pgm)
|
||||||
|
{
|
||||||
|
|
||||||
if (verify_pin_assigned(pgm, PIN_AVR_RESET, "AVR RESET") < 0)
|
if (verify_pin_assigned(pgm, PIN_AVR_RESET, "AVR RESET") < 0)
|
||||||
return -1;
|
return -1;
|
||||||
if (verify_pin_assigned(pgm, PIN_AVR_SCK, "AVR SCK") < 0)
|
if (verify_pin_assigned(pgm, PIN_AVR_SCK, "AVR SCK") < 0)
|
||||||
return -1;
|
return -1;
|
||||||
if (verify_pin_assigned(pgm, PIN_AVR_SDI, "AVR SDI") < 0)
|
if (verify_pin_assigned(pgm, PIN_AVR_MISO, "AVR MISO") < 0)
|
||||||
return -1;
|
return -1;
|
||||||
if (verify_pin_assigned(pgm, PIN_AVR_SDO, "AVR SDO") < 0)
|
if (verify_pin_assigned(pgm, PIN_AVR_MOSI, "AVR MOSI") < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (pgm->cmd == NULL) {
|
if (pgm->cmd == NULL) {
|
||||||
pmsg_error("no cmd() method defined for bitbang programmer\n");
|
avrdude_message(MSG_INFO, "%s: error: no cmd() method defined for bitbang programmer\n",
|
||||||
|
progname);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
|
@ -31,25 +31,25 @@ int bitbang_getpin(int fd, int pin);
|
||||||
int bitbang_highpulsepin(int fd, int pin);
|
int bitbang_highpulsepin(int fd, int pin);
|
||||||
void bitbang_delay(unsigned int us);
|
void bitbang_delay(unsigned int us);
|
||||||
|
|
||||||
int bitbang_check_prerequisites(const PROGRAMMER *pgm);
|
int bitbang_check_prerequisites(PROGRAMMER *pgm);
|
||||||
|
|
||||||
int bitbang_rdy_led (const PROGRAMMER *pgm, int value);
|
int bitbang_rdy_led (PROGRAMMER * pgm, int value);
|
||||||
int bitbang_err_led (const PROGRAMMER *pgm, int value);
|
int bitbang_err_led (PROGRAMMER * pgm, int value);
|
||||||
int bitbang_pgm_led (const PROGRAMMER *pgm, int value);
|
int bitbang_pgm_led (PROGRAMMER * pgm, int value);
|
||||||
int bitbang_vfy_led (const PROGRAMMER *pgm, int value);
|
int bitbang_vfy_led (PROGRAMMER * pgm, int value);
|
||||||
int bitbang_cmd (const PROGRAMMER *pgm, const unsigned char *cmd,
|
int bitbang_cmd (PROGRAMMER * pgm, const unsigned char *cmd,
|
||||||
unsigned char *res);
|
unsigned char *res);
|
||||||
int bitbang_cmd_tpi (const PROGRAMMER *pgm, const unsigned char *cmd,
|
int bitbang_cmd_tpi (PROGRAMMER * pgm, const unsigned char *cmd,
|
||||||
int cmd_len, unsigned char *res, int res_len);
|
int cmd_len, unsigned char *res, int res_len);
|
||||||
int bitbang_spi (const PROGRAMMER *pgm, const unsigned char *cmd,
|
int bitbang_spi (PROGRAMMER * pgm, const unsigned char *cmd,
|
||||||
unsigned char *res, int count);
|
unsigned char *res, int count);
|
||||||
int bitbang_chip_erase (const PROGRAMMER *pgm, const AVRPART *p);
|
int bitbang_chip_erase (PROGRAMMER * pgm, AVRPART * p);
|
||||||
int bitbang_program_enable (const PROGRAMMER *pgm, const AVRPART *p);
|
int bitbang_program_enable (PROGRAMMER * pgm, AVRPART * p);
|
||||||
void bitbang_powerup (const PROGRAMMER *pgm);
|
void bitbang_powerup (PROGRAMMER * pgm);
|
||||||
void bitbang_powerdown (const PROGRAMMER *pgm);
|
void bitbang_powerdown (PROGRAMMER * pgm);
|
||||||
int bitbang_initialize (const PROGRAMMER *pgm, const AVRPART *p);
|
int bitbang_initialize (PROGRAMMER * pgm, AVRPART * p);
|
||||||
void bitbang_disable (const PROGRAMMER *pgm);
|
void bitbang_disable (PROGRAMMER * pgm);
|
||||||
void bitbang_enable (PROGRAMMER *pgm, const AVRPART *p);
|
void bitbang_enable (PROGRAMMER * pgm);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
92
build.sh
92
build.sh
|
@ -1,92 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
# Build script for Unix-like systems, using the CMake subsystem
|
|
||||||
#
|
|
||||||
# This script covers some common cases. It does *not* install any
|
|
||||||
# prerequisites though.
|
|
||||||
#
|
|
||||||
# For documentation of AVRDUDE's build system, please refer to the
|
|
||||||
# Wiki:
|
|
||||||
#
|
|
||||||
# https://github.com/avrdudes/avrdude/wiki
|
|
||||||
|
|
||||||
# Determine OS type
|
|
||||||
#
|
|
||||||
# So far, this script tries to handle three different Unix-like
|
|
||||||
# systems:
|
|
||||||
#
|
|
||||||
# Linux
|
|
||||||
# FreeBSD
|
|
||||||
# Darwin (aka. MacOS)
|
|
||||||
#
|
|
||||||
# On Linux, if the machine is ARM-based, LINUXSPI and LINUXGPIO are
|
|
||||||
# enabled.
|
|
||||||
# On MacOS, an attempt is made to find out whether Mac ports or brew
|
|
||||||
# are in place, and are assumed to have install the prerequisites.
|
|
||||||
|
|
||||||
ostype=$(uname | tr '[A-Z]' '[a-z]')
|
|
||||||
|
|
||||||
build_type=RelWithDebInfo
|
|
||||||
# build_type=Release # no debug info
|
|
||||||
|
|
||||||
# See CMakeLists.txt for all options
|
|
||||||
#
|
|
||||||
# Use this to enable (historical) parallel-port based programmers:
|
|
||||||
#extra_enable="-D HAVE_PARPORT=1"
|
|
||||||
extra_enable=""
|
|
||||||
|
|
||||||
build_flags=""
|
|
||||||
|
|
||||||
case "${ostype}" in
|
|
||||||
linux)
|
|
||||||
# try to find out whether this is an Embedded Linux
|
|
||||||
# platform (e.g. Raspberry Pi)
|
|
||||||
machine=$(uname -m)
|
|
||||||
if expr "${machine}" : '^\(arm\|aarch\)' >/dev/null
|
|
||||||
then
|
|
||||||
extra_enable="${extra_enable} -D HAVE_LINUXGPIO=1 -D HAVE_LINUXSPI=1"
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
darwin)
|
|
||||||
# determine whether we are running using Mac Ports
|
|
||||||
# if not, assume Mac Brew
|
|
||||||
if [ -f /opt/local/bin/port ]
|
|
||||||
then
|
|
||||||
build_flags="${build_flags} -D CMAKE_C_FLAGS=-I/opt/local/include -D CMAKE_EXE_LINKER_FLAGS=-L/opt/local/lib"
|
|
||||||
else
|
|
||||||
# Apple M1 (may be new version of homebrew also)
|
|
||||||
if [ -d /opt/homebrew ]
|
|
||||||
then
|
|
||||||
build_flags="${build_flags} -D CMAKE_C_FLAGS=-I/opt/homebrew/include -D CMAKE_EXE_LINKER_FLAGS=-L/opt/homebrew/Cellar"
|
|
||||||
else
|
|
||||||
build_flags="${build_flags} -D CMAKE_C_FLAGS=-I/usr/local/include -D CMAKE_EXE_LINKER_FLAGS=-L/usr/local/Cellar"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
netbsd)
|
|
||||||
build_flags="${build_flags} -D CMAKE_C_FLAGS=-I/usr/pkg/include -D CMAKE_EXE_LINKER_FLAGS=-R/usr/pkg/lib -D CMAKE_INSTALL_PREFIX:PATH=/usr/pkg"
|
|
||||||
;;
|
|
||||||
|
|
||||||
*bsd)
|
|
||||||
build_flags="${build_flags} -D CMAKE_C_FLAGS=-I/usr/local/include -D CMAKE_EXE_LINKER_FLAGS=-L/usr/local/lib"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
cmake ${build_flags} ${extra_enable} -D CMAKE_BUILD_TYPE=${build_type} -B build_${ostype} ||\
|
|
||||||
{ echo "CMake failed."; exit 1; }
|
|
||||||
cmake --build build_${ostype} ||\
|
|
||||||
{ echo "Build failed."; exit 1; }
|
|
||||||
|
|
||||||
cat <<EOF
|
|
||||||
|
|
||||||
Build succeeded.
|
|
||||||
|
|
||||||
Run
|
|
||||||
|
|
||||||
sudo cmake --build build_${ostype} --target install
|
|
||||||
|
|
||||||
to install.
|
|
||||||
|
|
||||||
EOF
|
|
File diff suppressed because it is too large
Load Diff
|
@ -26,7 +26,7 @@
|
||||||
|
|
||||||
extern const char buspirate_desc[];
|
extern const char buspirate_desc[];
|
||||||
extern const char buspirate_bb_desc[];
|
extern const char buspirate_bb_desc[];
|
||||||
void buspirate_initpgm(PROGRAMMER *pgm);
|
void buspirate_initpgm (struct programmer_t *pgm);
|
||||||
void buspirate_bb_initpgm(PROGRAMMER *pgm);
|
void buspirate_bb_initpgm (struct programmer_t *pgm);
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -63,7 +63,8 @@ struct pdata
|
||||||
static void butterfly_setup(PROGRAMMER * pgm)
|
static void butterfly_setup(PROGRAMMER * pgm)
|
||||||
{
|
{
|
||||||
if ((pgm->cookie = malloc(sizeof(struct pdata))) == 0) {
|
if ((pgm->cookie = malloc(sizeof(struct pdata))) == 0) {
|
||||||
pmsg_error("out of memory allocating private data\n");
|
avrdude_message(MSG_INFO, "%s: butterfly_setup(): Out of memory allocating private data\n",
|
||||||
|
progname);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
memset(pgm->cookie, 0, sizeof(struct pdata));
|
memset(pgm->cookie, 0, sizeof(struct pdata));
|
||||||
|
@ -74,62 +75,72 @@ static void butterfly_teardown(PROGRAMMER * pgm)
|
||||||
free(pgm->cookie);
|
free(pgm->cookie);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int butterfly_send(const PROGRAMMER *pgm, char *buf, size_t len) {
|
static int butterfly_send(PROGRAMMER * pgm, char * buf, size_t len)
|
||||||
|
{
|
||||||
return serial_send(&pgm->fd, (unsigned char *)buf, len);
|
return serial_send(&pgm->fd, (unsigned char *)buf, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int butterfly_recv(const PROGRAMMER *pgm, char *buf, size_t len) {
|
static int butterfly_recv(PROGRAMMER * pgm, char * buf, size_t len)
|
||||||
|
{
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
rv = serial_recv(&pgm->fd, (unsigned char *)buf, len);
|
rv = serial_recv(&pgm->fd, (unsigned char *)buf, len);
|
||||||
if (rv < 0) {
|
if (rv < 0) {
|
||||||
pmsg_error("programmer is not responding\n");
|
avrdude_message(MSG_INFO, "%s: butterfly_recv(): programmer is not responding\n",
|
||||||
|
progname);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int butterfly_drain(const PROGRAMMER *pgm, int display) {
|
static int butterfly_drain(PROGRAMMER * pgm, int display)
|
||||||
|
{
|
||||||
return serial_drain(&pgm->fd, display);
|
return serial_drain(&pgm->fd, display);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int butterfly_vfy_cmd_sent(const PROGRAMMER *pgm, char *errmsg) {
|
static int butterfly_vfy_cmd_sent(PROGRAMMER * pgm, char * errmsg)
|
||||||
|
{
|
||||||
char c;
|
char c;
|
||||||
|
|
||||||
butterfly_recv(pgm, &c, 1);
|
butterfly_recv(pgm, &c, 1);
|
||||||
if (c != '\r') {
|
if (c != '\r') {
|
||||||
pmsg_error("programmer did not respond to command: %s\n", errmsg);
|
avrdude_message(MSG_INFO, "%s: error: programmer did not respond to command: %s\n",
|
||||||
|
progname, errmsg);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int butterfly_rdy_led(const PROGRAMMER *pgm, int value) {
|
static int butterfly_rdy_led(PROGRAMMER * pgm, int value)
|
||||||
|
{
|
||||||
/* Do nothing. */
|
/* Do nothing. */
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int butterfly_err_led(const PROGRAMMER *pgm, int value) {
|
static int butterfly_err_led(PROGRAMMER * pgm, int value)
|
||||||
|
{
|
||||||
/* Do nothing. */
|
/* Do nothing. */
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int butterfly_pgm_led(const PROGRAMMER *pgm, int value) {
|
static int butterfly_pgm_led(PROGRAMMER * pgm, int value)
|
||||||
|
{
|
||||||
/* Do nothing. */
|
/* Do nothing. */
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int butterfly_vfy_led(const PROGRAMMER *pgm, int value) {
|
static int butterfly_vfy_led(PROGRAMMER * pgm, int value)
|
||||||
|
{
|
||||||
/* Do nothing. */
|
/* Do nothing. */
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -139,7 +150,8 @@ static int butterfly_vfy_led(const PROGRAMMER *pgm, int value) {
|
||||||
/*
|
/*
|
||||||
* issue the 'chip erase' command to the butterfly board
|
* issue the 'chip erase' command to the butterfly board
|
||||||
*/
|
*/
|
||||||
static int butterfly_chip_erase(const PROGRAMMER *pgm, const AVRPART *p) {
|
static int butterfly_chip_erase(PROGRAMMER * pgm, AVRPART * p)
|
||||||
|
{
|
||||||
butterfly_send(pgm, "e", 1);
|
butterfly_send(pgm, "e", 1);
|
||||||
if (butterfly_vfy_cmd_sent(pgm, "chip erase") < 0)
|
if (butterfly_vfy_cmd_sent(pgm, "chip erase") < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -148,13 +160,15 @@ static int butterfly_chip_erase(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void butterfly_enter_prog_mode(const PROGRAMMER *pgm) {
|
static void butterfly_enter_prog_mode(PROGRAMMER * pgm)
|
||||||
|
{
|
||||||
butterfly_send(pgm, "P", 1);
|
butterfly_send(pgm, "P", 1);
|
||||||
butterfly_vfy_cmd_sent(pgm, "enter prog mode");
|
butterfly_vfy_cmd_sent(pgm, "enter prog mode");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void butterfly_leave_prog_mode(const PROGRAMMER *pgm) {
|
static void butterfly_leave_prog_mode(PROGRAMMER * pgm)
|
||||||
|
{
|
||||||
butterfly_send(pgm, "L", 1);
|
butterfly_send(pgm, "L", 1);
|
||||||
butterfly_vfy_cmd_sent(pgm, "leave prog mode");
|
butterfly_vfy_cmd_sent(pgm, "leave prog mode");
|
||||||
}
|
}
|
||||||
|
@ -163,7 +177,8 @@ static void butterfly_leave_prog_mode(const PROGRAMMER *pgm) {
|
||||||
/*
|
/*
|
||||||
* issue the 'program enable' command to the AVR device
|
* issue the 'program enable' command to the AVR device
|
||||||
*/
|
*/
|
||||||
static int butterfly_program_enable(const PROGRAMMER *pgm, const AVRPART *p) {
|
static int butterfly_program_enable(PROGRAMMER * pgm, AVRPART * p)
|
||||||
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -171,7 +186,8 @@ static int butterfly_program_enable(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
/*
|
/*
|
||||||
* apply power to the AVR processor
|
* apply power to the AVR processor
|
||||||
*/
|
*/
|
||||||
static void butterfly_powerup(const PROGRAMMER *pgm) {
|
static void butterfly_powerup(PROGRAMMER * pgm)
|
||||||
|
{
|
||||||
/* Do nothing. */
|
/* Do nothing. */
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
@ -181,7 +197,8 @@ static void butterfly_powerup(const PROGRAMMER *pgm) {
|
||||||
/*
|
/*
|
||||||
* remove power from the AVR processor
|
* remove power from the AVR processor
|
||||||
*/
|
*/
|
||||||
static void butterfly_powerdown(const PROGRAMMER *pgm) {
|
static void butterfly_powerdown(PROGRAMMER * pgm)
|
||||||
|
{
|
||||||
/* Do nothing. */
|
/* Do nothing. */
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
@ -192,7 +209,8 @@ static void butterfly_powerdown(const PROGRAMMER *pgm) {
|
||||||
/*
|
/*
|
||||||
* initialize the AVR device and prepare it to accept commands
|
* initialize the AVR device and prepare it to accept commands
|
||||||
*/
|
*/
|
||||||
static int butterfly_initialize(const PROGRAMMER *pgm, const AVRPART *p) {
|
static int butterfly_initialize(PROGRAMMER * pgm, AVRPART * p)
|
||||||
|
{
|
||||||
char id[8];
|
char id[8];
|
||||||
char sw[2];
|
char sw[2];
|
||||||
char hw[2];
|
char hw[2];
|
||||||
|
@ -204,13 +222,13 @@ static int butterfly_initialize(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
* Send some ESC to activate butterfly bootloader. This is not needed
|
* Send some ESC to activate butterfly bootloader. This is not needed
|
||||||
* for plain avr109 bootloaders but does not harm there either.
|
* for plain avr109 bootloaders but does not harm there either.
|
||||||
*/
|
*/
|
||||||
msg_notice("connecting to programmer: ");
|
avrdude_message(MSG_INFO, "Connecting to programmer: ");
|
||||||
if (pgm->flag & IS_BUTTERFLY_MK)
|
if (pgm->flag & IS_BUTTERFLY_MK)
|
||||||
{
|
{
|
||||||
char mk_reset_cmd[6] = {"#aR@S\r"};
|
char mk_reset_cmd[6] = {"#aR@S\r"};
|
||||||
unsigned char mk_timeout = 0;
|
unsigned char mk_timeout = 0;
|
||||||
|
|
||||||
msg_notice(".");
|
putc('.', stderr);
|
||||||
butterfly_send(pgm, mk_reset_cmd, sizeof(mk_reset_cmd));
|
butterfly_send(pgm, mk_reset_cmd, sizeof(mk_reset_cmd));
|
||||||
usleep(20000);
|
usleep(20000);
|
||||||
|
|
||||||
|
@ -222,15 +240,13 @@ static int butterfly_initialize(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
c = 0xaa;
|
c = 0xaa;
|
||||||
usleep(80000);
|
usleep(80000);
|
||||||
butterfly_send(pgm, &c, 1);
|
butterfly_send(pgm, &c, 1);
|
||||||
if (mk_timeout % 10 == 0)
|
if (mk_timeout % 10 == 0) putc('.', stderr);
|
||||||
msg_notice(".");
|
|
||||||
} while (mk_timeout++ < 10);
|
} while (mk_timeout++ < 10);
|
||||||
|
|
||||||
butterfly_recv(pgm, &c, 1);
|
butterfly_recv(pgm, &c, 1);
|
||||||
if ( c != 'M' && c != '?')
|
if ( c != 'M' && c != '?')
|
||||||
{
|
{
|
||||||
msg_error("\n");
|
avrdude_message(MSG_INFO, "\nConnection FAILED.");
|
||||||
pmsg_error("connection failed");
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -241,13 +257,13 @@ static int butterfly_initialize(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
do {
|
do {
|
||||||
msg_notice(".");
|
putc('.', stderr);
|
||||||
butterfly_send(pgm, "\033", 1);
|
butterfly_send(pgm, "\033", 1);
|
||||||
butterfly_drain(pgm, 0);
|
butterfly_drain(pgm, 0);
|
||||||
butterfly_send(pgm, "S", 1);
|
butterfly_send(pgm, "S", 1);
|
||||||
butterfly_recv(pgm, &c, 1);
|
butterfly_recv(pgm, &c, 1);
|
||||||
if (c != '?') {
|
if (c != '?') {
|
||||||
msg_notice("\n");
|
putc('\n', stderr);
|
||||||
/*
|
/*
|
||||||
* Got a useful response, continue getting the programmer
|
* Got a useful response, continue getting the programmer
|
||||||
* identifier. Programmer returns exactly 7 chars _without_
|
* identifier. Programmer returns exactly 7 chars _without_
|
||||||
|
@ -277,12 +293,12 @@ static int butterfly_initialize(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
butterfly_send(pgm, "p", 1);
|
butterfly_send(pgm, "p", 1);
|
||||||
butterfly_recv(pgm, &type, 1);
|
butterfly_recv(pgm, &type, 1);
|
||||||
|
|
||||||
msg_notice("Programmer id = %s; type = %c\n", id, type);
|
avrdude_message(MSG_INFO, "Found programmer: Id = \"%s\"; type = %c\n", id, type);
|
||||||
msg_notice("Software version = %c.%c; ", sw[0], sw[1]);
|
avrdude_message(MSG_INFO, " Software Version = %c.%c; ", sw[0], sw[1]);
|
||||||
if (hw[0]=='?') {
|
if (hw[0]=='?') {
|
||||||
msg_notice("no hardware version given\n");
|
avrdude_message(MSG_INFO, "No Hardware Version given.\n");
|
||||||
} else {
|
} else {
|
||||||
msg_notice("Hardware version = %c.%c\n", hw[0], hw[1]);
|
avrdude_message(MSG_INFO, "Hardware Version = %c.%c\n", hw[0], hw[1]);
|
||||||
};
|
};
|
||||||
|
|
||||||
/* See if programmer supports autoincrement of address. */
|
/* See if programmer supports autoincrement of address. */
|
||||||
|
@ -290,28 +306,28 @@ static int butterfly_initialize(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
butterfly_send(pgm, "a", 1);
|
butterfly_send(pgm, "a", 1);
|
||||||
butterfly_recv(pgm, &PDATA(pgm)->has_auto_incr_addr, 1);
|
butterfly_recv(pgm, &PDATA(pgm)->has_auto_incr_addr, 1);
|
||||||
if (PDATA(pgm)->has_auto_incr_addr == 'Y')
|
if (PDATA(pgm)->has_auto_incr_addr == 'Y')
|
||||||
msg_notice("programmer supports auto addr increment\n");
|
avrdude_message(MSG_INFO, "Programmer supports auto addr increment.\n");
|
||||||
|
|
||||||
/* Check support for buffered memory access, abort if not available */
|
/* Check support for buffered memory access, abort if not available */
|
||||||
|
|
||||||
butterfly_send(pgm, "b", 1);
|
butterfly_send(pgm, "b", 1);
|
||||||
butterfly_recv(pgm, &c, 1);
|
butterfly_recv(pgm, &c, 1);
|
||||||
if (c != 'Y') {
|
if (c != 'Y') {
|
||||||
pmsg_notice("buffered memory access not supported; maybe it isn't\n"\
|
avrdude_message(MSG_INFO, "%s: error: buffered memory access not supported. Maybe it isn't\n"\
|
||||||
"a butterfly/AVR109 but a AVR910 device?\n");
|
"a butterfly/AVR109 but a AVR910 device?\n", progname);
|
||||||
return -1;
|
return -1;
|
||||||
};
|
};
|
||||||
butterfly_recv(pgm, &c, 1);
|
butterfly_recv(pgm, &c, 1);
|
||||||
PDATA(pgm)->buffersize = (unsigned int)(unsigned char)c<<8;
|
PDATA(pgm)->buffersize = (unsigned int)(unsigned char)c<<8;
|
||||||
butterfly_recv(pgm, &c, 1);
|
butterfly_recv(pgm, &c, 1);
|
||||||
PDATA(pgm)->buffersize += (unsigned int)(unsigned char)c;
|
PDATA(pgm)->buffersize += (unsigned int)(unsigned char)c;
|
||||||
msg_notice("programmer supports buffered memory access with buffersize=%i bytes\n",
|
avrdude_message(MSG_INFO, "Programmer supports buffered memory access with buffersize=%i bytes.\n",
|
||||||
PDATA(pgm)->buffersize);
|
PDATA(pgm)->buffersize);
|
||||||
|
|
||||||
/* Get list of devices that the programmer supports. */
|
/* Get list of devices that the programmer supports. */
|
||||||
|
|
||||||
butterfly_send(pgm, "t", 1);
|
butterfly_send(pgm, "t", 1);
|
||||||
msg_notice2("\nProgrammer supports the following devices:\n");
|
avrdude_message(MSG_INFO, "\nProgrammer supports the following devices:\n");
|
||||||
devtype_1st = 0;
|
devtype_1st = 0;
|
||||||
while (1) {
|
while (1) {
|
||||||
butterfly_recv(pgm, &c, 1);
|
butterfly_recv(pgm, &c, 1);
|
||||||
|
@ -320,9 +336,9 @@ static int butterfly_initialize(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
|
|
||||||
if (c == 0)
|
if (c == 0)
|
||||||
break;
|
break;
|
||||||
msg_notice2(" Device code: 0x%02x\n", (unsigned int) (unsigned char) c);
|
avrdude_message(MSG_INFO, " Device code: 0x%02x\n", (unsigned int)(unsigned char)c);
|
||||||
};
|
};
|
||||||
msg_notice2("\n");
|
avrdude_message(MSG_INFO, "\n");
|
||||||
|
|
||||||
/* Tell the programmer which part we selected.
|
/* Tell the programmer which part we selected.
|
||||||
According to the AVR109 code, this is ignored by the bootloader. As
|
According to the AVR109 code, this is ignored by the bootloader. As
|
||||||
|
@ -339,7 +355,9 @@ static int butterfly_initialize(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
if (butterfly_vfy_cmd_sent(pgm, "select device") < 0)
|
if (butterfly_vfy_cmd_sent(pgm, "select device") < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
pmsg_notice("devcode selected: 0x%02x\n", (unsigned) buf[1]);
|
if (verbose)
|
||||||
|
avrdude_message(MSG_INFO, "%s: devcode selected: 0x%02x\n",
|
||||||
|
progname, (unsigned)buf[1]);
|
||||||
|
|
||||||
butterfly_enter_prog_mode(pgm);
|
butterfly_enter_prog_mode(pgm);
|
||||||
butterfly_drain(pgm, 0);
|
butterfly_drain(pgm, 0);
|
||||||
|
@ -349,19 +367,22 @@ static int butterfly_initialize(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void butterfly_disable(const PROGRAMMER *pgm) {
|
static void butterfly_disable(PROGRAMMER * pgm)
|
||||||
|
{
|
||||||
butterfly_leave_prog_mode(pgm);
|
butterfly_leave_prog_mode(pgm);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void butterfly_enable(PROGRAMMER *pgm, const AVRPART *p) {
|
static void butterfly_enable(PROGRAMMER * pgm)
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int butterfly_open(PROGRAMMER *pgm, const char *port) {
|
static int butterfly_open(PROGRAMMER * pgm, char * port)
|
||||||
|
{
|
||||||
union pinfo pinfo;
|
union pinfo pinfo;
|
||||||
strcpy(pgm->port, port);
|
strcpy(pgm->port, port);
|
||||||
/*
|
/*
|
||||||
|
@ -370,8 +391,7 @@ static int butterfly_open(PROGRAMMER *pgm, const char *port) {
|
||||||
if(pgm->baudrate == 0) {
|
if(pgm->baudrate == 0) {
|
||||||
pgm->baudrate = 19200;
|
pgm->baudrate = 19200;
|
||||||
}
|
}
|
||||||
pinfo.serialinfo.baud = pgm->baudrate;
|
pinfo.baud = pgm->baudrate;
|
||||||
pinfo.serialinfo.cflags = SERIAL_8N1;
|
|
||||||
if (serial_open(port, pinfo, &pgm->fd)==-1) {
|
if (serial_open(port, pinfo, &pgm->fd)==-1) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -396,36 +416,27 @@ static void butterfly_close(PROGRAMMER * pgm)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void butterfly_display(const PROGRAMMER *pgm, const char *p) {
|
static void butterfly_display(PROGRAMMER * pgm, const char * p)
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void butterfly_set_addr(const PROGRAMMER *pgm, unsigned long addr) {
|
static void butterfly_set_addr(PROGRAMMER * pgm, unsigned long addr)
|
||||||
if( addr < 0x10000 ) {
|
{
|
||||||
char cmd[3];
|
char cmd[3];
|
||||||
|
|
||||||
cmd[0] = 'A';
|
cmd[0] = 'A';
|
||||||
cmd[1] = (addr >> 8) & 0xff;
|
cmd[1] = (addr >> 8) & 0xff;
|
||||||
cmd[2] = addr & 0xff;
|
cmd[2] = addr & 0xff;
|
||||||
|
|
||||||
butterfly_send(pgm, cmd, sizeof(cmd));
|
butterfly_send(pgm, cmd, sizeof(cmd));
|
||||||
butterfly_vfy_cmd_sent(pgm, "set addr");
|
butterfly_vfy_cmd_sent(pgm, "set addr");
|
||||||
} else {
|
|
||||||
char cmd[4];
|
|
||||||
|
|
||||||
cmd[0] = 'H';
|
|
||||||
cmd[1] = (addr >> 16) & 0xff;
|
|
||||||
cmd[2] = (addr >> 8) & 0xff;
|
|
||||||
cmd[3] = addr & 0xff;
|
|
||||||
|
|
||||||
butterfly_send(pgm, cmd, sizeof(cmd));
|
|
||||||
butterfly_vfy_cmd_sent(pgm, "set extaddr");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void butterfly_set_extaddr(const PROGRAMMER *pgm, unsigned long addr) {
|
static void butterfly_set_extaddr(PROGRAMMER * pgm, unsigned long addr)
|
||||||
|
{
|
||||||
char cmd[4];
|
char cmd[4];
|
||||||
|
|
||||||
cmd[0] = 'H';
|
cmd[0] = 'H';
|
||||||
|
@ -439,7 +450,7 @@ static void butterfly_set_extaddr(const PROGRAMMER *pgm, unsigned long addr) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static int butterfly_write_byte(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *m,
|
static int butterfly_write_byte(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||||
unsigned long addr, unsigned char value)
|
unsigned long addr, unsigned char value)
|
||||||
{
|
{
|
||||||
char cmd[6];
|
char cmd[6];
|
||||||
|
@ -483,7 +494,7 @@ static int butterfly_write_byte(const PROGRAMMER *pgm, const AVRPART *p, const A
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int butterfly_read_byte_flash(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *m,
|
static int butterfly_read_byte_flash(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||||
unsigned long addr, unsigned char * value)
|
unsigned long addr, unsigned char * value)
|
||||||
{
|
{
|
||||||
static int cached = 0;
|
static int cached = 0;
|
||||||
|
@ -503,13 +514,9 @@ static int butterfly_read_byte_flash(const PROGRAMMER *pgm, const AVRPART *p, co
|
||||||
} else {
|
} else {
|
||||||
butterfly_set_addr(pgm, addr >> 1);
|
butterfly_set_addr(pgm, addr >> 1);
|
||||||
}
|
}
|
||||||
// Defaults to flash read ('F')
|
|
||||||
char msg[4] = {'g', 0x00, 0x02, 'F'};
|
butterfly_send(pgm, "g\000\002F", 4);
|
||||||
if (strcmp(m->desc, "prodsig") == 0)
|
|
||||||
msg[3] = 'P';
|
|
||||||
else if (strcmp(m->desc, "usersig") == 0)
|
|
||||||
msg[3] = 'U';
|
|
||||||
butterfly_send(pgm, msg, 4);
|
|
||||||
/* Read back the program mem word (MSB first) */
|
/* Read back the program mem word (MSB first) */
|
||||||
butterfly_recv(pgm, buf, sizeof(buf));
|
butterfly_recv(pgm, buf, sizeof(buf));
|
||||||
|
|
||||||
|
@ -528,7 +535,7 @@ static int butterfly_read_byte_flash(const PROGRAMMER *pgm, const AVRPART *p, co
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int butterfly_read_byte_eeprom(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *m,
|
static int butterfly_read_byte_eeprom(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||||
unsigned long addr, unsigned char * value)
|
unsigned long addr, unsigned char * value)
|
||||||
{
|
{
|
||||||
butterfly_set_addr(pgm, addr);
|
butterfly_set_addr(pgm, addr);
|
||||||
|
@ -537,14 +544,23 @@ static int butterfly_read_byte_eeprom(const PROGRAMMER *pgm, const AVRPART *p, c
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int butterfly_read_byte(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *m,
|
static int butterfly_page_erase(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, unsigned int addr)
|
||||||
|
{
|
||||||
|
if (strcmp(m->desc, "flash") == 0)
|
||||||
|
return -1; /* not supported */
|
||||||
|
if (strcmp(m->desc, "eeprom") == 0)
|
||||||
|
return 0; /* nothing to do */
|
||||||
|
avrdude_message(MSG_INFO, "%s: butterfly_page_erase() called on memory type \"%s\"\n",
|
||||||
|
progname, m->desc);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int butterfly_read_byte(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||||
unsigned long addr, unsigned char * value)
|
unsigned long addr, unsigned char * value)
|
||||||
{
|
{
|
||||||
char cmd;
|
char cmd;
|
||||||
|
|
||||||
if (strcmp(m->desc, "flash") == 0 ||
|
if (strcmp(m->desc, "flash") == 0) {
|
||||||
strcmp(m->desc, "prodsig") == 0 ||
|
|
||||||
strcmp(m->desc, "usersig") == 0) {
|
|
||||||
return butterfly_read_byte_flash(pgm, p, m, addr, value);
|
return butterfly_read_byte_flash(pgm, p, m, addr, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -575,7 +591,7 @@ static int butterfly_read_byte(const PROGRAMMER *pgm, const AVRPART *p, const AV
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static int butterfly_paged_write(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *m,
|
static int butterfly_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||||
unsigned int page_size,
|
unsigned int page_size,
|
||||||
unsigned int addr, unsigned int n_bytes)
|
unsigned int addr, unsigned int n_bytes)
|
||||||
{
|
{
|
||||||
|
@ -585,9 +601,7 @@ static int butterfly_paged_write(const PROGRAMMER *pgm, const AVRPART *p, const
|
||||||
int use_ext_addr = m->op[AVR_OP_LOAD_EXT_ADDR] != NULL;
|
int use_ext_addr = m->op[AVR_OP_LOAD_EXT_ADDR] != NULL;
|
||||||
unsigned int wr_size = 2;
|
unsigned int wr_size = 2;
|
||||||
|
|
||||||
if (strcmp(m->desc, "flash") &&
|
if (strcmp(m->desc, "flash") && strcmp(m->desc, "eeprom"))
|
||||||
strcmp(m->desc, "eeprom") &&
|
|
||||||
strcmp(m->desc, "usersig"))
|
|
||||||
return -2;
|
return -2;
|
||||||
|
|
||||||
if (m->desc[0] == 'e')
|
if (m->desc[0] == 'e')
|
||||||
|
@ -632,7 +646,7 @@ static int butterfly_paged_write(const PROGRAMMER *pgm, const AVRPART *p, const
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static int butterfly_paged_load(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *m,
|
static int butterfly_paged_load(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||||
unsigned int page_size,
|
unsigned int page_size,
|
||||||
unsigned int addr, unsigned int n_bytes)
|
unsigned int addr, unsigned int n_bytes)
|
||||||
{
|
{
|
||||||
|
@ -641,10 +655,8 @@ static int butterfly_paged_load(const PROGRAMMER *pgm, const AVRPART *p, const A
|
||||||
int blocksize = PDATA(pgm)->buffersize;
|
int blocksize = PDATA(pgm)->buffersize;
|
||||||
int use_ext_addr = m->op[AVR_OP_LOAD_EXT_ADDR] != NULL;
|
int use_ext_addr = m->op[AVR_OP_LOAD_EXT_ADDR] != NULL;
|
||||||
|
|
||||||
/* check parameter syntax: only "flash", "eeprom" or "usersig" is allowed */
|
/* check parameter syntax: only "flash" or "eeprom" is allowed */
|
||||||
if (strcmp(m->desc, "flash") &&
|
if (strcmp(m->desc, "flash") && strcmp(m->desc, "eeprom"))
|
||||||
strcmp(m->desc, "eeprom") &&
|
|
||||||
strcmp(m->desc, "usersig"))
|
|
||||||
return -2;
|
return -2;
|
||||||
|
|
||||||
if (m->desc[0] == 'e')
|
if (m->desc[0] == 'e')
|
||||||
|
@ -680,11 +692,12 @@ static int butterfly_paged_load(const PROGRAMMER *pgm, const AVRPART *p, const A
|
||||||
|
|
||||||
|
|
||||||
/* Signature byte reads are always 3 bytes. */
|
/* Signature byte reads are always 3 bytes. */
|
||||||
static int butterfly_read_sig_bytes(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *m) {
|
static int butterfly_read_sig_bytes(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m)
|
||||||
|
{
|
||||||
unsigned char tmp;
|
unsigned char tmp;
|
||||||
|
|
||||||
if (m->size < 3) {
|
if (m->size < 3) {
|
||||||
pmsg_error("memsize too small for sig byte read");
|
avrdude_message(MSG_INFO, "%s: memsize too small for sig byte read", progname);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -700,7 +713,8 @@ static int butterfly_read_sig_bytes(const PROGRAMMER *pgm, const AVRPART *p, con
|
||||||
|
|
||||||
const char butterfly_desc[] = "Atmel Butterfly evaluation board; Atmel AppNotes AVR109, AVR911";
|
const char butterfly_desc[] = "Atmel Butterfly evaluation board; Atmel AppNotes AVR109, AVR911";
|
||||||
|
|
||||||
void butterfly_initpgm(PROGRAMMER *pgm) {
|
void butterfly_initpgm(PROGRAMMER * pgm)
|
||||||
|
{
|
||||||
strcpy(pgm->type, "butterfly");
|
strcpy(pgm->type, "butterfly");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -727,6 +741,7 @@ void butterfly_initpgm(PROGRAMMER *pgm) {
|
||||||
* optional functions
|
* optional functions
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
pgm->page_erase = butterfly_page_erase;
|
||||||
pgm->paged_write = butterfly_paged_write;
|
pgm->paged_write = butterfly_paged_write;
|
||||||
pgm->paged_load = butterfly_paged_load;
|
pgm->paged_load = butterfly_paged_load;
|
||||||
|
|
||||||
|
@ -739,7 +754,8 @@ void butterfly_initpgm(PROGRAMMER *pgm) {
|
||||||
|
|
||||||
const char butterfly_mk_desc[] = "Mikrokopter.de Butterfly";
|
const char butterfly_mk_desc[] = "Mikrokopter.de Butterfly";
|
||||||
|
|
||||||
void butterfly_mk_initpgm(PROGRAMMER *pgm) {
|
void butterfly_mk_initpgm(PROGRAMMER * pgm)
|
||||||
|
{
|
||||||
butterfly_initpgm(pgm);
|
butterfly_initpgm(pgm);
|
||||||
strcpy(pgm->type, "butterfly_mk");
|
strcpy(pgm->type, "butterfly_mk");
|
||||||
pgm->flag = IS_BUTTERFLY_MK;
|
pgm->flag = IS_BUTTERFLY_MK;
|
|
@ -27,8 +27,8 @@ extern "C" {
|
||||||
|
|
||||||
extern const char butterfly_desc[];
|
extern const char butterfly_desc[];
|
||||||
extern const char butterfly_mk_desc[];
|
extern const char butterfly_mk_desc[];
|
||||||
void butterfly_initpgm(PROGRAMMER *pgm);
|
void butterfly_initpgm (PROGRAMMER * pgm);
|
||||||
void butterfly_mk_initpgm(PROGRAMMER *pgm);
|
void butterfly_mk_initpgm (PROGRAMMER * pgm);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
|
@ -0,0 +1,351 @@
|
||||||
|
/*
|
||||||
|
* avrdude - A Downloader/Uploader for AVR device programmers
|
||||||
|
* Copyright (C) 2000-2004 Brian S. Dean <bsd@bsdhome.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, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
#include "ac_cfg.h"
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "avrdude.h"
|
||||||
|
#include "libavrdude.h"
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include "config_gram.h"
|
||||||
|
|
||||||
|
char default_programmer[MAX_STR_CONST];
|
||||||
|
char default_parallel[PATH_MAX];
|
||||||
|
char default_serial[PATH_MAX];
|
||||||
|
double default_bitclock;
|
||||||
|
int default_safemode;
|
||||||
|
|
||||||
|
char string_buf[MAX_STR_CONST];
|
||||||
|
char *string_buf_ptr;
|
||||||
|
|
||||||
|
LISTID string_list;
|
||||||
|
LISTID number_list;
|
||||||
|
PROGRAMMER * current_prog;
|
||||||
|
AVRPART * current_part;
|
||||||
|
AVRMEM * current_mem;
|
||||||
|
LISTID part_list;
|
||||||
|
LISTID programmers;
|
||||||
|
|
||||||
|
int lineno;
|
||||||
|
const char * infile;
|
||||||
|
|
||||||
|
extern char * yytext;
|
||||||
|
|
||||||
|
#define DEBUG 0
|
||||||
|
|
||||||
|
void cleanup_config(void)
|
||||||
|
{
|
||||||
|
ldestroy_cb(part_list, (void(*)(void*))avr_free_part);
|
||||||
|
ldestroy_cb(programmers, (void(*)(void*))pgm_free);
|
||||||
|
ldestroy_cb(string_list, (void(*)(void*))free_token);
|
||||||
|
ldestroy_cb(number_list, (void(*)(void*))free_token);
|
||||||
|
}
|
||||||
|
|
||||||
|
int init_config(void)
|
||||||
|
{
|
||||||
|
string_list = lcreat(NULL, 0);
|
||||||
|
number_list = lcreat(NULL, 0);
|
||||||
|
current_prog = NULL;
|
||||||
|
current_part = NULL;
|
||||||
|
current_mem = NULL;
|
||||||
|
part_list = lcreat(NULL, 0);
|
||||||
|
programmers = lcreat(NULL, 0);
|
||||||
|
|
||||||
|
lineno = 1;
|
||||||
|
infile = NULL;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int yywrap()
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int yyerror(char * errmsg, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
|
||||||
|
char message[512];
|
||||||
|
|
||||||
|
va_start(args, errmsg);
|
||||||
|
|
||||||
|
vsnprintf(message, sizeof(message), errmsg, args);
|
||||||
|
avrdude_message(MSG_INFO, "%s: error at %s:%d: %s\n", progname, infile, lineno, message);
|
||||||
|
|
||||||
|
va_end(args);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int yywarning(char * errmsg, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
|
||||||
|
char message[512];
|
||||||
|
|
||||||
|
va_start(args, errmsg);
|
||||||
|
|
||||||
|
vsnprintf(message, sizeof(message), errmsg, args);
|
||||||
|
avrdude_message(MSG_INFO, "%s: warning at %s:%d: %s\n", progname, infile, lineno, message);
|
||||||
|
|
||||||
|
va_end(args);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TOKEN * new_token(int primary)
|
||||||
|
{
|
||||||
|
TOKEN * tkn;
|
||||||
|
|
||||||
|
tkn = (TOKEN *)malloc(sizeof(TOKEN));
|
||||||
|
if (tkn == NULL) {
|
||||||
|
yyerror("new_token(): out of memory");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(tkn, 0, sizeof(TOKEN));
|
||||||
|
|
||||||
|
tkn->primary = primary;
|
||||||
|
|
||||||
|
return tkn;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void free_token(TOKEN * tkn)
|
||||||
|
{
|
||||||
|
if (tkn) {
|
||||||
|
switch (tkn->value.type) {
|
||||||
|
case V_STR:
|
||||||
|
if (tkn->value.string)
|
||||||
|
free(tkn->value.string);
|
||||||
|
tkn->value.string = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(tkn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void free_tokens(int n, ...)
|
||||||
|
{
|
||||||
|
TOKEN * t;
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap, n);
|
||||||
|
while (n--) {
|
||||||
|
t = va_arg(ap, TOKEN *);
|
||||||
|
free_token(t);
|
||||||
|
}
|
||||||
|
va_end(ap);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
TOKEN * number(char * text)
|
||||||
|
{
|
||||||
|
struct token_t * tkn;
|
||||||
|
|
||||||
|
tkn = new_token(TKN_NUMBER);
|
||||||
|
if (tkn == NULL) {
|
||||||
|
return NULL; /* yyerror already called */
|
||||||
|
}
|
||||||
|
tkn->value.type = V_NUM;
|
||||||
|
tkn->value.number = atoi(text);
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
avrdude_message(MSG_INFO, "NUMBER(%d)\n", tkn->value.number);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return tkn;
|
||||||
|
}
|
||||||
|
|
||||||
|
TOKEN * number_real(char * text)
|
||||||
|
{
|
||||||
|
struct token_t * tkn;
|
||||||
|
|
||||||
|
tkn = new_token(TKN_NUMBER);
|
||||||
|
tkn->value.type = V_NUM_REAL;
|
||||||
|
tkn->value.number_real = atof(text);
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
avrdude_message(MSG_INFO, "NUMBER(%g)\n", tkn->value.number_real);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return tkn;
|
||||||
|
}
|
||||||
|
|
||||||
|
TOKEN * hexnumber(char * text)
|
||||||
|
{
|
||||||
|
struct token_t * tkn;
|
||||||
|
char * e;
|
||||||
|
|
||||||
|
tkn = new_token(TKN_NUMBER);
|
||||||
|
if (tkn == NULL) {
|
||||||
|
return NULL; /* yyerror already called */
|
||||||
|
}
|
||||||
|
tkn->value.type = V_NUM;
|
||||||
|
tkn->value.number = strtoul(text, &e, 16);
|
||||||
|
if ((e == text) || (*e != 0)) {
|
||||||
|
yyerror("can't scan hex number \"%s\"", text);
|
||||||
|
free_token(tkn);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
avrdude_message(MSG_INFO, "HEXNUMBER(%g)\n", tkn->value.number);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return tkn;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TOKEN * string(char * text)
|
||||||
|
{
|
||||||
|
struct token_t * tkn;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
tkn = new_token(TKN_STRING);
|
||||||
|
if (tkn == NULL) {
|
||||||
|
return NULL; /* yyerror already called */
|
||||||
|
}
|
||||||
|
|
||||||
|
len = strlen(text);
|
||||||
|
|
||||||
|
tkn->value.type = V_STR;
|
||||||
|
tkn->value.string = (char *) malloc(len+1);
|
||||||
|
if (tkn->value.string == NULL) {
|
||||||
|
yyerror("string(): out of memory");
|
||||||
|
free_token(tkn);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
strcpy(tkn->value.string, text);
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
avrdude_message(MSG_INFO, "STRING(%s)\n", tkn->value.string);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return tkn;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TOKEN * keyword(int primary)
|
||||||
|
{
|
||||||
|
struct token_t * tkn;
|
||||||
|
|
||||||
|
tkn = new_token(primary);
|
||||||
|
|
||||||
|
return tkn;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void print_token(TOKEN * tkn)
|
||||||
|
{
|
||||||
|
if (!tkn)
|
||||||
|
return;
|
||||||
|
|
||||||
|
avrdude_message(MSG_INFO, "token = %d = ", tkn->primary);
|
||||||
|
switch (tkn->value.type) {
|
||||||
|
case V_NUM:
|
||||||
|
avrdude_message(MSG_INFO, "NUMBER, value=%d", tkn->value.number);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case V_NUM_REAL:
|
||||||
|
avrdude_message(MSG_INFO, "NUMBER, value=%g", tkn->value.number_real);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case V_STR:
|
||||||
|
avrdude_message(MSG_INFO, "STRING, value=%s", tkn->value.string);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
avrdude_message(MSG_INFO, "<other>");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
avrdude_message(MSG_INFO, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void pyytext(void)
|
||||||
|
{
|
||||||
|
#if DEBUG
|
||||||
|
avrdude_message(MSG_INFO, "TOKEN: \"%s\"\n", yytext);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char * dup_string(const char * str)
|
||||||
|
{
|
||||||
|
char * s;
|
||||||
|
|
||||||
|
s = strdup(str);
|
||||||
|
if (s == NULL) {
|
||||||
|
yyerror("dup_string(): out of memory");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_YYLEX_DESTROY
|
||||||
|
/* reset lexer and free any allocated memory */
|
||||||
|
extern int yylex_destroy(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int read_config(const char * file)
|
||||||
|
{
|
||||||
|
FILE * f;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
f = fopen(file, "r");
|
||||||
|
if (f == NULL) {
|
||||||
|
avrdude_message(MSG_INFO, "%s: can't open config file \"%s\": %s\n",
|
||||||
|
progname, file, strerror(errno));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
lineno = 1;
|
||||||
|
infile = file;
|
||||||
|
yyin = f;
|
||||||
|
|
||||||
|
r = yyparse();
|
||||||
|
|
||||||
|
#ifdef HAVE_YYLEX_DESTROY
|
||||||
|
/* reset lexer and free any allocated memory */
|
||||||
|
yylex_destroy();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
fclose(f);
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
|
@ -0,0 +1,103 @@
|
||||||
|
/*
|
||||||
|
* avrdude - A Downloader/Uploader for AVR device programmers
|
||||||
|
* Copyright (C) 2000-2004 Brian S. Dean <bsd@bsdhome.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, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
/* These are the internal definitions needed for config parsing */
|
||||||
|
|
||||||
|
#ifndef config_h
|
||||||
|
#define config_h
|
||||||
|
|
||||||
|
#include "libavrdude.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define MAX_STR_CONST 1024
|
||||||
|
|
||||||
|
enum { V_NONE, V_NUM, V_NUM_REAL, V_STR };
|
||||||
|
typedef struct value_t {
|
||||||
|
int type;
|
||||||
|
/*union { TODO: use an anonymous union here ? */
|
||||||
|
int number;
|
||||||
|
double number_real;
|
||||||
|
char * string;
|
||||||
|
/*};*/
|
||||||
|
} VALUE;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct token_t {
|
||||||
|
int primary;
|
||||||
|
VALUE value;
|
||||||
|
} TOKEN;
|
||||||
|
typedef struct token_t *token_p;
|
||||||
|
|
||||||
|
|
||||||
|
extern FILE * yyin;
|
||||||
|
extern PROGRAMMER * current_prog;
|
||||||
|
extern AVRPART * current_part;
|
||||||
|
extern AVRMEM * current_mem;
|
||||||
|
extern int lineno;
|
||||||
|
extern const char * infile;
|
||||||
|
extern LISTID string_list;
|
||||||
|
extern LISTID number_list;
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined(HAS_YYSTYPE)
|
||||||
|
#define YYSTYPE token_p
|
||||||
|
#endif
|
||||||
|
extern YYSTYPE yylval;
|
||||||
|
|
||||||
|
extern char string_buf[MAX_STR_CONST];
|
||||||
|
extern char *string_buf_ptr;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int yyparse(void);
|
||||||
|
|
||||||
|
int yyerror(char * errmsg, ...);
|
||||||
|
|
||||||
|
int yywarning(char * errmsg, ...);
|
||||||
|
|
||||||
|
TOKEN * new_token(int primary);
|
||||||
|
|
||||||
|
void free_token(TOKEN * tkn);
|
||||||
|
|
||||||
|
void free_tokens(int n, ...);
|
||||||
|
|
||||||
|
TOKEN * number(char * text);
|
||||||
|
|
||||||
|
TOKEN * number_real(char * text);
|
||||||
|
|
||||||
|
TOKEN * hexnumber(char * text);
|
||||||
|
|
||||||
|
TOKEN * string(char * text);
|
||||||
|
|
||||||
|
TOKEN * keyword(int primary);
|
||||||
|
|
||||||
|
void print_token(TOKEN * tkn);
|
||||||
|
|
||||||
|
void pyytext(void);
|
||||||
|
|
||||||
|
char * dup_string(const char * str);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
File diff suppressed because it is too large
Load Diff
|
@ -23,14 +23,14 @@
|
||||||
# Process this file with autoconf to produce a configure script.
|
# Process this file with autoconf to produce a configure script.
|
||||||
|
|
||||||
AC_PREREQ(2.60)
|
AC_PREREQ(2.60)
|
||||||
AC_INIT(avrdude, 7.1-20230108, avrdude-dev@nongnu.org)
|
AC_INIT(avrdude, 6.4, avrdude-dev@nongnu.org)
|
||||||
|
|
||||||
AC_CANONICAL_BUILD
|
AC_CANONICAL_BUILD
|
||||||
AC_CANONICAL_HOST
|
AC_CANONICAL_HOST
|
||||||
AC_CANONICAL_TARGET
|
AC_CANONICAL_TARGET
|
||||||
|
|
||||||
AC_CONFIG_SRCDIR([main.c])
|
AC_CONFIG_SRCDIR([main.c])
|
||||||
AM_INIT_AUTOMAKE([foreign])
|
AM_INIT_AUTOMAKE
|
||||||
AC_CONFIG_HEADERS(ac_cfg.h)
|
AC_CONFIG_HEADERS(ac_cfg.h)
|
||||||
AC_CONFIG_MACRO_DIR([m4])
|
AC_CONFIG_MACRO_DIR([m4])
|
||||||
|
|
||||||
|
@ -195,8 +195,6 @@ if test x$have_libftdi1 = xyes; then
|
||||||
LIBFTDI1="-lftdi1"
|
LIBFTDI1="-lftdi1"
|
||||||
AC_DEFINE([HAVE_LIBFTDI1])
|
AC_DEFINE([HAVE_LIBFTDI1])
|
||||||
AC_SUBST(LIBFTDI1, $LIBFTDI1)
|
AC_SUBST(LIBFTDI1, $LIBFTDI1)
|
||||||
LIBS="${LIBS} ${LIBFTDI1}"
|
|
||||||
AC_CHECK_FUNCS(ftdi_tcioflush)
|
|
||||||
else
|
else
|
||||||
if test x$have_libftdi = xyes; then
|
if test x$have_libftdi = xyes; then
|
||||||
LIBFTDI="-lftdi -lusb"
|
LIBFTDI="-lftdi -lusb"
|
||||||
|
@ -228,15 +226,23 @@ AC_HEADER_TIME
|
||||||
|
|
||||||
AC_CHECK_HEADERS([netinet/in.h])
|
AC_CHECK_HEADERS([netinet/in.h])
|
||||||
|
|
||||||
|
# WinSock2
|
||||||
|
AC_CHECK_LIB([ws2_32], [puts])
|
||||||
|
|
||||||
# Checks for library functions.
|
# Checks for library functions.
|
||||||
AC_CHECK_FUNCS([memset select strcasecmp strdup strerror strncasecmp strtol strtoul gettimeofday usleep getaddrinfo])
|
AC_CHECK_FUNCS([memset select strcasecmp strdup strerror strncasecmp strtol strtoul gettimeofday usleep getaddrinfo])
|
||||||
|
|
||||||
AC_MSG_CHECKING([for a Win32 HID library])
|
AC_MSG_CHECKING([for a Win32 HID libray])
|
||||||
SAVED_LIBS="${LIBS}"
|
SAVED_LIBS="${LIBS}"
|
||||||
case $target in
|
case $target in
|
||||||
*-*-mingw32* | *-*-cygwin* | *-*-windows*)
|
*-*-mingw32* | *-*-cygwin* | *-*-windows*)
|
||||||
LIBHID="-lhid -lsetupapi"
|
LIBHID="-lhid -lsetupapi"
|
||||||
HIDINCLUDE="#include <hidsdi.h>"
|
if test $ac_cv_header_ddk_hidsdi_h = yes
|
||||||
|
then
|
||||||
|
HIDINCLUDE="#include <ddk/hidsdi.h>"
|
||||||
|
else
|
||||||
|
HIDINCLUDE="#include \"my_ddk_hidsdi.h\""
|
||||||
|
fi
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
LIBHID=""
|
LIBHID=""
|
||||||
|
@ -342,7 +348,7 @@ AC_ARG_ENABLE(
|
||||||
esac],
|
esac],
|
||||||
[enabled_linuxspi=no])
|
[enabled_linuxspi=no])
|
||||||
|
|
||||||
DIST_SUBDIRS_AC='doc'
|
DIST_SUBDIRS_AC='doc windows'
|
||||||
|
|
||||||
if test "$enabled_doc" = "yes"; then
|
if test "$enabled_doc" = "yes"; then
|
||||||
SUBDIRS_AC='doc'
|
SUBDIRS_AC='doc'
|
||||||
|
@ -427,7 +433,7 @@ else
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
# If we are compiling with gcc, enable all warnings and make warnings errors.
|
# If we are compiling with gcc, enable all warning and make warnings errors.
|
||||||
if test "$GCC" = yes; then
|
if test "$GCC" = yes; then
|
||||||
ENABLE_WARNINGS="-Wall"
|
ENABLE_WARNINGS="-Wall"
|
||||||
|
|
||||||
|
@ -499,19 +505,22 @@ case $target in
|
||||||
LDFLAGS="${LDFLAGS} -static"
|
LDFLAGS="${LDFLAGS} -static"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
WINDOWS_DIRS="windows"
|
||||||
CFLAGS="${CFLAGS} -DWIN32NATIVE"
|
CFLAGS="${CFLAGS} -DWIN32NATIVE"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
AC_SUBST(WINDOWS_DIRS,$WINDOWS_DIRS)
|
||||||
|
|
||||||
AC_CONFIG_FILES([
|
AC_CONFIG_FILES([
|
||||||
doc/Makefile
|
doc/Makefile
|
||||||
|
windows/Makefile
|
||||||
avrdude.spec
|
avrdude.spec
|
||||||
Makefile
|
Makefile
|
||||||
])
|
])
|
||||||
|
|
||||||
# The procedure to create avrdude.conf involves two steps. First,
|
# The procedure to create avrdude.conf involves two steps. First,
|
||||||
# normal autoconf substitution will be applied, resulting in
|
# normal autoconf substitution will be applied, resulting in
|
||||||
# avrdude.conf.tmp. Finally, a sed command will be applied to filter
|
# avrdude.conf.tmp. Finally, a sed command will be applied to filter
|
||||||
# out unwanted parts (currently the parallel port programmer types)
|
# out unwanted parts (currently the parallel port programmer types)
|
||||||
# based on previous configuration results, thereby producing the final
|
# based on previous configuration results, thereby producing the final
|
||||||
# avrdude.conf file.
|
# avrdude.conf file.
|
||||||
|
@ -577,12 +586,6 @@ else
|
||||||
echo "DON'T HAVE libhidapi"
|
echo "DON'T HAVE libhidapi"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test x$have_readline = xyes; then
|
|
||||||
echo "DO HAVE libreadline"
|
|
||||||
else
|
|
||||||
echo "DON'T HAVE libreadline"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test x$have_pthread = xyes; then
|
if test x$have_pthread = xyes; then
|
||||||
echo "DO HAVE pthread"
|
echo "DO HAVE pthread"
|
||||||
else
|
else
|
|
@ -17,33 +17,38 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "ac_cfg.h"
|
|
||||||
#include "avrdude.h"
|
#include "avrdude.h"
|
||||||
#include "libavrdude.h"
|
#include "libavrdude.h"
|
||||||
|
|
||||||
#if defined(WIN32)
|
#if defined(WIN32NATIVE)
|
||||||
|
|
||||||
#define WIN32_LEAN_AND_MEAN
|
#include <limits.h>
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
|
|
||||||
static char *filename;
|
static char *filename;
|
||||||
|
|
||||||
|
|
||||||
void win_sys_config_set(char sys_config[PATH_MAX])
|
void win_sys_config_set(char sys_config[PATH_MAX])
|
||||||
{
|
{
|
||||||
sys_config[0] = 0;
|
sys_config[0] = 0;
|
||||||
|
|
||||||
/* Use Windows API call to search for the Windows default system config file.*/
|
/* Use Windows API call to search for the Windows default system config file.*/
|
||||||
SearchPath(NULL, SYSTEM_CONF_FILE, NULL, PATH_MAX, sys_config, &filename);
|
SearchPath(NULL, "avrdude.conf", NULL, PATH_MAX, sys_config, &filename);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void win_usr_config_set(char usr_config[PATH_MAX])
|
void win_usr_config_set(char usr_config[PATH_MAX])
|
||||||
{
|
{
|
||||||
usr_config[0] = 0;
|
usr_config[0] = 0;
|
||||||
|
|
||||||
/* Use Windows API call to search for the Windows default user config file. */
|
/* Use Windows API call to search for the Windows default user config file. */
|
||||||
SearchPath(NULL, USER_CONF_FILE, NULL, PATH_MAX, usr_config, &filename);
|
SearchPath(NULL, "avrdude.rc", NULL, PATH_MAX, usr_config, &filename);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -38,8 +38,9 @@
|
||||||
|
|
||||||
#ifndef HAVE_LIBUSB
|
#ifndef HAVE_LIBUSB
|
||||||
|
|
||||||
struct dfu_dev *dfu_open(const char *port_name) {
|
struct dfu_dev *dfu_open(char *port_name) {
|
||||||
pmsg_error("no USB support compiled for avrdude\n");
|
avrdude_message(MSG_INFO, "%s: Error: No USB support in this compile of avrdude\n",
|
||||||
|
progname);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -98,7 +99,8 @@ static char * get_usb_string(usb_dev_handle * dev_handle, int index);
|
||||||
/* EXPORTED FUNCTION DEFINITIONS
|
/* EXPORTED FUNCTION DEFINITIONS
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct dfu_dev *dfu_open(const char *port_spec) {
|
struct dfu_dev * dfu_open(char *port_spec)
|
||||||
|
{
|
||||||
struct dfu_dev *dfu;
|
struct dfu_dev *dfu;
|
||||||
char *bus_name = NULL;
|
char *bus_name = NULL;
|
||||||
char *dev_name = NULL;
|
char *dev_name = NULL;
|
||||||
|
@ -110,14 +112,16 @@ struct dfu_dev *dfu_open(const char *port_spec) {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (strncmp(port_spec, "usb", 3) != 0) {
|
if (strncmp(port_spec, "usb", 3) != 0) {
|
||||||
pmsg_error("invalid port specification %s for USB device\n", port_spec);
|
avrdude_message(MSG_INFO, "%s: Error: "
|
||||||
|
"Invalid port specification \"%s\" for USB device\n",
|
||||||
|
progname, port_spec);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(':' == port_spec[3]) {
|
if(':' == port_spec[3]) {
|
||||||
bus_name = strdup(port_spec + 3 + 1);
|
bus_name = strdup(port_spec + 3 + 1);
|
||||||
if (bus_name == NULL) {
|
if (bus_name == NULL) {
|
||||||
pmsg_error("out of memory in strdup\n");
|
avrdude_message(MSG_INFO, "%s: Out of memory in strdup\n", progname);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -134,7 +138,7 @@ struct dfu_dev *dfu_open(const char *port_spec) {
|
||||||
|
|
||||||
if (dfu == NULL)
|
if (dfu == NULL)
|
||||||
{
|
{
|
||||||
pmsg_error("out of memory\n");
|
avrdude_message(MSG_INFO, "%s: out of memory\n", progname);
|
||||||
free(bus_name);
|
free(bus_name);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -168,7 +172,9 @@ int dfu_init(struct dfu_dev *dfu, unsigned short vid, unsigned short pid)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (pid == 0 && dfu->dev_name == NULL) {
|
if (pid == 0 && dfu->dev_name == NULL) {
|
||||||
pmsg_error("no DFU support for part; specify PID in config or USB address (via -P) to override\n");
|
avrdude_message(MSG_INFO, "%s: Error: No DFU support for part; "
|
||||||
|
"specify PID in config or USB address (via -P) to override.\n",
|
||||||
|
progname);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -203,18 +209,20 @@ int dfu_init(struct dfu_dev *dfu, unsigned short vid, unsigned short pid)
|
||||||
* why the match failed, and if we came across another DFU-capable part.
|
* why the match failed, and if we came across another DFU-capable part.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
pmsg_error("no matching USB device found\n");
|
avrdude_message(MSG_INFO, "%s: Error: No matching USB device found\n", progname);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
pmsg_notice("found VID=0x%04x PID=0x%04x at %s:%s\n",
|
if(verbose)
|
||||||
found->descriptor.idVendor, found->descriptor.idProduct,
|
avrdude_message(MSG_INFO, "%s: Found VID=0x%04x PID=0x%04x at %s:%s\n",
|
||||||
found->bus->dirname, found->filename);
|
progname, found->descriptor.idVendor, found->descriptor.idProduct,
|
||||||
|
found->bus->dirname, found->filename);
|
||||||
|
|
||||||
dfu->dev_handle = usb_open(found);
|
dfu->dev_handle = usb_open(found);
|
||||||
|
|
||||||
if (dfu->dev_handle == NULL) {
|
if (dfu->dev_handle == NULL) {
|
||||||
pmsg_error("USB device at %s:%s: %s\n", found->bus->dirname, found->filename, usb_strerror());
|
avrdude_message(MSG_INFO, "%s: Error: USB device at %s:%s: %s\n",
|
||||||
|
progname, found->bus->dirname, found->filename, usb_strerror());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -264,32 +272,37 @@ int dfu_getstatus(struct dfu_dev *dfu, struct dfu_status *status)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
pmsg_trace("dfu_getstatus(): issuing control IN message\n");
|
avrdude_message(MSG_TRACE, "%s: dfu_getstatus(): issuing control IN message\n",
|
||||||
|
progname);
|
||||||
|
|
||||||
result = usb_control_msg(dfu->dev_handle,
|
result = usb_control_msg(dfu->dev_handle,
|
||||||
0x80 | USB_TYPE_CLASS | USB_RECIP_INTERFACE, DFU_GETSTATUS, 0, 0,
|
0x80 | USB_TYPE_CLASS | USB_RECIP_INTERFACE, DFU_GETSTATUS, 0, 0,
|
||||||
(char*) status, sizeof(struct dfu_status), dfu->timeout);
|
(char*) status, sizeof(struct dfu_status), dfu->timeout);
|
||||||
|
|
||||||
if (result < 0) {
|
if (result < 0) {
|
||||||
pmsg_error("unable to get DFU status: %s\n", usb_strerror());
|
avrdude_message(MSG_INFO, "%s: Error: Failed to get DFU status: %s\n",
|
||||||
|
progname, usb_strerror());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result < sizeof(struct dfu_status)) {
|
if (result < sizeof(struct dfu_status)) {
|
||||||
pmsg_error("unable to get DFU status: %s\n", "short read");
|
avrdude_message(MSG_INFO, "%s: Error: Failed to get DFU status: %s\n",
|
||||||
|
progname, "short read");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result > sizeof(struct dfu_status)) {
|
if (result > sizeof(struct dfu_status)) {
|
||||||
pmsg_error("oversize read (should not happen); exiting\n");
|
avrdude_message(MSG_INFO, "%s: Error: Oversize read (should not happen); "
|
||||||
|
"exiting\n", progname);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
pmsg_trace("dfu_getstatus(): bStatus 0x%02x, bwPollTimeout %d, bState 0x%02x, iString %d\n",
|
avrdude_message(MSG_TRACE, "%s: dfu_getstatus(): bStatus 0x%02x, bwPollTimeout %d, bState 0x%02x, iString %d\n",
|
||||||
status->bStatus,
|
progname,
|
||||||
status->bwPollTimeout[0] | (status->bwPollTimeout[1] << 8) | (status->bwPollTimeout[2] << 16),
|
status->bStatus,
|
||||||
status->bState,
|
status->bwPollTimeout[0] | (status->bwPollTimeout[1] << 8) | (status->bwPollTimeout[2] << 16),
|
||||||
status->iString);
|
status->bState,
|
||||||
|
status->iString);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -298,14 +311,16 @@ int dfu_clrstatus(struct dfu_dev *dfu)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
pmsg_trace("dfu_clrstatus(): issuing control OUT message\n");
|
avrdude_message(MSG_TRACE, "%s: dfu_clrstatus(): issuing control OUT message\n",
|
||||||
|
progname);
|
||||||
|
|
||||||
result = usb_control_msg(dfu->dev_handle,
|
result = usb_control_msg(dfu->dev_handle,
|
||||||
USB_TYPE_CLASS | USB_RECIP_INTERFACE, DFU_CLRSTATUS, 0, 0,
|
USB_TYPE_CLASS | USB_RECIP_INTERFACE, DFU_CLRSTATUS, 0, 0,
|
||||||
NULL, 0, dfu->timeout);
|
NULL, 0, dfu->timeout);
|
||||||
|
|
||||||
if (result < 0) {
|
if (result < 0) {
|
||||||
pmsg_error("unable to clear DFU status: %s\n", usb_strerror());
|
avrdude_message(MSG_INFO, "%s: Error: Failed to clear DFU status: %s\n",
|
||||||
|
progname, usb_strerror());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -316,14 +331,16 @@ int dfu_abort(struct dfu_dev *dfu)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
pmsg_trace("dfu_abort(): issuing control OUT message\n");
|
avrdude_message(MSG_TRACE, "%s: dfu_abort(): issuing control OUT message\n",
|
||||||
|
progname);
|
||||||
|
|
||||||
result = usb_control_msg(dfu->dev_handle,
|
result = usb_control_msg(dfu->dev_handle,
|
||||||
USB_TYPE_CLASS | USB_RECIP_INTERFACE, DFU_ABORT, 0, 0,
|
USB_TYPE_CLASS | USB_RECIP_INTERFACE, DFU_ABORT, 0, 0,
|
||||||
NULL, 0, dfu->timeout);
|
NULL, 0, dfu->timeout);
|
||||||
|
|
||||||
if (result < 0) {
|
if (result < 0) {
|
||||||
pmsg_error("unable to reset DFU state: %s\n", usb_strerror());
|
avrdude_message(MSG_INFO, "%s: Error: Failed to reset DFU state: %s\n",
|
||||||
|
progname, usb_strerror());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -335,26 +352,29 @@ int dfu_dnload(struct dfu_dev *dfu, void *ptr, int size)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
pmsg_trace("dfu_dnload(): issuing control OUT message, wIndex = %d, ptr = %p, size = %d\n",
|
avrdude_message(MSG_TRACE, "%s: dfu_dnload(): issuing control OUT message, wIndex = %d, ptr = %p, size = %d\n",
|
||||||
wIndex, ptr, size);
|
progname, wIndex, ptr, size);
|
||||||
|
|
||||||
result = usb_control_msg(dfu->dev_handle,
|
result = usb_control_msg(dfu->dev_handle,
|
||||||
USB_TYPE_CLASS | USB_RECIP_INTERFACE, DFU_DNLOAD, wIndex++, 0,
|
USB_TYPE_CLASS | USB_RECIP_INTERFACE, DFU_DNLOAD, wIndex++, 0,
|
||||||
ptr, size, dfu->timeout);
|
ptr, size, dfu->timeout);
|
||||||
|
|
||||||
if (result < 0) {
|
if (result < 0) {
|
||||||
pmsg_error("DFU_DNLOAD failed: %s\n", usb_strerror());
|
avrdude_message(MSG_INFO, "%s: Error: DFU_DNLOAD failed: %s\n",
|
||||||
|
progname, usb_strerror());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result < size) {
|
if (result < size) {
|
||||||
pmsg_error("DFU_DNLOAD failed: short write\n");
|
avrdude_message(MSG_INFO, "%s: Error: DFU_DNLOAD failed: %s\n",
|
||||||
|
progname, "short write");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result > size) {
|
if (result > size) {
|
||||||
pmsg_error("DFU_DNLOAD failed: oversize write (should not happen)\n");
|
avrdude_message(MSG_INFO, "%s: Error: Oversize write (should not happen); " \
|
||||||
return -1;
|
"exiting\n", progname);
|
||||||
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -364,25 +384,28 @@ int dfu_upload(struct dfu_dev *dfu, void *ptr, int size)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
pmsg_trace("dfu_upload(): issuing control IN message, wIndex = %d, ptr = %p, size = %d\n",
|
avrdude_message(MSG_TRACE, "%s: dfu_upload(): issuing control IN message, wIndex = %d, ptr = %p, size = %d\n",
|
||||||
wIndex, ptr, size);
|
progname, wIndex, ptr, size);
|
||||||
|
|
||||||
result = usb_control_msg(dfu->dev_handle,
|
result = usb_control_msg(dfu->dev_handle,
|
||||||
0x80 | USB_TYPE_CLASS | USB_RECIP_INTERFACE, DFU_UPLOAD, wIndex++, 0,
|
0x80 | USB_TYPE_CLASS | USB_RECIP_INTERFACE, DFU_UPLOAD, wIndex++, 0,
|
||||||
ptr, size, dfu->timeout);
|
ptr, size, dfu->timeout);
|
||||||
|
|
||||||
if (result < 0) {
|
if (result < 0) {
|
||||||
pmsg_error("DFU_UPLOAD failed: %s\n", usb_strerror());
|
avrdude_message(MSG_INFO, "%s: Error: DFU_UPLOAD failed: %s\n",
|
||||||
|
progname, usb_strerror());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result < size) {
|
if (result < size) {
|
||||||
pmsg_error("DFU_UPLOAD failed: %s\n", "short read");
|
avrdude_message(MSG_INFO, "%s: Error: DFU_UPLOAD failed: %s\n",
|
||||||
|
progname, "short read");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result > size) {
|
if (result > size) {
|
||||||
pmsg_error("oversize read (should not happen); exiting\n");
|
avrdude_message(MSG_INFO, "%s: Error: Oversize read (should not happen); "
|
||||||
|
"exiting\n", progname);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -392,26 +415,26 @@ int dfu_upload(struct dfu_dev *dfu, void *ptr, int size)
|
||||||
void dfu_show_info(struct dfu_dev *dfu)
|
void dfu_show_info(struct dfu_dev *dfu)
|
||||||
{
|
{
|
||||||
if (dfu->manf_str != NULL)
|
if (dfu->manf_str != NULL)
|
||||||
msg_info(" USB Vendor : %s (0x%04hX)\n",
|
avrdude_message(MSG_INFO, " USB Vendor : %s (0x%04hX)\n",
|
||||||
dfu->manf_str, (unsigned short) dfu->dev_desc.idVendor);
|
dfu->manf_str, (unsigned short) dfu->dev_desc.idVendor);
|
||||||
else
|
else
|
||||||
msg_info(" USB Vendor : 0x%04hX\n",
|
avrdude_message(MSG_INFO, " USB Vendor : 0x%04hX\n",
|
||||||
(unsigned short) dfu->dev_desc.idVendor);
|
(unsigned short) dfu->dev_desc.idVendor);
|
||||||
|
|
||||||
if (dfu->prod_str != NULL)
|
if (dfu->prod_str != NULL)
|
||||||
msg_info(" USB Product : %s (0x%04hX)\n",
|
avrdude_message(MSG_INFO, " USB Product : %s (0x%04hX)\n",
|
||||||
dfu->prod_str, (unsigned short) dfu->dev_desc.idProduct);
|
dfu->prod_str, (unsigned short) dfu->dev_desc.idProduct);
|
||||||
else
|
else
|
||||||
msg_info(" USB Product : 0x%04hX\n",
|
avrdude_message(MSG_INFO, " USB Product : 0x%04hX\n",
|
||||||
(unsigned short) dfu->dev_desc.idProduct);
|
(unsigned short) dfu->dev_desc.idProduct);
|
||||||
|
|
||||||
msg_info(" USB Release : %hu.%hu.%hu\n",
|
avrdude_message(MSG_INFO, " USB Release : %hu.%hu.%hu\n",
|
||||||
((unsigned short) dfu->dev_desc.bcdDevice >> 8) & 0xFF,
|
((unsigned short) dfu->dev_desc.bcdDevice >> 8) & 0xFF,
|
||||||
((unsigned short) dfu->dev_desc.bcdDevice >> 4) & 0xF,
|
((unsigned short) dfu->dev_desc.bcdDevice >> 4) & 0xF,
|
||||||
((unsigned short) dfu->dev_desc.bcdDevice >> 0) & 0xF);
|
((unsigned short) dfu->dev_desc.bcdDevice >> 0) & 0xF);
|
||||||
|
|
||||||
if (dfu->serno_str != NULL)
|
if (dfu->serno_str != NULL)
|
||||||
msg_info(" USB Serial No : %s\n", dfu->serno_str);
|
avrdude_message(MSG_INFO, " USB Serial No : %s\n", dfu->serno_str);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* INTERNAL FUNCTION DEFINITIONS
|
/* INTERNAL FUNCTION DEFINITIONS
|
||||||
|
@ -428,14 +451,15 @@ char * get_usb_string(usb_dev_handle * dev_handle, int index) {
|
||||||
result = usb_get_string_simple(dev_handle, index, buffer, sizeof(buffer)-1);
|
result = usb_get_string_simple(dev_handle, index, buffer, sizeof(buffer)-1);
|
||||||
|
|
||||||
if (result < 0) {
|
if (result < 0) {
|
||||||
pmsg_error("unable to read USB device string %d: %s\n", index, usb_strerror());
|
avrdude_message(MSG_INFO, "%s: Warning: Failed to read USB device string %d: %s\n",
|
||||||
|
progname, index, usb_strerror());
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
str = malloc(result+1);
|
str = malloc(result+1);
|
||||||
|
|
||||||
if (str == NULL) {
|
if (str == NULL) {
|
||||||
pmsg_error("out of memory allocating a string\n");
|
avrdude_message(MSG_INFO, "%s: Out of memory allocating a string\n", progname);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,7 +61,7 @@ struct dfu_dev
|
||||||
#else
|
#else
|
||||||
|
|
||||||
struct dfu_dev {
|
struct dfu_dev {
|
||||||
int dummy;
|
// empty
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -114,7 +114,7 @@ struct dfu_status {
|
||||||
|
|
||||||
// FUNCTIONS
|
// FUNCTIONS
|
||||||
|
|
||||||
extern struct dfu_dev *dfu_open(const char *port_spec);
|
extern struct dfu_dev * dfu_open(char *port_spec);
|
||||||
extern int dfu_init(struct dfu_dev *dfu,
|
extern int dfu_init(struct dfu_dev *dfu,
|
||||||
unsigned short vid, unsigned short pid);
|
unsigned short vid, unsigned short pid);
|
||||||
extern void dfu_close(struct dfu_dev *dfu);
|
extern void dfu_close(struct dfu_dev *dfu);
|
|
@ -1,5 +1,4 @@
|
||||||
avrdude.t2d/
|
.cvsignore
|
||||||
avrdude.t2p/
|
|
||||||
Makefile
|
Makefile
|
||||||
Makefile.in
|
Makefile.in
|
||||||
avrdude-html
|
avrdude-html
|
|
@ -40,7 +40,7 @@ all-local: info html ps pdf
|
||||||
html: avrdude-html/avrdude.html
|
html: avrdude-html/avrdude.html
|
||||||
|
|
||||||
avrdude-html/avrdude.html: $(srcdir)/$(info_TEXINFOS) $(GENERATED_TEXINFOS)
|
avrdude-html/avrdude.html: $(srcdir)/$(info_TEXINFOS) $(GENERATED_TEXINFOS)
|
||||||
texi2html --split=node --css-include=$(srcdir)/avrdude.css $(srcdir)/$(info_TEXINFOS)
|
texi2html -split_node $(srcdir)/$(info_TEXINFOS)
|
||||||
if [ -e ./avrdude.html -o -e ./avrdude_1.html ]; then \
|
if [ -e ./avrdude.html -o -e ./avrdude_1.html ]; then \
|
||||||
mkdir -p avrdude-html ; \
|
mkdir -p avrdude-html ; \
|
||||||
mv -f *.html avrdude-html ; \
|
mv -f *.html avrdude-html ; \
|
|
@ -0,0 +1,26 @@
|
||||||
|
|
||||||
|
- Man page needs updated for avr910 info.
|
||||||
|
|
||||||
|
- Website needs to link to docs:
|
||||||
|
http://savannah.nongnu.org/download/avrdude/doc/avrdude-html/
|
||||||
|
|
||||||
|
- Add "skip empty pages" optimization on avr910 paged write. The stk500 has
|
||||||
|
this optimization already.
|
||||||
|
|
||||||
|
- Fix "overfull \hbox" issues in building documentation.
|
||||||
|
|
||||||
|
- FIXME: term.c: terminal_get_input(): strip newlines in non-readline input
|
||||||
|
code.
|
||||||
|
|
||||||
|
- FIXME: avr910.c: avr910_cmd(): Insert version check here.
|
||||||
|
|
||||||
|
- FIXME: ser_posix.c: serial_close(): Should really restore the terminal to
|
||||||
|
original state here.
|
||||||
|
|
||||||
|
- FIXME: main.c, par.c: exitspecs don't work if RESET-pin is controlled over
|
||||||
|
PPICTRL.
|
||||||
|
|
||||||
|
- transfer ppi-speedtuning to the windows version (CAVEAT: This will make
|
||||||
|
programming too fast for chips with 500kHz clock)
|
||||||
|
|
||||||
|
- make SCK-period configurable for PPI-programmers
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -23,7 +23,6 @@
|
||||||
|
|
||||||
#include "ac_cfg.h"
|
#include "ac_cfg.h"
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
@ -31,6 +30,13 @@
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#if HAVE_STDINT_H
|
||||||
|
#include <stdint.h>
|
||||||
|
#elif HAVE_INTTYPES_H
|
||||||
|
#include <inttypes.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#include "avrdude.h"
|
#include "avrdude.h"
|
||||||
#include "libavrdude.h"
|
#include "libavrdude.h"
|
||||||
|
|
||||||
|
@ -136,23 +142,23 @@ enum flip1_mem_unit {
|
||||||
|
|
||||||
/* EXPORTED PROGRAMMER FUNCTION PROTOTYPES */
|
/* EXPORTED PROGRAMMER FUNCTION PROTOTYPES */
|
||||||
|
|
||||||
static int flip1_open(PROGRAMMER *pgm, const char *port_spec);
|
static int flip1_open(PROGRAMMER *pgm, char *port_spec);
|
||||||
static int flip1_initialize(const PROGRAMMER *pgm, const AVRPART *part);
|
static int flip1_initialize(PROGRAMMER* pgm, AVRPART *part);
|
||||||
static void flip1_close(PROGRAMMER* pgm);
|
static void flip1_close(PROGRAMMER* pgm);
|
||||||
static void flip1_enable(PROGRAMMER *pgm, const AVRPART *p);
|
static void flip1_enable(PROGRAMMER* pgm);
|
||||||
static void flip1_disable(const PROGRAMMER *pgm);
|
static void flip1_disable(PROGRAMMER* pgm);
|
||||||
static void flip1_display(const PROGRAMMER *pgm, const char *prefix);
|
static void flip1_display(PROGRAMMER* pgm, const char *prefix);
|
||||||
static int flip1_program_enable(const PROGRAMMER *pgm, const AVRPART *part);
|
static int flip1_program_enable(PROGRAMMER* pgm, AVRPART *part);
|
||||||
static int flip1_chip_erase(const PROGRAMMER *pgm, const AVRPART *part);
|
static int flip1_chip_erase(PROGRAMMER* pgm, AVRPART *part);
|
||||||
static int flip1_read_byte(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *mem,
|
static int flip1_read_byte(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
||||||
unsigned long addr, unsigned char *value);
|
unsigned long addr, unsigned char *value);
|
||||||
static int flip1_write_byte(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *mem,
|
static int flip1_write_byte(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
||||||
unsigned long addr, unsigned char value);
|
unsigned long addr, unsigned char value);
|
||||||
static int flip1_paged_load(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *mem,
|
static int flip1_paged_load(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
||||||
unsigned int page_size, unsigned int addr, unsigned int n_bytes);
|
unsigned int page_size, unsigned int addr, unsigned int n_bytes);
|
||||||
static int flip1_paged_write(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *mem,
|
static int flip1_paged_write(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
||||||
unsigned int page_size, unsigned int addr, unsigned int n_bytes);
|
unsigned int page_size, unsigned int addr, unsigned int n_bytes);
|
||||||
static int flip1_read_sig_bytes(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *mem);
|
static int flip1_read_sig_bytes(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem);
|
||||||
static void flip1_setup(PROGRAMMER * pgm);
|
static void flip1_setup(PROGRAMMER * pgm);
|
||||||
static void flip1_teardown(PROGRAMMER * pgm);
|
static void flip1_teardown(PROGRAMMER * pgm);
|
||||||
|
|
||||||
|
@ -162,7 +168,7 @@ static void flip1_teardown(PROGRAMMER * pgm);
|
||||||
|
|
||||||
static void flip1_show_info(struct flip1 *flip1);
|
static void flip1_show_info(struct flip1 *flip1);
|
||||||
|
|
||||||
static int flip1_read_memory(const PROGRAMMER *pgm,
|
static int flip1_read_memory(PROGRAMMER * pgm,
|
||||||
enum flip1_mem_unit mem_unit, uint32_t addr, void *ptr, int size);
|
enum flip1_mem_unit mem_unit, uint32_t addr, void *ptr, int size);
|
||||||
static int flip1_write_memory(struct dfu_dev *dfu,
|
static int flip1_write_memory(struct dfu_dev *dfu,
|
||||||
enum flip1_mem_unit mem_unit, uint32_t addr, const void *ptr, int size);
|
enum flip1_mem_unit mem_unit, uint32_t addr, const void *ptr, int size);
|
||||||
|
@ -176,7 +182,8 @@ static enum flip1_mem_unit flip1_mem_unit(const char *name);
|
||||||
|
|
||||||
/* THE INITPGM FUNCTION DEFINITIONS */
|
/* THE INITPGM FUNCTION DEFINITIONS */
|
||||||
|
|
||||||
void flip1_initpgm(PROGRAMMER *pgm) {
|
void flip1_initpgm(PROGRAMMER *pgm)
|
||||||
|
{
|
||||||
strcpy(pgm->type, "flip1");
|
strcpy(pgm->type, "flip1");
|
||||||
|
|
||||||
/* Mandatory Functions */
|
/* Mandatory Functions */
|
||||||
|
@ -200,12 +207,14 @@ void flip1_initpgm(PROGRAMMER *pgm) {
|
||||||
#ifdef HAVE_LIBUSB
|
#ifdef HAVE_LIBUSB
|
||||||
/* EXPORTED PROGRAMMER FUNCTION DEFINITIONS */
|
/* EXPORTED PROGRAMMER FUNCTION DEFINITIONS */
|
||||||
|
|
||||||
int flip1_open(PROGRAMMER *pgm, const char *port_spec) {
|
int flip1_open(PROGRAMMER *pgm, char *port_spec)
|
||||||
|
{
|
||||||
FLIP1(pgm)->dfu = dfu_open(port_spec);
|
FLIP1(pgm)->dfu = dfu_open(port_spec);
|
||||||
return (FLIP1(pgm)->dfu != NULL) ? 0 : -1;
|
return (FLIP1(pgm)->dfu != NULL) ? 0 : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int flip1_initialize(const PROGRAMMER *pgm, const AVRPART *part) {
|
int flip1_initialize(PROGRAMMER* pgm, AVRPART *part)
|
||||||
|
{
|
||||||
unsigned short vid, pid;
|
unsigned short vid, pid;
|
||||||
int result;
|
int result;
|
||||||
struct dfu_dev *dfu = FLIP1(pgm)->dfu;
|
struct dfu_dev *dfu = FLIP1(pgm)->dfu;
|
||||||
|
@ -234,13 +243,16 @@ int flip1_initialize(const PROGRAMMER *pgm, const AVRPART *part) {
|
||||||
if (usbpid) {
|
if (usbpid) {
|
||||||
pid = *(int *)(ldata(usbpid));
|
pid = *(int *)(ldata(usbpid));
|
||||||
if (lnext(usbpid))
|
if (lnext(usbpid))
|
||||||
pmsg_warning("using PID 0x%04x, ignoring remaining PIDs in list\n", pid);
|
avrdude_message(MSG_INFO, "%s: Warning: using PID 0x%04x, ignoring remaining PIDs in list\n",
|
||||||
|
progname, pid);
|
||||||
} else {
|
} else {
|
||||||
pid = part->usbpid;
|
pid = part->usbpid;
|
||||||
}
|
}
|
||||||
if (!ovsigck && (part->prog_modes & PM_PDI)) {
|
if (!ovsigck && (part->flags & AVRPART_HAS_PDI)) {
|
||||||
pmsg_error("flip1 (FLIP protocol version 1) is for AT90USB* and ATmega*U* devices\n");
|
avrdude_message(MSG_INFO, "%s: \"flip1\" (FLIP protocol version 1) is for AT90USB* and ATmega*U* devices.\n"
|
||||||
imsg_error("for Xmega devices, use flip2 (or use -F to bypass this check)\n");
|
"%s For Xmega devices, use \"flip2\".\n"
|
||||||
|
"%s (Use -F to bypass this check.)\n",
|
||||||
|
progname, progbuf, progbuf);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -252,25 +264,32 @@ int flip1_initialize(const PROGRAMMER *pgm, const AVRPART *part) {
|
||||||
/* Check if descriptor values are what we expect. */
|
/* Check if descriptor values are what we expect. */
|
||||||
|
|
||||||
if (dfu->dev_desc.idVendor != vid)
|
if (dfu->dev_desc.idVendor != vid)
|
||||||
pmsg_warning("USB idVendor = 0x%04X (expected 0x%04X)\n", dfu->dev_desc.idVendor, vid);
|
avrdude_message(MSG_INFO, "%s: Warning: USB idVendor = 0x%04X (expected 0x%04X)\n",
|
||||||
|
progname, dfu->dev_desc.idVendor, vid);
|
||||||
|
|
||||||
if (pid != 0 && dfu->dev_desc.idProduct != pid)
|
if (pid != 0 && dfu->dev_desc.idProduct != pid)
|
||||||
pmsg_warning("USB idProduct = 0x%04X (expected 0x%04X)\n", dfu->dev_desc.idProduct, pid);
|
avrdude_message(MSG_INFO, "%s: Warning: USB idProduct = 0x%04X (expected 0x%04X)\n",
|
||||||
|
progname, dfu->dev_desc.idProduct, pid);
|
||||||
|
|
||||||
if (dfu->dev_desc.bNumConfigurations != 1)
|
if (dfu->dev_desc.bNumConfigurations != 1)
|
||||||
pmsg_warning("USB bNumConfigurations = %d (expected 1)\n", (int) dfu->dev_desc.bNumConfigurations);
|
avrdude_message(MSG_INFO, "%s: Warning: USB bNumConfigurations = %d (expected 1)\n",
|
||||||
|
progname, (int) dfu->dev_desc.bNumConfigurations);
|
||||||
|
|
||||||
if (dfu->conf_desc.bNumInterfaces != 1)
|
if (dfu->conf_desc.bNumInterfaces != 1)
|
||||||
pmsg_warning("USB bNumInterfaces = %d (expected 1)\n", (int) dfu->conf_desc.bNumInterfaces);
|
avrdude_message(MSG_INFO, "%s: Warning: USB bNumInterfaces = %d (expected 1)\n",
|
||||||
|
progname, (int) dfu->conf_desc.bNumInterfaces);
|
||||||
|
|
||||||
if (dfu->dev_desc.bDeviceClass != 254)
|
if (dfu->dev_desc.bDeviceClass != 254)
|
||||||
pmsg_warning("USB bDeviceClass = %d (expected 254)\n", (int) dfu->dev_desc.bDeviceClass);
|
avrdude_message(MSG_INFO, "%s: Warning: USB bDeviceClass = %d (expected 254)\n",
|
||||||
|
progname, (int) dfu->dev_desc.bDeviceClass);
|
||||||
|
|
||||||
if (dfu->dev_desc.bDeviceSubClass != 1)
|
if (dfu->dev_desc.bDeviceSubClass != 1)
|
||||||
pmsg_warning("USB bDeviceSubClass = %d (expected 1)\n", (int) dfu->dev_desc.bDeviceSubClass);
|
avrdude_message(MSG_INFO, "%s: Warning: USB bDeviceSubClass = %d (expected 1)\n",
|
||||||
|
progname, (int) dfu->dev_desc.bDeviceSubClass);
|
||||||
|
|
||||||
if (dfu->dev_desc.bDeviceProtocol != 0)
|
if (dfu->dev_desc.bDeviceProtocol != 0)
|
||||||
pmsg_warning("USB bDeviceProtocol = %d (expected 0)\n", (int) dfu->dev_desc.bDeviceProtocol);
|
avrdude_message(MSG_INFO, "%s: Warning: USB bDeviceProtocol = %d (expected 0)\n",
|
||||||
|
progname, (int) dfu->dev_desc.bDeviceProtocol);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* doc7618 claims an interface class of FEh and a subclas 01h.
|
* doc7618 claims an interface class of FEh and a subclas 01h.
|
||||||
|
@ -280,17 +299,21 @@ int flip1_initialize(const PROGRAMMER *pgm, const AVRPART *part) {
|
||||||
*/
|
*/
|
||||||
if (0) {
|
if (0) {
|
||||||
if (dfu->intf_desc.bInterfaceClass != 254)
|
if (dfu->intf_desc.bInterfaceClass != 254)
|
||||||
pmsg_warning("USB bInterfaceClass = %d (expected 254)\n", (int) dfu->intf_desc.bInterfaceClass);
|
avrdude_message(MSG_INFO, "%s: Warning: USB bInterfaceClass = %d (expected 254)\n",
|
||||||
|
progname, (int) dfu->intf_desc.bInterfaceClass);
|
||||||
|
|
||||||
if (dfu->intf_desc.bInterfaceSubClass != 1)
|
if (dfu->intf_desc.bInterfaceSubClass != 1)
|
||||||
pmsg_warning("USB bInterfaceSubClass = %d (expected 1)\n", (int) dfu->intf_desc.bInterfaceSubClass);
|
avrdude_message(MSG_INFO, "%s: Warning: USB bInterfaceSubClass = %d (expected 1)\n",
|
||||||
|
progname, (int) dfu->intf_desc.bInterfaceSubClass);
|
||||||
|
|
||||||
if (dfu->intf_desc.bInterfaceProtocol != 0)
|
if (dfu->intf_desc.bInterfaceProtocol != 0)
|
||||||
pmsg_warning("USB bInterfaceSubClass = %d (expected 0)\n", (int) dfu->intf_desc.bInterfaceProtocol);
|
avrdude_message(MSG_INFO, "%s: Warning: USB bInterfaceSubClass = %d (expected 0)\n",
|
||||||
|
progname, (int) dfu->intf_desc.bInterfaceProtocol);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dfu->dev_desc.bMaxPacketSize0 != 32)
|
if (dfu->dev_desc.bMaxPacketSize0 != 32)
|
||||||
pmsg_warning("bMaxPacketSize0 (%d) != 32, things might go wrong\n", dfu->dev_desc.bMaxPacketSize0);
|
avrdude_message(MSG_INFO, "%s: Warning: bMaxPacketSize0 (%d) != 32, things might go wrong\n",
|
||||||
|
progname, dfu->dev_desc.bMaxPacketSize0);
|
||||||
|
|
||||||
if (verbose)
|
if (verbose)
|
||||||
flip1_show_info(FLIP1(pgm));
|
flip1_show_info(FLIP1(pgm));
|
||||||
|
@ -305,26 +328,31 @@ flip1_initialize_fail:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void flip1_close(PROGRAMMER *pgm) {
|
void flip1_close(PROGRAMMER* pgm)
|
||||||
|
{
|
||||||
if (FLIP1(pgm)->dfu != NULL) {
|
if (FLIP1(pgm)->dfu != NULL) {
|
||||||
dfu_close(FLIP1(pgm)->dfu);
|
dfu_close(FLIP1(pgm)->dfu);
|
||||||
FLIP1(pgm)->dfu = NULL;
|
FLIP1(pgm)->dfu = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void flip1_enable(PROGRAMMER *pgm, const AVRPART *p) {
|
void flip1_enable(PROGRAMMER* pgm)
|
||||||
|
{
|
||||||
/* Nothing to do. */
|
/* Nothing to do. */
|
||||||
}
|
}
|
||||||
|
|
||||||
void flip1_disable(const PROGRAMMER *pgm) {
|
void flip1_disable(PROGRAMMER* pgm)
|
||||||
|
{
|
||||||
/* Nothing to do. */
|
/* Nothing to do. */
|
||||||
}
|
}
|
||||||
|
|
||||||
void flip1_display(const PROGRAMMER *pgm, const char *prefix) {
|
void flip1_display(PROGRAMMER* pgm, const char *prefix)
|
||||||
|
{
|
||||||
/* Nothing to do. */
|
/* Nothing to do. */
|
||||||
}
|
}
|
||||||
|
|
||||||
int flip1_program_enable(const PROGRAMMER *pgm, const AVRPART *part) {
|
int flip1_program_enable(PROGRAMMER* pgm, AVRPART *part)
|
||||||
|
{
|
||||||
/* I couldn't find anything that uses this function, although it is marked
|
/* I couldn't find anything that uses this function, although it is marked
|
||||||
* as "mandatory" in pgm.c. In case anyone does use it, we'll report an
|
* as "mandatory" in pgm.c. In case anyone does use it, we'll report an
|
||||||
* error if we failed to initialize.
|
* error if we failed to initialize.
|
||||||
|
@ -333,13 +361,14 @@ int flip1_program_enable(const PROGRAMMER *pgm, const AVRPART *part) {
|
||||||
return (FLIP1(pgm)->dfu != NULL) ? 0 : -1;
|
return (FLIP1(pgm)->dfu != NULL) ? 0 : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int flip1_chip_erase(const PROGRAMMER *pgm, const AVRPART *part) {
|
int flip1_chip_erase(PROGRAMMER* pgm, AVRPART *part)
|
||||||
|
{
|
||||||
struct dfu_status status;
|
struct dfu_status status;
|
||||||
int cmd_result = 0;
|
int cmd_result = 0;
|
||||||
int aux_result;
|
int aux_result;
|
||||||
unsigned int default_timeout = FLIP1(pgm)->dfu->timeout;
|
unsigned int default_timeout = FLIP1(pgm)->dfu->timeout;
|
||||||
|
|
||||||
pmsg_notice2("flip_chip_erase()\n");
|
avrdude_message(MSG_NOTICE2, "%s: flip_chip_erase()\n", progname);
|
||||||
|
|
||||||
struct flip1_cmd cmd = {
|
struct flip1_cmd cmd = {
|
||||||
FLIP1_CMD_WRITE_COMMAND, { 0, 0xff }
|
FLIP1_CMD_WRITE_COMMAND, { 0, 0xff }
|
||||||
|
@ -354,7 +383,8 @@ int flip1_chip_erase(const PROGRAMMER *pgm, const AVRPART *part) {
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (status.bStatus != DFU_STATUS_OK) {
|
if (status.bStatus != DFU_STATUS_OK) {
|
||||||
pmsg_error("unable to send chip erase command: %s\n", flip1_status_str(&status));
|
avrdude_message(MSG_INFO, "%s: failed to send chip erase command: %s\n",
|
||||||
|
progname, flip1_status_str(&status));
|
||||||
if (status.bState == STATE_dfuERROR)
|
if (status.bState == STATE_dfuERROR)
|
||||||
dfu_clrstatus(FLIP1(pgm)->dfu);
|
dfu_clrstatus(FLIP1(pgm)->dfu);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -363,7 +393,7 @@ int flip1_chip_erase(const PROGRAMMER *pgm, const AVRPART *part) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int flip1_read_byte(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *mem,
|
int flip1_read_byte(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
||||||
unsigned long addr, unsigned char *value)
|
unsigned long addr, unsigned char *value)
|
||||||
{
|
{
|
||||||
enum flip1_mem_unit mem_unit;
|
enum flip1_mem_unit mem_unit;
|
||||||
|
@ -371,11 +401,12 @@ int flip1_read_byte(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *me
|
||||||
if (FLIP1(pgm)->dfu == NULL)
|
if (FLIP1(pgm)->dfu == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (strcmp(mem->desc, "signature") == 0) {
|
if (strcasecmp(mem->desc, "signature") == 0) {
|
||||||
if (flip1_read_sig_bytes(pgm, part, mem) < 0)
|
if (flip1_read_sig_bytes(pgm, part, mem) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
if (addr >= mem->size) {
|
if (addr > mem->size) {
|
||||||
pmsg_error("signature address %lu out of range [0, %d]\n", addr, mem->size-1);
|
avrdude_message(MSG_INFO, "%s: flip1_read_byte(signature): address %lu out of range\n",
|
||||||
|
progname, addr);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
*value = mem->buf[addr];
|
*value = mem->buf[addr];
|
||||||
|
@ -385,7 +416,10 @@ int flip1_read_byte(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *me
|
||||||
mem_unit = flip1_mem_unit(mem->desc);
|
mem_unit = flip1_mem_unit(mem->desc);
|
||||||
|
|
||||||
if (mem_unit == FLIP1_MEM_UNIT_UNKNOWN) {
|
if (mem_unit == FLIP1_MEM_UNIT_UNKNOWN) {
|
||||||
pmsg_error("%s memory not accessible using FLIP\n", mem->desc);
|
avrdude_message(MSG_INFO, "%s: Error: "
|
||||||
|
"\"%s\" memory not accessible using FLIP",
|
||||||
|
progname, mem->desc);
|
||||||
|
avrdude_message(MSG_INFO, "\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -396,7 +430,7 @@ int flip1_read_byte(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *me
|
||||||
return flip1_read_memory(pgm, mem_unit, addr, value, 1);
|
return flip1_read_memory(pgm, mem_unit, addr, value, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int flip1_write_byte(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *mem,
|
int flip1_write_byte(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
||||||
unsigned long addr, unsigned char value)
|
unsigned long addr, unsigned char value)
|
||||||
{
|
{
|
||||||
enum flip1_mem_unit mem_unit;
|
enum flip1_mem_unit mem_unit;
|
||||||
|
@ -407,14 +441,17 @@ int flip1_write_byte(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *m
|
||||||
mem_unit = flip1_mem_unit(mem->desc);
|
mem_unit = flip1_mem_unit(mem->desc);
|
||||||
|
|
||||||
if (mem_unit == FLIP1_MEM_UNIT_UNKNOWN) {
|
if (mem_unit == FLIP1_MEM_UNIT_UNKNOWN) {
|
||||||
pmsg_error("%s memory not accessible using FLIP\n", mem->desc);
|
avrdude_message(MSG_INFO, "%s: Error: "
|
||||||
|
"\"%s\" memory not accessible using FLIP",
|
||||||
|
progname, mem->desc);
|
||||||
|
avrdude_message(MSG_INFO, "\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return flip1_write_memory(FLIP1(pgm)->dfu, mem_unit, addr, &value, 1);
|
return flip1_write_memory(FLIP1(pgm)->dfu, mem_unit, addr, &value, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int flip1_paged_load(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *mem,
|
int flip1_paged_load(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
||||||
unsigned int page_size, unsigned int addr, unsigned int n_bytes)
|
unsigned int page_size, unsigned int addr, unsigned int n_bytes)
|
||||||
{
|
{
|
||||||
enum flip1_mem_unit mem_unit;
|
enum flip1_mem_unit mem_unit;
|
||||||
|
@ -425,7 +462,10 @@ int flip1_paged_load(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *m
|
||||||
mem_unit = flip1_mem_unit(mem->desc);
|
mem_unit = flip1_mem_unit(mem->desc);
|
||||||
|
|
||||||
if (mem_unit == FLIP1_MEM_UNIT_UNKNOWN) {
|
if (mem_unit == FLIP1_MEM_UNIT_UNKNOWN) {
|
||||||
pmsg_error("%s memory not accessible using FLIP\n", mem->desc);
|
avrdude_message(MSG_INFO, "%s: Error: "
|
||||||
|
"\"%s\" memory not accessible using FLIP",
|
||||||
|
progname, mem->desc);
|
||||||
|
avrdude_message(MSG_INFO, "\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -436,7 +476,7 @@ int flip1_paged_load(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *m
|
||||||
return flip1_read_memory(pgm, mem_unit, addr, mem->buf + addr, n_bytes);
|
return flip1_read_memory(pgm, mem_unit, addr, mem->buf + addr, n_bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
int flip1_paged_write(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *mem,
|
int flip1_paged_write(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
||||||
unsigned int page_size, unsigned int addr, unsigned int n_bytes)
|
unsigned int page_size, unsigned int addr, unsigned int n_bytes)
|
||||||
{
|
{
|
||||||
enum flip1_mem_unit mem_unit;
|
enum flip1_mem_unit mem_unit;
|
||||||
|
@ -448,13 +488,17 @@ int flip1_paged_write(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *
|
||||||
mem_unit = flip1_mem_unit(mem->desc);
|
mem_unit = flip1_mem_unit(mem->desc);
|
||||||
|
|
||||||
if (mem_unit == FLIP1_MEM_UNIT_UNKNOWN) {
|
if (mem_unit == FLIP1_MEM_UNIT_UNKNOWN) {
|
||||||
pmsg_error("%s memory not accessible using FLIP\n", mem->desc);
|
avrdude_message(MSG_INFO, "%s: Error: "
|
||||||
|
"\"%s\" memory not accessible using FLIP",
|
||||||
|
progname, mem->desc);
|
||||||
|
avrdude_message(MSG_INFO, "\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (n_bytes > INT_MAX) {
|
if (n_bytes > INT_MAX) {
|
||||||
/* This should never happen, unless the int type is only 16 bits. */
|
/* This should never happen, unless the int type is only 16 bits. */
|
||||||
pmsg_error("attempting to read more than %d bytes\n", INT_MAX);
|
avrdude_message(MSG_INFO, "%s: Error: Attempting to read more than %d bytes\n",
|
||||||
|
progname, INT_MAX);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -464,14 +508,16 @@ int flip1_paged_write(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *
|
||||||
return (result == 0) ? n_bytes : -1;
|
return (result == 0) ? n_bytes : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int flip1_read_sig_bytes(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *mem) {
|
int flip1_read_sig_bytes(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem)
|
||||||
pmsg_notice2("flip1_read_sig_bytes(): ");
|
{
|
||||||
|
avrdude_message(MSG_NOTICE2, "%s: flip1_read_sig_bytes(): ", progname);
|
||||||
|
|
||||||
if (FLIP1(pgm)->dfu == NULL)
|
if (FLIP1(pgm)->dfu == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (mem->size < sizeof(FLIP1(pgm)->part_sig)) {
|
if (mem->size < sizeof(FLIP1(pgm)->part_sig)) {
|
||||||
pmsg_error("signature read must be at least %u bytes\n", (unsigned int) sizeof(FLIP1(pgm)->part_sig));
|
avrdude_message(MSG_INFO, "%s: Error: Signature read must be at least %u bytes\n",
|
||||||
|
progname, (unsigned int) sizeof(FLIP1(pgm)->part_sig));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -488,7 +534,7 @@ int flip1_read_sig_bytes(const PROGRAMMER *pgm, const AVRPART *part, const AVRME
|
||||||
FLIP1_CMD_READ_COMMAND, FLIP1_READ_FAMILY_CODE
|
FLIP1_CMD_READ_COMMAND, FLIP1_READ_FAMILY_CODE
|
||||||
};
|
};
|
||||||
|
|
||||||
msg_notice2("from device\n");
|
avrdude_message(MSG_NOTICE2, "from device\n");
|
||||||
|
|
||||||
for (i = 0; i < 3; i++)
|
for (i = 0; i < 3; i++)
|
||||||
{
|
{
|
||||||
|
@ -505,7 +551,8 @@ int flip1_read_sig_bytes(const PROGRAMMER *pgm, const AVRPART *part, const AVRME
|
||||||
|
|
||||||
if (status.bStatus != DFU_STATUS_OK)
|
if (status.bStatus != DFU_STATUS_OK)
|
||||||
{
|
{
|
||||||
pmsg_error("unable to send cmd for signature byte %d: %s\n", i, flip1_status_str(&status));
|
avrdude_message(MSG_INFO, "%s: failed to send cmd for signature byte %d: %s\n",
|
||||||
|
progname, i, flip1_status_str(&status));
|
||||||
if (status.bState == STATE_dfuERROR)
|
if (status.bState == STATE_dfuERROR)
|
||||||
dfu_clrstatus(FLIP1(pgm)->dfu);
|
dfu_clrstatus(FLIP1(pgm)->dfu);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -519,7 +566,8 @@ int flip1_read_sig_bytes(const PROGRAMMER *pgm, const AVRPART *part, const AVRME
|
||||||
|
|
||||||
if (status.bStatus != DFU_STATUS_OK)
|
if (status.bStatus != DFU_STATUS_OK)
|
||||||
{
|
{
|
||||||
pmsg_error("unable to read signature byte %d: %s\n", i, flip1_status_str(&status));
|
avrdude_message(MSG_INFO, "%s: failed to read signature byte %d: %s\n",
|
||||||
|
progname, i, flip1_status_str(&status));
|
||||||
if (status.bState == STATE_dfuERROR)
|
if (status.bState == STATE_dfuERROR)
|
||||||
dfu_clrstatus(FLIP1(pgm)->dfu);
|
dfu_clrstatus(FLIP1(pgm)->dfu);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -528,7 +576,7 @@ int flip1_read_sig_bytes(const PROGRAMMER *pgm, const AVRPART *part, const AVRME
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
msg_notice2("cached\n");
|
avrdude_message(MSG_NOTICE2, "cached\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(mem->buf, FLIP1(pgm)->part_sig, sizeof(FLIP1(pgm)->part_sig));
|
memcpy(mem->buf, FLIP1(pgm)->part_sig, sizeof(FLIP1(pgm)->part_sig));
|
||||||
|
@ -541,7 +589,8 @@ void flip1_setup(PROGRAMMER * pgm)
|
||||||
pgm->cookie = calloc(1, sizeof(struct flip1));
|
pgm->cookie = calloc(1, sizeof(struct flip1));
|
||||||
|
|
||||||
if (pgm->cookie == NULL) {
|
if (pgm->cookie == NULL) {
|
||||||
pmsg_error("out of memory allocating private data structure\n");
|
avrdude_message(MSG_INFO, "%s: Out of memory allocating private data structure\n",
|
||||||
|
progname);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -558,10 +607,11 @@ void flip1_teardown(PROGRAMMER * pgm)
|
||||||
void flip1_show_info(struct flip1 *flip1)
|
void flip1_show_info(struct flip1 *flip1)
|
||||||
{
|
{
|
||||||
dfu_show_info(flip1->dfu);
|
dfu_show_info(flip1->dfu);
|
||||||
msg_info(" USB max packet size : %hu\n", (unsigned short) flip1->dfu->dev_desc.bMaxPacketSize0);
|
avrdude_message(MSG_INFO, " USB max packet size : %hu\n",
|
||||||
|
(unsigned short) flip1->dfu->dev_desc.bMaxPacketSize0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int flip1_read_memory(const PROGRAMMER *pgm,
|
int flip1_read_memory(PROGRAMMER * pgm,
|
||||||
enum flip1_mem_unit mem_unit, uint32_t addr, void *ptr, int size)
|
enum flip1_mem_unit mem_unit, uint32_t addr, void *ptr, int size)
|
||||||
{
|
{
|
||||||
struct dfu_dev *dfu = FLIP1(pgm)->dfu;
|
struct dfu_dev *dfu = FLIP1(pgm)->dfu;
|
||||||
|
@ -575,7 +625,8 @@ int flip1_read_memory(const PROGRAMMER *pgm,
|
||||||
unsigned int default_timeout = dfu->timeout;
|
unsigned int default_timeout = dfu->timeout;
|
||||||
|
|
||||||
|
|
||||||
pmsg_notice2("flip_read_memory(%s, 0x%04x, %d)\n", flip1_mem_unit_str(mem_unit), addr, size);
|
avrdude_message(MSG_NOTICE2, "%s: flip_read_memory(%s, 0x%04x, %d)\n",
|
||||||
|
progname, flip1_mem_unit_str(mem_unit), addr, size);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* As this function is called once per page, no need to handle 64
|
* As this function is called once per page, no need to handle 64
|
||||||
|
@ -605,8 +656,9 @@ int flip1_read_memory(const PROGRAMMER *pgm,
|
||||||
|
|
||||||
if (status.bStatus != DFU_STATUS_OK)
|
if (status.bStatus != DFU_STATUS_OK)
|
||||||
{
|
{
|
||||||
pmsg_error("unable to read %u bytes of %s memory @%u: %s\n", size,
|
avrdude_message(MSG_INFO, "%s: failed to read %u bytes of %s memory @%u: %s\n",
|
||||||
flip1_mem_unit_str(mem_unit), addr, flip1_status_str(&status));
|
progname, size, flip1_mem_unit_str(mem_unit), addr,
|
||||||
|
flip1_status_str(&status));
|
||||||
if (status.bState == STATE_dfuERROR)
|
if (status.bState == STATE_dfuERROR)
|
||||||
dfu_clrstatus(dfu);
|
dfu_clrstatus(dfu);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -617,14 +669,13 @@ int flip1_read_memory(const PROGRAMMER *pgm,
|
||||||
|
|
||||||
if (cmd_result < 0 && aux_result == 0 &&
|
if (cmd_result < 0 && aux_result == 0 &&
|
||||||
status.bStatus == DFU_STATUS_ERR_WRITE) {
|
status.bStatus == DFU_STATUS_ERR_WRITE) {
|
||||||
if (FLIP1(pgm)->security_mode_flag == 0) {
|
if (FLIP1(pgm)->security_mode_flag == 0)
|
||||||
msg_error("\n");
|
avrdude_message(MSG_INFO, "\n%s:\n"
|
||||||
pmsg_error("\n");
|
"%s***********************************************************************\n"
|
||||||
imsg_error("***********************************************************************\n");
|
"%sMaybe the device is in ``security mode´´, and needs a chip erase first?\n"
|
||||||
imsg_error("Maybe the device is in ``security mode´´, and needs a chip erase first?\n");
|
"%s***********************************************************************\n"
|
||||||
imsg_error("***********************************************************************\n");
|
"\n",
|
||||||
msg_error("\n");
|
progname, progbuf, progbuf, progbuf);
|
||||||
}
|
|
||||||
FLIP1(pgm)->security_mode_flag = 1;
|
FLIP1(pgm)->security_mode_flag = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -633,8 +684,9 @@ int flip1_read_memory(const PROGRAMMER *pgm,
|
||||||
|
|
||||||
if (status.bStatus != DFU_STATUS_OK)
|
if (status.bStatus != DFU_STATUS_OK)
|
||||||
{
|
{
|
||||||
pmsg_error("unable to read %u bytes of %s memory @%u: %s\n", size,
|
avrdude_message(MSG_INFO, "%s: failed to read %u bytes of %s memory @%u: %s\n",
|
||||||
flip1_mem_unit_str(mem_unit), addr, flip1_status_str(&status));
|
progname, size, flip1_mem_unit_str(mem_unit), addr,
|
||||||
|
flip1_status_str(&status));
|
||||||
if (status.bState == STATE_dfuERROR)
|
if (status.bState == STATE_dfuERROR)
|
||||||
dfu_clrstatus(dfu);
|
dfu_clrstatus(dfu);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -666,14 +718,14 @@ int flip1_write_memory(struct dfu_dev *dfu,
|
||||||
unsigned int default_timeout = dfu->timeout;
|
unsigned int default_timeout = dfu->timeout;
|
||||||
unsigned char *buf;
|
unsigned char *buf;
|
||||||
|
|
||||||
pmsg_notice2("flip_write_memory(%s, 0x%04x, %d)\n",
|
avrdude_message(MSG_NOTICE2, "%s: flip_write_memory(%s, 0x%04x, %d)\n",
|
||||||
flip1_mem_unit_str(mem_unit), addr, size);
|
progname, flip1_mem_unit_str(mem_unit), addr, size);
|
||||||
|
|
||||||
if (size < 32) {
|
if (size < 32) {
|
||||||
/* presumably single-byte updates; must be padded to USB endpoint size */
|
/* presumably single-byte updates; must be padded to USB endpoint size */
|
||||||
if ((addr + size - 1) / 32 != addr / 32) {
|
if ((addr + size - 1) / 32 != addr / 32) {
|
||||||
pmsg_error("begin 0x%x and end 0x%x not within same 32-byte block\n",
|
avrdude_message(MSG_INFO, "%s: flip_write_memory(): begin (0x%x) and end (0x%x) not within same 32-byte block\n",
|
||||||
addr, addr + size - 1);
|
progname, addr, addr + size - 1);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
write_size = 32;
|
write_size = 32;
|
||||||
|
@ -684,7 +736,7 @@ int flip1_write_memory(struct dfu_dev *dfu,
|
||||||
if ((buf = malloc(sizeof(struct flip1_cmd_header) +
|
if ((buf = malloc(sizeof(struct flip1_cmd_header) +
|
||||||
write_size +
|
write_size +
|
||||||
sizeof(struct flip1_prog_footer))) == 0) {
|
sizeof(struct flip1_prog_footer))) == 0) {
|
||||||
pmsg_error("out of memory\n");
|
avrdude_message(MSG_INFO, "%s: Out of memory\n", progname);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -733,8 +785,9 @@ int flip1_write_memory(struct dfu_dev *dfu,
|
||||||
|
|
||||||
if (status.bStatus != DFU_STATUS_OK)
|
if (status.bStatus != DFU_STATUS_OK)
|
||||||
{
|
{
|
||||||
pmsg_error("unable to write %u bytes of %s memory @%u: %s\n", size,
|
avrdude_message(MSG_INFO, "%s: failed to write %u bytes of %s memory @%u: %s\n",
|
||||||
flip1_mem_unit_str(mem_unit), addr, flip1_status_str(&status));
|
progname, size, flip1_mem_unit_str(mem_unit), addr,
|
||||||
|
flip1_status_str(&status));
|
||||||
if (status.bState == STATE_dfuERROR)
|
if (status.bState == STATE_dfuERROR)
|
||||||
dfu_clrstatus(dfu);
|
dfu_clrstatus(dfu);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -763,7 +816,8 @@ int flip1_set_mem_page(struct dfu_dev *dfu,
|
||||||
|
|
||||||
if (status.bStatus != DFU_STATUS_OK)
|
if (status.bStatus != DFU_STATUS_OK)
|
||||||
{
|
{
|
||||||
pmsg_error("unable to set memory page: %s\n", flip1_status_str(&status));
|
avrdude_message(MSG_INFO, "%s: failed to set memory page: %s\n",
|
||||||
|
progname, flip1_status_str(&status));
|
||||||
if (status.bState == STATE_dfuERROR)
|
if (status.bState == STATE_dfuERROR)
|
||||||
dfu_clrstatus(dfu);
|
dfu_clrstatus(dfu);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -808,20 +862,23 @@ const char * flip1_mem_unit_str(enum flip1_mem_unit mem_unit)
|
||||||
}
|
}
|
||||||
|
|
||||||
enum flip1_mem_unit flip1_mem_unit(const char *name) {
|
enum flip1_mem_unit flip1_mem_unit(const char *name) {
|
||||||
if (strcmp(name, "flash") == 0)
|
if (strcasecmp(name, "flash") == 0)
|
||||||
return FLIP1_MEM_UNIT_FLASH;
|
return FLIP1_MEM_UNIT_FLASH;
|
||||||
if (strcmp(name, "eeprom") == 0)
|
if (strcasecmp(name, "eeprom") == 0)
|
||||||
return FLIP1_MEM_UNIT_EEPROM;
|
return FLIP1_MEM_UNIT_EEPROM;
|
||||||
return FLIP1_MEM_UNIT_UNKNOWN;
|
return FLIP1_MEM_UNIT_UNKNOWN;
|
||||||
}
|
}
|
||||||
#else /* HAVE_LIBUSB */
|
#else /* HAVE_LIBUSB */
|
||||||
// Dummy functions
|
// Dummy functions
|
||||||
int flip1_open(PROGRAMMER *pgm, const char *port_spec) {
|
int flip1_open(PROGRAMMER *pgm, char *port_spec)
|
||||||
pmsg_error("no USB support compiled for avrdude\n");
|
{
|
||||||
|
fprintf(stderr, "%s: Error: No USB support in this compile of avrdude\n",
|
||||||
|
progname);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int flip1_initialize(const PROGRAMMER *pgm, const AVRPART *part) {
|
int flip1_initialize(PROGRAMMER* pgm, AVRPART *part)
|
||||||
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -829,48 +886,54 @@ void flip1_close(PROGRAMMER* pgm)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void flip1_enable(PROGRAMMER *pgm, const AVRPART *p) {
|
void flip1_enable(PROGRAMMER* pgm)
|
||||||
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void flip1_disable(const PROGRAMMER *pgm) {
|
void flip1_disable(PROGRAMMER* pgm)
|
||||||
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void flip1_display(const PROGRAMMER *pgm, const char *prefix) {
|
void flip1_display(PROGRAMMER* pgm, const char *prefix)
|
||||||
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
int flip1_program_enable(const PROGRAMMER *pgm, const AVRPART *part) {
|
int flip1_program_enable(PROGRAMMER* pgm, AVRPART *part)
|
||||||
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int flip1_chip_erase(const PROGRAMMER *pgm, const AVRPART *part) {
|
int flip1_chip_erase(PROGRAMMER* pgm, AVRPART *part)
|
||||||
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int flip1_read_byte(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *mem,
|
int flip1_read_byte(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
||||||
unsigned long addr, unsigned char *value)
|
unsigned long addr, unsigned char *value)
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int flip1_write_byte(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *mem,
|
int flip1_write_byte(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
||||||
unsigned long addr, unsigned char value)
|
unsigned long addr, unsigned char value)
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int flip1_paged_load(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *mem,
|
int flip1_paged_load(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
||||||
unsigned int page_size, unsigned int addr, unsigned int n_bytes)
|
unsigned int page_size, unsigned int addr, unsigned int n_bytes)
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int flip1_paged_write(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *mem,
|
int flip1_paged_write(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
||||||
unsigned int page_size, unsigned int addr, unsigned int n_bytes)
|
unsigned int page_size, unsigned int addr, unsigned int n_bytes)
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int flip1_read_sig_bytes(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *mem) {
|
int flip1_read_sig_bytes(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem)
|
||||||
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,7 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern const char flip1_desc[];
|
extern const char flip1_desc[];
|
||||||
extern void flip1_initpgm(PROGRAMMER *pgm);
|
extern void flip1_initpgm(PROGRAMMER * pgm);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
|
@ -20,7 +20,6 @@
|
||||||
|
|
||||||
#include "ac_cfg.h"
|
#include "ac_cfg.h"
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
@ -28,6 +27,12 @@
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#if HAVE_STDINT_H
|
||||||
|
#include <stdint.h>
|
||||||
|
#elif HAVE_INTTYPES_H
|
||||||
|
#include <inttypes.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "avrdude.h"
|
#include "avrdude.h"
|
||||||
#include "libavrdude.h"
|
#include "libavrdude.h"
|
||||||
|
|
||||||
|
@ -121,33 +126,31 @@ enum flip2_mem_unit {
|
||||||
FLIP2_MEM_UNIT_EXT_MEM_DF = 0x10
|
FLIP2_MEM_UNIT_EXT_MEM_DF = 0x10
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef HAVE_LIBUSB
|
|
||||||
|
|
||||||
/* EXPORTED PROGRAMMER FUNCTION PROTOTYPES */
|
/* EXPORTED PROGRAMMER FUNCTION PROTOTYPES */
|
||||||
|
|
||||||
static int flip2_open(PROGRAMMER *pgm, const char *port_spec);
|
static int flip2_open(PROGRAMMER *pgm, char *port_spec);
|
||||||
static int flip2_initialize(const PROGRAMMER *pgm, const AVRPART *part);
|
static int flip2_initialize(PROGRAMMER* pgm, AVRPART *part);
|
||||||
static void flip2_close(PROGRAMMER* pgm);
|
static void flip2_close(PROGRAMMER* pgm);
|
||||||
static void flip2_enable(PROGRAMMER *pgm, const AVRPART *p);
|
static void flip2_enable(PROGRAMMER* pgm);
|
||||||
static void flip2_disable(const PROGRAMMER *pgm);
|
static void flip2_disable(PROGRAMMER* pgm);
|
||||||
static void flip2_display(const PROGRAMMER *pgm, const char *prefix);
|
static void flip2_display(PROGRAMMER* pgm, const char *prefix);
|
||||||
static int flip2_program_enable(const PROGRAMMER *pgm, const AVRPART *part);
|
static int flip2_program_enable(PROGRAMMER* pgm, AVRPART *part);
|
||||||
static int flip2_chip_erase(const PROGRAMMER *pgm, const AVRPART *part);
|
static int flip2_chip_erase(PROGRAMMER* pgm, AVRPART *part);
|
||||||
static int flip2_start_app(const PROGRAMMER *pgm);
|
static int flip2_read_byte(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
||||||
static int flip2_read_byte(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *mem,
|
|
||||||
unsigned long addr, unsigned char *value);
|
unsigned long addr, unsigned char *value);
|
||||||
static int flip2_write_byte(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *mem,
|
static int flip2_write_byte(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
||||||
unsigned long addr, unsigned char value);
|
unsigned long addr, unsigned char value);
|
||||||
static int flip2_paged_load(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *mem,
|
static int flip2_paged_load(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
||||||
unsigned int page_size, unsigned int addr, unsigned int n_bytes);
|
unsigned int page_size, unsigned int addr, unsigned int n_bytes);
|
||||||
static int flip2_paged_write(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *mem,
|
static int flip2_paged_write(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
||||||
unsigned int page_size, unsigned int addr, unsigned int n_bytes);
|
unsigned int page_size, unsigned int addr, unsigned int n_bytes);
|
||||||
static int flip2_read_sig_bytes(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *mem);
|
static int flip2_read_sig_bytes(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem);
|
||||||
static int flip2_parseexitspecs(PROGRAMMER* pgm, const char *s);
|
|
||||||
static void flip2_setup(PROGRAMMER * pgm);
|
static void flip2_setup(PROGRAMMER * pgm);
|
||||||
static void flip2_teardown(PROGRAMMER * pgm);
|
static void flip2_teardown(PROGRAMMER * pgm);
|
||||||
|
|
||||||
/* INTERNAL PROGRAMMER FUNCTION PROTOTYPES */
|
/* INTERNAL PROGRAMMER FUNCTION PROTOTYPES */
|
||||||
|
#ifdef HAVE_LIBUSB
|
||||||
|
// The internal ones are made conditional, as they're not defined further down #ifndef HAVE_LIBUSB
|
||||||
|
|
||||||
static void flip2_show_info(struct flip2 *flip2);
|
static void flip2_show_info(struct flip2 *flip2);
|
||||||
|
|
||||||
|
@ -168,7 +171,12 @@ static const char * flip2_status_str(const struct dfu_status *status);
|
||||||
static const char * flip2_mem_unit_str(enum flip2_mem_unit mem_unit);
|
static const char * flip2_mem_unit_str(enum flip2_mem_unit mem_unit);
|
||||||
static enum flip2_mem_unit flip2_mem_unit(const char *name);
|
static enum flip2_mem_unit flip2_mem_unit(const char *name);
|
||||||
|
|
||||||
void flip2_initpgm(PROGRAMMER *pgm) {
|
#endif /* HAVE_LIBUSB */
|
||||||
|
|
||||||
|
/* THE INITPGM FUNCTION DEFINITIONS */
|
||||||
|
|
||||||
|
void flip2_initpgm(PROGRAMMER *pgm)
|
||||||
|
{
|
||||||
strcpy(pgm->type, "flip2");
|
strcpy(pgm->type, "flip2");
|
||||||
|
|
||||||
/* Mandatory Functions */
|
/* Mandatory Functions */
|
||||||
|
@ -185,19 +193,21 @@ void flip2_initpgm(PROGRAMMER *pgm) {
|
||||||
pgm->read_byte = flip2_read_byte;
|
pgm->read_byte = flip2_read_byte;
|
||||||
pgm->write_byte = flip2_write_byte;
|
pgm->write_byte = flip2_write_byte;
|
||||||
pgm->read_sig_bytes = flip2_read_sig_bytes;
|
pgm->read_sig_bytes = flip2_read_sig_bytes;
|
||||||
pgm->parseexitspecs = flip2_parseexitspecs;
|
|
||||||
pgm->setup = flip2_setup;
|
pgm->setup = flip2_setup;
|
||||||
pgm->teardown = flip2_teardown;
|
pgm->teardown = flip2_teardown;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBUSB
|
||||||
/* EXPORTED PROGRAMMER FUNCTION DEFINITIONS */
|
/* EXPORTED PROGRAMMER FUNCTION DEFINITIONS */
|
||||||
|
|
||||||
int flip2_open(PROGRAMMER *pgm, const char *port_spec) {
|
int flip2_open(PROGRAMMER *pgm, char *port_spec)
|
||||||
|
{
|
||||||
FLIP2(pgm)->dfu = dfu_open(port_spec);
|
FLIP2(pgm)->dfu = dfu_open(port_spec);
|
||||||
return (FLIP2(pgm)->dfu != NULL) ? 0 : -1;
|
return (FLIP2(pgm)->dfu != NULL) ? 0 : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int flip2_initialize(const PROGRAMMER *pgm, const AVRPART *part) {
|
int flip2_initialize(PROGRAMMER* pgm, AVRPART *part)
|
||||||
|
{
|
||||||
unsigned short vid, pid;
|
unsigned short vid, pid;
|
||||||
int result;
|
int result;
|
||||||
struct dfu_dev *dfu = FLIP2(pgm)->dfu;
|
struct dfu_dev *dfu = FLIP2(pgm)->dfu;
|
||||||
|
@ -205,7 +215,7 @@ int flip2_initialize(const PROGRAMMER *pgm, const AVRPART *part) {
|
||||||
/* A note about return values. Negative return values from this function are
|
/* A note about return values. Negative return values from this function are
|
||||||
* interpreted as failure by main(), from where this function is called.
|
* interpreted as failure by main(), from where this function is called.
|
||||||
* However such failures are interpreted as a device signature check failure
|
* However such failures are interpreted as a device signature check failure
|
||||||
* and the user is advised to use the -F option to override this check. In
|
* and the user is adviced to use the -F option to override this check. In
|
||||||
* our case, this is misleading, so we defer reporting an error until another
|
* our case, this is misleading, so we defer reporting an error until another
|
||||||
* function is called. Thus, we always return 0 (success) from initialize().
|
* function is called. Thus, we always return 0 (success) from initialize().
|
||||||
* I don't like this, but I don't want to mess with main().
|
* I don't like this, but I don't want to mess with main().
|
||||||
|
@ -226,15 +236,17 @@ int flip2_initialize(const PROGRAMMER *pgm, const AVRPART *part) {
|
||||||
if (usbpid) {
|
if (usbpid) {
|
||||||
pid = *(int *)(ldata(usbpid));
|
pid = *(int *)(ldata(usbpid));
|
||||||
if (lnext(usbpid))
|
if (lnext(usbpid))
|
||||||
pmsg_warning("using PID 0x%04x, ignoring remaining PIDs in list\n", pid);
|
avrdude_message(MSG_INFO, "%s: Warning: using PID 0x%04x, ignoring remaining PIDs in list\n",
|
||||||
|
progname, pid);
|
||||||
} else {
|
} else {
|
||||||
pid = part->usbpid;
|
pid = part->usbpid;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ovsigck && !(part->prog_modes & PM_PDI)) {
|
if (!ovsigck && !(part->flags & AVRPART_HAS_PDI)) {
|
||||||
pmsg_error("flip2 (FLIP protocol version 2) is for Xmega devices\n");
|
avrdude_message(MSG_INFO, "%s: \"flip2\" (FLIP protocol version 2) is for Xmega devices.\n"
|
||||||
imsg_error("for AT90USB* or ATmega*U* devices, use flip1\n");
|
"%s For AT90USB* or ATmega*U* devices, use \"flip1\".\n"
|
||||||
imsg_error("(or use -F to bypass this check)\n");
|
"%s (Use -F to bypass this check.)\n",
|
||||||
|
progname, progbuf, progbuf);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -246,44 +258,44 @@ int flip2_initialize(const PROGRAMMER *pgm, const AVRPART *part) {
|
||||||
/* Check if descriptor values are what we expect. */
|
/* Check if descriptor values are what we expect. */
|
||||||
|
|
||||||
if (dfu->dev_desc.idVendor != vid)
|
if (dfu->dev_desc.idVendor != vid)
|
||||||
pmsg_warning("USB idVendor = 0x%04X (expected 0x%04X)\n",
|
avrdude_message(MSG_INFO, "%s: Warning: USB idVendor = 0x%04X (expected 0x%04X)\n",
|
||||||
dfu->dev_desc.idVendor, vid);
|
progname, dfu->dev_desc.idVendor, vid);
|
||||||
|
|
||||||
if (pid != 0 && dfu->dev_desc.idProduct != pid)
|
if (pid != 0 && dfu->dev_desc.idProduct != pid)
|
||||||
pmsg_warning("USB idProduct = 0x%04X (expected 0x%04X)\n",
|
avrdude_message(MSG_INFO, "%s: Warning: USB idProduct = 0x%04X (expected 0x%04X)\n",
|
||||||
dfu->dev_desc.idProduct, pid);
|
progname, dfu->dev_desc.idProduct, pid);
|
||||||
|
|
||||||
if (dfu->dev_desc.bNumConfigurations != 1)
|
if (dfu->dev_desc.bNumConfigurations != 1)
|
||||||
pmsg_error("USB bNumConfigurations = %d (expected 1)\n",
|
avrdude_message(MSG_INFO, "%s: Warning: USB bNumConfigurations = %d (expected 1)\n",
|
||||||
(int) dfu->dev_desc.bNumConfigurations);
|
progname, (int) dfu->dev_desc.bNumConfigurations);
|
||||||
|
|
||||||
if (dfu->conf_desc.bNumInterfaces != 1)
|
if (dfu->conf_desc.bNumInterfaces != 1)
|
||||||
pmsg_error("USB bNumInterfaces = %d (expected 1)\n",
|
avrdude_message(MSG_INFO, "%s: Warning: USB bNumInterfaces = %d (expected 1)\n",
|
||||||
(int) dfu->conf_desc.bNumInterfaces);
|
progname, (int) dfu->conf_desc.bNumInterfaces);
|
||||||
|
|
||||||
if (dfu->dev_desc.bDeviceClass != 0)
|
if (dfu->dev_desc.bDeviceClass != 0)
|
||||||
pmsg_error("USB bDeviceClass = %d (expected 0)\n",
|
avrdude_message(MSG_INFO, "%s: Warning: USB bDeviceClass = %d (expected 0)\n",
|
||||||
(int) dfu->dev_desc.bDeviceClass);
|
progname, (int) dfu->dev_desc.bDeviceClass);
|
||||||
|
|
||||||
if (dfu->dev_desc.bDeviceSubClass != 0)
|
if (dfu->dev_desc.bDeviceSubClass != 0)
|
||||||
pmsg_error("USB bDeviceSubClass = %d (expected 0)\n",
|
avrdude_message(MSG_INFO, "%s: Warning: USB bDeviceSubClass = %d (expected 0)\n",
|
||||||
(int) dfu->dev_desc.bDeviceSubClass);
|
progname, (int) dfu->dev_desc.bDeviceSubClass);
|
||||||
|
|
||||||
if (dfu->dev_desc.bDeviceProtocol != 0)
|
if (dfu->dev_desc.bDeviceProtocol != 0)
|
||||||
pmsg_error("USB bDeviceProtocol = %d (expected 0)\n",
|
avrdude_message(MSG_INFO, "%s: Warning: USB bDeviceProtocol = %d (expected 0)\n",
|
||||||
(int) dfu->dev_desc.bDeviceProtocol);
|
progname, (int) dfu->dev_desc.bDeviceProtocol);
|
||||||
|
|
||||||
if (dfu->intf_desc.bInterfaceClass != 0xFF)
|
if (dfu->intf_desc.bInterfaceClass != 0xFF)
|
||||||
pmsg_error("USB bInterfaceClass = %d (expected 255)\n",
|
avrdude_message(MSG_INFO, "%s: Warning: USB bInterfaceClass = %d (expected 255)\n",
|
||||||
(int) dfu->intf_desc.bInterfaceClass);
|
progname, (int) dfu->intf_desc.bInterfaceClass);
|
||||||
|
|
||||||
if (dfu->intf_desc.bInterfaceSubClass != 0)
|
if (dfu->intf_desc.bInterfaceSubClass != 0)
|
||||||
pmsg_error("USB bInterfaceSubClass = %d (expected 0)\n",
|
avrdude_message(MSG_INFO, "%s: Warning: USB bInterfaceSubClass = %d (expected 0)\n",
|
||||||
(int) dfu->intf_desc.bInterfaceSubClass);
|
progname, (int) dfu->intf_desc.bInterfaceSubClass);
|
||||||
|
|
||||||
if (dfu->intf_desc.bInterfaceProtocol != 0)
|
if (dfu->intf_desc.bInterfaceProtocol != 0)
|
||||||
pmsg_error("USB bInterfaceSubClass = %d (expected 0)\n",
|
avrdude_message(MSG_INFO, "%s: Warning: USB bInterfaceSubClass = %d (expected 0)\n",
|
||||||
(int) dfu->intf_desc.bInterfaceProtocol);
|
progname, (int) dfu->intf_desc.bInterfaceProtocol);
|
||||||
|
|
||||||
result = flip2_read_memory(FLIP2(pgm)->dfu,
|
result = flip2_read_memory(FLIP2(pgm)->dfu,
|
||||||
FLIP2_MEM_UNIT_SIGNATURE, 0, FLIP2(pgm)->part_sig, 4);
|
FLIP2_MEM_UNIT_SIGNATURE, 0, FLIP2(pgm)->part_sig, 4);
|
||||||
|
@ -311,27 +323,28 @@ flip2_initialize_fail:
|
||||||
void flip2_close(PROGRAMMER* pgm)
|
void flip2_close(PROGRAMMER* pgm)
|
||||||
{
|
{
|
||||||
if (FLIP2(pgm)->dfu != NULL) {
|
if (FLIP2(pgm)->dfu != NULL) {
|
||||||
if (pgm->exit_reset == EXIT_RESET_ENABLED)
|
|
||||||
flip2_start_app(pgm);
|
|
||||||
|
|
||||||
dfu_close(FLIP2(pgm)->dfu);
|
dfu_close(FLIP2(pgm)->dfu);
|
||||||
FLIP2(pgm)->dfu = NULL;
|
FLIP2(pgm)->dfu = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void flip2_enable(PROGRAMMER *pgm, const AVRPART *p) {
|
void flip2_enable(PROGRAMMER* pgm)
|
||||||
|
{
|
||||||
/* Nothing to do. */
|
/* Nothing to do. */
|
||||||
}
|
}
|
||||||
|
|
||||||
void flip2_disable(const PROGRAMMER *pgm) {
|
void flip2_disable(PROGRAMMER* pgm)
|
||||||
|
{
|
||||||
/* Nothing to do. */
|
/* Nothing to do. */
|
||||||
}
|
}
|
||||||
|
|
||||||
void flip2_display(const PROGRAMMER *pgm, const char *prefix) {
|
void flip2_display(PROGRAMMER* pgm, const char *prefix)
|
||||||
|
{
|
||||||
/* Nothing to do. */
|
/* Nothing to do. */
|
||||||
}
|
}
|
||||||
|
|
||||||
int flip2_program_enable(const PROGRAMMER *pgm, const AVRPART *part) {
|
int flip2_program_enable(PROGRAMMER* pgm, AVRPART *part)
|
||||||
|
{
|
||||||
/* I couldn't find anything that uses this function, although it is marked
|
/* I couldn't find anything that uses this function, although it is marked
|
||||||
* as "mandatory" in pgm.c. In case anyone does use it, we'll report an
|
* as "mandatory" in pgm.c. In case anyone does use it, we'll report an
|
||||||
* error if we failed to initialize.
|
* error if we failed to initialize.
|
||||||
|
@ -340,12 +353,13 @@ int flip2_program_enable(const PROGRAMMER *pgm, const AVRPART *part) {
|
||||||
return (FLIP2(pgm)->dfu != NULL) ? 0 : -1;
|
return (FLIP2(pgm)->dfu != NULL) ? 0 : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int flip2_chip_erase(const PROGRAMMER *pgm, const AVRPART *part) {
|
int flip2_chip_erase(PROGRAMMER* pgm, AVRPART *part)
|
||||||
|
{
|
||||||
struct dfu_status status;
|
struct dfu_status status;
|
||||||
int cmd_result = 0;
|
int cmd_result = 0;
|
||||||
int aux_result;
|
int aux_result;
|
||||||
|
|
||||||
pmsg_notice2("flip_chip_erase()\n");
|
avrdude_message(MSG_NOTICE2, "%s: flip_chip_erase()\n", progname);
|
||||||
|
|
||||||
struct flip2_cmd cmd = {
|
struct flip2_cmd cmd = {
|
||||||
FLIP2_CMD_GROUP_EXEC, FLIP2_CMD_CHIP_ERASE, { 0xFF, 0, 0, 0 }
|
FLIP2_CMD_GROUP_EXEC, FLIP2_CMD_CHIP_ERASE, { 0xFF, 0, 0, 0 }
|
||||||
|
@ -363,8 +377,9 @@ int flip2_chip_erase(const PROGRAMMER *pgm, const AVRPART *part) {
|
||||||
status.bState == ((FLIP2_STATUS_ERASE_ONGOING >> 0) & 0xFF))
|
status.bState == ((FLIP2_STATUS_ERASE_ONGOING >> 0) & 0xFF))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
} else
|
||||||
pmsg_error("DFU status %s\n", flip2_status_str(&status));
|
avrdude_message(MSG_INFO, "%s: Error: DFU status %s\n", progname,
|
||||||
|
flip2_status_str(&status));
|
||||||
dfu_clrstatus(FLIP2(pgm)->dfu);
|
dfu_clrstatus(FLIP2(pgm)->dfu);
|
||||||
} else
|
} else
|
||||||
break;
|
break;
|
||||||
|
@ -373,23 +388,7 @@ int flip2_chip_erase(const PROGRAMMER *pgm, const AVRPART *part) {
|
||||||
return cmd_result;
|
return cmd_result;
|
||||||
}
|
}
|
||||||
|
|
||||||
int flip2_start_app(const PROGRAMMER *pgm) {
|
int flip2_read_byte(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
||||||
pmsg_info("starting application\n");
|
|
||||||
|
|
||||||
struct flip2_cmd cmd = {
|
|
||||||
FLIP2_CMD_GROUP_EXEC, FLIP2_CMD_START_APP, { 0x00, 0, 0, 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
// queue command
|
|
||||||
int cmd_result = dfu_dnload(FLIP2(pgm)->dfu, &cmd, sizeof(cmd));
|
|
||||||
|
|
||||||
// repeat dnload to actually execute
|
|
||||||
dfu_dnload(FLIP2(pgm)->dfu, &cmd, sizeof(cmd));
|
|
||||||
|
|
||||||
return cmd_result;
|
|
||||||
}
|
|
||||||
|
|
||||||
int flip2_read_byte(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *mem,
|
|
||||||
unsigned long addr, unsigned char *value)
|
unsigned long addr, unsigned char *value)
|
||||||
{
|
{
|
||||||
enum flip2_mem_unit mem_unit;
|
enum flip2_mem_unit mem_unit;
|
||||||
|
@ -400,17 +399,19 @@ int flip2_read_byte(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *me
|
||||||
mem_unit = flip2_mem_unit(mem->desc);
|
mem_unit = flip2_mem_unit(mem->desc);
|
||||||
|
|
||||||
if (mem_unit == FLIP2_MEM_UNIT_UNKNOWN) {
|
if (mem_unit == FLIP2_MEM_UNIT_UNKNOWN) {
|
||||||
pmsg_error("%s memory not accessible using FLIP", mem->desc);
|
avrdude_message(MSG_INFO, "%s: Error: "
|
||||||
|
"\"%s\" memory not accessible using FLIP",
|
||||||
|
progname, mem->desc);
|
||||||
if (strcmp(mem->desc, "flash") == 0)
|
if (strcmp(mem->desc, "flash") == 0)
|
||||||
msg_error(" (did you mean \"application\"?)");
|
avrdude_message(MSG_INFO, " (did you mean \"application\"?)");
|
||||||
msg_error("\n");
|
avrdude_message(MSG_INFO, "\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return flip2_read_memory(FLIP2(pgm)->dfu, mem_unit, addr, value, 1);
|
return flip2_read_memory(FLIP2(pgm)->dfu, mem_unit, addr, value, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int flip2_write_byte(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *mem,
|
int flip2_write_byte(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
||||||
unsigned long addr, unsigned char value)
|
unsigned long addr, unsigned char value)
|
||||||
{
|
{
|
||||||
enum flip2_mem_unit mem_unit;
|
enum flip2_mem_unit mem_unit;
|
||||||
|
@ -421,17 +422,19 @@ int flip2_write_byte(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *m
|
||||||
mem_unit = flip2_mem_unit(mem->desc);
|
mem_unit = flip2_mem_unit(mem->desc);
|
||||||
|
|
||||||
if (mem_unit == FLIP2_MEM_UNIT_UNKNOWN) {
|
if (mem_unit == FLIP2_MEM_UNIT_UNKNOWN) {
|
||||||
pmsg_error("%s memory not accessible using FLIP", mem->desc);
|
avrdude_message(MSG_INFO, "%s: Error: "
|
||||||
|
"\"%s\" memory not accessible using FLIP",
|
||||||
|
progname, mem->desc);
|
||||||
if (strcmp(mem->desc, "flash") == 0)
|
if (strcmp(mem->desc, "flash") == 0)
|
||||||
msg_error(" (did you mean \"application\"?)");
|
avrdude_message(MSG_INFO, " (did you mean \"application\"?)");
|
||||||
msg_error("\n");
|
avrdude_message(MSG_INFO, "\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return flip2_write_memory(FLIP2(pgm)->dfu, mem_unit, addr, &value, 1);
|
return flip2_write_memory(FLIP2(pgm)->dfu, mem_unit, addr, &value, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int flip2_paged_load(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *mem,
|
int flip2_paged_load(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
||||||
unsigned int page_size, unsigned int addr, unsigned int n_bytes)
|
unsigned int page_size, unsigned int addr, unsigned int n_bytes)
|
||||||
{
|
{
|
||||||
enum flip2_mem_unit mem_unit;
|
enum flip2_mem_unit mem_unit;
|
||||||
|
@ -443,16 +446,19 @@ int flip2_paged_load(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *m
|
||||||
mem_unit = flip2_mem_unit(mem->desc);
|
mem_unit = flip2_mem_unit(mem->desc);
|
||||||
|
|
||||||
if (mem_unit == FLIP2_MEM_UNIT_UNKNOWN) {
|
if (mem_unit == FLIP2_MEM_UNIT_UNKNOWN) {
|
||||||
pmsg_error("%s memory not accessible using FLIP", mem->desc);
|
avrdude_message(MSG_INFO, "%s: Error: "
|
||||||
|
"\"%s\" memory not accessible using FLIP",
|
||||||
|
progname, mem->desc);
|
||||||
if (strcmp(mem->desc, "flash") == 0)
|
if (strcmp(mem->desc, "flash") == 0)
|
||||||
msg_error(" (did you mean \"application\"?)");
|
avrdude_message(MSG_INFO, " (did you mean \"application\"?)");
|
||||||
msg_error("\n");
|
avrdude_message(MSG_INFO, "\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (n_bytes > INT_MAX) {
|
if (n_bytes > INT_MAX) {
|
||||||
/* This should never happen, unless the int type is only 16 bits. */
|
/* This should never happen, unless the int type is only 16 bits. */
|
||||||
pmsg_error("attempting to read more than %d bytes\n", INT_MAX);
|
avrdude_message(MSG_INFO, "%s: Error: Attempting to read more than %d bytes\n",
|
||||||
|
progname, INT_MAX);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -462,7 +468,7 @@ int flip2_paged_load(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *m
|
||||||
return (result == 0) ? n_bytes : -1;
|
return (result == 0) ? n_bytes : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int flip2_paged_write(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *mem,
|
int flip2_paged_write(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
||||||
unsigned int page_size, unsigned int addr, unsigned int n_bytes)
|
unsigned int page_size, unsigned int addr, unsigned int n_bytes)
|
||||||
{
|
{
|
||||||
enum flip2_mem_unit mem_unit;
|
enum flip2_mem_unit mem_unit;
|
||||||
|
@ -474,16 +480,19 @@ int flip2_paged_write(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *
|
||||||
mem_unit = flip2_mem_unit(mem->desc);
|
mem_unit = flip2_mem_unit(mem->desc);
|
||||||
|
|
||||||
if (mem_unit == FLIP2_MEM_UNIT_UNKNOWN) {
|
if (mem_unit == FLIP2_MEM_UNIT_UNKNOWN) {
|
||||||
pmsg_error("%s memory not accessible using FLIP", mem->desc);
|
avrdude_message(MSG_INFO, "%s: Error: "
|
||||||
|
"\"%s\" memory not accessible using FLIP",
|
||||||
|
progname, mem->desc);
|
||||||
if (strcmp(mem->desc, "flash") == 0)
|
if (strcmp(mem->desc, "flash") == 0)
|
||||||
msg_error(" (did you mean \"application\"?)");
|
avrdude_message(MSG_INFO, " (did you mean \"application\"?)");
|
||||||
msg_error("\n");
|
avrdude_message(MSG_INFO, "\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (n_bytes > INT_MAX) {
|
if (n_bytes > INT_MAX) {
|
||||||
/* This should never happen, unless the int type is only 16 bits. */
|
/* This should never happen, unless the int type is only 16 bits. */
|
||||||
pmsg_error("attempting to read more than %d bytes\n", INT_MAX);
|
avrdude_message(MSG_INFO, "%s: Error: Attempting to read more than %d bytes\n",
|
||||||
|
progname, INT_MAX);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -493,35 +502,14 @@ int flip2_paged_write(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *
|
||||||
return (result == 0) ? n_bytes : -1;
|
return (result == 0) ? n_bytes : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse the -E option flag
|
int flip2_read_sig_bytes(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem)
|
||||||
int flip2_parseexitspecs(PROGRAMMER *pgm, const char *sp) {
|
{
|
||||||
char *cp, *s, *str = cfg_strdup("flip2_parseextitspecs()", sp);
|
|
||||||
|
|
||||||
s = str;
|
|
||||||
while ((cp = strtok(s, ","))) {
|
|
||||||
s = NULL;
|
|
||||||
if (!strcmp(cp, "reset")) {
|
|
||||||
pgm->exit_reset = EXIT_RESET_ENABLED;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!strcmp(cp, "noreset")) {
|
|
||||||
pgm->exit_reset = EXIT_RESET_DISABLED;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
free(str);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
free(str);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int flip2_read_sig_bytes(const PROGRAMMER *pgm, const AVRPART *part, const AVRMEM *mem) {
|
|
||||||
if (FLIP2(pgm)->dfu == NULL)
|
if (FLIP2(pgm)->dfu == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (mem->size < sizeof(FLIP2(pgm)->part_sig)) {
|
if (mem->size < sizeof(FLIP2(pgm)->part_sig)) {
|
||||||
pmsg_error("signature read must be at least %u bytes\n", (unsigned int) sizeof(FLIP2(pgm)->part_sig));
|
avrdude_message(MSG_INFO, "%s: Error: Signature read must be at least %u bytes\n",
|
||||||
|
progname, (unsigned int) sizeof(FLIP2(pgm)->part_sig));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -534,7 +522,8 @@ void flip2_setup(PROGRAMMER * pgm)
|
||||||
pgm->cookie = calloc(1, sizeof(struct flip2));
|
pgm->cookie = calloc(1, sizeof(struct flip2));
|
||||||
|
|
||||||
if (pgm->cookie == NULL) {
|
if (pgm->cookie == NULL) {
|
||||||
pmsg_error("out of memory allocating private data structure\n");
|
avrdude_message(MSG_INFO, "%s: Out of memory allocating private data structure\n",
|
||||||
|
progname);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -552,24 +541,24 @@ void flip2_show_info(struct flip2 *flip2)
|
||||||
{
|
{
|
||||||
dfu_show_info(flip2->dfu);
|
dfu_show_info(flip2->dfu);
|
||||||
|
|
||||||
msg_info(" Part signature : 0x%02X%02X%02X\n",
|
avrdude_message(MSG_INFO, " Part signature : 0x%02X%02X%02X\n",
|
||||||
(int) flip2->part_sig[0],
|
(int) flip2->part_sig[0],
|
||||||
(int) flip2->part_sig[1],
|
(int) flip2->part_sig[1],
|
||||||
(int) flip2->part_sig[2]);
|
(int) flip2->part_sig[2]);
|
||||||
|
|
||||||
if (flip2->part_rev < 26)
|
if (flip2->part_rev < 26)
|
||||||
msg_info(" Part revision : %c\n",
|
avrdude_message(MSG_INFO, " Part revision : %c\n",
|
||||||
(char) (flip2->part_rev + 'A'));
|
(char) (flip2->part_rev + 'A'));
|
||||||
else
|
else
|
||||||
msg_info(" Part revision : %c%c\n",
|
avrdude_message(MSG_INFO, " Part revision : %c%c\n",
|
||||||
(char) (flip2->part_rev / 26 - 1 + 'A'),
|
(char) (flip2->part_rev / 26 - 1 + 'A'),
|
||||||
(char) (flip2->part_rev % 26 + 'A'));
|
(char) (flip2->part_rev % 26 + 'A'));
|
||||||
|
|
||||||
msg_info(" Bootloader version : 2.%hu.%hu\n",
|
avrdude_message(MSG_INFO, " Bootloader version : 2.%hu.%hu\n",
|
||||||
((unsigned short) flip2->boot_ver >> 4) & 0xF,
|
((unsigned short) flip2->boot_ver >> 4) & 0xF,
|
||||||
((unsigned short) flip2->boot_ver >> 0) & 0xF);
|
((unsigned short) flip2->boot_ver >> 0) & 0xF);
|
||||||
|
|
||||||
msg_info(" USB max packet size : %hu\n",
|
avrdude_message(MSG_INFO, " USB max packet size : %hu\n",
|
||||||
(unsigned short) flip2->dfu->dev_desc.bMaxPacketSize0);
|
(unsigned short) flip2->dfu->dev_desc.bMaxPacketSize0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -582,15 +571,18 @@ int flip2_read_memory(struct dfu_dev *dfu,
|
||||||
int read_size;
|
int read_size;
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
pmsg_notice2("flip_read_memory(%s, 0x%04x, %d)\n", flip2_mem_unit_str(mem_unit), addr, size);
|
avrdude_message(MSG_NOTICE2, "%s: flip_read_memory(%s, 0x%04x, %d)\n",
|
||||||
|
progname, flip2_mem_unit_str(mem_unit), addr, size);
|
||||||
|
|
||||||
result = flip2_set_mem_unit(dfu, mem_unit);
|
result = flip2_set_mem_unit(dfu, mem_unit);
|
||||||
|
|
||||||
if (result != 0) {
|
if (result != 0) {
|
||||||
if ((mem_name = flip2_mem_unit_str(mem_unit)) != NULL)
|
if ((mem_name = flip2_mem_unit_str(mem_unit)) != NULL)
|
||||||
pmsg_error("unable to set memory unit 0x%02X (%s)\n", (int) mem_unit, mem_name);
|
avrdude_message(MSG_INFO, "%s: Error: Failed to set memory unit 0x%02X (%s)\n",
|
||||||
|
progname, (int) mem_unit, mem_name);
|
||||||
else
|
else
|
||||||
pmsg_error("unable to set memory unit 0x%02X\n", (int) mem_unit);
|
avrdude_message(MSG_INFO, "%s: Error: Failed to set memory unit 0x%02X\n",
|
||||||
|
progname, (int) mem_unit);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -598,7 +590,8 @@ int flip2_read_memory(struct dfu_dev *dfu,
|
||||||
result = flip2_set_mem_page(dfu, page_addr);
|
result = flip2_set_mem_page(dfu, page_addr);
|
||||||
|
|
||||||
if (result != 0) {
|
if (result != 0) {
|
||||||
pmsg_error("unable to set memory page 0x%04hX\n", page_addr);
|
avrdude_message(MSG_INFO, "%s: Error: Failed to set memory page 0x%04hX\n",
|
||||||
|
progname, page_addr);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -609,7 +602,8 @@ int flip2_read_memory(struct dfu_dev *dfu,
|
||||||
if (page_addr != prev_page_addr) {
|
if (page_addr != prev_page_addr) {
|
||||||
result = flip2_set_mem_page(dfu, page_addr);
|
result = flip2_set_mem_page(dfu, page_addr);
|
||||||
if (result != 0) {
|
if (result != 0) {
|
||||||
pmsg_error("unable to set memory page 0x%04hX\n", page_addr);
|
avrdude_message(MSG_INFO, "%s: Error: Failed to set memory page 0x%04hX\n",
|
||||||
|
progname, page_addr);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -618,11 +612,12 @@ int flip2_read_memory(struct dfu_dev *dfu,
|
||||||
result = flip2_read_max1k(dfu, addr & 0xFFFF, ptr, read_size);
|
result = flip2_read_max1k(dfu, addr & 0xFFFF, ptr, read_size);
|
||||||
|
|
||||||
if (result != 0) {
|
if (result != 0) {
|
||||||
pmsg_error("unable to read 0x%04X bytes at 0x%04lX\n", read_size, (unsigned long) addr);
|
avrdude_message(MSG_INFO, "%s: Error: Failed to read 0x%04X bytes at 0x%04lX\n",
|
||||||
|
progname, read_size, (unsigned long) addr);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ptr = (char*)ptr + read_size;
|
ptr += read_size;
|
||||||
addr += read_size;
|
addr += read_size;
|
||||||
size -= read_size;
|
size -= read_size;
|
||||||
}
|
}
|
||||||
|
@ -639,15 +634,18 @@ int flip2_write_memory(struct dfu_dev *dfu,
|
||||||
int write_size;
|
int write_size;
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
pmsg_notice2("flip_write_memory(%s, 0x%04x, %d)\n", flip2_mem_unit_str(mem_unit), addr, size);
|
avrdude_message(MSG_NOTICE2, "%s: flip_write_memory(%s, 0x%04x, %d)\n",
|
||||||
|
progname, flip2_mem_unit_str(mem_unit), addr, size);
|
||||||
|
|
||||||
result = flip2_set_mem_unit(dfu, mem_unit);
|
result = flip2_set_mem_unit(dfu, mem_unit);
|
||||||
|
|
||||||
if (result != 0) {
|
if (result != 0) {
|
||||||
if ((mem_name = flip2_mem_unit_str(mem_unit)) != NULL)
|
if ((mem_name = flip2_mem_unit_str(mem_unit)) != NULL)
|
||||||
pmsg_error("unable to set memory unit 0x%02X (%s)\n", (int) mem_unit, mem_name);
|
avrdude_message(MSG_INFO, "%s: Error: Failed to set memory unit 0x%02X (%s)\n",
|
||||||
|
progname, (int) mem_unit, mem_name);
|
||||||
else
|
else
|
||||||
pmsg_error("unable to set memory unit 0x%02X\n", (int) mem_unit);
|
avrdude_message(MSG_INFO, "%s: Error: Failed to set memory unit 0x%02X\n",
|
||||||
|
progname, (int) mem_unit);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -655,7 +653,8 @@ int flip2_write_memory(struct dfu_dev *dfu,
|
||||||
result = flip2_set_mem_page(dfu, page_addr);
|
result = flip2_set_mem_page(dfu, page_addr);
|
||||||
|
|
||||||
if (result != 0) {
|
if (result != 0) {
|
||||||
pmsg_error("unable to set memory page 0x%04hX\n", page_addr);
|
avrdude_message(MSG_INFO, "%s: Error: Failed to set memory page 0x%04hX\n",
|
||||||
|
progname, page_addr);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -666,7 +665,8 @@ int flip2_write_memory(struct dfu_dev *dfu,
|
||||||
if (page_addr != prev_page_addr) {
|
if (page_addr != prev_page_addr) {
|
||||||
result = flip2_set_mem_page(dfu, page_addr);
|
result = flip2_set_mem_page(dfu, page_addr);
|
||||||
if (result != 0) {
|
if (result != 0) {
|
||||||
pmsg_error("unable to set memory page 0x%04hX\n", page_addr);
|
avrdude_message(MSG_INFO, "%s: Error: Failed to set memory page 0x%04hX\n",
|
||||||
|
progname, page_addr);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -675,11 +675,12 @@ int flip2_write_memory(struct dfu_dev *dfu,
|
||||||
result = flip2_write_max1k(dfu, addr & 0xFFFF, ptr, write_size);
|
result = flip2_write_max1k(dfu, addr & 0xFFFF, ptr, write_size);
|
||||||
|
|
||||||
if (result != 0) {
|
if (result != 0) {
|
||||||
pmsg_error("unable to write 0x%04X bytes at 0x%04lX\n", write_size, (unsigned long) addr);
|
avrdude_message(MSG_INFO, "%s: Error: Failed to write 0x%04X bytes at 0x%04lX\n",
|
||||||
|
progname, write_size, (unsigned long) addr);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ptr = (const char*)ptr + write_size;
|
ptr += write_size;
|
||||||
addr += write_size;
|
addr += write_size;
|
||||||
size -= write_size;
|
size -= write_size;
|
||||||
}
|
}
|
||||||
|
@ -711,9 +712,11 @@ int flip2_set_mem_unit(struct dfu_dev *dfu, enum flip2_mem_unit mem_unit)
|
||||||
if (status.bStatus == ((FLIP2_STATUS_OUTOFRANGE >> 8) & 0xFF) &&
|
if (status.bStatus == ((FLIP2_STATUS_OUTOFRANGE >> 8) & 0xFF) &&
|
||||||
status.bState == ((FLIP2_STATUS_OUTOFRANGE >> 0) & 0xFF))
|
status.bState == ((FLIP2_STATUS_OUTOFRANGE >> 0) & 0xFF))
|
||||||
{
|
{
|
||||||
pmsg_error("unknown memory unit (0x%02x)\n", (unsigned int) mem_unit);
|
avrdude_message(MSG_INFO, "%s: Error: Unknown memory unit (0x%02x)\n",
|
||||||
|
progname, (unsigned int) mem_unit);
|
||||||
} else
|
} else
|
||||||
pmsg_error("DFU status %s\n", flip2_status_str(&status));
|
avrdude_message(MSG_INFO, "%s: Error: DFU status %s\n", progname,
|
||||||
|
flip2_status_str(&status));
|
||||||
dfu_clrstatus(dfu);
|
dfu_clrstatus(dfu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -746,9 +749,11 @@ int flip2_set_mem_page(struct dfu_dev *dfu,
|
||||||
if (status.bStatus == ((FLIP2_STATUS_OUTOFRANGE >> 8) & 0xFF) &&
|
if (status.bStatus == ((FLIP2_STATUS_OUTOFRANGE >> 8) & 0xFF) &&
|
||||||
status.bState == ((FLIP2_STATUS_OUTOFRANGE >> 0) & 0xFF))
|
status.bState == ((FLIP2_STATUS_OUTOFRANGE >> 0) & 0xFF))
|
||||||
{
|
{
|
||||||
pmsg_error("page address out of range (0x%04hx)\n", page_addr);
|
avrdude_message(MSG_INFO, "%s: Error: Page address out of range (0x%04hx)\n",
|
||||||
|
progname, page_addr);
|
||||||
} else
|
} else
|
||||||
pmsg_error("DFU status %s\n", flip2_status_str(&status));
|
avrdude_message(MSG_INFO, "%s: Error: DFU status %s\n", progname,
|
||||||
|
flip2_status_str(&status));
|
||||||
dfu_clrstatus(dfu);
|
dfu_clrstatus(dfu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -789,9 +794,11 @@ flip2_read_max1k_status:
|
||||||
if (status.bStatus == ((FLIP2_STATUS_OUTOFRANGE >> 8) & 0xFF) &&
|
if (status.bStatus == ((FLIP2_STATUS_OUTOFRANGE >> 8) & 0xFF) &&
|
||||||
status.bState == ((FLIP2_STATUS_OUTOFRANGE >> 0) & 0xFF))
|
status.bState == ((FLIP2_STATUS_OUTOFRANGE >> 0) & 0xFF))
|
||||||
{
|
{
|
||||||
pmsg_error("address out of range [0x%04hX,0x%04hX]\n", offset, offset+size-1);
|
avrdude_message(MSG_INFO, "%s: Error: Address out of range [0x%04hX,0x%04hX]\n",
|
||||||
|
progname, offset, offset+size-1);
|
||||||
} else
|
} else
|
||||||
pmsg_error("DFU status %s\n", flip2_status_str(&status));
|
avrdude_message(MSG_INFO, "%s: Error: DFU status %s\n", progname,
|
||||||
|
flip2_status_str(&status));
|
||||||
dfu_clrstatus(dfu);
|
dfu_clrstatus(dfu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -817,7 +824,8 @@ int flip2_write_max1k(struct dfu_dev *dfu,
|
||||||
cmd.args[3] = ((offset+size-1) >> 0) & 0xFF;
|
cmd.args[3] = ((offset+size-1) >> 0) & 0xFF;
|
||||||
|
|
||||||
if (size > 0x400) {
|
if (size > 0x400) {
|
||||||
pmsg_error("erite block too large (%hu > 1024)\n", size);
|
avrdude_message(MSG_INFO, "%s: Error: Write block too large (%hu > 1024)\n",
|
||||||
|
progname, size);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -847,9 +855,11 @@ int flip2_write_max1k(struct dfu_dev *dfu,
|
||||||
if (status.bStatus == ((FLIP2_STATUS_OUTOFRANGE >> 8) & 0xFF) &&
|
if (status.bStatus == ((FLIP2_STATUS_OUTOFRANGE >> 8) & 0xFF) &&
|
||||||
status.bState == ((FLIP2_STATUS_OUTOFRANGE >> 0) & 0xFF))
|
status.bState == ((FLIP2_STATUS_OUTOFRANGE >> 0) & 0xFF))
|
||||||
{
|
{
|
||||||
pmsg_error("address out of range [0x%04hX,0x%04hX]\n", offset, offset+size-1);
|
avrdude_message(MSG_INFO, "%s: Error: Address out of range [0x%04hX,0x%04hX]\n",
|
||||||
|
progname, offset, offset+size-1);
|
||||||
} else
|
} else
|
||||||
pmsg_error("DFU status %s\n", flip2_status_str(&status));
|
avrdude_message(MSG_INFO, "%s: Error: DFU status %s\n", progname,
|
||||||
|
flip2_status_str(&status));
|
||||||
dfu_clrstatus(dfu);
|
dfu_clrstatus(dfu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -900,26 +910,93 @@ const char * flip2_mem_unit_str(enum flip2_mem_unit mem_unit)
|
||||||
}
|
}
|
||||||
|
|
||||||
enum flip2_mem_unit flip2_mem_unit(const char *name) {
|
enum flip2_mem_unit flip2_mem_unit(const char *name) {
|
||||||
if (strcmp(name, "application") == 0)
|
if (strcasecmp(name, "application") == 0)
|
||||||
return FLIP2_MEM_UNIT_FLASH;
|
return FLIP2_MEM_UNIT_FLASH;
|
||||||
if (strcmp(name, "eeprom") == 0)
|
if (strcasecmp(name, "eeprom") == 0)
|
||||||
return FLIP2_MEM_UNIT_EEPROM;
|
return FLIP2_MEM_UNIT_EEPROM;
|
||||||
if (strcmp(name, "signature") == 0)
|
if (strcasecmp(name, "signature") == 0)
|
||||||
return FLIP2_MEM_UNIT_SIGNATURE;
|
return FLIP2_MEM_UNIT_SIGNATURE;
|
||||||
return FLIP2_MEM_UNIT_UNKNOWN;
|
return FLIP2_MEM_UNIT_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else /* !HAVE_LIBUSB */
|
#else /* HAVE_LIBUSB */
|
||||||
|
|
||||||
// Give a proper error if we were not compiled with libusb
|
/* EXPORTED PROGRAMMER FUNCTION DEFINITIONS */
|
||||||
static int flip2_nousb_open(PROGRAMMER* pgm, const char* name) {
|
|
||||||
pmsg_error("no USB support; please compile with libusb installed\n");
|
int flip2_open(PROGRAMMER *pgm, char *port_spec)
|
||||||
return -1;
|
{
|
||||||
|
fprintf(stderr, "%s: Error: No USB support in this compile of avrdude\n",
|
||||||
|
progname);
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void flip2_initpgm(PROGRAMMER *pgm) {
|
int flip2_initialize(PROGRAMMER* pgm, AVRPART *part)
|
||||||
strcpy(pgm->type, "flip2");
|
{
|
||||||
pgm->open = flip2_nousb_open;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void flip2_close(PROGRAMMER* pgm)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void flip2_enable(PROGRAMMER* pgm)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void flip2_disable(PROGRAMMER* pgm)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void flip2_display(PROGRAMMER* pgm, const char *prefix)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
int flip2_program_enable(PROGRAMMER* pgm, AVRPART *part)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int flip2_chip_erase(PROGRAMMER* pgm, AVRPART *part)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int flip2_read_byte(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
||||||
|
unsigned long addr, unsigned char *value)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int flip2_write_byte(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
||||||
|
unsigned long addr, unsigned char value)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int flip2_paged_load(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
||||||
|
unsigned int page_size, unsigned int addr, unsigned int n_bytes)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int flip2_paged_write(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
||||||
|
unsigned int page_size, unsigned int addr, unsigned int n_bytes)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int flip2_read_sig_bytes(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void flip2_setup(PROGRAMMER * pgm)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void flip2_teardown(PROGRAMMER * pgm)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif /* HAVE_LIBUSB */
|
#endif /* HAVE_LIBUSB */
|
|
@ -26,7 +26,7 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern const char flip2_desc[];
|
extern const char flip2_desc[];
|
||||||
extern void flip2_initpgm(PROGRAMMER *pgm);
|
extern void flip2_initpgm(PROGRAMMER * pgm);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -2,7 +2,7 @@
|
||||||
#define ft245r_h
|
#define ft245r_h
|
||||||
|
|
||||||
extern const char ft245r_desc[];
|
extern const char ft245r_desc[];
|
||||||
void ft245r_initpgm(PROGRAMMER *pgm);
|
void ft245r_initpgm (PROGRAMMER * pgm);
|
||||||
|
|
||||||
|
|
||||||
#endif /* ft245r_h */
|
#endif /* ft245r_h */
|
|
@ -25,32 +25,27 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int jtag3_open_common(PROGRAMMER *pgm, const char *port);
|
int jtag3_open_common(PROGRAMMER * pgm, char * port);
|
||||||
int jtag3_send(const PROGRAMMER *pgm, unsigned char *data, size_t len);
|
int jtag3_send(PROGRAMMER * pgm, unsigned char * data, size_t len);
|
||||||
int jtag3_recv(const PROGRAMMER *pgm, unsigned char **msg);
|
int jtag3_recv(PROGRAMMER * pgm, unsigned char **msg);
|
||||||
void jtag3_close(PROGRAMMER * pgm);
|
void jtag3_close(PROGRAMMER * pgm);
|
||||||
int jtag3_getsync(const PROGRAMMER *pgm, int mode);
|
int jtag3_getsync(PROGRAMMER * pgm, int mode);
|
||||||
int jtag3_getparm(const PROGRAMMER *pgm, unsigned char scope,
|
int jtag3_getparm(PROGRAMMER * pgm, unsigned char scope,
|
||||||
unsigned char section, unsigned char parm,
|
unsigned char section, unsigned char parm,
|
||||||
unsigned char *value, unsigned char length);
|
unsigned char *value, unsigned char length);
|
||||||
int jtag3_setparm(const PROGRAMMER *pgm, unsigned char scope,
|
int jtag3_setparm(PROGRAMMER * pgm, unsigned char scope,
|
||||||
unsigned char section, unsigned char parm,
|
unsigned char section, unsigned char parm,
|
||||||
unsigned char *value, unsigned char length);
|
unsigned char *value, unsigned char length);
|
||||||
int jtag3_command(const PROGRAMMER *pgm, unsigned char *cmd, unsigned int cmdlen,
|
int jtag3_command(PROGRAMMER *pgm, unsigned char *cmd, unsigned int cmdlen,
|
||||||
unsigned char **resp, const char *descr);
|
unsigned char **resp, const char *descr);
|
||||||
void jtag3_display(const PROGRAMMER *pgm, const char *p);
|
|
||||||
void jtag3_print_parms1(const PROGRAMMER *pgm, const char *p, FILE *fp);
|
|
||||||
int jtag3_set_vtarget(const PROGRAMMER *pgm, double voltage);
|
|
||||||
extern const char jtag3_desc[];
|
extern const char jtag3_desc[];
|
||||||
extern const char jtag3_dw_desc[];
|
extern const char jtag3_dw_desc[];
|
||||||
extern const char jtag3_pdi_desc[];
|
extern const char jtag3_pdi_desc[];
|
||||||
extern const char jtag3_updi_desc[];
|
extern const char jtag3_updi_desc[];
|
||||||
extern const char jtag3_tpi_desc[];
|
void jtag3_initpgm (PROGRAMMER * pgm);
|
||||||
void jtag3_initpgm(PROGRAMMER *pgm);
|
void jtag3_dw_initpgm (PROGRAMMER * pgm);
|
||||||
void jtag3_dw_initpgm(PROGRAMMER *pgm);
|
void jtag3_pdi_initpgm (PROGRAMMER * pgm);
|
||||||
void jtag3_pdi_initpgm(PROGRAMMER *pgm);
|
void jtag3_updi_initpgm (PROGRAMMER * pgm);
|
||||||
void jtag3_updi_initpgm(PROGRAMMER *pgm);
|
|
||||||
void jtag3_tpi_initpgm(PROGRAMMER *pgm);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* These functions are referenced from stk500v2.c for JTAGICE3 in
|
* These functions are referenced from stk500v2.c for JTAGICE3 in
|
|
@ -96,7 +96,6 @@
|
||||||
#define SCOPE_GENERAL 0x01
|
#define SCOPE_GENERAL 0x01
|
||||||
#define SCOPE_AVR_ISP 0x11
|
#define SCOPE_AVR_ISP 0x11
|
||||||
#define SCOPE_AVR 0x12
|
#define SCOPE_AVR 0x12
|
||||||
#define SCOPE_AVR_TPI 0x14
|
|
||||||
|
|
||||||
/* Info scope */
|
/* Info scope */
|
||||||
#define CMD3_GET_INFO 0x00
|
#define CMD3_GET_INFO 0x00
|
||||||
|
@ -145,7 +144,6 @@
|
||||||
# define RSP3_FAIL_WRONG_MODE 0x32 /* progmode vs. non-prog */
|
# define RSP3_FAIL_WRONG_MODE 0x32 /* progmode vs. non-prog */
|
||||||
# define RSP3_FAIL_UNSUPP_MEMORY 0x34 /* unsupported memory type */
|
# define RSP3_FAIL_UNSUPP_MEMORY 0x34 /* unsupported memory type */
|
||||||
# define RSP3_FAIL_WRONG_LENGTH 0x35 /* wrong lenth for mem access */
|
# define RSP3_FAIL_WRONG_LENGTH 0x35 /* wrong lenth for mem access */
|
||||||
# define RSP3_FAIL_CRC_FAILURE 0x43 /* CRC failure in device */
|
|
||||||
# define RSP3_FAIL_OCD_LOCKED 0x44 /* device is locked */
|
# define RSP3_FAIL_OCD_LOCKED 0x44 /* device is locked */
|
||||||
# define RSP3_FAIL_NOT_UNDERSTOOD 0x91
|
# define RSP3_FAIL_NOT_UNDERSTOOD 0x91
|
||||||
|
|
||||||
|
@ -185,25 +183,14 @@
|
||||||
* precedes each parameter address. There are distinct parameter
|
* precedes each parameter address. There are distinct parameter
|
||||||
* sets for generic and AVR scope.
|
* sets for generic and AVR scope.
|
||||||
*/
|
*/
|
||||||
#define PARM3_HW_VER 0x00 /* section 0, generic scope, 1 byte */
|
#define PARM3_HW_VER 0x00 /* section 0, generic scope, 1 byte */
|
||||||
#define PARM3_FW_MAJOR 0x01 /* section 0, generic scope, 1 byte */
|
#define PARM3_FW_MAJOR 0x01 /* section 0, generic scope, 1 byte */
|
||||||
#define PARM3_FW_MINOR 0x02 /* section 0, generic scope, 1 byte */
|
#define PARM3_FW_MINOR 0x02 /* section 0, generic scope, 1 byte */
|
||||||
#define PARM3_FW_RELEASE 0x03 /* section 0, generic scope, 1 byte;
|
#define PARM3_FW_RELEASE 0x03 /* section 0, generic scope, 1 byte;
|
||||||
* always asked for by Atmel Studio,
|
* always asked for by Atmel Studio,
|
||||||
* but never displayed there */
|
* but never displayed there */
|
||||||
|
#define PARM3_VTARGET 0x00 /* section 1, generic scope, 2 bytes,
|
||||||
#define PARM3_VTARGET 0x00 /* section 1, generic scope, 2 bytes, in millivolts */
|
* in millivolts */
|
||||||
#define PARM3_VBUF 0x01 /* section 1, generic scope, 2 bytes, bufferred target voltage reference */
|
|
||||||
#define PARM3_VUSB 0x02 /* section 1, generic scope, 2 bytes, USB voltage */
|
|
||||||
#define PARM3_ANALOG_A_CURRENT 0x10 /* section 1, generic scope, 2 bytes, Ch A current in milliamps, Powerdebugger only */
|
|
||||||
#define PARM3_ANALOG_A_VOLTAGE 0x11 /* section 1, generic scope, 2 bytes, Ch A voltage in millivolts, Powerdebugger only */
|
|
||||||
#define PARM3_ANALOG_B_CURRENT 0x12 /* section 1, generic scope, 2 bytes, Ch B current in milliamps, Powerdebugger only */
|
|
||||||
#define PARM3_ANALOG_B_VOLTAGE 0x13 /* section 1, generic scope, 2 bytes, Ch V voltage in millivolts, Powerdebugger only */
|
|
||||||
#define PARM3_TSUP_VOLTAGE_MEAS 0x14 /* section 1, generic scope, 2 bytes, target voltage measurement in millivolts */
|
|
||||||
#define PARM3_USB_VOLTAGE_MEAS 0x15 /* section 1, generic scope, 2 bytes, USB voltage measurement in millivolts */
|
|
||||||
#define PARM3_VADJUST 0x20 /* section 1, generic scope, 2 bytes, set voltage in millivolts */
|
|
||||||
#define PARM3_ANALOG_STATUS 0x30 /* section 1, generic scope, 2 bytes, analog status */
|
|
||||||
|
|
||||||
#define PARM3_DEVICEDESC 0x00 /* section 2, memory etc. configuration,
|
#define PARM3_DEVICEDESC 0x00 /* section 2, memory etc. configuration,
|
||||||
* 31 bytes for tiny/mega AVR, 47 bytes
|
* 31 bytes for tiny/mega AVR, 47 bytes
|
||||||
* for Xmega; is also used in command
|
* for Xmega; is also used in command
|
||||||
|
@ -246,14 +233,6 @@
|
||||||
#define PARM3_OPT_12V_UPDI_ENABLE 0x06
|
#define PARM3_OPT_12V_UPDI_ENABLE 0x06
|
||||||
#define PARM3_OPT_CHIP_ERASE_TO_ENTER 0x07
|
#define PARM3_OPT_CHIP_ERASE_TO_ENTER 0x07
|
||||||
|
|
||||||
/*
|
|
||||||
* UPDI high-voltage enable modes
|
|
||||||
*/
|
|
||||||
#define PARM3_UPDI_HV_NONE 0x00 /* Do not use high-voltage */
|
|
||||||
#define PARM3_UPDI_HV_SIMPLE_PULSE 0x01 /* Issue a single high-voltage pulse immediately*/
|
|
||||||
#define PARM3_UPDI_HV_AUTO_POWER_TOGGLE 0x02 /* Toggle power automatically and then apply a high-voltage pulse */
|
|
||||||
#define PARM3_UPDI_HV_USER_POWER_TOGGLE 0x03 /* The user toggles power, and the tool applies a high-voltage pulse on power-up */
|
|
||||||
|
|
||||||
/* Xmega erase memory types, for CMND_XMEGA_ERASE */
|
/* Xmega erase memory types, for CMND_XMEGA_ERASE */
|
||||||
#define XMEGA_ERASE_CHIP 0x00
|
#define XMEGA_ERASE_CHIP 0x00
|
||||||
#define XMEGA_ERASE_APP 0x01
|
#define XMEGA_ERASE_APP 0x01
|
||||||
|
@ -315,60 +294,6 @@
|
||||||
#define UPDI_ADDRESS_MODE_24BIT 1
|
#define UPDI_ADDRESS_MODE_24BIT 1
|
||||||
#define FUSES_SYSCFG0_OFFSET 5
|
#define FUSES_SYSCFG0_OFFSET 5
|
||||||
|
|
||||||
// TPI Protocol commands
|
|
||||||
#define XPRG_CMD_ENTER_PROGMODE 0x01
|
|
||||||
#define XPRG_CMD_LEAVE_PROGMODE 0x02
|
|
||||||
#define XPRG_CMD_ERASE 0x03
|
|
||||||
#define XPRG_CMD_WRITE_MEM 0x04
|
|
||||||
#define XPRG_CMD_READ_MEM 0x05
|
|
||||||
#define XPRG_CMD_CRC 0x06
|
|
||||||
#define XPRG_CMD_SET_PARAM 0x07
|
|
||||||
|
|
||||||
// TPI Protocol responses
|
|
||||||
// Success
|
|
||||||
#define XPRG_ERR_OK 0x00
|
|
||||||
// Errors
|
|
||||||
#define XPRG_ERR_FAILED 0x01
|
|
||||||
#define XPRG_ERR_COLLISION 0x02
|
|
||||||
#define XPRG_ERR_TIMEOUT 0x03
|
|
||||||
#define XPRG_ERR_ILLEGAL_PARAM 0x04
|
|
||||||
#define XPRG_ERR_UNKNOWN_COMMAND 0x10
|
|
||||||
|
|
||||||
// TPI Memory types
|
|
||||||
#define XPRG_MEM_TYPE_APPL 0x01
|
|
||||||
#define XPRG_MEM_TYPE_BOOT 0x02
|
|
||||||
#define XPRG_MEM_TYPE_EEPROM 0x03
|
|
||||||
#define XPRG_MEM_TYPE_FUSE 0x04
|
|
||||||
#define XPRG_MEM_TYPE_LOCKBITS 0x05
|
|
||||||
#define XPRG_MEM_TYPE_USERSIG 0x06
|
|
||||||
#define XPRG_MEM_TYPE_FACTORY_CALIBRATION 0x07
|
|
||||||
|
|
||||||
// TPI Erase modes
|
|
||||||
#define XPRG_ERASE_CHIP 0x01
|
|
||||||
#define XPRG_ERASE_APP 0x02
|
|
||||||
#define XPRG_ERASE_BOOT 0x03
|
|
||||||
#define XPRG_ERASE_EEPROM 0x04
|
|
||||||
#define XPRG_ERASE_APP_PAGE 0x05
|
|
||||||
#define XPRG_ERASE_BOOT_PAGE 0x06
|
|
||||||
#define XPRG_ERASE_EEPROM_PAGE 0x07
|
|
||||||
#define XPRG_ERASE_USERSIG 0x08
|
|
||||||
// Erase types for Tiny XPROG
|
|
||||||
#define XPRG_ERASE_CONFIG 0x09
|
|
||||||
|
|
||||||
// TPI Parameters
|
|
||||||
// XPROG parameters of different sizes
|
|
||||||
// 4-byte address
|
|
||||||
#define XPRG_PARAM_NVMBASE 0x01
|
|
||||||
// 2-byte page size
|
|
||||||
#define XPRG_PARAM_EEPPAGESIZE 0x02
|
|
||||||
// tiny TPI, 1-byte address
|
|
||||||
#define XPRG_PARAM_NVMCMD_ADDR 0x03
|
|
||||||
#define XPRG_PARAM_NVMCSR_ADDR 0x04
|
|
||||||
|
|
||||||
#define TPI_NVMCMD_ADDRESS 0x33
|
|
||||||
#define TPI_NVMCSR_ADDRESS 0x32
|
|
||||||
|
|
||||||
|
|
||||||
#if !defined(JTAG3_PRIVATE_EXPORTED)
|
#if !defined(JTAG3_PRIVATE_EXPORTED)
|
||||||
|
|
||||||
struct mega_device_desc {
|
struct mega_device_desc {
|
||||||
|
@ -464,7 +389,5 @@ struct updi_device_desc {
|
||||||
unsigned char flash_page_size_msb; // Extends flash_page_size, used in 24-bit mode
|
unsigned char flash_page_size_msb; // Extends flash_page_size, used in 24-bit mode
|
||||||
|
|
||||||
unsigned char address_mode; // 0x00 = 16-bit mode, 0x01 = 24-bit mode
|
unsigned char address_mode; // 0x00 = 16-bit mode, 0x01 = 24-bit mode
|
||||||
|
|
||||||
unsigned char hvupdi_variant; // Indicates the target UPDI HV implementation
|
|
||||||
};
|
};
|
||||||
#endif /* JTAG3_PRIVATE_EXPORTED */
|
#endif /* JTAG3_PRIVATE_EXPORTED */
|
File diff suppressed because it is too large
Load Diff
|
@ -26,7 +26,7 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern const char jtagmkI_desc[];
|
extern const char jtagmkI_desc[];
|
||||||
void jtagmkI_initpgm(PROGRAMMER *pgm);
|
void jtagmkI_initpgm (PROGRAMMER * pgm);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -25,29 +25,27 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int jtagmkII_send(const PROGRAMMER *pgm, unsigned char *data, size_t len);
|
int jtagmkII_send(PROGRAMMER * pgm, unsigned char * data, size_t len);
|
||||||
int jtagmkII_recv(const PROGRAMMER *pgm, unsigned char **msg);
|
int jtagmkII_recv(PROGRAMMER * pgm, unsigned char **msg);
|
||||||
void jtagmkII_close(PROGRAMMER * pgm);
|
void jtagmkII_close(PROGRAMMER * pgm);
|
||||||
int jtagmkII_getsync(const PROGRAMMER *pgm, int mode);
|
int jtagmkII_getsync(PROGRAMMER * pgm, int mode);
|
||||||
int jtagmkII_getparm(const PROGRAMMER *pgm, unsigned char parm,
|
int jtagmkII_getparm(PROGRAMMER * pgm, unsigned char parm,
|
||||||
unsigned char * value);
|
unsigned char * value);
|
||||||
|
|
||||||
extern const char jtagmkII_desc[];
|
extern const char jtagmkII_desc[];
|
||||||
extern const char jtagmkII_avr32_desc[];
|
extern const char jtagmkII_avr32_desc[];
|
||||||
extern const char jtagmkII_dw_desc[];
|
extern const char jtagmkII_dw_desc[];
|
||||||
extern const char jtagmkII_pdi_desc[];
|
extern const char jtagmkII_pdi_desc[];
|
||||||
extern const char jtagmkII_updi_desc[];
|
|
||||||
extern const char jtagmkII_dragon_desc[];
|
extern const char jtagmkII_dragon_desc[];
|
||||||
extern const char jtagmkII_dragon_dw_desc[];
|
extern const char jtagmkII_dragon_dw_desc[];
|
||||||
extern const char jtagmkII_dragon_pdi_desc[];
|
extern const char jtagmkII_dragon_pdi_desc[];
|
||||||
void jtagmkII_initpgm(PROGRAMMER *pgm);
|
void jtagmkII_initpgm (PROGRAMMER * pgm);
|
||||||
void jtagmkII_avr32_initpgm(PROGRAMMER *pgm);
|
void jtagmkII_avr32_initpgm (PROGRAMMER * pgm);
|
||||||
void jtagmkII_dw_initpgm(PROGRAMMER *pgm);
|
void jtagmkII_dw_initpgm (PROGRAMMER * pgm);
|
||||||
void jtagmkII_pdi_initpgm(PROGRAMMER *pgm);
|
void jtagmkII_pdi_initpgm (PROGRAMMER * pgm);
|
||||||
void jtagmkII_updi_initpgm(PROGRAMMER *pgm);
|
void jtagmkII_dragon_initpgm (PROGRAMMER * pgm);
|
||||||
void jtagmkII_dragon_initpgm(PROGRAMMER *pgm);
|
void jtagmkII_dragon_dw_initpgm (PROGRAMMER * pgm);
|
||||||
void jtagmkII_dragon_dw_initpgm(PROGRAMMER *pgm);
|
void jtagmkII_dragon_pdi_initpgm (PROGRAMMER * pgm);
|
||||||
void jtagmkII_dragon_pdi_initpgm(PROGRAMMER *pgm);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* These functions are referenced from stk500v2.c for JTAG ICE mkII
|
* These functions are referenced from stk500v2.c for JTAG ICE mkII
|
|
@ -206,29 +206,6 @@
|
||||||
# define PAR_BAUD_57600 0x06
|
# define PAR_BAUD_57600 0x06
|
||||||
# define PAR_BAUD_115200 0x07
|
# define PAR_BAUD_115200 0x07
|
||||||
# define PAR_BAUD_14400 0x08
|
# define PAR_BAUD_14400 0x08
|
||||||
/* Extension to jtagmkII protocol: extra baud rates, standard series. */
|
|
||||||
# define PAR_BAUD_153600 0x09
|
|
||||||
# define PAR_BAUD_230400 0x0A
|
|
||||||
# define PAR_BAUD_460800 0x0B
|
|
||||||
# define PAR_BAUD_921600 0x0C
|
|
||||||
/* Extension to jtagmkII protocol: extra baud rates, binary series. */
|
|
||||||
# define PAR_BAUD_128000 0x0D
|
|
||||||
# define PAR_BAUD_256000 0x0E
|
|
||||||
# define PAR_BAUD_512000 0x0F
|
|
||||||
# define PAR_BAUD_1024000 0x10
|
|
||||||
/* Extension to jtagmkII protocol: extra baud rates, decimal series. */
|
|
||||||
# define PAR_BAUD_150000 0x11
|
|
||||||
# define PAR_BAUD_200000 0x12
|
|
||||||
# define PAR_BAUD_250000 0x13
|
|
||||||
# define PAR_BAUD_300000 0x14
|
|
||||||
# define PAR_BAUD_400000 0x15
|
|
||||||
# define PAR_BAUD_500000 0x16
|
|
||||||
# define PAR_BAUD_600000 0x17
|
|
||||||
# define PAR_BAUD_666666 0x18
|
|
||||||
# define PAR_BAUD_1000000 0x19
|
|
||||||
# define PAR_BAUD_1500000 0x1A
|
|
||||||
# define PAR_BAUD_2000000 0x1B
|
|
||||||
# define PAR_BAUD_3000000 0x1C
|
|
||||||
#define PAR_OCD_VTARGET 0x06
|
#define PAR_OCD_VTARGET 0x06
|
||||||
#define PAR_OCD_JTAG_CLK 0x07
|
#define PAR_OCD_JTAG_CLK 0x07
|
||||||
#define PAR_OCD_BREAK_CAUSE 0x08
|
#define PAR_OCD_BREAK_CAUSE 0x08
|
|
@ -0,0 +1,265 @@
|
||||||
|
/*
|
||||||
|
* avrdude - A Downloader/Uploader for AVR device programmers
|
||||||
|
* Copyright (C) 2000-2004 Brian S. Dean <bsd@bsdhome.com>
|
||||||
|
* Copyright (C) 2006 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
*
|
||||||
|
* 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, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
%{
|
||||||
|
/* need this for the call to atof() below */
|
||||||
|
#include <math.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#include "avrdude.h"
|
||||||
|
#include "libavrdude.h"
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include "config_gram.h"
|
||||||
|
|
||||||
|
#ifndef YYERRCODE
|
||||||
|
#define YYERRCODE 256
|
||||||
|
#endif
|
||||||
|
|
||||||
|
%}
|
||||||
|
|
||||||
|
DIGIT [0-9]
|
||||||
|
HEXDIGIT [0-9a-fA-F]
|
||||||
|
SIGN [+-]
|
||||||
|
|
||||||
|
%x strng
|
||||||
|
%x incl
|
||||||
|
%x comment
|
||||||
|
%option nounput
|
||||||
|
|
||||||
|
/* Bump resources for classic lex. */
|
||||||
|
%e2000
|
||||||
|
%p10000
|
||||||
|
%n1000
|
||||||
|
|
||||||
|
%%
|
||||||
|
|
||||||
|
#{SIGN}*{DIGIT}+ { yylval = number(yytext); return TKN_NUMBER; }
|
||||||
|
#{SIGN}*{DIGIT}+"."{DIGIT}* { yylval = number_real(yytext); return TKN_NUMBER_REAL; }
|
||||||
|
#{SIGN}*"."{DIGIT}* { yylval = number_real(yytext); return TKN_NUMBER_REAL; }
|
||||||
|
{DIGIT}+ { yylval = number(yytext); return TKN_NUMBER; }
|
||||||
|
{DIGIT}+"."{DIGIT}* { yylval = number_real(yytext); return TKN_NUMBER_REAL; }
|
||||||
|
"."{DIGIT}+ { yylval = number_real(yytext); return TKN_NUMBER_REAL; }
|
||||||
|
|
||||||
|
"\"" { string_buf_ptr = string_buf; BEGIN(strng); }
|
||||||
|
|
||||||
|
0x{HEXDIGIT}+ { yylval = hexnumber(yytext); return TKN_NUMBER; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# { /* The following eats '#' style comments to end of line */
|
||||||
|
BEGIN(comment); }
|
||||||
|
<comment>[^\n] { /* eat comments */ }
|
||||||
|
<comment>\n { lineno++; BEGIN(INITIAL); }
|
||||||
|
|
||||||
|
|
||||||
|
"/*" { /* The following eats multiline C style comments */
|
||||||
|
int c;
|
||||||
|
int comment_start;
|
||||||
|
|
||||||
|
comment_start = lineno;
|
||||||
|
while (1) {
|
||||||
|
while (((c = input()) != '*') && (c != EOF)) {
|
||||||
|
/* eat up text of comment, but keep counting lines */
|
||||||
|
if (c == '\n')
|
||||||
|
lineno++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (c == '*') {
|
||||||
|
while ((c = input()) == '*')
|
||||||
|
;
|
||||||
|
if (c == '/')
|
||||||
|
break; /* found the end */
|
||||||
|
}
|
||||||
|
|
||||||
|
if (c == EOF) {
|
||||||
|
yyerror("EOF in comment (started on line %d)", comment_start);
|
||||||
|
return YYERRCODE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
<strng>\" { *string_buf_ptr = 0; string_buf_ptr = string_buf;
|
||||||
|
yylval = string(string_buf_ptr); BEGIN(INITIAL); return TKN_STRING; }
|
||||||
|
<strng>\\n *string_buf_ptr++ = '\n';
|
||||||
|
<strng>\\t *string_buf_ptr++ = '\t';
|
||||||
|
<strng>\\r *string_buf_ptr++ = '\r';
|
||||||
|
<strng>\\b *string_buf_ptr++ = '\b';
|
||||||
|
<strng>\\f *string_buf_ptr++ = '\f';
|
||||||
|
<strng>\\(.|\n) *(string_buf_ptr++) = yytext[1];
|
||||||
|
<strng>[^\\\n\"]+ { char *yptr = yytext; while (*yptr)
|
||||||
|
*(string_buf_ptr++) = *(yptr++); }
|
||||||
|
|
||||||
|
<strng>\n { yyerror("unterminated character constant");
|
||||||
|
return YYERRCODE; }
|
||||||
|
|
||||||
|
allowfullpagebitstream { yylval=NULL; return K_ALLOWFULLPAGEBITSTREAM; }
|
||||||
|
avr910_devcode { yylval=NULL; return K_AVR910_DEVCODE; }
|
||||||
|
bank_size { yylval=NULL; return K_PAGE_SIZE; }
|
||||||
|
banked { yylval=NULL; return K_PAGED; }
|
||||||
|
baudrate { yylval=NULL; return K_BAUDRATE; }
|
||||||
|
blocksize { yylval=NULL; return K_BLOCKSIZE; }
|
||||||
|
bs2 { yylval=NULL; return K_BS2; }
|
||||||
|
buff { yylval=NULL; return K_BUFF; }
|
||||||
|
bytedelay { yylval=NULL; return K_BYTEDELAY; }
|
||||||
|
chip_erase { yylval=new_token(K_CHIP_ERASE); return K_CHIP_ERASE; }
|
||||||
|
chip_erase_delay { yylval=NULL; return K_CHIP_ERASE_DELAY; }
|
||||||
|
chiperasepolltimeout { yylval=NULL; return K_CHIPERASEPOLLTIMEOUT; }
|
||||||
|
chiperasepulsewidth { yylval=NULL; return K_CHIPERASEPULSEWIDTH; }
|
||||||
|
chiperasetime { yylval=NULL; return K_CHIPERASETIME; }
|
||||||
|
cmdexedelay { yylval=NULL; return K_CMDEXEDELAY; }
|
||||||
|
connection_type { yylval=NULL; return K_CONNTYPE; }
|
||||||
|
dedicated { yylval=new_token(K_DEDICATED); return K_DEDICATED; }
|
||||||
|
default_bitclock { yylval=NULL; return K_DEFAULT_BITCLOCK; }
|
||||||
|
default_parallel { yylval=NULL; return K_DEFAULT_PARALLEL; }
|
||||||
|
default_programmer { yylval=NULL; return K_DEFAULT_PROGRAMMER; }
|
||||||
|
default_safemode { yylval=NULL; return K_DEFAULT_SAFEMODE; }
|
||||||
|
default_serial { yylval=NULL; return K_DEFAULT_SERIAL; }
|
||||||
|
delay { yylval=NULL; return K_DELAY; }
|
||||||
|
desc { yylval=NULL; return K_DESC; }
|
||||||
|
family_id { yylval=NULL; return K_FAMILY_ID; }
|
||||||
|
devicecode { yylval=NULL; return K_DEVICECODE; }
|
||||||
|
eecr { yylval=NULL; return K_EECR; }
|
||||||
|
eeprom { yylval=NULL; return K_EEPROM; }
|
||||||
|
eeprom_instr { yylval=NULL; return K_EEPROM_INSTR; }
|
||||||
|
enablepageprogramming { yylval=NULL; return K_ENABLEPAGEPROGRAMMING; }
|
||||||
|
errled { yylval=NULL; return K_ERRLED; }
|
||||||
|
flash { yylval=NULL; return K_FLASH; }
|
||||||
|
flash_instr { yylval=NULL; return K_FLASH_INSTR; }
|
||||||
|
has_debugwire { yylval=NULL; return K_HAS_DW; }
|
||||||
|
has_jtag { yylval=NULL; return K_HAS_JTAG; }
|
||||||
|
has_pdi { yylval=NULL; return K_HAS_PDI; }
|
||||||
|
has_tpi { yylval=NULL; return K_HAS_TPI; }
|
||||||
|
has_updi { yylval=NULL; return K_HAS_UPDI; }
|
||||||
|
hventerstabdelay { yylval=NULL; return K_HVENTERSTABDELAY; }
|
||||||
|
hvleavestabdelay { yylval=NULL; return K_HVLEAVESTABDELAY; }
|
||||||
|
hvsp_controlstack { yylval=NULL; return K_HVSP_CONTROLSTACK; }
|
||||||
|
hvspcmdexedelay { yylval=NULL; return K_HVSPCMDEXEDELAY; }
|
||||||
|
id { yylval=NULL; return K_ID; }
|
||||||
|
idr { yylval=NULL; return K_IDR; }
|
||||||
|
io { yylval=new_token(K_IO); return K_IO; }
|
||||||
|
is_at90s1200 { yylval=NULL; return K_IS_AT90S1200; }
|
||||||
|
is_avr32 { yylval=NULL; return K_IS_AVR32; }
|
||||||
|
latchcycles { yylval=NULL; return K_LATCHCYCLES; }
|
||||||
|
load_ext_addr { yylval=new_token(K_LOAD_EXT_ADDR); return K_LOAD_EXT_ADDR; }
|
||||||
|
loadpage_hi { yylval=new_token(K_LOADPAGE_HI); return K_LOADPAGE_HI; }
|
||||||
|
loadpage_lo { yylval=new_token(K_LOADPAGE_LO); return K_LOADPAGE_LO; }
|
||||||
|
max_write_delay { yylval=NULL; return K_MAX_WRITE_DELAY; }
|
||||||
|
mcu_base { yylval=NULL; return K_MCU_BASE; }
|
||||||
|
memory { yylval=NULL; return K_MEMORY; }
|
||||||
|
min_write_delay { yylval=NULL; return K_MIN_WRITE_DELAY; }
|
||||||
|
miso { yylval=NULL; return K_MISO; }
|
||||||
|
mode { yylval=NULL; return K_MODE; }
|
||||||
|
mosi { yylval=NULL; return K_MOSI; }
|
||||||
|
no { yylval=new_token(K_NO); return K_NO; }
|
||||||
|
num_banks { yylval=NULL; return K_NUM_PAGES; }
|
||||||
|
num_pages { yylval=NULL; return K_NUM_PAGES; }
|
||||||
|
nvm_base { yylval=NULL; return K_NVM_BASE; }
|
||||||
|
ocd_base { yylval=NULL; return K_OCD_BASE; }
|
||||||
|
ocdrev { yylval=NULL; return K_OCDREV; }
|
||||||
|
offset { yylval=NULL; return K_OFFSET; }
|
||||||
|
page_size { yylval=NULL; return K_PAGE_SIZE; }
|
||||||
|
paged { yylval=NULL; return K_PAGED; }
|
||||||
|
pagel { yylval=NULL; return K_PAGEL; }
|
||||||
|
parallel { yylval=NULL; return K_PARALLEL; }
|
||||||
|
parent { yylval=NULL; return K_PARENT; }
|
||||||
|
part { yylval=NULL; return K_PART; }
|
||||||
|
pgm_enable { yylval=new_token(K_PGM_ENABLE); return K_PGM_ENABLE; }
|
||||||
|
pgmled { yylval=NULL; return K_PGMLED; }
|
||||||
|
pollindex { yylval=NULL; return K_POLLINDEX; }
|
||||||
|
pollmethod { yylval=NULL; return K_POLLMETHOD; }
|
||||||
|
pollvalue { yylval=NULL; return K_POLLVALUE; }
|
||||||
|
postdelay { yylval=NULL; return K_POSTDELAY; }
|
||||||
|
poweroffdelay { yylval=NULL; return K_POWEROFFDELAY; }
|
||||||
|
pp_controlstack { yylval=NULL; return K_PP_CONTROLSTACK; }
|
||||||
|
predelay { yylval=NULL; return K_PREDELAY; }
|
||||||
|
progmodedelay { yylval=NULL; return K_PROGMODEDELAY; }
|
||||||
|
programfusepolltimeout { yylval=NULL; return K_PROGRAMFUSEPOLLTIMEOUT; }
|
||||||
|
programfusepulsewidth { yylval=NULL; return K_PROGRAMFUSEPULSEWIDTH; }
|
||||||
|
programlockpolltimeout { yylval=NULL; return K_PROGRAMLOCKPOLLTIMEOUT; }
|
||||||
|
programlockpulsewidth { yylval=NULL; return K_PROGRAMLOCKPULSEWIDTH; }
|
||||||
|
programmer { yylval=NULL; return K_PROGRAMMER; }
|
||||||
|
pseudo { yylval=new_token(K_PSEUDO); return K_PSEUDO; }
|
||||||
|
pwroff_after_write { yylval=NULL; return K_PWROFF_AFTER_WRITE; }
|
||||||
|
rampz { yylval=NULL; return K_RAMPZ; }
|
||||||
|
rdyled { yylval=NULL; return K_RDYLED; }
|
||||||
|
read { yylval=new_token(K_READ); return K_READ; }
|
||||||
|
read_hi { yylval=new_token(K_READ_HI); return K_READ_HI; }
|
||||||
|
read_lo { yylval=new_token(K_READ_LO); return K_READ_LO; }
|
||||||
|
readback_p1 { yylval=NULL; return K_READBACK_P1; }
|
||||||
|
readback_p2 { yylval=NULL; return K_READBACK_P2; }
|
||||||
|
readsize { yylval=NULL; return K_READSIZE; }
|
||||||
|
reset { yylval=new_token(K_RESET); return K_RESET; }
|
||||||
|
resetdelay { yylval=NULL; return K_RESETDELAY; }
|
||||||
|
resetdelayms { yylval=NULL; return K_RESETDELAYMS; }
|
||||||
|
resetdelayus { yylval=NULL; return K_RESETDELAYUS; }
|
||||||
|
retry_pulse { yylval=NULL; return K_RETRY_PULSE; }
|
||||||
|
sck { yylval=new_token(K_SCK); return K_SCK; }
|
||||||
|
serial { yylval=NULL; return K_SERIAL; }
|
||||||
|
signature { yylval=NULL; return K_SIGNATURE; }
|
||||||
|
size { yylval=NULL; return K_SIZE; }
|
||||||
|
spmcr { yylval=NULL; return K_SPMCR; }
|
||||||
|
stabdelay { yylval=NULL; return K_STABDELAY; }
|
||||||
|
stk500_devcode { yylval=NULL; return K_STK500_DEVCODE; }
|
||||||
|
synchcycles { yylval=NULL; return K_SYNCHCYCLES; }
|
||||||
|
synchloops { yylval=NULL; return K_SYNCHLOOPS; }
|
||||||
|
timeout { yylval=NULL; return K_TIMEOUT; }
|
||||||
|
togglevtg { yylval=NULL; return K_TOGGLEVTG; }
|
||||||
|
type { yylval=NULL; return K_TYPE; }
|
||||||
|
usb { yylval=NULL; return K_USB; }
|
||||||
|
usbdev { yylval=NULL; return K_USBDEV; }
|
||||||
|
usbpid { yylval=NULL; return K_USBPID; }
|
||||||
|
usbproduct { yylval=NULL; return K_USBPRODUCT; }
|
||||||
|
usbsn { yylval=NULL; return K_USBSN; }
|
||||||
|
usbvendor { yylval=NULL; return K_USBVENDOR; }
|
||||||
|
usbvid { yylval=NULL; return K_USBVID; }
|
||||||
|
vcc { yylval=NULL; return K_VCC; }
|
||||||
|
vfyled { yylval=NULL; return K_VFYLED; }
|
||||||
|
write { yylval=new_token(K_WRITE); return K_WRITE; }
|
||||||
|
write_hi { yylval=new_token(K_WRITE_HI); return K_WRITE_HI; }
|
||||||
|
write_lo { yylval=new_token(K_WRITE_LO); return K_WRITE_LO; }
|
||||||
|
writepage { yylval=new_token(K_WRITEPAGE); return K_WRITEPAGE; }
|
||||||
|
yes { yylval=new_token(K_YES); return K_YES; }
|
||||||
|
|
||||||
|
"," { yylval = NULL; pyytext(); return TKN_COMMA; }
|
||||||
|
"=" { yylval = NULL; pyytext(); return TKN_EQUAL; }
|
||||||
|
";" { yylval = NULL; pyytext(); return TKN_SEMI; }
|
||||||
|
"~" { yylval = NULL; pyytext(); return TKN_TILDE; }
|
||||||
|
"(" { yylval = NULL; pyytext(); return TKN_LEFT_PAREN; }
|
||||||
|
")" { yylval = NULL; pyytext(); return TKN_RIGHT_PAREN; }
|
||||||
|
|
||||||
|
"\n" { lineno++; }
|
||||||
|
[ \r\t]+ { /* ignore whitespace */ }
|
||||||
|
|
||||||
|
c: { yyerror("possible old-style config file entry\n"
|
||||||
|
" Update your config file (see " CONFIG_DIR
|
||||||
|
"/avrdude.conf.sample for a sample)");
|
||||||
|
return YYERRCODE; }
|
||||||
|
|
||||||
|
. { return YYERRCODE; }
|
||||||
|
|
||||||
|
%%
|
||||||
|
|
|
@ -0,0 +1,952 @@
|
||||||
|
/*
|
||||||
|
* avrdude - A Downloader/Uploader for AVR device programmers
|
||||||
|
* Copyright (C) Joerg Wunsch
|
||||||
|
*
|
||||||
|
* 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, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
#ifndef libavrdude_h
|
||||||
|
#define libavrdude_h
|
||||||
|
|
||||||
|
/* XXX should go away */
|
||||||
|
#include "ac_cfg.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
/* lets try to select at least 32 bits */
|
||||||
|
#ifdef HAVE_STDINT_H
|
||||||
|
#include <stdint.h>
|
||||||
|
typedef uint32_t pinmask_t;
|
||||||
|
#else
|
||||||
|
#error Need a C99 capable compiler
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* formerly lists.h */
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------
|
||||||
|
General purpose linked list routines - header file declarations.
|
||||||
|
|
||||||
|
Author : Brian Dean
|
||||||
|
Date : 10 January, 1990
|
||||||
|
----------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
typedef void * LISTID;
|
||||||
|
typedef void * LNODEID;
|
||||||
|
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------
|
||||||
|
several defines to access the LIST structure as as stack or a queue
|
||||||
|
--- use for program readability
|
||||||
|
----------------------------------------------------------------------*/
|
||||||
|
#define STACKID LISTID
|
||||||
|
#define SNODEID LNODEID
|
||||||
|
#define QUEUEID LISTID
|
||||||
|
#define QNODEID LNODEID
|
||||||
|
|
||||||
|
|
||||||
|
#define PUSH(s,d) lins_n(s,d,1) /* push 'd' onto the stack */
|
||||||
|
#define POP(s) lrmv_n(s,1) /* pop the stack */
|
||||||
|
#define LOOKSTACK(s) lget_n(s,1) /* look at the top of the stack,
|
||||||
|
but don't pop */
|
||||||
|
|
||||||
|
|
||||||
|
#define ENQUEUE(q,d) lins_n(q,d,1) /* put 'd' on the end of the queue */
|
||||||
|
#define DEQUEUE(q) lrmv(q) /* remove next item from the front of
|
||||||
|
the queue */
|
||||||
|
#define REQUEUE(q,d) ladd(q,d) /* re-insert (push) item back on the
|
||||||
|
front of the queue */
|
||||||
|
#define LOOKQUEUE(q) lget(q) /* return next item on the queue,
|
||||||
|
but don't dequeue */
|
||||||
|
#define QUEUELEN(q) lsize(q) /* length of the queue */
|
||||||
|
|
||||||
|
|
||||||
|
#define LISTADD(l,d) ladd(l,d) /* add to end of the list */
|
||||||
|
#define LISTRMV(l,d) lrmv_d(l,d) /* remove from end of the list */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* .................... Function Prototypes .................... */
|
||||||
|
|
||||||
|
LISTID lcreat ( void * liststruct, int poolsize );
|
||||||
|
void ldestroy ( LISTID lid );
|
||||||
|
void ldestroy_cb ( LISTID lid, void (*ucleanup)(void * data_ptr) );
|
||||||
|
|
||||||
|
LNODEID lfirst ( LISTID ); /* head of the list */
|
||||||
|
LNODEID llast ( LISTID ); /* tail of the list */
|
||||||
|
LNODEID lnext ( LNODEID ); /* next item in the list */
|
||||||
|
LNODEID lprev ( LNODEID ); /* previous item in the list */
|
||||||
|
void * ldata ( LNODEID ); /* data at the current position */
|
||||||
|
int lsize ( LISTID ); /* number of elements in the list */
|
||||||
|
|
||||||
|
int ladd ( LISTID lid, void * p );
|
||||||
|
int laddo ( LISTID lid, void *p,
|
||||||
|
int (*compare)(const void *p1,const void *p2),
|
||||||
|
LNODEID * firstdup );
|
||||||
|
int laddu ( LISTID lid, void * p,
|
||||||
|
int (*compare)(const void *p1,const void *p2));
|
||||||
|
int lins_n ( LISTID lid, void * d, unsigned int n );
|
||||||
|
int lins_ln ( LISTID lid, LNODEID lnid, void * data_ptr );
|
||||||
|
|
||||||
|
void * lget ( LISTID lid );
|
||||||
|
void * lget_n ( LISTID lid, unsigned int n );
|
||||||
|
LNODEID lget_ln ( LISTID lid, unsigned int n );
|
||||||
|
|
||||||
|
void * lrmv ( LISTID lid );
|
||||||
|
void * lrmv_n ( LISTID lid, unsigned int n );
|
||||||
|
void * lrmv_ln ( LISTID lid, LNODEID lnid );
|
||||||
|
void * lrmv_d ( LISTID lid, void * data_ptr );
|
||||||
|
|
||||||
|
LISTID lcat ( LISTID lid1, LISTID lid2 );
|
||||||
|
|
||||||
|
void lsort ( LISTID lid, int (*compare)(void * p1, void * p2));
|
||||||
|
|
||||||
|
void * lsrch ( LISTID lid, void * p, int (*compare)(void *p1,void *p2));
|
||||||
|
|
||||||
|
int lprint ( FILE * f, LISTID lid );
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* formerly avrpart.h */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* AVR serial programming instructions
|
||||||
|
*/
|
||||||
|
enum {
|
||||||
|
AVR_OP_READ,
|
||||||
|
AVR_OP_WRITE,
|
||||||
|
AVR_OP_READ_LO,
|
||||||
|
AVR_OP_READ_HI,
|
||||||
|
AVR_OP_WRITE_LO,
|
||||||
|
AVR_OP_WRITE_HI,
|
||||||
|
AVR_OP_LOADPAGE_LO,
|
||||||
|
AVR_OP_LOADPAGE_HI,
|
||||||
|
AVR_OP_LOAD_EXT_ADDR,
|
||||||
|
AVR_OP_WRITEPAGE,
|
||||||
|
AVR_OP_CHIP_ERASE,
|
||||||
|
AVR_OP_PGM_ENABLE,
|
||||||
|
AVR_OP_MAX
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
enum {
|
||||||
|
AVR_CMDBIT_IGNORE, /* bit is ignored on input and output */
|
||||||
|
AVR_CMDBIT_VALUE, /* bit is set to 0 or 1 for input or output */
|
||||||
|
AVR_CMDBIT_ADDRESS, /* this bit represents an input address bit */
|
||||||
|
AVR_CMDBIT_INPUT, /* this bit is an input bit */
|
||||||
|
AVR_CMDBIT_OUTPUT /* this bit is an output bit */
|
||||||
|
};
|
||||||
|
|
||||||
|
enum { /* these are assigned to reset_disposition of AVRPART */
|
||||||
|
RESET_DEDICATED, /* reset pin is dedicated */
|
||||||
|
RESET_IO /* reset pin might be configured as an I/O pin */
|
||||||
|
};
|
||||||
|
|
||||||
|
enum ctl_stack_t {
|
||||||
|
CTL_STACK_NONE, /* no control stack defined */
|
||||||
|
CTL_STACK_PP, /* parallel programming control stack */
|
||||||
|
CTL_STACK_HVSP /* high voltage serial programming control stack */
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* serial programming instruction bit specifications
|
||||||
|
*/
|
||||||
|
typedef struct cmdbit {
|
||||||
|
int type; /* AVR_CMDBIT_* */
|
||||||
|
int bitno; /* which input bit to use for this command bit */
|
||||||
|
int value; /* bit value if type == AVR_CMDBIT_VALUD */
|
||||||
|
} CMDBIT;
|
||||||
|
|
||||||
|
typedef struct opcode {
|
||||||
|
CMDBIT bit[32]; /* opcode bit specs */
|
||||||
|
} OPCODE;
|
||||||
|
|
||||||
|
|
||||||
|
#define AVRPART_SERIALOK 0x0001 /* part supports serial programming */
|
||||||
|
#define AVRPART_PARALLELOK 0x0002 /* part supports parallel programming */
|
||||||
|
#define AVRPART_PSEUDOPARALLEL 0x0004 /* part has pseudo parallel support */
|
||||||
|
#define AVRPART_HAS_JTAG 0x0008 /* part has a JTAG i/f */
|
||||||
|
#define AVRPART_ALLOWFULLPAGEBITSTREAM 0x0010 /* JTAG ICE mkII param. */
|
||||||
|
#define AVRPART_ENABLEPAGEPROGRAMMING 0x0020 /* JTAG ICE mkII param. */
|
||||||
|
#define AVRPART_HAS_DW 0x0040 /* part has a debugWire i/f */
|
||||||
|
#define AVRPART_HAS_PDI 0x0080 /* part has PDI i/f rather than ISP (ATxmega) */
|
||||||
|
#define AVRPART_AVR32 0x0100 /* part is in AVR32 family */
|
||||||
|
#define AVRPART_INIT_SMC 0x0200 /* part will undergo chip erase */
|
||||||
|
#define AVRPART_WRITE 0x0400 /* at least one write operation specified */
|
||||||
|
#define AVRPART_HAS_TPI 0x0800 /* part has TPI i/f rather than ISP (ATtiny4/5/9/10) */
|
||||||
|
#define AVRPART_IS_AT90S1200 0x1000 /* part is an AT90S1200 (needs special treatment) */
|
||||||
|
#define AVRPART_HAS_UPDI 0x2000 /* part has UPDI i/f (AVR8X) */
|
||||||
|
|
||||||
|
#define AVR_DESCLEN 64
|
||||||
|
#define AVR_IDLEN 32
|
||||||
|
#define AVR_FAMILYIDLEN 7
|
||||||
|
#define AVR_SIBLEN 16
|
||||||
|
#define CTL_STACK_SIZE 32
|
||||||
|
#define FLASH_INSTR_SIZE 3
|
||||||
|
#define EEPROM_INSTR_SIZE 20
|
||||||
|
|
||||||
|
#define TAG_ALLOCATED 1 /* memory byte is allocated */
|
||||||
|
|
||||||
|
typedef struct avrpart {
|
||||||
|
char desc[AVR_DESCLEN]; /* long part name */
|
||||||
|
char id[AVR_IDLEN]; /* short part name */
|
||||||
|
char family_id[AVR_FAMILYIDLEN+1]; /* family id in the SIB (avr8x) */
|
||||||
|
int stk500_devcode; /* stk500 device code */
|
||||||
|
int avr910_devcode; /* avr910 device code */
|
||||||
|
int chip_erase_delay; /* microseconds */
|
||||||
|
unsigned char pagel; /* for parallel programming */
|
||||||
|
unsigned char bs2; /* for parallel programming */
|
||||||
|
unsigned char signature[3]; /* expected value of signature bytes */
|
||||||
|
unsigned short usbpid; /* USB DFU product ID (0 = none) */
|
||||||
|
int reset_disposition; /* see RESET_ enums */
|
||||||
|
int retry_pulse; /* retry program enable by pulsing
|
||||||
|
this pin (PIN_AVR_*) */
|
||||||
|
unsigned flags; /* see AVRPART_ masks */
|
||||||
|
|
||||||
|
int timeout; /* stk500 v2 xml file parameter */
|
||||||
|
int stabdelay; /* stk500 v2 xml file parameter */
|
||||||
|
int cmdexedelay; /* stk500 v2 xml file parameter */
|
||||||
|
int synchloops; /* stk500 v2 xml file parameter */
|
||||||
|
int bytedelay; /* stk500 v2 xml file parameter */
|
||||||
|
int pollindex; /* stk500 v2 xml file parameter */
|
||||||
|
unsigned char pollvalue; /* stk500 v2 xml file parameter */
|
||||||
|
int predelay; /* stk500 v2 xml file parameter */
|
||||||
|
int postdelay; /* stk500 v2 xml file parameter */
|
||||||
|
int pollmethod; /* stk500 v2 xml file parameter */
|
||||||
|
|
||||||
|
enum ctl_stack_t ctl_stack_type; /* what to use the ctl stack for */
|
||||||
|
unsigned char controlstack[CTL_STACK_SIZE]; /* stk500v2 PP/HVSP ctl stack */
|
||||||
|
unsigned char flash_instr[FLASH_INSTR_SIZE]; /* flash instructions (debugWire, JTAG) */
|
||||||
|
unsigned char eeprom_instr[EEPROM_INSTR_SIZE]; /* EEPROM instructions (debugWire, JTAG) */
|
||||||
|
|
||||||
|
int hventerstabdelay; /* stk500 v2 hv mode parameter */
|
||||||
|
int progmodedelay; /* stk500 v2 hv mode parameter */
|
||||||
|
int latchcycles; /* stk500 v2 hv mode parameter */
|
||||||
|
int togglevtg; /* stk500 v2 hv mode parameter */
|
||||||
|
int poweroffdelay; /* stk500 v2 hv mode parameter */
|
||||||
|
int resetdelayms; /* stk500 v2 hv mode parameter */
|
||||||
|
int resetdelayus; /* stk500 v2 hv mode parameter */
|
||||||
|
int hvleavestabdelay; /* stk500 v2 hv mode parameter */
|
||||||
|
int resetdelay; /* stk500 v2 hv mode parameter */
|
||||||
|
int chiperasepulsewidth; /* stk500 v2 hv mode parameter */
|
||||||
|
int chiperasepolltimeout; /* stk500 v2 hv mode parameter */
|
||||||
|
int chiperasetime; /* stk500 v2 hv mode parameter */
|
||||||
|
int programfusepulsewidth; /* stk500 v2 hv mode parameter */
|
||||||
|
int programfusepolltimeout; /* stk500 v2 hv mode parameter */
|
||||||
|
int programlockpulsewidth; /* stk500 v2 hv mode parameter */
|
||||||
|
int programlockpolltimeout; /* stk500 v2 hv mode parameter */
|
||||||
|
int synchcycles; /* stk500 v2 hv mode parameter */
|
||||||
|
int hvspcmdexedelay; /* stk500 v2 xml file parameter */
|
||||||
|
|
||||||
|
unsigned char idr; /* JTAG ICE mkII XML file parameter */
|
||||||
|
unsigned char rampz; /* JTAG ICE mkII XML file parameter */
|
||||||
|
unsigned char spmcr; /* JTAG ICE mkII XML file parameter */
|
||||||
|
unsigned short eecr; /* JTAC ICE mkII XML file parameter */
|
||||||
|
unsigned int mcu_base; /* Base address of MCU control block in ATxmega devices */
|
||||||
|
unsigned int nvm_base; /* Base address of NVM controller in ATxmega devices */
|
||||||
|
unsigned int ocd_base; /* Base address of OCD module in AVR8X/UPDI devices */
|
||||||
|
int ocdrev; /* OCD revision (JTAGICE3 parameter, from AS6 XML files) */
|
||||||
|
|
||||||
|
OPCODE * op[AVR_OP_MAX]; /* opcodes */
|
||||||
|
|
||||||
|
LISTID mem; /* avr memory definitions */
|
||||||
|
char config_file[PATH_MAX]; /* config file where defined */
|
||||||
|
int lineno; /* config file line number */
|
||||||
|
} AVRPART;
|
||||||
|
|
||||||
|
#define AVR_MEMDESCLEN 64
|
||||||
|
typedef struct avrmem {
|
||||||
|
char desc[AVR_MEMDESCLEN]; /* memory description ("flash", "eeprom", etc) */
|
||||||
|
int paged; /* page addressed (e.g. ATmega flash) */
|
||||||
|
int size; /* total memory size in bytes */
|
||||||
|
int page_size; /* size of memory page (if page addressed) */
|
||||||
|
int num_pages; /* number of pages (if page addressed) */
|
||||||
|
unsigned int offset; /* offset in IO memory (ATxmega) */
|
||||||
|
int min_write_delay; /* microseconds */
|
||||||
|
int max_write_delay; /* microseconds */
|
||||||
|
int pwroff_after_write; /* after this memory type is written to,
|
||||||
|
the device must be powered off and
|
||||||
|
back on, see errata
|
||||||
|
http://www.atmel.com/dyn/resources/prod_documents/doc1280.pdf */
|
||||||
|
unsigned char readback[2]; /* polled read-back values */
|
||||||
|
|
||||||
|
int mode; /* stk500 v2 xml file parameter */
|
||||||
|
int delay; /* stk500 v2 xml file parameter */
|
||||||
|
int blocksize; /* stk500 v2 xml file parameter */
|
||||||
|
int readsize; /* stk500 v2 xml file parameter */
|
||||||
|
int pollindex; /* stk500 v2 xml file parameter */
|
||||||
|
|
||||||
|
unsigned char * buf; /* pointer to memory buffer */
|
||||||
|
unsigned char * tags; /* allocation tags */
|
||||||
|
OPCODE * op[AVR_OP_MAX]; /* opcodes */
|
||||||
|
} AVRMEM;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Functions for OPCODE structures */
|
||||||
|
OPCODE * avr_new_opcode(void);
|
||||||
|
void avr_free_opcode(OPCODE * op);
|
||||||
|
int avr_set_bits(OPCODE * op, unsigned char * cmd);
|
||||||
|
int avr_set_addr(OPCODE * op, unsigned char * cmd, unsigned long addr);
|
||||||
|
int avr_set_input(OPCODE * op, unsigned char * cmd, unsigned char data);
|
||||||
|
int avr_get_output(OPCODE * op, unsigned char * res, unsigned char * data);
|
||||||
|
int avr_get_output_index(OPCODE * op);
|
||||||
|
|
||||||
|
/* Functions for AVRMEM structures */
|
||||||
|
AVRMEM * avr_new_memtype(void);
|
||||||
|
int avr_initmem(AVRPART * p);
|
||||||
|
AVRMEM * avr_dup_mem(AVRMEM * m);
|
||||||
|
void avr_free_mem(AVRMEM * m);
|
||||||
|
AVRMEM * avr_locate_mem(AVRPART * p, char * desc);
|
||||||
|
void avr_mem_display(const char * prefix, FILE * f, AVRMEM * m, int type,
|
||||||
|
int verbose);
|
||||||
|
|
||||||
|
/* Functions for AVRPART structures */
|
||||||
|
AVRPART * avr_new_part(void);
|
||||||
|
AVRPART * avr_dup_part(AVRPART * d);
|
||||||
|
void avr_free_part(AVRPART * d);
|
||||||
|
AVRPART * locate_part(LISTID parts, char * partdesc);
|
||||||
|
AVRPART * locate_part_by_avr910_devcode(LISTID parts, int devcode);
|
||||||
|
AVRPART * locate_part_by_signature(LISTID parts, unsigned char * sig,
|
||||||
|
int sigsize);
|
||||||
|
void avr_display(FILE * f, AVRPART * p, const char * prefix, int verbose);
|
||||||
|
|
||||||
|
typedef void (*walk_avrparts_cb)(const char *name, const char *desc,
|
||||||
|
const char *cfgname, int cfglineno,
|
||||||
|
void *cookie);
|
||||||
|
void walk_avrparts(LISTID avrparts, walk_avrparts_cb cb, void *cookie);
|
||||||
|
void sort_avrparts(LISTID avrparts);
|
||||||
|
|
||||||
|
int compare_memory_masked(AVRMEM * m, uint8_t buf1, uint8_t buf2);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* formerly pindefs.h */
|
||||||
|
|
||||||
|
enum {
|
||||||
|
PPI_AVR_VCC = 1,
|
||||||
|
PPI_AVR_BUFF,
|
||||||
|
PIN_AVR_RESET,
|
||||||
|
PIN_AVR_SCK,
|
||||||
|
PIN_AVR_MOSI,
|
||||||
|
PIN_AVR_MISO,
|
||||||
|
PIN_LED_ERR,
|
||||||
|
PIN_LED_RDY,
|
||||||
|
PIN_LED_PGM,
|
||||||
|
PIN_LED_VFY,
|
||||||
|
N_PINS
|
||||||
|
};
|
||||||
|
|
||||||
|
#define PIN_MASK (UINT_MAX>>1)
|
||||||
|
#define PIN_INVERSE (~(PIN_MASK)) /* flag for inverted pin in serbb */
|
||||||
|
#define PIN_MIN 0 /* smallest allowed pin number */
|
||||||
|
#define PIN_MAX 31 /* largest allowed pin number */
|
||||||
|
|
||||||
|
#ifdef HAVE_LINUXGPIO
|
||||||
|
/* Embedded systems might have a lot more gpio than only 0-31 */
|
||||||
|
#undef PIN_MAX
|
||||||
|
#define PIN_MAX 400 /* largest allowed pin number */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Number of pins in each element of the bitfield */
|
||||||
|
#define PIN_FIELD_ELEMENT_SIZE (sizeof(pinmask_t) * 8)
|
||||||
|
/** Numer of elements to store the complete bitfield of all pins */
|
||||||
|
#define PIN_FIELD_SIZE ((PIN_MAX + PIN_FIELD_ELEMENT_SIZE)/PIN_FIELD_ELEMENT_SIZE)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This sets the corresponding bits to 1 or 0, the inverse mask is used to invert the value in necessary.
|
||||||
|
* It uses only the lowest element (index=0) of the bitfield, which should be enough for most
|
||||||
|
* programmers.
|
||||||
|
*
|
||||||
|
* @param[in] x input value
|
||||||
|
* @param[in] pgm the programmer whose pin definitions to use
|
||||||
|
* @param[in] pinname the logical name of the pin (PIN_AVR_*, ...)
|
||||||
|
* @param[in] level the logical level (level != 0 => 1, level == 0 => 0),
|
||||||
|
* if the pin is defined as inverted the resulting bit is also inverted
|
||||||
|
* @returns the input value with the relevant bits modified
|
||||||
|
*/
|
||||||
|
#define SET_BITS_0(x,pgm,pinname,level) (((x) & ~(pgm)->pin[pinname].mask[0]) \
|
||||||
|
| (\
|
||||||
|
(pgm)->pin[pinname].mask[0] & ( \
|
||||||
|
(level) \
|
||||||
|
?~((pgm)->pin[pinname].inverse[0]) \
|
||||||
|
: ((pgm)->pin[pinname].inverse[0]) \
|
||||||
|
) \
|
||||||
|
) \
|
||||||
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the corresponding bit is set (returns != 0) or cleared.
|
||||||
|
* The inverse mask is used, to invert the relevant bits.
|
||||||
|
* If the pin definition contains multiple pins, then a single set pin leads to return value != 0.
|
||||||
|
* Then you have to check the relevant bits of the returned value, if you need more information.
|
||||||
|
* It uses only the lowest element (index=0) of the bitfield, which should be enough for most
|
||||||
|
* programmers.
|
||||||
|
*
|
||||||
|
* @param[in] x input value
|
||||||
|
* @param[in] pgm the programmer whose pin definitions to use
|
||||||
|
* @param[in] pinname the logical name of the pin (PIN_AVR_*, ...)
|
||||||
|
* @returns the input value with only the relevant bits (which are already inverted,
|
||||||
|
* so you get always the logical level)
|
||||||
|
*/
|
||||||
|
#define GET_BITS_0(x,pgm,pinname) (((x) ^ (pgm)->pin[pinname].inverse[0]) & (pgm)->pin[pinname].mask[0])
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data structure to hold used pins by logical function (PIN_AVR_*, ...)
|
||||||
|
*/
|
||||||
|
struct pindef_t {
|
||||||
|
pinmask_t mask[PIN_FIELD_SIZE]; ///< bitfield of used pins
|
||||||
|
pinmask_t inverse[PIN_FIELD_SIZE]; ///< bitfield of inverse/normal usage of used pins
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data structure to define a checklist of valid pins for each function.
|
||||||
|
*/
|
||||||
|
struct pin_checklist_t {
|
||||||
|
int pinname; ///< logical pinname eg. PIN_AVR_SCK
|
||||||
|
int mandatory; ///< is this a mandatory pin
|
||||||
|
const struct pindef_t* valid_pins; ///< mask defines allowed pins, inverse define is they might be used inverted
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a pin in the pin definition as normal or inverse pin.
|
||||||
|
*
|
||||||
|
* @param[out] pindef pin definition to update
|
||||||
|
* @param[in] pin number of pin [0..PIN_MAX]
|
||||||
|
* @param[in] inverse inverse (true) or normal (false) pin
|
||||||
|
*/
|
||||||
|
void pin_set_value(struct pindef_t * const pindef, const int pin, const bool inverse);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear all defined pins in pindef.
|
||||||
|
*
|
||||||
|
* @param[out] pindef pin definition to clear
|
||||||
|
*/
|
||||||
|
void pin_clear_all(struct pindef_t * const pindef);
|
||||||
|
|
||||||
|
struct programmer_t; /* forward declaration */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert for given programmer new pin definitions to old pin definitions.
|
||||||
|
*
|
||||||
|
* @param[inout] pgm programmer whose pins shall be converted.
|
||||||
|
*/
|
||||||
|
int pgm_fill_old_pins(struct programmer_t * const pgm);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function checks all pin of pgm against the constraints given in the checklist.
|
||||||
|
* It checks if
|
||||||
|
* @li any invalid pins are used
|
||||||
|
* @li valid pins are used inverted when not allowed
|
||||||
|
* @li any pins are used by more than one function
|
||||||
|
* @li any mandatory pin is not set all.
|
||||||
|
*
|
||||||
|
* In case of any error it report the wrong function and the pin numbers.
|
||||||
|
* For verbose >= 2 it also reports the possible correct values.
|
||||||
|
* For verbose >=3 it shows also which pins were ok.
|
||||||
|
*
|
||||||
|
* @param[in] pgm the programmer to check
|
||||||
|
* @param[in] checklist the constraint for the pins
|
||||||
|
* @param[in] size the number of entries in checklist
|
||||||
|
* @param[in] output false suppresses error messages to the user
|
||||||
|
* @returns 0 if all pin definitions are valid, -1 otherwise
|
||||||
|
*/
|
||||||
|
int pins_check(const struct programmer_t * const pgm, const struct pin_checklist_t * const checklist, const int size, const bool output);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the name of the pin as string.
|
||||||
|
*
|
||||||
|
* @param pinname the pinname which we want as string.
|
||||||
|
* @returns a string with the pinname, or <unknown> if pinname is invalid.
|
||||||
|
*/
|
||||||
|
const char * avr_pin_name(int pinname);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function returns a string representation of defined pins eg. ~1,2,~4,~5,7
|
||||||
|
* Another execution of this function will overwrite the previous result in the static buffer.
|
||||||
|
*
|
||||||
|
* @param[in] pindef the pin definition for which we want the string representation
|
||||||
|
* @returns pointer to a static string.
|
||||||
|
*/
|
||||||
|
const char * pins_to_str(const struct pindef_t * const pindef);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function returns a string representation of pins in the mask eg. 1,3,5-7,9,12
|
||||||
|
* Another execution of this function will overwrite the previous result in the static buffer.
|
||||||
|
* Consecutive pin number are representated as start-end.
|
||||||
|
*
|
||||||
|
* @param[in] pinmask the pin mask for which we want the string representation
|
||||||
|
* @returns pointer to a static string.
|
||||||
|
*/
|
||||||
|
const char * pinmask_to_str(const pinmask_t * const pinmask);
|
||||||
|
|
||||||
|
/* formerly serial.h */
|
||||||
|
|
||||||
|
/* This is the API for the generic serial interface. The implementations are
|
||||||
|
actually provided by the target dependant files:
|
||||||
|
|
||||||
|
ser_posix.c : posix serial interface.
|
||||||
|
ser_win32.c : native win32 serial interface.
|
||||||
|
|
||||||
|
The target file will be selected at configure time. */
|
||||||
|
|
||||||
|
extern long serial_recv_timeout;
|
||||||
|
union filedescriptor
|
||||||
|
{
|
||||||
|
int ifd;
|
||||||
|
void *pfd;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
void *handle;
|
||||||
|
int rep; /* bulk read endpoint */
|
||||||
|
int wep; /* bulk write endpoint */
|
||||||
|
int eep; /* event read endpoint */
|
||||||
|
int max_xfer; /* max transfer size */
|
||||||
|
int use_interrupt_xfer; /* device uses interrupt transfers */
|
||||||
|
} usb;
|
||||||
|
};
|
||||||
|
|
||||||
|
union pinfo
|
||||||
|
{
|
||||||
|
long baud;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
unsigned short vid;
|
||||||
|
unsigned short pid;
|
||||||
|
unsigned short flags;
|
||||||
|
#define PINFO_FL_USEHID 0x0001
|
||||||
|
#define PINFO_FL_SILENT 0x0002 /* don't complain if not found */
|
||||||
|
} usbinfo;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct serial_device
|
||||||
|
{
|
||||||
|
// open should return -1 on error, other values on success
|
||||||
|
int (*open)(char * port, union pinfo pinfo, union filedescriptor *fd);
|
||||||
|
int (*setspeed)(union filedescriptor *fd, long baud);
|
||||||
|
void (*close)(union filedescriptor *fd);
|
||||||
|
|
||||||
|
int (*send)(union filedescriptor *fd, const unsigned char * buf, size_t buflen);
|
||||||
|
int (*recv)(union filedescriptor *fd, unsigned char * buf, size_t buflen);
|
||||||
|
int (*drain)(union filedescriptor *fd, int display);
|
||||||
|
|
||||||
|
int (*set_dtr_rts)(union filedescriptor *fd, int is_on);
|
||||||
|
|
||||||
|
int flags;
|
||||||
|
#define SERDEV_FL_NONE 0x0000 /* no flags */
|
||||||
|
#define SERDEV_FL_CANSETSPEED 0x0001 /* device can change speed */
|
||||||
|
};
|
||||||
|
|
||||||
|
extern struct serial_device *serdev;
|
||||||
|
extern struct serial_device serial_serdev;
|
||||||
|
extern struct serial_device usb_serdev;
|
||||||
|
extern struct serial_device usb_serdev_frame;
|
||||||
|
extern struct serial_device avrdoper_serdev;
|
||||||
|
extern struct serial_device usbhid_serdev;
|
||||||
|
|
||||||
|
#define serial_open (serdev->open)
|
||||||
|
#define serial_setspeed (serdev->setspeed)
|
||||||
|
#define serial_close (serdev->close)
|
||||||
|
#define serial_send (serdev->send)
|
||||||
|
#define serial_recv (serdev->recv)
|
||||||
|
#define serial_drain (serdev->drain)
|
||||||
|
#define serial_set_dtr_rts (serdev->set_dtr_rts)
|
||||||
|
|
||||||
|
/* formerly pgm.h */
|
||||||
|
|
||||||
|
#define ON 1
|
||||||
|
#define OFF 0
|
||||||
|
|
||||||
|
#define PGM_DESCLEN 80
|
||||||
|
#define PGM_PORTLEN PATH_MAX
|
||||||
|
#define PGM_TYPELEN 32
|
||||||
|
#define PGM_USBSTRINGLEN 256
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
EXIT_VCC_UNSPEC,
|
||||||
|
EXIT_VCC_ENABLED,
|
||||||
|
EXIT_VCC_DISABLED
|
||||||
|
} exit_vcc_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
EXIT_RESET_UNSPEC,
|
||||||
|
EXIT_RESET_ENABLED,
|
||||||
|
EXIT_RESET_DISABLED
|
||||||
|
} exit_reset_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
EXIT_DATAHIGH_UNSPEC,
|
||||||
|
EXIT_DATAHIGH_ENABLED,
|
||||||
|
EXIT_DATAHIGH_DISABLED
|
||||||
|
} exit_datahigh_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
CONNTYPE_PARALLEL,
|
||||||
|
CONNTYPE_SERIAL,
|
||||||
|
CONNTYPE_USB
|
||||||
|
} conntype_t;
|
||||||
|
|
||||||
|
typedef struct programmer_t {
|
||||||
|
LISTID id;
|
||||||
|
char desc[PGM_DESCLEN];
|
||||||
|
char type[PGM_TYPELEN];
|
||||||
|
char port[PGM_PORTLEN];
|
||||||
|
void (*initpgm)(struct programmer_t * pgm);
|
||||||
|
unsigned int pinno[N_PINS];
|
||||||
|
struct pindef_t pin[N_PINS];
|
||||||
|
exit_vcc_t exit_vcc;
|
||||||
|
exit_reset_t exit_reset;
|
||||||
|
exit_datahigh_t exit_datahigh;
|
||||||
|
conntype_t conntype;
|
||||||
|
int ppidata;
|
||||||
|
int ppictrl;
|
||||||
|
int baudrate;
|
||||||
|
int usbvid;
|
||||||
|
LISTID usbpid;
|
||||||
|
char usbdev[PGM_USBSTRINGLEN], usbsn[PGM_USBSTRINGLEN];
|
||||||
|
char usbvendor[PGM_USBSTRINGLEN], usbproduct[PGM_USBSTRINGLEN];
|
||||||
|
double bitclock; /* JTAG ICE clock period in microseconds */
|
||||||
|
int ispdelay; /* ISP clock delay */
|
||||||
|
union filedescriptor fd;
|
||||||
|
int page_size; /* page size if the programmer supports paged write/load */
|
||||||
|
int (*rdy_led) (struct programmer_t * pgm, int value);
|
||||||
|
int (*err_led) (struct programmer_t * pgm, int value);
|
||||||
|
int (*pgm_led) (struct programmer_t * pgm, int value);
|
||||||
|
int (*vfy_led) (struct programmer_t * pgm, int value);
|
||||||
|
int (*initialize) (struct programmer_t * pgm, AVRPART * p);
|
||||||
|
void (*display) (struct programmer_t * pgm, const char * p);
|
||||||
|
void (*enable) (struct programmer_t * pgm);
|
||||||
|
void (*disable) (struct programmer_t * pgm);
|
||||||
|
void (*powerup) (struct programmer_t * pgm);
|
||||||
|
void (*powerdown) (struct programmer_t * pgm);
|
||||||
|
int (*program_enable) (struct programmer_t * pgm, AVRPART * p);
|
||||||
|
int (*chip_erase) (struct programmer_t * pgm, AVRPART * p);
|
||||||
|
int (*unlock) (struct programmer_t * pgm, AVRPART * p);
|
||||||
|
int (*cmd) (struct programmer_t * pgm, const unsigned char *cmd,
|
||||||
|
unsigned char *res);
|
||||||
|
int (*cmd_tpi) (struct programmer_t * pgm, const unsigned char *cmd,
|
||||||
|
int cmd_len, unsigned char res[], int res_len);
|
||||||
|
int (*spi) (struct programmer_t * pgm, const unsigned char *cmd,
|
||||||
|
unsigned char *res, int count);
|
||||||
|
int (*open) (struct programmer_t * pgm, char * port);
|
||||||
|
void (*close) (struct programmer_t * pgm);
|
||||||
|
int (*paged_write) (struct programmer_t * pgm, AVRPART * p, AVRMEM * m,
|
||||||
|
unsigned int page_size, unsigned int baseaddr,
|
||||||
|
unsigned int n_bytes);
|
||||||
|
int (*paged_load) (struct programmer_t * pgm, AVRPART * p, AVRMEM * m,
|
||||||
|
unsigned int page_size, unsigned int baseaddr,
|
||||||
|
unsigned int n_bytes);
|
||||||
|
int (*page_erase) (struct programmer_t * pgm, AVRPART * p, AVRMEM * m,
|
||||||
|
unsigned int baseaddr);
|
||||||
|
void (*write_setup) (struct programmer_t * pgm, AVRPART * p, AVRMEM * m);
|
||||||
|
int (*write_byte) (struct programmer_t * pgm, AVRPART * p, AVRMEM * m,
|
||||||
|
unsigned long addr, unsigned char value);
|
||||||
|
int (*read_byte) (struct programmer_t * pgm, AVRPART * p, AVRMEM * m,
|
||||||
|
unsigned long addr, unsigned char * value);
|
||||||
|
int (*read_sig_bytes) (struct programmer_t * pgm, AVRPART * p, AVRMEM * m);
|
||||||
|
int (*read_sib) (struct programmer_t * pgm, AVRPART * p, char *sib);
|
||||||
|
void (*print_parms) (struct programmer_t * pgm);
|
||||||
|
int (*set_vtarget) (struct programmer_t * pgm, double v);
|
||||||
|
int (*set_varef) (struct programmer_t * pgm, unsigned int chan, double v);
|
||||||
|
int (*set_fosc) (struct programmer_t * pgm, double v);
|
||||||
|
int (*set_sck_period) (struct programmer_t * pgm, double v);
|
||||||
|
int (*setpin) (struct programmer_t * pgm, int pinfunc, int value);
|
||||||
|
int (*getpin) (struct programmer_t * pgm, int pinfunc);
|
||||||
|
int (*highpulsepin) (struct programmer_t * pgm, int pinfunc);
|
||||||
|
int (*parseexitspecs) (struct programmer_t * pgm, char *s);
|
||||||
|
int (*perform_osccal) (struct programmer_t * pgm);
|
||||||
|
int (*parseextparams) (struct programmer_t * pgm, LISTID xparams);
|
||||||
|
void (*setup) (struct programmer_t * pgm);
|
||||||
|
void (*teardown) (struct programmer_t * pgm);
|
||||||
|
char config_file[PATH_MAX]; /* config file where defined */
|
||||||
|
int lineno; /* config file line number */
|
||||||
|
void *cookie; /* for private use by the programmer */
|
||||||
|
char flag; /* for private use of the programmer */
|
||||||
|
} PROGRAMMER;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
PROGRAMMER * pgm_new(void);
|
||||||
|
PROGRAMMER * pgm_dup(const PROGRAMMER * const src);
|
||||||
|
void pgm_free(PROGRAMMER * const p);
|
||||||
|
|
||||||
|
void programmer_display(PROGRAMMER * pgm, const char * p);
|
||||||
|
|
||||||
|
/* show is a mask like this (1<<PIN_AVR_SCK)|(1<<PIN_AVR_MOSI)| ... */
|
||||||
|
#define SHOW_ALL_PINS (~0u)
|
||||||
|
#define SHOW_PPI_PINS ((1<<PPI_AVR_VCC)|(1<<PPI_AVR_BUFF))
|
||||||
|
#define SHOW_AVR_PINS ((1<<PIN_AVR_RESET)|(1<<PIN_AVR_SCK)|(1<<PIN_AVR_MOSI)|(1<<PIN_AVR_MISO))
|
||||||
|
#define SHOW_LED_PINS ((1<<PIN_LED_ERR)|(1<<PIN_LED_RDY)|(1<<PIN_LED_PGM)|(1<<PIN_LED_VFY))
|
||||||
|
void pgm_display_generic_mask(PROGRAMMER * pgm, const char * p, unsigned int show);
|
||||||
|
void pgm_display_generic(PROGRAMMER * pgm, const char * p);
|
||||||
|
|
||||||
|
PROGRAMMER * locate_programmer(LISTID programmers, const char * configid);
|
||||||
|
|
||||||
|
typedef void (*walk_programmers_cb)(const char *name, const char *desc,
|
||||||
|
const char *cfgname, int cfglineno,
|
||||||
|
void *cookie);
|
||||||
|
void walk_programmers(LISTID programmers, walk_programmers_cb cb, void *cookie);
|
||||||
|
|
||||||
|
void sort_programmers(LISTID programmers);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* formerly avr.h */
|
||||||
|
|
||||||
|
typedef void (*FP_UpdateProgress)(int percent, double etime, char *hdr);
|
||||||
|
|
||||||
|
extern struct avrpart parts[];
|
||||||
|
|
||||||
|
extern FP_UpdateProgress update_progress;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int avr_tpi_poll_nvmbsy(PROGRAMMER *pgm);
|
||||||
|
int avr_tpi_chip_erase(PROGRAMMER * pgm, AVRPART * p);
|
||||||
|
int avr_tpi_program_enable(PROGRAMMER * pgm, AVRPART * p, unsigned char guard_time);
|
||||||
|
int avr_read_byte_default(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem,
|
||||||
|
unsigned long addr, unsigned char * value);
|
||||||
|
|
||||||
|
int avr_read(PROGRAMMER * pgm, AVRPART * p, char * memtype, AVRPART * v);
|
||||||
|
|
||||||
|
int avr_write_page(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem,
|
||||||
|
unsigned long addr);
|
||||||
|
|
||||||
|
int avr_write_byte(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem,
|
||||||
|
unsigned long addr, unsigned char data);
|
||||||
|
|
||||||
|
int avr_write_byte_default(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem,
|
||||||
|
unsigned long addr, unsigned char data);
|
||||||
|
|
||||||
|
int avr_write(PROGRAMMER * pgm, AVRPART * p, char * memtype, int size,
|
||||||
|
int auto_erase);
|
||||||
|
|
||||||
|
int avr_signature(PROGRAMMER * pgm, AVRPART * p);
|
||||||
|
|
||||||
|
int avr_verify(AVRPART * p, AVRPART * v, char * memtype, int size);
|
||||||
|
|
||||||
|
int avr_get_cycle_count(PROGRAMMER * pgm, AVRPART * p, int * cycles);
|
||||||
|
|
||||||
|
int avr_put_cycle_count(PROGRAMMER * pgm, AVRPART * p, int cycles);
|
||||||
|
|
||||||
|
int avr_mem_hiaddr(AVRMEM * mem);
|
||||||
|
|
||||||
|
int avr_chip_erase(PROGRAMMER * pgm, AVRPART * p);
|
||||||
|
|
||||||
|
int avr_unlock(PROGRAMMER * pgm, AVRPART * p);
|
||||||
|
|
||||||
|
void report_progress (int completed, int total, char *hdr);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* formerly fileio.h */
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
FMT_AUTO,
|
||||||
|
FMT_SREC,
|
||||||
|
FMT_IHEX,
|
||||||
|
FMT_RBIN,
|
||||||
|
FMT_IMM,
|
||||||
|
FMT_HEX,
|
||||||
|
FMT_DEC,
|
||||||
|
FMT_OCT,
|
||||||
|
FMT_BIN,
|
||||||
|
FMT_ELF
|
||||||
|
} FILEFMT;
|
||||||
|
|
||||||
|
struct fioparms {
|
||||||
|
int op;
|
||||||
|
char * mode;
|
||||||
|
char * iodesc;
|
||||||
|
char * dir;
|
||||||
|
char * rw;
|
||||||
|
unsigned int fileoffset;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
FIO_READ,
|
||||||
|
FIO_WRITE
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
char * fmtstr(FILEFMT format);
|
||||||
|
|
||||||
|
int fileio(int op, char * filename, FILEFMT format,
|
||||||
|
struct avrpart * p, char * memtype, int size);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* formerly safemode.h */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Writes the specified fuse in fusename (can be "lfuse", "hfuse", or "efuse") and verifies it. Will try up to tries
|
||||||
|
amount of times before giving up */
|
||||||
|
int safemode_writefuse (unsigned char fuse, char * fusename, PROGRAMMER * pgm, AVRPART * p, int tries);
|
||||||
|
|
||||||
|
/* Reads the fuses three times, checking that all readings are the same. This will ensure that the before values aren't in error! */
|
||||||
|
int safemode_readfuses (unsigned char * lfuse, unsigned char * hfuse, unsigned char * efuse, unsigned char * fuse, PROGRAMMER * pgm, AVRPART * p);
|
||||||
|
|
||||||
|
/* This routine will store the current values pointed to by lfuse, hfuse, and efuse into an internal buffer in this routine
|
||||||
|
when save is set to 1. When save is 0 (or not 1 really) it will copy the values from the internal buffer into the locations
|
||||||
|
pointed to be lfuse, hfuse, and efuse. This allows you to change the fuse bits if needed from another routine (ie: have it so
|
||||||
|
if user requests fuse bits are changed, the requested value is now verified */
|
||||||
|
int safemode_memfuses (int save, unsigned char * lfuse, unsigned char * hfuse, unsigned char * efuse, unsigned char * fuse);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* formerly update.h */
|
||||||
|
|
||||||
|
enum {
|
||||||
|
DEVICE_READ,
|
||||||
|
DEVICE_WRITE,
|
||||||
|
DEVICE_VERIFY
|
||||||
|
};
|
||||||
|
|
||||||
|
enum updateflags {
|
||||||
|
UF_NONE = 0,
|
||||||
|
UF_NOWRITE = 1,
|
||||||
|
UF_AUTO_ERASE = 2,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct update_t {
|
||||||
|
char * memtype;
|
||||||
|
int op;
|
||||||
|
char * filename;
|
||||||
|
int format;
|
||||||
|
} UPDATE;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern UPDATE * parse_op(char * s);
|
||||||
|
extern UPDATE * dup_update(UPDATE * upd);
|
||||||
|
extern UPDATE * new_update(int op, char * memtype, int filefmt,
|
||||||
|
char * filename);
|
||||||
|
extern void free_update(UPDATE * upd);
|
||||||
|
extern int do_op(PROGRAMMER * pgm, struct avrpart * p, UPDATE * upd,
|
||||||
|
enum updateflags flags);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* formerly pgm_type.h */
|
||||||
|
|
||||||
|
/*LISTID programmer_types;*/
|
||||||
|
|
||||||
|
typedef struct programmer_type_t {
|
||||||
|
const char * const id;
|
||||||
|
void (*initpgm)(struct programmer_t * pgm);
|
||||||
|
const char * const desc;
|
||||||
|
} PROGRAMMER_TYPE;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const PROGRAMMER_TYPE * locate_programmer_type(/*LISTID programmer_types, */const char * id);
|
||||||
|
|
||||||
|
typedef void (*walk_programmer_types_cb)(const char *id, const char *desc,
|
||||||
|
void *cookie);
|
||||||
|
void walk_programmer_types(/*LISTID programmer_types,*/ walk_programmer_types_cb cb, void *cookie);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* formerly config.h */
|
||||||
|
|
||||||
|
extern LISTID part_list;
|
||||||
|
extern LISTID programmers;
|
||||||
|
extern char default_programmer[];
|
||||||
|
extern char default_parallel[];
|
||||||
|
extern char default_serial[];
|
||||||
|
extern double default_bitclock;
|
||||||
|
extern int default_safemode;
|
||||||
|
|
||||||
|
/* This name is fixed, it's only here for symmetry with
|
||||||
|
* default_parallel and default_serial. */
|
||||||
|
#define DEFAULT_USB "usb"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int init_config(void);
|
||||||
|
|
||||||
|
void cleanup_config(void);
|
||||||
|
|
||||||
|
int read_config(const char * file);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* formerly confwin.h */
|
||||||
|
|
||||||
|
#if defined(WIN32NATIVE)
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void win_sys_config_set(char sys_config[PATH_MAX]);
|
||||||
|
void win_usr_config_set(char usr_config[PATH_MAX]);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* WIN32NATIVE */
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* libavrdude_h */
|
|
@ -31,18 +31,18 @@
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#define ppi_claim(fd) \
|
#define ppi_claim(fd) \
|
||||||
if (ioctl(fd, PPCLAIM)) { \
|
if (ioctl(fd, PPCLAIM)) { \
|
||||||
pmsg_ext_error("cannot claim port %s: %s\n\n", \
|
avrdude_message(MSG_INFO, "%s: can't claim device \"%s\": %s\n\n", \
|
||||||
port, strerror(errno)); \
|
progname, port, strerror(errno)); \
|
||||||
close(fd); \
|
close(fd); \
|
||||||
return; \
|
return; \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define ppi_release(fd) \
|
#define ppi_release(fd) \
|
||||||
if (ioctl(fd, PPRELEASE)) { \
|
if (ioctl(fd, PPRELEASE)) { \
|
||||||
pmsg_ext_error("cannot release device: %s\n\n", \
|
avrdude_message(MSG_INFO, "%s: can't release device: %s\n\n", \
|
||||||
strerror(errno)); \
|
progname, strerror(errno)); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define DO_PPI_READ(fd, reg, valp) \
|
#define DO_PPI_READ(fd, reg, valp) \
|
|
@ -27,7 +27,6 @@
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <sys/stat.h>
|
|
||||||
|
|
||||||
#include "avrdude.h"
|
#include "avrdude.h"
|
||||||
#include "libavrdude.h"
|
#include "libavrdude.h"
|
||||||
|
@ -47,8 +46,10 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GPIO user space helpers
|
* GPIO user space helpers
|
||||||
* The following functions are acting on an "unsigned gpio" argument, which corresponds to the
|
* The following functions are acting on an "unsigned gpio" argument, which corresponds to the
|
||||||
* gpio numbering scheme in the kernel (starting from 0).
|
* gpio numbering scheme in the kernel (starting from 0).
|
||||||
|
* The higher level functions use "int pin" to specify the pins with an offset of 1:
|
||||||
|
* gpio = pin - 1;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define GPIO_DIR_IN 0
|
#define GPIO_DIR_IN 0
|
||||||
|
@ -61,7 +62,7 @@ static int linuxgpio_export(unsigned int gpio)
|
||||||
|
|
||||||
fd = open("/sys/class/gpio/export", O_WRONLY);
|
fd = open("/sys/class/gpio/export", O_WRONLY);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
pmsg_ext_error("cannot open /sys/class/gpio/export: %s\n", strerror(errno));
|
perror("Can't open /sys/class/gpio/export");
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,7 +80,7 @@ static int linuxgpio_unexport(unsigned int gpio)
|
||||||
|
|
||||||
fd = open("/sys/class/gpio/unexport", O_WRONLY);
|
fd = open("/sys/class/gpio/unexport", O_WRONLY);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
pmsg_ext_error("cannot open /sys/class/gpio/unexport: %s\n", strerror(errno));
|
perror("Can't open /sys/class/gpio/unexport");
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -107,7 +108,7 @@ static int linuxgpio_dir(unsigned int gpio, unsigned int dir)
|
||||||
|
|
||||||
fd = open(buf, O_WRONLY);
|
fd = open(buf, O_WRONLY);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
pmsg_ext_error("cannot open %s: %s\n", buf, strerror(errno));
|
perror("Can't open gpioX/direction");
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -137,31 +138,32 @@ static int linuxgpio_dir_in(unsigned int gpio)
|
||||||
|
|
||||||
#define N_GPIO (PIN_MAX + 1)
|
#define N_GPIO (PIN_MAX + 1)
|
||||||
|
|
||||||
/* Delay between checks for successful GPIO export (100ms) */
|
|
||||||
#define GPIO_SYSFS_OPEN_DELAY 100000
|
|
||||||
/* Number of retries to check for successful GPIO exports */
|
|
||||||
#define GPIO_SYSFS_OPEN_RETRIES 10
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* an array which holds open FDs to /sys/class/gpio/gpioXX/value for all needed pins
|
* an array which holds open FDs to /sys/class/gpio/gpioXX/value for all needed pins
|
||||||
*/
|
*/
|
||||||
static int linuxgpio_fds[N_GPIO] ;
|
static int linuxgpio_fds[N_GPIO] ;
|
||||||
|
|
||||||
|
|
||||||
static int linuxgpio_setpin(const PROGRAMMER *pgm, int pinfunc, int value) {
|
static int linuxgpio_setpin(PROGRAMMER * pgm, int pinfunc, int value)
|
||||||
if(pinfunc < 0 || pinfunc >= N_PINS)
|
{
|
||||||
return -1;
|
int r;
|
||||||
|
int pin = pgm->pinno[pinfunc]; // TODO
|
||||||
|
|
||||||
unsigned pin = pgm->pinno[pinfunc];
|
|
||||||
if (pin & PIN_INVERSE)
|
if (pin & PIN_INVERSE)
|
||||||
value = !value;
|
{
|
||||||
pin &= PIN_MASK;
|
value = !value;
|
||||||
|
pin &= PIN_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
if (pin > PIN_MAX || linuxgpio_fds[pin] < 0)
|
if ( linuxgpio_fds[pin] < 0 )
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (write(linuxgpio_fds[pin], value? "1": "0", 1) != 1)
|
if (value)
|
||||||
return -1;
|
r = write(linuxgpio_fds[pin], "1", 1);
|
||||||
|
else
|
||||||
|
r = write(linuxgpio_fds[pin], "0", 1);
|
||||||
|
|
||||||
|
if (r!=1) return -1;
|
||||||
|
|
||||||
if (pgm->ispdelay > 1)
|
if (pgm->ispdelay > 1)
|
||||||
bitbang_delay(pgm->ispdelay);
|
bitbang_delay(pgm->ispdelay);
|
||||||
|
@ -169,34 +171,41 @@ static int linuxgpio_setpin(const PROGRAMMER *pgm, int pinfunc, int value) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int linuxgpio_getpin(const PROGRAMMER *pgm, int pinfunc) {
|
static int linuxgpio_getpin(PROGRAMMER * pgm, int pinfunc)
|
||||||
if(pinfunc < 0 || pinfunc >= N_PINS)
|
{
|
||||||
return -1;
|
unsigned char invert=0;
|
||||||
|
|
||||||
unsigned int pin = pgm->pinno[pinfunc];
|
|
||||||
int invert = !!(pin & PIN_INVERSE);
|
|
||||||
pin &= PIN_MASK;
|
|
||||||
|
|
||||||
if(pin > PIN_MAX || linuxgpio_fds[pin] < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if(lseek(linuxgpio_fds[pin], 0, SEEK_SET) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
char c;
|
char c;
|
||||||
if(read(linuxgpio_fds[pin], &c, 1) != 1)
|
int pin = pgm->pinno[pinfunc]; // TODO
|
||||||
|
|
||||||
|
if (pin & PIN_INVERSE)
|
||||||
|
{
|
||||||
|
invert = 1;
|
||||||
|
pin &= PIN_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( linuxgpio_fds[pin] < 0 )
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (lseek(linuxgpio_fds[pin], 0, SEEK_SET)<0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (read(linuxgpio_fds[pin], &c, 1)!=1)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (c=='0')
|
||||||
|
return 0+invert;
|
||||||
|
else if (c=='1')
|
||||||
|
return 1-invert;
|
||||||
|
else
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return c=='0'? 0+invert: c=='1'? 1-invert: -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int linuxgpio_highpulsepin(const PROGRAMMER *pgm, int pinfunc) {
|
static int linuxgpio_highpulsepin(PROGRAMMER * pgm, int pinfunc)
|
||||||
if(pinfunc < 0 || pinfunc >= N_PINS)
|
{
|
||||||
return -1;
|
int pin = pgm->pinno[pinfunc]; // TODO
|
||||||
|
|
||||||
unsigned int pin = pgm->pinno[pinfunc] & PIN_MASK;
|
if ( linuxgpio_fds[pin & PIN_MASK] < 0 )
|
||||||
|
|
||||||
if (pin > PIN_MAX || linuxgpio_fds[pin] < 0 )
|
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
linuxgpio_setpin(pgm, pinfunc, 1);
|
linuxgpio_setpin(pgm, pinfunc, 1);
|
||||||
|
@ -207,31 +216,35 @@ static int linuxgpio_highpulsepin(const PROGRAMMER *pgm, int pinfunc) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void linuxgpio_display(const PROGRAMMER *pgm, const char *p) {
|
static void linuxgpio_display(PROGRAMMER *pgm, const char *p)
|
||||||
msg_info("%sPin assignment : /sys/class/gpio/gpio{n}\n",p);
|
{
|
||||||
|
avrdude_message(MSG_INFO, "%sPin assignment : /sys/class/gpio/gpio{n}\n",p);
|
||||||
pgm_display_generic_mask(pgm, p, SHOW_AVR_PINS);
|
pgm_display_generic_mask(pgm, p, SHOW_AVR_PINS);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void linuxgpio_enable(PROGRAMMER *pgm, const AVRPART *p) {
|
static void linuxgpio_enable(PROGRAMMER *pgm)
|
||||||
|
{
|
||||||
/* nothing */
|
/* nothing */
|
||||||
}
|
}
|
||||||
|
|
||||||
static void linuxgpio_disable(const PROGRAMMER *pgm) {
|
static void linuxgpio_disable(PROGRAMMER *pgm)
|
||||||
|
{
|
||||||
/* nothing */
|
/* nothing */
|
||||||
}
|
}
|
||||||
|
|
||||||
static void linuxgpio_powerup(const PROGRAMMER *pgm) {
|
static void linuxgpio_powerup(PROGRAMMER *pgm)
|
||||||
|
{
|
||||||
/* nothing */
|
/* nothing */
|
||||||
}
|
}
|
||||||
|
|
||||||
static void linuxgpio_powerdown(const PROGRAMMER *pgm) {
|
static void linuxgpio_powerdown(PROGRAMMER *pgm)
|
||||||
|
{
|
||||||
/* nothing */
|
/* nothing */
|
||||||
}
|
}
|
||||||
|
|
||||||
static int linuxgpio_open(PROGRAMMER *pgm, const char *port) {
|
static int linuxgpio_open(PROGRAMMER *pgm, char *port)
|
||||||
|
{
|
||||||
int r, i, pin;
|
int r, i, pin;
|
||||||
char gpio_path[60];
|
|
||||||
struct stat stat_buf;
|
|
||||||
|
|
||||||
if (bitbang_check_prerequisites(pgm) < 0)
|
if (bitbang_check_prerequisites(pgm) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -239,58 +252,33 @@ static int linuxgpio_open(PROGRAMMER *pgm, const char *port) {
|
||||||
|
|
||||||
for (i=0; i<N_GPIO; i++)
|
for (i=0; i<N_GPIO; i++)
|
||||||
linuxgpio_fds[i] = -1;
|
linuxgpio_fds[i] = -1;
|
||||||
// Avrdude assumes that if a pin number is invalid it means not used/available
|
//Avrdude assumes that if a pin number is 0 it means not used/available
|
||||||
for (i = 1; i < N_PINS; i++) { // The pin enumeration in libavrdude.h starts with PPI_AVR_VCC = 1
|
//this causes a problem because 0 is a valid GPIO number in Linux sysfs.
|
||||||
if ((pgm->pinno[i] & PIN_MASK) <= PIN_MAX) {
|
//To avoid annoying off by one pin numbering we assume SCK, MOSI, MISO
|
||||||
|
//and RESET pins are always defined in avrdude.conf, even as 0. If they're
|
||||||
|
//not programming will not work anyway. The drawbacks of this approach are
|
||||||
|
//that unwanted toggling of GPIO0 can occur and that other optional pins
|
||||||
|
//mostry LED status, can't be set to GPIO0. It can be fixed when a better
|
||||||
|
//solution exists.
|
||||||
|
for (i=0; i<N_PINS; i++) {
|
||||||
|
if ( (pgm->pinno[i] & PIN_MASK) != 0 ||
|
||||||
|
i == PIN_AVR_RESET ||
|
||||||
|
i == PIN_AVR_SCK ||
|
||||||
|
i == PIN_AVR_MOSI ||
|
||||||
|
i == PIN_AVR_MISO ) {
|
||||||
pin = pgm->pinno[i] & PIN_MASK;
|
pin = pgm->pinno[i] & PIN_MASK;
|
||||||
if ((r=linuxgpio_export(pin)) < 0) {
|
if ((r=linuxgpio_export(pin)) < 0) {
|
||||||
pmsg_ext_error("cannot export GPIO %d, already exported/busy?: %s",
|
avrdude_message(MSG_INFO, "Can't export GPIO %d, already exported/busy?: %s",
|
||||||
pin, strerror(errno));
|
pin, strerror(errno));
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
if (i == PIN_AVR_MISO)
|
||||||
|
r=linuxgpio_dir_in(pin);
|
||||||
|
else
|
||||||
|
r=linuxgpio_dir_out(pin);
|
||||||
|
|
||||||
/* Wait until GPIO directory appears */
|
if (r < 0)
|
||||||
snprintf(gpio_path, sizeof(gpio_path), "/sys/class/gpio/gpio%u", pin);
|
|
||||||
unsigned int retry_count;
|
|
||||||
for (retry_count = 0; retry_count < GPIO_SYSFS_OPEN_RETRIES; retry_count++) {
|
|
||||||
int ret = stat(gpio_path, &stat_buf);
|
|
||||||
if (ret == 0) {
|
|
||||||
break;
|
|
||||||
} else if (ret < 0 && errno != ENOENT) {
|
|
||||||
linuxgpio_unexport(pin);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
usleep(GPIO_SYSFS_OPEN_DELAY);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Write direction, looping in case of EACCES errors due to delayed
|
|
||||||
* udev permission rule application after export */
|
|
||||||
for (retry_count = 0; retry_count < GPIO_SYSFS_OPEN_RETRIES; retry_count++) {
|
|
||||||
usleep(GPIO_SYSFS_OPEN_DELAY);
|
|
||||||
if (i == PIN_AVR_SDI)
|
|
||||||
r=linuxgpio_dir_in(pin);
|
|
||||||
else
|
|
||||||
r=linuxgpio_dir_out(pin);
|
|
||||||
|
|
||||||
if (r >= 0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (errno != EACCES) {
|
|
||||||
linuxgpio_unexport(pin);
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (retry_count)
|
|
||||||
pmsg_notice2("needed %d retr%s for linuxgpio_dir_%s(%s)\n",
|
|
||||||
retry_count, retry_count > 1? "ies": "y",
|
|
||||||
i == PIN_AVR_SDI? "in": "out", avr_pin_name(pin));
|
|
||||||
|
|
||||||
if (r < 0) {
|
|
||||||
linuxgpio_unexport(pin);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
|
||||||
|
|
||||||
if ((linuxgpio_fds[pin]=linuxgpio_openfd(pin)) < 0)
|
if ((linuxgpio_fds[pin]=linuxgpio_openfd(pin)) < 0)
|
||||||
return linuxgpio_fds[pin];
|
return linuxgpio_fds[pin];
|
||||||
|
@ -311,21 +299,20 @@ static void linuxgpio_close(PROGRAMMER *pgm)
|
||||||
for (i=0; i<N_GPIO; i++) {
|
for (i=0; i<N_GPIO; i++) {
|
||||||
if (linuxgpio_fds[i] >= 0 && i != reset_pin) {
|
if (linuxgpio_fds[i] >= 0 && i != reset_pin) {
|
||||||
close(linuxgpio_fds[i]);
|
close(linuxgpio_fds[i]);
|
||||||
linuxgpio_fds[i] = -1;
|
|
||||||
linuxgpio_dir_in(i);
|
linuxgpio_dir_in(i);
|
||||||
linuxgpio_unexport(i);
|
linuxgpio_unexport(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//configure RESET as input, if there's external pull up it will go high
|
//configure RESET as input, if there's external pull up it will go high
|
||||||
if(reset_pin <= PIN_MAX && linuxgpio_fds[reset_pin] >= 0) {
|
if (linuxgpio_fds[reset_pin] >= 0) {
|
||||||
close(linuxgpio_fds[reset_pin]);
|
close(linuxgpio_fds[reset_pin]);
|
||||||
linuxgpio_fds[reset_pin] = -1;
|
|
||||||
linuxgpio_dir_in(reset_pin);
|
linuxgpio_dir_in(reset_pin);
|
||||||
linuxgpio_unexport(reset_pin);
|
linuxgpio_unexport(reset_pin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void linuxgpio_initpgm(PROGRAMMER *pgm) {
|
void linuxgpio_initpgm(PROGRAMMER *pgm)
|
||||||
|
{
|
||||||
strcpy(pgm->type, "linuxgpio");
|
strcpy(pgm->type, "linuxgpio");
|
||||||
|
|
||||||
pgm_fill_old_pins(pgm); // TODO to be removed if old pin data no longer needed
|
pgm_fill_old_pins(pgm); // TODO to be removed if old pin data no longer needed
|
||||||
|
@ -357,8 +344,10 @@ const char linuxgpio_desc[] = "GPIO bitbanging using the Linux sysfs interface";
|
||||||
|
|
||||||
#else /* !HAVE_LINUXGPIO */
|
#else /* !HAVE_LINUXGPIO */
|
||||||
|
|
||||||
void linuxgpio_initpgm(PROGRAMMER *pgm) {
|
void linuxgpio_initpgm(PROGRAMMER * pgm)
|
||||||
pmsg_error("Linux sysfs GPIO support not available in this configuration\n");
|
{
|
||||||
|
avrdude_message(MSG_INFO, "%s: Linux sysfs GPIO support not available in this configuration\n",
|
||||||
|
progname);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char linuxgpio_desc[] = "GPIO bitbanging using the Linux sysfs interface (not available)";
|
const char linuxgpio_desc[] = "GPIO bitbanging using the Linux sysfs interface (not available)";
|
|
@ -27,7 +27,7 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern const char linuxgpio_desc[];
|
extern const char linuxgpio_desc[];
|
||||||
void linuxgpio_initpgm(PROGRAMMER *pgm);
|
void linuxgpio_initpgm (PROGRAMMER * pgm);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
|
@ -62,22 +62,14 @@
|
||||||
|
|
||||||
#define LINUXSPI "linuxspi"
|
#define LINUXSPI "linuxspi"
|
||||||
|
|
||||||
/*
|
|
||||||
* Private data for this programmer.
|
|
||||||
*/
|
|
||||||
struct pdata {
|
|
||||||
int disable_no_cs;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define PDATA(pgm) ((struct pdata *)(pgm->cookie))
|
|
||||||
|
|
||||||
static int fd_spidev, fd_gpiochip, fd_linehandle;
|
static int fd_spidev, fd_gpiochip, fd_linehandle;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Sends/receives a message in full duplex mode
|
* @brief Sends/receives a message in full duplex mode
|
||||||
* @return -1 on failure, otherwise number of bytes sent/received
|
* @return -1 on failure, otherwise number of bytes sent/recieved
|
||||||
*/
|
*/
|
||||||
static int linuxspi_spi_duplex(const PROGRAMMER *pgm, const unsigned char *tx, unsigned char *rx, int len) {
|
static int linuxspi_spi_duplex(PROGRAMMER *pgm, const unsigned char *tx, unsigned char *rx, int len)
|
||||||
|
{
|
||||||
struct spi_ioc_transfer tr;
|
struct spi_ioc_transfer tr;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -86,33 +78,27 @@ static int linuxspi_spi_duplex(const PROGRAMMER *pgm, const unsigned char *tx, u
|
||||||
.rx_buf = (unsigned long)rx,
|
.rx_buf = (unsigned long)rx,
|
||||||
.len = len,
|
.len = len,
|
||||||
.delay_usecs = 1,
|
.delay_usecs = 1,
|
||||||
.speed_hz = 1.0 / pgm->bitclock,
|
.speed_hz = 1.0 / pgm->bitclock, // seconds to Hz
|
||||||
.bits_per_word = 8,
|
.bits_per_word = 8,
|
||||||
};
|
};
|
||||||
|
|
||||||
errno = 0;
|
|
||||||
ret = ioctl(fd_spidev, SPI_IOC_MESSAGE(1), &tr);
|
ret = ioctl(fd_spidev, SPI_IOC_MESSAGE(1), &tr);
|
||||||
if (ret != len) {
|
if (ret != len)
|
||||||
int ioctl_errno = errno;
|
avrdude_message(MSG_INFO, "\n%s: error: Unable to send SPI message\n", progname);
|
||||||
msg_error("\n");
|
|
||||||
pmsg_error("unable to send SPI message");
|
|
||||||
if (ioctl_errno)
|
|
||||||
msg_error("%s", strerror(ioctl_errno));
|
|
||||||
msg_error("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret == -1? -1: 0;
|
return (ret == -1) ? -1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void linuxspi_setup(PROGRAMMER *pgm) {
|
static void linuxspi_setup(PROGRAMMER *pgm)
|
||||||
pgm->cookie = cfg_malloc("linuxspi_setup()", sizeof(struct pdata));
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
static void linuxspi_teardown(PROGRAMMER* pgm) {
|
static void linuxspi_teardown(PROGRAMMER* pgm)
|
||||||
free(pgm->cookie);
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
static int linuxspi_reset_mcu(const PROGRAMMER *pgm, bool active) {
|
static int linuxspi_reset_mcu(PROGRAMMER *pgm, bool active)
|
||||||
|
{
|
||||||
struct gpiohandle_data data;
|
struct gpiohandle_data data;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -134,20 +120,21 @@ static int linuxspi_reset_mcu(const PROGRAMMER *pgm, bool active) {
|
||||||
#endif
|
#endif
|
||||||
if (ret == -1) {
|
if (ret == -1) {
|
||||||
ret = -errno;
|
ret = -errno;
|
||||||
pmsg_ext_error("unable to set GPIO line %d value: %s\n", pgm->pinno[PIN_AVR_RESET] & PIN_MASK, strerror(errno));
|
avrdude_message(MSG_INFO, "%s error: Unable to set GPIO line %d value\n",
|
||||||
|
progname, pgm->pinno[PIN_AVR_RESET] & ~PIN_INVERSE);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int linuxspi_open(PROGRAMMER *pgm, const char *pt) {
|
static int linuxspi_open(PROGRAMMER *pgm, char *port)
|
||||||
|
{
|
||||||
const char *port_error =
|
const char *port_error =
|
||||||
"unknown port specification, "
|
"%s: error: Unknown port specification. "
|
||||||
"please use the format /dev/spidev:/dev/gpiochip[:resetno]\n";
|
"Please use the format /dev/spidev:/dev/gpiochip[:resetno]\n";
|
||||||
char port_default[] = "/dev/spidev0.0:/dev/gpiochip0";
|
char port_default[] = "/dev/spidev0.0:/dev/gpiochip0";
|
||||||
char *spidev, *gpiochip, *reset_pin;
|
char *spidev, *gpiochip, *reset_pin;
|
||||||
char *port = cfg_strdup("linuxspi_open()", pt);
|
|
||||||
struct gpiohandle_request req;
|
struct gpiohandle_request req;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -157,13 +144,13 @@ static int linuxspi_open(PROGRAMMER *pgm, const char *pt) {
|
||||||
|
|
||||||
spidev = strtok(port, ":");
|
spidev = strtok(port, ":");
|
||||||
if (!spidev) {
|
if (!spidev) {
|
||||||
pmsg_error("%s", port_error);
|
avrdude_message(MSG_INFO, port_error, progname);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
gpiochip = strtok(NULL, ":");
|
gpiochip = strtok(NULL, ":");
|
||||||
if (!gpiochip) {
|
if (!gpiochip) {
|
||||||
pmsg_error("%s", port_error);
|
avrdude_message(MSG_INFO, port_error, progname);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,32 +162,27 @@ static int linuxspi_open(PROGRAMMER *pgm, const char *pt) {
|
||||||
strcpy(pgm->port, port);
|
strcpy(pgm->port, port);
|
||||||
fd_spidev = open(pgm->port, O_RDWR);
|
fd_spidev = open(pgm->port, O_RDWR);
|
||||||
if (fd_spidev < 0) {
|
if (fd_spidev < 0) {
|
||||||
pmsg_ext_error("unable to open the spidev device %s: %s\n", pgm->port, strerror(errno));
|
avrdude_message(MSG_INFO, "\n%s: error: Unable to open the spidev device %s", progname, pgm->port);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t mode = SPI_MODE_0;
|
uint32_t mode = SPI_MODE_0 | SPI_NO_CS;
|
||||||
if (!PDATA(pgm)->disable_no_cs)
|
|
||||||
mode |= SPI_NO_CS;
|
|
||||||
|
|
||||||
ret = ioctl(fd_spidev, SPI_IOC_WR_MODE32, &mode);
|
ret = ioctl(fd_spidev, SPI_IOC_WR_MODE32, &mode);
|
||||||
if (ret == -1) {
|
if (ret == -1) {
|
||||||
int ioctl_errno = errno;
|
avrdude_message(MSG_INFO, "%s: error: Unable to set SPI mode %0X on %s\n",
|
||||||
pmsg_ext_error("unable to set SPI mode %02X on %s: %s\n", mode, spidev, strerror(errno));
|
progname, mode, spidev);
|
||||||
if(ioctl_errno == EINVAL && !PDATA(pgm)->disable_no_cs)
|
|
||||||
pmsg_error("try -x disable_no_cs\n");
|
|
||||||
goto close_spidev;
|
goto close_spidev;
|
||||||
}
|
}
|
||||||
fd_gpiochip = open(gpiochip, 0);
|
fd_gpiochip = open(gpiochip, 0);
|
||||||
if (fd_gpiochip < 0) {
|
if (fd_gpiochip < 0) {
|
||||||
pmsg_ext_error("unable to open the gpiochip %s: %s\n", gpiochip, strerror(errno));
|
avrdude_message(MSG_INFO, "\n%s error: Unable to open the gpiochip %s", progname, gpiochip);
|
||||||
ret = -1;
|
ret = -1;
|
||||||
goto close_spidev;
|
goto close_spidev;
|
||||||
}
|
}
|
||||||
|
|
||||||
strcpy(req.consumer_label, progname);
|
strcpy(req.consumer_label, progname);
|
||||||
req.lines = 1;
|
req.lines = 1;
|
||||||
req.lineoffsets[0] = pgm->pinno[PIN_AVR_RESET] & PIN_MASK;
|
req.lineoffsets[0] = pgm->pinno[PIN_AVR_RESET] & ~PIN_INVERSE;
|
||||||
req.default_values[0] = !!(pgm->pinno[PIN_AVR_RESET] & PIN_INVERSE);
|
req.default_values[0] = !!(pgm->pinno[PIN_AVR_RESET] & PIN_INVERSE);
|
||||||
req.flags = GPIOHANDLE_REQUEST_OUTPUT;
|
req.flags = GPIOHANDLE_REQUEST_OUTPUT;
|
||||||
|
|
||||||
|
@ -212,7 +194,7 @@ static int linuxspi_open(PROGRAMMER *pgm, const char *pt) {
|
||||||
struct gpio_v2_line_request reqv2;
|
struct gpio_v2_line_request reqv2;
|
||||||
|
|
||||||
memset(&reqv2, 0, sizeof(reqv2));
|
memset(&reqv2, 0, sizeof(reqv2));
|
||||||
reqv2.offsets[0] = pgm->pinno[PIN_AVR_RESET] & PIN_MASK;
|
reqv2.offsets[0] = pgm->pinno[PIN_AVR_RESET] & ~PIN_INVERSE;
|
||||||
strncpy(reqv2.consumer, progname, sizeof(reqv2.consumer) - 1);
|
strncpy(reqv2.consumer, progname, sizeof(reqv2.consumer) - 1);
|
||||||
reqv2.config.flags = GPIO_V2_LINE_FLAG_OUTPUT;
|
reqv2.config.flags = GPIO_V2_LINE_FLAG_OUTPUT;
|
||||||
reqv2.config.num_attrs = 1;
|
reqv2.config.num_attrs = 1;
|
||||||
|
@ -228,7 +210,8 @@ static int linuxspi_open(PROGRAMMER *pgm, const char *pt) {
|
||||||
#endif
|
#endif
|
||||||
if (ret == -1) {
|
if (ret == -1) {
|
||||||
ret = -errno;
|
ret = -errno;
|
||||||
pmsg_ext_error("unable to get GPIO line %d. %s\n", pgm->pinno[PIN_AVR_RESET] & PIN_MASK, strerror(errno));
|
avrdude_message(MSG_INFO, "%s error: Unable to get GPIO line %d\n",
|
||||||
|
progname, pgm->pinno[PIN_AVR_RESET] & ~PIN_INVERSE);
|
||||||
goto close_gpiochip;
|
goto close_gpiochip;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -237,12 +220,16 @@ static int linuxspi_open(PROGRAMMER *pgm, const char *pt) {
|
||||||
goto close_out;
|
goto close_out;
|
||||||
|
|
||||||
if (pgm->baudrate != 0) {
|
if (pgm->baudrate != 0) {
|
||||||
pmsg_warning("obsolete use of -b <clock> option for bit clock; use -B <clock>\n");
|
avrdude_message(MSG_INFO,
|
||||||
pgm->bitclock = 1.0 / pgm->baudrate;
|
"%s: obsolete use of -b <clock> option for bit clock; use -B <clock>\n",
|
||||||
|
progname);
|
||||||
|
pgm->bitclock = 1E6 / pgm->baudrate;
|
||||||
}
|
}
|
||||||
if (pgm->bitclock == 0) {
|
if (pgm->bitclock == 0) {
|
||||||
pmsg_notice("defaulting bit clock to 200 kHz\n");
|
avrdude_message(MSG_NOTICE,
|
||||||
pgm->bitclock = 5E-6; // 200 kHz - 5 µs
|
"%s: defaulting bit clock to 200 kHz\n",
|
||||||
|
progname);
|
||||||
|
pgm->bitclock = 5E-6; // 200 kHz - 5 µs
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -256,7 +243,8 @@ close_spidev:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void linuxspi_close(PROGRAMMER *pgm) {
|
static void linuxspi_close(PROGRAMMER *pgm)
|
||||||
|
{
|
||||||
switch (pgm->exit_reset) {
|
switch (pgm->exit_reset) {
|
||||||
case EXIT_RESET_ENABLED:
|
case EXIT_RESET_ENABLED:
|
||||||
linuxspi_reset_mcu(pgm, true);
|
linuxspi_reset_mcu(pgm, true);
|
||||||
|
@ -275,21 +263,25 @@ static void linuxspi_close(PROGRAMMER *pgm) {
|
||||||
close(fd_gpiochip);
|
close(fd_gpiochip);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void linuxspi_disable(const PROGRAMMER* pgm) {
|
static void linuxspi_disable(PROGRAMMER* pgm)
|
||||||
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
static void linuxspi_enable(PROGRAMMER *pgm, const AVRPART *p) {
|
static void linuxspi_enable(PROGRAMMER* pgm)
|
||||||
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
static void linuxspi_display(const PROGRAMMER* pgm, const char* p) {
|
static void linuxspi_display(PROGRAMMER* pgm, const char* p)
|
||||||
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
static int linuxspi_initialize(const PROGRAMMER *pgm, const AVRPART *p) {
|
static int linuxspi_initialize(PROGRAMMER *pgm, AVRPART *p)
|
||||||
|
{
|
||||||
int tries, ret;
|
int tries, ret;
|
||||||
|
|
||||||
if (p->prog_modes & PM_TPI) {
|
if (p->flags & AVRPART_HAS_TPI) {
|
||||||
/* We do not support TPI. This is a dedicated SPI thing */
|
/* We do not support tpi. This is a dedicated SPI thing */
|
||||||
pmsg_error("programmer " LINUXSPI " does not support TPI\n");
|
avrdude_message(MSG_INFO, "%s: error: Programmer " LINUXSPI " does not support TPI\n", progname);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -303,21 +295,22 @@ static int linuxspi_initialize(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
} while(tries++ < 65);
|
} while(tries++ < 65);
|
||||||
|
|
||||||
if (ret)
|
if (ret)
|
||||||
pmsg_error("AVR device not responding\n");
|
avrdude_message(MSG_INFO, "%s: error: AVR device not responding\n", progname);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int linuxspi_cmd(const PROGRAMMER *pgm, const unsigned char *cmd, unsigned char *res)
|
static int linuxspi_cmd(PROGRAMMER *pgm, const unsigned char *cmd, unsigned char *res)
|
||||||
{
|
{
|
||||||
return linuxspi_spi_duplex(pgm, cmd, res, 4);
|
return linuxspi_spi_duplex(pgm, cmd, res, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int linuxspi_program_enable(const PROGRAMMER *pgm, const AVRPART *p) {
|
static int linuxspi_program_enable(PROGRAMMER *pgm, AVRPART *p)
|
||||||
|
{
|
||||||
unsigned char cmd[4], res[4];
|
unsigned char cmd[4], res[4];
|
||||||
|
|
||||||
if (!p->op[AVR_OP_PGM_ENABLE]) {
|
if (!p->op[AVR_OP_PGM_ENABLE]) {
|
||||||
pmsg_error("program enable instruction not defined for part %s\n", p->desc);
|
avrdude_message(MSG_INFO, "%s: error: program enable instruction not defined for part \"%s\"\n", progname, p->desc);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -335,7 +328,7 @@ static int linuxspi_program_enable(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
* plus two CPU clock cycles. See Table 25-5 on page 240 for definition of
|
* plus two CPU clock cycles. See Table 25-5 on page 240 for definition of
|
||||||
* minimum pulse width on RESET pin, t RST
|
* minimum pulse width on RESET pin, t RST
|
||||||
* 2. Wait for at least 20 ms and then enable serial programming by sending
|
* 2. Wait for at least 20 ms and then enable serial programming by sending
|
||||||
* the Programming Enable serial instruction to the SDO pin
|
* the Programming Enable serial instruction to the MOSI pin
|
||||||
* 3. The serial programming instructions will not work if the communication
|
* 3. The serial programming instructions will not work if the communication
|
||||||
* is out of synchronization. When in sync, the second byte (0x53) will echo
|
* is out of synchronization. When in sync, the second byte (0x53) will echo
|
||||||
* back when issuing the third byte of the Programming Enable instruction
|
* back when issuing the third byte of the Programming Enable instruction
|
||||||
|
@ -356,11 +349,12 @@ static int linuxspi_program_enable(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int linuxspi_chip_erase(const PROGRAMMER *pgm, const AVRPART *p) {
|
static int linuxspi_chip_erase(PROGRAMMER *pgm, AVRPART *p)
|
||||||
|
{
|
||||||
unsigned char cmd[4], res[4];
|
unsigned char cmd[4], res[4];
|
||||||
|
|
||||||
if (!p->op[AVR_OP_CHIP_ERASE]) {
|
if (!p->op[AVR_OP_CHIP_ERASE]) {
|
||||||
pmsg_error("chip erase instruction not defined for part %s\n", p->desc);
|
avrdude_message(MSG_INFO, "%s: error: chip erase instruction not defined for part \"%s\"\n", progname, p->desc);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -373,12 +367,12 @@ static int linuxspi_chip_erase(const PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int linuxspi_parseexitspecs(PROGRAMMER *pgm, const char *sp) {
|
static int linuxspi_parseexitspecs(PROGRAMMER *pgm, char *s)
|
||||||
char *cp, *s, *str = cfg_strdup("linuxspi_parseextitspecs()", sp);
|
{
|
||||||
|
char *cp;
|
||||||
|
|
||||||
s = str;
|
|
||||||
while ((cp = strtok(s, ","))) {
|
while ((cp = strtok(s, ","))) {
|
||||||
s = NULL;
|
s = 0;
|
||||||
if (!strcmp(cp, "reset")) {
|
if (!strcmp(cp, "reset")) {
|
||||||
pgm->exit_reset = EXIT_RESET_ENABLED;
|
pgm->exit_reset = EXIT_RESET_ENABLED;
|
||||||
continue;
|
continue;
|
||||||
|
@ -387,35 +381,14 @@ static int linuxspi_parseexitspecs(PROGRAMMER *pgm, const char *sp) {
|
||||||
pgm->exit_reset = EXIT_RESET_DISABLED;
|
pgm->exit_reset = EXIT_RESET_DISABLED;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
free(str);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
free(str);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int linuxspi_parseextparams(const PROGRAMMER *pgm, const LISTID extparms) {
|
void linuxspi_initpgm(PROGRAMMER *pgm)
|
||||||
LNODEID ln;
|
{
|
||||||
const char *extended_param;
|
|
||||||
int rc = 0;
|
|
||||||
|
|
||||||
for (ln = lfirst(extparms); ln; ln = lnext(ln)) {
|
|
||||||
extended_param = ldata(ln);
|
|
||||||
|
|
||||||
if (strcmp(extended_param, "disable_no_cs") == 0) {
|
|
||||||
PDATA(pgm)->disable_no_cs = 1;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
pmsg_error("invalid extended parameter '%s'\n", extended_param);
|
|
||||||
rc = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
void linuxspi_initpgm(PROGRAMMER *pgm) {
|
|
||||||
strcpy(pgm->type, LINUXSPI);
|
strcpy(pgm->type, LINUXSPI);
|
||||||
|
|
||||||
pgm_fill_old_pins(pgm); // TODO to be removed if old pin data no longer needed
|
pgm_fill_old_pins(pgm); // TODO to be removed if old pin data no longer needed
|
||||||
|
@ -437,15 +410,16 @@ void linuxspi_initpgm(PROGRAMMER *pgm) {
|
||||||
pgm->setup = linuxspi_setup;
|
pgm->setup = linuxspi_setup;
|
||||||
pgm->teardown = linuxspi_teardown;
|
pgm->teardown = linuxspi_teardown;
|
||||||
pgm->parseexitspecs = linuxspi_parseexitspecs;
|
pgm->parseexitspecs = linuxspi_parseexitspecs;
|
||||||
pgm->parseextparams = linuxspi_parseextparams;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const char linuxspi_desc[] = "SPI using Linux spidev driver";
|
const char linuxspi_desc[] = "SPI using Linux spidev driver";
|
||||||
|
|
||||||
#else /* !HAVE_LINUXSPI */
|
#else /* !HAVE_LINUXSPI */
|
||||||
|
|
||||||
void linuxspi_initpgm(PROGRAMMER *pgm) {
|
void linuxspi_initpgm(PROGRAMMER * pgm)
|
||||||
pmsg_error("Linux SPI driver not available in this configuration\n");
|
{
|
||||||
|
avrdude_message(MSG_INFO, "%s: Linux SPI driver not available in this configuration\n",
|
||||||
|
progname);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char linuxspi_desc[] = "SPI using Linux spidev driver (not available)";
|
const char linuxspi_desc[] = "SPI using Linux spidev driver (not available)";
|
|
@ -25,7 +25,7 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern const char linuxspi_desc[];
|
extern const char linuxspi_desc[];
|
||||||
void linuxspi_initpgm(PROGRAMMER *pgm);
|
void linuxspi_initpgm (PROGRAMMER * pgm);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
/*
|
||||||
|
* avrdude - A Downloader/Uploader for AVR device programmers
|
||||||
|
* Copyright (C) 2006 Christian Starkjohann
|
||||||
|
*
|
||||||
|
* 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, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
The following is a replacement for hidsdi.h from the Windows DDK. It defines some
|
||||||
|
of the types and function prototypes of this header for our project. If you
|
||||||
|
have the Windows DDK version of this file or a version shipped with MinGW, use
|
||||||
|
that instead.
|
||||||
|
*/
|
||||||
|
#ifndef MY_DDK_HIDSDI_H
|
||||||
|
#define MY_DDK_HIDSDI_H
|
||||||
|
#include <pshpack4.h>
|
||||||
|
#include <ddk/hidusage.h>
|
||||||
|
#include <ddk/hidpi.h>
|
||||||
|
typedef struct{
|
||||||
|
ULONG Size;
|
||||||
|
USHORT VendorID;
|
||||||
|
USHORT ProductID;
|
||||||
|
USHORT VersionNumber;
|
||||||
|
}HIDD_ATTRIBUTES;
|
||||||
|
void __stdcall HidD_GetHidGuid(OUT LPGUID hidGuid);
|
||||||
|
BOOLEAN __stdcall HidD_GetAttributes(IN HANDLE device, OUT HIDD_ATTRIBUTES *attributes);
|
||||||
|
BOOLEAN __stdcall HidD_GetManufacturerString(IN HANDLE device, OUT void *buffer, IN ULONG bufferLen);
|
||||||
|
BOOLEAN __stdcall HidD_GetProductString(IN HANDLE device, OUT void *buffer, IN ULONG bufferLen);
|
||||||
|
BOOLEAN __stdcall HidD_GetSerialNumberString(IN HANDLE device, OUT void *buffer, IN ULONG bufferLen);
|
||||||
|
BOOLEAN __stdcall HidD_GetFeature(IN HANDLE device, OUT void *reportBuffer, IN ULONG bufferLen);
|
||||||
|
BOOLEAN __stdcall HidD_SetFeature(IN HANDLE device, IN void *reportBuffer, IN ULONG bufferLen);
|
||||||
|
BOOLEAN __stdcall HidD_GetNumInputBuffers(IN HANDLE device, OUT ULONG *numBuffers);
|
||||||
|
BOOLEAN __stdcall HidD_SetNumInputBuffers(IN HANDLE device, OUT ULONG numBuffers);
|
||||||
|
#include <poppack.h>
|
||||||
|
#endif /* MY_DDK_HIDSDI_H */
|
|
@ -73,7 +73,8 @@ static struct ppipins_t ppipins[] = {
|
||||||
|
|
||||||
#define NPINS (sizeof(ppipins)/sizeof(struct ppipins_t))
|
#define NPINS (sizeof(ppipins)/sizeof(struct ppipins_t))
|
||||||
|
|
||||||
static int par_setpin_internal(const PROGRAMMER *pgm, int pin, int value) {
|
static int par_setpin_internal(PROGRAMMER * pgm, int pin, int value)
|
||||||
|
{
|
||||||
int inverted;
|
int inverted;
|
||||||
|
|
||||||
inverted = pin & PIN_INVERSE;
|
inverted = pin & PIN_INVERSE;
|
||||||
|
@ -101,20 +102,15 @@ static int par_setpin_internal(const PROGRAMMER *pgm, int pin, int value) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int par_setpin(const PROGRAMMER * pgm, int pinfunc, int value) {
|
static int par_setpin(PROGRAMMER * pgm, int pinfunc, int value)
|
||||||
if(pinfunc < 0 || pinfunc >= N_PINS)
|
{
|
||||||
return -1;
|
|
||||||
|
|
||||||
return par_setpin_internal(pgm, pgm->pinno[pinfunc], value);
|
return par_setpin_internal(pgm, pgm->pinno[pinfunc], value);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void par_setmany(const PROGRAMMER *pgm, int pinfunc, int value) {
|
static void par_setmany(PROGRAMMER * pgm, int pinfunc, int value)
|
||||||
int pin, mask, pinset;
|
{
|
||||||
|
int pin, mask;
|
||||||
if(pinfunc < 0 || pinfunc >= N_PINS)
|
int pinset = pgm->pinno[pinfunc];
|
||||||
return;
|
|
||||||
|
|
||||||
pinset = pgm->pinno[pinfunc];
|
|
||||||
|
|
||||||
/* mask is anything non-pin - needs to be applied to each par_setpin to preserve inversion */
|
/* mask is anything non-pin - needs to be applied to each par_setpin to preserve inversion */
|
||||||
mask = pinset & (~PIN_MASK);
|
mask = pinset & (~PIN_MASK);
|
||||||
|
@ -125,13 +121,11 @@ static void par_setmany(const PROGRAMMER *pgm, int pinfunc, int value) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int par_getpin(const PROGRAMMER * pgm, int pinfunc) {
|
static int par_getpin(PROGRAMMER * pgm, int pinfunc)
|
||||||
int value, inverted, pin;
|
{
|
||||||
|
int value;
|
||||||
if(pinfunc < 0 || pinfunc >= N_PINS)
|
int inverted;
|
||||||
return -1;
|
int pin = pgm->pinno[pinfunc];
|
||||||
|
|
||||||
pin = pgm->pinno[pinfunc];
|
|
||||||
|
|
||||||
inverted = pin & PIN_INVERSE;
|
inverted = pin & PIN_INVERSE;
|
||||||
pin &= PIN_MASK;
|
pin &= PIN_MASK;
|
||||||
|
@ -156,13 +150,10 @@ static int par_getpin(const PROGRAMMER * pgm, int pinfunc) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int par_highpulsepin(const PROGRAMMER *pgm, int pinfunc) {
|
static int par_highpulsepin(PROGRAMMER * pgm, int pinfunc)
|
||||||
int inverted, pin;
|
{
|
||||||
|
int inverted;
|
||||||
if(pinfunc < 0 || pinfunc >= N_PINS)
|
int pin = pgm->pinno[pinfunc];
|
||||||
return -1;
|
|
||||||
|
|
||||||
pin = pgm->pinno[pinfunc];
|
|
||||||
|
|
||||||
inverted = pin & PIN_INVERSE;
|
inverted = pin & PIN_INVERSE;
|
||||||
pin &= PIN_MASK;
|
pin &= PIN_MASK;
|
||||||
|
@ -199,7 +190,8 @@ static int par_highpulsepin(const PROGRAMMER *pgm, int pinfunc) {
|
||||||
/*
|
/*
|
||||||
* apply power to the AVR processor
|
* apply power to the AVR processor
|
||||||
*/
|
*/
|
||||||
static void par_powerup(const PROGRAMMER *pgm) {
|
static void par_powerup(PROGRAMMER * pgm)
|
||||||
|
{
|
||||||
par_setmany(pgm, PPI_AVR_VCC, 1); /* power up */
|
par_setmany(pgm, PPI_AVR_VCC, 1); /* power up */
|
||||||
usleep(100000);
|
usleep(100000);
|
||||||
}
|
}
|
||||||
|
@ -208,15 +200,18 @@ static void par_powerup(const PROGRAMMER *pgm) {
|
||||||
/*
|
/*
|
||||||
* remove power from the AVR processor
|
* remove power from the AVR processor
|
||||||
*/
|
*/
|
||||||
static void par_powerdown(const PROGRAMMER *pgm) {
|
static void par_powerdown(PROGRAMMER * pgm)
|
||||||
|
{
|
||||||
par_setmany(pgm, PPI_AVR_VCC, 0); /* power down */
|
par_setmany(pgm, PPI_AVR_VCC, 0); /* power down */
|
||||||
}
|
}
|
||||||
|
|
||||||
static void par_disable(const PROGRAMMER *pgm) {
|
static void par_disable(PROGRAMMER * pgm)
|
||||||
|
{
|
||||||
par_setmany(pgm, PPI_AVR_BUFF, 1); /* turn off */
|
par_setmany(pgm, PPI_AVR_BUFF, 1); /* turn off */
|
||||||
}
|
}
|
||||||
|
|
||||||
static void par_enable(PROGRAMMER *pgm, const AVRPART *p) {
|
static void par_enable(PROGRAMMER * pgm)
|
||||||
|
{
|
||||||
/*
|
/*
|
||||||
* Prepare to start talking to the connected device - pull reset low
|
* Prepare to start talking to the connected device - pull reset low
|
||||||
* first, delay a few milliseconds, then enable the buffer. This
|
* first, delay a few milliseconds, then enable the buffer. This
|
||||||
|
@ -237,7 +232,8 @@ static void par_enable(PROGRAMMER *pgm, const AVRPART *p) {
|
||||||
par_setmany(pgm, PPI_AVR_BUFF, 0);
|
par_setmany(pgm, PPI_AVR_BUFF, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int par_open(PROGRAMMER *pgm, const char *port) {
|
static int par_open(PROGRAMMER * pgm, char * port)
|
||||||
|
{
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
if (bitbang_check_prerequisites(pgm) < 0)
|
if (bitbang_check_prerequisites(pgm) < 0)
|
||||||
|
@ -245,7 +241,8 @@ static int par_open(PROGRAMMER *pgm, const char *port) {
|
||||||
|
|
||||||
ppi_open(port, &pgm->fd);
|
ppi_open(port, &pgm->fd);
|
||||||
if (pgm->fd.ifd < 0) {
|
if (pgm->fd.ifd < 0) {
|
||||||
pmsg_error("unable to open parallel port %s\n\n", port);
|
avrdude_message(MSG_INFO, "%s: failed to open parallel port \"%s\"\n\n",
|
||||||
|
progname, port);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -254,14 +251,14 @@ static int par_open(PROGRAMMER *pgm, const char *port) {
|
||||||
*/
|
*/
|
||||||
rc = ppi_getall(&pgm->fd, PPIDATA);
|
rc = ppi_getall(&pgm->fd, PPIDATA);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
pmsg_error("unable to read status of ppi data port\n");
|
avrdude_message(MSG_INFO, "%s: error reading status of ppi data port\n", progname);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
pgm->ppidata = rc;
|
pgm->ppidata = rc;
|
||||||
|
|
||||||
rc = ppi_getall(&pgm->fd, PPICTRL);
|
rc = ppi_getall(&pgm->fd, PPICTRL);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
pmsg_error("unable to read status of ppi ctrl port\n");
|
avrdude_message(MSG_INFO, "%s: error reading status of ppi ctrl port\n", progname);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
pgm->ppictrl = rc;
|
pgm->ppictrl = rc;
|
||||||
|
@ -270,7 +267,8 @@ static int par_open(PROGRAMMER *pgm, const char *port) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void par_close(PROGRAMMER *pgm) {
|
static void par_close(PROGRAMMER * pgm)
|
||||||
|
{
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Restore pin values before closing,
|
* Restore pin values before closing,
|
||||||
|
@ -333,41 +331,40 @@ static void par_close(PROGRAMMER *pgm) {
|
||||||
/*
|
/*
|
||||||
* parse the -E string
|
* parse the -E string
|
||||||
*/
|
*/
|
||||||
static int par_parseexitspecs(PROGRAMMER *pgm, const char *sp) {
|
static int par_parseexitspecs(PROGRAMMER * pgm, char *s)
|
||||||
char *cp, *s, *str = cfg_strdup("par_parseexitspecs()", sp);
|
{
|
||||||
|
char *cp;
|
||||||
|
|
||||||
s = str;
|
while ((cp = strtok(s, ","))) {
|
||||||
while((cp = strtok(s, ","))) {
|
if (strcmp(cp, "reset") == 0) {
|
||||||
if(strcmp(cp, "reset") == 0)
|
|
||||||
pgm->exit_reset = EXIT_RESET_ENABLED;
|
pgm->exit_reset = EXIT_RESET_ENABLED;
|
||||||
|
}
|
||||||
else if(strcmp(cp, "noreset") == 0)
|
else if (strcmp(cp, "noreset") == 0) {
|
||||||
pgm->exit_reset = EXIT_RESET_DISABLED;
|
pgm->exit_reset = EXIT_RESET_DISABLED;
|
||||||
|
}
|
||||||
else if(strcmp(cp, "vcc") == 0)
|
else if (strcmp(cp, "vcc") == 0) {
|
||||||
pgm->exit_vcc = EXIT_VCC_ENABLED;
|
pgm->exit_vcc = EXIT_VCC_ENABLED;
|
||||||
|
}
|
||||||
else if(strcmp(cp, "novcc") == 0)
|
else if (strcmp(cp, "novcc") == 0) {
|
||||||
pgm->exit_vcc = EXIT_VCC_DISABLED;
|
pgm->exit_vcc = EXIT_VCC_DISABLED;
|
||||||
|
}
|
||||||
else if(strcmp(cp, "d_high") == 0)
|
else if (strcmp(cp, "d_high") == 0) {
|
||||||
pgm->exit_datahigh = EXIT_DATAHIGH_ENABLED;
|
pgm->exit_datahigh = EXIT_DATAHIGH_ENABLED;
|
||||||
|
}
|
||||||
else if(strcmp(cp, "d_low") == 0)
|
else if (strcmp(cp, "d_low") == 0) {
|
||||||
pgm->exit_datahigh = EXIT_DATAHIGH_DISABLED;
|
pgm->exit_datahigh = EXIT_DATAHIGH_DISABLED;
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
free(str);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
s = NULL; // Only call strtok() once with the actual string
|
s = 0; /* strtok() should be called with the actual string only once */
|
||||||
}
|
}
|
||||||
|
|
||||||
free(str);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void par_initpgm(PROGRAMMER *pgm) {
|
void par_initpgm(PROGRAMMER * pgm)
|
||||||
|
{
|
||||||
strcpy(pgm->type, "PPI");
|
strcpy(pgm->type, "PPI");
|
||||||
|
|
||||||
pgm_fill_old_pins(pgm); // TODO to be removed if old pin data no longer needed
|
pgm_fill_old_pins(pgm); // TODO to be removed if old pin data no longer needed
|
||||||
|
@ -403,8 +400,10 @@ void par_initpgm(PROGRAMMER *pgm) {
|
||||||
|
|
||||||
#else /* !HAVE_PARPORT */
|
#else /* !HAVE_PARPORT */
|
||||||
|
|
||||||
void par_initpgm(PROGRAMMER *pgm) {
|
void par_initpgm(PROGRAMMER * pgm)
|
||||||
pmsg_error("parallel port access not available in this configuration\n");
|
{
|
||||||
|
avrdude_message(MSG_INFO, "%s: parallel port access not available in this configuration\n",
|
||||||
|
progname);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* HAVE_PARPORT */
|
#endif /* HAVE_PARPORT */
|
|
@ -26,7 +26,7 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern const char par_desc[];
|
extern const char par_desc[];
|
||||||
void par_initpgm(PROGRAMMER *pgm);
|
void par_initpgm (PROGRAMMER * pgm);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue