Wikibooks
enwikibooks
https://en.wikibooks.org/wiki/Main_Page
MediaWiki 1.47.0-wmf.24
first-letter
Media
Special
Talk
User
User talk
Wikibooks
Wikibooks talk
File
File talk
MediaWiki
MediaWiki talk
Template
Template talk
Help
Help talk
Category
Category talk
Cookbook
Cookbook talk
Transwiki
Transwiki talk
Wikijunior
Wikijunior talk
Subject
Subject talk
TimedText
TimedText talk
Module
Module talk
Event
Event talk
Wikibooks:Requests for deletion
4
385
4676535
4676488
2026-10-17T14:37:05Z
Codename Noreste
3441010
/* Wikibooks:FlaggedRevs Extension */ reply to SHB ([[mw:c:Special:MyLanguage/User:JWBTH/CD|CD]])
4676535
wikitext
text/x-wiki
__NEWSECTIONLINK__
[[Category:Wikibooks deletion|{{PAGENAME}}]]
{{Discussion Rooms}}
{{TOCleft}}
{{shortcut|WB:RFD}}
{{Requests for deletion/New deletion}}
{{Requests for deletion/Deletion intro}}
<!-- New deletion nominations go at the bottom of page. -->
== [[Salute, Jonathan!]] and its translations ==
<div style="column-count: 7;">
* [[Salute, Jonathan!|Interlingue/Occidental]] ([[w:en:Occidental|w]], original)
* [[Òla, Ionatà!|Audià]]
* [[Holo, Jonathan!|Cristianés]]
* [[Terve, Jonathan!|Ekumenski]]
* [[Hej, Jonathan! (Germanisch)|Germanisch]]
* [[Salom, Jonatan!|Globasa]]
* [[Àlŏ, Jonathan!|Guosa]] ([[w:en:Guosa|w]])
* [[Salut, Jonathan!|Idiom Neutral]] ([[w:en:Idiom Neutral|w]])
* [[Saluto, Jonathan! (Ido)|Ido]] ([[w:en:Ido|w]])
* [[Hallo, Jonathan!|Interlingua]] ([[w:en:Interlingua|w]])
* [[Salut, Jonathan! (Interocidental)|Interocidental]]
* [[Bune Ğonatan!|Lingaust]]
* [[Oila, Jonatan!|Lingue Simple]]
* [[Haloo, Jonatan!|Lingwa de Planeta]] ([[w:en:Lingwa de Planeta|w]])
* [[Sin Chao, Jonathan!|Masa Tang]]
* [[Salut, ionatano!|Meteza]]
* [[Salu, Jon!|Mini]]
* [[Hay, Jonathan!|Mirad]]
* [[Hai, Jon!|Monav]]
* [[Sesan Jon!|Monkel]]
* [[Salam, Jonathan!|Mundeze]]
* [[Dag, Jonathan!|Negerhollands]] ([[w:en:Negerhollands|w]])
* [[Salut Jonathan!|Neo]] ([[w:en:Neo|w]])
* [[Hej, Jonathan!|Nordien]]
* [[Saluto, Jonathan!|Novial]] ([[w:en:Novial|w]])
* [[Salute, Jonathan! (Novlingue)|Novlingue]]
* [[Alo, Jonathan!|Numo]]
* [[Hela, Jonathan!|Proyo]]
* [[Salute, Jonathan! (Romanica)|Romanica]] ([[w:en:Romanica|w]])
* [[Simi, Jonathan!|Solresol]] ([[w:en:Solresol|w]])
* [[Toki a, jan Jonatan!|Toki Pona]] ([[w:en:Toki Pona|w]])
* [[Glidis, o Jonathan!|Volapük]] ([[w:en:Volapük|w]])
</div>
There are a couple of issues here:
# Beyond their introductions, all of these books are written in languages which are not English, making them out of scope for the English Wikibooks.
# All but one of these books are in fact written in constructed languages, most of them in recently created conlangs. In some cases (e.g. [[Sin Chao, Jonathan!]]), I can't find any reliable sources describing the target language outside of the translation itself.
# Most of the translations (i.e. other than [[Salute, Jonathan!]] itself) were abandoned within the first five or so chapters (out of 100); none of them are complete, and there seems to be little effort to complete any of them.
While I recognize that this is an unusual project, and potentially one which could have some value, it's not at all clear to me that the English Wikibooks is the right place for it. — [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 00:24, 29 September 2024 (UTC)
: I'm really not sure what to do about these ones. While I recognize that this approach is certainly one method of teaching a language, I'm not sure that it constitutes an educational textbook. We do require that the English Wikibooks be written in English—for language-learning books, this typically means that the instructional parts are in English while the exercises are in the language being taught. I do think that if the language doesn't have much supporting evidence outside the book itself, it can safely be deleted. — [[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 01:01, 29 September 2024 (UTC)
: Author of the book here. I originally wanted to put it in the Interlingue Wikibooks https://ie.wikibooks.org/wiki/Principal_p%C3%A1gine but it somehow got locked when I wasn't paying attention and so I ended up putting it here. Getting it unlocked requires going through the process of starting an Incubator and all the rest so I opted for here and then started putting some English-only content once it was done. It's sort of in the same vein as books like Lingua Latina per se Illustrata that have separate versions with teacher notes and whatnot. [[Salute, Jonathan!/Capitul 1 - with notes]] After it was done the auxlang community really took to it which was a nice surprise. I think Ido has the largest number of chapters at the moment at 15.
:If the vast content of this book could be used to justify a quick reopening of the Interlingue Wikibooks to move it there, I'd love to do that. I imagine that an incubator with 100+ book chapters would be enough to open a Wikibooks and that's what this is. — [[User:Mithridates|Mithridates]] ([[User talk:Mithridates|discuss]] • [[Special:Contributions/Mithridates|contribs]]) 06:02, 29 September 2024 (UTC)
: Ah, I just realized that we do have a proposal to reopen the Interlingue Wikibooks: https://meta.wikimedia.org/wiki/Requests_for_new_languages/Wikibooks_Interlingue along with an Incubator page here. https://incubator.wikimedia.org/wiki/Wb/ie/Principal_p%C3%A1gine
: How easy would it be to migrate the entirety of Salute Jonathan to there? — [[User:Mithridates|Mithridates]] ([[User talk:Mithridates|discuss]] • [[Special:Contributions/Mithridates|contribs]]) 06:30, 29 September 2024 (UTC)
:: Hi @[[User:Mithridates|Mithridates]]! I'm not sure how incubator projects work, but I fully support migrating these books there. You may want to inquire over there and link to this discussion to support your request to move the content over there. Cheers! — [[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 13:16, 29 September 2024 (UTC)
::: Hi! Actually I have a third idea to propose after thinking about this again today (haven't been here much since I finished the book): I noticed that there is more English content than I remember and that might make it an awkward fit for the Interlingue Wikibooks. I definitely agree that having all the auxlang translations for new auxlang projects goes well beyond the scope of this Wikibooks. Finally, there are some auxlangs that are notable with their own Wikipedias.
::: So the idea is the following:
:::# Leave the original here and I can continue the work on the version with English notes and grammar. That will make it the same as Lingua Latina per se Illustrata, English by the Nature Method, Athenaze and all the rest.
:::# The Interlingua one can move to the Interlingua Wikibooks (maybe Romanica too if they want as it is sort of a dialect of Interlingua).
:::# For Ido and Lingua Franca Nova which have a Wikipedia but not a Wikibooks, I'm a little bit unsure...technically they could have their own version like the original one but would require English explanations. I could let them know and see if they are willing to do so and see what they think (work on adding English to the books vs. move the content elsewhere).
:::# The rest can move to a Github repo, then be deleted, and the front page of this book can have a single link to the repo.
::: Any thoughts on that? Adding the extra English content will be easy as it is my book and I know it inside and out.
::: Edit: [https://en.wikibooks.org/wiki/Salute,_Jonathan!/Grammar_(pronouns) this page] I just added. — [[User:Mithridates|Mithridates]] ([[User talk:Mithridates|discuss]] • [[Special:Contributions/Mithridates|contribs]]) 13:50, 29 September 2024 (UTC)
:::: Thanks for taking the time to consider this! Here are my responses/questions:
::::* Is the original [[Salute, Jonathan!]] (Occidental)? Since that one is quite fleshed out, I agree that if you edit it so the primary language of the book (e.g. headers, instructions, etc) are written in English while leaving the actual story in Occidental, it would be okay and fit in more with instructional language textbooks.
::::* For your points 2 and 3, I'm not sure how those other projects work, so I'll leave it up to them. I'm not quite sure why they would need to move, since in theory they could be revised with English as the language of instruction? Although, they have been left incomplete for a long time.
::::* For your point 4, I have no problem with that. Cheers! — [[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 16:51, 29 September 2024 (UTC)
::::: Hello again, it's the weekend so I have a bit more time to work on this. I've decided to merge the extra content from the following five chapters since the difference is fairly small and the original chapters should now have this English content. Could you delete these five pages now that they are no longer needed? [[User:Mithridates|Mithridates]] ([[User talk:Mithridates|discuss]] • [[Special:Contributions/Mithridates|contribs]]) 14:02, 5 October 2024 (UTC)
::::: [[Salute, Jonathan!/Capitul 1 - with notes]]
::::: [[Salute, Jonathan!/Capitul 2 - with notes]]
::::: [[Salute, Jonathan!/Capitul 3 - with notes]]
::::: [[Salute, Jonathan!/Capitul 4 - with notes]]
::::: [[Salute, Jonathan!/Capitul 5 - with notes]] [[User:Mithridates|Mithridates]] ([[User talk:Mithridates|discuss]] • [[Special:Contributions/Mithridates|contribs]]) 14:02, 5 October 2024 (UTC)
:::::: [[File:Yes_check.svg|{{#ifeq:|small|8|15}}px|link=|alt=]] {{#ifeq:|small|<small>|}}'''Done'''{{#ifeq:|small|</small>|}} — [[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 23:34, 5 October 2024 (UTC)
::::::: Hi again! No luck trying to find a home for the random language translations on other auxlang wikis, can't find one that is actively maintained.
::::::: The thought struck me that maybe I could just put those ones on a sub page of my user page, would that be permitted? If not, I think I'll just stick them somewhere in GitHub and call it a day since none of the people who started the translations seem to care enough to do anything about them. I'd rather not see them outright disappear but since they aren't mine I don't care enough about them to do much more work than copy and paste them somewhere.
::::::: (I would leave the ones in languages with an ISO-639 code and Wikipedia here, of course) — [[User:Mithridates|Mithridates]] ([[User talk:Mithridates|discuss]] • [[Special:Contributions/Mithridates|contribs]]) 14:13, 9 November 2024 (UTC)
:::::::: Thank you for checking! I don't personally see an issue with moving them to your user space right now. Cheers — [[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 17:21, 9 November 2024 (UTC)
::::::::: Thanks a lot! I've started a single page where I will put them all here [[User:Mithridates/SJ]] and will proceed slowly due to lack of time and also to avoid stepping on any toes / asking you to delete too much at a time and possibly deleting the wrong content.
::::::::: For this week I have put the content for the languages Audia, Cristianès, Guosa, Lingaust, Mini, Mirad, and Monav on that page as they all have a single page of content and didn't take much time to move. Please delete those. Once they are gone I will add a note on the main page letting people know where they have gone (in addition to a thank you for their interest in the book! I do love how many people have recognized it as a good source material for teaching a language). — [[User:Mithridates|Mithridates]] ([[User talk:Mithridates|discuss]] • [[Special:Contributions/Mithridates|contribs]]) 04:09, 10 November 2024 (UTC)
: {{keep}} the translations for languages that have an article on the English Wikipedia, i.e. Guosa, Idiom Neutral, Ido, Interlingua, Lingwa de Planeta, Negerhollands, Neo, Novial, Occidental, Romanica, Solresol, Toki Pona, and Volapük.
: Translations for languages that don't have an article can be kept if they have reliable sources, which I was able to find for the following languages (if you think they are not reliable, please let me know):
:* Globasa: [https://www.languagesandnumbers.com/how-to-count-in-globasa/en/globasa/] [https://greyson.conlang.org/2020/01/29/shouting-out-globasa-and-pandunia/]
:* Mini: [https://jprogr.github.io/mini] [https://www.omniglot.com/language/phrases/mini.htm] [https://www.languagesandnumbers.com/how-to-count-in-mini/en/mini/]
: {{del}} and move to [[User:Mithridates/SJ]] the rest of the translations, i.e. Audià/Audian, Cristianés, Ekumenski, Germanisch, Interocidental, Lingaust, Lingue Simple, Masa Tang, Mirad, Monav, Monkel, Mundeze, Nordien, Novlingue, Numo, Proyo, and Scuian/Meteza. If you can find reliable sources for those languages, please let me know.
: In particular, I could not find resources for Audià/Audian and Monav after searching through 15 and 17 pages on Google, respectively. It doesn't help that [[Òla, Ionatà!|their]] [[Hai, Jon!|translations]] don't explain what those languages are and where to find resources for them. This makes contributing to those translations almost impossible until @[[User:Caro de Segeda|Caro de Segeda]] can provide resources to us. It's possible that the resources may have disappared from the Internet, or that those languages were created by Caro de Segeda him/herself. If you can find resources for Audià/Audian and Monav, please let me know.
: I'm notifying the primary contributors of the translations: @[[User:Caro de Segeda|Caro de Segeda]], @[[User:Frzzl|Frzzl]], @[[User:Greatscotteh|Greatscotteh]], @[[User:IHateNumbers234|IHateNumbers234]], @[[User:Jayeless2|Jayeless2]], @[[User:Morozof|Morozof]], @[[User:Omnihom|Omnihom]], @[[User:Omoutuazn|Omoutuazn]], @[[User:PovriNaivon|PovriNaivon]], @[[User:Sir Beluga|Sir Beluga]] and @[[User:Tyoyafud|Tyoyafud]]. — [[User:EJPPhilippines|EJPPhilippines]] ([[User talk:EJPPhilippines|discuss]] • [[Special:Contributions/EJPPhilippines|contribs]]) 09:52, 30 June 2025 (UTC)
:: Caro de Segeda said on [https://www.reddit.com/r/conlangs/comments/1lcnz9g/comment/n0sc3wx/ Reddit] that Monav was created by him/her and that he/she didn't publish any resources about it other than [[Hai, Jon!]]. With '''zero''' other resources to rely on for contributing to the translation, and the fact that Monav is in [[User:Mithridates/SJ]], [[Hai, Jon!]] should be speedy deleted. — [[User:EJPPhilippines|EJPPhilippines]] ([[User talk:EJPPhilippines|discuss]] • [[Special:Contributions/EJPPhilippines|contribs]]) 01:38, 3 July 2025 (UTC)
::: I've undone the speedy deletion as Caro de Segeda posted a [https://prexins.wordpress.com/2025/07/04/monav/ resource] for Monav. — [[User:EJPPhilippines|EJPPhilippines]] ([[User talk:EJPPhilippines|discuss]] • [[Special:Contributions/EJPPhilippines|contribs]]) 07:18, 4 July 2025 (UTC)
:::: You can delete all the ones that I have created myself, I have already moved them to other places. — [[User:Caro de Segeda|Caro de Segeda]] ([[User talk:Caro de Segeda|discuss]] • [[Special:Contributions/Caro de Segeda|contribs]]) 12:39, 5 July 2025 (UTC)
{{outdent|::::}}I don't know if this is helpful since it wouldn't apply to most of these, but [[s:mul:]] could hold some of these. — [[User:Arlo Barnes|Arlo Barnes]] ([[User talk:Arlo Barnes|discuss]] • [[Special:Contributions/Arlo Barnes|contribs]]) 09:18, 30 November 2025 (UTC)
: I don't think that would be within the scope of that project. I'm not aware of any other situation where Wikisource publishes translations of texts created on Wikimedia projects - that's usually left up to other language editions of the same project. — [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 05:34, 1 December 2025 (UTC)
:: In this situation there isn't a separate [[s:ie:]] distinct from Multilingual Wikisource (see [[meta:Wikisource#List of Wikisources]]). In fact, there are very few multilingual wikis in the Wikimedia sphere; while this project ''could'' move to a Miraheze-hosted or similar wiki farm location, I think it would be a missed opportunity. I suppose an [[Interlingue]] book could be started in [[shelf:Constructed languages]] which would have all 100 chapters as an appendix (and likewise for the other languages), but that also seems non-ideal since it requires an English-language text that doesn't currently exist to be created. [[WB:AT]] seems to describe a similar situation to this one and prescribe Wikisource as the solution, and [[WB:SOURCE]] mentions fiction as out-of-scope for Wikibooks (even as in this case, language-educational fiction). [[s:mul:Wikisource:about Wikisource]] simply speaks of source texts and doesn't mention publication requirements, so maybe that is specific to some of the monolingual editions? — [[User:Arlo Barnes|Arlo Barnes]] ([[User talk:Arlo Barnes|discuss]] • [[Special:Contributions/Arlo Barnes|contribs]]) 22:28, 5 December 2025 (UTC)
:{{keep}} 100% keep. These books are a core part of language textbooks on Wikibooks and have been for years. Not sure why this is even being debated.--[[User:Xania|Xania]] [[Image:Flag_of_Estonia.svg|15px]] [[Image:Flag_of_Ukraine.svg|15px]] [[User talk:Xania|<sup>talk</sup>]] 17:55, 16 May 2026 (UTC)
::With all due respect, some of the books included in this nomination (like [[Sin Chao, Jonathan!]]) are written in constructed languages which are not substantially attested anywhere else. I struggle to imagine any educational purpose for such a book. [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 00:12, 17 May 2026 (UTC)
== [[International Baccalaureate]] ==
Not actually a book in and of itself; rather, it is just a compilation of links to other books —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 23:24, 18 October 2024 (UTC)
: Could this be salvaged as a shelf? [[User:Pppery|Pppery]] ([[User talk:Pppery|discuss]] • [[Special:Contributions/Pppery|contribs]]) 05:23, 27 January 2025 (UTC)
::Probably, but are the linked books even useful? IB exams change from year to year - sometimes quite dramatically - so an old exam guide is of very limited value. Many of these books were written 10-15 years ago, and some of them (like [[IB French]]) even have comments indicating that they're no longer applicable. [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 02:18, 8 December 2025 (UTC)
:I would be interested in a book that explains what an [[International Baccalaureate]] is. They may be books about it in the real world, but they are not free and with the online world becoming a fortress of paywalls I wonder how much longer one would be able to find such information on the web. This is what the wikipedia article says:
:* This article '''is missing information''' about the educational programs and curricula. Please expand the article to include this information. Further details may exist on the [[wikipedia:Talk:International_Baccalaureate#|talk page]]. ''(March 2025)''
:[[Special:Contributions/~2026-40500-29|~2026-40500-29]] ([[User talk:~2026-40500-29|talk]]) 02:05, 13 October 2026 (UTC)
== [[Character List for Baxter&Sagart]] ==
Seems completely out of scope as an educational book; it's just a list of characters and outlinks —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 23:53, 18 October 2024 (UTC)
:Adding [[Character List for Karlgren's GSR]] and [[Character List for Schuessler's CGSR]] for the same reason —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 23:55, 18 October 2024 (UTC)
:These three books do make a package and I agree they should be considered together. However, I strongly object to deleting them. They are really extremely useful resources. I use them every week and I know that many people who do work on Old Chinese phonology do so. There are lots of books out there that are lists of characters, these are called dictionaries. For example Axel Schuessler's ABC Etymological Dictionary of Old Chinese, or Pulleyblank's Lexicon of Reconstructed Pronunciation in Early Middle Chinese, Late Middle Chinese, and Early Mandarin. I see it as entirely a good thing for reference works of this kind to be available free online rather than only in expensive books in university research libraries. If this is in violation of a Wikibooks policy, I would at least like that policy to be drawn to my attention and to have some constructive comment offered about which Wikiproject such a resource should fall under. I will also say on a personal note that I have put literally hundreds of hours of work into these projects and it would grieve me a lot to see this work simply vanish, in particular when I know that colleagues around the world use these books. --[[User:Tibetologist|Tibetologist]] ([[User talk:Tibetologist|discuss]] • [[Special:Contributions/Tibetologist|contribs]]) 07:27, 1 November 2024 (UTC)
::Hi @[[User:Tibetologist|Tibetologist]], and thank you for the feedback! Official Wikibooks policy does not permit standalone dictionaries (see [[WB:DICT]]), though I understand the argument that it is a useful resource. I am wondering if there might be a home for it at [[Wiktionary:Wiktionary:Welcome, newcomers|Wiktionary]] or [[Wikiversity:Wikiversity:SHARE|Wikiversity]]? Cheers —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 12:14, 1 November 2024 (UTC)
:::The policy says to use Wiktionary, but these books cannot be moved there. In fact they link there, you can understand me as having made an index to wiktionary, if you like, where the ORDER of the characters is extremely important, information that would be lost in Wiktionary.
:::Wikiversity is not a project I participate in, and in any event my books here are older than it, so this option was not available for me at the relevant moment. If you are offering to move my books to Wikiversity, that is very kind of you and I will very graciously accept. [[User:Tibetologist|Tibetologist]] ([[User talk:Tibetologist|discuss]] • [[Special:Contributions/Tibetologist|contribs]]) 14:10, 1 November 2024 (UTC)
::::I have pinged over at Wikiversity Colloquium to ask about suitability and have looped you into the conversation over there. Cheers —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 18:20, 1 November 2024 (UTC)
::I concur. I'm just an undergrad who tries to learn about Sino-Tibetan historical linguistics in his free time but I've found this wikibook to be incredibly useful, and I keep it open in one tab while I watch Professor Nathan Hill's lectures that he uploads to youtube in another tab, and another tab for taking notes. In fact if I remember correctly Professor Hill actually pointed his students to this wikibook.
::I'm not familiar with [[wikiversity:Wikiversity:SHARE|Wikiversity]] but if all the content were as accessible there as it is here then I think that could work. [[User:ChromeBones|ChromeBones]] ([[User talk:ChromeBones|discuss]] • [[Special:Contributions/ChromeBones|contribs]]) 02:43, 9 July 2025 (UTC)
:Per [[:v:Wikiversity:Colloquium#Import_Resource_From_Wikibooks?]], I recommend copying and pasting, including attribution via the edit summary and talk page, add appropriate categories and links, and then it could be deleted locally. —[[User:Koavf|Justin (<span style="color:grey">ko'''a'''vf</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 22:32, 3 November 2024 (UTC)
== [[Suomen kieli käyttöön]] ==
Multiple pages in this book are written entirely in Finnish, which is out of the enWB scope. —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 00:09, 19 October 2024 (UTC)
:I was going to say whether we should ask any fiwikibooks sysop to maybe see if this could be transwikied to fiwb if it's within the scope there. But [[:fi:Toiminnot:Käyttäjät/sysop]] indicates that there are only 3 sysops, and only {{u|Anr}} and {{u|Zache}} have made edits this ''year''. If they deem it to be salvageable, then transwiki + delete, otherwise straight-up delete. --[[User:SHB2000|SHB2000]] ([[User talk:SHB2000|discuss]] • [[Special:Contributions/SHB2000|contribs]]) 11:24, 14 November 2024 (UTC)
::It seems that the idea behind the book was for the pages to be bilingual, as it’s a language learning book. That’s why there are Finnish texts included intentionally even on the pages that are complete. There are similar books in dewikibooks and ruwikibooks as well. For the English version, I think the easiest way to proceed would be to clean up and adjust the page layout to fit enwikibooks better, and then translate the missing parts. By the way, if anyone wants to update the book’s name in English, it can be titled ''"Using the Finnish Language"'' or ''"Put Finnish Language into Use"'' for a direct translation. [[User:Zache|Zache]] ([[User talk:Zache|discuss]] • [[Special:Contributions/Zache|contribs]]) 11:57, 14 November 2024 (UTC)
== [[AT&T Mobility FAQ]] ==
* [[AT&T Mobility FAQ]]
* [[AT&T Mobility FAQ/MEdia Net Configuration]]
* [[AT&T Mobility FAQ/Data Connect Configuration]]
An ''extremely'' outdated FAQ on AT&T's cell phone services. Most of this document was written 20+ years ago as a Usenet FAQ; very little of it is accurate or useful anymore (particularly the two subpages, which have to do with obsolete configurations for "tethering" a computer to a cell phone). No objection if someone wants to update it, but there's clearly been no appetite to do that. [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 22:20, 30 December 2024 (UTC)
:I'm wondering if it might make sense for us to develop some kind of policy on archiving books here. There are many like this one that have a good deal of content but are extremely out of date and just not useful as originally intended. ——[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 22:34, 30 December 2024 (UTC)
::@[[User:Kittycataclysm|Kittycataclysm]]: See the newly developed [[Wikibooks:Outdated books]]. [[User:JJPMaster|JJP]]<sub>[[User talk:JJPMaster|Mas]]<sub>[[Special:Contributions/JJPMaster|ter]]</sub></sub> ([[wikt:she|she]]/[[wikt:they|they]]) 00:16, 31 December 2024 (UTC)
:::Ooh, thanks - something like that seems like it could be an appropriate way to handle this book. A lot of the other outdated books I've tagged have been so incomplete that they wouldn't have been particularly useful even as historical references; this one might at least have some interest.
:::Any chance we can get a separate namespace (maybe "Archive:") set up for archived book content? That'd make it possible to do things like exclude them from on-site search by default. [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 21:07, 31 December 2024 (UTC)
::::I think this might be a more extended discussion, so I'll bump it over to the [[Wikibooks talk:Outdated books|talk page of the draft policy]]! —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 21:54, 31 December 2024 (UTC)
== Algebra/Chapter 10/Symmetric Polynomials ==
I personally believe that [[Algebra/Chapter 10/Symmetric Polynomials|this]], and all of the sections should be deleted for the fact that this goes WAY beyond the scope of what was intended for the Chapter (Algebra II level polynomials). [[User:GoreyCat|GoreyCat]] ([[User talk:GoreyCat|discuss]] • [[Special:Contributions/GoreyCat|contribs]]) 15:07, 6 February 2025 (UTC)
:'''Split''': Deletion here is not the best solution (see [[w:WP:ATD]]). Instead, this page and its subpages should be moved to another book, most likely [[Abstract Algebra]]. [[User:JJPMaster|JJP]]<sub>[[User talk:JJPMaster|Mas]]<sub>[[Special:Contributions/JJPMaster|ter]]</sub></sub> ([[wikt:she|she]]/[[wikt:they|they]]) 17:35, 6 February 2025 (UTC)
:{{keep}} since there is a good amount of content. If [[Abstract Algebra]] is appropriate, it seems like a fine idea to move there. —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 22:59, 7 February 2025 (UTC)
::Eh, yeah, I supposed moving it is better. I just don't think it's suitable for where it appears. [[User:GoreyCat|GoreyCat]] ([[User talk:GoreyCat|discuss]] • [[Special:Contributions/GoreyCat|contribs]]) 01:40, 8 February 2025 (UTC)
== [[Puredyne]] ==
Development of Puredyne Linux was discontinued in 2012, and the software no longer appears to be available for download anywhere. (An archive of the web site is still up - with a bunch of embedded spam links - but the download links are all dead.) Is this a suitable candidate for archival (cf. [[Wikibooks:Outdated books]]), or should it just be deleted? [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 04:35, 5 March 2025 (UTC)
:I'd just archive stuff like this. Looks like a decent bit of work went into it, and you never know when someone might need to use Puredyne for some obscure project. I'd be willing to bet mirrors exist of it somewhere, or someone has it on a drive. If you want to find some stuff worth deleting, comb through [[:Category:Allbooks categories]]. [[User:MediaKyle|MediaKyle]] ([[User talk:MediaKyle|discuss]] • [[Special:Contributions/MediaKyle|contribs]]) 11:30, 5 March 2025 (UTC)
== [[Template:Qr-twwp]] ==
This isn't exactly a request to delete the template, but rather to merge it with {{tlx|Copypaste}}. The {{tlx|Qr-twwp}} template serves the same purpose as {{tlx|Copypaste}}, but without the seven-day period after which the page is deleted. This leads to confusion, as well as a perpetually full [[:Category:Queried pages]]. [[User:JJPMaster|JJP]]<sub>[[User talk:JJPMaster|Mas]]<sub>[[Special:Contributions/JJPMaster|ter]]</sub></sub> ([[wikt:she|she]]/[[wikt:they|they]]) 17:37, 30 March 2025 (UTC)
== [[Ghouls of the Miskatonic]] ==
I don't think that a plot summary of a book is in-scope here. —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 18:43, 20 August 2025 (UTC)
:{{vd}} - at least, not a summary of ''this'' book. A summary and/or study guide to a notable work of literature might be in scope, but this is certainly not one. [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 21:23, 25 August 2025 (UTC)
::Hi. I am the creator of the pages of this book. If I understand correctly, it has to be a summary of a notable work of literature? So what exactly is defined as such? I only started this as I thought it would be fun, interesting and encouraging to others who read the Arkham Horror novels, and I thought it was permitted as I've seen other summaries of books on wikibooks. [[User:Dayne90|Dayne90]] ([[User talk:Dayne90|discuss]] • [[Special:Contributions/Dayne90|contribs]]) 13:27, 26 August 2025 (UTC)
:::Your problem is it is just the plot... it needs to include an educational textual analysis to be in scope [[User:MarcGarver|MarcGarver]] ([[User talk:MarcGarver|discuss]] • [[Special:Contributions/MarcGarver|contribs]]) 12:47, 28 August 2025 (UTC)
::::And ideally it'd be a text which has ''already'' been the subject of literary analysis, such that the analysis on Wikibooks isn't original research. A notable work of literature like ''Frankenstein'' or ''Moby-Dick'' would easily meet that requirement; a tie-in novel for a tabletop RPG probably does not. [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 22:08, 29 August 2025 (UTC)
== [[A-level Computing AQA Paper 1 Skeleton program 2027]] ==
{{closed|Considering the recent comments and due to no objections, I converted it to a soft redirect until another admin decides if the page can be deleted. CC to [[user:MrBerard|MrBerard]]. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 18:51, 15 October 2026 (UTC)}}
This was proposed for speedy deletion by [[User:Omphalographer]] as 'not being a book'. However, I think this page's future requires further discussion from the community. Maybe some input would be appreciated?[[User:TechVindicator|TechVindicator]] ([[User talk:TechVindicator|discuss]] • [[Special:Contributions/TechVindicator|contribs]]) 23:51, 21 September 2026 (UTC)
:As best I can tell, this is a page students are using to collaborate on solutions for a standardized test. There are a number of similar pages for other years linked from [[A-level Computing/AQA/Paper 1/Skeleton program]].
:This is not a good fit for Wikibooks. If these students are interested in this kind of collaboration, it should take place elsewhere. [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 00:14, 22 September 2026 (UTC)
::The project can be moved to Wikiversity, I think. If the students can contribute it and make sure it complies with Wikibooks' guidelines, it can stay here. [[User:TechVindicator|TechVindicator]] ([[User talk:TechVindicator|discuss]] • [[Special:Contributions/TechVindicator|contribs]]) 00:17, 22 September 2026 (UTC)
:::@[[User:Omphalographer|Omphalographer]] @[[User:TechVindicator|TechVindicator]]
:::There's been a Wikibook on this every single year, as I mentioned in my comment on the deletion notice. That doesn't mean that this shouldn't be on Wikiversity, just that there is ample precedent of it being a Wikibook. Dunno if this matter to those kind of editorial decisions, though. [[Special:Contributions/~2026-51010-27|~2026-51010-27]] ([[User talk:~2026-51010-27|talk]]) 13:39, 22 September 2026 (UTC)
::::@[[User:~2026-51010-27|~2026-51010-27]]: How would the page comply with [[WB:What is Wikibooks?|Wikibooks' mission]]?. Could you provide an explanation of what the project is? If it's a collaborative project to work on solutions for a standardized test (like @[[User:Omphalographer|Omphalographer]] said), it would be more suitable for Wikiversity. If it's a textbook about A-level computing, then it would be suitable here. [[User:TechVindicator|TechVindicator]] ([[User talk:TechVindicator|discuss]] • [[Special:Contributions/TechVindicator|contribs]]) 13:58, 22 September 2026 (UTC)
:::::Hi,
:::::This is definitely the former, not the latter. As I said, I don't particularly think this should be on Wikibooks, it just happens the previous years had been, and clearly they weren't subject to this degree of scrutiny 😅
:::::I have created https://en.wikiversity.org/wiki/A-level_Computer_Science_AQA_Paper_1_Skeleton_program_2027 - I'll delete the content of the page and put the link at the top. If there is a more appropriate banner to indicate the migration, please make it look how it should :D [[User:MrBerard|MrBerard]] ([[User talk:MrBerard|discuss]] • [[Special:Contributions/MrBerard|contribs]]) 10:23, 29 September 2026 (UTC)
::::::I can't seem to put a link without the edit being deemed destructive, so I'll let you trusted people do what's needed. [[User:MrBerard|MrBerard]] ([[User talk:MrBerard|discuss]] • [[Special:Contributions/MrBerard|contribs]]) 10:27, 29 September 2026 (UTC)
: {{comment}}: I cannot determine consensus in this request on whether or not it should either be deleted or imported to English Wikiversity. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:28, 13 October 2026 (UTC)
::I've actioned the migration to Wikiversity as per my comment of 29 sep. I'd rather this stayed in as a stub with a link to the Wikiversity entry, for a couple of months, though I'm sure search engines are still vaguely good enough that this shouldn't matter too much. [[User:MrBerard|MrBerard]] ([[User talk:MrBerard|discuss]] • [[Special:Contributions/MrBerard|contribs]]) 14:35, 13 October 2026 (UTC)
{{end closed}}
== [[Talmudic aramic]] ==
{{closed|Deleted per consensus below. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:18, 13 October 2026 (UTC)}}
Per the user's other mass-created pages, I concur with the AI flagging that Kittycataclysm placed on the page. I believe this to be LLM-generated, and it should thus be deleted. [[User:EggRoll97|EggRoll97]] ([[User talk:EggRoll97|discuss]] • [[Special:Contributions/EggRoll97|contribs]]) 03:29, 30 September 2026 (UTC)
:{{vd}}, LLM spam. [[User:Ternera|Ternera]] ([[User talk:Ternera|discuss]] • [[Special:Contributions/Ternera|contribs]]) 13:22, 30 September 2026 (UTC)
:{{vd}} - like most LLM-generated books, this is heavy on structure and light on substance. Most of the content amounts to a poorly organized glossary, and there are a lot of pieces missing. (For instance, there is no discussion of the grammar of the language beyond a couple of fixed expressions.) [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 19:11, 1 October 2026 (UTC)
:{{vd}} per stated reasoning. —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 14:43, 12 October 2026 (UTC)
{{end closed}}
== [[Job Search]] ==
{{closed|Per minimal consensus, I deleted these books, but I only kept the main pages of these books by creating them as redirects for [[Find Employment]]. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:24, 13 October 2026 (UTC)}}
* as well as [[Job Search Automation for College Students]].
Neither of these books contains any useful information. The first book seems to be written primarily to funnel users to the second, and the second to funnel users to [[PlanoTse Handbook for Job Search Automation]], which was deleted last year. (The deletion request doesn't seem to have been archived.)
The sum total of information in these two books is, essentially, "you can search for jobs online", which is insultingly trivial. The second book's suggestion that users automate the job search process is of no practical value; most web search engines and job search sites nowadays will detect and block automated access.
[[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 18:36, 1 October 2026 (UTC)
: {{vd}} and redirect to [[Find Employment]]. ‑‑[[User:Kai Burghardt|Kai Burghardt]] ([[User talk:Kai Burghardt|discuss]] • [[Special:Contributions/Kai Burghardt|contribs]]) 05:14, 2 October 2026 (UTC)
{{end closed}}
== [[Wikipage]] ==
{{closed|Deleted per minimal consensus below. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:26, 13 October 2026 (UTC)}}
Like a few other books created by this user, the purpose of this book appears to have been to promote a piece of software written by the author ([[User:Planotse]]). The software is no longer available, and there is no actual content in the book.
[[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 18:40, 1 October 2026 (UTC)
:{{Vd}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 15:30, 12 October 2026 (UTC)
{{end closed}}
== [[Becoming a Linguistic Mastermind]] ==
{{closed|Deleted. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 00:11, 15 October 2026 (UTC)}}
Old book (created 2007) with no substantial content. The intent of this book appears to have been to create a single textbook encompassing ''all'' languages, with sub-courses for each language at [[Becoming a Linguistic Mastermind/The courses]], but no such courses were ever created. An analogous project on dewikibooks [[:b:de:Wikibooks:Löschkandidaten/ 2011-04#Der einfache Weg zum Sprachgenie|was deleted in 2011 for similar reasons]]. [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 21:20, 7 October 2026 (UTC)
:{{Vd}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 15:30, 12 October 2026 (UTC)
{{end closed}}
== [[The Permanent Advantage]] ==
{{closed|Speedily deleted —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 20:15, 14 October 2026 (UTC)}}
Probably LLM-generated, given broken templates, references to Claude, and section identifiers. This could probably be speedied, but not 100% sure so throwing it to RfD. Even regardless of whether it's LLM-generated or not, I can't see any way it's really suitable for the project. [[User:EggRoll97|EggRoll97]] ([[User talk:EggRoll97|discuss]] • [[Special:Contributions/EggRoll97|contribs]]) 07:49, 10 October 2026 (UTC)
:{{vd}} - a book ''about'' chess problems isn't necessarily out of scope, but there needs to be some written content to accompany the problems. And I'm not sure these are even meaningful problems - the few problems with viewable Lichess links appear to be in the early game, so there aren't necessarily objective "solutions" to them. [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 19:51, 10 October 2026 (UTC)
:{{vd}}, the Claude references throughout the book support that it's LLM-generated. [[User:Ternera|Ternera]] ([[User talk:Ternera|discuss]] • [[Special:Contributions/Ternera|contribs]]) 14:55, 11 October 2026 (UTC)
:This looked like a speedy to me, so I went ahead and deleted it. Thanks! —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 20:14, 14 October 2026 (UTC)
{{end closed}}
== [[Digital Synthora]] ==
Not within WB scope since it seems to be entirely fabricated by the editor. —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 14:20, 12 October 2026 (UTC)
:{{vd}} While some amount of original research is allowed here, completely fabricated topics aren't. This is just fiction writing, which is nice, but not within our scope. ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 15:30, 12 October 2026 (UTC)
:{{vd}} - per my initial tag, this appears to be an invention of the page creator; I can't find anything relevant online beyond the empty https://synthoraactstuff.fandom.com/. [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 01:32, 13 October 2026 (UTC)
== [[Wikibooks:FlaggedRevs Extension]] ==
Flagged Revisions is dead. Flagged Revisions remains dead. And we have killed it. How shall we comfort ourselves, the murderers of all murderers? Well, not in the least by deleting its project page and subpages. [[User:JJPMaster|JJP]]<sub>[[User talk:JJPMaster|Mas]]<sub>[[Special:Contributions/JJPMaster|ter]]</sub></sub> ([[wikt:she|she]]/[[wikt:they|they]]) 06:16, 17 October 2026 (UTC)
:Would it be better to mark it as historical, or update the page to say it's dead? I only say this because we've used this extension for a ''very'' long time. {{vd}} all the subpages, however. //[[User:SHB|SHB]] ([[User talk:SHB|discuss]] • [[Special:Contributions/SHB|contribs]]) 09:16, 17 October 2026 (UTC)
:: So far, there is only one subpage, [[Wikibooks:FlaggedRevs Extension/Unstable]]. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:37, 17 October 2026 (UTC)
8qrsur93khoneqpd3imh5lil8ui9ab9
4676569
4676535
2026-10-17T18:33:53Z
Omphalographer
3427146
/* Wikibooks:FlaggedRevs Extension */ Reply
4676569
wikitext
text/x-wiki
__NEWSECTIONLINK__
[[Category:Wikibooks deletion|{{PAGENAME}}]]
{{Discussion Rooms}}
{{TOCleft}}
{{shortcut|WB:RFD}}
{{Requests for deletion/New deletion}}
{{Requests for deletion/Deletion intro}}
<!-- New deletion nominations go at the bottom of page. -->
== [[Salute, Jonathan!]] and its translations ==
<div style="column-count: 7;">
* [[Salute, Jonathan!|Interlingue/Occidental]] ([[w:en:Occidental|w]], original)
* [[Òla, Ionatà!|Audià]]
* [[Holo, Jonathan!|Cristianés]]
* [[Terve, Jonathan!|Ekumenski]]
* [[Hej, Jonathan! (Germanisch)|Germanisch]]
* [[Salom, Jonatan!|Globasa]]
* [[Àlŏ, Jonathan!|Guosa]] ([[w:en:Guosa|w]])
* [[Salut, Jonathan!|Idiom Neutral]] ([[w:en:Idiom Neutral|w]])
* [[Saluto, Jonathan! (Ido)|Ido]] ([[w:en:Ido|w]])
* [[Hallo, Jonathan!|Interlingua]] ([[w:en:Interlingua|w]])
* [[Salut, Jonathan! (Interocidental)|Interocidental]]
* [[Bune Ğonatan!|Lingaust]]
* [[Oila, Jonatan!|Lingue Simple]]
* [[Haloo, Jonatan!|Lingwa de Planeta]] ([[w:en:Lingwa de Planeta|w]])
* [[Sin Chao, Jonathan!|Masa Tang]]
* [[Salut, ionatano!|Meteza]]
* [[Salu, Jon!|Mini]]
* [[Hay, Jonathan!|Mirad]]
* [[Hai, Jon!|Monav]]
* [[Sesan Jon!|Monkel]]
* [[Salam, Jonathan!|Mundeze]]
* [[Dag, Jonathan!|Negerhollands]] ([[w:en:Negerhollands|w]])
* [[Salut Jonathan!|Neo]] ([[w:en:Neo|w]])
* [[Hej, Jonathan!|Nordien]]
* [[Saluto, Jonathan!|Novial]] ([[w:en:Novial|w]])
* [[Salute, Jonathan! (Novlingue)|Novlingue]]
* [[Alo, Jonathan!|Numo]]
* [[Hela, Jonathan!|Proyo]]
* [[Salute, Jonathan! (Romanica)|Romanica]] ([[w:en:Romanica|w]])
* [[Simi, Jonathan!|Solresol]] ([[w:en:Solresol|w]])
* [[Toki a, jan Jonatan!|Toki Pona]] ([[w:en:Toki Pona|w]])
* [[Glidis, o Jonathan!|Volapük]] ([[w:en:Volapük|w]])
</div>
There are a couple of issues here:
# Beyond their introductions, all of these books are written in languages which are not English, making them out of scope for the English Wikibooks.
# All but one of these books are in fact written in constructed languages, most of them in recently created conlangs. In some cases (e.g. [[Sin Chao, Jonathan!]]), I can't find any reliable sources describing the target language outside of the translation itself.
# Most of the translations (i.e. other than [[Salute, Jonathan!]] itself) were abandoned within the first five or so chapters (out of 100); none of them are complete, and there seems to be little effort to complete any of them.
While I recognize that this is an unusual project, and potentially one which could have some value, it's not at all clear to me that the English Wikibooks is the right place for it. — [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 00:24, 29 September 2024 (UTC)
: I'm really not sure what to do about these ones. While I recognize that this approach is certainly one method of teaching a language, I'm not sure that it constitutes an educational textbook. We do require that the English Wikibooks be written in English—for language-learning books, this typically means that the instructional parts are in English while the exercises are in the language being taught. I do think that if the language doesn't have much supporting evidence outside the book itself, it can safely be deleted. — [[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 01:01, 29 September 2024 (UTC)
: Author of the book here. I originally wanted to put it in the Interlingue Wikibooks https://ie.wikibooks.org/wiki/Principal_p%C3%A1gine but it somehow got locked when I wasn't paying attention and so I ended up putting it here. Getting it unlocked requires going through the process of starting an Incubator and all the rest so I opted for here and then started putting some English-only content once it was done. It's sort of in the same vein as books like Lingua Latina per se Illustrata that have separate versions with teacher notes and whatnot. [[Salute, Jonathan!/Capitul 1 - with notes]] After it was done the auxlang community really took to it which was a nice surprise. I think Ido has the largest number of chapters at the moment at 15.
:If the vast content of this book could be used to justify a quick reopening of the Interlingue Wikibooks to move it there, I'd love to do that. I imagine that an incubator with 100+ book chapters would be enough to open a Wikibooks and that's what this is. — [[User:Mithridates|Mithridates]] ([[User talk:Mithridates|discuss]] • [[Special:Contributions/Mithridates|contribs]]) 06:02, 29 September 2024 (UTC)
: Ah, I just realized that we do have a proposal to reopen the Interlingue Wikibooks: https://meta.wikimedia.org/wiki/Requests_for_new_languages/Wikibooks_Interlingue along with an Incubator page here. https://incubator.wikimedia.org/wiki/Wb/ie/Principal_p%C3%A1gine
: How easy would it be to migrate the entirety of Salute Jonathan to there? — [[User:Mithridates|Mithridates]] ([[User talk:Mithridates|discuss]] • [[Special:Contributions/Mithridates|contribs]]) 06:30, 29 September 2024 (UTC)
:: Hi @[[User:Mithridates|Mithridates]]! I'm not sure how incubator projects work, but I fully support migrating these books there. You may want to inquire over there and link to this discussion to support your request to move the content over there. Cheers! — [[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 13:16, 29 September 2024 (UTC)
::: Hi! Actually I have a third idea to propose after thinking about this again today (haven't been here much since I finished the book): I noticed that there is more English content than I remember and that might make it an awkward fit for the Interlingue Wikibooks. I definitely agree that having all the auxlang translations for new auxlang projects goes well beyond the scope of this Wikibooks. Finally, there are some auxlangs that are notable with their own Wikipedias.
::: So the idea is the following:
:::# Leave the original here and I can continue the work on the version with English notes and grammar. That will make it the same as Lingua Latina per se Illustrata, English by the Nature Method, Athenaze and all the rest.
:::# The Interlingua one can move to the Interlingua Wikibooks (maybe Romanica too if they want as it is sort of a dialect of Interlingua).
:::# For Ido and Lingua Franca Nova which have a Wikipedia but not a Wikibooks, I'm a little bit unsure...technically they could have their own version like the original one but would require English explanations. I could let them know and see if they are willing to do so and see what they think (work on adding English to the books vs. move the content elsewhere).
:::# The rest can move to a Github repo, then be deleted, and the front page of this book can have a single link to the repo.
::: Any thoughts on that? Adding the extra English content will be easy as it is my book and I know it inside and out.
::: Edit: [https://en.wikibooks.org/wiki/Salute,_Jonathan!/Grammar_(pronouns) this page] I just added. — [[User:Mithridates|Mithridates]] ([[User talk:Mithridates|discuss]] • [[Special:Contributions/Mithridates|contribs]]) 13:50, 29 September 2024 (UTC)
:::: Thanks for taking the time to consider this! Here are my responses/questions:
::::* Is the original [[Salute, Jonathan!]] (Occidental)? Since that one is quite fleshed out, I agree that if you edit it so the primary language of the book (e.g. headers, instructions, etc) are written in English while leaving the actual story in Occidental, it would be okay and fit in more with instructional language textbooks.
::::* For your points 2 and 3, I'm not sure how those other projects work, so I'll leave it up to them. I'm not quite sure why they would need to move, since in theory they could be revised with English as the language of instruction? Although, they have been left incomplete for a long time.
::::* For your point 4, I have no problem with that. Cheers! — [[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 16:51, 29 September 2024 (UTC)
::::: Hello again, it's the weekend so I have a bit more time to work on this. I've decided to merge the extra content from the following five chapters since the difference is fairly small and the original chapters should now have this English content. Could you delete these five pages now that they are no longer needed? [[User:Mithridates|Mithridates]] ([[User talk:Mithridates|discuss]] • [[Special:Contributions/Mithridates|contribs]]) 14:02, 5 October 2024 (UTC)
::::: [[Salute, Jonathan!/Capitul 1 - with notes]]
::::: [[Salute, Jonathan!/Capitul 2 - with notes]]
::::: [[Salute, Jonathan!/Capitul 3 - with notes]]
::::: [[Salute, Jonathan!/Capitul 4 - with notes]]
::::: [[Salute, Jonathan!/Capitul 5 - with notes]] [[User:Mithridates|Mithridates]] ([[User talk:Mithridates|discuss]] • [[Special:Contributions/Mithridates|contribs]]) 14:02, 5 October 2024 (UTC)
:::::: [[File:Yes_check.svg|{{#ifeq:|small|8|15}}px|link=|alt=]] {{#ifeq:|small|<small>|}}'''Done'''{{#ifeq:|small|</small>|}} — [[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 23:34, 5 October 2024 (UTC)
::::::: Hi again! No luck trying to find a home for the random language translations on other auxlang wikis, can't find one that is actively maintained.
::::::: The thought struck me that maybe I could just put those ones on a sub page of my user page, would that be permitted? If not, I think I'll just stick them somewhere in GitHub and call it a day since none of the people who started the translations seem to care enough to do anything about them. I'd rather not see them outright disappear but since they aren't mine I don't care enough about them to do much more work than copy and paste them somewhere.
::::::: (I would leave the ones in languages with an ISO-639 code and Wikipedia here, of course) — [[User:Mithridates|Mithridates]] ([[User talk:Mithridates|discuss]] • [[Special:Contributions/Mithridates|contribs]]) 14:13, 9 November 2024 (UTC)
:::::::: Thank you for checking! I don't personally see an issue with moving them to your user space right now. Cheers — [[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 17:21, 9 November 2024 (UTC)
::::::::: Thanks a lot! I've started a single page where I will put them all here [[User:Mithridates/SJ]] and will proceed slowly due to lack of time and also to avoid stepping on any toes / asking you to delete too much at a time and possibly deleting the wrong content.
::::::::: For this week I have put the content for the languages Audia, Cristianès, Guosa, Lingaust, Mini, Mirad, and Monav on that page as they all have a single page of content and didn't take much time to move. Please delete those. Once they are gone I will add a note on the main page letting people know where they have gone (in addition to a thank you for their interest in the book! I do love how many people have recognized it as a good source material for teaching a language). — [[User:Mithridates|Mithridates]] ([[User talk:Mithridates|discuss]] • [[Special:Contributions/Mithridates|contribs]]) 04:09, 10 November 2024 (UTC)
: {{keep}} the translations for languages that have an article on the English Wikipedia, i.e. Guosa, Idiom Neutral, Ido, Interlingua, Lingwa de Planeta, Negerhollands, Neo, Novial, Occidental, Romanica, Solresol, Toki Pona, and Volapük.
: Translations for languages that don't have an article can be kept if they have reliable sources, which I was able to find for the following languages (if you think they are not reliable, please let me know):
:* Globasa: [https://www.languagesandnumbers.com/how-to-count-in-globasa/en/globasa/] [https://greyson.conlang.org/2020/01/29/shouting-out-globasa-and-pandunia/]
:* Mini: [https://jprogr.github.io/mini] [https://www.omniglot.com/language/phrases/mini.htm] [https://www.languagesandnumbers.com/how-to-count-in-mini/en/mini/]
: {{del}} and move to [[User:Mithridates/SJ]] the rest of the translations, i.e. Audià/Audian, Cristianés, Ekumenski, Germanisch, Interocidental, Lingaust, Lingue Simple, Masa Tang, Mirad, Monav, Monkel, Mundeze, Nordien, Novlingue, Numo, Proyo, and Scuian/Meteza. If you can find reliable sources for those languages, please let me know.
: In particular, I could not find resources for Audià/Audian and Monav after searching through 15 and 17 pages on Google, respectively. It doesn't help that [[Òla, Ionatà!|their]] [[Hai, Jon!|translations]] don't explain what those languages are and where to find resources for them. This makes contributing to those translations almost impossible until @[[User:Caro de Segeda|Caro de Segeda]] can provide resources to us. It's possible that the resources may have disappared from the Internet, or that those languages were created by Caro de Segeda him/herself. If you can find resources for Audià/Audian and Monav, please let me know.
: I'm notifying the primary contributors of the translations: @[[User:Caro de Segeda|Caro de Segeda]], @[[User:Frzzl|Frzzl]], @[[User:Greatscotteh|Greatscotteh]], @[[User:IHateNumbers234|IHateNumbers234]], @[[User:Jayeless2|Jayeless2]], @[[User:Morozof|Morozof]], @[[User:Omnihom|Omnihom]], @[[User:Omoutuazn|Omoutuazn]], @[[User:PovriNaivon|PovriNaivon]], @[[User:Sir Beluga|Sir Beluga]] and @[[User:Tyoyafud|Tyoyafud]]. — [[User:EJPPhilippines|EJPPhilippines]] ([[User talk:EJPPhilippines|discuss]] • [[Special:Contributions/EJPPhilippines|contribs]]) 09:52, 30 June 2025 (UTC)
:: Caro de Segeda said on [https://www.reddit.com/r/conlangs/comments/1lcnz9g/comment/n0sc3wx/ Reddit] that Monav was created by him/her and that he/she didn't publish any resources about it other than [[Hai, Jon!]]. With '''zero''' other resources to rely on for contributing to the translation, and the fact that Monav is in [[User:Mithridates/SJ]], [[Hai, Jon!]] should be speedy deleted. — [[User:EJPPhilippines|EJPPhilippines]] ([[User talk:EJPPhilippines|discuss]] • [[Special:Contributions/EJPPhilippines|contribs]]) 01:38, 3 July 2025 (UTC)
::: I've undone the speedy deletion as Caro de Segeda posted a [https://prexins.wordpress.com/2025/07/04/monav/ resource] for Monav. — [[User:EJPPhilippines|EJPPhilippines]] ([[User talk:EJPPhilippines|discuss]] • [[Special:Contributions/EJPPhilippines|contribs]]) 07:18, 4 July 2025 (UTC)
:::: You can delete all the ones that I have created myself, I have already moved them to other places. — [[User:Caro de Segeda|Caro de Segeda]] ([[User talk:Caro de Segeda|discuss]] • [[Special:Contributions/Caro de Segeda|contribs]]) 12:39, 5 July 2025 (UTC)
{{outdent|::::}}I don't know if this is helpful since it wouldn't apply to most of these, but [[s:mul:]] could hold some of these. — [[User:Arlo Barnes|Arlo Barnes]] ([[User talk:Arlo Barnes|discuss]] • [[Special:Contributions/Arlo Barnes|contribs]]) 09:18, 30 November 2025 (UTC)
: I don't think that would be within the scope of that project. I'm not aware of any other situation where Wikisource publishes translations of texts created on Wikimedia projects - that's usually left up to other language editions of the same project. — [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 05:34, 1 December 2025 (UTC)
:: In this situation there isn't a separate [[s:ie:]] distinct from Multilingual Wikisource (see [[meta:Wikisource#List of Wikisources]]). In fact, there are very few multilingual wikis in the Wikimedia sphere; while this project ''could'' move to a Miraheze-hosted or similar wiki farm location, I think it would be a missed opportunity. I suppose an [[Interlingue]] book could be started in [[shelf:Constructed languages]] which would have all 100 chapters as an appendix (and likewise for the other languages), but that also seems non-ideal since it requires an English-language text that doesn't currently exist to be created. [[WB:AT]] seems to describe a similar situation to this one and prescribe Wikisource as the solution, and [[WB:SOURCE]] mentions fiction as out-of-scope for Wikibooks (even as in this case, language-educational fiction). [[s:mul:Wikisource:about Wikisource]] simply speaks of source texts and doesn't mention publication requirements, so maybe that is specific to some of the monolingual editions? — [[User:Arlo Barnes|Arlo Barnes]] ([[User talk:Arlo Barnes|discuss]] • [[Special:Contributions/Arlo Barnes|contribs]]) 22:28, 5 December 2025 (UTC)
:{{keep}} 100% keep. These books are a core part of language textbooks on Wikibooks and have been for years. Not sure why this is even being debated.--[[User:Xania|Xania]] [[Image:Flag_of_Estonia.svg|15px]] [[Image:Flag_of_Ukraine.svg|15px]] [[User talk:Xania|<sup>talk</sup>]] 17:55, 16 May 2026 (UTC)
::With all due respect, some of the books included in this nomination (like [[Sin Chao, Jonathan!]]) are written in constructed languages which are not substantially attested anywhere else. I struggle to imagine any educational purpose for such a book. [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 00:12, 17 May 2026 (UTC)
== [[International Baccalaureate]] ==
Not actually a book in and of itself; rather, it is just a compilation of links to other books —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 23:24, 18 October 2024 (UTC)
: Could this be salvaged as a shelf? [[User:Pppery|Pppery]] ([[User talk:Pppery|discuss]] • [[Special:Contributions/Pppery|contribs]]) 05:23, 27 January 2025 (UTC)
::Probably, but are the linked books even useful? IB exams change from year to year - sometimes quite dramatically - so an old exam guide is of very limited value. Many of these books were written 10-15 years ago, and some of them (like [[IB French]]) even have comments indicating that they're no longer applicable. [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 02:18, 8 December 2025 (UTC)
:I would be interested in a book that explains what an [[International Baccalaureate]] is. They may be books about it in the real world, but they are not free and with the online world becoming a fortress of paywalls I wonder how much longer one would be able to find such information on the web. This is what the wikipedia article says:
:* This article '''is missing information''' about the educational programs and curricula. Please expand the article to include this information. Further details may exist on the [[wikipedia:Talk:International_Baccalaureate#|talk page]]. ''(March 2025)''
:[[Special:Contributions/~2026-40500-29|~2026-40500-29]] ([[User talk:~2026-40500-29|talk]]) 02:05, 13 October 2026 (UTC)
== [[Character List for Baxter&Sagart]] ==
Seems completely out of scope as an educational book; it's just a list of characters and outlinks —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 23:53, 18 October 2024 (UTC)
:Adding [[Character List for Karlgren's GSR]] and [[Character List for Schuessler's CGSR]] for the same reason —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 23:55, 18 October 2024 (UTC)
:These three books do make a package and I agree they should be considered together. However, I strongly object to deleting them. They are really extremely useful resources. I use them every week and I know that many people who do work on Old Chinese phonology do so. There are lots of books out there that are lists of characters, these are called dictionaries. For example Axel Schuessler's ABC Etymological Dictionary of Old Chinese, or Pulleyblank's Lexicon of Reconstructed Pronunciation in Early Middle Chinese, Late Middle Chinese, and Early Mandarin. I see it as entirely a good thing for reference works of this kind to be available free online rather than only in expensive books in university research libraries. If this is in violation of a Wikibooks policy, I would at least like that policy to be drawn to my attention and to have some constructive comment offered about which Wikiproject such a resource should fall under. I will also say on a personal note that I have put literally hundreds of hours of work into these projects and it would grieve me a lot to see this work simply vanish, in particular when I know that colleagues around the world use these books. --[[User:Tibetologist|Tibetologist]] ([[User talk:Tibetologist|discuss]] • [[Special:Contributions/Tibetologist|contribs]]) 07:27, 1 November 2024 (UTC)
::Hi @[[User:Tibetologist|Tibetologist]], and thank you for the feedback! Official Wikibooks policy does not permit standalone dictionaries (see [[WB:DICT]]), though I understand the argument that it is a useful resource. I am wondering if there might be a home for it at [[Wiktionary:Wiktionary:Welcome, newcomers|Wiktionary]] or [[Wikiversity:Wikiversity:SHARE|Wikiversity]]? Cheers —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 12:14, 1 November 2024 (UTC)
:::The policy says to use Wiktionary, but these books cannot be moved there. In fact they link there, you can understand me as having made an index to wiktionary, if you like, where the ORDER of the characters is extremely important, information that would be lost in Wiktionary.
:::Wikiversity is not a project I participate in, and in any event my books here are older than it, so this option was not available for me at the relevant moment. If you are offering to move my books to Wikiversity, that is very kind of you and I will very graciously accept. [[User:Tibetologist|Tibetologist]] ([[User talk:Tibetologist|discuss]] • [[Special:Contributions/Tibetologist|contribs]]) 14:10, 1 November 2024 (UTC)
::::I have pinged over at Wikiversity Colloquium to ask about suitability and have looped you into the conversation over there. Cheers —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 18:20, 1 November 2024 (UTC)
::I concur. I'm just an undergrad who tries to learn about Sino-Tibetan historical linguistics in his free time but I've found this wikibook to be incredibly useful, and I keep it open in one tab while I watch Professor Nathan Hill's lectures that he uploads to youtube in another tab, and another tab for taking notes. In fact if I remember correctly Professor Hill actually pointed his students to this wikibook.
::I'm not familiar with [[wikiversity:Wikiversity:SHARE|Wikiversity]] but if all the content were as accessible there as it is here then I think that could work. [[User:ChromeBones|ChromeBones]] ([[User talk:ChromeBones|discuss]] • [[Special:Contributions/ChromeBones|contribs]]) 02:43, 9 July 2025 (UTC)
:Per [[:v:Wikiversity:Colloquium#Import_Resource_From_Wikibooks?]], I recommend copying and pasting, including attribution via the edit summary and talk page, add appropriate categories and links, and then it could be deleted locally. —[[User:Koavf|Justin (<span style="color:grey">ko'''a'''vf</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 22:32, 3 November 2024 (UTC)
== [[Suomen kieli käyttöön]] ==
Multiple pages in this book are written entirely in Finnish, which is out of the enWB scope. —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 00:09, 19 October 2024 (UTC)
:I was going to say whether we should ask any fiwikibooks sysop to maybe see if this could be transwikied to fiwb if it's within the scope there. But [[:fi:Toiminnot:Käyttäjät/sysop]] indicates that there are only 3 sysops, and only {{u|Anr}} and {{u|Zache}} have made edits this ''year''. If they deem it to be salvageable, then transwiki + delete, otherwise straight-up delete. --[[User:SHB2000|SHB2000]] ([[User talk:SHB2000|discuss]] • [[Special:Contributions/SHB2000|contribs]]) 11:24, 14 November 2024 (UTC)
::It seems that the idea behind the book was for the pages to be bilingual, as it’s a language learning book. That’s why there are Finnish texts included intentionally even on the pages that are complete. There are similar books in dewikibooks and ruwikibooks as well. For the English version, I think the easiest way to proceed would be to clean up and adjust the page layout to fit enwikibooks better, and then translate the missing parts. By the way, if anyone wants to update the book’s name in English, it can be titled ''"Using the Finnish Language"'' or ''"Put Finnish Language into Use"'' for a direct translation. [[User:Zache|Zache]] ([[User talk:Zache|discuss]] • [[Special:Contributions/Zache|contribs]]) 11:57, 14 November 2024 (UTC)
== [[AT&T Mobility FAQ]] ==
* [[AT&T Mobility FAQ]]
* [[AT&T Mobility FAQ/MEdia Net Configuration]]
* [[AT&T Mobility FAQ/Data Connect Configuration]]
An ''extremely'' outdated FAQ on AT&T's cell phone services. Most of this document was written 20+ years ago as a Usenet FAQ; very little of it is accurate or useful anymore (particularly the two subpages, which have to do with obsolete configurations for "tethering" a computer to a cell phone). No objection if someone wants to update it, but there's clearly been no appetite to do that. [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 22:20, 30 December 2024 (UTC)
:I'm wondering if it might make sense for us to develop some kind of policy on archiving books here. There are many like this one that have a good deal of content but are extremely out of date and just not useful as originally intended. ——[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 22:34, 30 December 2024 (UTC)
::@[[User:Kittycataclysm|Kittycataclysm]]: See the newly developed [[Wikibooks:Outdated books]]. [[User:JJPMaster|JJP]]<sub>[[User talk:JJPMaster|Mas]]<sub>[[Special:Contributions/JJPMaster|ter]]</sub></sub> ([[wikt:she|she]]/[[wikt:they|they]]) 00:16, 31 December 2024 (UTC)
:::Ooh, thanks - something like that seems like it could be an appropriate way to handle this book. A lot of the other outdated books I've tagged have been so incomplete that they wouldn't have been particularly useful even as historical references; this one might at least have some interest.
:::Any chance we can get a separate namespace (maybe "Archive:") set up for archived book content? That'd make it possible to do things like exclude them from on-site search by default. [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 21:07, 31 December 2024 (UTC)
::::I think this might be a more extended discussion, so I'll bump it over to the [[Wikibooks talk:Outdated books|talk page of the draft policy]]! —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 21:54, 31 December 2024 (UTC)
== Algebra/Chapter 10/Symmetric Polynomials ==
I personally believe that [[Algebra/Chapter 10/Symmetric Polynomials|this]], and all of the sections should be deleted for the fact that this goes WAY beyond the scope of what was intended for the Chapter (Algebra II level polynomials). [[User:GoreyCat|GoreyCat]] ([[User talk:GoreyCat|discuss]] • [[Special:Contributions/GoreyCat|contribs]]) 15:07, 6 February 2025 (UTC)
:'''Split''': Deletion here is not the best solution (see [[w:WP:ATD]]). Instead, this page and its subpages should be moved to another book, most likely [[Abstract Algebra]]. [[User:JJPMaster|JJP]]<sub>[[User talk:JJPMaster|Mas]]<sub>[[Special:Contributions/JJPMaster|ter]]</sub></sub> ([[wikt:she|she]]/[[wikt:they|they]]) 17:35, 6 February 2025 (UTC)
:{{keep}} since there is a good amount of content. If [[Abstract Algebra]] is appropriate, it seems like a fine idea to move there. —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 22:59, 7 February 2025 (UTC)
::Eh, yeah, I supposed moving it is better. I just don't think it's suitable for where it appears. [[User:GoreyCat|GoreyCat]] ([[User talk:GoreyCat|discuss]] • [[Special:Contributions/GoreyCat|contribs]]) 01:40, 8 February 2025 (UTC)
== [[Puredyne]] ==
Development of Puredyne Linux was discontinued in 2012, and the software no longer appears to be available for download anywhere. (An archive of the web site is still up - with a bunch of embedded spam links - but the download links are all dead.) Is this a suitable candidate for archival (cf. [[Wikibooks:Outdated books]]), or should it just be deleted? [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 04:35, 5 March 2025 (UTC)
:I'd just archive stuff like this. Looks like a decent bit of work went into it, and you never know when someone might need to use Puredyne for some obscure project. I'd be willing to bet mirrors exist of it somewhere, or someone has it on a drive. If you want to find some stuff worth deleting, comb through [[:Category:Allbooks categories]]. [[User:MediaKyle|MediaKyle]] ([[User talk:MediaKyle|discuss]] • [[Special:Contributions/MediaKyle|contribs]]) 11:30, 5 March 2025 (UTC)
== [[Template:Qr-twwp]] ==
This isn't exactly a request to delete the template, but rather to merge it with {{tlx|Copypaste}}. The {{tlx|Qr-twwp}} template serves the same purpose as {{tlx|Copypaste}}, but without the seven-day period after which the page is deleted. This leads to confusion, as well as a perpetually full [[:Category:Queried pages]]. [[User:JJPMaster|JJP]]<sub>[[User talk:JJPMaster|Mas]]<sub>[[Special:Contributions/JJPMaster|ter]]</sub></sub> ([[wikt:she|she]]/[[wikt:they|they]]) 17:37, 30 March 2025 (UTC)
== [[Ghouls of the Miskatonic]] ==
I don't think that a plot summary of a book is in-scope here. —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 18:43, 20 August 2025 (UTC)
:{{vd}} - at least, not a summary of ''this'' book. A summary and/or study guide to a notable work of literature might be in scope, but this is certainly not one. [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 21:23, 25 August 2025 (UTC)
::Hi. I am the creator of the pages of this book. If I understand correctly, it has to be a summary of a notable work of literature? So what exactly is defined as such? I only started this as I thought it would be fun, interesting and encouraging to others who read the Arkham Horror novels, and I thought it was permitted as I've seen other summaries of books on wikibooks. [[User:Dayne90|Dayne90]] ([[User talk:Dayne90|discuss]] • [[Special:Contributions/Dayne90|contribs]]) 13:27, 26 August 2025 (UTC)
:::Your problem is it is just the plot... it needs to include an educational textual analysis to be in scope [[User:MarcGarver|MarcGarver]] ([[User talk:MarcGarver|discuss]] • [[Special:Contributions/MarcGarver|contribs]]) 12:47, 28 August 2025 (UTC)
::::And ideally it'd be a text which has ''already'' been the subject of literary analysis, such that the analysis on Wikibooks isn't original research. A notable work of literature like ''Frankenstein'' or ''Moby-Dick'' would easily meet that requirement; a tie-in novel for a tabletop RPG probably does not. [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 22:08, 29 August 2025 (UTC)
== [[A-level Computing AQA Paper 1 Skeleton program 2027]] ==
{{closed|Considering the recent comments and due to no objections, I converted it to a soft redirect until another admin decides if the page can be deleted. CC to [[user:MrBerard|MrBerard]]. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 18:51, 15 October 2026 (UTC)}}
This was proposed for speedy deletion by [[User:Omphalographer]] as 'not being a book'. However, I think this page's future requires further discussion from the community. Maybe some input would be appreciated?[[User:TechVindicator|TechVindicator]] ([[User talk:TechVindicator|discuss]] • [[Special:Contributions/TechVindicator|contribs]]) 23:51, 21 September 2026 (UTC)
:As best I can tell, this is a page students are using to collaborate on solutions for a standardized test. There are a number of similar pages for other years linked from [[A-level Computing/AQA/Paper 1/Skeleton program]].
:This is not a good fit for Wikibooks. If these students are interested in this kind of collaboration, it should take place elsewhere. [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 00:14, 22 September 2026 (UTC)
::The project can be moved to Wikiversity, I think. If the students can contribute it and make sure it complies with Wikibooks' guidelines, it can stay here. [[User:TechVindicator|TechVindicator]] ([[User talk:TechVindicator|discuss]] • [[Special:Contributions/TechVindicator|contribs]]) 00:17, 22 September 2026 (UTC)
:::@[[User:Omphalographer|Omphalographer]] @[[User:TechVindicator|TechVindicator]]
:::There's been a Wikibook on this every single year, as I mentioned in my comment on the deletion notice. That doesn't mean that this shouldn't be on Wikiversity, just that there is ample precedent of it being a Wikibook. Dunno if this matter to those kind of editorial decisions, though. [[Special:Contributions/~2026-51010-27|~2026-51010-27]] ([[User talk:~2026-51010-27|talk]]) 13:39, 22 September 2026 (UTC)
::::@[[User:~2026-51010-27|~2026-51010-27]]: How would the page comply with [[WB:What is Wikibooks?|Wikibooks' mission]]?. Could you provide an explanation of what the project is? If it's a collaborative project to work on solutions for a standardized test (like @[[User:Omphalographer|Omphalographer]] said), it would be more suitable for Wikiversity. If it's a textbook about A-level computing, then it would be suitable here. [[User:TechVindicator|TechVindicator]] ([[User talk:TechVindicator|discuss]] • [[Special:Contributions/TechVindicator|contribs]]) 13:58, 22 September 2026 (UTC)
:::::Hi,
:::::This is definitely the former, not the latter. As I said, I don't particularly think this should be on Wikibooks, it just happens the previous years had been, and clearly they weren't subject to this degree of scrutiny 😅
:::::I have created https://en.wikiversity.org/wiki/A-level_Computer_Science_AQA_Paper_1_Skeleton_program_2027 - I'll delete the content of the page and put the link at the top. If there is a more appropriate banner to indicate the migration, please make it look how it should :D [[User:MrBerard|MrBerard]] ([[User talk:MrBerard|discuss]] • [[Special:Contributions/MrBerard|contribs]]) 10:23, 29 September 2026 (UTC)
::::::I can't seem to put a link without the edit being deemed destructive, so I'll let you trusted people do what's needed. [[User:MrBerard|MrBerard]] ([[User talk:MrBerard|discuss]] • [[Special:Contributions/MrBerard|contribs]]) 10:27, 29 September 2026 (UTC)
: {{comment}}: I cannot determine consensus in this request on whether or not it should either be deleted or imported to English Wikiversity. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:28, 13 October 2026 (UTC)
::I've actioned the migration to Wikiversity as per my comment of 29 sep. I'd rather this stayed in as a stub with a link to the Wikiversity entry, for a couple of months, though I'm sure search engines are still vaguely good enough that this shouldn't matter too much. [[User:MrBerard|MrBerard]] ([[User talk:MrBerard|discuss]] • [[Special:Contributions/MrBerard|contribs]]) 14:35, 13 October 2026 (UTC)
{{end closed}}
== [[Talmudic aramic]] ==
{{closed|Deleted per consensus below. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:18, 13 October 2026 (UTC)}}
Per the user's other mass-created pages, I concur with the AI flagging that Kittycataclysm placed on the page. I believe this to be LLM-generated, and it should thus be deleted. [[User:EggRoll97|EggRoll97]] ([[User talk:EggRoll97|discuss]] • [[Special:Contributions/EggRoll97|contribs]]) 03:29, 30 September 2026 (UTC)
:{{vd}}, LLM spam. [[User:Ternera|Ternera]] ([[User talk:Ternera|discuss]] • [[Special:Contributions/Ternera|contribs]]) 13:22, 30 September 2026 (UTC)
:{{vd}} - like most LLM-generated books, this is heavy on structure and light on substance. Most of the content amounts to a poorly organized glossary, and there are a lot of pieces missing. (For instance, there is no discussion of the grammar of the language beyond a couple of fixed expressions.) [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 19:11, 1 October 2026 (UTC)
:{{vd}} per stated reasoning. —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 14:43, 12 October 2026 (UTC)
{{end closed}}
== [[Job Search]] ==
{{closed|Per minimal consensus, I deleted these books, but I only kept the main pages of these books by creating them as redirects for [[Find Employment]]. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:24, 13 October 2026 (UTC)}}
* as well as [[Job Search Automation for College Students]].
Neither of these books contains any useful information. The first book seems to be written primarily to funnel users to the second, and the second to funnel users to [[PlanoTse Handbook for Job Search Automation]], which was deleted last year. (The deletion request doesn't seem to have been archived.)
The sum total of information in these two books is, essentially, "you can search for jobs online", which is insultingly trivial. The second book's suggestion that users automate the job search process is of no practical value; most web search engines and job search sites nowadays will detect and block automated access.
[[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 18:36, 1 October 2026 (UTC)
: {{vd}} and redirect to [[Find Employment]]. ‑‑[[User:Kai Burghardt|Kai Burghardt]] ([[User talk:Kai Burghardt|discuss]] • [[Special:Contributions/Kai Burghardt|contribs]]) 05:14, 2 October 2026 (UTC)
{{end closed}}
== [[Wikipage]] ==
{{closed|Deleted per minimal consensus below. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:26, 13 October 2026 (UTC)}}
Like a few other books created by this user, the purpose of this book appears to have been to promote a piece of software written by the author ([[User:Planotse]]). The software is no longer available, and there is no actual content in the book.
[[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 18:40, 1 October 2026 (UTC)
:{{Vd}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 15:30, 12 October 2026 (UTC)
{{end closed}}
== [[Becoming a Linguistic Mastermind]] ==
{{closed|Deleted. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 00:11, 15 October 2026 (UTC)}}
Old book (created 2007) with no substantial content. The intent of this book appears to have been to create a single textbook encompassing ''all'' languages, with sub-courses for each language at [[Becoming a Linguistic Mastermind/The courses]], but no such courses were ever created. An analogous project on dewikibooks [[:b:de:Wikibooks:Löschkandidaten/ 2011-04#Der einfache Weg zum Sprachgenie|was deleted in 2011 for similar reasons]]. [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 21:20, 7 October 2026 (UTC)
:{{Vd}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 15:30, 12 October 2026 (UTC)
{{end closed}}
== [[The Permanent Advantage]] ==
{{closed|Speedily deleted —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 20:15, 14 October 2026 (UTC)}}
Probably LLM-generated, given broken templates, references to Claude, and section identifiers. This could probably be speedied, but not 100% sure so throwing it to RfD. Even regardless of whether it's LLM-generated or not, I can't see any way it's really suitable for the project. [[User:EggRoll97|EggRoll97]] ([[User talk:EggRoll97|discuss]] • [[Special:Contributions/EggRoll97|contribs]]) 07:49, 10 October 2026 (UTC)
:{{vd}} - a book ''about'' chess problems isn't necessarily out of scope, but there needs to be some written content to accompany the problems. And I'm not sure these are even meaningful problems - the few problems with viewable Lichess links appear to be in the early game, so there aren't necessarily objective "solutions" to them. [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 19:51, 10 October 2026 (UTC)
:{{vd}}, the Claude references throughout the book support that it's LLM-generated. [[User:Ternera|Ternera]] ([[User talk:Ternera|discuss]] • [[Special:Contributions/Ternera|contribs]]) 14:55, 11 October 2026 (UTC)
:This looked like a speedy to me, so I went ahead and deleted it. Thanks! —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 20:14, 14 October 2026 (UTC)
{{end closed}}
== [[Digital Synthora]] ==
Not within WB scope since it seems to be entirely fabricated by the editor. —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 14:20, 12 October 2026 (UTC)
:{{vd}} While some amount of original research is allowed here, completely fabricated topics aren't. This is just fiction writing, which is nice, but not within our scope. ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 15:30, 12 October 2026 (UTC)
:{{vd}} - per my initial tag, this appears to be an invention of the page creator; I can't find anything relevant online beyond the empty https://synthoraactstuff.fandom.com/. [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 01:32, 13 October 2026 (UTC)
== [[Wikibooks:FlaggedRevs Extension]] ==
Flagged Revisions is dead. Flagged Revisions remains dead. And we have killed it. How shall we comfort ourselves, the murderers of all murderers? Well, not in the least by deleting its project page and subpages. [[User:JJPMaster|JJP]]<sub>[[User talk:JJPMaster|Mas]]<sub>[[Special:Contributions/JJPMaster|ter]]</sub></sub> ([[wikt:she|she]]/[[wikt:they|they]]) 06:16, 17 October 2026 (UTC)
:Would it be better to mark it as historical, or update the page to say it's dead? I only say this because we've used this extension for a ''very'' long time. {{vd}} all the subpages, however. //[[User:SHB|SHB]] ([[User talk:SHB|discuss]] • [[Special:Contributions/SHB|contribs]]) 09:16, 17 October 2026 (UTC)
:: So far, there is only one subpage, [[Wikibooks:FlaggedRevs Extension/Unstable]]. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:37, 17 October 2026 (UTC)
:::Mark both as historical. I don't see any compelling reason to delete them. [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 18:33, 17 October 2026 (UTC)
323u96guoo4o6zcl1hejspy49aoj3qu
4676571
4676569
2026-10-17T18:37:33Z
Codename Noreste
3441010
/* Wikibooks:FlaggedRevs Extension */ reply ([[mw:c:Special:MyLanguage/User:JWBTH/CD|CD]])
4676571
wikitext
text/x-wiki
__NEWSECTIONLINK__
[[Category:Wikibooks deletion|{{PAGENAME}}]]
{{Discussion Rooms}}
{{TOCleft}}
{{shortcut|WB:RFD}}
{{Requests for deletion/New deletion}}
{{Requests for deletion/Deletion intro}}
<!-- New deletion nominations go at the bottom of page. -->
== [[Salute, Jonathan!]] and its translations ==
<div style="column-count: 7;">
* [[Salute, Jonathan!|Interlingue/Occidental]] ([[w:en:Occidental|w]], original)
* [[Òla, Ionatà!|Audià]]
* [[Holo, Jonathan!|Cristianés]]
* [[Terve, Jonathan!|Ekumenski]]
* [[Hej, Jonathan! (Germanisch)|Germanisch]]
* [[Salom, Jonatan!|Globasa]]
* [[Àlŏ, Jonathan!|Guosa]] ([[w:en:Guosa|w]])
* [[Salut, Jonathan!|Idiom Neutral]] ([[w:en:Idiom Neutral|w]])
* [[Saluto, Jonathan! (Ido)|Ido]] ([[w:en:Ido|w]])
* [[Hallo, Jonathan!|Interlingua]] ([[w:en:Interlingua|w]])
* [[Salut, Jonathan! (Interocidental)|Interocidental]]
* [[Bune Ğonatan!|Lingaust]]
* [[Oila, Jonatan!|Lingue Simple]]
* [[Haloo, Jonatan!|Lingwa de Planeta]] ([[w:en:Lingwa de Planeta|w]])
* [[Sin Chao, Jonathan!|Masa Tang]]
* [[Salut, ionatano!|Meteza]]
* [[Salu, Jon!|Mini]]
* [[Hay, Jonathan!|Mirad]]
* [[Hai, Jon!|Monav]]
* [[Sesan Jon!|Monkel]]
* [[Salam, Jonathan!|Mundeze]]
* [[Dag, Jonathan!|Negerhollands]] ([[w:en:Negerhollands|w]])
* [[Salut Jonathan!|Neo]] ([[w:en:Neo|w]])
* [[Hej, Jonathan!|Nordien]]
* [[Saluto, Jonathan!|Novial]] ([[w:en:Novial|w]])
* [[Salute, Jonathan! (Novlingue)|Novlingue]]
* [[Alo, Jonathan!|Numo]]
* [[Hela, Jonathan!|Proyo]]
* [[Salute, Jonathan! (Romanica)|Romanica]] ([[w:en:Romanica|w]])
* [[Simi, Jonathan!|Solresol]] ([[w:en:Solresol|w]])
* [[Toki a, jan Jonatan!|Toki Pona]] ([[w:en:Toki Pona|w]])
* [[Glidis, o Jonathan!|Volapük]] ([[w:en:Volapük|w]])
</div>
There are a couple of issues here:
# Beyond their introductions, all of these books are written in languages which are not English, making them out of scope for the English Wikibooks.
# All but one of these books are in fact written in constructed languages, most of them in recently created conlangs. In some cases (e.g. [[Sin Chao, Jonathan!]]), I can't find any reliable sources describing the target language outside of the translation itself.
# Most of the translations (i.e. other than [[Salute, Jonathan!]] itself) were abandoned within the first five or so chapters (out of 100); none of them are complete, and there seems to be little effort to complete any of them.
While I recognize that this is an unusual project, and potentially one which could have some value, it's not at all clear to me that the English Wikibooks is the right place for it. — [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 00:24, 29 September 2024 (UTC)
: I'm really not sure what to do about these ones. While I recognize that this approach is certainly one method of teaching a language, I'm not sure that it constitutes an educational textbook. We do require that the English Wikibooks be written in English—for language-learning books, this typically means that the instructional parts are in English while the exercises are in the language being taught. I do think that if the language doesn't have much supporting evidence outside the book itself, it can safely be deleted. — [[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 01:01, 29 September 2024 (UTC)
: Author of the book here. I originally wanted to put it in the Interlingue Wikibooks https://ie.wikibooks.org/wiki/Principal_p%C3%A1gine but it somehow got locked when I wasn't paying attention and so I ended up putting it here. Getting it unlocked requires going through the process of starting an Incubator and all the rest so I opted for here and then started putting some English-only content once it was done. It's sort of in the same vein as books like Lingua Latina per se Illustrata that have separate versions with teacher notes and whatnot. [[Salute, Jonathan!/Capitul 1 - with notes]] After it was done the auxlang community really took to it which was a nice surprise. I think Ido has the largest number of chapters at the moment at 15.
:If the vast content of this book could be used to justify a quick reopening of the Interlingue Wikibooks to move it there, I'd love to do that. I imagine that an incubator with 100+ book chapters would be enough to open a Wikibooks and that's what this is. — [[User:Mithridates|Mithridates]] ([[User talk:Mithridates|discuss]] • [[Special:Contributions/Mithridates|contribs]]) 06:02, 29 September 2024 (UTC)
: Ah, I just realized that we do have a proposal to reopen the Interlingue Wikibooks: https://meta.wikimedia.org/wiki/Requests_for_new_languages/Wikibooks_Interlingue along with an Incubator page here. https://incubator.wikimedia.org/wiki/Wb/ie/Principal_p%C3%A1gine
: How easy would it be to migrate the entirety of Salute Jonathan to there? — [[User:Mithridates|Mithridates]] ([[User talk:Mithridates|discuss]] • [[Special:Contributions/Mithridates|contribs]]) 06:30, 29 September 2024 (UTC)
:: Hi @[[User:Mithridates|Mithridates]]! I'm not sure how incubator projects work, but I fully support migrating these books there. You may want to inquire over there and link to this discussion to support your request to move the content over there. Cheers! — [[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 13:16, 29 September 2024 (UTC)
::: Hi! Actually I have a third idea to propose after thinking about this again today (haven't been here much since I finished the book): I noticed that there is more English content than I remember and that might make it an awkward fit for the Interlingue Wikibooks. I definitely agree that having all the auxlang translations for new auxlang projects goes well beyond the scope of this Wikibooks. Finally, there are some auxlangs that are notable with their own Wikipedias.
::: So the idea is the following:
:::# Leave the original here and I can continue the work on the version with English notes and grammar. That will make it the same as Lingua Latina per se Illustrata, English by the Nature Method, Athenaze and all the rest.
:::# The Interlingua one can move to the Interlingua Wikibooks (maybe Romanica too if they want as it is sort of a dialect of Interlingua).
:::# For Ido and Lingua Franca Nova which have a Wikipedia but not a Wikibooks, I'm a little bit unsure...technically they could have their own version like the original one but would require English explanations. I could let them know and see if they are willing to do so and see what they think (work on adding English to the books vs. move the content elsewhere).
:::# The rest can move to a Github repo, then be deleted, and the front page of this book can have a single link to the repo.
::: Any thoughts on that? Adding the extra English content will be easy as it is my book and I know it inside and out.
::: Edit: [https://en.wikibooks.org/wiki/Salute,_Jonathan!/Grammar_(pronouns) this page] I just added. — [[User:Mithridates|Mithridates]] ([[User talk:Mithridates|discuss]] • [[Special:Contributions/Mithridates|contribs]]) 13:50, 29 September 2024 (UTC)
:::: Thanks for taking the time to consider this! Here are my responses/questions:
::::* Is the original [[Salute, Jonathan!]] (Occidental)? Since that one is quite fleshed out, I agree that if you edit it so the primary language of the book (e.g. headers, instructions, etc) are written in English while leaving the actual story in Occidental, it would be okay and fit in more with instructional language textbooks.
::::* For your points 2 and 3, I'm not sure how those other projects work, so I'll leave it up to them. I'm not quite sure why they would need to move, since in theory they could be revised with English as the language of instruction? Although, they have been left incomplete for a long time.
::::* For your point 4, I have no problem with that. Cheers! — [[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 16:51, 29 September 2024 (UTC)
::::: Hello again, it's the weekend so I have a bit more time to work on this. I've decided to merge the extra content from the following five chapters since the difference is fairly small and the original chapters should now have this English content. Could you delete these five pages now that they are no longer needed? [[User:Mithridates|Mithridates]] ([[User talk:Mithridates|discuss]] • [[Special:Contributions/Mithridates|contribs]]) 14:02, 5 October 2024 (UTC)
::::: [[Salute, Jonathan!/Capitul 1 - with notes]]
::::: [[Salute, Jonathan!/Capitul 2 - with notes]]
::::: [[Salute, Jonathan!/Capitul 3 - with notes]]
::::: [[Salute, Jonathan!/Capitul 4 - with notes]]
::::: [[Salute, Jonathan!/Capitul 5 - with notes]] [[User:Mithridates|Mithridates]] ([[User talk:Mithridates|discuss]] • [[Special:Contributions/Mithridates|contribs]]) 14:02, 5 October 2024 (UTC)
:::::: [[File:Yes_check.svg|{{#ifeq:|small|8|15}}px|link=|alt=]] {{#ifeq:|small|<small>|}}'''Done'''{{#ifeq:|small|</small>|}} — [[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 23:34, 5 October 2024 (UTC)
::::::: Hi again! No luck trying to find a home for the random language translations on other auxlang wikis, can't find one that is actively maintained.
::::::: The thought struck me that maybe I could just put those ones on a sub page of my user page, would that be permitted? If not, I think I'll just stick them somewhere in GitHub and call it a day since none of the people who started the translations seem to care enough to do anything about them. I'd rather not see them outright disappear but since they aren't mine I don't care enough about them to do much more work than copy and paste them somewhere.
::::::: (I would leave the ones in languages with an ISO-639 code and Wikipedia here, of course) — [[User:Mithridates|Mithridates]] ([[User talk:Mithridates|discuss]] • [[Special:Contributions/Mithridates|contribs]]) 14:13, 9 November 2024 (UTC)
:::::::: Thank you for checking! I don't personally see an issue with moving them to your user space right now. Cheers — [[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 17:21, 9 November 2024 (UTC)
::::::::: Thanks a lot! I've started a single page where I will put them all here [[User:Mithridates/SJ]] and will proceed slowly due to lack of time and also to avoid stepping on any toes / asking you to delete too much at a time and possibly deleting the wrong content.
::::::::: For this week I have put the content for the languages Audia, Cristianès, Guosa, Lingaust, Mini, Mirad, and Monav on that page as they all have a single page of content and didn't take much time to move. Please delete those. Once they are gone I will add a note on the main page letting people know where they have gone (in addition to a thank you for their interest in the book! I do love how many people have recognized it as a good source material for teaching a language). — [[User:Mithridates|Mithridates]] ([[User talk:Mithridates|discuss]] • [[Special:Contributions/Mithridates|contribs]]) 04:09, 10 November 2024 (UTC)
: {{keep}} the translations for languages that have an article on the English Wikipedia, i.e. Guosa, Idiom Neutral, Ido, Interlingua, Lingwa de Planeta, Negerhollands, Neo, Novial, Occidental, Romanica, Solresol, Toki Pona, and Volapük.
: Translations for languages that don't have an article can be kept if they have reliable sources, which I was able to find for the following languages (if you think they are not reliable, please let me know):
:* Globasa: [https://www.languagesandnumbers.com/how-to-count-in-globasa/en/globasa/] [https://greyson.conlang.org/2020/01/29/shouting-out-globasa-and-pandunia/]
:* Mini: [https://jprogr.github.io/mini] [https://www.omniglot.com/language/phrases/mini.htm] [https://www.languagesandnumbers.com/how-to-count-in-mini/en/mini/]
: {{del}} and move to [[User:Mithridates/SJ]] the rest of the translations, i.e. Audià/Audian, Cristianés, Ekumenski, Germanisch, Interocidental, Lingaust, Lingue Simple, Masa Tang, Mirad, Monav, Monkel, Mundeze, Nordien, Novlingue, Numo, Proyo, and Scuian/Meteza. If you can find reliable sources for those languages, please let me know.
: In particular, I could not find resources for Audià/Audian and Monav after searching through 15 and 17 pages on Google, respectively. It doesn't help that [[Òla, Ionatà!|their]] [[Hai, Jon!|translations]] don't explain what those languages are and where to find resources for them. This makes contributing to those translations almost impossible until @[[User:Caro de Segeda|Caro de Segeda]] can provide resources to us. It's possible that the resources may have disappared from the Internet, or that those languages were created by Caro de Segeda him/herself. If you can find resources for Audià/Audian and Monav, please let me know.
: I'm notifying the primary contributors of the translations: @[[User:Caro de Segeda|Caro de Segeda]], @[[User:Frzzl|Frzzl]], @[[User:Greatscotteh|Greatscotteh]], @[[User:IHateNumbers234|IHateNumbers234]], @[[User:Jayeless2|Jayeless2]], @[[User:Morozof|Morozof]], @[[User:Omnihom|Omnihom]], @[[User:Omoutuazn|Omoutuazn]], @[[User:PovriNaivon|PovriNaivon]], @[[User:Sir Beluga|Sir Beluga]] and @[[User:Tyoyafud|Tyoyafud]]. — [[User:EJPPhilippines|EJPPhilippines]] ([[User talk:EJPPhilippines|discuss]] • [[Special:Contributions/EJPPhilippines|contribs]]) 09:52, 30 June 2025 (UTC)
:: Caro de Segeda said on [https://www.reddit.com/r/conlangs/comments/1lcnz9g/comment/n0sc3wx/ Reddit] that Monav was created by him/her and that he/she didn't publish any resources about it other than [[Hai, Jon!]]. With '''zero''' other resources to rely on for contributing to the translation, and the fact that Monav is in [[User:Mithridates/SJ]], [[Hai, Jon!]] should be speedy deleted. — [[User:EJPPhilippines|EJPPhilippines]] ([[User talk:EJPPhilippines|discuss]] • [[Special:Contributions/EJPPhilippines|contribs]]) 01:38, 3 July 2025 (UTC)
::: I've undone the speedy deletion as Caro de Segeda posted a [https://prexins.wordpress.com/2025/07/04/monav/ resource] for Monav. — [[User:EJPPhilippines|EJPPhilippines]] ([[User talk:EJPPhilippines|discuss]] • [[Special:Contributions/EJPPhilippines|contribs]]) 07:18, 4 July 2025 (UTC)
:::: You can delete all the ones that I have created myself, I have already moved them to other places. — [[User:Caro de Segeda|Caro de Segeda]] ([[User talk:Caro de Segeda|discuss]] • [[Special:Contributions/Caro de Segeda|contribs]]) 12:39, 5 July 2025 (UTC)
{{outdent|::::}}I don't know if this is helpful since it wouldn't apply to most of these, but [[s:mul:]] could hold some of these. — [[User:Arlo Barnes|Arlo Barnes]] ([[User talk:Arlo Barnes|discuss]] • [[Special:Contributions/Arlo Barnes|contribs]]) 09:18, 30 November 2025 (UTC)
: I don't think that would be within the scope of that project. I'm not aware of any other situation where Wikisource publishes translations of texts created on Wikimedia projects - that's usually left up to other language editions of the same project. — [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 05:34, 1 December 2025 (UTC)
:: In this situation there isn't a separate [[s:ie:]] distinct from Multilingual Wikisource (see [[meta:Wikisource#List of Wikisources]]). In fact, there are very few multilingual wikis in the Wikimedia sphere; while this project ''could'' move to a Miraheze-hosted or similar wiki farm location, I think it would be a missed opportunity. I suppose an [[Interlingue]] book could be started in [[shelf:Constructed languages]] which would have all 100 chapters as an appendix (and likewise for the other languages), but that also seems non-ideal since it requires an English-language text that doesn't currently exist to be created. [[WB:AT]] seems to describe a similar situation to this one and prescribe Wikisource as the solution, and [[WB:SOURCE]] mentions fiction as out-of-scope for Wikibooks (even as in this case, language-educational fiction). [[s:mul:Wikisource:about Wikisource]] simply speaks of source texts and doesn't mention publication requirements, so maybe that is specific to some of the monolingual editions? — [[User:Arlo Barnes|Arlo Barnes]] ([[User talk:Arlo Barnes|discuss]] • [[Special:Contributions/Arlo Barnes|contribs]]) 22:28, 5 December 2025 (UTC)
:{{keep}} 100% keep. These books are a core part of language textbooks on Wikibooks and have been for years. Not sure why this is even being debated.--[[User:Xania|Xania]] [[Image:Flag_of_Estonia.svg|15px]] [[Image:Flag_of_Ukraine.svg|15px]] [[User talk:Xania|<sup>talk</sup>]] 17:55, 16 May 2026 (UTC)
::With all due respect, some of the books included in this nomination (like [[Sin Chao, Jonathan!]]) are written in constructed languages which are not substantially attested anywhere else. I struggle to imagine any educational purpose for such a book. [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 00:12, 17 May 2026 (UTC)
== [[International Baccalaureate]] ==
Not actually a book in and of itself; rather, it is just a compilation of links to other books —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 23:24, 18 October 2024 (UTC)
: Could this be salvaged as a shelf? [[User:Pppery|Pppery]] ([[User talk:Pppery|discuss]] • [[Special:Contributions/Pppery|contribs]]) 05:23, 27 January 2025 (UTC)
::Probably, but are the linked books even useful? IB exams change from year to year - sometimes quite dramatically - so an old exam guide is of very limited value. Many of these books were written 10-15 years ago, and some of them (like [[IB French]]) even have comments indicating that they're no longer applicable. [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 02:18, 8 December 2025 (UTC)
:I would be interested in a book that explains what an [[International Baccalaureate]] is. They may be books about it in the real world, but they are not free and with the online world becoming a fortress of paywalls I wonder how much longer one would be able to find such information on the web. This is what the wikipedia article says:
:* This article '''is missing information''' about the educational programs and curricula. Please expand the article to include this information. Further details may exist on the [[wikipedia:Talk:International_Baccalaureate#|talk page]]. ''(March 2025)''
:[[Special:Contributions/~2026-40500-29|~2026-40500-29]] ([[User talk:~2026-40500-29|talk]]) 02:05, 13 October 2026 (UTC)
== [[Character List for Baxter&Sagart]] ==
Seems completely out of scope as an educational book; it's just a list of characters and outlinks —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 23:53, 18 October 2024 (UTC)
:Adding [[Character List for Karlgren's GSR]] and [[Character List for Schuessler's CGSR]] for the same reason —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 23:55, 18 October 2024 (UTC)
:These three books do make a package and I agree they should be considered together. However, I strongly object to deleting them. They are really extremely useful resources. I use them every week and I know that many people who do work on Old Chinese phonology do so. There are lots of books out there that are lists of characters, these are called dictionaries. For example Axel Schuessler's ABC Etymological Dictionary of Old Chinese, or Pulleyblank's Lexicon of Reconstructed Pronunciation in Early Middle Chinese, Late Middle Chinese, and Early Mandarin. I see it as entirely a good thing for reference works of this kind to be available free online rather than only in expensive books in university research libraries. If this is in violation of a Wikibooks policy, I would at least like that policy to be drawn to my attention and to have some constructive comment offered about which Wikiproject such a resource should fall under. I will also say on a personal note that I have put literally hundreds of hours of work into these projects and it would grieve me a lot to see this work simply vanish, in particular when I know that colleagues around the world use these books. --[[User:Tibetologist|Tibetologist]] ([[User talk:Tibetologist|discuss]] • [[Special:Contributions/Tibetologist|contribs]]) 07:27, 1 November 2024 (UTC)
::Hi @[[User:Tibetologist|Tibetologist]], and thank you for the feedback! Official Wikibooks policy does not permit standalone dictionaries (see [[WB:DICT]]), though I understand the argument that it is a useful resource. I am wondering if there might be a home for it at [[Wiktionary:Wiktionary:Welcome, newcomers|Wiktionary]] or [[Wikiversity:Wikiversity:SHARE|Wikiversity]]? Cheers —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 12:14, 1 November 2024 (UTC)
:::The policy says to use Wiktionary, but these books cannot be moved there. In fact they link there, you can understand me as having made an index to wiktionary, if you like, where the ORDER of the characters is extremely important, information that would be lost in Wiktionary.
:::Wikiversity is not a project I participate in, and in any event my books here are older than it, so this option was not available for me at the relevant moment. If you are offering to move my books to Wikiversity, that is very kind of you and I will very graciously accept. [[User:Tibetologist|Tibetologist]] ([[User talk:Tibetologist|discuss]] • [[Special:Contributions/Tibetologist|contribs]]) 14:10, 1 November 2024 (UTC)
::::I have pinged over at Wikiversity Colloquium to ask about suitability and have looped you into the conversation over there. Cheers —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 18:20, 1 November 2024 (UTC)
::I concur. I'm just an undergrad who tries to learn about Sino-Tibetan historical linguistics in his free time but I've found this wikibook to be incredibly useful, and I keep it open in one tab while I watch Professor Nathan Hill's lectures that he uploads to youtube in another tab, and another tab for taking notes. In fact if I remember correctly Professor Hill actually pointed his students to this wikibook.
::I'm not familiar with [[wikiversity:Wikiversity:SHARE|Wikiversity]] but if all the content were as accessible there as it is here then I think that could work. [[User:ChromeBones|ChromeBones]] ([[User talk:ChromeBones|discuss]] • [[Special:Contributions/ChromeBones|contribs]]) 02:43, 9 July 2025 (UTC)
:Per [[:v:Wikiversity:Colloquium#Import_Resource_From_Wikibooks?]], I recommend copying and pasting, including attribution via the edit summary and talk page, add appropriate categories and links, and then it could be deleted locally. —[[User:Koavf|Justin (<span style="color:grey">ko'''a'''vf</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 22:32, 3 November 2024 (UTC)
== [[Suomen kieli käyttöön]] ==
Multiple pages in this book are written entirely in Finnish, which is out of the enWB scope. —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 00:09, 19 October 2024 (UTC)
:I was going to say whether we should ask any fiwikibooks sysop to maybe see if this could be transwikied to fiwb if it's within the scope there. But [[:fi:Toiminnot:Käyttäjät/sysop]] indicates that there are only 3 sysops, and only {{u|Anr}} and {{u|Zache}} have made edits this ''year''. If they deem it to be salvageable, then transwiki + delete, otherwise straight-up delete. --[[User:SHB2000|SHB2000]] ([[User talk:SHB2000|discuss]] • [[Special:Contributions/SHB2000|contribs]]) 11:24, 14 November 2024 (UTC)
::It seems that the idea behind the book was for the pages to be bilingual, as it’s a language learning book. That’s why there are Finnish texts included intentionally even on the pages that are complete. There are similar books in dewikibooks and ruwikibooks as well. For the English version, I think the easiest way to proceed would be to clean up and adjust the page layout to fit enwikibooks better, and then translate the missing parts. By the way, if anyone wants to update the book’s name in English, it can be titled ''"Using the Finnish Language"'' or ''"Put Finnish Language into Use"'' for a direct translation. [[User:Zache|Zache]] ([[User talk:Zache|discuss]] • [[Special:Contributions/Zache|contribs]]) 11:57, 14 November 2024 (UTC)
== [[AT&T Mobility FAQ]] ==
* [[AT&T Mobility FAQ]]
* [[AT&T Mobility FAQ/MEdia Net Configuration]]
* [[AT&T Mobility FAQ/Data Connect Configuration]]
An ''extremely'' outdated FAQ on AT&T's cell phone services. Most of this document was written 20+ years ago as a Usenet FAQ; very little of it is accurate or useful anymore (particularly the two subpages, which have to do with obsolete configurations for "tethering" a computer to a cell phone). No objection if someone wants to update it, but there's clearly been no appetite to do that. [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 22:20, 30 December 2024 (UTC)
:I'm wondering if it might make sense for us to develop some kind of policy on archiving books here. There are many like this one that have a good deal of content but are extremely out of date and just not useful as originally intended. ——[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 22:34, 30 December 2024 (UTC)
::@[[User:Kittycataclysm|Kittycataclysm]]: See the newly developed [[Wikibooks:Outdated books]]. [[User:JJPMaster|JJP]]<sub>[[User talk:JJPMaster|Mas]]<sub>[[Special:Contributions/JJPMaster|ter]]</sub></sub> ([[wikt:she|she]]/[[wikt:they|they]]) 00:16, 31 December 2024 (UTC)
:::Ooh, thanks - something like that seems like it could be an appropriate way to handle this book. A lot of the other outdated books I've tagged have been so incomplete that they wouldn't have been particularly useful even as historical references; this one might at least have some interest.
:::Any chance we can get a separate namespace (maybe "Archive:") set up for archived book content? That'd make it possible to do things like exclude them from on-site search by default. [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 21:07, 31 December 2024 (UTC)
::::I think this might be a more extended discussion, so I'll bump it over to the [[Wikibooks talk:Outdated books|talk page of the draft policy]]! —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 21:54, 31 December 2024 (UTC)
== Algebra/Chapter 10/Symmetric Polynomials ==
I personally believe that [[Algebra/Chapter 10/Symmetric Polynomials|this]], and all of the sections should be deleted for the fact that this goes WAY beyond the scope of what was intended for the Chapter (Algebra II level polynomials). [[User:GoreyCat|GoreyCat]] ([[User talk:GoreyCat|discuss]] • [[Special:Contributions/GoreyCat|contribs]]) 15:07, 6 February 2025 (UTC)
:'''Split''': Deletion here is not the best solution (see [[w:WP:ATD]]). Instead, this page and its subpages should be moved to another book, most likely [[Abstract Algebra]]. [[User:JJPMaster|JJP]]<sub>[[User talk:JJPMaster|Mas]]<sub>[[Special:Contributions/JJPMaster|ter]]</sub></sub> ([[wikt:she|she]]/[[wikt:they|they]]) 17:35, 6 February 2025 (UTC)
:{{keep}} since there is a good amount of content. If [[Abstract Algebra]] is appropriate, it seems like a fine idea to move there. —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 22:59, 7 February 2025 (UTC)
::Eh, yeah, I supposed moving it is better. I just don't think it's suitable for where it appears. [[User:GoreyCat|GoreyCat]] ([[User talk:GoreyCat|discuss]] • [[Special:Contributions/GoreyCat|contribs]]) 01:40, 8 February 2025 (UTC)
== [[Puredyne]] ==
Development of Puredyne Linux was discontinued in 2012, and the software no longer appears to be available for download anywhere. (An archive of the web site is still up - with a bunch of embedded spam links - but the download links are all dead.) Is this a suitable candidate for archival (cf. [[Wikibooks:Outdated books]]), or should it just be deleted? [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 04:35, 5 March 2025 (UTC)
:I'd just archive stuff like this. Looks like a decent bit of work went into it, and you never know when someone might need to use Puredyne for some obscure project. I'd be willing to bet mirrors exist of it somewhere, or someone has it on a drive. If you want to find some stuff worth deleting, comb through [[:Category:Allbooks categories]]. [[User:MediaKyle|MediaKyle]] ([[User talk:MediaKyle|discuss]] • [[Special:Contributions/MediaKyle|contribs]]) 11:30, 5 March 2025 (UTC)
== [[Template:Qr-twwp]] ==
This isn't exactly a request to delete the template, but rather to merge it with {{tlx|Copypaste}}. The {{tlx|Qr-twwp}} template serves the same purpose as {{tlx|Copypaste}}, but without the seven-day period after which the page is deleted. This leads to confusion, as well as a perpetually full [[:Category:Queried pages]]. [[User:JJPMaster|JJP]]<sub>[[User talk:JJPMaster|Mas]]<sub>[[Special:Contributions/JJPMaster|ter]]</sub></sub> ([[wikt:she|she]]/[[wikt:they|they]]) 17:37, 30 March 2025 (UTC)
== [[Ghouls of the Miskatonic]] ==
I don't think that a plot summary of a book is in-scope here. —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 18:43, 20 August 2025 (UTC)
:{{vd}} - at least, not a summary of ''this'' book. A summary and/or study guide to a notable work of literature might be in scope, but this is certainly not one. [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 21:23, 25 August 2025 (UTC)
::Hi. I am the creator of the pages of this book. If I understand correctly, it has to be a summary of a notable work of literature? So what exactly is defined as such? I only started this as I thought it would be fun, interesting and encouraging to others who read the Arkham Horror novels, and I thought it was permitted as I've seen other summaries of books on wikibooks. [[User:Dayne90|Dayne90]] ([[User talk:Dayne90|discuss]] • [[Special:Contributions/Dayne90|contribs]]) 13:27, 26 August 2025 (UTC)
:::Your problem is it is just the plot... it needs to include an educational textual analysis to be in scope [[User:MarcGarver|MarcGarver]] ([[User talk:MarcGarver|discuss]] • [[Special:Contributions/MarcGarver|contribs]]) 12:47, 28 August 2025 (UTC)
::::And ideally it'd be a text which has ''already'' been the subject of literary analysis, such that the analysis on Wikibooks isn't original research. A notable work of literature like ''Frankenstein'' or ''Moby-Dick'' would easily meet that requirement; a tie-in novel for a tabletop RPG probably does not. [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 22:08, 29 August 2025 (UTC)
== [[A-level Computing AQA Paper 1 Skeleton program 2027]] ==
{{closed|Considering the recent comments and due to no objections, I converted it to a soft redirect until another admin decides if the page can be deleted. CC to [[user:MrBerard|MrBerard]]. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 18:51, 15 October 2026 (UTC)}}
This was proposed for speedy deletion by [[User:Omphalographer]] as 'not being a book'. However, I think this page's future requires further discussion from the community. Maybe some input would be appreciated?[[User:TechVindicator|TechVindicator]] ([[User talk:TechVindicator|discuss]] • [[Special:Contributions/TechVindicator|contribs]]) 23:51, 21 September 2026 (UTC)
:As best I can tell, this is a page students are using to collaborate on solutions for a standardized test. There are a number of similar pages for other years linked from [[A-level Computing/AQA/Paper 1/Skeleton program]].
:This is not a good fit for Wikibooks. If these students are interested in this kind of collaboration, it should take place elsewhere. [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 00:14, 22 September 2026 (UTC)
::The project can be moved to Wikiversity, I think. If the students can contribute it and make sure it complies with Wikibooks' guidelines, it can stay here. [[User:TechVindicator|TechVindicator]] ([[User talk:TechVindicator|discuss]] • [[Special:Contributions/TechVindicator|contribs]]) 00:17, 22 September 2026 (UTC)
:::@[[User:Omphalographer|Omphalographer]] @[[User:TechVindicator|TechVindicator]]
:::There's been a Wikibook on this every single year, as I mentioned in my comment on the deletion notice. That doesn't mean that this shouldn't be on Wikiversity, just that there is ample precedent of it being a Wikibook. Dunno if this matter to those kind of editorial decisions, though. [[Special:Contributions/~2026-51010-27|~2026-51010-27]] ([[User talk:~2026-51010-27|talk]]) 13:39, 22 September 2026 (UTC)
::::@[[User:~2026-51010-27|~2026-51010-27]]: How would the page comply with [[WB:What is Wikibooks?|Wikibooks' mission]]?. Could you provide an explanation of what the project is? If it's a collaborative project to work on solutions for a standardized test (like @[[User:Omphalographer|Omphalographer]] said), it would be more suitable for Wikiversity. If it's a textbook about A-level computing, then it would be suitable here. [[User:TechVindicator|TechVindicator]] ([[User talk:TechVindicator|discuss]] • [[Special:Contributions/TechVindicator|contribs]]) 13:58, 22 September 2026 (UTC)
:::::Hi,
:::::This is definitely the former, not the latter. As I said, I don't particularly think this should be on Wikibooks, it just happens the previous years had been, and clearly they weren't subject to this degree of scrutiny 😅
:::::I have created https://en.wikiversity.org/wiki/A-level_Computer_Science_AQA_Paper_1_Skeleton_program_2027 - I'll delete the content of the page and put the link at the top. If there is a more appropriate banner to indicate the migration, please make it look how it should :D [[User:MrBerard|MrBerard]] ([[User talk:MrBerard|discuss]] • [[Special:Contributions/MrBerard|contribs]]) 10:23, 29 September 2026 (UTC)
::::::I can't seem to put a link without the edit being deemed destructive, so I'll let you trusted people do what's needed. [[User:MrBerard|MrBerard]] ([[User talk:MrBerard|discuss]] • [[Special:Contributions/MrBerard|contribs]]) 10:27, 29 September 2026 (UTC)
: {{comment}}: I cannot determine consensus in this request on whether or not it should either be deleted or imported to English Wikiversity. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:28, 13 October 2026 (UTC)
::I've actioned the migration to Wikiversity as per my comment of 29 sep. I'd rather this stayed in as a stub with a link to the Wikiversity entry, for a couple of months, though I'm sure search engines are still vaguely good enough that this shouldn't matter too much. [[User:MrBerard|MrBerard]] ([[User talk:MrBerard|discuss]] • [[Special:Contributions/MrBerard|contribs]]) 14:35, 13 October 2026 (UTC)
{{end closed}}
== [[Talmudic aramic]] ==
{{closed|Deleted per consensus below. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:18, 13 October 2026 (UTC)}}
Per the user's other mass-created pages, I concur with the AI flagging that Kittycataclysm placed on the page. I believe this to be LLM-generated, and it should thus be deleted. [[User:EggRoll97|EggRoll97]] ([[User talk:EggRoll97|discuss]] • [[Special:Contributions/EggRoll97|contribs]]) 03:29, 30 September 2026 (UTC)
:{{vd}}, LLM spam. [[User:Ternera|Ternera]] ([[User talk:Ternera|discuss]] • [[Special:Contributions/Ternera|contribs]]) 13:22, 30 September 2026 (UTC)
:{{vd}} - like most LLM-generated books, this is heavy on structure and light on substance. Most of the content amounts to a poorly organized glossary, and there are a lot of pieces missing. (For instance, there is no discussion of the grammar of the language beyond a couple of fixed expressions.) [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 19:11, 1 October 2026 (UTC)
:{{vd}} per stated reasoning. —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 14:43, 12 October 2026 (UTC)
{{end closed}}
== [[Job Search]] ==
{{closed|Per minimal consensus, I deleted these books, but I only kept the main pages of these books by creating them as redirects for [[Find Employment]]. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:24, 13 October 2026 (UTC)}}
* as well as [[Job Search Automation for College Students]].
Neither of these books contains any useful information. The first book seems to be written primarily to funnel users to the second, and the second to funnel users to [[PlanoTse Handbook for Job Search Automation]], which was deleted last year. (The deletion request doesn't seem to have been archived.)
The sum total of information in these two books is, essentially, "you can search for jobs online", which is insultingly trivial. The second book's suggestion that users automate the job search process is of no practical value; most web search engines and job search sites nowadays will detect and block automated access.
[[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 18:36, 1 October 2026 (UTC)
: {{vd}} and redirect to [[Find Employment]]. ‑‑[[User:Kai Burghardt|Kai Burghardt]] ([[User talk:Kai Burghardt|discuss]] • [[Special:Contributions/Kai Burghardt|contribs]]) 05:14, 2 October 2026 (UTC)
{{end closed}}
== [[Wikipage]] ==
{{closed|Deleted per minimal consensus below. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:26, 13 October 2026 (UTC)}}
Like a few other books created by this user, the purpose of this book appears to have been to promote a piece of software written by the author ([[User:Planotse]]). The software is no longer available, and there is no actual content in the book.
[[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 18:40, 1 October 2026 (UTC)
:{{Vd}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 15:30, 12 October 2026 (UTC)
{{end closed}}
== [[Becoming a Linguistic Mastermind]] ==
{{closed|Deleted. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 00:11, 15 October 2026 (UTC)}}
Old book (created 2007) with no substantial content. The intent of this book appears to have been to create a single textbook encompassing ''all'' languages, with sub-courses for each language at [[Becoming a Linguistic Mastermind/The courses]], but no such courses were ever created. An analogous project on dewikibooks [[:b:de:Wikibooks:Löschkandidaten/ 2011-04#Der einfache Weg zum Sprachgenie|was deleted in 2011 for similar reasons]]. [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 21:20, 7 October 2026 (UTC)
:{{Vd}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 15:30, 12 October 2026 (UTC)
{{end closed}}
== [[The Permanent Advantage]] ==
{{closed|Speedily deleted —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 20:15, 14 October 2026 (UTC)}}
Probably LLM-generated, given broken templates, references to Claude, and section identifiers. This could probably be speedied, but not 100% sure so throwing it to RfD. Even regardless of whether it's LLM-generated or not, I can't see any way it's really suitable for the project. [[User:EggRoll97|EggRoll97]] ([[User talk:EggRoll97|discuss]] • [[Special:Contributions/EggRoll97|contribs]]) 07:49, 10 October 2026 (UTC)
:{{vd}} - a book ''about'' chess problems isn't necessarily out of scope, but there needs to be some written content to accompany the problems. And I'm not sure these are even meaningful problems - the few problems with viewable Lichess links appear to be in the early game, so there aren't necessarily objective "solutions" to them. [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 19:51, 10 October 2026 (UTC)
:{{vd}}, the Claude references throughout the book support that it's LLM-generated. [[User:Ternera|Ternera]] ([[User talk:Ternera|discuss]] • [[Special:Contributions/Ternera|contribs]]) 14:55, 11 October 2026 (UTC)
:This looked like a speedy to me, so I went ahead and deleted it. Thanks! —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 20:14, 14 October 2026 (UTC)
{{end closed}}
== [[Digital Synthora]] ==
Not within WB scope since it seems to be entirely fabricated by the editor. —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 14:20, 12 October 2026 (UTC)
:{{vd}} While some amount of original research is allowed here, completely fabricated topics aren't. This is just fiction writing, which is nice, but not within our scope. ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 15:30, 12 October 2026 (UTC)
:{{vd}} - per my initial tag, this appears to be an invention of the page creator; I can't find anything relevant online beyond the empty https://synthoraactstuff.fandom.com/. [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 01:32, 13 October 2026 (UTC)
== [[Wikibooks:FlaggedRevs Extension]] ==
Flagged Revisions is dead. Flagged Revisions remains dead. And we have killed it. How shall we comfort ourselves, the murderers of all murderers? Well, not in the least by deleting its project page and subpages. [[User:JJPMaster|JJP]]<sub>[[User talk:JJPMaster|Mas]]<sub>[[Special:Contributions/JJPMaster|ter]]</sub></sub> ([[wikt:she|she]]/[[wikt:they|they]]) 06:16, 17 October 2026 (UTC)
:Would it be better to mark it as historical, or update the page to say it's dead? I only say this because we've used this extension for a ''very'' long time. {{vd}} all the subpages, however. //[[User:SHB|SHB]] ([[User talk:SHB|discuss]] • [[Special:Contributions/SHB|contribs]]) 09:16, 17 October 2026 (UTC)
:: So far, there is only one subpage, [[Wikibooks:FlaggedRevs Extension/Unstable]]. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:37, 17 October 2026 (UTC)
:::Mark both as historical. I don't see any compelling reason to delete them. [[User:Omphalographer|Omphalographer]] ([[User talk:Omphalographer|discuss]] • [[Special:Contributions/Omphalographer|contribs]]) 18:33, 17 October 2026 (UTC)
: {{keep}} but mark them as historical and fully protect them as archives, because of my reasoning and per Omphalographer above. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 18:37, 17 October 2026 (UTC)
gesapyiqv1ls4ird5o7pfxgqq74q4mw
World History/Ancient Civilizations
0
5765
4676579
4612161
2026-10-17T22:13:57Z
Classclown18
3503220
4676579
wikitext
text/x-wiki
{{WHP - page top 1}}
==The Neolithic Revolution and Early Agricultural Societies==
[[File:Asikli Hoyuk sarah c murray 6176.jpg|thumb|Reconstruction of Neolithic housing.]]
[[File:Catalhöyük, the first large settlement of mankind.webm|thumb|Catalhöyük, the first large settlement of mankind]]
Early nomadic hunter-gatherers lived off the land and had a minimal effect on the environment around them. Around 10,000 years ago people started to settle down and developed agriculture possibly in response to a warming climate. The origin of agriculture is often referred to as the Neolithic Revolution. Keep in mind that different societies domesticated plants and animals, and consequently agriculture, independently i.e. Mesopotamia, Nile River Valley, Ancient China. These farmers had to overcome obstacles such as dry land with technologies like large scale irrigation. This large agricultural byproduct, irrigation, had a large impact on the environment. Pastoralism, the branch of agriculture concerned with raising livestock, developed in Afro-Eurasian grassland, negatively affecting the environment when pastures were overgrazed.
The switch to agriculture created a much more reliable and abundant food source which allowed populations to soar. This led to diversification of labor which meant that food requirements could be on the backs of certain people and new classes like artisans or warriors could develop. These people developed technologies like pottery, metallurgy or plows.
== The Development and Interactions of Early Societies ==
About 5,000 years ago the first urban societies developed laying the foundations for the first civilizations. Nearly all civilizations share the same few features—they have abundant food surpluses, contained cities, political bureaucracies, armies, defined religious and social hierarchies and long distance trading.
==Civilization makes its debut (8000 - 3000 BC)==
[[File:Dagon Museum, Mortars from Natufian Culture, Grinding stones from Neolithic pre-pottery phase.JPG|thumb|Natufian mortars used for grinding.]]
Neolithic means "new stone", even though agriculture was the crowning achievement of the period. Civilizations started out small. Agriculture at first tended to tie only small groups together. These groups all settled along rivers, important as a reliable and predictable source of water. As time passed, families usually worked the same plot of land over successive generations, leading to the concept of ownership.
[[File:Natufian-SupportingWall-Elwad.jpg|thumb|Remains of a Natufian house]]
The earliest examples of settlements date to about 12000 BC to 9500 BC, and seem to predate agriculture. These settlements, termed Natufian, suggest cultivation of rye. The first such excavation was at Tell Es-Sultan, just outside of Jericho.
Ancient mortars and grinding tools unearthed in a large mound in the Zagros Mountains of Iran reveal that people were grinding wheat and barley about 11,000 years ago. Grass pea, wild wheat, wild barley, and lentils were found throughout the site, including some of the earliest known samples. This was much further east than most sites known for early agriculture. These were found with stone figurines in levels where earthen buildings had been flattened and destroyed, as though civilization had kept building atop their own ruins, or re-purposing land, as needs changed.
Evidence in the middle east shows pottery styles moving throughout the Arabian peninsula, especially during the late Halaf-Ubaid period, where painted pottery and flint arrowheads have been discovered in great number. Pottery decorations are used to indicate trade and cultural contact, or widespread immigration during this period. The excavations on Dalma Island in the Persian gulf show the first date stones (pits from a fruit known to be from a widely cultivated palm in the middle east) known from a human settlement, approximately 5000 BC and may be the precursor to agriculture. Interestingly, at this same site, bones were found from long-tail tuna, dolphin, dugong and turtle, gazelle, needle-fish, grouper, sea bream, emperor, and jack. Some of the groupers found would have been nearly a meter long, indicating considerable fishing skill.
As agriculture became more and more widespread, people began to accumulate surpluses of food, meaning that a single family grew more than it consumed. At the same time, the increasing tendency to remain in a single location put pressure on groups to protect themselves from other still nomadic peoples. In addition, when peoples stayed rooted near one another, cultural and social bonds began to form. People began to do things in similar ways (it is a property of human nature to want to belong). Because of these factors, especially a surplus of food, labor began to specialize and branch out away from just farming. When everyone did not have to farm all of the time to live, people began to become artisans and craftsmen. Such developments also brought trade, and a class of merchants. Merchants often traveled along the same routes. Also, within individual villages, artisans contributed to the homogenization of culture. Merchants caused further interaction and exchange, known as Cultural Diffusion. Human religion also began to evolve. Rising above the past nomadic "religions", cultures developed a unified polytheism within their ranks, which led them to further bond themselves together. Priests became a class as well. As you can see, specialization of labor was a direct offshoot of an agricultural surplus.
The new societies had one problem, however: now that the labor was specialized, agricultural surpluses had to happen every year without a break if the new culture was to remain intact. In stepped governments to fill the void. Government most likely began with religious leaders, such as priests, exercising control. Governments also provided roads for their citizens and merchants. They further cemented the bonds between people within villages and regions, unifying culture to the point that it might be called a ''civilization''. However, governments needed a way to pay the laborers who built and worked on their projects. Taxes thus first, perhaps unfortunately, appeared on the scene, usually in the form of a tax-in-kind (taking a portion of a product, such as grain from a farmer, the use of money was yet to appear). Suddenly, all the parts of an ancient civilization appeared. Governments soon fell into a type of system known as a monarchy, or rule by hereditary leaders (such as kings or princes). The reason for this was two-fold: monarchy came naturally because it was like the family, with the parents on top and the children beneath; eventually the parents grew old and the children became adults and parents in their own right and the cycle continued. Secondly, monarchy was predictable and reliable. In an age without mass communication or speedy travel, it was important for any void left by the death of a leader to be filled quickly, without fuss and strife. Most of the new governments were, however, small city-states, or independent countries composed of a city and some surrounding farmland. This was the beginning of the world's oldest civilizations in Ancient Mesopotamia.
'''An insight into the spread of farming:'''
The spread of farming and early domestication of plants and animals was extensive, as the practices expanded from three specific regions (7000 BC) of the world to various other regions, spreading to five continents by the year 3000 BC. Agriculture first started in the Middle East around 10,000-9500 BC. By 7000 BC it had spread to the western part of the Indian subcontinent, and by 6000 BC to Egypt. By 5000 BC, it had reached China, and around 2700 BC, corn was being farmed in Mesoamerica. The Middle East, covering the areas of modern day Turkey, Iraq, Palestine, and Israel, had domesticated cattle and pigs. They were also successful in the domestication and farming of several crops and plants like wheat, barley, rye, onions, peas, and grapes. The Mesoamericans had begun farming corn, beans, avocados, squash, pumpkins, and cotton. They had not domesticated any animals. In the Andes region (Peru), potatoes, tomatoes, lima beans, peanuts, and sweet potatoes were farmed. The Andeans had also domesticated the llama. The spread in the Middle East had the greatest expansion in terms of area. Sheep were domesticated in the greater Middle East; goats were originally domesticated in Central Europe, olives in the Mediterranean. Cotton was first farmed in the Indian sub-continent, and hemp, camels, and buckwheat were originally domesticated west of the Caspian Sea. Furthermore, in the Americas, the Mesoamericans expanded north and south, spreading farming and herding to Central and slightly further into North America. From there the practice extended to South America. The Andeans had minimum spread, expanding farming and herding to regions immediately around theirs. The farming and domestication of plants and animals, by 3000 BC, had been independently innovated in Southeast Asia, China, and North-central Africa. In Southeast Asia, rice, citrus, and chickens were originally farmed and domesticated. The farming of millet and soybean was practiced in China. Sorghum and coffee were farmed originally in north-central Africa. In a brief period of 4000 years, humans had farmed and domesticated over 30 plants and animals. The spread of farming and herding had reached over five continents, and ten regions of the world.
==River Valley Civilizations==
The first civilizations came about in river valleys which provided a constant source of water for crops. Irrigation works were often needed which required leadership perhaps leading to the creation of the first states. In addition rivers facilitated travel helping a common culture spread along its banks. The four river valley civilizations were the world’s first and each shared many common characteristics.
The four river valley civilizations:
China (along the Yellow River aka Huáng Hé)
Indus Valley (along the Indus River)
Mesopotamia (along the Tigris and Euphrates river)
Egypt (along the Nile)
Each Civilization had:
*A form of writing
*Cities
*Agriculture and surplus of food
*A form of government (usually claiming divine right)
*A polytheistic or henotheistic religion
*Art and Architecture
Whereas historians argue on what exactly civilization is, writing, cities, agriculture, government, religion and art are usually on the list.
==Ancient Mesopotamia==
While the earliest agricultural tools are known from beneath Jericho, approximately 7000 BC, further signs of civilization and tool making quickly cropped up across the Zagros mountain range.
The Halaf civilization (estimates vary but generally run either from 6100-5100 BC or 5100-4100 BC) is known from a number of different locations, primarily in Syria where pottery has been found. The different types of designs found in specific locations especially Tel Sabi Abyad) seem to indicate a significant trade, or possibly migration from the surrounding mountains. During the Halaf period, a variety of grains and herbs (including barley, emmer wheat, einkorn wheat, free threshing wheat, oats, hawthorne, crosswort flax, lentils, legumes, cornelian cherry, clover, sweet clover, fleawort, field peas, linseed, wild olive, pistachio, grape, fig and hawthorn) were commonly found at the archaeological site at Ras Shamra in northwest Syria.
Halaf pottery has been found as far as the earliest cities in Sumer.
[[File:Enthroned King of Ur.jpg|thumb|Sumerian art depicting the King of Ur.]]
Mesopotamia (modern Iraq) was home to the world's first truly urban cultures -- societies featuring permanent cities whose populations were fed from the surrounding countryside, but themselves engaged in other activities besides agriculture, such as trade, specialist crafts and record-keeping. From 4000 to 3000 BC, the Sumerians established some of the first known cities in the then-moist land of Sumer (modern southern Iraq, called ''Ki-en-gir'' by the Sumerians). It is not currently known with certainty where the Sumerians came from, but immigration from elsewhere seems probable; their myths suggested a seafaring background. From an anthropological viewpoint Sumerians belonged to the Caucasian, Mediterranean, Balkan European race.
Historians speculate that the first Sumerian settlers may have been driven by overpopulation or conflict, as Sumeria was superficially inhospitable to stone-age man; it lacked the stones needed in Neolithic life to make most tools. However, the early Sumerians discovered that mud could be dried and used as a building material, and the soil was rich in clay to use to make farm tools. Once the Sumerians began to plant, they realized that Sumeria's rich mud yielded far greater quantities of food than they could consume. This surplus resulted in some of the first known exports in history.
Situated near the head of the Persian Gulf, Sumer was well-positioned for sea trade, as well as having land connections to neighboring Anatolia and Elam (modern southern Iran), both of which harbored simpler cultures. The early Sumerians began to trade their surplus grain with their neighbors for the items that Sumeria did not have, such as livestock and stone. This influx of goods (and therefore merchants) gave rise to some of the first true cities. Sumerian cities spoke the same language and worshipped the same gods. However, they were not one, with whole cities being burnt to the ground in their inter-city warfare. A typical run-of-the-mill city-state consisted of the city proper and much of the countryside around it. Early Sumerian government was strictly theocratic, and governed everything from sacrifices to taxation to irrigation. Therefore, the central point of each city was its great platform/ziggurat in the centre. These ziggurats became the main form of the later Babylonian monument architecture in the same region.
Writing in its strictest sense was first invented and used by the Mesopotamians around 3100 BC. It evolved out of a Mesopotamian trade tradition. When two merchants made an agreement, they would make clay models of the items being traded and then would seal them in a clay ball. However, if one of the merchants wanted to double check the quantities agreed upon in the contract, the merchants would need to break open the clay ball, literally breaking the contract. Therefore, the merchants began to scratch little picture of the items onto the outside of the clay ball. Eventually someone realized that the ball and models were no longer necessary. Later the Sumerians created more symbols for use in writing down laws and eventually even stories. This form of writing was called ''cuneiform''.
As many as a thousand clay tablets were found in the Uruk archaeological layer dating to the 30th century B.C. From Sumer, cuneiform script and civilization spread to all the peoples of Asia Minor (Assyrians, Hittites, Urartuans, etc). For instance, the ancient Asomtavruli alphabet of the modern Georgian language has ethno-cultural contacts with the Sumerian world. Georgian specialists study the similarity of Sumerian and Iberian-Caucasian languages. Sumerian remained the language of religion and science in the 2nd-1st millennium B.C. before its replacement by Semitic languages. But Sumerian did not confide the Semites with the Majuscule alphabet, the secret spiritual alphabet that has a lot of similarity to ancient Georgian Asomtavruli alphabet. More than 200 Sumerian and Svanian terms are identical both phonetically and semantically. Sumerians created a new simplified 22 simple letter-signs alphabet. The Semitic alphabet created by Sumerian scientists for Accadians laid the foundation for various people's writing creation and spreading (Moabs, Phoenicians, Hebrews, Greeks, Latins, Arabs and others) Sumerian sacral alphabet of 35 letter signs that concealed the Sun and the Moon calendar.
After flourishing for the better part of a millennium, Mesopotamia apparently experienced a climate change, which led to drought, exhaustion of the heavily-used soil, agricultural failure, and the decline of the Sumerian city-states that had become dependent on reliable surplus food production. Neighbouring peoples and tribes launched military incursions against the weakened city-states, resulting in political power shifts and the rise of new states and cities further north. Sumerologist Samuel Noah Kramer wrote "in the last quarter of the 3rd millennium B.C. the Semites inhabiting the town of Akkad conquered Sumer and made the Sumerian scientists create an alphabet for them, which subsequently came to be called the Semitic" This event took place in 2125 B.C.
===The Akkadians: The First Empire===
[[File:Bronze head of an Akkadian ruler, discovered in Nineveh in 1931, presumably depicting either Sargon or Sargon's grandson Naram-Sin (Rijksmuseum van Oudheden).jpg|thumb|Bronze head depicting an Akkadian ruler.]]
====Origins of Akkad====
Semitic speakers seem to have already been present in Mesopotamia at the dawn of the historical record, and soon achieved preeminence with the first Dynasty of Kish and numerous localities to the north of Sumer—where rulers with Semitic names had already established themselves by ca. the 3rd millennium BC. One of these, contemporary with the last Sumerian ruler, Lugal-Zage-Si of Uruk, was Alusarsid (or Urumus) who "subdued Elam and Barahs (Barahsi?)" thus beginning the trend towards regional empire.
The first known mention of Akkad is in an inscription of Enshakushanna of Uruk, where he claims to have defeated Agade—indicating that it was in existence well before the days of Sargon of Akkad, who the Sumerian kinglist claims to have built it. Sargon has often been cited as the first ruler of a combined empire of Akkad and Sumer, although more recently discovered data suggests there had been Sumerian expansions under previous kings, including Lugal-Anne-Mundu of Adab, Eannatum of Lagash, and Lugal-Zage-Si.
====Sargon and his sons====
The fame of the early establisher of Semitic supremacy was far eclipsed by that of Sargon of Akkad (Sharru-kin = "legitimate king", probably a title he took on gaining power[5]) (23rd century BC), who defeated and captured Lugal-Zage-Si, conquering his empire.
The earliest records in Akkadian all date to the time of Sargon. Sargon was claimed to be the son of La'ibum or Itti-Bel, a humble gardener, and possibly a hierodule, prostitute, or priestess to Ishtar or Inanna.
One legend related of Sargon in neo-Assyrian times says that "My mother was a changeling, my father I knew not. The brothers of my father loved the hills. My city is Azurpiranu (the wilderness herb fields), which is situated on the banks of the Euphrates. My changeling mother conceived me, in secret she bore me. She set me in a basket of rushes, with bitumen she sealed my lid. She cast me into the river which rose not over me. The river bore me up and carried me to Akki, the drawer of water. Akki, the drawer of water, took me as his son and reared me. Akki the drawer of water, appointed me as his gardener. While I was gardener Ishtar granted me her love, and for four and (fifty?) ... years I exercised kingship."
Originally a cupbearer to a king of Kish with a Semitic name, Ur-Zababa, Sargon thus became a gardener, responsible for the task of clearing out irrigation canals. This gave him access to a disciplined corps of workers, who also may have served as his first soldiers. Displacing Ur-Zababa, the crown was set upon Sargon's head, and he entered upon a career of foreign conquest.[7] Four times he invaded Syria and Canaan, and he spent three years thoroughly subduing the countries of "the west" to unite them with Mesopotamia "into a single empire."
However, Sargon took this process further, conquering many of the surrounding regions to create an empire that reached as far as the Mediterranean Sea and Anatolia, and extending his rule to Elam, and as far south as Magan (Oman), an area over which he reigned for 56 years. Trade extended from the silver mines of Anatolia to the lapis lazuli mines in Afghanistan, the cedars of Lebanon and the copper of Oman. This consolidation of the city-states of Sumer and Akkad reflected the growing economic and political power of Mesopotamia. The empire's breadbasket was the rain-fed agricultural system of northern Mesopotamia and a chain of fortresses was built to control the imperial wheat production.
Images of Sargon were erected on the shores of the Mediterranean, in token of his victories, and cities and palaces were built at home with the spoils of the conquered lands. Elam and the northern part of Mesopotamia (Subartu) were also subjugated and rebellions in Sumer were put down. Contract tablets have been found dated in the years of the campaigns against Canaan and against Sarlak, king of Gutium.
Sargon, throughout his long life, showed special deference to the Sumerian deities, particularly Inanna, his patroness, and Zababa, the warrior god of Kish. He called himself "The anointed priest of Anu" and "the great ensi of Enlil" and his daughter, Enheduanna the famous poet, was installed as priestess to Nanna at the temple in Ur.
He also boasted of having subjugated the "four quarters"—the lands surrounding Akkad to the north (Subartu), the south (Sumer), the east (Elam) and the west (Martu). Some of the earliest texts credit him with rebuilding the city of Babylon (Bab-ilu) in a new location.
Troubles multiplied toward the end of his reign. A later Babylonian text states "In his old age, all the lands revolted against him, and they besieged him in Akkad (the city)"...but "he went forth to battle and defeated them, he knocked them over and destroyed their vast army". Also shortly after, "the Subaru (mountainous tribes of) the upper country—in their turn attacked, but they submitted to his arms, and Sargon settled their habitations, and he smote them grievously".
These difficulties broke out again in the reign of his sons. Revolts broke out during the 9-year reign of his son, Mush, who fought hard to retain the empire—and in the fifteen year reign of Mush's elder brother, Humanist. The latter king seems to have fought a sea battle against 32 kings who had gathered against him. Both appear to have been assassinated.
====Naram-Sin====
Naram-Sin (Beloved of Sin), Sargon's grandson, who assumed the imperial title of "King Naram-Sin, of the four quarters (Lugal Naram-Sin, Šar kibrat 'arbaim)", and, like his grandfather, was addressed as "the god (Sumerian = DIN.GIR, Akkadian = ilu) of Agade" (Akkad), also faced revolts at the start of his reign.
Naram-Sin also recorded the Akkadian conquest of Ebla and Armani (also read Armanum or Armanim). The Assyrians, who are direct descendants of Akkadians, to this day refer to Armenians by the inscription from Armani. They were located between Carchemish and Ebla. To better police this area, he built a royal residence at Tell Brak, a crossroads at the heart of the Khabur basin of the Jezirah. Naram-Sin is supposed to have possessed an army of over 360,000 men, the largest of any state up until that date. It enabled him to campaign against Magan (thought to be Oman) which also revolted; Naram-Sin, "marched against Magan and personally caught Mandannu, its king". The chief threat seemed to be coming from the northeastern mountaineers. A campaign against the Lullubi led to the carving of the famous stele, now in the Louvre. This newfound Akkadian wealth may have been based upon benign climatic conditions, huge agricultural surpluses and the confiscation of the wealth of other peoples.[8]
The economy was highly planned. After the advancing Akkadian forces from Tell Brak took the massive (100 acre) site of Tell Leilan, they destroyed nearby villages and brought the organization of farming and grain distribution into its bureaucratic control. Grain was cleaned, and rations of grain and oil were distributed in standardized vessels made by the city's potters. Taxes were paid in produce and labour on public walls, including city walls, temples, irrigation canals and waterways, producing huge agricultural surpluses.
Stele of Naram-Sin, king of Akkad, celebrating his victory against the Lullubi from Zagros.
In later Babylonian texts, the name Akkad, together with Sumer, appears as part of the royal title, as in the Sumerian LUGAL KI.EN.GIRKI URUKI or Akkadian Šar māt Šumeri u Akkadi,[10] translating to "king of Sumer and Akkad". This title was assumed by the king who seized control of Nippur,[11] the intellectual and religious centre of southern Mesopotamia.
During the Akkadian period, the Akkadian language became the lingua franca of the Middle East, and was officially used for administration, although the Sumerian language remained as a literary language. The spread of Akkadian stretched from Syria to Elam, and even the Elamite language was temporarily written in Mesopotamian cuneiform. Akkadian texts later found their way to far-off places, from Egypt (in the Amarna period) and Anatolia, to Persia (Behistun).
====Collapse of Akkad====
Within 100 years the Empire of Akkad collapsed, almost as fast as it had developed, ushering in a Dark Age. By the end of the reign of Naram-Sin's son, Shar-Kali-Sharri, the empire collapsed outright from the invasion of barbarians of the Zagros known as "Gutians". It has recently been suggested that the Dark Age at the end of the Akkadian period (and First Intermediary Period of the Ancient Egyptian Old Kingdom) was associated with rapidly increasing aridity, and failing rainfall in the region of the Ancient Near East, caused by a global centennial-scale drought.[12]
The fall of the empire established by Sargon seems to have been as sudden as its rise, and little is known about the Gutian period. From the fall of Akkad until around 2100 BC, there is much that is still dark.
The Sumerian king list, for the period after the death of Sharkalishari, states:
{{cquote|Who was king? Who was not king? Igigi the king; Nanum, the king; Imi the king; Elulu, the king—the four of them were kings but reigned only three years. Dudu reigned 21 years; Shudurul, the son of Dudu, reigned 15 years. (A total of) 11 kings reigned 197 years. Agade was defeated and its kingship carried off to Uruk. In Uruk, Urnigin reigned 7 years, Irgigir, son of Urnigin, reigned 6 years; Kudda reigned 6 years; Puzur-ili reigned 5 years, Utu-utu reigned 6 years. Uruk was smitten with weapons and its kingship carried off by the Gutian hordes.}}
(These kings of Uruk may have been contemporaries of the last kings of Akkad.)
{{cquote|In the Gutian hordes, (first reigned) a nameless king; (then) Imta reigned 3 years as king; Shulme reigned 6 years; Elulumesh reigned 6 years; Inimbakesh reigned 5 years; Igeshuash reigned 6 years; Iarlagab reigned 15 years; Ibate reigned 3 years; ... reigned 3 years; Kurum reigned 1 year; ... reigned 3 years; ... reigned 2 years; Iararum reigned 2 years; Ibranum reigned 1 year; Hablum reigned 2 years; Puzur-Sin son of Hablum reigned 7 years; Iarlaganda reigned 7 years; ... reigned 7 years; ... reigned 40 days. Total 21 kings reigned 91 years, 40 days.}}
Evidence from Tell Leilan in Northern Mesopotamia shows what may have happened. The site was abandoned soon after the city's massive walls were constructed, its temple rebuilt and its grain production reorganised. The debris, dust and sand that followed show no trace of human activity. Soil samples show fine wind-blown sand, no trace of earthworm activity, reduced rainfall and indications of a drier and windier climate. Evidence shows that skeleton-thin sheep and cattle died of drought, and up to 28,000 people abandoned the site, seeking wetter areas elsewhere. Tell Brak shrank in size by 75%. Trade collapsed. Nomadic herders such as the Amorites moved herds closer to reliable water supplies, bringing them into conflict with farmers. This climate-induced collapse seems to have affected the whole of the Middle East, and to have coincided with the collapse of the Egyptian Old Kingdom. A relatively well-known king from that period is Gudea, king of Lagash.
This collapse of rain-fed agriculture in "the Upper Country" meant the loss to southern Mesopotamia of the agrarian subsidies which had kept the Akkadian Empire solvent. Water levels within the Tigris and Euphrates fell 1.5 metres beneath the level of 2600 BC, and although they stabilised for a time during the following Ur III period, rivalries between pastoralists and farmers increased. Attempts were undertaken to prevent the former from herding their flocks in agricultural lands, such as the building of a 180 km wall between the Tigris and Euphrates under the neo-Sumerian ruler Shu-Sin. Such attempts led to increased political instability; meanwhile, severe depopulation occurred to re-establish demographic equilibrium with the less favourable climatic conditions.
It has also been suggested (Burroughs, 2007) that the rapid climatic collapse, marking the Akkadian Dark Age, may have been responsible for the religiously prescribed prohibition against the raising and consumption of pigs that spread through the Ancient Middle East from the end of the third millennium BC.
The period between ca. 2100 BC and 2000 BC is sometimes called the 3rd dynasty of Ur or "Sumerian Renaissance", founded by Ur-Nammu (originally a general). Though documents again began to be written in Sumerian, this dynasty may also have been Semitic; Sumerian was becoming a purely literary or liturgical language, much as Latin later would be in Medieval Europe.
====The Curse of Akkad====
Later material described how the fall of Akkad was due to Naram-Sin's attack upon the city of Nippur. When prompted by a pair of inauspicious oracles, the king sacked the E (temple)E-kur temple, supposedly protected by the god Enlil, head of the pantheon. As a result of this, eight chief deities of the Anunaki pantheon were supposed to have come together and withdrawn their support from Akkad.
{{cquote|
<poem>
For the first time since cities were built and founded,
The great agricultural tracts produced no grain,
The inundated tracts produced no fish,
The irrigated orchards produced neither syrup nor wine,
The gathered clouds did not rain, the masgurum did not grow.
At that time, one shekel's worth of oil was only one-half quart,
One shekel's worth of grain was only one-half quart. . . .
These sold at such prices in the markets of all the cities!
He who slept on the roof, died on the roof,
He who slept in the house, had no burial,
People were flailing at themselves from hunger.
</poem>
}}
For many years, the events described in "The Curse of Akkad" were thought, like the details of Sargon's birth, to be purely fictional. But now the evidence of Tel Leilan, and recent findings of elevated dust deposits in sea-cores collected off Oman, that date to the period of Akkad's collapse suggest that climate change may have been the culprit.
===The Babylonians===
The Babylonians built the Hanging Gardens of Babylon and sun baked clay houses. They also introduced the convention of using 360 degrees in a circle, and of dividing the day into 24 hours, and each hour into 60 minutes.
==Ancient Andes==
3500BCE
==Valdiva 3500 BCE-1800BCE==
[[Valdiva culture]] were an Andean Civilization of [[Ecuador]]. They lived on coastal areas of [[Guayas]]. Many of their houses were put into circular positions in the central plaza. They are known for their pottery work. Most of their pottery resembled females. Females possibly held a high position in their society. Valdivia Culture domesticated llamas and cultivated cotton.
* Their diet included:
* [[Maize]]
* [[Squash]]
* [[Kidney beans]]
* [[Cassava]]
* [[Hot peppers]]
* [[Fish]]
* Occasionally [[deer]]
==Ancient Egypt==
[[File:Ancient Egypt map-en.svg|thumb|Map of Ancient Egypt]]
3100 BC-30 BC
===The Protodynastic Period===
===The Old Kingdom===
[[File:Kheops-Pyramid.jpg|thumb|The Great Pyramid was built during the Old Kingdom.]]
'''The Old Kingdom''' started circa 2700 BC during Egypt's 3rd dynasty. During this period of Egyptian history the Pharaohs were absolute rulers. It was during the Old Kingdom that the Great Pyramid was built as a tomb for Khufu, a Pharaoh during Egypt's 4th dynasty. The Old Kingdom failed at around 2150 BC for a number of reasons. These included the long life span of Pepi II, who ruled 94 years. Pepi II lived to be about 100 years of age, outliving many of his heirs. Additionally, the lower Nile inundation became irregular and led to failed harvests, which may have been caused by a drier climate.
===The First Intermediate Period===
Monarches competed for control of Egypt and civil wars were common. Famines were common during this period and it is called the dark age of Egyptian History.
===The Middle Kingdom===
Egypt's Middle Kingdom was Egypt's golden age because of trading, and new conquest. It lasted from 2050-1650 BC. The Pharaohs period of this period called themselves good shepherds and they were not as powerful as they were during the Old Kingdom. Their pyramids were smaller. The Middle Kingdom ended because of weak Pharaohs and an invasion by Asiantic people called the Hyksos.
===The Second Intermediate Period===
The Hyksos ruled Lower Egypt from about 1650-1550 BC until the Thebean king named Ahmose I expelled them out of the country and started the New Kingdom.
===The New Kingdom===
During the New Kingdom, Egypt was at its height of power. This period lasted from 1550-1070 BC. During this period Egypt became an empire when Thutmose III conquered Palestine, Syria, and Nubia this empire lasted to Amenhoptep VI who ended Egypt's worship of many gods in favour of one god Aton. Later his son Tutankhamen restored the old religion, Tutankhamen died at 18 leaving no heirs to the throne. Seti I restored some of Egypt's empire in Palestine and Syria and his son Ramses II fought the Hitties at Kadesh, then made the first peace treaty with them. He ruled for 67 years. The last great Pharaoh was Ramses III, who was not a relative of Ramses II. He protected Egypt from invasion. About 1070 BC the New Kingdom ended.
===The Postdynastic Period===
== Ancient Indian Civilization==
The earliest known farming cultures in south Asia emerged in the hills of Balochistan, Pakistan, which included Mehrgarh in the 7th millennium BC. These semi-nomadic peoples domesticated wheat, barley, sheep, goat and cattle. Pottery was in use by the 6th millennium BC. Their settlement consisted of mud buildings that housed four internal subdivisions. Burials included elaborate goods such as baskets, stone and bone tools, beads, bangles, pendants and occasionally animal sacrifices. Figurines and ornaments of sea shell, limestone, turquoise, lapis lazuli, sandstone and polished copper have been found. By the 4th millennium BC we find much evidence of manufacturing. Technologies included stone and copper drills, updraft kilns, large pit kilns and copper melting crucibles. Button seals included geometric designs.
===Indus Valley civilization===
By 4000 BC a pre-Harappan culture emerged, with trade networks including lapis lazuli and other raw materials. Villagers domesticated numerous other crops, including peas, sesame seed, dates, and cotton, plus a wide range of domestic animals, including the water buffalo which still remains essential to intensive agricultural production throughout Asia today. There is also evidence of sea-going craft. Archaeologists have discovered a massive, dredged canal and docking facility at the coastal city of Lothal, India, perhaps the world's oldest sea-faring harbour. Judging from the dispersal of artifacts the trade networks integrated portions of Afghanistan, the Persian coast, northern and central India, Mesopotamia (see Meluhha) and Ancient Egypt (see Silk Road).
Archaeologists studying the remains of two men from Mehrgarh, Pakistan, discovered that these peoples in the Indus Valley Civilization had knowledge of medicine and dentistry as early as circa 3300 BC. The Indus Valley Civilization gains credit for the earliest known use of decimal fractions in a uniform system of ancient weights and measures, as well as negative numbers (see Timeline of mathematics). Ancient Indus Valley artifacts include beautiful, glazed stone faïence beads.
The Indus Valley Civilization boasts the earliest known accounts of urban planning. As seen in Harappa, Mohenjo-daro and (recently discovered) Rakhigarhi, their urban planning included the world's first urban sanitation systems. Evidence suggests efficient municipal governments. Streets were laid out in perfect grid patterns comparable to modern New York. Houses were protected from noise, odors and thieves. The sewage and drainage systems developed and used in cities throughout the Indus Valley were far more advanced than that of contemporary urban sites in Mesopotamia.
===Vedic Civilization===
The Vedic civilization is the Indo-Aryan culture associated with the Vedas, which are the oldest extant Indo-European texts, composed in Vedic Sanskrit. The exact connection of the genesis of this civilization with the Indus Valley civilization on one hand, and a possible Indo-Aryan migration on the other hand, is the subject of disputes. Early Vedic society was largely pastoral. Later on, the society became agricultural, and was organized around four Varnas, or classes. Several small kingdoms and tribes merged to form a few large ones which were often at war with each other.
In addition to the principle texts of Hinduism, (the Vedas), the great Indian epics, the Ramayana and Mahabharata, the latter of which constitutes the longest poem in the world, are said to have been first written during this period, perhaps from a longer spoken tradition of unwritten recitation. The Bhagavad Gita, another primary text of Hinduism, is contained within the Mahabharata.
Early Indo-Aryan presence probably corresponds to the presence of ochre coloured pottery, archaeologically. The kingdom of the Kurus marks flowering of the Vedic civilization, corresponding to the Black and Red Ware and the beginning of the Iron Age in Northern India begins, around 1100 BC, likely also contemporary with the composition of the Atharvaveda. Painted Grey Ware spread over all of Northern India marks the late Vedic period, corresponding to a wave of urbanization occurred across the Indian sub-continent, spreading from Afghanistan to Bengal, in the 7th century BC. A number of kingdoms and republics emerged across the Indo-Gangetic plain and southern India during this period. 16 Mahajanapadas (great kingdoms) are referred to in ancient literature of the period.
===The Mahajanapadas===
By 600 BC, sixteen hereditary monarchies known as the Mahajanapadas stretched across the Indo-Gangetic plains from modern-day Afghanistan to Bangladesh. The largest of these nations were Magadha, Kosala, Kuru and Gandhara. The right of a king to his throne, no matter how it was gained, was usually legitimized through religious right and genealogies concocted by priests who ascribed to the king divine origins.
Hindu rituals at that time were complicated and conducted by the priestly class. It is thought that the Upanishads, the secondary texts of ancient Hinduism, dealing mainly with philosophy, were first composed early in this period. The court language at that time was Sanskrit, while the dialects of the general population of northern India were referred to as Prakrits. In 537 BC, Gautama Buddha gained enlightenment and thus founded Buddhism, which was initially intended as a supplement to the existing Hindu Vedic dharma. Around the same time period, in mid-6th century BC, Mahavira founded Jainism. Both religions had a simple doctrine and were preached in Prakrit which helped it gain acceptance by the masses. While the geographic impact of Jainism was limited, Buddhist nuns and monks spread their teachings of Buddha to Tibet, Sri Lanka and South East Asia.
In around 500 BC, the Indus Valley region was invaded by the Persian ruler Darius I making the far north-west of India a satrapy of the Achaemenid Empire. Though the Persians made Taxila the capital, their influence was marginal and governed the region for around 150 years. The Persians were defeated by Alexander the Great in the 4th century BC. In 326 BC, Alexander the Great crossed the Hindu Kush mountains and invaded what is now Pakistan. However, costly campaigns against the forces of Porus (also known as Puru), and the tired troops forced him to retreat to his empire after reaching the Beas River in Punjab. He appointed Greek governors to rule the newly acquired province to keep open trade routes between India and Greece.
====Maurya Dynasty====
In 321 BC, exiled general Chandragupta Maurya overthrew reigning king Dhana Nanda to establish the Mauryan Empire. Chandragupta was succeeded by his son Bindusara, who expanded the kingdom over most of present day India, barring the extreme south and east. During this time, most of the subcontinent was united under a single government for the first time.
The kingdom was inherited by his son Ashoka the Great who initially sought to expand his kingdom. In the aftermath of the carnage caused in the invasion of Kalinga, he renounced bloodshed and pursued a policy of non-violence or ahimsa after converting to Buddhism. The Edicts of Ashoka are the oldest preserved historical documents of India, and from Ashoka's time, approximate dating of dynasties becomes possible. The Mauryan dynasty under Ashoka was responsible for the proliferation of Buddhist ideals across the whole of East Asia and South East Asia, fundamentally altering the history and development of Asia. Ashoka the Great has been described as one of the greatest rulers the world has seen.
====Shunga Dynasty====
The Sunga dynasty was established in 185 BC, about 50 years after Ashoka's death, when the king Brihadratha, the last of the Mauryan rulers, was brutally murdered by the then commander-in-chief of the Mauryan armed forces, Pusyamitra Sunga, while he was taking the Guard of Honour of his forces. Pusyamitra Sunga then ascended the throne.
== Ancient Chinese Civilization ==
The earliest written record of China's takes the form of inscriptions of divination records on the bones or shells of animals—so-called "oracle bones".
The earliest comprehensive history of China, the "Historical Records" written by Sima Qian, a renowned Chinese historiographer of the 2nd century BC, begins perhaps 3600 BC with an account of the Five Emperors (五帝). These rulers were legendary sage-kings and moral exemplars, and one of them, the Yellow Emperor, is sometimes said to be the ancestor of all Chinese people. Following this period Sima Qian relates that a system of inherited rulership was established during the Xia dynasty, and that this model was perpetuated in the successor Shang and Zhou dynasties. It is during this period of the Three Dynasties (Chinese: 三代) that the historical China begins to appear.
===Xia Dynasty===
Sima Qian's account dates the founding of the Xia Dynasty (夏) to some 4,000 years ago, but this date has not yet been corroborated. Some archaeologists connect the Xia to excavations at Erlitou in central Henan province, where a bronze smelter from around 2000 BC was unearthed. Early markings from this period, found on pottery and shells, have been alleged to be ancestors of modern Chinese characters, but such claims are unsupported. With no clear written records to match the Shang oracle bones or the Zhou bronze vessel writings, the Xia remains poorly understood.
===Shang Dynasty===
[[File:HouMuWuDingFullView.jpg|thumb|Bronzework from the Shang Dynasty.]]
Archaeological findings provide evidence for the existence of the Shang dynasty (商), ca. 1600 to 1046 BC, and the archaeological evidence is divided into two sets. The first, from the earlier Shang period (ca. 1600 to 1300) comes from sources at Erligang, Zhengzhou and Shangcheng. The second set, from the later Shang or Yin period, consists of a large body of oracle bone writings. Anyang in modern day Henan has been confirmed as the last of the six capitals of the Shang (ca. 1300 to 1046 BC).
Chinese historians living in later periods were accustomed to the notion of one dynasty succeeding another, but the actual political situation in early China is known to have been much more complicated. Hence, as some scholars of China suggest, the Xia and the Shang can possibly refer to political entities that existed at the same time, just as the early Zhou (successor state of the Shang), is known to have existed at the same time as the Shang.
What was the religion?
===Zhou Dynasty===
By the end of the 2nd millennium BC, the Zhou Dynasty (周) began to emerge in the Huanghe valley, overrunning the Shang. The Zhou appeared to have begun their rule under a semi-feudal system. Nevertheless, power became decentralized during the Spring and Autumn Period when regional feudal lords began to assert their power, absorb smaller powers, and vie for hegemony. The Hundred Schools of Thought of Chinese philosophy blossomed during this period and such influential intellectual movements as Confucianism, Taoism, Legalism and Mohism were founded. After further political consolidation, seven prominent states remained by the end of 5th century BC, and the years in which these few states battled each other is known as the Warring States period. Though there remained a nominal Zhou king until 256 BC, he was largely a figurehead and held little real power.
Meanwhile, neighboring territories of these warring states were gradually annexed, including areas of modern Sichuan and Liaoning, and governed under the new local administrative system of commandery and prefecture (郡县), which had been in use since the Spring and Autumn Period and was very loosely a primitive prototype of the modern system of Sheng and Xian (province and county). The final expansion in this period began during the reign of Ying Zheng, the king of Qin. His unification of the other six powers, and further annexations in the modern regions of Zhejiang, Fujian, Guangdong and Guangxi in 214 BC enabled him to proclaim himself the First Emperor (始皇帝,Shi Huangdi), forming the first Chinese empire under the Qin Dynasty (秦), that laid the foundation for the consolidation of the Chinese territories that we know today.
==The Hittites==
[[File:Hattusa, capital of the Hittite Empire 04.jpg|thumb|Remains of the Great Temple in Hattusa, capital city of the Hittite Empire.]]
The Hittites were the prescendants of the Caucasian Kartvelian group of nations and were the descendants of Sumerians. Their innovations in the design of chariots, moving the wheel to the centre from the back, gave them a military advantage over other civilizations. Another point of note is that the first international peace treaty was signed by the Hittites and the Egyptians after the Battle of Kadesh. The original copy is kept in the headquarters of the United Nations. After 600 years as a major empire in the Ancient Middle East the Hittites, crippled by the attacks of the Sea Peoples abandoned their capital, Hattusa, and seemed to vanish from history.
==The Assyrians==
The Assyrians were a civilization located near modern Iraq, along the Tigris River. The Assyrians eventually grew to occupy modern-day Iraq, northern Egypt, the eastern parts of Asia Minor and modern-day Jordan.
Assyria started around 2000 BC with Semitic barbarians invading the area and establishing the roots for a civilization. By 1800 BC the Assyrians had firm control over most of northern Mesopotamia, but later lost it to the Babylonians.
By 1076 BC, the Assyrians reached the Mediterranean coast. The Empire reached its peak at around 1000 to 700 BC, with the conquering of northern Egypt and Babylon. However, the Assyrians were very harsh with the lands they conquered, and thus its citizens were very unhappy with the ruling class. By 600 BC, their capital, Nineveh, fell to the revolting vassal states, including Babylon. Soon after, the Assyrians existed only in the history books.
Though the Assyrians did not advance far in the fields of science and technology, philosophy or the arts, they were mentioned in Biblical records for being great warriors, and their tactics of war would influence later powers, such as the Persians.
==The Persians==
The Persian Empire started in the north west corner of what is now Iran. It grew through military conquest to cover a huge region that roughly encompasses today's Iran, Iraq, Armenia, Afghanistan, Turkey, Bulgaria, many parts of Greece, Egypt, Syria, much of what is now Pakistan, Jordan, Israel, Palestine, Lebanon, Caucasia, Central Asia, Libya, and northern parts of Arabia. The empire eventually became the largest empire of the ancient world.
Persepolis was the ceremonial capitol of Persia. Susa and Pasargadas also acted as capital cities at different times in Persian history. They were all in what is now Iran.
=== What did they eat?===
The food prepared for Persian kings was luxurious. Persians ate stews made from meat and fruit with herbs. They ate rice and bread made with wheat. Yoghurt was also a staple in Persian food. Tablets from the time of these ancient peoples indicate that the inhabitants of Mesopotamia were using basil, cilantro, cumin and caraway in their food in 4,000 BC. Apricots, artichokes, eggplants, lemons, lime, oranges, pistachios, spinach, saffron or tarragon all came to Europe through Persia. Other condiments and spices such as cinnamon, cardamom, cloves, coriander, dill, nutmeg, pomegranates, saffron, sumac, turmeric, as well as orange-flower water and rose water were used in Persian food. Lamb and goat were the primary meats eaten by Persians.
===What did their buildings look like?===
[[File:Gate of All Nations, Persepolis.jpg|thumb|Ruins in Persepolis.]]
Persians made very interesting buildings. The Ruins at Persepolis are an example of ancient Persian buildings. Persians were among the first to use mathematics, geometry, and astronomy in their building. Their buildings were grand and were created by skillful workers. Some Persian buildings had huge barrel-vaulted chambers. The Persians created huge domes of rock and clay and supported their roofs with tall columns. They also decorated the walls of their palaces with lions, bulls and flowers.
The Kharaghan twin towers and the Shah Mosque are two other old buildings built in a Persian style.
===What did they wear?===
The Persian king wore a robe of honour that was a large piece of fabric that was draped around him. For the king and other aristocracy, their clothes were often decorated with golden clothing ornaments. Some of these are in the form of roundels, while others are gold plaques with loops or rings on the back so they can be sewn onto the cloth. Rich people also liked to wear gold jewelry such as bracelets with animal head carvings.
Common people wore coats and pants made out of leather. Men's coats reached from their shoulders down to their knees and were fastened with a girdle. Their sleeves were somewhat tight and went down to their wrists.
Originally woman's clothing was quite similar to men's clothing but as time went their style changed. Initially their clothes were short and tight but when the style changed their clothes were made longer, more voluminous and were made out of softer materials.
Persian shoes were usually just pieces of leather that were wrapped around their feet and were tied up on the top. These would have look similar to moccasins.
===What did their writing look like?===
Old Persian was written from left to right in Old Persian cuneiform script. Old Persian cuneiform script was supposedly invented by King Darius I, one of ancient Persia's famous kings. There were 36 letters in their alphabet, although some of them essentially represented different syllables. For example they had one symbol for "ka" and another symbol for "ku". They used these symbols even though they also had symbols that represented "a" and "u".
===What did they believe?===
The Persian civilization spawned three major religions: Zoroastrianism, Mithraism, and Manichaeanism.
The Persian thinker Zoroaster (who propagated Zoroastrianism) was the main religious movement leader. Living around 3500 years ago, he helped to unite the Persian empire. He rejected the old Persian gods and introduced that a single wise god, Ahura Mazda, ruled the world. However, Ahura Mazda was often in battle with the prince of evil and lies, Ahriman. On Earth, each person had to choose which side to support.
Zoroaster's teaching were written in a book, the Zend-Avesta. It said that Ahura Mazda would conquer over the forces of evil, Ahriman, at the end. On that day, all the people would be judges for their actions. Those who did good would enter paradise. Those who did evil would be condemned to eternal suffering.
===Are some of them famous even today?===
Of course, but perhaps the most famous Persian of all time is Cyrus the Great who founded the Persian Empire. In fact, in 1992 he was ranked #87 on Michael H. Hart's list of the most influential figures in history. Other famous Persian kings were Cambises and Darius the Great.
Darius III is famous only because he suffered under the hands of Alexander the Great of Greece. During Darius' reign, the whole Persian Empire was destroyed by Alexander, who first attacked the Persians in what is now modern Turkey. He then moved on into the heart of the Empire where he captured the capital Susa. Darius ran away from battle against Alexander twice, but was murdered by his governor Bessus who wanted the throne for himself. Alexander was angry this happened and respected his dead opponent. He held a great funeral for the dead king. Later, Bessus was captured and executed.
===What is left of them today?===
Persians are one of the only ancient civilizations that has made significant contributions to humanity from prehistoric times by their Persian empire all the way through to the modern day in their country Iran. Most Persians are now Muslims, although there are Jews, Christians, and Zoroastrians still living and practicing their religion in Iran. There are also some Persians, called Parsis, living in mainly the north and west of India.
{{BookCat}}
habbitlesyr6tyw70az75tdfw52hb36
Aros/User/Docs
0
13106
4676722
4675910
2026-10-18T10:09:04Z
Jeff1138
301139
4676722
wikitext
text/x-wiki
{{ArosNav}}
==What is AROS==
Google translation
[http://translate.google.com/translate?hl=en&sl=auto&tl=de&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FUser%2FDocs German], [http://translate.google.com/translate?hl=en&sl=auto&tl=nl&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FUser%2FDocs Dutch], [http://translate.google.com/translate?hl=en&sl=auto&tl=fr&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FUser%2FDocs French], [http://translate.google.com/translate?hl=en&sl=auto&tl=it&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FUser%2FDocs Italian],
[http://translate.google.com/translate?hl=en&sl=auto&tl=da&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FUser%2FDocs Danish],
[http://translate.google.com/translate?hl=en&sl=auto&tl=es&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FUser%2FDocs Spanish], [http://translate.google.com/translate?hl=en&sl=auto&tl=hi&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FUser%2FDocs Hindi], [http://translate.google.com/translate?hl=en&sl=auto&tl=zh-CN&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FUser%2FDocs Chinese],
[http://translate.google.com/translate?hl=en&sl=auto&tl=ru&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FUser%2FDocs Russian],
[http://translate.google.com/translate?hl=en&sl=auto&tl=pl&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FUser%2FDocs Polish], [http://translate.google.com/translate?hl=en&sl=auto&tl=ja&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FUser%2FDocs Japanese], [http://translate.google.com/translate?hl=en&sl=auto&tl=ko&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FUser%2FDocs Korean],
[http://translate.google.com/translate?hl=en&sl=auto&tl=pt&u=http%3A%2F%2Fen.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DAros%2FUser%2FDocs Portuguese],
*Computer Hardware
*AROS (operating system)
*Applications and Games
*User
[http://www.osnews.com/story/15819 AROS] is one of the intermediate levels between the computer hardware and the user. It is an open-source, clean-room implementation of AmigaOS 3.x that can be run on many different computer architectures. It runs primarily on PC x86 32bit and 64bit but also on amiga motorola 68k and compatibles, some ARM like the Pi and Apple Silicon, RISC-V and some old PowerPC.
This page will cover enough to be able to write the downloaded image to your preferred media, to run a LiveUSB, LiveCD or LiveDVD on your office/home PC (Live meaning you can test without changing your existing setup) and, ultimately, to use it.
Intel / AMD PC hardware support mostly covers the years 2000 to 2024. At the moment, AROS is '''not''' recommended to be '''installed''' on a working vital data holding machine. Instead, writing to and booting from a '''USB stick''' could be a much better option.
AROS is an hobby OS and can co-exist with Windows(TM), MacOSX(TM), Android(TM) or Linux(TM) and act as an alternative.
Unfortunately, Aros has few developers so upgrades and improvements can take [https://sourceforge.net/p/aros/mailman/aros-cvs/ time to appear].
AROS core is now [http://en.wikibooks.org/wiki/Aros/Developer/IncompleteAPIs ~80%] finished and is usable, so keep in mind that the software is still considered ALPHA/BETA and in constant development. Currently AROS is fun to play with on a curiosity level, but it is also interesting to program. AROS has some multimedia features and has internet access.
Most importantly, use AROS to its maximum potential as it stands now, find ways to have fun with it and share your experiences.
Good Sites to visit
: [https://www.arosworld.org/home.php Aros World User forum]
: [https://arosnews.github.io/ AROS News]
: [https://www.facebook.com/ArosWorkshop/ Aros Workshop],
: [https://www.osnews.com/topic/amiga-aros/ OSNews]
: [https://www.reddit.com/r/aros/ Reddit]
: [https://archives.arosworld.org Aros Archives]
: [https://aminet.net/ Aminet]
: [http://www.amiga-news.de/en/ English translation of German site]
: [https://aros.sourceforge.io AROS] with [https://aros.sourceforge.io/download.html ABIv1 downloads]
: [https://github.com/aros-development-team/AROS Aros ABIv1 Codebase]
: [https://github.com/aros-development-team/AROS/issues register ABIv1 issues] and [https://sourceforge.net/p/aros/bugs/ old defunct bugs notification site]
: [https://sites.google.com/view/arosone Aros One x86, x64]
: [https://tinyarosdistro.flazio.com/ Tiny Aros x86 and x64]
: [https://arosnews.github.io/aros-portable/ AROS portable USB3 stick images of hosted Aros One x86 and x64 on debian]
: [http://vmwaros.blogspot.com Icaros Desktop x86 now on sabbatical, very old edition]
: [https://sites.google.com/site/arosaspireone AspireOS, of the netbook Aspire One, very old edition]
: [https://github.com/deadwood2 Deadwood's builds], [https://www.axrt.org/download/aros/v11/ v11 64bit PC builds], [https://axrt.org/downloads-aros Updated i386 32bit PC builds],
: [https://github.com/ezrec Ezrec x86 m68k mirror of old svn version]
: [http://arosalive.blogspot.co.uk/p/10-basic-aros-how-tos-tutorials.html Basic How To guides]
: [http://arosgamer.blogspot.co.uk/ AROS Playground], [http://thewetmachine.net/tag/aros/ Jess Wet Machine], [https://aroshacking.wordpress.com/ Jon Robertson's AROS Experiences and FPC Free Pascal], [],
:[http://www.apollo-accelerators.com/ Apollo Accelerators m68k], [http://www.amigablogs.net/ Amiga Blogs], [http://blog.a-eon.biz/blog/ Trevor Dickinson blog],
: [https://forum.amiga.org/ Amiga OS AOS 3.x forum]
: [http://eab.abime.net/ EAB Amiga]
: [http://www.amigaworld.net/ AmigaWorld]
: [http://www.ppa.pl/ Polish Amiga Like News]
: [http://www.apollo-core.com/ Apollo Forum]
: [https://amigaalive.blogspot.com/ AmigaAlive]
: [https://www.amigalove.com/software Disk Mags]
: [https://amigachristmastree.ultimateamiga.com/ Xmas Amiga Game Jam]
: [https://www.reddit.com/r/amiga/ Amiga]
== Distributions aka Distros ==
For end users there are distributions (ready made with selected apps aiming to be easy to use), mostly created and maintained by one person in their own workflow/style. They reuse the nightly boot compiles to suit their needs and possibly other end users. You are free to create your own if required.
* For native 64bit Intel/AMD: [https://sites.google.com/view/arosone Aros One x64], [https://tinyarosdistro.flazio.com/ Tiny Aros],
* For native 32bit Intel/AMD which will run on 64bit machines: [https://sites.google.com/view/arosone Aros One x86], [https://www.tinyaros.it/ Tiny Aros],
* For native 68k [https://sites.google.com/view/arosone Aros One m68k], [http://www.aros-platform.de/ AROS Vision],
'''Please, keep in mind that the distros listed above use a different ABI (abi v11) , which is NOT binary compatible with the official ABI V1.'''
* For hosted Linux usb drive image [https://arosnews.github.io/aros-portable/ x64 Debian hosted version of Aros One],
* For hosted ARM there is [https://github.com/jonx/AROS-AArch64/releases alpha for Apple Silicon] and [https://aros.sourceforge.io/nightly1.html RaspberryPi Pi3, Pi4, Pi400, Pi5, 500+ raspi-aarch64-system native 64bit]
AROS was originally developed on Linux but can run on an Intel-based Linux distro as an app. As time has gone on, it can be run as an app on many more operating systems (Windows, FreeBSD, Linux and limited on MacOS). This may sound strange: an OS running on top of another OS.
Basically, this is to take advantage of drivers (audio, internet, graphics, etc.) and compiler environments, in the existing OS, with which people may be already familiar. The term we use for what AROS does is "Hosted".
AROS Native is the term coined to describe AROS being run without any OS underneath it. It runs alone just like AmigaOS(TM) did. As this version does not benefit from "Hosted" drivers, dedicated ones have to be ported/written. Hence the smaller range of supported hardware / peripherals. We have other pages highlighting this support
AROS is open source so basically everyone can take part. The source is public on github and there are new commits most days. AROS is automatically compiled daily, result are the nightly builds hosted on Sourceforge. The nightly builds are only used for testing changes, testing software and the starting point for distribution maintainers or even your own distribution. They are very basic, miss some functionality and apps like web browsers and generic general appearance which can be changed.
* The [https://sourceforge.net/projects/aros/files/nightly2/ Nightly2], [http://aros.sourceforge.net/download.php nightly builds File Release Service] or [http://aros.sourceforge.net/downloads/ Sourceforge Project Web builds] are made automatically every night directly from the Github and in the past, SVN (Subversion) tree and contain the latest code for the AROS operating system. It should be noted that the builds have not been tested in any way and can be horribly broken but usually are not.
*ABIv1 standard for most nightly builds, it is where the most work is done by developers
*ABIv11 offspring aka fork of 64bit PC ABIv1 i.e. another PC 64bit build
*ABIv0 standard for PC 32bit intel / amd PC distributions for historic reasons
==Media==
AROS media tends to boot in this tier list of media types, first internal HDD SSD, CD DVD drive, and finally usb drive (last two can depend on bios boot order)
* USB .VHD
[https://sites.google.com/view/arosone Aros One x86 and x64], with md5 below
<pre>
0a656d53a9c902e9934000d8392e30ec *ArosOne-USB-1.3-64Bit.zip
7dd7119ab3e56d75ee852c137226b4d7 *ArosOne-USB-v1.2-x86_64-v11.zip
cf906eeaad4a83b3520b1896bdc6b0d3 *ArosOne-USB-v1.1-x86_64-v11.zip
e2eb8fe8cfd61c567b0152a61cf85251 *ArosOne-x86-v2.8-USB-IMG.zip
559909c75c2f56472c74267a7d075355 *ArosOne-x86-v2.7-USB-IMG.zip
93da5898508c1a8c05bb8991ab7bd117 *AROS One Image-USB-2.4.zip
59fcabd7090e47f12d54f7eb78cf0f45 *ArosOne-x86-v2.2-USB-Image.zip
24fb8de726ae8fc5fe5bac6d30f03dc5 ArosOne-x86-v2.0-USB-Image.zip
f3d725e990072edce633b59747911b6b ArosOne-x86-v1.8-USB-IMG.zip
e089a24ae310e92fcc407a0125602ce8 Aros-One x86-IMG-USB-v1.6.zip
</pre>
[https://tinyaros.flazio.com/ Tiny AROS]
22bc993625b7c75b17263c0cc7e7baaa *Tiny Aros_copy.vhd (March 2024)
There is usually a vhd image inside the zip that can be written to USB sticks which is so much faster than the old ISO written to physical CD DVD method. This .vhd can be written to an USB stick / ssd with these pieces of software below but it will erase the previous contents from the usb
Windows - [https://www.raspberrypi.com/software/ RPi Raspberry Imager, use custom and see all files], [https://hddguru.com/software/HDD-Raw-Copy-Tool/ HDD-Raw-Copy-Tool], [https://rufus.ie/ Rufus up to version 3.20 may work with VirtualBox HD vhd images with Win7 but not some Rufus 4.x versions], [https://etcher.balena.io/ Balena Etcher but may spy on you],
Linux - [https://www.raspberrypi.com/software/ Raspberry Imager Ubuntu], Suse Image / Multi writer, dd,
Mac -
* Virtual Machine .ISO or CDs DVDs
The native iso images are currently not compatible with Ventoy, Yumi, MultiBootUSB, Easy2Boot E2B, or similar
<pre>
617a905b1665128c5e05f94dcc48e7f1 *AROS-One-v1.3-64Bit-v11.zip
11c8a147fcad7ecf52ae3a43e1934b69 *ArosOne-DVD-v1.2-x86_64-v11.zip
f93053d3b9ccf304d7e6ac3389e1987b *ArosOne-DVD-v1.1-x86_64-v11.zip
86d808a40dc7be389a758799a9b4f595 *ArosOne-x86-v2.0-ISO-DVD.zip
f1fc8599ef6a39e5df394e0f41d55526 *AROS-One-x86-ISO-DVD-v1.6.zip
</pre>
You can use a virtual emulator like VirtualBox, VMWare to mount the iso image which can then be used to boot and/or install to USB.
No current software can write an AROS ISO to a Pendrive. The author of ‘Rufus’ (who used an Amiga 500 as a child) once tried, but when he saw the system composition, he said he was unable to do it.
The solution is to boot the ISO from a VM (WMware, VBox), then install the AROS build on the Pendrive, which will eventually become a Live Pendrive that can be booted on a PC.
The only precaution is that in some cases it is necessary to thoroughly clean the Pendrive of any partitions and remove any bootloader that is not AROS. The Pendrive must remain raw without any partitions.
You can clean the USB stick on a PC with a program that manages hard disks. You need to do a partition wipe. On some USB sticks, you can clean it with InstallAROS.
For some USB pendrives, please use a reputable partition editor to remove any and all partitions from a usb pendrive as HDToolbox cannot do this task sometimes with a wipe all option.
Previously the only installation option was CD-RW or DVD-RW, since the whole system can be burnt onto a single disk and can be reused when the next version is released. Good branded discs like Taiyo Yuden (later JVC) or Verbatim should be used to reduce frustration later. The days for this media is gone but kept here for information
Since nobody currently sells AROS on any other media, you will need access to a CD/DVD burner to create the installation disk yourself. After it is on a CD or DVD, then access and writing to USB pendrives becomes available (this should be viewed as an outdated or last resort alternative method now), as well as using good USB manufacturers like Sandisk, Kingston, etc. rather than some other no-names.
Try burning it to a CD-RW or DVD-RW using your CD/DVD burning program (most burning software have a burn iso option). The ideal writing speed is 2x or 4x, higher speeds can give errors and problems. Check the writing integrity of your CD or DVD if your software has an option to do so before going any further.
Standalone portable usb cd dvd drives do not boot physical burnt discs, please use an internal ide sata drive instead.
* SD-card
For [https://aros.sourceforge.io/nightly1.html ARM Pi Aros 64bit], copy the files onto a FAT32 formatted micro SD card.
==Booting==
The LiveUSB, and in the past LiveCD LiveDVD, is designed to trial (test drive) various operating systems without having to install them to your working system.
Since 2011, UEFI was introduced to replace the original PC BIOS which made booting media more confusing. Some changes in the UEFI/bios may be needed
*go into the bios using esc, f2 or f? and disable the Security -> Secure Boot and maybe apply option for Legacy IDE mode
*you may have to press F9, F10 or F12 or p on boot up to present a device boot options like USB or CD/DVD
*disable the Fast Boot config so it would recognize portable DVD-drive and changed the Boot-sequence
Secure boot was introduced by Microsoft and later consortium, control what operating systems work with Secure Boot via shims.
For Aros, it is best to disable and save the turn off change to Secure Boot (if you dual boot with Windows this will cause issues with further Window boots)
For the best experience, it is advised to install to another SSD than the one Windows resides on.
The grub part of the boot should be fully automatic, and you should see a multiple choice graphic card screen after 10 seconds for USB or 40 seconds CDs and DVDs.
If boot does not occur within a minute, please reboot and choose the VGA boot option as it relays a message stream so you can see where the issue lies.
After the grub graphics choice, AROS takes over the booting and any issues can arise here
If possible please use a branded usb pen drive as most of the time when we get reports of "crashes right after grub boot selection" it is mostly due to the recorded pendrive as they are made, notoriously on a will it work / will it fail nature, every time it is used.
<pre>
So one usb drive written may stop at a System halted. Reset the machine.
Or another pendrive will show give errors Smart Filesystem request - Volume 'Aros Live Drive' (DU0: usbscsi.device unit 0) There was an error while accessing this volume:
Or if a FAT32 partition present - FAT filesystem - Device USBSCSI0P1 has a read error on block xxxxxxxx -
</pre>
Sadly, no drive even branded are resistant or totally reliable, so the only solution is to try another pendrive, and possibly to repeat, until no errors.
It will give an indication on how reliable the usb drive could be.
=====Advice for various machines=====
Some of the stages involved and shown on the display in a typical AROS boot start up
<pre>
[MultiLoader]
[ELF Loader]
[Boot]
[HPET]
[Kernel:ACPI]
[Kernel:APIC-IA32]
[Kernel:SMP APIC]
[HiddStorage]
ACPI: ????
ACPI Error
[ACPI]AcpiOs????
[BattClock] Got RTC century offset 0x32 from ACPI
[PCI] Scanning bus ?
[AHCI] Sata
[Vesa] only if vesa is chosen as graphics option
[ATA] detect hd & cd drives
[ATA0?] ata-identity
[packet] fat.handler be.handler, etc.
[DOS]
[Storage:Bus]
[Storage:Controller]
[MSS] USB setup
[ehciInit] Port ? maps to controller ?
[I2C]
[ATI]
[drm] nouveau
[AROSTCP] if you have network driver prefs set up to start when booting
</pre>
; If boot fails, please give us some indication (pictures or videos) where the boot stops and the message(s) on screen.
AROS's native SATA/AHCI driver doesn't always work. If you get errors related to ahci.device, try disabling it. At your chosen boot entry in the GRUB menu, Press E, scroll down to the ahci.device entry, and add a # or ; at the start of that line or delete it with Ctrl-K. Then press Ctrl-X or F10 to boot.
If your disk isn't accessible at all with this change, you might need to change the SATA controller to IDE legacy mode in the BIOS: however, making this change will likely cause problems booting Windows on the same machine (if it's already installed). To disable ahci.device permanently, edit the text file "SYS:Arch/pc/grub/grub.cfg", and remove the ahci.device line from all boot entries you intend to use.
SATA AHCI Timeout while waiting for device to complete operations with BIOS SATA entry set to AHCI mode stops at "waiting for bootable media" screen, changing BIOS SATA setting back to IDE mode may allow it to continue booting
The ATA driver doesn't always work. If you get errors related to ata.device, try using the alternative in sys:devs/alt which is an older version. Press E when your chosen boot entry is highlighted in the GRUB menu, scroll down to the ata.device entry, and change it to read "module /Devs/Alt/ata.device". Then press Ctrl-X to boot. To make this change permanent, edit the text file "SYS:Arch/pc/grub/grub.cfg", and change the path to ata.device in all boot entries you intend to use.
Further options (removing the " ") to add to the GRUB menus to disable certain other components for debugging:
<pre>
Disable AHCI "AHCI=disable"
Disable NVME "NVME=disable"
Disable ATA: "ATA=disable"
Disable ATA: "ATA=nopci,nolegacy"
ATA safe mode: "ATA=nodma,32bit"
Disable IDE from SATA: "ATA=32bit,nosata2pata"
VIA / SIS with cdrom read io errors "ATA=nodma,nopoll"
noacpi all [PCI] devices to be invisible to AROS. disk drives work but network, sound won't
acpi=strict if there are issues with sound after boot
noioapic alternative to no acpi
Set AHCI "AHCI=force150/force300/force600"
Disable AHCI/SATA: comment out with a # ; or remove ahci.device line with Ctrl-K
Disable USB: comment out # ; or remove pciusb.device and poseidon.library lines with Ctrl-K
Disable native graphics: "nomonitors"
USB3 "USB=xhci"
</pre>
Other useful grub command line options - nomonitors, noacpi, vesahack, nopoll
Press Ctrl and X together (or F10) to exit and boot with the new options. Just experiment with different variations until successful. Those working options will need to be reused with every reboot of AROS until you can edit the grub.cfg and make it permanent i.e. install to hard disk or USB.
* If you use VESA mode, you can see the debug log if you add 'vesahack' to the command line. This will set up split-screen mode. In the upper half you'll see AROS screen, in the bottom - debug log.
* ACPI ie. PCI hardware - If you get crashes at early boot, try adding 'NOACPI' to the command line
If you're having boot issues and have a null modem cable and a spare pc, a boot log is always useful. Edit your grub line to include debug=serial but would try with an with sysdebug=all in the line later as it can cause issues booting on machines with sysdebug=all enabled (corrupts the cpu initialization).
However, if you feel you have found a genuine bug/fault in AROS that needs attention, please use the [http://sourceforge.net/tracker/?atid=439463&group_id=43586&func=browse bug submission form] to record as much information about what happened, why, and what hardware etc. you have so that people may try to assist you
For Virtual machines VMWare VirtualBox, etc., attach and press play to start the ISO image
If booting hasn't worked then it could be down to Bios/UEFI settings
=====nvme.device=====
Since 2018, nvme drives are standard on most machines
The requirement is that a PC can boot with legacy mode/BIOS at the moment - Now as far as hardware goes on a newer machine with an NVME drive you may need to add NVME=disable as the NVME driver could potentially cause lockups.
This is still in testing and its' use should not be on or near precious own data
=====AHCI=====
Starting taking over since 2011 on a lot of machines
* Check that UEFI (replacement for PC BIOS) has options set to remove UEFI SecureBoot option and apply CSM
* SATA drive is set for Legacy or a mixture AHCI/IDE and not AHCI
AHCI sata can be very difficult to get working
Most Windows installs are already set to AHCI sata, changing this to a legacy IDE mode setting can help but please check if Windows will still boot. Some hardware like Lenovo laptops do not always like being set in legacy mode so only use as a last resort and aware of issues that can be caused.
Now as far as hardware goes on a newer machine with an NVME drive you may need to add NVME=disable as the NVME driver could potentially cause lockups.
With a 16C/32T chip machine, disable SMT and it should boot.
=====ata.device for old BIOS's =====
Pre 2010 this was the de facto standard method of providing settings to the computer at a lower level
Some adjustments to the BIOS setup options are necessary (usually by pressing a key like DEL, F1, F2, F12 or ESC, p on the very early boot up of the computer).
*Adjust booting options like moving USB hdd, CDROM higher as it is quite often disabled or placed lower by default, i.e. USB hdd, CD/DVD are placed at the top above the hard drive. Try looking here [http://www.windowsreinstall.com/articles/bios/ Windows] or [http://www.hiren.info/pages/bios-boot-cdrom Bios] or [http://www.wikihow.com/Set-Bios-to-Boot-from-a-CD-ROM Boot] or web search "BIOS BOOT CDROM"
* At the '''SAME''' time, check if the SATA/AHCI option is set to Emulate or IDE Legacy, though this can have '''issues''' with any OS already on the hard disk. If in doubt, do nothing and seek advice.
* check that under BIOS settings you '''DO NOT''' have plug&play OS selected as Aros at this point is unable to route interrupts on its own and needs the BIOS to do that.
'''Save''' options changed at the end.
PCITool can show if the motherboard chipset is in IDE mode.
Class = 0x01 means STORAGE, Subclass = 0x01 means IDE. Also ProductID 0x3a20 resolves to non-AHCI mode in Intel ICH10 documentation.
==Installing==
We have a separate section [https://en.wikibooks.org/wiki/Aros/Platforms/x86_installing here]
We have a specific section for each CPU platform under the Specific platforms in the NavBar navigation bar on the right hand side menu
error code (-6) when using the ahci.device (has writing to disk problem but not reading) is enabled. change this line in your grub and reboot
<pre>
#module /Devs/ahci.device << disable
module /Devs/Alt/ata.device << add this line instead
</pre>
==File structure overview==
AROS' directory structure is mostly identical to AmigaOS directory structure, with some additions.
AROS: or SYS: also known as DH0: (i.e. the drive partition with AROS system) has the following simplified list of the main drawers (Amigas term for directories/folders).
{| class="wikitable"
|boot:
| grub bootloader
|----
|C:
| small apps, where AROS looks first for applications/games but will look at Tools, System afterwards
|----
|Classes:
| .class as well as datatypes
|----
|Devs:
| .device .resource and in their own drawers (folders) .audio, .hidd, network, graphics
|----
|L:
| where .handler files go
|----
|Libs:
| where .library files go
|----
|Locale:
| where help guide txt readme files go
|----
|Prefs:
| applications that adjust or setup AROS functions and capabilities
|----
|S:
| startup scripts (for the aros boot process '''not''' grub) are stored here
|----
|Storage:
| place to keep old or alternative device drivers
|----
|System:
| applications associated with AROS operating system
|----
|Tools:
| extra applications
|----
|Utilities:
| extra applications
|----
|WBStartup:
| copy applications here to autostart with needed icons, drawers, data etc
|----
|}
See [[Aros/User/DOS#Drives.2C_Files.2C_Assigns.2C_Directories|DOS manual: Drives, Files, Assigns, Directories]]
=== Filesystem ===
Whilst the kernel is the heart, the filesystem is the blood of the system they are split into two categories (only a few are supported)
<pre>
Journalling - SFS PFS3 but also NTFS ZFS XFS ext4
Non-journaling - FFS FAT32(VFAT) but also exFAT BtrFS ext2
</pre>
Filesystem options for AROS to install
* SFS default
* Professional File System PFS3 [http://eab.abime.net/showthread.php?t=52234&highlight=pfs3+free&page=13 only on motorola 68k at the moment] [https://github.com/aros-development-team/AROS/blob/e34170ea87da3b32935b60ed99d837b2b903a021/rom/filesys/pfs3/fs/mmakefile.src issues to compile on other platforms]
* FFS very old now but left in for legacy usage
Other [https://archives.arosworld.org/index.php?function=browse&cat=driver/filesystem filesystems] for storage purposes
* FAT32 favorite as most OSs support
* NTFS (can lock AROS)
* exFAT there is a [https://www.jkn.me/blog/bringing-exfat-to-aros/ standalone version] as well as the fuse based one
The only filesystems that really NEED defragging (i.e. disk tidy up) are from Microsoft(TM) - exFAT/VFAT/NTFS
*SFS tries to do exactly the same thing, but in certain cases it doesn't do as well as PFS. But you can defrag SFS
*PFS *minimises* the amount of fragmentation, but does not automatically defrags as it saves files to the drive
The setup of the below filesystems is usually done by the distro maintainer but if not....
<pre>
Copy L/exfat-handler L:
DOSDriver or Mountlist entry for an exFAT partition make sure that the FileSystem and Handler are set as follows:
FileSystem = exfat-handler
DosType = 0x46415458
</pre>
<pre>
Copy L/ntfs3g-handler L:
DOSDriver or Mountlist entry for an NTFS partition make sure that the FileSystem and Handler are set as follows:
FileSystem = ntfs3g-handler
DosType = 0x4e544653
Also to make a read-only mount you can set:
Control = ro
</pre>
The Smart File System (SFS) is a journaling filesystem used on Amiga computers and AmigaOS-derived operating systems. It is designed for performance, scalability and integrity, offering improvements over standard Amiga filesystems as well as some special or unique features.
SFS is written in C and was originally created and released as freeware in 1998 by John Hendrikx. After the original author left the Amiga scene in 2000, the source code to SFS was released and its development continued by Ralph Schmidt in MorphOS.
Its development has now forked; as well as the original Amiga version, there are now versions for MorphOS, AROS, AmigaOS 3, and a version for AmigaOS 4, which have different feature sets but remain compatible to each other. Versions for AROS, AmigaOS and MorphOS are based on different branches.
In addition, there is a driver for Linux to read Amiga SFS volumes, GRUB natively supports it and there are free drivers to use it from UEFI. The Linux version is [http://home.elka.pw.edu.pl/~mszyprow/programy/asfs/ independent code].
SFS (Smart File System) partially defragments itself while the filesystem is in use. The defragmentation process is almost completely stateless
AROS SFS version has a 120GB partition size limit on hard disks and DVDs current 4gig size limit.
The sources for the MorphOS 64-bit version of SFS were available but no porting to AROS has happened so far due to endian issues, etc.
SFS Tools
* GUI - arSFSDoctor,
* CLI - sfscheck , [http://www.portacall.org/ sfsundelete], sfsformat, setcache hits a usability ceiling around the 10GB / 100,000 file mark,
sfscheck dh0: seek purge fraglist defragment
If there are two simultaneous file writes in progress and you reboot machine (or it locks up or crashes) you may end up with a corrupted filesystem. Although arSFSDoctor may help, you might have to copy the files to another partition, format the partition with the errors on and copy the files back.
PFS / SFS are way more advanced and much much faster than the FFS. FFS is supported for legacy reasons only.
The Professional File System (PFS) is a filesystem originally developed commercially for the Amiga and now distributed on Aminet with a 4-clause BSD license. It is a compatible successor of AmiFileSafe (AFS), with an emphasis on added reliability and speed compared to standard Amiga filesystems. It also features multi-user abilities like the older MuFS.
PFS has so many advantages including the important things, speed, the ability to recover all deleted files even simply same name by typing the command ". Deldir" convenient if done in Directory Opus, virtually deleted files are copied normally as if they had never been deleted, other convenience is to not ever invalidate the filesystem, just put it on top of the startup-sequence command "diskvalid", which automatically corrects any irregularities in the system startup; PFS also provides a device for floppy which makes them very fast and takes advantage of the full capacity of the floppy including the area dedicated to the bootloader.
The device is split into two main areas. At the beginning of the device is the metadata section, which consists of a root block, and a generic array of blocks that can be allocated to store metadata. The rest of the device is another contiguous generic array of blocks that can be allocated to store data. The metadata section usually uses a few percent of the device, depending on the size of the device.
The metadata is stored as a tree of single blocks in the metadata section. The entire directory structure is recorded in the metadata, so the data section purely contains data from files. The metadata describes the location of data in files with extents of blocks, which makes the metadata quite compact.
When a metadata update occurs, the system looks at the block containing the metadata to be changed, and copies it to a newly allocated block from the metadata section, with the change made, then it recursively changes the metadata in the block that points to that block in the same way. This way, eventually the root block needs to be changed, which causes the atomic metadata update.
The filesystem is reasonably good at keeping files unfragmented, although there is a defragmentation tool available which will work on an online filesystem ie whilst being used.
It was the first filesystem to introduce the concept of the Recycle Bin natively at filesystem-level to the Amiga, holding the last few deleted files in a hidden directory on the disk root.
PFS version 5.3 was developed in C and a small portion of assembly code by Michiel Pelt. There are endian issues to be overcome and adapting the small amount of m68k to C before use on intel based machines, etc.
Autoupdate of files in a directory is already implemented in Wanderer, but not all file systems handle dos.library/StartNotify() in its full extent. It seems to work correctly in Ram Disk (thanks to AmberRAM handler), and it also works on SFS formatted devices. Other file systems might not yet have it implemented correctly though.
The PC equivalent of the Amiga's RDB is the master boot record (MBR).
===Installing Applications===
The typical means to install applications under AROS/AmigaOS involves simply copying/extracting the archive (.zip .lha .rar .tar.gz) file containing the applications files to your own desired location i.e. drawer/folder. Once extracted, launching it by double clicking on an icon (recommended) or using the shell (alternative). Generally, this is on a separate partition from your AROS system files, however in reality it can be any location - including RAM: if you don't want it staying around too long especially when you switch off.
At some time in the future it may be desirable for AROS to have a package-manager like subsystem able to retrieve information online about packages available for AROS and whether they update anything you currently have installed, however at the moment no such ability exists.
===User Data files===
AmigaOS has no notion of a default location to store user data files, and presently neither does AROS - though it may be desirable at some time to provide a common start location.
Some people, have extra small FAT32 partition(s) using HDToolbox, and not Qparted, to store data especially if a reinstall is ever needed. And then setup the usual Sys: (DH0:) and maybe Work: (DH1:) / Live USB (DU0:) and maybe Briefcase (DU1:) partitions.
===User Environment configuration files===
AmigaOS/AROS stores persistent system configuration data in directory assigned to ENVARC:. This, by default, points to SYS:Prefs/EnvArc.
During boot a copy is made to another assign, ENV:, which is for runtime usage. Changes to the files here will not survive a reboot.
Setting the env variables is generally done by applications themselves, or when necessary by the user using the SetEnv command. SetEnv has a SAVE switch to force the persistent copy in ENVARC: to be written also for when you are sure the change should be permanent.
Under the standard installation of AmigaOS style OSs, ENVARC: is copied to ENV: upon startup, which, if you have a hard drive installation, is in RAM:, hence, ENV: ends up being RAM:Env.
ENVARC: is the Environment Archive, which is the permanent copy of ENV:, which is the Environment. It's roughly like the Registry in Windoze.
Most programs do (and all should) store their settings in ENVARC: somewhere, and load them from ENV:. The effect of this can be seen in the Preference editors. If you Save your preferences, they go in ENVARC: and ENV:. If you click Use, they only go in ENV:. If you reboot, normally, anything saved to ENV: is lost, and is replaced with a copy of what is in ENVARC:.
you can set the default public screen for any tool started from a cli with the PUBSCREEN variable. So open the pubscreen, set PUBSCREEN to the name and start newcli for example, then the new cli window (and all following windows opened from that window) will appear on that public screen.
===Drivers===
For certain hardware, e.g audio, networking and , there is no auto setup. Just like the original Amiga OS.
For audio, use AHI in the Prefs folder to set Music and at least Unit 0 with the appropriate driver and press Save. For ethernet and wifi, please use SYS:Prefs/Network
All hardware support is placed in the Devs drawer (folder/directory). The network drivers <something.device> go in the Networks sub-drawer. Audio drivers <something.audio> are put in the AHI sub-drawer. Graphics drivers <something.hidd> are put in the Drivers sub-drawer.
==Configuring==
AROS has mainly decided on a MUI-like requester&menu clone called Zune so changing the background, icons, font, menus can be done with SYS:Prefs/Zune
AROS has several desktop GUI front ends like
* DOpus5 Magellan II, Wanderer and Scalos (medium)
* AROS Workbench, Workbook (smaller)
File / Directory managers like Dopus4, MCAmiga,
App Launch Shortcuts like FKey, BoingIconBar, right mouse click on magellan, wanderer desktop, Amistart, etc.
General usability decisions - Prefs/IControl, Prefs/Locale, Prefs/Input, Prefs/Fonts,
Select an icon with left mouse button and then right click the mouse button and selecting Icon -> Information gains access to the tooltypes tab where information can be edited
CLI in icon's tooltypes means 'run it as if it was run from shell'
If, on the other hand, the WB parameter (or no parameter) is present in Tooltypes, Wanderer will execute the binary and, if provided, the options included in Tooltypes.
WBxCLI is very useful for adding options to DOS Commands.
Important: AROS has a different way of managing icons. If you have an executable file, you will never be able to add a project icon. AROS will automatically recognise that it is an executable file and will transform the icon into a tool icon.
Icons are typically now .png pictures renamed as .info e.g. so Office application name would have a Office.png renamed as Office.info or MyApp.png as MyApp.info, etc.
Leave Out menu option to leave app icon on desktop
To select multiple icons and save their positions, click on the first icon and after while you hold the Shift key down select further icons and don't release it before SnapShot is finished. You can also select a whole group of icons by pressing the LMB at the top left of the icons and while keeping the LMB down moving the power towards the bottom right. A expanding bounding box will appear and all the icons within it will be selected.
Clean Up menu option (right mouse button -> Icons) rearranges icons in a drawer or disk window into a neater condition. To use, open the window to rearrange and select Clean Up. To keep the icons in the new positions, select all the icons (shift key or mouse selection) and select 'Snapshot' and then Window and then again with All.
In DOpus5, Scalos, wanderer, most files have an icon file associated with it. To change the default tool, select Icon menu, Information, and change the default tool string. For example, you could use Multiview, Editor and so on for most text, graphics and some sound files as long as the appropriate Datatype classes are installed. For scripts, set the tool to C:IconX
We have new Icon edit tools in progress but if you need to...
C:Join Image1.png Image2.png TO MyFile.info
is enough to make a dual state icon from two png images. You can then use Wanderer's menu Icon/Information on it to edit its fields and tooltypes.
[https://archives.arosworld.org/index.php?function=browse&cat=graphics/icon AISS toolbar images] unpack unarc them into RAM: and copy Images directory to SYS:Prefs/Presets/ AISS icons are looked for in PROGDIR:, PROGDIR:Images, SYS:Prefs/Presets/Images and then in TBImages: according to Open Amiga guidelines.
there is Demos/iconscale which could be launched from S:User-Startup with two arguments, telling it the horizontal and vertical size. IE something like
Demos/iconscale 40 40
It will shrink icons... not sure if it will be very nice though. it doesn't work for the icons on the main desktop.
there is an option to scale an icon to a bounding box afair, try iconsize followed by two numbers, like:
iconsize 32 32
Is there any way in AROS to change an icon type from Project to Tool or vice versa?
Either the SIT option of [ ProcessIcon], or the TYPE option of HandleInfo (not sure if this one works at all, please test with care).
processicon sys:pathoftheicon SIT=Project
SIT Set type of ICON. Allowed types are: "Disk", "Drawer", "Tool", "Project", "Garbage", "Device", "Kick" and "AppIcon".
Btw, are your icons, the #?.info files, writable, is the W flag set ?
'''Decoration''' is Aros' way to provides a way to hide the old Workbench 3.1 style of windows and screens. In Prefs/Appearance some decorative theming elements need work
Themes - SYS:Prefs -> Appearance
The default content of Prefs/Env-Archive/SYS/themes.var should be "themes:ice" but can be changed via the Appearance prefs, please do NOT click the Use button. Its useless. As you know, it will ask for the theme volume. Just pick the theme you want, click on Save, then reboot.
* Decoration is on. Any time trying to change theme, you get: "Please insert volume Theme: in any drive"?
You could check if you find SYS:System/Themes or if it is missing. Then you could open startup-sequence which you can find in drawer "S". There should be a line:
Assign THEMES: SYS:SYSTEM/THEMES >Nil:
This does the trick.
Open a shell and run:
Assign THEMES: SYS:SYSTEM/THEMES
Than start the Theme prefs again... this should work
* The theme is the only thing that could slow the system a bit, but it's not that performance impacting on most uses, and you can switch it off completely. Remove C:Decoration from the bottom of the file sys:s/startup-sequence.
In each theme directory is
*Env-Archive -> Zune -> global.prefs
*images -> Gadgets -> 20x20 pngs for Down etc
*menu -AmigaKey - Background - Checkmark - SubMenu and config
*system - Arrowdown, Arrowleft, Arrowright, Arrowup, etc
There is an [https://archives.arosworld.org/index.php?function=browse&cat=graphics/theme ALua/Zulu script] built for faster Wanderer skin management. You can modify config files, install new (wdz format/zipped skin files) and delete skins via the Theme Manager. This has not been updated in a long time and may not work.
Certain features are added if from Tools/Commodities like Blanker screensaver, ClickToFront and DepthMenu with .info icons are selected and dragged to /WBStartup folder
Most apps can be autostarted by copying into SYS:WBStartup directory folder
e.g. WeatherBar.zip can be downloaded, unzip and the contents of the zip copied to wbstartup folder
ClicktoFront and .info to SYS:WBStartup so always be activated when turning on the computer
or add a text line to user-startup is SYS:S (scripts version of wbstartup)
e.g. standard Amiga / AROS does not allow clicking of background windows to come to the front to make it easy to get to the window you need but it has the ability if these apps are copied again to WBStartUp or are added to SYS:S/user-startup script
run QUIET sys:Tools/Commodities/ClickToFront >Nil:
run QUIET sys:Tools/Commodities/DepthMenu >Nil:
run QUIET sys:Tools/Commodities/Blanker seconds=300 >Nil:
Exchange controls Commodities and can be opened with alt, ctrl, h
*AltKeyQ uses left Alt key to add strange letters
*AutoPoint
*Blanker screensaver
*ClickToFront allows windows to be easily brought to the front
*DepthMenu adds menu to select window easily
*NoCapsKey
*Opaque
*FKey - Although there are heaps of docks, menus and other launcher programs on the Amiga like OSs, FKey has got to be one of the quickest once learnt ways to launch programs, and it comes with the OS. In SYS:Tools/Commodities, the FKey commodity (Ctrl Alt F) allows you to make actions assigned to some combinations of keys
<pre>
ALT TAB Cycle Windows
Cycle Screens
Enlarge Window
Shrink Window
Toggle Window Size
Insert Text
Run Program
Run Arexx Script
</pre>
e.g.
<pre>
LAmiga F1 = Avail Flush
LAmiga F2 = Open Prefs
LAmiga F3 = Finder
Alt Tab = Cycle Windows
LAmiga Tab or M = Cycle Screens
Alt Up arrow = Enlarge Window
Alt Down arrow = Shrink Window
Alt Home = Toggle Window Size
= Insert Text
LAmiga e = Run Program
= Run Arexx Script
</pre>
If your FKey GUI pops up when you start your Workbench up and you don't want it to, click once on the icon, go to the Icons-Information in the menu and make sure it has the tooltype set "CX_POPUP=NO".
Now let's launch it and assign the locale switching. After you double-click on FKey icon, launch the Exchange, choose the FKey from list and click the Show button. This will invoke the FKey window. You can see the ALT TAB in list assigned to window switching. Now enter the first key combination, say, ALT Z and go to the right panel. Choose Launch the program from pulldown menu and enter SYS:Prefs/Input as an argument. Append the USE switch and english preset name to the string as shown:
SYS:Prefs/Input USE SYS:Prefs/Presets/english
Click on the New Button to add the another combination. Now set the combination for your locale as shown above, replacing English name with your preset name. Click New button again and then Save Settings. Now you can use defined combinations to switch the layouts.
There is a system wide ARexx script capability (based on regina) that can manage many file manipulation task(s) but this would work only with those program that support [https://en.wikibooks.org/wiki/Aros/Developer/Docs/Rexx ARexx] like
*Desktop - DOpus5, Scalos
*Dock - FKey,
*Files - Multiview, DOpus4,
*Internet Apps - Odyssey, WookieChat,
*General Apps -
the shell can be modified with escape strings but not needed in most cases
Common Keyboard Shortcuts
<pre>
RAlt Right Alt Key
LAlt Left Alt Key
RWinKey Right Windows Key
LWinKey Left Windows Key
RAmiga Right Amiga Key (if one)
LAmiga Left Amiga Key (if one)
</pre>
;Bootup Options
:Spacebar during boot, enters the bootmenu which allows a boot without startup sequence, etc
;Left Click
:LAmiga = LWinKey = F11
;Right Click
:RAmiga = Help = F12
;Mark
:RAmiga and B
;Cut
:RAmiga and X
;Copy
:RAmiga and C
;Paste
:RAmiga and V
;Search
:RAmiga and S
;Mouse Movement
LAmiga and together with arrow keys - shift as well at the same time as well to move faster
;Mouse Selection
LAmiga and LAlt to select
;Screen Switching
LAmiga and M or N
;HELP key
Can sometimes be mapped to F11 but can be changed via FKey
ComKeyRemapper or AmigaKeyremapper could swap RAmiga to another key press
===DOpus 5 Directory Opus Magellan II===
Dopus 5.x is a whole desktop replacement on the Amiga Workbench (Desktop). Please describe any replicable errors [https://github.com/BlitterStudio/dopus5/issues here]
DirectoryOpus app will assign DOpus5: to it's PROGDIR: automatically but if not add the below (edit SYS:System to suit where Dopus5 was installed) to your startup-sequence
<pre>
Assign DOpus5: SYS:System/DOpus5
DOpus5:DirectoryOpus
;DOpus5:C/LoadDB
</pre>
Left mouse button clicked twice on the desktop background brings up the Device List window.
Green strip notifies SRCE (source) and if another is open it will be red for DEST (destination). clicking on the red strip changes to green
Word list of actions with a left mouse click on the DOWN Arrow and directory stuff with < button which mirrors the icons at the top of each lister
single-key hotkeys? exactly the same as in dopus4, edit your functions (button bank, toolbar, menus etc.) and under the flags gadget is a key gadget, just click in it and press the key you want to use.
As for the extra text field... try turning off Extended lister key selection in environment / miscellaneous.
Shift and click on the icon - runs the icon
DOpus5 Magellan 2 Directory folder drawer structure
<pre>
ARexx - Arexx scripts .rexx and .dopus5 to perform tasks
Buttons -
Commands -
Desktop -
Environment - two environment files bundled:
default gets loaded if you run DOpus as a normal app
workbench gets loaded if you run DOpus as a WB Replacement (with LoadDB on startup)
Filetypes -
Groups -
Icons -
Images -
Modules - compiled tasks
Settings -
Sounds -
Themes -
WBStartup - Use this if standard SYS:WBStartup gives cannot wait error messages
</pre>
Settings -> Environment -> Display -> Workbench (Use)
*Settings -> Clock (add to title bar as well as the date)
*Toolbar -> Editor (Right Win Key together with 1) for Copy, Move, Delete, etc above the Device List
*Menu -> (Right Win Key together with 2)
*Buttons -> Editor (Right Win Key together with 3)
*Settings -> Environment (Right Win key together with 4) for Backgrounds, etc
*File Types -> (Right Win key together with 5)
*User Menus -> (Right Win key together with 6)
*Hotkeys -> Setup for quick shortcut keypresses (Right Win Key together with 7)
*Scripts -> (Right Win key together with 8)
*Icon Positioning -> (Right Win key together with 9)
Each Dopus5 theme are stored in a separate directory, named appropriately, which contains further sub directories
* Font (amiga bitmap fonts)
* Screens (jpg or any picture supported by datatypes but not animations)
* Sounds (wav but not iff 8svx )
* Icons (png newicons glowicons )
* Patterns (iff jpg png )
Just use wildcards in background filenames and you get a different picture every reboot
For example, configure in Environment -> Backgrounds -> Desktop something like this:
<pre>
Work:Pictures/Backgrounds/#?
...or
Work:Pictures/back#?.iff
...etc...
</pre>
[https://aminet.net/util/dopus arcdir and themes]
If you want to change the backdrop pic after a period of time, paste below into a text file called dopusrandbg.rexx and place in DOPus5:ARexx
<pre>
/* Changes DOpus background image forever
Start with:
Run >NIL: RX dopusrandbg.rexx
*/
if ~show("L", "rexxsupport.library") then do
if ~addlib("rexxsupport.library", 0, -30,0) then exit 10
end
/* Configure these two lines for your needs: */
minutes=1
picpath="Work:Pics/#?.iff"
address DOPUS.1
do forever
call delay 3000*minutes
dopus set background '"'picpath'"' desktop center custom
dopus refresh background custom
end
</pre>
If you don't want to use/open rexxsupport.library just for DELAY() then use the DOS Wait command
<pre>
/* random diropus backdrop changer */
/* by paul trauth, 1999 */
/* to do: non-repeatable randomness? */
options results
parse arg path
address DOPUS.1
/* get current backdrop pattern so it actually changes */
dopus query background desktop custom
currentpatt=result
lastslash=lastpos('/',currentpatt)
currentpatt=substr(currentpatt,lastslash+1,(pos('"',currentpatt,2)-lastslash-1))
dir=showdir(path,'FILE','/')
num=0
do while dir~=''
where=pos('/',dir)
if where>0 then do
file=left(dir,where-1)
dir=right(dir,length(dir)-where)
end
else do
file=dir
dir=''
end
if left(file,1) ~='.' & file~=currentpatt then
do
pics.num=file
num=num+1
end
end
which=random(0,num-1,time(s))
newbg='"'||path||'/'||pics.which||'"'
dopus set background newbg desktop tile precision exact
dopus set background on
dopus refresh background
</pre>
Clock format commands available are defined by locale. They are:
<pre>
%a - abbreviated weekday name
%A - weekday name
%b - abbreviated month name
%B - month name
%c - same as "%a %b %d %H:%M:%S %Y"
%d - day number with leading 0s
%D - same as "%m/%d/%y"
%e - day number with leading spaces
%h - abbreviated month name
%H - hour using 24-hour style with leading 0s
%I - hour using 12-hour style with leading 0s
%j - julian date
%m - month number with leading 0s
%M - the number of minutes with leading 0s
%p - AM or PM strings
%q - hour using 24-hour style
%Q - hour using 12-hour style
%r - same as "%I:%M:%S %p"
%R - same as "%H:%M"
%S - number of seconds with leadings 0s
%T - same as "%H:%M:%S"
%U - week number, taking Sunday as first day of week
%w - weekday number
%W - week number, taking Monday as first day of week
%x - same as "%m/%d/%y"
%X - same as "%H:%M:%S"
%y - year using two digits with leading 0s
%Y - year using four digits with leading 0s
</pre>
like %a %d-%b-%y %H:%M or
A WB ARexx interface, you could enter a cli command as a menu item to open a WB drawer like this...
RX "address WORKBENCH;WINDOW 'device:drawer' OPEN"
Where device:drawer is replaced by the path of the drawer to open.
The ARexx script would be capable to manage such a task but this would work only with those program that support ARexx
<pre>
dopus addappicon
dopus addtrap
dopus back
dopus checkdesktop
dopus clear
dopus command
dopus desktoppopup
dopus error
dopus front
dopus getdesktop
dopus getfiletype
dopus getstring
dopus matchdesktop
dopus progress
dopus query background, font, palette, pens
dopus read
dopus refresh all, background, icons, lister
dopus remappicon
dopus remtrap
dopus request
dopus script
dopus screen
dopus send
dopus set background, font, palette, pens
dopus setappicon
dopus version
</pre>
<pre>
lister add
lister addstem
lister copy
lister clear value
lister clearcaches
lister close
lister empty
lister findcache
lister getstring
lister iconify
lister new
lister query active all, dest source
lister query abort, busy, case, dirs, display, entries, entry, files, flags, handler, header, hide
lister query label, lock, mode, namelength, numdirs, numentries, numfiles, numseldirs, numselfiles
lister query path, proc, position, seldirs, selentries, selfiles, separate, show, sort,
lister query title, toolbar, value, visible, window
lister read
lister refresh
lister reload
lister remove
lister request
lister set busy, case, dest, display, field, flags, handler, header, hide, label, lock, mode
lister set namelength, newprogress, off, path, position, progress, separate, show, sort, source
lister set title, toolbar, value, variable
lister select
lister wait
</pre>
The '''command''' allows you to call internal DOpus commands from an ARexx script
<pre>
command all
command wait copy
command read s:startup-sequence
command source 12345 makedir name noicon
</pre>
*SFTP secure encrypted comms over internet using libssh2 and zlib (different protocol to the two below) on port 22
*FTPS secured with https like security on port 21
*FTP not secure and unencrypted protocol over internet on port 21 (should not be used today on the internet but for your own server)
===Wanderer ===
Wanderer prefs in the prefs drawer - Appearance tab and Workbench icon allows backgrounds (wallpapers) icon text sizes, colors, etc but cannot use #? or *.* in the backgrounds file entry to randomly choose pictures - [https://developers.google.com/speed/webp/docs/riff_container webp riff container] issues with this format but Multiview has none.
Enable the bar, you need to edit the text file ‘statusbar.prefs’. The change is simple: just change “False” to ‘True’.
Prefs/Env-Archive/SYS/Wanderer/statusbar.prefs
===Scalos===
[https://web.archive.org/web/20180922220139/http://scalos.noname.fr/ Scalos] is not an OS replacement, it's a Workbench replacement. It replaces the desktop and graphical file management components.
Scalos is 100% Workbench replacement with most functions working like the original Workbench ones. Undo and Redo available for most window and icon operations. Fully multitasking so every window has its own task. While loading icons, any window function (e.g. Drag&Drop) is available.
24bit color support with window patterns - Unlimited and easily configurable via tooltypes. Optimised backgroundpatterns routine so patterns can be tiled, centred or even scaled to fit into the windows. Live updating window scrolling - Supports middle mouse button panning and drawer (folder) windows can be iconified on the desktop.
Icon imagetypes with all types are supported such as backfill or complement. Configurable surrounding iconborder. Icon support also visually highlights files which are soft-links in the file system. Icon dragging is more stable and far less flickery on graphics cards. Whilst dragging, icons are displayed with text and they can become transparent over anything where they can be dropped.
Single-window lasso mode, with scrolling window contents invoked by dragging mouse with configurable qualifier key. Text icon lasso selection used to ignore "Name column selects text icons" flag. Support for backfilled thumbnail icons, with selectable color and transparency. Added option to always generate square thumbnail icons with preview icons for images - Thumbnails can be permanently saved in icons.
Supports PNG icons with alpha channel and real transparency and displays OS3.5 GlowIcons and are all scalable. Iconborders with variations (normal, shadowed, outlined).
Completely configurable, filetype-specific user-definable popup menus and tooltips. Plugin system to exchange or add features and can enhance the Workbench and make it more configurable.
Filetype plugins to display filetype-specific information. - Currently, EXIF information viewer for JPEG images is included. Plugin included for 100% support of OS3.9 Workbench features. Plugin included for AREXX API compatible to OS3.9 Workbench.
Online update with updater.module
Scalos works also as a Workbench replacement. In this case the 'emulation mode' has to be set by using Scalos' own version of LoadWB and offers
* Scalos uses the Workbench Screen for its windows instead opening a new one
* AppIcon, AppMenuItem, AppWindow functions are redirected to Scalos
* all Programs placed in "WBStartup" should start
* The Screen will be reopened in case of changes in ScreenMode and Palette settings
<pre>
v1.0 (V39.201) - November 1999
v1.1 (V39.212) - December 1999
v1.2b (39.220) - June 6, 2000
v1.2d (39.222) - 2000 (latest public beta executable)
v1.3 (40.7) (beta) - August 2, 2001
v1.3 (40.22) - September 25, 2002
v1.4 (40.32) (beta) March 31, 2005
v1.6 (41.4) - March 27, 2007
v1.7 (41.5) - August 12, 2007
v1.8 (41.6) - March 12, 2009
v1.9 (41.7) (beta) - March 15, 2010
v1.9 (41.8) (RC1) - August 25, 2012 open source
v1.9.2 (41.10) Deadwoods' AROS late 2022 32bit and 64bit build unifying the code base of ` for AROS x86 ABIv0, AROS x86_64 ABIv11 and AROS m68k
</pre>
Distros may have Scalos files under SYS:System/Scalos or Extras:Scalos. Known [https://github.com/deadwood2/AROS/issues/75 bug list],
Certain files like Menu13.prefs, Palette13.prefs, Pattern.prefs and scalos.prefs need to be in SYS:Prefs/Env-Archive/Scalos they can be found in Scalos:Storage/envarc and country drawer
or run the "Scalos Menu" preferences program. Note if already setup with sub-menu entries and then re-save your menu prefs as it will now generate a new/overwrite prefs file called "Menu13.prefs" in "envarc:scalos/". The same is also required for the new Palette prefs update, click 'Save' and a "Palette13.prefs" file will be saved in to "envarc:scalos/" directory.
<pre>
ASSIGN Scalos: SYS:xxx/xxx DEFER
ASSIGN Libs: Scalos:Libs add
;ASSIGN SYS:Devs/Datatypes Scalos:Devs/Datatypes add
Assign Theme: Scalos:Themes/Default_Theme add
Assign Locale: Scalos:Locale add
Protect Scalos:Tools/browse.script s add quiet
Protect Scalos:Tools/OpenShell s add quiet
Protect Scalos:Tools/run.script s add quiet
run Scalos:Tools/LoadWB
;Scalos:Scalos
</pre>
Add the above to SYS:S/startup-sequence or SYS:S/user-startup '''before any Wanderer entries'''
In the prefs drawer (folder) is the big prefs app Scalos_Prefs which covers these user setup areas
<pre>
About Scalos
Paths - should be preset
Startup - WBStartup drawer contents should auto run on each startup
Desktop - edit titlebar, icon layout and in misc, auto leave-out (drag icon to desktop)
Icons -
Drag and Drop -
Windows -
Text Windows - in misc, drawer sorting at start of listing if needed
TrueType Fonts - use Truetype fonts rather than system ones
Miscellaneous -
Plugins - after adding oop/title_clock.plugin %ti %da does not work, maybe needs ASCII .prefs added
Modules - ??
Menu - setup for MainMenu and PopupsMenu with New Menu, RE Name, Key: shortcut, Command Properties
FileTypes - already added def_Project icons and def_Disk (hdd sdd cd dvd etc) support
PopupMenu - tweak how popups appear
Pattern - Wallpaper backgrounds with Type DE, each pattern in the list can be edited, Save as Pattern.pre
Palette - change the color of things , Save as Palette.pre
</pre>
Scalos_Prefs - Pattern - Minimum options to be changed are
*DE Desktop/Background
*SC Screen
*TW Window/TextBackground ie Text listing showing if icon type not recognised
*IW Window/Background ie Icons showing
Workflow - In "Pattern List" tab, select New - choose a picture, highlight in list, click in number box under New button and slide to another number, click on "Defaults" tab and adjust Pattern numbers slider to choose right picture for each of the above options - Click "Pattern List" tab to check eveything is OK and click Save
Pattern List tab on Patterns Page - Allows you to compile a list of pictures (one at a time rather than a whole folder e.g. with #? or *.*), assigning a number Nr to one or more of them for easy reference. Using this number you will be able to assign the pictures to specific windows on the Defaults tab Page. If multiple pictures have the same number, one of the pictures will be chosen randomly. This will allow you to have random desktop pictures, random window backdrops etc.
Defaults tab on Patterns Page - Here you can set the defaults for the background pictures for the Desktop, Screen, Window and/or Text Mode throughout Scalos.
Randomize every time [check box] - Usually Pictures with the same number will be randomly selected as soon as the configuration loads. If this option is set, the picture will be selected as soon as a window with the same number assignment is opened.
*Fit size: The picture will be resized to the dimension of the new window.You *MUST* have set GUIGfx on. asyncron layout: Pictures will be loaded and rendered while the windows opens (Like original Workbench). If this function is 'off', pictures will always be loaded before opening the windows.
*Use friendbitmap : The picture is present twice in memory for best speed. This option has no effect if V43 picture.datatype or GUIGfx are used. Always relayout: If "Fit size" is set, the picture will be scaled everytime the window's dimensions change.
*Randomize everytime: Usually Pictures with the same number will be randomly selected as soon as the If more pictures have the same number, one of them will be chosen randomly.
Patternlist New/Delete : Add a new picture. After that you should assign a number to it. The picture will be rendered as tiles. configuration loads. If this option is set, the picture
Asyncron-Task priority: You can set the CPU priority for the Task if "asyncron layout" is set.
<pre>
Desktop: Number of the Picture for the main window.
Screen: Number of the picture for the Scalos-Screen.
Window: Number of the picture for the Scalos-windows.
TextMode: Number of the picture for the Scalos-windows in Text Mode.
</pre>
Popup Menu preferences fully configurable menus (includes ToolsDaemon and ParM launch apps import), including support for context-sensitive Popup menus configs for top pull down menus for apps, etc.
Workflow - Scalos_Prefs then Menu, New Item, New Command add name at top then in Command Properties e.g. add Workbench and location e.g. DOpus:DOpus4 for apps Command for c apps or Rexx for scripts or Plugin for or AmigaDos for modules
<pre>
DESCRIPTION NAME/A This is the title that is displayed in the top line of any popup menu
INCLUDE NAME/A Name of file to be included. Path can be relative to "Scalos:FileTypes"
POPUPMENU Starts the popup menu description section for this filetype.
</pre>
The following Subcommands are allowed inside popup menus:
<pre>
SUBMENU "NAME/A"
ENDSUBMENU
MENUENTRY "NAME/A,KEY/K,DEFAULTACTION/S"
ENDMENUENTRY
INTERNALCMD "NAME/A"
WBCMD "NAME/A,STACK/K/N,WBARGS/S,PRI=PRIORITY/K/N"
AREXXCMD "NAME/A,STACK/K/N,WBARGS/S,P=PRIORITY/K/N"
CLICMD "NAME/A,STACK/K/N,WBARGS/S,P=PRIORITY/K/N"
ICONWINDOWCMD "NAME/A"
PLUGINCMD
MENUSEPARATOR
ENDPOPUPMENU
TOOLTIP
ENDTOOLTIP
</pre>
<pre>
Starts the tooltip description section for this filetype. The following Subcommands are allowed inside popup menus:
GROUP "ORIENTATION/K"
ENDGROUP
MEMBER "HIDE/K"
ENDMEMBER
HBAR
STRING "ID/K,TEXT/K,SRC/K,TEXTPEN/K,HALIGN/K,STYLE/K,FONT/K,VALIGN/K"
SPACE "SIZE/N/A"
DTIMAGE "FILENAME/A"
</pre>
Each theme drawer (folder) has these further folders
<pre>
About -
Desktop -
FileTrans -
FileType -
Icons -
Menu -
Modules -
PointerIcons -
Prefs -
Sound -
Window -
</pre>
*Plugins
<pre>
devicefilter.plugin
persist.plugin should a crash or reboot occur - next time Scalos started, all windows re-opened
title_clock.plugin add digital clock to title see more below
title_envvar.plugin %ev, which can be used to display the value (a string) of the variable in the titlebar
title_freepens.plugin
volumegauge.plugin
wb39.plugin
wbrexx.plugin plugin adds a Workbench 3.5+ compatible AREXX interface to Scalos internals
xtwindows.plugin left or right ALT or left or right SHIFT keys when open/close windows
filetype.plugin then run FileTypes-prefs and customize the filetypes (eg import from a DefIcons-brainfile)
menu.plugin
</pre>
*Modules - delete, empty_trashcan, execute, find, format_disk, information, iconproperties, newdrawer, reboot, rename, systeminfo, windowproperties
*Tools - scripts like LoadWB, quit.rexx, open_volume.rexx,
In Scalos_Prefs->Filetype->Recognition you can define the filetypes and on "Action" you define specific context menu for all filetypes defined in recognition (similar to magellan)
there is the same you must show all first (list is only limited) so you created a file type AAABBB, you need to have def_AAABBB icon
Associating files with "Scalos_FileTypes" is very simple, practically it is very similar to Dopus4, first you create the Def_icons to assign to the file type (will be seen automatically ), then run "Scalos_FileTypes" you add the extension, fill in the descriptor (MATCH or PATTERN etc..) and save
then you create an appropriate entry in the list and rename it, if def icon exists it is shown. Below you can define how files are identified. Use "pattern", similar to magellan to identify file by ending. Then you click on the shown icon and define in it what program is used when you double-klick on it and save it. On the tab action you can define popup menu for it.
defined all archive types from XAD in "filetypes". If you change to "action" and click on "archive" you can define the context menu that is shown if you do not define a specific context menu for a filetype
Reset to Default in Scalos_Prefs resets all settings so '''BEWARE'''
<pre>
The Scalos desktop screen titlebar may be configured using the main Scalos Preference program. This oop/time_clock plugin adds some additional placeholders:
%ti, displays the current time in the default Locale format. e.g. "10:43:37"
%da, displays the date in the default Locale format. e.g. "Saturday 14 July 2001"
Using the supplied prefs program for the plugin, or editing the ASCII file ENVARC:Scalos/title_clock.prefs you can use the following standard Amiga Locale values to change the formatting
%a - abbreviated weekday name
%A - weekday name
%b - abbreviated month name
%B - month name
%c - same as "%a %b %d %H:%M:%S %Y"
%C - same as "%a %b %e %T %Z %Y"
%d - day number with leading 0s
%D - same as "%m/%d/%y"
%e - day number with leading spaces
%h - abbreviated month name
%H - hour using 24-hour style with leading 0s
%I - hour using 12-hour style with leading 0s
%j - julian date
%m - month number with leading 0s
%M - the number of minutes with leading 0s
%n - insert a linefeed
%p - AM or PM strings
%q - hour using 24-hour style
%Q - hour using 12-hour style
%r - same as "%I:%M:%S %p"
%R - same as "%H:%M"
%S - number of seconds with leadings 0s
%t - insert a tab character
%T - same as "%H:%M:%S"
%U - week number, taking Sunday as first day of week
%w - weekday number
%W - week number, taking Monday as first day of week
%x - same as "%m/%d/%y"
%X - same as "%H:%M:%S"
%y - year using two digits with leading 0s
%Y - year using four digits with leading 0s
like %d %m %y or %a %d %B %Y %p
</pre>
Shutdown -> right mouse button Scalos, About, Reboot, Shutdown
ToolTypes can be added to the Scalos.info icon like
*SCALOS_PATTERNNO=<number> : background image matching the number
*SCALOS_NOTEXT : The Icon will be drawn without Text.
*SCALOS_NODRAG : The Icon will not be draggable. Its position will be fixed.
*Module iconproperties - Added SCALOS_BROWSERMODE tooltype support
runcommand parameters... in which case:
<pre>
%p = parameters
%w = directory path
%d = device-name
%% = literal percentage token
</pre>
With the help of the wbrexx.plugin Scalos gains support for more of the compatible arexx API
If an arexx command produces an error you will find the error code placed in the WORKBENCH.LASTERROR variable.
ACTIVATEWINDOW
<pre>
/* Activate the root window */
ADDRESS workbench
ACTIVATEWINDOW root
/* Activate the "Work:" partition's window if already open*/
ACTIVATEWINDOW "Work:"
</pre>
CHANGEWINDOW
<pre>
/* Change the root window; move it to position 10,30. * and change its size to 200100 pixels */
ADDRESS workbench
CHANGEWINDOW root LEFTEDGE 10 TOPEDGE 30 WIDTH 200 HEIGHT 100
/* Change the currently active window */
CHANGEWINDOW active 20 40 200 100
</pre>
Most of Scalos' issue are due to the flexibility of its' user configuring nature but if
The sort menu plugin needs to be ported from ASM to C.
IIRC Scalos has a command line option to fully replace Workbench/Wanderer.
The Theme: assign is used by both Wanderer and Scalos but I didn't have any problems using both at the same time.
The Program will be started from the Shell.
If "WB Args" is set, with the Argument "%p" will be replaced by the path of the activated Icons. The Program will started with the specified Stack value.
IconWindow: Scalos opens the window of the specified path.
PlugIn: Starts a Scalos Menu-PlugIn.
If a Menu Item with empty name is specified, Scalos displays a separator line.
It's possible to Drag&Drop an Icon in the Configuration Window. All values will be set accordingly. Entries may be dragged across the list.
Mac-like selection : This function activates a multiselection method used on MacOS or Win95. Don't have to hold down shift to drag them. Clicking on an already activated icon will
not deselect all other icons.
MMB move: The window contents may be moved using the middle mouse button.
WindowPopup title only: PopupMenu for windows can be opened only on window's title bars.
FullBench: Screen-Titles removed and Main Window set Full Size.
Scalos Prefs. Go to Settings->Scalos->Prefs and then the Misc section. Remove the tick against Full Bench. If you've enabled it, the titlebar will disappear when you select backdrop.
Default Icons saveable : The icons which Scalos generates if "show all files" is enabled, can now be saved
using "snapshot" menu option. load DefDisk first : Try to read the icons first from the DefIcons Path before using disk info.
Hide hidden files : If this function is activated all files or directories where the "hide" flag is set will not be shown.
Many of my Icons display more than once on the screen, while on the workbench all seems ok.
The Workbench filters double displayed icons, Scalos does not. Solution: please edit the ".backdrop" file and clear double lines.
Background images not scaled. GUIGfx option not set or guigfx.library and/or render.library not installed.
If working with CD's causes crashs or Scalos doesn't work correctly.
Most Filesystems doesn't support the ExAll function correctly. Disable "Use ExAll" in Scalos prefs.
Scalos doesn't start any program in the WBStartup. WBStartup Path may be set wrongly or Scalos was not started in Emulation Mode (LoadWB etc)
Some programs will not startup with error message "has not returned, wait some more"? and "unable to open your tool"
need a def_icon with the same name predefined, then create an appropriate entry in the list and rename it, if def icon exists it is shown. Below this can define how files are identified.
* either "pattern", similar to magellan to identify file by ending
* or
Then click on the shown icon and define in it what program is used when you double-click on it and save it. On the tab action you can define popup menu for it. All in all handling is of course different to magellan but can do similar
For the RAM Icon, to obtain this you have only to copy the icon in the Icon Path as "RAM.info" or "Ram Disk.info". All functions will automatically be performed
sometimes cut into half or quarters when scrolled off screen or drawers moved - settings issue probably
Sometimes leaves initial drawer window imprint on desktop when moved - settings issue
Scalos AROS released a [https://github.com/deadwood2/contrib/tree/master/scalos new build V2022-07-21] with the following changes noted:
<pre>
Fixed:
Numerous crashes when working on 64-bit with 64-bit heap
Wrong background color of Scalos logo on Scalos splash window
Backgroung image of Scalos splash window and Scalos About window is not visible
Icon labels on desktop and in drawer windows are displayed using Topaz instead of Arial font
Font.prefs are not being loaded on 64-bit
Font.prefs are being wrongly saved on 64-bit
scalos.prefs are not being loaded on x86 and x86_64, scalos is using always default preference
scalos.prefs are being saved on x86 and x86_64 in format not compatible with m68k
NewPopupmenu.prefs is wrongly written
Plugins are not loading at Scalos startup
wbrexx.plugin is crashing at startup on 64-bit
Multiple controls missing on Scalos Prefs/Icons page
System crash when clicking on def icon image on FileTypes Prefs/Recognition page
Status bar, control bar, buttons sometimes don't have images displayed
Buttons in Scalos About window have white corners rendered where they should be transparent
Crash when leaving out an icon
Crash when adding a User-defined Button to Control bar without setting it's properties in Scalos Prefs
Crash when removing any button from Control bar in Scalos Prefs
Scalos Prefs allows editing TTEngine font properties when TTEngine is not present causing crash in Icons/Labels and Text Windows/Fonts pages
deficons.prefs are not being loaded on x86 and x86_64
Reset to default in FileType Prefs and Save does not save preferences
Won't fix:
Scrollbars visible on titles of TrueType Fonts, PopupMenu, Menu, FileTypes, Pallette and Pattern pages of Scalos Preferences
Not fixed:
Wrong rendering on DualPNG icons
Refreshing drawer windows is slow
Starting Prefs/Locale or Prefs/Input from Scalos causes other preferences to fail
Desktop wallpaper is damaged where Splay window was displayed
When started from Wanderer, after saving Scalos Prefs, reload does not re-open main Scalos window
Difference in behavior between Cleanup from popup menu and Cleanup from top menu - possibly due to missing plugin, check Cleanup association in Menu Prefs
</pre>
===DOpus 4 Directory Opus===
Copy DOpus4 app to WBStartup directory folder so it starts on boot up each time
Another method is add the below to the bottom of the user-startup script in SYS:S drawer/directory
<pre>
run DOPUS:DirectoryOpus -i >NIL
</pre>
makes DOpus starts up in Iconified state at the top of Wanderer's screen. Left click on this to highlight and right mouse click to open.
Just click on the sides of either outer edges of DOpus windows and it will display the parent device/volume list.
DOpus4 saves it features in a PROGDIR:s/DirectoryOpus.CFG file which can be edited to suit anyones' needs, '''C''' bottom right button in DOpus4 and by reading the [https://arosarchives.os4depot.net/index.php?function=browse&cat=utility/filetool Dopus4 guide Manual and Arexx calls].
*[https://www.youtube.com/watch?v=DCyXDs8baSE Pt1 Introduction]
*[https://www.youtube.com/watch?v=7fiVmopiK9I Pt2 Dopus Config]
*[]
*[]
*Button little rectangle with name inside
*Bank vertical stack of buttons
Buttons
*Workbench app {f} i.e. first use {F} for all selected items with app
*AmigaDos c type apps with arguments after
*Arexx
*Command c type apps with no arguments after
Flags (most used)
*CD Destination to extract etc
*Do all files
*Output window
*Run asynchronously
*Workbench to front
*Buffer above 100000 for 64bit
Filetypes
Defines how certain files are handled like '''default tool'''
Screen
Fonts, set each element to any font
Screenmode, Workbench Use (same screen like Windows), Workbench clone (like Linux workspaces)
System
Shell startup, set to SYS:s/shell-startup
===BoingIconBar===
User chooses the apps to add to the dock at the centre bottom of the screen but has to be done manually, please use Save afterwards
Or easier edit the text file of SYS:Prefs/Env-Archive/iconbar.prefs and save
<pre>
BOING_PREFS
;Tools
SYS:System/Shell
SYS:Tools/DOpus4/DOpus4
SYS:Utilities/Editor
SYS:System/SysMon
SYS:System/Scout
Work:Extras/Internet/OWB/OWB
Work:Extras/Graphics/Lunapaint
Work:Extras/Graphics/ZunePaint
AROS:Tools/MPlayer/MPlayer
Extras:Internet/AmiFox/AmiFox
RAM Disk:Amelinium/Amelinium
</pre>
right mouse click on bottom edge of screen where boingiconbar shows - select settings which opens BoingIconBar Preferences to add apps
If no dock showing Add, to add apps click Add Program and search for the executable
another method is to drag icons to ends of the bar and move them on the Bar using the Prefs/BoingIconBar
===AmiStart===
On 32bit PCs only - auto generates the apps menu but scans the drive each time - AmiStart can choose apps you are not interested
* how to disable annoying zune/mui 'bubbles'?
try a right-click on AmiStart and release on Global settings. Then click on the bubbles gadget. Move the Show Bubbles slider all the way to the left.
===Fonts===
Install the #?.ttf files to SYS:Fonts/TrueType. Use SYS:System/FTManager to "Install Font" each #?.ttf file which will generate associated #?.otag and #?.font in SYS:Fonts. Use SYS:Prefs/Fonts to change system fonts and SYS:Prefs/Zune to change others.
To achieve our goal we will use the Setup Locale, Input, Zune and Fonts, as well as The FTManager.
Begin
The first step you should do is to get the system to know that we speak and write in another language. What you need to do is to open the setup program and choose Locale country, and list "preferred languages" to put it first and then English. If you want the tab "Time Zone" and select city of residence to set the clock correctly. Of course we save our changes and continue opening the setup program Input. This sets the keyboard language as our beginning. When the language layout was created there was no option to switch to Aros keyboard (layout switching), so to write in the language you had to hold down Alt, something you encounter in other functions. This time working with the team of Aros to create a new keyboard layout to replace the old so we can get rid of the button Alt. For now though let only selected this layout and do not turn the switch on the keyboard.
Custom Keyboard Layout
[http://repo.or.cz/w/AROS.git/tree/HEAD:/workbench/devs/keymaps keymaps are in place but unfortunately when they are not, then indeed things become a bit 'low-level' as it involves redefining some tables with values that match your keyboards]
only need to add your compiled table as new keymap.
So taking a little peek here shows that it should be possible to compile using
gcc -opc105_tr pc_105.c -nostdlib
where the pc105_gr/pc_105.c needs to be replaced with your own adjusted keymapname/c-file
[https://en.wikiversity.org/wiki/Enabling_Greek_Characters_on_Your_Keyboard General overview of Greek letters on keyboards]
Installing fonts
*[http://aminet.net/package/util/wb/EPAGrWb System jaggy]
*Outline resizable .font .otag
In this step you need to download some fonts that can support the encoding in our system. The easiest way is to run the script "Download Fonts" you'll find in the folder OWB. This script downloads from the Internet, and unpacks some fonts for OWB web browser, which is placed under the folder Fonts:TrueType. But as these can only be used by OWB and not the system, which unfortunately does not see. To make them available to the rest of the system, open the program FTManager, you will find the folder AROS: System /. From there select the field "Codepage" option "ISO-8859-7" and list the font "Arial" and "Regular" form in which you must double-click with the mouse. In the window that appears, select the bottom right the checkbox "Anti-aliasing" button and then "Install". Immediately folder Fonts: created files "arialregular.font" and "arialregular.otag", which are necessary in order to see the system font. Do the same steps if you wish for other fonts.
Final stages
After completing the above, open the folder AROS: Prefs / and run the program settings Fonts. In the new window, select the fields "Icons" and "Screen" as the font "ArialRegular" to the size you want. In the field "System" to give "s_courier", which, however, because it is not True Type Font support Antialising, and may seem a little broken. You can also use the CourierNew, if you have installed the above procedure. After you save the changes and open the Zune program settings. In this set the "ArialRegular" font fields in tabs "Windows" and "Groups", and save the changes. Reboot the system. To make sure that the above worked properly run NoWinED, which you will find under the folder AROS: Tools /. If that everything is working correctly you will see the menu and the settings window with Greek letters. You can also write in the language using the button Alt. Second program that you can try, which is fully localized, is WookieChat, which you will find in the folder AROS: Extras / Networking. And in this place all the menu and settings window works.
===Windows===
*Intuition
The window you position and resize, you right click on that windows title bar and in the dropdown menu you snapshot from there. Right click to show menu -> Window -> Snapshot Windows or All but it will NOT work if that folder has no icon (e.g. Disk.nfo) attached to it. You need a folder icon. The window information gets saved in it.
As for maximising the window using a shortcut key - Alt and up arrow key
The AROS-Shell windows can be moved, resized by editing sys:s/startup-sequence
<pre>
; run shell
run QUIET c:newshell >NIL:
</pre>
; slimmer right aros the screen
run QUIET c:newshell con:0/150//300/ >NIL:
; top right corner scr-x scr-y win-x win-y
run QUIET c:newshell con:600/150//300/ >NIL:
*EdgeSnap
Commodity EdgeSnap allows resize and position windows on your screen by dragging them to the edges but not corners of the screen and/or other windows
EdgeSnap Prefs (once pressed Use button) lets you arrange windows but not different applications in layouts half (left or right) or full size (top) and choose to adjust the border padding
There is outline to show shape taken to aid placement and space available
*Zune - AROS version of MUI
Magic Menu type functionality is implemented in IControl preferences editor: in the frame called Menus, switch type from Pull-Down to Pop-Up and/or iControl just tick the sticky menu option.
Windows outside screens causing a problem either uncheck "Offscreen move" for windows in IControl prefs editor. Or use FKey commodity and define two key shortcuts:
* the first using the command "cycle windows" (for example ALT TAB);
* the second using the command "rescue window" (for example ALT F5).
Now you can cycle windows until the one you want to rescue, and then "rescue" it: it will move back inside your screen.
How to save the window size on wanderer (snapshot all, snapshot windows)
Same for icon position on wanderer, can't save the position. Icon position cannot be saved yet, but you should be able to save the window position and size. sys:prefs - wanderer icon has option to save window size on exit but just for dh0. To get saving working on (DH1: Extras:) partitions try deleting the dh1 disk.info file, then reboot. The system should create a new dh1 icon.
* how to set up permanently 'view all files'?
As for viewing all files, removing disk.info for that disk did the job
* how to list and kill processes (xkill would be useful) ?
sys:Extras/System/Scout can kill apps
sys:Tools/Commodities/Exchange can remove available commodities
* how to restore 'go up' button in wanderer window? (it doesn't show up anymore).
If you're using Icaros, go to the theme prefs and make sure that decoration is checked. Also, some themes do not use a parent button, so try another theme. You may have to restart Aros before the theme will change.
* Is it really safe to turn off (hardware button) computer at any time (worried about USB hard disk)
yes you can turn off the computer IF none of the drives are in progress (i.e. writing). Best to use Wanderer menu option Quit otherwise
===Say narrator===
Say "Hello World" for a simple robotic voice
SPEAK: is a write-only DOS device for text-to-speech abbreviated as tts.
To check if available, type assign into the shell and at the bottom in the Devices: section should be SPEAK
Examples of use
<pre>
Copy S:Startup-Sequence SPEAK:
Echo "Hello" >SPEAK:M/R/S150/P110
Echo "DH1 EH0 L OW1" >SPEAK:A1
</pre>
Classic options are M/F, R/N, S<rate>, P<pitch>, O0/O1, A0/A1, and D0/D1. O1 recognizes lines beginning with OPT/ as option changes. A1 treats input as narrator phonemes.
Long options select a speech engine:
Echo "Hello" >SPEAK:ENGINE=narrator/VOICE=female/STYLE=natural/LANGUAGE=en-US
Supported selectors are ENGINE=, VOICE=, STYLE=, and LANGUAGE=. Values are case-sensitive backend identifiers. ENGINE=DEFAULT selects the system default. Narrator-compatible selectors continue through the classic translator/narrator pair. Other engines use speech.device. Direct phonemes require a narrator-compatible selection.
===Printing===
This needs further [http://www.aminet.net/package/docs/help/PrinterGuide drivers written], we have postscript and write to file support only
;There are no individual drivers yet for HP's Photosmart, EPSON's EPL, CANON's, Lexmark, CUPS PPD, etc.
*Postscript
Best to set Printer Prefs in the Prefs drawer to print-to-file or parallel/USB port
Save document in postscript or convert picture/text to postscript
Print using compatible Postscript printer
*printer is simply not accepting IPP connections at the moment.
Please try the following steps:
Open the printer web interface in a browser:
http://192.168.1.x/
Look for the network or protocol settings.
Enable IPP / Internet Printing Protocol.
Make sure TCP port 631 is open/enabled.
Save the settings and reboot the printer if the web interface asks for it.
ipp://192.168.1.xx:631/ipp/print
ipp://192.168.1.xxx:631/ipp/
===Files===
====File endings and datatypes====
* Check if the file has his own .info icon file with a tool set to open it. IIRC this has higher priority over the def_XYZ.info file association.
* In ENVARC:SYS/def_Text.info or whatever def_ file needs changing, use Wanderer's menu Icon -> Information and change the def_XYZ.info there. If you're on ABIv0 and want it to be applied immediately, you might have to copy it to ENV:SYS/ (or to reboot).
* Identifying file types by file ending is only a fallback. Far better it is to search for magic words, for flac files this would be "flaC" according to this [http://flac.sourceforge.net/documentation_format_overview.html documentation].
For instance, to open PDFs with arospdf not localised in the default drawer of Icaros (Work:Extras/Applications/arospdf) but localised in a custom drawer in AROS. The default tools are defined in the icons in sys:prefs/env-archive/sys e.g. def_PDF.
File type identification is done by datatype descriptors which you can find in Devs/Datatypes. The AROS build system has a tool which creates such datatype descriptors.
'''Changing of default tools of existing icons is easy as shown above. Adding of new file types is not hard, but needs knowledge of the AROS build system.'''
The enduser way would be to download the attached file, which contained two executables:
1) createdtdesc, to make a new datatype description
2) examinedtdesc, to read/show existing datatype descriptions
use 2 to get an idea on how it things are currently done in aros by providing this executable a file from the drawer sys:devs/datatypes/ (alternatively you can find the original .dtd files here).
use 1 to make your new datatype. Use the accompanied FORMAT file (also here) to read how to make your own datatype descriptor. use 2 to get hints from other datatype descriptors.
Note:
When creating a new descriptor would advise against using the pattern property, but instead use the default pattern of #? and create a Mask that matches your filetype. This requires some research in order to discover how your filetype can be recognized properly. Of course with making something like a descriptor for an ascii textfile, you would fallback to using the pattern (e.g. #?.text as the filetype cannot be determined easily otherwise).
<pre >
# name - choose wisely and informative. also used for icon's name.
# version - choose as you like as long as it complies with version rules
# basename - the 'root' datatype class. be aware that e.g. it can influence behaviour. for example when choosing binary and using tool multiview in project icon, the file will be viewed as binary file (choosing sound would tell mulitview to view the file as a soundfile). So this can influence the underlying tool being used. Could become messy if users started to modify the tool manually.
# pattern - This is the file pattern match e.g. #?.text
# Mask - A mask to identify the file. Requires knowledge of the actual file structure. For example 'M' 'Z' for an msdos executable.
# GroupdID - not supported (AROS native) files - use syst as that would be the least intrusive in case an AROS tool/program tries to load such datatyped file.
# ID - In your case, the first four characters of the name at subchapter 1 (in lower case) (or less if name is shorter).
# flags - How the mask needs to be interpreted. In your case would be mostly DTF_BINARY in combination with (wanted or not) DTF_CASE (to tell if mask used letters are case sensitive or not)
# priority - the priority of how the type is handled so that on datatype could have precedence over another? In any case, document tells it to be mostly 0.
</pre >
Now that you know each field and what it does (more or less), you write this fields in a text file for your own invented datatype, save it and create the actual dt with the tool in 1. in the end the created dt must reside in sys:devs/datatypes/ drawer.
Then you would create a default icon in sys:prefs/Env-archive/SYS drawer. Don't forget to reboot or copy .info file to ram:env/sys in order to test. also don't forget to set which tool to start f.e. c:lx or dh4:emulators/mycoolemulator
To test, open Wanderer then show all files and doubleclick on a file of type you just created. Alternatively you could use the 'open' command from shell (with file of datatype you just created as parameter).
And as a last note. it would perhaps be welcome to have a program like xicon and/or runprglist for AROS (unfortunately both without source, but something similar could be created for AROS).
Sounds complicated ?
Perhaps... but OS like windows needs a complete registry to be able to do things like this. And yes, i am aware windows has gui tools that does it (more or less) for you (by manipulating the registry). Same could be done for AROS (without integrating a registry in AROS that is ).
Would that suffice ?
red1+2: typos, reformatting.
disclaimer: please note that using these tools can screw up your currently installed support for datatypes when used incorrectly. Do not use if you do not understand what you are doing. Use at own risk.
==Network Connection==
AROS currently only has one real choice for TCP/IP networking - AROSTCP. This is a port of the AmiTCP package from AmigaOS (TM), with a number of enhancements/fixes from AROS developers.
===Wired===
Use Network Prefs to setup
=====IPv6=====
Some support
128bit IPv6 address packet
<pre>
Local FD::/8
Global 2000::/3
64:ff9b::/96
</pre>
NAT64 translates IPv6 to IPv4
DNS64
OS routing works with
<pre>
MacOS Ventura
Windows 11 with cloud account
Ubuntu Jammy Jellyfish
Android 10 (block google dns)
</pre>
====IPv4====
The top half of the IPv4 Configuration tab on the Network Prefs deals with the network card/USB and the lower half the router part.
[[File:AROS Wanderer Network Prefs DHCP.png|thumb|DHCP Settings]]
'''Upper part of IPv4 tab'''
* Click Add on the top right of the Prefs which opens a window called '''Interface'''
* Enter Name as net0 (but can be anything as long as it is consistently used in other sections)
* check mark on Active
* select device to be used using the '''right hand-side gadget''' of the box where the device name will go
* set Unit to 0
* IP Mode is default set to '''Get address from DHCP'''
* IP Mode set to Manual if DHCP does not work automatically
From the shell CLI, ifconfig -a
Under net0: section, inet starting 192.168.x.xxx
* inet or '''Address''' of network card
* netmask convert to decimal so 0x'''ffffff7f''' becomes 255.255.255.247 which is used to adjust the above '''Address''' into
* broadcast 192.168.xxx.xxx
click OK
[[File:AROS Wanderer Network Prefs Manual.png|thumb|Manual Settings]]
'''Lower part of IPv4 tab'''
* IP Mode Get address from DHCP (default)
* or changing to Manual if automatic DHCP set up does not work
* '''Gateway''' (Router Internal LAN-IP) (Default Route) = 192.168.0.1 (D-Link Netgear), 192.168.1.1 (Linksys 3com), 192.168.2.1 (SMC Microsoft), 192.168.1.254 (Belkin), 192.168.123.254 (USRobotics) else check with your router manual
* first DNS = use 208.67.222.222 (opendns) or Gateway number above (to test web browser access to router) or 212.50.160.100 (google) i.e. or whatever your ISP needs you to set
* second DNS = use 208.67.220.220 (opendns) or Gateway number above (to test web browser access to router) or 213.249.130.100 (google) i.e. or whatever your ISP needs you to set
* At the bottom of IPv4 tab, check mark the '''Start networking during system boot''' option
* Save and reboot (sometimes Network restart fails, so reboot every time to be sure)
'''an alternative way''' to AROS ifconfig -a, other OSs have similar for the same internet connection. Another connection will have different settings.
e.g. From [http://www.ncsu.edu/resnet/windows/ipconfig/ Windows], '''ipconfig /all'''
and note down the IP, subnet mask, default gateway, and DNS servers values and put these values in "manually" into AROS Network prefs.
e.g. From Linux via dhcp router have a look at etc./dhcpc/dhcpcd-eth0.info
* for manual input look at /etc/networks (IP or Gateway) and /etc/resolv.conf (DNS)
Please note that all in one routers (wired+wireless) or separate routers may need different settings
IPv4 involves routing (192,168.x.x), firewall, NAT
===Wireless===
You may have a Wifi Prefs to use for wireless setup
[[File:MyArosWirelessSetup.png|thumb|Setting up]]
[[File:MyArosWirelessTCP.png|thumb|Shell commands to work out what is happening]]
We must first make certain you have a Atheros 5k chip inside acting as the wireless wifi option. Open PCITool in Tools directory. Down left hand side are a series of numbers 0.00.0 etc. Click on some at the bottom and hopefully one of them will say Atheros AR5??? or AR242?.
or a Realtek RTL8187B, we can check using Prefs/Trident as this one is USB based
There are many similarities with the above Wired set up so please read the above section as well
* open Network/Prefs
* In '''IPv4 Configuration''' tab - click Add - enter net0 / active tick / #?.device / Unit 0 / IP Mode = manual (important if default DHCP does not work automatically)
Make sure that any extra network names (e.g. eth1 or net1) should be deleted. If net0 already st previously, change net0 so that it shows associated with the appropriate device name like atheros5000.device or realtek8180.device. Having two entries here will cause sub-net problems.
* Go to '''Wireless''' tab and click on "Add" button.
* Insert network name (SSID your wireless network name use wirelessmanager to get it), select right "encyption" that is most likely "WPA".
* Key Type set as "Passphrase". i.e. type in your password for your router (aka access key).
* Unselect (no tick) "hidden" if it is selected, then apply. You may have to tick it if wireless does not work.
* Finally, Save and '''reboot'''.
For the best chance of success, set networking to start at boot, and then reboot with the USB adapter plugged in.
===USB Ethernet===
Open SYS:Prefs/Network and in the IPv4 Configuration tag (top table covers your usb stick)
* click Add button
* set Name as net0
* Tick Active box
* enter the usb-ethernet.device e.g. dm9601eth.device, usbpegasus.device or usbasixeth.device use SYS:c/devlist, '''Scout''' or trident prefs to get the correct spelling
* set Unit to 0 (which is usual but check the messages from the bottom of the Trident prefs whilst plugging the device in to determine the unit number otherwise)
* IP Mode is set to Get address from DHCP (make sure your router is set right for that)
'''or manual'''
* IP Address of network card, i.e. 192.168.0.xx or 192.168.1.xx (xx being greater than 1)
* Subnet netmask = 255.255.255.0
* click OK
There can be sometimes be boot failures when using USB ethernet - plug the USB device in after boot and save the network prefs to make it work again.
Lower part of IPv4 tab covers the router information
* IP Mode Get address from DHCP
'''or if manual settings'''
* Gateway (IP Address of router) = usually 192.168.0.1 or 192.168.1.1 but see router manual to make sure.
* first DNS = use 8.8.8.8, 208.67.222.222 (opendns) or 212.50.160.100
* second DNS = use 8.8.4.4, 208.67.220.220 (opendns) or 213.249.130.100
===USB Tethering via Android smartphone===
Go to AROS Network Prefs (IPv4 configuration tab) and write type in "usbrndis.device" in the "device" textfield of "Interface" sub-window, which appears when you add a new device (or modify an existing one). Select "Start Network during system boot" and saved the configuration, the Connection is immediate no reboot is needed.<br>
usbrndis.device is a resident device (virtually always there) in fact, a driver is not present in DEVS:Networks <br><br>
Plug in USB cable, go to Android settings and enable "USB Tethering" <br>
A reboot should not be necessary.
When restarting AROS, the Smartphone deactivates the connection and to access the network again have to reactivate it before starting the browser.
===Solving Issues===
[[File:MyArosTCP.png|thumb|Aros network setup diagnostics - why does it not work?]]
* In Network Preferences, have '''only one''' item in the IPv4 Configuration tab
* If using manual settings, make sure all numbers are correct, especially for IP address of the card/usb (changing the last number in chain of four)
* For any USB based networking, it is often necessary to save in Prefs/Network, reboot AROS and network support can begin
* For wired, make sure that the LAN-cable is plugged in before starting the computer
* If wireless, try getting closer to the router.
* Switch off the encryption option from your router then try wifi, if successful then your ip/dns is ok. If not then your ip/dns settings are most probably wrong or need to use one or more opendns numbers
* Replace detachable wireless antenna (best wireless option to buy if you can) with a stronger antenna ie. 5 dBi or 7 dBi
* Try with another computer/laptop/machine
Program Error C:WirelessManager
* Test with another OS
* Check that Wifi works before changeover (if possible)
* Check that socket and card are working
* Check if card is too new for laptop (date code on card MMYY blue askey date 2005-2007 etc)
Are you connecting with the Router ?
Check with protection off e.g. wps and wep to see if it makes a difference.
For USB wireless - stopping and starting may be needed...
<pre>
; $VER: AROSTCP-startnet 1.0 (01/08/06)
; AROSTCP-startnet (c) The AROS Dev Team.
;
Run <NIL: >NIL: AROSTCP
WaitForPort AROSTCP
If NOT Warn
; echo "Stack online"
Else
echo "Wait for Stack Failed"
EndIf
; stop and restart
execute "sys:system/network/AROSTCP/s/stopnet"
Run <NIL: >NIL: AROSTCP
WaitForPort AROSTCP
If NOT Warn
; echo "Stack online"
Else
echo "Wait for Stack Failed"
EndIf
run <NIL: >NIL: wirelessmanager realtek8180.device
</pre>
What IRQ number is assigned to the device? You can check with Tools/PCITool?
It's possible the BIOS hasn't set the right IRQ number. If you have a Linux CD/DVD handy, could you check if it boots with the options "acpi=off noapic nolapic"?
If the following does nothing, this will help us figure out why networking doesn't start automatically at boot
open a shell and run the following commands:
<pre>
echo ${AROSTCP/AutoRun}
echo ${AROSTCP/WirelessAutoRun}
echo ${AROSTCP/WirelessDevice}
</pre>
Please report the output, typically it will look like this
# True (explanation this variable is related to the "Start networking during system boot" checkbox in network prefs)
# True ()
# Devs:networks/atheros5000.device unit 0
If there's a problem with the AROSTCP package. What's the output of this?
ENV:sys/packages/AROSTCP
should return a string = Sys:System/Network/AROSTCP
By the way, a quicker way to check networking is working would be to run some shell commands such as:
<pre>
ping www.google.com
ifconfig net0
</pre>
The best way to list the available networks and diagnose / troubleshoot problems with connecting to a wireless network is to run WirelessManager manually. First uncheck the "Start networking during system boot" box in the Network prefs app, then save and reboot. Then run this in a shell:
C:wirelessmanager atheros5000.device verbose
or
C:wirelessmanager realtek8180.device verbose
and capture the output
If the above does not help, could you edit the file SYS:System/Network/AROSTCP/S/Package-Startup, and change ">NIL:" to ">T:wifi.log" on the WirelessManager line and add this as well Wait 5?
<pre>
if ${AROSTCP/WirelessAutoRun} eq "True"
Run QUIET "C:WirelessManager ${AROSTCP/WirelessDevice} >T:wifi.log"
wait 5
EndIf
</pre>
Then save, reboot and post the log file (T:wifi.log) here.
<pre>
c:wirelessmanager atheros5000.device verbose
Initializing interface 'atheros5000.device:0' conf 'ENV:Wireless.prefs' driver 'default' ctrl_interface 'N/A' bridge 'N/A'
Configuration file 'ENV:Wireless.prefs' -> 'ENV:Wireless.prefs'
Reading configuration file 'ENV:Wireless.prefs'
Line: 1 - start of a new network block
ssid - hexdump_ascii(len=7)
65 63 68 65 6c 6f 6e echelon
PSK (ASCII passphrase) - hexdump_ascii(len=14): [REMOVED]
key_mgmt: 0x2
PSK (from passphrase) - hexdump(len=32): [REMOVED]
Priority group 0
id=0 ssid='echelon'
Then it just sits there. Not sure what a normal dump looks like, I don't see anything that looks wrong in the configuration.
</pre>
looks like the driver isn't working with that card. Has anyone else successfully used that exact model number (AR2413)?
<pre>
Initializing interface 'atheros5000.device:0' conf 'ENV:Wireless.prefs' driver 'default' ctrl_interface 'N/A' bridge 'N/A'
Configuration file 'ENV:Wireless.prefs' -> 'ENV:Wireless.prefs'
Line: 1 - start of a new network block
ssid - hexdump_ascii(len=7):
65 63 68 65 6c 6f 6e echelon
PSK (ASCII passphrase) - hexdump_ascii(len=14): [REMOVED]
key_mgmt: 0x2
PSK (from passphrase) - hexdump(len=32): [REMOVED]
Priority group 0
id=0 ssid='echelon'
*** [wpa_sm_init] sm->pmksa=02c66fd4 ***
Own MAC address: 00:01:36:15:ae:0c
RSN: flushing PMKID list in the driver
Setting scan request: 0 sec 100000 usec
EAPOL: SUPP_PAE entering state DISCONNECTED
EAPOL: Supplicant port status: Unauthorized
EAPOL: KEY_RX entering state NO_KEY_RECEIVE
EAPOL: SUPP_BE entering state INITIALIZE
EAP: EAP entering state DISABLED
EAPOL: Supplicant port status: Unauthorized
EAPOL: Supplicant port status: Unauthorized
Added interface atheros5000.device:0
State: DISCONNECTED -> SCANNING
Started AP scan for wildcard SSID
MLME: starting scan
MLME: scan channel 1 (2412 MHz)
sana2: sending MLME frame
Then it stops. Does this mean the router is not authorizing this NIC?
IRQ 4 (A)
</pre>
apparently locking up when the first frame is sent (a scan request).
<pre>
Devs/Networks/atheros5000.device:0
Initializing interface 'Devs/Networks/atheros5000.device:0' conf 'ENV:Wireless.prefs' driver 'default' ctrl_interface 'N/A' bridge 'N/A'
Configuration file 'ENV:Wireless.prefs' -> 'ENV:Wireless.prefs'
Reading configuration file 'ENV:Wireless.prefs'
Line: 1 - start of a new network block
ssid - hexdump_ascii(len=12):
41 69 72 4c 69 6e 6b 35 39 33 30 30 AirLink59300
PSK (ASCII passphrase) - hexdump_ascii(len=8): [REMOVED]
key_mgmt: 0x2
PSK (from passphrase) - hexdump(len=32): [REMOVED]
Priority group 0
id=0 ssid='AirLink59300'
*** [wpa_sm_init] sm->pmksa=0224e444 ***
Own MAC address: 00:1f:e1:42:e3:7a
RSN: flushing PMKID list in the driver
Setting scan request: 0 sec 100000 usec
[eloop_reg_timeout] Timeout is at 1317686594.160000
EAPOL: SUPP_PAE entering state DISCONNECTED
EAPOL: Supplicant port status: Unauthorized
EAPOL: KEY_RX entering state NO_KEY_RECEIVE
EAPOL: SUPP_BE entering state INITIALIZE
EAP: EAP entering state DISABLED
EAPOL: Supplicant port status: Unauthorized
EAPOL: Supplicant port status: Unauthorized
[eloop_reg_timeout] Timeout is at 1317686595.060000
[eloop_reg_timeout] Timeout is at 1317686604.060000
Added interface Devs/Networks/atheros5000.device:0
[eloop_run] Starting
State: DISCONNECTED -> SCANNING
Starting AP scan for wildcard SSID
MLME: starting scan
[eloop_reg_timeout] Timeout is at 1317686594.160001
MLME: scan channel 1 (2412 MHz)
[eloop_reg_timeout] Timeout is at 1317686594.193000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686594.233000
MLME: scan channel 2 (2417 MHz)
[eloop_reg_timeout] Timeout is at 1317686594.253000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686594.293000
MLME: scan channel 3 (2422 MHz)
[eloop_reg_timeout] Timeout is at 1317686594.333000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686594.373000
MLME: scan channel 4 (2427 MHz)
[eloop_reg_timeout] Timeout is at 1317686594.393000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686594.433000
MLME: scan channel 5 (2432 MHz)
[eloop_reg_timeout] Timeout is at 1317686594.473000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686594.513000
MLME: scan channel 6 (2437 MHz)
[eloop_reg_timeout] Timeout is at 1317686594.553000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686594.573000
MLME: scan channel 7 (2442 MHz)
[eloop_reg_timeout] Timeout is at 1317686594.613000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686594.653000
MLME: scan channel 8 (2447 MHz)
[eloop_reg_timeout] Timeout is at 1317686594.693000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686594.713000
MLME: scan channel 9 (2452 MHz)
[eloop_reg_timeout] Timeout is at 1317686594.753000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686594.793000
MLME: scan channel 10 (2457 MHz)
[eloop_reg_timeout] Timeout is at 1317686594.833000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686594.853000
MLME: scan channel 11 (2462 MHz)
[eloop_reg_timeout] Timeout is at 1317686594.893000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686594.933000
MLME: scan channel 12 (2467 MHz)
[eloop_reg_timeout] Timeout is at 1317686594.973000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686595.013000
MLME: scan channel 13 (2472 MHz)
[eloop_reg_timeout] Timeout is at 1317686595.033000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686595.073000
EAPOL: disable timer tick
EAPOL: Supplicant port status: Unauthorized
MLME: scan channel 14 (2484 MHz)
[eloop_reg_timeout] Timeout is at 1317686595.113000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686595.153000
MLME: scan channel 1 (2412 MHz)
[eloop_reg_timeout] Timeout is at 1317686595.193000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686595.213000
MLME: scan channel 2 (2417 MHz)
[eloop_reg_timeout] Timeout is at 1317686595.253000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686595.293000
MLME: scan channel 3 (2422 MHz)
[eloop_reg_timeout] Timeout is at 1317686595.333000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686595.353000
MLME: scan channel 4 (2427 MHz)
[eloop_reg_timeout] Timeout is at 1317686595.393000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686595.433000
MLME: scan channel 5 (2432 MHz)
[eloop_reg_timeout] Timeout is at 1317686595.473000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686595.493000
MLME: scan channel 6 (2437 MHz)
[eloop_reg_timeout] Timeout is at 1317686595.533000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686595.573000
MLME: scan channel 7 (2442 MHz)
[eloop_reg_timeout] Timeout is at 1317686595.613000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686595.653000
MLME: scan channel 8 (2447 MHz)
[eloop_reg_timeout] Timeout is at 1317686595.673000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686595.713000
MLME: scan channel 9 (2452 MHz)
[eloop_reg_timeout] Timeout is at 1317686595.753000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686595.793000
MLME: scan channel 10 (2457 MHz)
[eloop_reg_timeout] Timeout is at 1317686595.833000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686595.853000
MLME: scan channel 11 (2462 MHz)
[eloop_reg_timeout] Timeout is at 1317686595.893000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686595.933000
MLME: scan channel 12 (2467 MHz)
[eloop_reg_timeout] Timeout is at 1317686595.973000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686595.993000
MLME: scan channel 13 (2472 MHz)
[eloop_reg_timeout] Timeout is at 1317686596.033000
sana2: sending MLME frame
[eloop_reg_timeout] Timeout is at 1317686596.073000
MLME: scan completed
</pre>
Is your network hidden? If so, did you enable the 'Hidden' checkbox in the network prefs? What distro version are you using?
<pre>
"ENV:sys/wireless.prefs" looks like this:
network={
ssid="testadhoc"
key_mgmt=NONE
wep_key0="12345"
wep_tx_keyidx=0
}
</pre>
If your router doesn't broadcast its SSID (hidden), you need to add this option to the network block of the wpa_supplicant.conf on your aros machine and make changes after # Example blocks:
scan_ssid=1
Here's a full description of all the [http://hostap.epitest.fi/gitweb/gitweb.cgi?p=hostap.git;a=blob_plain;f=wpa_supplicant/wpa_supplicant.conf config file options].
<pre>
ap_scan=1
network={
ssid="YOURESSID"
scan_ssid=1
proto=RSN
key_mgmt=WPA-PSK
pairwise=CCMP
group=CCMP
psk=YOURPASSWORD
}
</pre>
<pre>
filter_ssids=1
ap_scan=2
network={
ssid="REMOVED"
scan_ssid=1
bssid=REMOVED
priority=100
mode=0
proto=RSN
key_mgmt=WPA-PSK
auth_alg=OPEN
pairwise=CCMP
group=CCMP
psk=REMOVED
}
</pre>
Error 6: Couldn't resolve host name.
Check Scout -> Devices and look at the device that you are using, in the OCnt column it should state 2 which means AROSTCP and Wirelessmanager are both accessing this driver. If 0 or 1, then uncheck the checkbox in Network prefs for starting networking at boot, save and reboot. Then run this is the shell:
C:WirelessManager realtek8180.device unit 0
some quirks setting up the wireless network as well
1) it's far better setting up either the wired OR the wireless network adapter as net0:, or weird things happen
2) it's better using fixed IP on the local network instead of DHCP
3) network setting must be placed in network setting panel in /prefs, using the wirelessmanager helped me finding available SSIDs, but not actually connecting to them
once done, reboot.
If previous setup is proving problematic
<pre >
SYS:Prefs/Env-Archive/Wireless.prefs
SYS:Prefs/Env-Archive/Zune/OWB.config
SYS:Prefs/Env-Archive/Zune/global.config
SYS:Prefs/Env-Archive/AROSTCP/WirelessDevice
SYS:Prefs/Env-Archive/AROSTCP/db/Interfaces
</pre >
Make a copy of these files and restore in case of problems.
Please try this test to check if you can connect to your router, ie established that the WiFi layer is working
̊̊̊̊Boot with networking disabled, by make sure that "Start networking at boot" in Network Prefs is unchecked (no tick).
̊ Run this in a shell: C:WirelessManager atheros5000.device VERBOSE
̊If the output of that command is too long to summarise here, you can redirect it to a file by adding >RAM:wifi.log to the end, then attach or paste that file here.
try running "status" in the shell and check that AROSTCP is listed/running
If AROStcp is not showing, then AROSTCP is not running. attempted to start it by clicking Use or Save in network prefs, or checking the "start networking at boot" box or typing into a shell.
Execute SYS:System/Network/AROSTCP/s/startnet
(run Status again afterwards).
The "cannot resolve hostname" will appear if you are blocked on the wifi network by the router as well as aros not being able to assign correct network address.
One way of testing this might be to disable the firewall in the router. you might also check the router how it sees the attempts aros do to speak to it. The easiest way to do that would be to manually give aros an IP number in the routers accepted range. and see if it shows up at all within the router.
Tests that can be undertaken to determine correct settings and functions
pciinfo
sanautil -d broadcom4400.device status
<pre >
ping <router-address> e.g. 192.168.0.1 (aka inet) or 80.237.146.33 (www.amiganews.de)
ifconfig net0
ifconfig net0 up
extras:networking/utils/sanautil/sanautil -d atheros5000.device status
WirelessManager atheros5000.device verbose >RAM:wifi.log
;to send the log to RAM disk to be read easier or if detected,
Run WirelessManager atheros5000.device >NIL:
Run WirelessManager atheros5000.device ssid="mynet1" >NIL:
C:WirelessManager realtek8180.device unit 0
</pre >
Please look at the task list in Scout, and check if WirelessManager and AROSTCP are running. Also look at the device list in Scout to check if realtek8180.device is open.
start tools/debug/sashimi, maybe it shows some debug messages when disconnection happens.
Firstly, let's take a look at what your setup most likely looks like, assuming you use a router. See diagram below:
<pre>
Internet <---------> home router <---------> computer
-----------external IP------------------internal IP-------------
</pre>
Okay, so what am I trying to show you with that diagram. A few things. Firstly, the IP address that connects you to the Internet is not the same one that connects you to your router. What happens is that your computer doesn't have a direct connection to the Internet, instead your router connects to the Internet, and your computer connects to the router.
You can see the external and internal IP addresses in these example settings...
* Default Gateway : 76.91.64.1 (external IP for ISP/Internet host)
* IP Address : 76.91.71.184 (external IP for home router)
* IP Address : 192.168.0.1 (internal IP for home router)
* Address = 192.168.0.161 (internal IP for computer)
As you can see, there are two internal IP addresses and two external IP addresses. This is because there is a client/server relationship, effectively one address is for the service (server) and one address is for the device trying to access that service (client).
The server addresses in your case are 76.91.64.1 (your ISP's address, serving the Internet), and 192.168.0.1 (your home router's address, serving your home network). The term gateway applies here, they are your gateway to those services.
Subnet masks are used along with IP addresses to determine which IP addresses are allowed access to a network. I did learn the more in-depth rules about subnet masks once (watched a CCNA vid), but I've forgotten about it. The basic level of understanding you'll need is easy to remember though. A subnet mask value of 255 means that portion of the IP address must stay constant, whereas a subnet value of 0 means any unassigned value up to 255 is allowed in the IP address.
By far the most common subnet value is 255.255.255.0. What this means is that the first three parts of the IP address you use to connect to a service must stay the same as the server/gateway address, and only the last section can change.
So if your router's internal IP address is 192.168.0.1, and the subnet mask is 255.255.255.0, the only addresses that will be allowed to be used on that network are between 192.168.0.2 and 192.168.0.255 (I think 192.168.0.0 is reserved for other uses).
Final point to make is about DHCP (a.k.a. dynamic IP) vs static IP. A server/router using DHCP gives a device that connects to it an address within the acceptable range. It usually starts with the lowest numbered free address, so with your router it'll give the first device that connects to it 192.168.0.2, the next device 192.168.0.3, and so on. Static IP addresses are where you set the IP address you want to connect with in advance.
When using static IP addresses on a router where DHCP is active, it's good to use a high number to avoid conflicts with other devices that are connected to your network, to reduce the risk that both devices will try using the same IP. That's why your current choice of 192.168.0.161 is good, unless you have over 159 devices connected on your current network!
Okay, so what's the next step. Well, if you can use ping, I'd suggest pinging 192.168.0.1. If you get a positive response it means you're connected to your router, if you don't get a response it means the connection between your router and your computer is at fault.
Documentation on configuring the AROSTCP environment further can be found [http://en.wikibooks.org/wiki/Aros/User/Networking here]
===File Sharing===
As AROS knows only a few filesystems (FFS, OFS, SFS, PFS (amiga only), FAT12, 16, 32, Microsoft NTFS (windows), UDF (Blu-ray)).
The others in regular use like MacOSX hfs+, Linux ext2/ext3 and ext4, Haiku BeFS provide a problem in transferring files.
Linux can access SFS partitions but it needs to be compiled. The latest full source are [http://home.elka.pw.edu.pl/~mszyprow/programy/asfs/ here]. It compiled fine with a 2.6.30 kernel in Puppy Linux 4.31.
An alternative, is to use a FAT32 partition to share. Setup a 4G FAT32 partition using HDToolbox for sharing, and the rest of the space as SFS for an Aros install. It works very well.
Files could be transferred via TCP internet network.
====SMB2/3====
With Windows you can share one folder or all folders of the "Public" user.
On Windows what is important is to enable sharing (Network and Sharing Center).
AROS Mountlist should look lke this
<pre>
Handler = L:smb2-handler
StackSize = 65536
Priority = 5
GlobVec = -1
ACTIVATE=1
Startup = "smb://UserAcc:password@PCShare/Sharefolder"
</pre>
which could also be
"smb://UserPC:password@192.168.x.x/Public"
or
"smb://UserPC:password@Name-PC/Public"
so
"smb://UserPC:password@192.168.1.158/Folder"
or
"smb://UserPC:password@Name-PC/Folder"
After you have configured a share generates a DOSDrivers it is named "SMB0" which includes the setting, and at each reboot it is Mounted. You can still delete the DOSDriver by hand, is located in Storage/DOSDrivers, the file "ServerAutoMounts", in ENV:AROSTCP which indicates the DOSDriver to be mounted, should also be deleted.
The per-mount files are written to ENV:SMB or SYS:Storage/DOSDrivers. There is also additional file ENV:AROSTCP/ServerAutoMounts which states what will be presented to the end user.
====Old SMBFS====
e.g. to connect to a NAS share such as \\NASBOX\Shared use -:
SMBFS WORKGROUP=<YOUR WORKGROUP NAME> VOLUME=<AROS volume name to use>: SERVICE=<UNC Path to connect to>
SMBFS WORKGROUP=MYNET VOLUME=Shared: SERVICE=//NASBOX/Shared
And you will then have an icon appear on your desktop for the volume name you have chosen.
You can put the above script into wbstartup or
give it an icon, change it to a 'project' and give it the default tool c:iconx
Open a shell and type copy sys:script.info "sys:wbstartup/YOURSCRIPTNAME.info"
This should create an icon for your script file.
Now right-click on your script and select 'information'.
Change 'tool' to 'project', put 'c:iconx' into the 'default tool' box, click save
The reason being that scripts need to be opened with 'execute SCRIPTNAME' (or 'iconx') whereas the programs started from wbstartup are opened using 'run PROGRAMNAME'. It's the same as trying to start a command-line tool from the workbench by double-clicking it.
====Setup ISO images within AROS====
Use [http://archives.aros-exec.org/index.php?function=browse&cat=driver/storage DiskImage] which supports many cd image formats ISO, CCD, MDF/MDS, CUE/BIN, NRG and UIF. To mount CD or DVD images use below....
<pre >
# Rename your iso 'Unit0' (note no extension).
# Do 'View/All files' on you Aros partition. You should now see a folder called 'Diskimages'. Copy your renamed iso to there.
(Alternatively, you could type at the shell 'assign FDSK: xxx', where xxx is the location of your iso.)
# From the shell, type 'mount CD0:' and the iso should appear on the Wanderer desktop. You can now access it like a real disk.
</pre >
assign devname: dismount
Assign DOSVOLUME: remove
[http://aminet.net/package/disk/misc/unmount-0.1 unmount] most filesystems work but SFS lacks support for ACTION_DIE packet
If you are using an IcAros install, the startup scripts are set up to wipe the Diskimages directory on boot, so its worth keeping a second copy of the iso somewhere else. Alternatively, you could set up extra mountlists for additional iso images. I've made a file called iso1 in the Aros:devs directory that contains the following text:
<pre>
/* Entry for ISO image */
ISO1:
FileSystem = cdrom.handler
Device = fdsk.device
Unit = 1
LowCyl = 0
HighCyl = 0
Surfaces = 1
BlocksPerTrack = 1
DOSType = 0x41434400
Activate = 1
#
</pre>
Then I just need an iso called 'Unit1' (corresponding to the 'Unit = 1' entry in the mountlist) in Diskimages (or wherever I assign FDSK: to) and to mount I type in at the shell:
Mount iso1: from devs:iso1
Of course, if you create mountlists for ISO2, ISO3:, etc. (with the corresponding change to the 'Unit = ' line) you can have as many isos mounted as you wish. I just call mine ISO1: etc. to distinguish them from the real CD drives
==Video Guides==
Video demonstrations and tutorials covering:
:00. '''Introduction'''
::[https://www.youtube.com/@jamesmattson6813/videos Various Aros Installs],
::[https://www.youtube.com/embed/j8EmSEby0Rg AROS repo in gource, view of AROS dev commits from 1997 to 2025], [http://www.youtube.com/watch?v=Vx_zqlBow40&feature=related Gource view of AROS 1997 up to 2009],
::[http://www.youtube.com/watch?v=s1RsvEm7UrU Why an Amiga OS in 2011],
::[https://www.youtube.com/watch?v=1W886mheV74&pp=ygUPYW1pZ2EgYXJvcyAyMDI2 Johan Grip on early days of AROS x86], [https://www.youtube.com/watch?v=mXaKDhtTTqQ&t=14s&pp=ygUPYW1pZ2EgYXJvcyAyMDI2 Michel Schulz on Aros and PiStorm],
:01. '''Installation'''
::[https://www.youtube.com/watch?v=M7YjufrJqDs Aros One install], [https://www.youtube.com/watch?v=iIMguHTdC5E Aros One USB install], [https://www.youtube.com/watch?v=ZNXauy5m5Wc Aros One install], [http://vimeo.com/11013489 Modify Grub boot],
::[http://www.youtube.com/watch?v=wyQVeyXIywc&feature=channel iMica Silent Pt3], [http://www.youtube.com/watch?v=o2AnkoflY14 Wipe whole drive and Install - warning loss of data on drive],
::[http://www.youtube.com/watch?v=OVXm6_-witQ VirtualBox install], [ VMware install],
::[http://www.youtube.com/watch?v=0k2PEmT8I14 Broadway AROS Install],
::[https://www.youtube.com/watch?v=PtDiXhjSIfs Is Aros Icaros a choice?],
::[ driver install],
::[http://www.vimeo.com/10491104 HDAudio install but needs account], [],
:02. '''Amiga Basics'''
::[http://www.youtube.com/watch?v=TY8mWxwzH5o Screens tutorial],
::[https://m.youtube.com/user/AMIGASYSTEM/videos General], [ Dos Scripts tutorial], [http://www.youtube.com/watch?v=hPT7SmVEpjc OS 1.2], [http://www.youtube.com/watch?v=n6kX3FqH8Ww&feature=related OS 1.3],
:03. '''Customisation demos'''
::[https://www.youtube.com/@AMIGASYSTEM/videos Prefs tutorial], [ Decoration tutorial], [http://www.youtube.com/watch?v=Dn5C8G3aDXU Scalos],
:04. '''Setting up''' internet access and surfing the web, FTP, IRC and Mail apps
::[ Network Prefs], [ AirCOS tutorial], [ jabberwocky tutorial],
:05. '''Native bundled Games and Applications'''
::[http://www.youtube.com/watch?v=aYlFv2B-VXc 3D Games], [http://www.youtube.com/watch?v=MXK7wwhd-R0 Latest Games], [http://www.youtube.com/watch?v=RUgiVThv23Q&feature=mfu_in_order&list=UL PrBoom GL], [http://www.youtube.com/watch?v=0s7u8TPy7V4 Assault Cubes], [http://www.youtube.com/watch?v=fih6aCXKeqs Cube 2], [http://www.youtube.com/watch?v=-X0ay0MGOms DosBox on Aros], [http://www.youtube.com/watch?v=7nKduDjf14k Oct 2010],
::[http://www.youtube.com/watch?v=FziV2z_uxnQ Apps Pt 1], [http://www.youtube.com/watch?v=xs37_nfa5CI Apps Pt 2], [http://www.youtube.com/watch?v=Bn59_VvbQR0&feature=related Apps Pt 3],
::DOpus4 [http://www.youtube.com/watch?v=aSRybWjrrME DOpus 4],
::Milkytracker [http://www.youtube.com/watch?v=VxBOEPzpdKg&feature=related Laying Down Base Tracks],
::[http://www.youtube.com/watch?v=k2uKQ0-ieOE Audio Evolution 4 in action], [http://www.youtube.com/watch?v=Zq4r9k0_jZI Quick Videos],
::[http://www.youtube.com/watch?v=gGKCFZcIc0I&feature=related ScreenRecorder], [http://www.youtube.com/watch?v=974c2e-Fqak&feature=related TV out Tests],
::[http://www.youtube.com/watch?v=fjq8ct5d5IY AmiFIG], [http://www.youtube.com/watch?v=h0rHvPhYJo4&feature=youtu.be ZuneFIG],
::[http://wiki.povray.org/content/Documentation:Tutorial_Section_1 POVray Tutorial 1],
::[http://www.youtube.com/watch?v=Jk-ZNLfJsvQ pt 1, jan. 2008], [http://www.youtube.com/watch?v=nWRy33g1R7Y pt 2, feb. 2009], [http://www.youtube.com/watch?v=r5PbhCtm4vE pt 3, feb. 2010],
::[https://www.youtube.com/watch?v=G7_FJUoQ89o Hollywood programming], [], [], [],
::[], [], [],
::[], [], [],
::[], [], [],
:06. '''Commercial software available'''
::[http://www.youtube.com/watch?v=fKXY9B4R43s AntiryadGX 3D Game Editor],
::[http://www.youtube.com/watch?v=TMS9NDzwm5U BOH indie Game],
:07. '''Running classic amiga apps and games'''
:: Amiberry [], [],
::[http://vmwaros.blogspot.com/2008/11/introducing-amibridge.html Intro Amibridge], [http://www.youtube.com/watch?v=ee2PWvCZeLo Old Amiga Apps], [http://www.youtube.com/watch?v=ee2PWvCZeLo Why Janus UAE is good],
::[https://www.youtube.com/watch?v=VhlsNSYSuDg DPaint tutorial]
::[http://vmwaros.blogspot.com/2009/11/can-icaros-play-my-amiga-games-and-why.html Play Amiga Games], [https://www.youtube.com/watch?v=XTaZCNOvCnE],
::[http://www.youtube.com/watch?v=tMehS77LXQ4 Pagestream Introduction], [http://www.youtube.com/watch?v=284-w3hTzII Pagestream Tutorial 1], [http://www.youtube.com/watch?v=mlwEGwhZzl4 Pagestream Tutorial 2],
::[http://www.youtube.com/watch?v=iIcrIjPOctc Catweasel Mk4 PCI Part 1] and [http://www.youtube.com/watch?v=BaitHeL6bEA Part 2],
:08. '''Misc and History'''
::[http://www.youtube.com/watch?v=d6mDXKU29w0 Mum uses old AmigaOS Workbench 1.1 (1986)], [http://www.youtube.com/watch?v=DaRkacQ-YMg Why an Amiga 500 (1987)], [http://www.youtube.com/watch?v=k5CYsgVCzYY an Amiga 2000 (1987)],
:09. '''Misc Shows and Events'''
::[http://www.youtube.com/watch?v=klgVSWKs4kE VCF 2010], [https://www.youtube.com/watch?v=eQ3d5qR-Hv8 24:06 Jason McMullan at amiwest 2012 about AROS], [https://www.youtube.com/watch?v=jpQO7XSfAv4 Aros SMP multi core amiwest 2013], [], [https://www.youtube.com/watch?v=gFRtAAmiFbE], [https://www.youtube.com/watch?v=DjdUEyjx8GM], [https://www.youtube.com/watch?v=ydYDqZQpim8], [], [https://www.youtube.com/@uminekoshouten/featured], [https://www.youtube.com/shorts/NfoY023w-vE],
:10.
::[https://www.youtube.com/shorts/6qJTNW4-6GY]
===History===
The project was originally started by a small group of Amiga [http://www.amigahistory.co.uk/aros.html enthusiasts] in 1995. These individuals were mainly computer-based college university students at the start, though that student trend has diminished since. An interview with Aaron Digulla [http://arosshow.blogspot.com/2006/12/interview-with-aaron-digulla-who.html here]
* 1992 Commodore folds
* 1996-1998 much of the early years was concerned with exec, dos and intuition libraries.
* Early 1999, Haage & Partner used parts of the AROS code in AmigaOS 3.9.
* March 2001, floppy disk images of AROS became available.
* Early 2002, AROS changed its name from Amiga Replacement Operating System to Amiga Research Operating System
* June 2002, AROS devs decided to use Zune (MUI 3.8 rewrite) as the GUI system.
* November 2002, Eric Schwartz drew Kitty for AROS usage.
* Early 2003, AROS.org underwent a graphics facelift.
* Late 2003, GCC C compiler arrived.
* Early 2004, Aros-Exec opened.
* Early 2005, Aros Max bootable CD arrived.
* Late 2005, SFS filesystem ported and allowed fast access to apps and network support arrived
* Early 2007, AROS.org underwent another graphics facelift.
* Mid-2007, AROS changed to AROS Research Operating System after A.Inc. sued Hyperion with a trademark violation.
* Late 2007, the hard disk installer added and VmwAROS (later called Icaros Desktop) distro launched.
* Early 2009, Our first usable web browser (OWB)
* September 2010, first wireless support appears and AspireOS started as a distro
* Early 2012, the first paper-cut bugfix and Fab's Odyssey Web Browser ported
* Early 2017, work started on utilising the addition cores on modern CPUs starting with the 64bit x86 PC version
* Mid-2017, m68k port optimized for the Vampire 2 / Apollo accelerators (68080 AMMX FPGA)
* 2018 The old AROS Exec website closed and a new one opened
* 2019 AROS One x86 32bit distribution started and now with USB install version
* Early 2021, backport of more features of 32bit PC ABIv1 into 32bit PC ABIv0 (Aros One 1.5 and above)
* 2025 year of 64bit pc builds and porting 32bit applications to 64bit ABIv11
* 2026 update of [https://www.youtube.com/watch?v=6FKTL068ULM&pp=ygUPYXJvcyBhbWlnYSAyMDI2 nvidia nouveau driver for 64bit PC]
===Bounties===
To help inspire developers with both ideas and monetary incentives, rewards are offered for the successful completion of "bounties" (requests for missing/new functionality) chosen by the community and handled by [http://power2people.org power2people] (formerly done by TeamAROS). A monthly option is [http://www.power2people.org/funds/aros/ here].
Future goals for AROS include expanding its underlying retargetability to support even more diverse architectures, provide memory protection features and user level file security, SMP and many other wonderful features missing from AmigaOS — while still providing as much source level compatibility as is possible (however it is accepted that to achieve some goals code certain things may require a little recoding).
[http://www.ohloh.net/p/aros/contributors Developers] come and go as with any open source effort and we would like to thank them for their efforts...
;1996-2000:In DigullaA (coordinator), GripJ, TempletonI (BSD), SchulzM, RittauS, voordenDagL, HolmM, JohanssonT, VanIngelgomH, SteigerwaldM, BortasP, deJongK, AlfredssonJ, InnocentiB,
;2001-2005:In [http://chodorowski.com/adam/aros.html ChodorowskiA], StegerG, BergerS, HeutlingS, AlemagnaF (gcc), VerhaegenS (rexx), KielH, MatheussenKS (CAMD), SzczygielskiP, ErikssonP, LeCorfecD (Zune), BauerS (Zune), FurlongW, GustafssonJ, AndrewsN, CafferkeyN, GierichM (jpeg), PattonJ, ParsonsM, DietrichJ, SeilerT, BischoffL, LorentzenNH, AdamO, BerglundH, SmithP, HolmenD, BlomM,
;2006-2010:In FedinP, RusslerM, SzymczykS (owb), SmiechowiczK (openGL), WeissM, NorrisR, BrunnerO, WiszkowskiT, GreppinA, [http://www.fukt.bsnet.se/~bearsoft/ Bearsoft Björn Screwelius], ErbY, CharletF, HodgesC, [http://aros-exec.org/modules/newbb/viewtopic.php?topic_id=4819&forum=18&post_id=43103#forumpost43103 HokstadV], McMullanJ (m68k), WilenT (m68k),
;2011- :In MuijzenbergPHvanden, ALB42, JonesEM, weiju, DizzyofCRN, wawa, miker,
* 1996 - The linux hosted version for i386 was the first to arrive
* 1998 - i386, The native version for i386-based PC AT computers and compatibles.
* 2004 - x86/64, The native version for 64-bit (x86_64, amd64) PC computers.
* 2008 - sam440/ppc, The native version for Sam440EP, Sam440EP Flex and Sam460ex computers.
* 2009 - efika, The native version for PowerPC Efika computers.
* 2010 - m68k, The native version for m68k Amigas or WinUAE
* 2013 - raspi/armfh, early native version for ARMv6 based Raspberry Pi computers.
* 2017 - x86/64bit smp
Debugging capture serial debug at all (especially with sysdebug=all or --sysdebug=all) to see it displayed on screen
* yes, usb -> rs232 adapters can work most of the time, some of the cheapest ones are not fully compatible with all rs232 devices to capture to another device
* you will need a null modem cable (or a null modem adapter usually female to female) in addition to the usb -> rs232 adapter (usb adapter is a normal modem ie. the pins are not crossed over)
Normal modem cable - straight connection DCE
<pre>
Pin 2 -> Pin 2 RXD
Pin 3 -> Pin 3 TXD
Pin 5 -> Pin 5 GND
</pre>
Null modem cable connections DTE
<pre>
Pin 2 -> Pin 3
Pin 3 -> Pin 2
Pin 5 -> Pin 5
</pre>
(9pole SUB-D)
<pre>
serial ser: (amiga/aros) tty2 tty1USB0 (linux) COM1 (windows) (depends on the os being used)
speed baud transfer rate 9600 38400 lower baud might be more successful
data bits 8
stop bits 1
parity none
handshaking flow control - none xon/xoff (most likely) rts/cts dsr/dtr (pins not connected so should not work)
</pre>
*You cannot use compiled aros X86-64 bit software (when ready) on aros X86 32bit. PPC compiled software on X86 and so on.
*68k is tested with the UAE emulator (WinUAE) but some tests are done on native 68000 based Amigas and others.
*PPC support is very limited to certain devices.
If you use the WBStartup, you have to delete the other icons in the folder (readme etc..) and you have to add in the Icon Tooltype the parameter DONOTWAIT
If you use user-startup instead, you need to add the attached command "after assignment to LUA"
C:WBRun DH1:Extras/Utility/WeatherBar/WeatherBar >NIL:
Change the command to match your WeatherBar path.
<pre>
PATH sys:Utilities/WeatherBar ADD
run >nil: lua:amilua weatherforecast.lua
</pre>
To enter data your Country or City, ist with city_id numbers can be found [http://bulk.openweathermap.org/sample/city.list.json.gz here] or you need to go to [https://www.bbc.com/weather BBC Weather], once you type the name of your city or town in the appropriate tab, and press enter, the 7 numbers to be added in the "WeatherBar" will appear on the Browser url address bar above
Unicode v16.0 emojis are not supported but [https://github.com/jens-maus/libcodesets codesets.library] provides
<pre>
internally supported (hardcoded) charsets/codesets are: (conversions are possible from and to each codeset):
AmigaPL – Polish (Amiga)
Amiga-1251 – Cyrillic (Amiga)
ISO-8859-1 – Western European
ISO-8859-1+Euro – West European (with EURO)
ISO-8859-2 – Central/East European
ISO-8859-3 – South European
ISO-8859-4 – North European
ISO-8859-5 – Slavic languages
ISO-8859-9 – Turkish
ISO-8859-15 – West European II
ISO-8859-16 – South-Eastern European
KOI8-R – Russian
UTF-8 – Unicode
In addition, external charset table files can be stored in LIBS:Charsets or loaded by an application from PROGDIR:Charsets. The charset files included with this distributions are:
IBM866 – Cyrillic (cp866)
ISO-8859-7 – Greek (LatinGreek)
ISO-8859-10 – Nordic (Latin 6)
windows-1250 – Central/East Europe (Windows)
windows-1251 – Cyrillic (Windows)
windows-1252 – West European (Windows)
</pre>
Icaros 2.3 USB image needs a header stripped so it can work correctly
dd bs=512 skip=1 status=progress if=icaros_light_2-3-0_pendrive.bin of=/dev/sdxy && sync
Scalos
<pre>
-------------------------------
{ "STRING", "ID/K,TEXT/K,SRC/K,TEXTPEN/K,HALIGN/K,STYLE/K,FONT/K,VALIGN/K",
HALIGN LEFT | CENTER | RIGHT
VALIGN TOP | CENTER | BOTTOM
STYLE NORMAL | BOLD | ITALIC | BOLDITALIC
FONT // font specification - format: "fontname.font/size"
-------------------------------
arguments for STRING SRC
"diskstate",
"diskusage",
"diskusagefree",
"diskusageinuse",
"diskusagepercent",
"fibfilename",
"filecomment",
"filedate",
"fileprotection",
"filesize",
"filetime",
"filetypestring",
"iconname",
"linktarget",
"plugin" pluginname <optional plugin arguments>
"versionstring",
"volumecreateddate",
"volumecreatedtime",
"volumeordevicename",
-------------------------------
arguments for HIDE
"novolumenode",
"isempty" (some STRING)
-------------------------------
all internal commands:
"about",
"backdrop",
"cleanup",
"cleanupbyname",
"cleanupbydate",
"cleanupbysize",
"cleanupbytype",
"clearselection",
"clone",
"close",
"copy",
"cut",
"delete",
"emptytrashcan",
"executecommand",
"formatdisk",
"iconify",
"iconinfo",
"lastmsg",
"leaveout",
"makedir",
"open",
"parent",
"paste",
"putaway",
"quit",
"redraw",
"redrawall",
"rename",
"reset",
"selectall",
"showallfiles",
"showonlyicons",
"shutdown",
"sizetofit",
"snapshot",
"snapshotall",
"snapshotwindow",
"unsnapshot",
"update",
"updateall",
"viewbydate",
"viewbyicon",
"viewbysize",
"viewbytype",
"viewbytext",
</pre>
{{status|50%}}
{{BookCat}}
do709s43ppv8ozqyik77k0tid08re8p
Chess/Playing The Game
0
26908
4676692
4638052
2026-10-18T05:25:03Z
Mast303
3416213
4676692
wikitext
text/x-wiki
Chess, unlike many other games, does not involve direct chance such as the roll of a dice or which card is drawn. Moreover, both sides always know where all the pieces are. This is known as "perfect information". However, because of its vast complexity, the far-reaching consequences of some decisions are practically unforeseeable.
One player ("White") has the white pieces while the other ("Black") has the black pieces. Sometimes the colors are not black and white (for instance, light and dark, or yellow and blue), but they generally contrast each other. In friendly games the choice of colors can be made by any method, such as flipping a coin. If there is no coin at hand, another typical way of deciding would be to conceal a black piece in one hand and a white piece in the other and ask one's opponent to select a hand. The colored piece selected will be the opponent's color. In competitive games the players are assigned their colors.
=== Order of play ===
Once all the pieces have been arranged, White (or the lighter color) makes the first move. White ''always'' makes the first move; this is important for notation, and any chess player will insist upon it. After White has made the move, Black will then make a move. The gameplay will continue in alternating fashion, White making a move, followed by Black.
===General movement rules===
*A move consists of moving a single piece, in accordance with its rules of movement, to a square that is unoccupied or occupied by an enemy piece. A player may never move a piece onto a square already occupied by another of his or her own pieces.
**''Exception'': There is a special move called "castling" where two pieces, a rook and the king, are moved; see below.
*If a piece is moved onto a square occupied by an enemy piece, the latter piece is removed from play and the first piece replaces it. The removed piece is said to have been ''captured'' or ''taken''.
**''Exception'': In ''en passant'' capture, a pawn moves to an unoccupied square but still captures another pawn "in passing"; see below.
*Most pieces move and capture opponent pieces in the same way.
**''Exception'': The pawn has separate rules for moving and capturing opponent pieces.
*Most pieces may only make a move to a non-adjacent square if all the intervening squares are vacant (pieces may not 'jump over' other pieces).
**''Exception'': The knight can move to any suitable final square regardless of occupants of other squares.
**''Exception'': In castling, a king and a rook jump over each other.
*No player may make a move that leaves their own king "in check" (see below).
*The player must ''always'' make a move when it is his or her turn. In other words, he or she cannot choose not to make a move. If no legal move is possible the game ends in a draw (see below), except when the king is in check - this is called ''checkmate'', and is usually how the opposing player wins.
Also, when a pawn moves to a square at the opposite end of the board, it becomes a different piece (pawn promotion); all of these exceptions are covered below in more detail.
==The board==
Traditionally, the game is played on a board of 64 alternating black and white squares turned with a white square to each player's near right-hand corner. "White on right" is a helpful saying to remember this convention. The light and dark squares on the chessboard and the light and dark chess pieces are traditionally referred to as "white" and "black" respectively, although in modern chess sets almost any colors may be used (as long as they are not the ''same'' colors.)
The horizontal rows of squares are called '''ranks''' and are numbered 1-8; the vertical columns of squares are called '''files''' and given the letters a-h. This way any single square can be easily identified by its rank and file, making it possible to record games by writing down the starting and ending position of the piece that moves every turn.
A chess diagram is always printed from the White player's perspective.
{{Chess diagram|=
|tleft
|
|=
8 | | | | | | | | |=
7 | | | | | | | | |=
6 | | | | | | | | |=
5 | | | | | | | | |=
4 | | | | | | | | |=
3 | | | | | | | | |=
2 | | | | | | | | |=
1 | | | | | | | | |=
a b c d e f g h
|Chess board}}
{{-}}
==The pieces==
The movement of the individual pieces is described below. In all the board diagrams shown, the squares to which the piece in question can move are indicated with x's.
===Pawn===
[[Image:Chess pll45.svg|left]]
Pawns can move one square straight forward, or optionally and on their first move only, two squares straight forward. The pawn is the only piece that can't move backwards. This piece is worth 1 point.
{{Chess diagram|=
|tleft
|
|=
8 | | | | | | | | |=
7 | | | | | | | |pd|=
6 | | | | | |pd| |xx|=
5 | | | | | |xx| |xx|=
4 |xx| |xx| | | | | |=
3 |xx| |pl| | | | | |=
2 |pl| | | | | | | |=
1 | | | | | | | | |=
a b c d e f g h
|Pawn move}}
{{-}}
==== Capturing Pieces ====
The pawn can move one square diagonally forward to capture a piece, but cannot capture a piece by moving straight forward. For this reason, two opposing pawns on a file may become blocked by each other. In the first diagram below, legal capture moves for the white pawn are indicated with black circles.
To capture means to displace a piece, meaning, to replace the captured with the capturer.
In the second diagram below the White pawn is prevented from moving forwards by the Black pawn immediately in front of it (in the d-file) which it cannot capture, but it can capture the adjacent Black pawn by moving diagonally forward as seen in the last diagram.
The pawn is the only piece that moves and captures differently.
{{Chess diagram|=
|tleft
|
|=
8 | | | | | | | | |=
7 | | | | | | | | |=
6 | | | | | | | | |=
5 | | |xo| |xo| | | |=
4 | | | |pl| | | | |=
3 | | | | | | | | |=
2 | | | | | | | | |=
1 | | | | | | | | |=
a b c d e f g h
|Pawn capture}}
{{Chess diagram|=
|tleft
|
|=
8 | | | | | | | | |=
7 | | | | | | | | |=
6 | | | | | | | | |=
5 | | | |pd|pd| | | |=
4 | | | |pl| | | | |=
3 | | | | | | | | |=
2 | | | | | | | | |=
1 | | | | | | | | |=
a b c d e f g h
|Position before capture}}
{{Chess diagram|=
|tleft
|
|=
8 | | | | | | | | |=
7 | | | | | | | | |=
6 | | | | | | | | |=
5 | | | |pd|pl| | | |=
4 | | | | | | | | |=
3 | | | | | | | | |=
2 | | | | | | | | |=
1 | | | | | | | | |=
a b c d e f g h
|Position after capture}}
{{-}}
===Knight===
[[Image:Chess nll45.svg|left]]
The knight has a unique move that allows it to flank the other pieces. The easiest way to describe this move is that he moves to a square of the opposite color from the one he's on that is exactly two squares away from him. This piece is worth 3 points.
{{Chess diagram|=
|tleft
|
|=
8 | | | | | | | | |=
7 | | | |xx| |xx| | |=
6 | | |xx| | | |xx| |=
5 | | | | |nl| | | |=
4 | | |xx| | | |xx| |=
3 | | | |xx| |xx| | |=
2 | | | | | | | | |=
1 | | | | | | | | |=
a b c d e f g h
|Knight move, when starting from a dark colored square he moves to a light square two away}}
{{Chess diagram|=
|tleft
|
|=
8 | | | | | | | | |=
7 | | | |xx| | | | |=
6 | | | | | | | | |=
5 | | |xx| | | | | |=
4 | | | | | | |xo| |=
3 | |xx| | |xo| | | |=
2 | | |xo| | | | | |=
1 |nl| | | | | | | |=
a b c d e f g h
|The knight moves along straight lines like all other pieces, two such lines marked here}}
{{-}}
Another way to visualize the move is this: of the 16 squares that are 2 away from a knight he reaches the 8 that are of the opposite color of the square he's on and the other 8 can be reached by a queen where she on his square.
{{-}}
{{Chess diagram|=
|tleft
|
|=
8 |xo| | | |xo| | | |=
7 | |xo| | |xo| | |xo|=
6 | | |xo|xx|xo|xx|xo| |=
5 | | |xx|xo|xo|xo|xx| |=
4 |xo|xo|xo|xo|nl|xo|xo|xo|=
3 | | |xx|xo|xo|xo|xx| |=
2 | | |xo|xx|xo|xx|xo| |=
1 | |xo| | |xo| | |xo|=
a b c d e f g h
|Knight move compared to the queen move}}
{{Chess diagram|=
|tleft
|
|=
8 | | | | | | | | |=
7 | | |xo|xx|xo|xx|xo| |=
6 | | |xx| | | |xx| |=
5 | | |xo| |nl| |xo| |=
4 | | |xx| | | |xx| |=
3 | | |xo|xx|xo|xx|xo| |=
2 | | | | | | | | |=
1 | | | | | | | | |=
a b c d e f g h
|Knight move compared to the queen again. Of the squares 2 away, the knight has 8 marked X and the queen could reach the other 8}}
{{-}}
It is important to remember that the knight moves in a straight line like all the other pieces, it's just along lines of movement no other piece uses. Consider this comparison: A queen moves ordinally along the ranks and files - North, East, South, and West on a compass rose; and she also moves diagonally - Northeast, Southeast, Southwest, and Northwest on a compass rose. The knight moves along the wind lines of the rose - North by Northeast, East by Northeast, and so on. These lines pass between the squares adjacent to the knight and pass through the middle of the squares that are one square away from the knight. The knight moves to the first square its line of movement passes through the middle of, so like the King the knight has eight squares he can move to when he is near the center of the board. Since the knight is moving between the squares adjacent to him pieces do not hinder his move whether they are allied or enemy.
==== Capturing Pieces ====
The knight captures any opponent's piece that occupies a square it can move to by removing that piece from the board and placing the knight in that square. An important consequence of the knight's use of wind lines is that it can attack (that is, threaten to capture) pieces without being threatened in return so long as they are not also knights. The reverse is also true - pieces attacking a knight are never threatened by it.
{{Chess diagram|=
|tleft
|
|=
8 | | | | | | | | |=
7 | | | | | | | | |=
6 | | | |pd| |kd| | |=
5 | | |rd| | | |pd| |=
4 | | | | |nl| | | |=
3 | | |bd| | | |rd| |=
2 | | | |qd| |pd| | |=
1 | | | | | | | | |=
a b c d e f g h
|Knight capture}}
{{Chess diagram|=
|tleft
|
|=
8 | | | | | | | | |=
7 | | | | | | | | |=
6 | | | |qd| |qd| | |=
5 | | |qd|ql|ql|ql|qd| |=
4 | | | |ql|nl|ql| | |=
3 | | |qd|ql|ql|ql|qd| |=
2 | | | |qd| |qd| | |=
1 | | | | | | | | |=
a b c d e f g h
|Knight capture - Jumping over pieces}}
{{-}}
===Bishop===
[[Image:Chess_bll44.png|left]]
The bishop can move any number of squares diagonally. The bishop may not jump over any piece of either color.
The bishop is restricted to the color of squares on which it began the game. Each player starts out with one light-square bishop that moves on the light colored squares, and one dark-square bishop that moves on the dark colored squares. In the diagram below, the bishop stands on a light square and can only move to other light squares. This piece worth 3 points.
{{-}}
{{Chess diagram|=
|tleft
|
|=
8 |xx| | | | | | | |=
7 | |xx| | | | | |xx|=
6 | | |xx| | | |xx| |=
5 | | | |xx| |xx| | |=
4 | | | | |bl| | | |=
3 | | | |xx| |xx| | |=
2 | | |xx| | | |xx| |=
1 | |xx| | | | | |xx|=
a b c d e f g h
|Bishop move}}
{{Chess diagram|=
|tleft
|
|=
8 | | | | | | | | |=
7 | |qd| | | | | | |=
6 | | |xx| | | | | |=
5 | | | |xx| |qd| | |=
4 | | | | |bl| | | |=
3 | | | |xx| |xx| | |=
2 | | |qd| | | |xx| |=
1 | | | | | | | |qd|=
a b c d e f g h
|Bishop capture}}
{{-}}
==== Capturing Pieces ====
The bishop captures any opponent's piece that it encounters during the movement described above, and then occupies the captured piece's square. In the diagram above the bishop may take any of the black queens. Notice that bishop may not move (jump) to squares behind or capture pieces hiding behind the queens.
===Rook===
[[Image:Chess rll45.svg|left]]
The rook can be moved any number of squares horizontally or vertically, but not diagonally. Like the bishop, the rook cannot jump over any pieces, except for "castling". This piece is worth 5 points.
{{-}}
{{Chess diagram|=
|tleft
|
|=
8 | | | | |xx| | | |=
7 | | | | |xx| | | |=
6 | | | | |xx| | | |=
5 | | | | |xx| | | |=
4 |xx|xx|xx|xx|rl|xx|xx|xx|=
3 | | | | |xx| | | |=
2 | | | | |xx| | | |=
1 | | | | |xx| | | |=
a b c d e f g h
|Rook move}}
{{Chess diagram|=
|tleft
|
|=
8 | | | | |qd| | | |=
7 | | | | |xx| | | |=
6 | | | | |xx| | | |=
5 | | | | |xx| | | |=
4 | |qd|xx|xx|rl|qd| | |=
3 | | | | |xx| | | |=
2 | | | | |qd| | | |=
1 | | | | | | | | |=
a b c d e f g h
|Rook capture}}
{{-}}
==== Capturing Pieces ====
If the rook attempts to occupy a space already occupied by an opponent's piece, it captures the piece. In the diagram above the rook may take any of the black queens.
===Queen===
[[Image:Chess qll45.svg|left]]
The queen is the most powerful piece, being able to move any number of squares in any lateral or diagonal direction. It is best described as the combination of a rook's and bishop's movement capabilities.This piece is worth 9 points.
{{-}}
{{Chess diagram|=
|tleft
|
|=
8 |xx| | | |xx| | | |=
7 | |xx| | |xx| | |xx|=
6 | | |xx| |xx| |xx| |=
5 | | | |xx|xx|xx| | |=
4 |xx|xx|xx|xx|ql|xx|xx|xx|=
3 | | | |xx|xx|xx| | |=
2 | | |xx| |xx| |xx| |=
1 | |xx| | |xx| | |xx|=
a b c d e f g h
|Queen move}}
{{Chess diagram|=
|tleft
|
|=
8 | | | | |qd| | | |=
7 | |qd| | |xx| | | |=
6 | | |xx| |xx| |qd| |=
5 | | | |xx|xx|xx| | |=
4 | | |qd|xx|ql|xx|xx|qd|=
3 | | | |xx|xx|qd| | |=
2 | | |qd| |qd| | | |=
1 | | | | | | | | |=
a b c d e f g h
|Queen capture}}
{{-}}
==== Capturing Pieces ====
The queen captures any opponent's piece that it encounters during the movement described above, and then occupies the captured piece's square. In the diagram above the queen may take any of the black queens.
===King===
[[Image:Chess_kll44.png|left]]
The king can move one square at a time in any direction, as long as doing so does not place himself in check (see below). This piece is worth ∞ points, because if you lose the king, you lose the game. (Note that the king would be 3.5 points as an attacker/defender.)
{{-}}
{{Chess diagram|=
|tleft
|
|=
8 | | | | | | | | |=
7 | | | | | | | | |=
6 | | | | | | | | |=
5 | | | |xx|xx|xx| | |=
4 | | | |xx|kl|xx| | |=
3 | | | |xx|xx|xx| | |=
2 | | | | | | | | |=
1 | | | | | | | | |=
a b c d e f g h
|King move}}
{{Chess diagram|=
|tleft
|
|=
8 | | | | | | | | |=
7 | | | | | | | | |=
6 | | | | | | | | |=
5 | | | |nd| |nd| | |=
4 | | | | |kl| | | |=
3 | | | |nd| |nd| | |=
2 | | | | | | | | |=
1 | | | | | | | | |=
a b c d e f g h
|King capture}}
{{Chess diagram|=
|tleft
|
|=
8 | | | | | | | | |=
7 | | | | | | | | |=
6 | | | | | | | | |=
5 | | | | |nd| | | |=
4 | | | |nd|kl|nd| | |=
3 | | | | |nd| | | |=
2 | | | | | | | | |=
1 | | | | | | | | |=
a b c d e f g h
|King capture}}
{{-}}
==== Capturing Pieces ====
The king may capture any opponent's piece adjacent to it, as long as doing so does not place himself in check (see below). In the diagrams above the king may take any of the black knights.
==== Check ====
The king is the most important piece belonging to each player, though not the most powerful. If a player moves a piece such that he threatens to capture his opponent's king in the next move, that king is said to be in ''check''.
If a player's king is in check, he must immediately remove the check by moving the king, blocking the check with another piece, or capturing the checking piece.
In the diagram below black's rook has checked the white king. White may avoid the check by moving the king one step sideways, blocking the check by putting the rook between the attacking black rook and the white king, or capture the black rook using the white bishop. Other normally legal moves, like moving one of the pawns, are illegal in this position since they will not remove the check.
In a friendly game, a check is usually announced by saying ''check'' after the move is completed.
{{Chess diagram|=
|tleft
|
|=
8 | | | | |rl| | | |=
7 | | | | | | | | |=
6 | | | | | | | | |=
5 | | | | | | | | |=
4 | | | |bl| | | | |=
3 | | | | | | | |pl|=
2 | | | | | |pl|pl|xx|=
1 |rd| | | |xx| |kl| |=
a b c d e f g h
|White king in check, the X marks the moves white can make. }}
{{-}}
==== Checkmate ====
If the king is placed in check and can not escape, it is said to have been ''checkmated'' (or "''mated''" for short). The first player to checkmate the opponent's king wins the game. Note that the king is never actually captured, since it is obliged to move out of check whenever possible (and the game ends when it is impossible). In the diagram below white has no options to escape the check from black's rook, he is therefore checkmated.
{{Chess diagram|=
|tleft
|
|=
8 | | | | | | | | |=
7 | | | | | | | | |=
6 | | | | | | | | |=
5 | | | | | | | | |=
4 | | | | | | | | |=
3 | | | | | | | | |=
2 | | | | | |pl|pl|pl|=
1 |rd| | | | | |kl| |=
a b c d e f g h
|White king in checkmate}}
{{-}}
====Special Restrictions — Avoiding "Self-check" ====
Players may not make any move which allows their king to be captured in the next move, i.e. places their own king in check. Thus two kings may never occupy adjacent squares, since they would have put themselves in check by moving there. This is called the "opposition" and is indispensable when, for instance, you are using a queen or rook to checkmate a king.
The white king in the following diagram cannot move upwards or to the left since it would be in check from the bishop, or diagonally downwards which would leave it adjacent to the black king. Also, as no piece is threatening it if it fails to move, the king is not currently in check. Similarly, the black king cannot move diagonally upwards as that would put it next to the White king.
{{Chess diagram|=
|tleft
|
|=
8 | | | | | | | | |=
7 | | | | | | |bd| |=
6 | | | | | | | | |=
5 | | | |xx| |xx| | |=
4 | | | | |kl|xx| | |=
3 | | | |xx|xx| |xo|xo|=
2 | | | | | |xo|kd|xo|=
1 | | | | | |xo|xo|xo|=
a b c d e f g h
|King may not move to an attacked square}}
{{-}}
The diagram below shows a position where the white bishop's movement is restricted by the same rule; the bishop can not be moved since the move would let black capture the white king in his next move. The white king on the other hand may move to any of the adjacent squares.
{{Chess diagram|=
|tleft
|
|=
8 | | | | |rd| | | |=
7 | | | | | | | | |=
6 | | | | | | | | |=
5 | | | | | | | | |=
4 | | | | | | | | |=
3 | | | | | | | | |=
2 | | | | |bl| | | |=
1 | | | | |kl| | | |=
a b c d e f g h
|Bishop may not move}}
{{-}}
==Special Moves==
====Pawn Promotion====
If a pawn makes it to one of the eight squares along the far edge of the board from their initial position, the pawn is "promoted". Upon reaching the far rank the player exchanges the pawn with either a queen, a rook, a bishop, or a knight. The player's move ends when the new piece occupies the promoted square.
The new piece need not be a previously captured piece. Thus a player can have more than one queen, and more than two rooks, bishops or knights on the board. The player may never have more than one king, since the pawn can not be promoted to a king. In theory it is possible to get up to nine queens, or ten rooks, bishops or knights since there are eight pawns to promote. In practice however the pawn is usually promoted to a queen, since it is the most powerful piece, and it is rare for a player to have more than two queens on the board. If an extra queen is not at hand, an upside-down rook is usually used as a substitute. Sometimes, a player might want a different piece like a knight, if the queen's movements would not be helpful.
{{Chess diagram|=
|tleft
|
|=
8 | | | | |xx| | | |=
7 | | | | |pl| | | |=
6 | | | | | | | | |=
5 | | | | | | | | |=
4 | | | | | | | | |=
3 | | | | | | | | |=
2 | | | | | | | | |=
1 | | | | | | | | |=
a b c d e f g h
|Pawn promotion - before move}}
{{Chess diagram|=
|tleft
|
|=
8 | | | | |ql| | | |=
7 | | | | | | | | |=
6 | | | | | | | | |=
5 | | | | | | | | |=
4 | | | | | | | | |=
3 | | | | | | | | |=
2 | | | | | | | | |=
1 | | | | | | | | |=
a b c d e f g h
|Pawn promotion - after move}}
{{-}}
====Castling====
[[Image:SCD_castle_kingside.png|frame|right|Kingside castling: O-O]]
[[Image:SCD_castle_queenside.png|frame|right|Queenside castling: O-O-O]]
Castling is a move involving the king and either of the rooks. Castling performed with the king's rook is called kingside castling, performed with the queen's rook is called queenside castling. A castling is typically done to move the king to a protective 'castle' surrounded by three pawns and a rook.
Subject to restrictions detailed below, a player may move his king two squares towards the rook, and subsequently, ''on the same turn'', move the rook adjacent to but on the opposite side of the king, (onto the square over which the king has just passed).
The restrictions specific to castling are:
#Neither the king nor the participating rook may have moved previously in the game
#The king must not be in check at the start of the move, though it may have been in check previously in the game.
#The square over which the king passes must not be under attack ('in check') from an enemy piece. (This would expose the king to a "check" in passing.) The rook(s) may be under attack, or the queens' rooks may pass through an attacked queens' knight square.
#The king must not be in check at the end of the move. (Also applies to all normal moves.)
#The squares between the king and rook must be vacant.
#The king can also only castle horizontally.
The diagrams below show examples of positions where castling is not legal.
{{Chess diagram|=
|tleft
|
|=
8 | | | | |rd| | | |=
7 | | | | | | | | |=
6 | | | | | | | | |=
5 | | | | | | | | |=
4 | | | | | | | | |=
3 | | | | | | | | |=
2 | | | | | |pl|pl|pl|=
1 | | | | |kl| | |rl|=
a b c d e f g h
|King in check before move}}
{{Chess diagram|=
|tleft
|
|=
8 | | | | | | | | |=
7 | | | | | | | | |=
6 | | | | | | | | |=
5 | |bd| | | | | | |=
4 | | | | | | | | |=
3 | | | | | | | | |=
2 | | | | | |pl|pl|pl|=
1 | | | | |kl|xx| |rl|=
a b c d e f g h
|King passing attacked square}}
{{Chess diagram|=
|tleft
|
|=
8 | | | | | | | | |=
7 | | | | | | | | |=
6 | | | | | | | | |=
5 | | | | | | | | |=
4 | | | | | | | | |=
3 | | | | | | |pl|nd|=
2 | | | | | |pl| |pl|=
1 | | | | |kl| |xx|rl|=
a b c d e f g h
|King in check after move}}
{{Chess diagram|=
|tleft
|
|=
8 | | | | | | | | |=
7 | | | | | | | | |=
6 | | | | | | | | |=
5 | | | | | | | | |=
4 | | | | | | | | |=
3 | | | | | | | | |=
2 | | | | | |pl|pl|pl|=
1 | | | | |kl|nd|nd|rl|=
a b c d e f g h
|Square(s) occupied}}
{{-}}
Note that the king must be the first piece moved and it must be moved two squares before it is released. If the rook is touched or moved first, then the king must stay where it is. This rule mainly applies in "strict rules of chess" where if a piece is touched, it must be moved. Touching the rook first indicates a rook only move, while releasing the king after one square indicates a king only move. Moving the king two squares is not a legal move by itself, and indicates a castling move.
{{-}}
====''En passant'' capture====
''En passant'' is French for "in passing"; you capture an enemy pawn as it is passing you.
When a pawn on its first move advances two squares onto the same rank as an opposing pawn on an adjacent file, this opposing pawn may, on that player's next move only, capture the advancing pawn as though it had only moved one square (provided the move is otherwise legal). The pawn's ability to move two squares on their first move was a relatively late addition to the game of chess. En Passant was introduced to prevent abuses of the new rule.
In the following example, the Black pawn advances two squares, and is captured by the White pawn which moves diagonally forwards and to the right (as if the Black pawn had moved only one square forward and been there). This move is only allowed on the turn in which the option is presented.
{{Chess diagram|=
|tleft
|
|=
8 | | | | |kd| | | |=
7 | | | | | |pd| | |=
6 | | | | | | | | |=
5 | | | | |pl|xx| | |=
4 | | | | | | | | |=
3 | | | | | | | | |=
2 | | | | | | | | |=
1 | | | | |kl| | | |=
a b c d e f g h
|En passant black is about to move the pawn}}
{{Chess diagram|=
|tleft
|
|=
8 | | | | |kd| | | |=
7 | | | | | | | | |=
6 | | | | | |xx| | |=
5 | | | | |pl|pd| | |=
4 | | | | | | | | |=
3 | | | | | | | | |=
2 | | | | | | | | |=
1 | | | | |kl| | | |=
a b c d e f g h
|En passant before capture}}
{{Chess diagram|=
|tleft
|
|=
8 | | | | |kd| | | |=
7 | | | | | | | | |=
6 | | | | | |pl| | |=
5 | | | | | | | | |=
4 | | | | | | | | |=
3 | | | | | | | | |=
2 | | | | | | | | |=
1 | | | | |kl| | | |=
a b c d e f g h
|En passant after capture}}
{{-}}
==Initial position==
{{Chess diagram|=
|tleft
|
|=
8 |rd|nd|bd|qd|kd|bd|nd|rd|=
7 |pd|pd|pd|pd|pd|pd|pd|pd|=
6 | | | | | | | | |=
5 | | | | | | | | |=
4 | | | | | | | | |=
3 | | | | | | | | |=
2 |pl|pl|pl|pl|pl|pl|pl|pl|=
1 |rl|nl|bl|ql|kl|bl|nl|rl|=
a b c d e f g h
|Initial position}}
In the initial position each side has eight pawns, two rooks, two knights, two bishops, a queen and a king arranged as shown in the diagram below. Note that the only pieces on either side which can initially move are the pawns and knights.
Beginners often set up the board incorrectly; it is a complex position to remember. The following mnemonics may help you remember where the pieces go.
*'''White on the Right''' It is important that the bottom-right-hand square is light-colored.
*'''Knights live in castles''' One knight is placed next to each rook (rooks look like the towers of a castle, and are sometimes [incorrectly] even ''called'' castles.)
*'''Queens on their color''' OR '''The dress matches the shoes''' The White Queen goes on a White Square, Black Queen goes on a Black Square
*'''Bishops are advisers to the Royalty''' Bishops surround the King and Queen.
*'''White King on the Right''' From the White Player's perspective, both Kings are on the right, and from the Black Player's perspective, the Kings are on the left.
If the ranks and files are printed on the board, the following rules may be helpful:
* White's pieces should be placed on the 1st and 2nd rank, and Black's pieces should be placed on the 7th and 8th rank.
* The Queens should be positioned on the d-file (''D for Dame'').
{{-}}
==Conclusion of the game==
Play continues to alternate between White and Black until one of the following outcomes is reached:
===Winning and losing===
*One player's king is checkmated. The game is lost by that player.
*In a competitive game, one player runs out of time. The game is lost by that player (with two important exceptions, see draws below).
*One player resigns, which is equivalent to quitting the game. A player may resign on either his or his opponent's turn. Resignation is often symbolized by the resigning player tipping over his king.
===Draws===
*The player to move has been ''stalemated'', meaning that he has no legal move and is not in check.
*Both players agree to draw the game. Either player may offer a draw to the opponent upon completion of his move. If the offer is accepted, the game is drawn. If the offer is rejected, the game will continue.
*A player can claim a draw with if any of the following are true:
**If the exact same position occurs or will occur three times with the same player to move, the player on move may claim a draw by threefold repetition. Note that the same set of moves must be available for each player (including castling and ''en passant'').
**No pawn has moved and no piece was captured in the last 50 moves.
**The opponent does not have sufficient material to checkmate him by any legal sequence of moves.
**Both players have run out of time in a competitive game.
**One player has run out of time in a competitive game, but the opponent does not have sufficient pieces to checkmate him by any legal sequence of moves.
{{Chess diagram|=
|tleft
|
|=
8 | | | | | | | |kd|=
7 | | | | | | | | |=
6 | |pd| | | |kl|ql| |=
5 | |pl| | | | | | |=
4 | | | | | | | | |=
3 | | | | | | | | |=
2 | | | | | | | | |=
1 | | | | | | | | |=
a b c d e f g h
|Black (to move) is stalemated}}
{{Chess diagram|=
|tleft
|
|=
8 | | | | | | | |ql|=
7 | | | | | | | | |=
6 | | | | | | | | |=
5 | | | | | | | | |=
4 | | | | | | | | |=
3 | | | | | | |pl|pl|=
2 | | | | | |rd|kl| |=
1 | | | | |kd|xo|xx|xx|=
a b c d e f g h
|Threefold repetition}}
{{Chess diagram|=
|tleft
|
|=
8 | | | | |kd|bd| | |=
7 | | | | | | | | |=
6 | | | | | | | | |=
5 | | | | | | | | |=
4 | | | | | | | | |=
3 | | | | | | | | |=
2 | | | | | | | | |=
1 | | | | |kl|bl|nl| |=
a b c d e f g h
|50 move rule}}
{{Chess diagram|=
|tleft
|
|=
8 | | | | | | | | |=
7 | | | | | | | | |=
6 | | | | | | | | |=
5 | | | | | |kd| | |=
4 | | | | | |nl| | |=
3 | | | | | |kl| | |=
2 | | | | | | | | |=
1 | | | | | | | | |=
a b c d e f g h
|Insufficient mating material}}
{{-}}
The diagrams above shows example of some of the draw rules:
* Stalemate: Since black can not move the pawn or the king without placing himself in self-check, the game results in a stalemate.
* Threefold repetition: Black has checked white, and can continue to check white forever by moving the rook back and forth between f2 and f1. The same position will thus occur again and again.
* 50 move rule: White has material advantage and enough material to mate, but if black plays correctly black will use his bishop to avoid being mated forever.
* Insufficient mating material: White has material advantage, but not enough material to mate.
==Chess Etiquette==
Generally, chess games at tournaments are conducted under the following rules:
*'''Touch-move rule''' - If a player touches his own piece, he must move it, and if a player touches an opponents piece, he must capture it (unless the capture is not possible). If he releases a piece on a square, the move is completed and can't be taken back. If you need to center a piece on its square, it is traditional to say ''j'adoube'' (I adjust).
*'''Be silent when your opponent is on the move''' - You can only adjust pieces, offer a draw, or claim a draw when it is their turn to move.
A friendly game may be played in any way that is mutually agreeable. Generally it is considerate to avoid distracting your opponent.
==Glossary==
<!--It's just a coincidence that these are in alphabetical order. If you would like to add terms, please put them in such an order so that it would make sense only by reading straight down with more basic series of terms at the top. Terms for which it is unnecessary to read other definitions, please place them at the bottom in alphabetical order.-->
*'''Capture''' - To move one's piece into the same square as one of one's opponent's pieces. The opponent's piece is removed from the board.
*'''Check''' - The king is 'in check' when it is being attacked by an enemy piece.
*'''Checkmate''' - The player whose turn it is can make no legal move to get his king out of check.
*'''Stalemate''' - The player whose turn it is can make no legal move, but the king is not in check.
<noinclude>{{Chess/Navigation|Arranging The Board|Notating The Game}}</noinclude>
[[es:Manual de Ajedrez/Iniciación del juego]]
[[it:Scacchi/Le regole del gioco]]
[[ms:Catur/Bermain]]
[[nl:Schaken/Spelregels]]
[[pt:Xadrez/Regras]]
[[ro:Şah/Reguli de bază]]
[[zh:国际象棋/规则]]
7qf36nmy76j71dabj9f8lbllnxlf0vd
OpenSSH/Cookbook/Public Key Authentication
0
51866
4676709
4675819
2026-10-18T08:53:09Z
Larsnooden
430753
grammar
4676709
wikitext
text/x-wiki
<noinclude>{{simple chapter navigation|previous=File Transfer with SFTP|next=Certificate-based Authentication}}</noinclude>
Authentication keys can improve efficiency, if done properly. As a bonus advantage, the passphrase and private key never leave the client<ref name="RFC4252§7">{{cite web |url=https://tools.ietf.org/html/rfc4252#section-7 |title=The Secure Shell (SSH) Authentication Protocol |publisher=IETF |year=2006| accessdate=2015-05-06}}</ref>. Key-based authentication is generally recommended for outward facing systems so that password authentication can be turned off.
==Key-based authentication==
OpenSSH can use public key cryptography for authentication. In public key cryptography, encryption and decryption are asymmetric. The keys are used in pairs, a public key to encrypt and a private key to decrypt. The [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)] utility can make RSA, Ed25519, MLDSA44-Ed25519, ECDSA, Ed25519-SK, or ECDSA-SK keys for authenticating. Even though DSA keys can still be made, being exactly 1024 bits in size, they are no longer recommended and should be avoided. RSA keys are allowed to vary from 1024 bits on up. The default is now 3072. However, there is only limited benefit after 2048 bits and that makes elliptic curve algorithms preferable. ECDSA can be 256, 384 or 521 bits in size. Ed25519, Ed25519-SK, and ECDSA-SK keys each have a fixed length of 256 bits. Shorter keys are faster, but less secure. Longer keys are much slower to work with but provide better protection, up to a point.
Keys can be named to help remember what they are for. Because the key files can be named anything it is possible to have many keys each named for different services or tasks. The comment field at the end of the public key can also be useful in helping to keep the keys sorted, if you have many of them or use them infrequently.
The process of key-based authentication uses these keys to make a couple of exchanges using the keys to encrypt and decrypt some short message. At the start, a copy of the client's public key is stored on the server and the client's private key is on the client, both stay where they are. The private key never leaves the client. As the client first contacts the server, the server responds by using the client's public key to encrypt a random number and return that encrypted random number as a challenge to the client. The client responds to the challenge by using the matching private key to decrypt the message and extract the random number. The client then makes an MD5 hash of the session ID along with the random number from the challenge and returns that hash to the server. The server then makes its own hash of the session ID and the random number and compares that to the hash returned by the client. If there is a match, the login is allowed. If there is not a match, then the next of any public keys on the server registered as belonging to the same account is tried until either a match is found or all the keys have been tried or the maximum number of failures has been reached. <ref name="How Key Challenges Work">{{cite web | url=http://www.unixwiz.net/techtips/ssh-agent-forwarding.html#chal | title=An Illustrated Guide to SSH Agent Forwarding | author=Steve Friedl | date=2006-02-22 | accessdate=2013-04-27 | publisher=Unixwiz.net }}</ref>
When an agent is used on the client side to manage authentication, the process is similar. The difference is that [http://man.openbsd.org/ssh.1 ssh(1)] passes the challenge off to the agent which then calculates the response and passes it back to [http://man.openbsd.org/ssh.1 ssh(1)] which then passes the agent's response back to the server.
===Basics of Public Key Authentication===
A matching pair of SSH keys, one public and one private, is needed for public key authentication. The [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)] utility is used to make such a key pair. Out of that pair the public key must be properly stored on the remote host before using key-based authentication. The default location for it is the designated '''authorized_keys''' file, usually one such file resides inside each remote user account. The private key stays stored safely on the client.
Once the keys have been prepared and the remote account configured, they can be used for login. Before starting, there must already be an account on the remote system. The details of doing that are outside of the scope of this book. However, once you have a remote account, there are four steps to set up key-based authentication for it:
'''1''') Prepare a directory on the client (say a laptop or a desktop) where the keys will stay, if there isn't one already. For example, if the '''.ssh''' directory is not on the client machine, create it and set the permissions correctly. It is important that it not be writable by any account except its owner:
<syntaxhighlight lang="shell-session">
$ mkdir ~/.ssh/
$ chmod 0700 ~/.ssh/
</syntaxhighlight>
'''2''') Create a key pair inside the designated directory. The example here creates an Ed25519 key pair in the directory '''~/.ssh'''. The option '''-t''' decides the key type and the option '''-f''' assigns the key file a name. It is good to give key files descriptive names, especially if larger numbers of keys are managed. Below, the public key will be named '''fred_example_org_ed25519.pub''' and the private key will be called '''fred_example_org_ed25519'''. Lastly, the '''-C''' option is used to embed a descriptive comment inside the private key itself. The comment is useful for figuring out later what the key is for when one has many keys or a lot of time has passed or both.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -t ed25519 -f ~/.ssh/fred_example_org_ed25519 \
-C "from fred's laptop to server.example.org"
</syntaxhighlight>
Be sure to enter a solid passphrase so that the private key gets encrypted using 128-bit AES. That way the private key can only be read or used when the passphrase is given.
Ed25519, Ed25519-SK, and ECDSA-SK keys have fixed lengths. For RSA and ECDSA keys, the '''-b''' option sets the number of bits used for those kinds of keys.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -o -b 4096 -t rsa -f ~/.ssh/fred_example_org_rsa \
-C "from fred's laptop to server.example.org"
</syntaxhighlight>
Since 6.5 a new private key format is available using a [http://man.openbsd.org/bcrypt.3 bcrypt(3)] key derivative function (KDF) to better protect keys at rest. This new format is always used for Ed25519 keys, and sometime in the future will be the default for all keys. But for right now it may be requested when generating or saving existing keys of other types via the '''-o''' option in [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)].
Details of the new format are found in the source code in the file '''PROTOCOL.key'''.
'''3''') Get the keys to the right places. Transfer only the public key to remote machine. The following assume the default locations for the authorized keys as specified in the server's configuration file by the '''AuthorizedKeysFile''' directive.
'''3a''') If the utility <code>ssh-copy-id</code> exists, and if password authentication is allowed, then it can be used to put the public key into place on the remote system. The ''.pub'' is optional here, the script will figure it out if omitted.
<syntaxhighlight lang="shell-session">
$ ssh-copy-id -i ~/.ssh/fred_example_org_ed25519 fred@server.example.org
</syntaxhighlight>
If that script was successful in transferring the public key, then go on to step 4 below and test the key. If not, then try transferring the public key manually as described in step 3b next.
'''3b''') Or the public key can be put in place manually on the remote machine. For that the remote '''.ssh''' directory is needed, and within that a special file to store the public keys, the default file name is '''authorized_keys'''. If either the '''authorized_keys''' file or '''.ssh''' directory do not exist on the remote machine, they need to be created.
<syntaxhighlight lang="shell-session">
$ mkdir -m 700 ~/.ssh/
$ touch ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys
$ nano -w ~/.ssh/authorized_keys
</syntaxhighlight>
Then any editor which does not wrap long lines can be used to add the public key. However the '''authorized_keys''' file is edited to add the key, the key itself must be in the file whole and unbroken on a single line. For example, [http://linux.die.net/man/1/nano nano(1)] can be started with the '''-w''' option to prevent wrapping of long lines. (Another way to set line wrapping permanently in [http://linux.die.net/man/1/nano nano(1)] is by editing [http://linux.die.net/man/5/nanorc nanorc(5)].)
If the key pair is not already on the client, transfer both the public and private keys there. It is usually best to keep both the public and private keys together in the directory '''~/.ssh/''', though the public key is not always needed on the client after this step and could even be regenerated if it is ever needed again.
'''4''') Test the keys
While remaining logged in via the first terminal, use the client system to open another window and in it start another SSH session and try authenticating to the remote machine from the client using the private key.
<syntaxhighlight lang="shell-session">
$ ssh -i ~/.ssh/fred_example_org_ed25519 -l fred server.example.org
</syntaxhighlight>
The option '''-i''' tells [http://man.openbsd.org/ssh.1 ssh(1)] which private key to try.
Only after verifying that the key-based authentication works should you close the original window.
It is possible to make permanent shortcuts on the client using [http://man.openbsd.org/ssh_config.5 ssh_config(5)], explained further below, once key-based authentication is working. In particular, see the '''IdentityFile''', '''IdentitiesOnly''', and '''AddKeysToAgent''' configuration directives, to name three.
It is also a good idea to turn off password authentication, if and only if key-based authentication is setup for all the necessary remote accounts.
➥ '''Troubleshooting of Key-based Authentication''':
If the server refuses to accept the key and fails over to the next authentication method (e.g.: "Server refused our key"), then there are several possible mistakes to look for on the server side.
One of the most common errors is that the file and directory permissions are wrong. The authorized keys file must be owned by the user in question and not be group writable. Nor may the key file's directory be group or world writable.
<syntaxhighlight lang="shell-session">
$ chmod u=rwx,g=rx,o= ~/.ssh
$ chmod u=rw,g=,o= ~/.ssh/authorized_keys
</syntaxhighlight>
Another mistake that can happen is if the key inside the '''authorized_keys''' file on the remote host is broken by line breaks or has other whitespace in the middle. That can be fixed by joining up the lines and removing the spaces or by recopying the key more carefully.
And, though it should go without saying, the halves of the key pair need to match. The public key on the server needs to match the private key held on the client. If the public key is lost, then a new one can be generated with the '''-y''' option, but not the other way around. If the private key is lost, then the public key should be erased as it is no longer of any use. If many keys are in use for an account, it might be a good idea to add comments to them. On the client, it can be a good idea to know which server the key is for, either through the file name itself or through the comment field. A comment can be added using the '''-C''' option.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -t ed25519 -f ~/.ssh/fred_example_org_ed25519 -C "web server mirror"
</syntaxhighlight>
On the server, it can be important to annotate which client they key is from if there is more than one public key there in an account. There the comment can be added to the authorized keys file on the server in the last column if a comment does not already exist. Again, the format of the authorized keys file is given in the manual page for [http://man.openbsd.org/sshd.8 sshd(8)] in the section "AUTHORIZED_KEYS FILE FORMAT". If the keys are not labeled they can be hard to match, which might or might not be what you want.
====Associating Keys Permanently with a Server====
A key can be specified at run time, but to save retyping the same paths again and again, the '''Host''' directive in [http://man.openbsd.org/ssh_config.5 ssh_config(5)] can apply specific settings to a target host. In this case, by changing '''~/.ssh/config''' it is possible to assign particular keys to be tried automatically whenever making a connection to that specific host. After adding the following lines to '''~/.ssh/config''', all that's needed is to type <code>ssh ''web1''</code> to connect with the key for that server.
<syntaxhighlight lang="apache" line="1">
Host web1
Hostname 198.51.100.32
IdentitiesOnly yes
IdentityFile /home/fred/.ssh/web_key_ed25519
</syntaxhighlight>
The '''~/.ssh/config''' below uses different keys for ''server'' versus ''server.example.org'', regardless whether they resolve to the same machine. This is possible because the host name argument given to [http://man.openbsd.org/ssh.1 ssh(1)] is not converted to a canonicalized host name before matching.
<syntaxhighlight lang="apache" line="1">
Host server
IdentitiesOnly yes
IdentityFile /home/fred/.ssh/key_a_ed25519
Host server.example.org
IdentitiesOnly yes
IdentityFile /home/fred/.ssh/key_b_ed25519
</syntaxhighlight>
In this example the shorter name is tried first, but of course less ambiguous shortcuts can be made instead. The configuration file gets parsed on a first-match basis. So the most specific rules go at the beginning and the most general rules go at the end.
====Encrypted Home Directories====
When using encrypted home directories the keys must be stored in an unencrypted directory. That means somewhere outside the actual home directory which means [http://man.openbsd.org/sshd.8 sshd(8)] needs to be configured appropriately to find the keys in that special location.
Here is one method for solving the access problem. Each user is given a subdirectory under '''/etc/ssh/keys/''' which they can then use for storing their '''authorized_keys''' file. This is set in the server's configuration file '''/etc/ssh/sshd_config'''
<syntaxhighlight lang="apache" line="1">
AuthorizedKeysFile /etc/ssh/keys/%u/authorized_keys
</syntaxhighlight>
Setting a special location for the keys opens up more possibilities as to how the keys can be managed and multiple key file locations can be specified if they are separated by whitespace. The user does not have to have write permissions for the '''authorized_keys''' file. Only read permission is needed to be able to log in. But if the user is allowed to add, remove, or change their keys, then they will need write access to the file to do that.
One symptom of having an encrypted home directory is that key-based authentication only works when you are already logged into the same account, but fails when trying to make the first connection and log in for the first time.
Sometimes it is also necessary to add a script or call a program from '''/etc/ssh/sshrc''' immediately after authentication to decrypt the home directory.
====Passwordless Login====
One solution for passwordless logins is to still have a passphrase and work with an authentication agent in conjunction with a single-purpose key. Most desktop environments launch an SSH agent automatically these days. It will be visible in the '''SSH_AUTH_SOCK''' environment variable if it is. On accounts with an agent, [http://man.openbsd.org/ssh-add.1 ssh-add(1)] can load private keys into an available agent.
<syntaxhighlight lang="shell-session">
$ ssh-add ~/.ssh/fred_example_org_ed25519
</syntaxhighlight>
Thereafter, the client will automatically check the agent for the key when appropriate. If there are many keys in the agent, it will become necessary to set '''IdentitiesOnly'''. See the above section on using '''~/.ssh/config''' for that. See [[OpenSSH/Cookbook/Public_Key_Authentication#Key-based_Authentication_Using_an_Agent|Key-based Authentication Using an Agent]] below.
Another, riskier, way of allowing passwordless logins is to follow the steps above, but simply do not enter a passphrase when asked for one while creating the key. Note that using keys that lack a passphrase is very risky, so the key files should be very well protected and kept track of, and ideally locked down with a '''command=''' option or '''ForceCommand''' directive on the server. That includes those keys which will only be used as single-purpose keys as described below.
Timely key rotation becomes especially important. In general, it is not a good idea to make a key without a passphrase.
====Requiring Both Keys and a Password====
While users should have strong passphrases for their keys, there is no way to enforce or verify that. Indeed, since neither the private key nor its the passphrase ever leave the client machine there is nothing that the server can do to have any influence over that. Instead, it is possible to require both a key and a password. Starting with OpenSSH 6.2, it is possible for the server to require multiple authentication methods for login using the '''AuthenticationMethods''' directive.
<syntaxhighlight lang="apache" line="1">
AuthenticationMethods publickey,password
</syntaxhighlight>
This example from [http://man.openbsd.org/sshd_config.5 sshd_config(5)] requires that users first authenticate using a key and it only queries for a password if the key succeeds. Thus with that configuration it is not possible to get to the system password prompt without first authenticating with a valid key. Changing the order of the arguments changes the order of the authentication methods.
====Requiring Two or More Keys====
Since OpenSSH 6.8, the server now remembers which public keys have been used for authentication and refuses to accept previously-used keys. This allows a set up requiring that users authenticate using two different public keys, maybe one in the file system and the other in a hardware token.
<syntaxhighlight lang="apache" line="1">
AuthenticationMethods publickey,publickey
</syntaxhighlight>
The '''AuthenticationMethods''' directive, whether for keys or passwords, can also be set on the server under a '''Match''' directive to apply only to certain groups or situations.
====Requiring Certain Key Types For Authentication====
Also since OpenSSH 6.8, the '''PubkeyAcceptedKeyTypes''' directive, later changed to '''PubkeyAcceptedAlgorithms''', can specify which key algorithms are accepted for authentication. Those not in the comma-separated pattern list are not allowed.
<syntaxhighlight lang="apache" line="1">
PubkeyAcceptedAlgorithms ssh-ed25519*,ssh-rsa*,ecdsa-sha2*,sk-ssh-ed25519*,sk-ecdsa-sha2*
</syntaxhighlight>
Either the actual key types or a pattern can be in the list. Spaces are not allowed in the pattern list. The exact list of key types supported for authentication can be found by the '''-Q''' option using the client. The following two lines are equivalent.
<syntaxhighlight lang="shell-session">
$ ssh -Q key-sig | sort
$ ssh -Q PubkeyAcceptedAlgorithms | sort
</syntaxhighlight>
For host-based authentication, it is the '''HostbasedAcceptedAlgorithms''' directive which determines the key types which are allowed for authentication.
===Key-based Authentication Using the AuthorizedKeysCommand Directive===
It is possible to use a program or script to look up public keys rather than keeping them in a static file or files. Any command called by the '''AuthorizedKeysCommand''' directive needs to either produce a syntactically correct public key while returning the exit code for a successful run or else return the exit code for failure. The string sent to '''stdout''' will then be processed as part of the authentication work flow.
Here is a shell script<ref name="janpietmens">{{cite web |url=https://jpmens.net/2025/03/25/authorizedkeyscommand-in-sshd/ |title=SSH keys from a command: sshd's AuthorizedKeysCommand directive |accessdate=2025-04-04 |date=2025-03-25 | author=Jan-Piet Mens }}</ref> at its simplest, without constraints, demonstrating a public key lookup:
<syntaxhighlight lang="shell">
#!/bin/sh
echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKs/UouletvojgB1YeRZ4MY6iRblQ2ERDuNhQO4tOvdL"
exit 0
</syntaxhighlight>
For authentication to succeed, the script must return exit code 0 (success) after sending the syntactically correct matching public key to '''stdout'''. For the SSH daemon to even run the script in the first place, the script must have the correct file and directory permissions.
Both the '''AuthorizedKeysCommandUser''' directive and '''AuthorizedKeysCommand''' must be used together. The former designates which account the script or program use when run. If set to ''none'' or if it does not refer to a valid account then [http://man.openbsd.org/sshd sshd(8)] will just ignore the command. If '''AuthorizedKeysCommand''' is set, and '''AuthorizedKeysCommandUser''' is left empty or missing, then [http://man.openbsd.org/sshd sshd(8)] won't even run when invoked. The error will be:
<syntaxhighlight lang="text">
AuthorizedKeysCommand set without AuthorizedKeysCommandUser
</syntaxhighlight>
The '''AuthorizedKeysFile''' is always tried first when it is present in the server configuration. The '''AuthorizedKeysCommand''' directive will not even be tried when the authorized keys file can provide a relevant key first.
====A More Detailed Example Using the AuthorizedKeysCommand Directive====
By default the user name trying to log in is passed to the script when no tokens or arguments are provided. Whether or how that information is used is up to the script. The SSH daemon can also pass any combination of the tokens described in the TOKENS section of [http://man.openbsd.org/sshd_config sshd_config(5)] into the program or script being called. Furthermore, the program or script can even be a front end for a database, such as OpenLDAP, or any similar system, as long as '''stdout''' produces a public key.
Below is a more detailed example which uses a local script named '''keyfinder''' run with the account '''keys''' to look up the a public key for certain accounts. First in [http://man.openbsd.org/sshd_config sshd_config(5)] the two directives:
<syntaxhighlight lang="apache" line="1">
AuthorizedKeysCommand /usr/local/sbin/keyfinder %U
AuthorizedKeysCommandUser keys
</syntaxhighlight>
The script below is only a demonstration and a more complex program can call databases or do advanced lookups or heuristics:
<syntaxhighlight lang="shell">
#!/bin/sh
set -e
case $1 in
"1000")
echo "ssh-ed25519 AAAAC3NzaC1lZDIE5AAAAIK89...UT9hz"
;;
"1001")
echo "restrict ssh-ed25519 AAAAC3NzaC1lZDI1NTAAIBvGx...Y0zxV"
;;
"1002")
echo "command=\"/usr/libexec/sftp-server\" ssh-ed25519 AAAAC3NzaC1lZDI1TE5AIPSyY...cPTg3"
;;
*)
exit 1
;;
esac
exit 0
</syntaxhighlight>
The '''AuthorizedKeysCommand''' scripts or programs can return any correctly formatted public key to '''stdout''' for consideration in the authentication process. That includes adding constraints to the keys. Above, the account with the UID 1000 has no constraints, while the account with UID 1001 is quite constrained. Finally, the account with the UID 1002 can only access the SFTP service. See the section "AUTHORIZED_KEYS FILE FORMAT" in [http://man.openbsd.org/sshd sshd(8)] for the full set of possibilities.
===Key-based Authentication Using an Agent===
When an authentication agent, such as [http://man.openbsd.org/ssh-agent.1 ssh-agent(1)], is going to be used, it should generally be started at the beginning of a session and used to launch the login session or X-session so that the environment variables pointing to the agent and its UNIX-domain socket are passed to each subsequent shell and process. Many desktop distros do this automatically upon login or startup.
Starting an agent entails setting a pair of environment variables:
* SSH_AGENT_PID : the process id of the agent
* SSH_AUTH_SOCK : the filename and full path to the UNIX-domain socket
The various SSH and SFTP clients find these variables automatically and use them to contact the agent and try when authentication is needed. However, it is mainly SSH_AUTH_SOCK which is ever used. If the shell or desktop session was launched using [http://man.openbsd.org/ssh-agent.1 ssh-agent(1)], then these variables are already set and available. If they are not available, then it is necessary to either set the variables manually inside each shell or for each application in order to use the agent or else to point to the agent's socket using the directive '''IdentityAgent''' in the client's configuration file.
Once an agent is available, a relevant private key needs to be loaded before the agent can be used. Once in the agent the private key can then be used many times. Private keys are loaded into an agent with [http://man.openbsd.org/ssh-add.1 ssh-add(1)].
<syntaxhighlight lang="shell-session">
$ ssh-add /home/fred/.ssh/mykey_ed25519
Identity added: /home/fred/.ssh/mykey_ed25519 (/home/fred/.ssh/mykey_ed25519)
</syntaxhighlight>
Keys stay in the agent for as long as it is running unless specified otherwise. A timeout can be set either with the '''-t''' option when starting the agent itself or when actually loading the key using [http://man.openbsd.org/ssh-add.1 ssh-add(1)]. In either case, the '''-t''' option will set a timeout interval, after which the key will be purged from the agent.
<syntaxhighlight lang="shell-session">
$ ssh-add -t 1h30m /home/fred/.ssh/mykey_ed25519
Identity added: /home/fred/.ssh/mykey_ed25519 (/home/fred/.ssh/mykey_ed25519)
Lifetime set to 5400 seconds
</syntaxhighlight>
The option '''-l''' will list the fingerprints of all of the identities in the agent.
<syntaxhighlight lang="shell-session">
$ ssh-add -l
256 SHA256:77mfUupj364g1WQ+O8NM1ELj0G1QRx/pHtvzvDvDlOk mykey for task x (ED25519)
3072 SHA256:7unq90B/XjrRbucm/fqTOJu0I1vPygVkN9FgzsJdXbk myotherkey rsa for task y (RSA)
</syntaxhighlight>
It is also possible to remove individual identities from the agent using '''-d''' which will remove them one at a time if identified by file name, but only if the file name is given and without the file name of the private key to be remove, '''-d''' will fail silently. Using '''-D''' instead will remove all of them at once without needing to specify any by name.
By default [http://man.openbsd.org/ssh-add.1 ssh-add(1)] uses the agent connected via the socket named in the environment variable '''SSH_AUTH_SOCK''', if it is set. Currently, that is its only option. However, for [http://man.openbsd.org/ssh.1 ssh(1)] an alternative to using the environment variable is the client configuration directive '''IdentityAgent''' which tells the SSH clients which socket to use to communicate with the agent. If both the environment variable and the configuration directive are available at the same time, then the value in '''IdentityAgent''' takes precedence over what's in the environment variable. '''IdentityAgent''' can also be set to ''none'' to prevent the connection from trying to use any agent at all.
The client configuration directive '''AddKeysToAgent''' can also be useful in getting keys into an agent as needed. When set, it automatically loads a key into a running agent the first time the key is called for if it is not already loaded. Likewise the '''IdentitiesOnly''' directive can ensure that the relevant key is offered on the first try. Rather than typing these out whenever the client is run, they can be added to '''~/.ssh/config''' and thereby added automatically for designated host connections.
====Agent Forwarding====
Agent forwarding is one means of passing through one or more intermediate hosts. However, the '''-J''' option for '''ProxyJump''' would be a safer option. See [[OpenSSH/Cookbook/Proxies_and_Jump_Hosts#Jump_Hosts_--_Passing_Through_a_Gateway_or_Two | Passing Through a Gateway or Two]] in the section on jump hosts about that. With agent forwarding, intermediate machines forward challenges and responses back and forth between the client and the final destination. This comes with some risks but eliminates the need for using passwords or holding keys on any of these intermediate machines.
A main advantage of agent forwarding is that the private key itself is not needed on any remote machine, thus hindering unwanted file system access to it. <ref name="OpenSSH key management, Part 3">{{cite web | url=http://www.ibm.com/developerworks/library/l-keyc3/ | title=Common threads: OpenSSH key management, Part 3 | author=Daniel Robbins | publisher=IBM | date=2002-02-01 | accessdate=2013-04-27}}</ref> Another advantage is that the actual agent to which the user has authenticated does not go anywhere and is thus less susceptible to analysis.
One risk with agents is that they can be re-used to tailgate in if the permissions allow it. Keys cannot be copied this way, but authentication is possible when there are incorrect permissions. Note that disabling agent forwarding does not improve security unless users are also denied shell access, as they can always install their own forwarders.
The risks of agent forwarding can be mitigated by confirming each use of a key by adding the '''-c''' option when adding the key to the agent. This requires the SSH_ASKPASS variable be set and available to the agent process, but will generate a prompt on the host running the agent upon each use of the key by a remote system. So if passing through one or more intermediate hosts, it is usually better to instead have the SSH client use stdio forwarding with '''-W''' or '''-J'''.
On the client side agent forwarding is disabled by default and so if it is to be used it must be enabled explicitly. Put the following line in [http://man.openbsd.org/ssh_config.5 ssh_config(5)] to enable agent forwarding for a particular server:
<syntaxhighlight lang="apache" line="1">
Host gateway.example.org
ForwardAgent yes
</syntaxhighlight>
On the server side the default configuration files allow authentication agent forwarding, so to use it, nothing needs to be done there, just on the client side. However, again, it would be preferable to take a look at '''ProxyJump''' instead.
=====Old Style, Somewhat Safer SSH Agent Forwarding=====
The best way to pass through one or more intermediate hosts is to use the '''ProxyJump''' option instead of authentication agent forwarding and thereby not risking the exposure of any private keys. If authentication agent forwarding must be used, then it would be advisable in the interest of following the principle of least privilege to forward an agent containing the minimum necessary number of keys. There are several ways to solve that.
In version 8.8 and earlier a partial solution is to make a one-off, ephemeral agent to hold just the one key or keys needed for the task at hand. Another partial solution would be to set up a user-accessible service at the operating system level and then use [http://man.openbsd.org/ssh_config.5 ssh_config] for the rest.
Automatically launching an ephemeral agent unique to each session can be done by crafting either a special shell alias or function to launch a single-use agent. Either the function or the alias can be written to require confirmation for each requested signature. The following example is a function is inspired by an updated blog post by Vincent Bernat<ref name="safer-agent-forwarding">{{cite web |url=https://vincent.bernat.ch/en/blog/2020-safer-ssh-agent-forwarding |title=Safer SSH agent forwarding |author=Vincent Bernat|date=2020-04-05 |accessdate=2020-10-04}}</ref> on SSH agent forwarding:
<syntaxhighlight lang="shell-session">
$ agentssh() {
ssh-agent ssh -o AddKeysToAgent=confirm -o ForwardAgent=yes
}
</syntaxhighlight>
Note the use of [http://man.openbsd.org/ssh-agent.1 ssh-agent(1)]. When invoking that alias, the SSH client will be launched with a unique, ephemeral supporting key agent. The alias sets up a new agent, including setting the two environment variables, and then sets two client options while calling the client. This arrangement still checks with [http://man.openbsd.org/ssh_config.5 ssh_config(5)] for other options and settings. When the SSH session is finished the agent which launched it ends and goes away, thus cleaning up after itself automatically.
Another way is to rely on the client's configuration file for some of the settings. Such methods rely mostly on [http://man.openbsd.org/ssh_config.5 ssh_config(5)] but still require an independent method to launch an ephemeral agent because the OpenSSH client is already running by the time it reads the configuration file and is thus not affected by any changes to environment variables caused by the configuration file and it is through the environment variables that contain information about the agent. However, when the path to the UNIX-domain socket used to communicate with the authentication agent is decided in advance then the '''IdentityAgent''' option can point to it once the one-off agent<ref name="wikimedia_ssh_agents">{{cite web |url=https://wikitech.wikimedia.org/wiki/Managing_multiple_SSH_agents#Linux_solutions |title=Managing multiple SSH agents |publisher=Wikimedia|accessdate=2020-04-07}}</ref> is actually launched. The following uses a specific agent's pre-defined socket whenever connecting to either of two particular domains:
<syntaxhighlight lang="apache" line="1">
Host *.wikimedia.org *.wmflabs.org
User fred
IdentitiesOnly yes
IdentityFile %d/.ssh/id_cloud_01
IdentityAgent /run/user/%i/ssh-cloud-01.socket
ForwardAgent yes
AddKeysToAgent yes
</syntaxhighlight>
The '''%d''' stands for the path to the home directory and the '''%i''' stands for the user id (UID) for the current account. In some cases the '''%i''' token might also come in handy when setting the '''IdentityAgent''' option inside the configuration file. Again, be careful when forwarding agents with which keys are in the forwarded agent. See the section "TOKENS" in [http://man.openbsd.org/ssh_config.5 ssh_config(5)] for more such abbreviations.
With those configuration settings, the authentication agent must already be up and running and point to the designated socket prior to starting the SSH client for that configuration to work. Additionally, it should place the socket in a directory which is inaccessible to any other accounts. [http://man.openbsd.org/ssh-agent.1 ssh-agent(1)] must use the '''-a''' option to name the socket:
<syntaxhighlight lang="shell-session">
$ ssh-agent -a /run/user/${UID}/ssh-cloud-01.socket
</syntaxhighlight>
That agent configuration can be launched manually or via a script or service manager. However, in the interests of privacy and security in general, agent forwarding is to be avoided. The configuration directive '''ProxyJump''' is the best alternative and, on older systems, host traversal using '''ProxyCommand''' with [http://man.openbsd.org/nc.1 netcat] are preferable. Again, see the section on [[OpenSSH/Cookbook/Proxies and Jump Hosts|Proxies and Jump Hosts]] for how those methods are used.
=====New Style SSH Agent Destination Constraints=====
From 8.9 onward, [http://man.openbsd.org/ssh-agent.1 ssh-agent(1)] will allow the agent to limit which hosts they will use for authentication as specified by [http://man.openbsd.org/ssh-add.1 ssh-add(1)] using the '''-h''' option. These constraints have been added through two agent protocol extensions and a modification to the public key authentication protocol. This feature may evolve, but for now the result is such that keys for account authentication can be loaded into the agent in four ways:
* no limits on forwarding (not recommended)
* local use only, these will not get forwarded
* forwarding, but only to specific remote hosts
* forwarding to specific remote hosts via specified routes
The intent is that the restrictions fail safely so that they do not allow authentication when one or more hosts in the route lack the needed protocol features. The destinations and routes cannot be modified once the keys are loaded, but multiple routes to the same destination can be loaded and the routes can be any number of hops. If the routes need changing, then the key must be reloaded into the agent with the new route or routes.
The general default for the client is to keep keys in the agent for local use only. However, that can be enforced explicitly by adding the '''-a''' option when starting the client or else setting the '''ForwardAgent''' directive in [http://man.openbsd.org/ssh_config.5 ssh_config(5)] to 'no' in the relevant configuration block.
In order to load keys for unlimited forwarding, which is not the best idea, just add them using [http://man.openbsd.org/ssh-add.1 ssh-add(1)] as normal. Then use the '''-A''' option with the client or set the '''ForwardAgent''' directive in [http://man.openbsd.org/ssh_config.5 ssh_config(5)] to 'yes' in the relevant configuration block.
In order to limit keys for connection only to a specific remote host, or to load keys for connection to a specific remote host with forwarding via one or more intermediate hosts, use the '''-h''' option when loading keys into the agent. Here the one key may be used only to connect to the specific destination:
<syntaxhighlight lang="shell-session">
$ ssh-agent -h server.example.org server.key.ed25519
</syntaxhighlight>
If an intermediate system is passed through, the best way is to use '''ProxyJump''' which is the '''-J''' option for the SSH Client. If agent forwarding must be allowed then the tightest way is to constrain which systems may use the keys, again using the '''-h''' option.
<syntaxhighlight lang="shell-session">
$ ssh-agent -h middle.example.org -h "middle.example.org>server.example.org" server.key.ed25519
</syntaxhighlight>
Multiple steps can be included, even multiple routes. They just have to be enumerated explicitly, though patterns may still be used for the destination hosts as well as specific names. Each host in the chain must support these protocol extensions for the connection to complete.
Any keys designated for forwarding are unusable for authentication on any other hosts than those which have been explicitly identified for forwarding. These permitted hosts are identified by host key or host certificate from the '''known_hosts''' file or another file designated by the '''-H''' option when loading the key with [http://man.openbsd.org/ssh-add.1 ssh-add(1)]. If '''-H''' is not used at the time the keys are loaded into the agent, then the default known hosts file(s) will be used: '''~/.ssh/known_hosts''', '''/etc/ssh/ssh_known_hosts''', '''~/.ssh/known_hosts2''', and '''/etc/ssh/ssh_known_hosts2'''.
In the case of keys, the '''known_hosts''' list must be maintained conscientiously <ref name="ssh-agent-restrictions">{{ cite web | author=Damien Miller|url=https://www.openssh.org/agent-restrict.html | title=SSH agent restriction | publisher=OpenSSH | date=2021-12-16|accessdate=2022-03-06}}</ref>, perhaps with the help of the '''UpdateHostkeys''' and '''CanonicalizeHostname''' client configuration directives. Use of certificates requires the agent to only need to be aware of the Certificate Authority (CA).
Again, see [[OpenSSH/Cookbook/Proxies_and_Jump_Hosts#Jump_Hosts_--_Passing_Through_a_Gateway_or_Two | Passing Through a Gateway or Two]] in the section on jump hosts about a way to pass through one or more intermediate machines without needing to forward an SSH agent.
====Checking the Agent for Specific Keys====
The [http://man.openbsd.org/ssh_add ssh_add(1)] utility's '''-T''' option can test whether a specific private key is available in the agent or not by looking up the matching public key. That can be useful in a shell script.
<syntaxhighlight lang="shell">
#!/bin/sh
key=/home/fred/.ssh/some.key.ed25519.pub
if ssh-add -T ${key}; then
echo "Key ${key} Found"
else
echo "Key ${key} missing"
fi
</syntaxhighlight>
Or it could be done with an alternate syntax just as well either in a script or in an interactive shell sessions,
<syntaxhighlight lang="shell-session">
$ key=/home/fred/.ssh/some.key.ed25519.pub
$ ssh-add -T ${key} && echo "Key found" || echo "Key missing"
</syntaxhighlight>
However, if the desired result would be to add key to the agent then the '''AddKeysToAgent''' client configuration option can ensure that a specific key is added to the SSH agent upon first use during any given login session. That can be done using '''-o AddKeysToAgent=yes''' as a run-time argument, or by modifying [http://man.openbsd.org/ssh_config ssh_config(5)] as appropriate:
<syntaxhighlight lang="apache" line="1">
Host www
HostName www.example.com
IdentityFile %d/.ssh/www.ed25519
IdentitiesOnly yes
AddKeysToAgent yes
</syntaxhighlight>
With those options in the configuration file, the first time <code>ssh www</code> is run the specified key will get added to the agent and remain available.
===Key-based Authentication Using A Hardware Security Token===
While stand-alone keys have been around for a long time, it has been possible since version 8.2 to use keys backed by hardware security tokens, such as OnlyKey, Yubikey, or many others, though the FIDO2 protocol. The Universal 2nd Factor (U2F) authentication is supported directly in OpenSSH through FIDO2 and does not need third party software. At the moment there are two types of hardware backed keys, ECDSA-SK and Ed25519-SK, but only the latest hardware tokens support the latter. If the key Ed25519-SK format is not supported by the token's firmware, then the following error message will be presented when attempts to use that key type are made:
<syntaxhighlight lang="text">
Key enrollment failed: invalid format
</syntaxhighlight>
If supported, either key type can be created with [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)]. The steps are almost identical to creating normal keys but the token must be available to the system (plugged in) first. Then if called for, the token's PIN must be entered and the token touched or otherwise activated. After that, the key creation proceeds as normal. Mind the key type as specified by the '''-t''' option.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -t ed25519-sk -f /home/fred/.ssh/server.ed25519-sk -C "web server for fred"
Generating public/private ed25519-sk key pair.
You may need to touch your authenticator to authorize key generation.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/fred/.ssh/server.ed25519-sk
Your public key has been saved in /home/fred/.ssh/server.ed25519-sk.pub
The key fingerprint is:
SHA256:41wVVDnKJ9gKr2Sj4CFuYMhcNvYebZ6zq0PWyP4rRDo web server
The key's randomart image is:
+[ED25519-SK 256]-+
| .o... |
| .o |
| +.. . |
| = . . ..= . |
|+ + * + So.. o |
|o+.EoO *+oo |
|.o oBo+++o |
| o .=.+. |
| . .=== |
+----[SHA256]-----+
</syntaxhighlight>
Once created, the public and private key files get handled like with any other type of key. But when authenticating, the hardware token must be present and activated when called for.
<syntaxhighlight lang="shell-session">
$ ssh -i /home/fred/.ssh/server.ed25519-sk server.example.org
Enter passphrase for key '/home/fred/.ssh/server.ed25519-sk':
Confirm user presence for key ED25519-SK SHA256:41wVVDnKJ9gKr2Sj4CFuYMhcNvYebZ6zq0PWyP4rRDo
</syntaxhighlight>
The resulting private key file is not actually the key itself but instead a "key handle" which is used by the hardware security token to derive the real private key on demand at the time it is actually used<ref name="OpenBSD_tech_U2F_FIDO">{{cite web |url=https://marc.info/?l=openbsd-tech&m=157376801917387&w=2 |title=OpenSSH U2F/FIDO support in base
|publisher=OpenBSD-Tech Mailing List | date=2019-11-14
|accessdate=2021-03-24}}</ref>. As a result, the hardware-backed private key file is useless without the accompanying hardware token. This also means that these key files are not portable across hardware tokens, say when having multiple tokens in reserve or as backup, even when used by the same account. So when multiple hardware tokens are in use, different key pairs must be generated for each token.
====Hardware Security Token Resident Private Key====
It is possible to store the private key within the token itself, but for the moment it cannot be used directly from inside the token and must first be saved as a file. Also, the key can only be loaded into the FIDO authenticator at the time of creation using the '''-O resident''' option with [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)]. Otherwise, the process is the same as above.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -O resident -t ed25519-sk -f /home/fred/.ssh/server.ed25519-sk -C "web server for fred"
. . .
</syntaxhighlight>
When needed, the resident key can be extracted from the FIDO2 hardware token and saved into a file using the '''-K''' option. At this stage a passphrase can be added to the file, but no passphrase is kept within the token itself, only an optional PIN protects the key there.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -K
Enter PIN for authenticator:
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Saved ED25519-SK key to id_ed25519_sk_rk
$ mv -i id_ed25519_sk_rk /home/fred/.ssh/server.ed25519-sk
</syntaxhighlight>
Since the output file name is fixed, any pre-existing file with that name can get overwritten but there will be a warning first. However, it is not recommended to keep the key on the hardware token because it provides more protection when kept separately.
==Single-purpose Keys==
Tailored single-purpose keys can eliminate use of remote root logins for many administrative activities. A finely tailored '''sudoers''' is needed along with an unprivileged account. When done right, it gives just enough access to get the job done, following the security principle of Least Privilege.
Single-purpose keys are accompanied by use of either the '''ForceCommand''' directive in [http://man.openbsd.org/ssh_config.5 sshd_config(5)] or the '''command="..."''' directive inside the '''authorized_keys''' file. The method is to generate a new key pair, transfer the public key to '''authorized-keys''' on the remote system, and then prepend the appropriate command or script there to the line with the key.
<syntaxhighlight lang="shell-session">
$ grep '^command' ~/.ssh/authorized_keys
command="/usr/local/bin/somescript.sh" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEcgdzDvSebOEjuegEx4W1I/aA7MM3owHfMr9yg2WH8H
</syntaxhighlight>
The '''command="..."''' directive inserted there overrides everything else and ensures that when logging in with just that key only the script '''/usr/local/bin/somescript.sh''' is run. If it is necessary to pass parameters to the script, have a look at the contents of the '''SSH_ORIGINAL_COMMAND''' environment variable and use it in a case statement. Do not ever trust the contents of that variable nor use the contents directly, always indirectly.
Single-purpose keys are useful for allowing only a tunnel and nothing more. The following key will only echo some text and then exit, unless used non-interactively with the '''-N''' option.
<syntaxhighlight lang="shell-session">
$ grep '^command' ~/.ssh/authorized_keys
command="/bin/echo do-not-send-commands" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBzTIWCaILN3tHx5WW+PMVDc7DfPM9xYNY61JgFmBGrA
</syntaxhighlight>
No matter what the user tries while logging in with that key, the session will only echo the given text and then exits. Using the '''-N''' option disables running the remote program, allowing the connection to stay open, allowing a tunnel.
<syntaxhighlight lang="shell-session">
$ ssh -L 3306:localhost:3306 \
-i ~/.ssh/tunnel_ed25519 \
-N \
-l fred \
server.example.com
</syntaxhighlight>
That creates a tunnel and stays connected despite a key configuration which would close an interactive session. See also the '''-n''' or '''-f''' option for [http://man.openbsd.org/ssh.1 ssh(1)].
===Single-purpose Keys to Avoid Remote Root Access===
The easy way is to write a short shell script, place it '''/usr/local/bin/''', and then configure '''sudoers''' to allow the otherwise unprivileged account to run just that script and only that script.
<syntaxhighlight lang="apache" line="1">
%wheel ALL=(root:root) NOPASSWD: /usr/sbin/service httpd stop
%wheel ALL=(root:root) NOPASSWD: /usr/sbin/service httpd start
</syntaxhighlight>
Then the key calls the script using '''command="..."''' inside '''authorized_keys'''. Here the one key starts the web server, the other stops the web server.
<syntaxhighlight lang="shell-session">
$ grep '^command' ~/.ssh/authorized_keys
command="/usr/bin/sudo /usr/sbin/service httpd stop" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEcgdzDvSebOEjuegEx4W1I/aA7MM3owHfMr9yg2WH8H
command="/usr/bin/sudo /usr/sbin/service httpd start" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMidyqZ6OCvbWqA8Zn+FjhpYE6NoWSxVjFnFUk6MrNZ4
</syntaxhighlight>
Complicated programs like [http://linux.die.net/man/1/rsync rsync(1)], [http://man.openbsd.org/tar.1 tar(1)], [http://linux.die.net/man/1/mysqldump mysqldump(1)], and so on require an advanced approach when building a single-purpose key. For them, the '''-v''' option can show exactly what is being passed to the server so that '''sudoers''' can be set up correctly. That way they can be restricted to only access designated parts of the file system. For example, here is what <code>ssh -v</code> shows from one particular usage of [http://linux.die.net/man/1/rsync rsync(1)], note the "Sending command" line:
<syntaxhighlight lang="shell-session">
$ rsync -e 'ssh -v' fred@server.example.org:/etc/ ./backup/etc/
. . .
debug1: Sending command: rsync --server --sender -e.LsfxC . /etc/
. . .
</syntaxhighlight>
That output can then be added to '''sudoers''' so that the key can do only that function.
<syntaxhighlight lang="shell-session">
%backup ALL=(root:root) NOPASSWD: /usr/bin/rsync --server --sender -e.LsfxC . /etc/
</syntaxhighlight>
Then to tie it all together, the account "backup" needs a key:
<syntaxhighlight lang="shell-session">
$ grep '^command' ~/.ssh/authorized_keys
command="/usr/bin/rsync --server --sender -e.LsfxC . /etc/" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMm0rs4eY8djqBb3dIEgbQ8lmdlxb9IAEuX/qFCTxFgb
</syntaxhighlight>
Many of these programs have a '''--dry-run''' or equivalent option. Remember to use it when figuring out the right settings.
===Read-only Access to Keys===
In some cases it is necessary to prevent accounts from being able to changing their own authentication keys. However, such situations may be a better case for using certificates. However, if done with keys it is accomplished by putting the key file in an external directory where the user has read-only access, both to the directory and to the key file. Then the '''AuthorizedKeysFile''' directive assigns where [http://man.openbsd.org/sshd.8 sshd(8)] looks for the keys and can point to a secured location for the keys instead of the default location.
A good alternate location could be a new directory '''/etc/ssh/authorized_keys''' which could store the selected accounts' key files there. The change can be made to apply to only a group of accounts by putting the settings under a '''Match''' directive. The default location for keys on most systems is usually '''~/.ssh/authorized_keys'''.
<syntaxhighlight lang="apache" line="1">
Match Group sftpusers
AuthorizedKeysFile /etc/ssh/authorized_keys/%u
</syntaxhighlight>
Then the permissions there would allow the keys to be read but not written:
<syntaxhighlight lang="shell-session">
$ ls -dhln /etc/ssh/
drwxr-x--x 3 0 0 4.0K Mar 30 22:16 /etc/ssh/authorized_keys/
$ ls -dhln /etc/ssh/*.pub
-rw-r--r-- 1 0 0 173 Mar 23 13:34 /etc/ssh/fred
-rw-r--r-- 1 0 0 93 Mar 23 13:34 /etc/ssh/user1
-rw-r--r-- 1 0 0 565 Mar 23 13:34 /etc/ssh/user2
. . .
</syntaxhighlight>
The keys could even be within subdirectories, though the same restrictions apply regarding permissions and ownership.
For chrooted SFTP, the method is the same to keep the key files out of reach of the accounts:
<syntaxhighlight lang="apache" line="1">
Match Group sftpusers
ChrootDirectory /home
ForceCommand internal-sftp -d %u
AuthorizedKeysFile /etc/ssh/authorized_keys/%u
</syntaxhighlight>
Of course a '''Match''' directive is not essential. The settings could be made to apply to all accounts by putting the directive in the main part of the server configuration file instead.
==Mark Public Keys as Revoked==
Keys can be revoked. Keys that have been revoked can be stored in '''/etc/ssh/revoked_keys''', a file specified in [http://man.openbsd.org/ssh_config.5 sshd_config(5)] using the directive '''RevokedKeys''', so that [http://man.openbsd.org/sshd.8 sshd(8)] will prevent attempts to log in with them. No warning or error on the client side will be given if a revoked key is tried. Authentication will simply progress to the next key or method.
The revoked keys file should contain a list of public keys, one per line, that have been revoked and can no longer be used to connect to the server. The key cannot contain any extras, such as [[OpenSSH/Client_Configuration_Files#Available_key_login_options | login options]] or it will be ignored. If one of the revoked keys is tried during a login attempt, the server will simply ignore it and move on to the next authentication method. An entry will be made in the logs of the attempt, including the key's fingerprint. See the section on [[OpenSSH/Logging_and_Troubleshooting | logging]] for a little more on that.
<syntaxhighlight lang="apache" line="1">
RevokedKeys /etc/ssh/revoked_keys
</syntaxhighlight>
The '''RevokedKeys''' configuration directive is not set in [http://man.openbsd.org/ssh_config.5 sshd_config(5)] by default. It must be set explicitly if it is to be used. This is another situation that might be better fulfilled through using certificate since a validity interval can be set in any combination of seconds, minutes, hours, days, or weeks can be set for certificates while keys are valid indefinitely.
===Key Revocation Lists===
A Key Revocation List (KRL) is a compact, binary form of representing revoked keys and certificates. In order to use a KRL, the server's configuration file must point to a valid list using the '''RevokedKeys''' directive. KRLs themselves are generated with [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)] and can be created from scratch or edited in place. Here a new one is made, populated with a single public key:
<syntaxhighlight lang="shell-session">
$ ssh-keygen -k -f /etc/ssh/revoked_keys -z 1 ~/.ssh/old_key_rsa.pub
</syntaxhighlight>
Here an existing KRL is updated by adding the '''-u''' option:
<syntaxhighlight lang="shell-session">
$ ssh-keygen -u -k -f /etc/ssh/revoked_keys -z 2 ~/.ssh/old_key_dsa.pub
</syntaxhighlight>
Once a KRL is in place, it is possible to test if a specific key or certificate is in the revocation list.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -Q -f /etc/ssh/revoked_keys ~/.ssh/old_key_rsa.pub
</syntaxhighlight>
Only public keys and certificates will be loaded into the KRL. Corrupt or broken keys will not be loaded and will produce an error message if tried. Like with the regular '''RevokedKeys''' list, the public key destined for the KRL cannot contain any extras like login options or it will produce an error when an attempt is made to load it into the KRL or search the KRL for it.
==Verify a Host Key by Fingerprint==
The above examples have been about using keys to authenticate the client to the server. A different context in which keys are used is when the server identifies itself to the client, which happens automatically at the beginning of each non-multiplexed session. In order for that identification to happen the client acquires a public key from the server, usually on or prior to first contact, which it can subsequently use to ensure that it is connecting to the same server again and not an impostor. The default locations for storing these acquired host keys on the client are in '''/etc/ssh/ssh_known_hosts''', if managed by the system administrator, or in '''~/.ssh/known_hosts''' if managed by the client's own account. The format of the contents is a line with a host address and its matching public key. The file is described in detail in the [http://man.openbsd.org/sshd.8 sshd(8)] manual page in the section "SSH_KNOWN_HOSTS FILE FORMAT".
When connecting for the first time to a remote host, the server's host key should be verified in order to ensure that the client is connecting to the right machine and not an impostor or anything else. Usually this verification is done by comparing the fingerprint of the server's host key rather than trying to compare the whole key itself. By default the client will show the fingerprint if the key is not already found in the '''known_hosts''' register.
<syntaxhighlight lang="shell-session">
$ ssh -l fred server.example.org
The authenticity of host 'server.example.org (192.0.32.10)' can't be established.
ECDSA key fingerprint is SHA256:LPFiMYrrCYQVsVUPzjOHv+ZjyxCHlVYJMBVFerVCP7k.
Are you sure you want to continue connecting (yes/no)?
</syntaxhighlight>
That can be compared to a fingerprint received out of band, say by post, e-mail, SMS, courier, and so on. Specifically, the example represents the key's fingerprint as a base64 encoded SHA256 checksum. That is the default style. The fingerprint can also be displayed as an MD5 hash in hexadecimal instead by passing the client's '''FingerprintHash''' configuration directive as a runtime argument or setting it in [http://man.openbsd.org/ssh_config.5 ssh_config(5)].
<syntaxhighlight lang="shell-session">
$ ssh -o FingerprintHash=md5 host.example.org
The authenticity of host 'host.example.org (192.0.32.203)' can't be established.
RSA key fingerprint is MD5:10:4a:ec:d2:f1:38:f7:ea:0a:a0:0f:17:57:ea:a6:16.
Are you sure you want to continue connecting (yes/no)?
</syntaxhighlight>
But the default in new versions is SHA256 in base64 has a lower chance of collision.
In OpenSSH 6.7 and earlier, the client showed fingerprints as a hexadecimal MD5 checksum instead a of the base64-encoded SHA256 checksum currently used:
<syntaxhighlight lang="shell-session">
$ ssh -l fred server.example.org
The authenticity of host 'server.example.org (192.0.32.10)' can't be established.
RSA key fingerprint is 4a:11:ef:d3:f2:48:f8:ea:1a:a2:0d:17:57:ea:a6:16.
Are you sure you want to continue connecting (yes/no)?
</syntaxhighlight>
Another way of comparing keys is to use the ASCII art visual host key. See further below about that.
===Downloading keys===
Even though a host’s key is usually displayed for review the first time the SSH client tries to connect, it can also be fetched on demand at any time using [http://man.openbsd.org/ssh-keyscan.1 ssh-keyscan(1)]:
<syntaxhighlight lang="shell-session">
$ ssh-keyscan server.example.org
# server.example.org:22 SSH-2.0-OpenSSH_10.6
server.example.org ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEWKepJgkC2XTG5cAr2Nyew6hOp5AjG7vi2RYFtPWqN3bo5XGuCX2d2YVyn++/2PtyMYBaKWyFpCNTT9X0F1Epg=
# server.example.org:22 SSH-2.0-OpenSSH_10.6
server.example.org ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDKyERe8k+fnsrt4JrcLD3AW0kXj90r9ybrEZuY/CTrXIqYSizO335SxGJoWrKijaRy8htuueMkmNfxxhnBPoAjul/4T/FCRGKaV0jC96xYNnKcXbnXxSLVQ0OW2EIPvQhw/TU/G3vEqtiRYGyaNcZS6xrnVv3xuPuvVC1VRKspNLEq7zfvToC0OB89X5DIbvBbHY13PjJ0NrDdX3sSA8lxPsYagBuDIvyxH0S4Z5fQHeYrdvENS5zX6LwJeMeGSOqDuD0Zb4hpKxhaGVwP5e435VcFuImbFaDPM4w71PzaSUEj+tnUA0mGDoLiCrpW3txkJszog9lN3C/nLGghFaT7ajrfH55qut81JnvdhMju9+SzxrKPJmtQZfKVLIc4whEbtFsPCdm2bstz7ROWxTJ3t/Vr8/QVm2G2aY4FHuPwo2jUQDbQA7mCV+fe1sADy2jLzGhn1TCeYvWSv5PNJAT97IrLfD3+0Uo+qJD/6CU7F8oabj1Ql2H8fPN5kGSWfkM=
# server.example.org:22 SSH-2.0-OpenSSH_10.6
server.example.org ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJo5gc4VrxVQ5apAOd7qK6UqGlLMpWOPuunjB53JBN2s
# server.example.org:22 SSH-2.0-OpenSSH_10.6
# server.example.org:22 SSH-2.0-OpenSSH_10.6
# server.example.org:22 SSH-2.0-OpenSSH_10.6
server.example.org ssh-mldsa44-ed25519 AAAAE3NzaC1tbGRzYTQ0LWVkMjU1MTkAAAVAyIw5r9FaniSYqBX0yd9vgBz5nCkebaQlMQN9N0p//Ukfn/CnZ3YtZWn6pUGjDM85/bqdL1gqah1OLfnl1eHk0qvTACrym07uKaMLoEHuakIXHbTi/ELPRoRP3F+DpEgjtYSjLc/fJiobRMgSvmLJxTUzZTStsqWAL1L9/1zuwHEngR+THpUcCSTi6KKkYcQiWGOFwpO22VdiuOg+zdQSH+9jW6eXYk1z81KU6UlHZps8zVrlqCd3FDDghgbH5U8DcGN2t6GvVfn6jFjpEk0ouj0of3/7010eRXjnv3QSbprCpMq73lAemQM+3LvTtrMBhFWNhCXhyOHfO1Yq7c8xaOwlFK78PlERjdHTvVJaCaDFDy7Pg9I+wxv+uC+W0wtzJ2S1y9XCYUgJo9yEiIGuSZdhMkYUwMnXLzQMm44hQOW153pdlHWze3kESCLg/LJf9RbUoSB43t6rghSHEiUkIi5TtCtFZ4nAGeH+wVwlB9Fwog5uZuJN1FYuuY5sSrLHJAQDUwudkdak0ifOhtPtsM/ClYr3baolQ/qi0ABYUVLKSV5b+A5DlTXa23zc7JAXm2YVfkWpOfVJG4TY81wrJoDumsd1y3XaH28/4QbADsZCE3wYsBou8ff0xKgPu8xm2K+sYSmzUbBGprArAQA0LtIDGNGqrb4JsZ1ru+viwzfSlxV7Nz7ZrSw6h+Ddq4J9A6oKXy6YS3uf1GFOtBQm6JfuyMHQEEUtYZrU4UK3C/fKHx9vjuw7YdhsL8JRgxbF14qJLFizkmVbK2e6aWEE4iCqLLLlZ0dC2peYUUqyGb9PsW7sewYzGbipzPpQ/GobRT3Obc3Gmu8P386pDGR7hmkOpFmVwIcfc431cUmZixK7CkPxzUvfaAAQkmNs/p4eNNoP0gq/xPGsV14/heULbWp/njGWk1ysjjGxP6YMwHcEZpUdSGbD05zbL0KkMtmKsr8yuJYjdVAgtH2bVAvrxXRXLgavmm97VYYq1A9rOYiQFlMrKRg6yZhT10Xt8Hukf6ySLk+fieFc3nH99YeysoA5rsfp9kdXr65GpwrBerZlf/20ZLJ7s4xaYb9SukR/8tiPt9iAVQjqPdb0MseZVrzhKo/jK44JHbHejHMoMMs7etPAS5TIjHxcJTP66B3eO9A0l2fAage2ka7ehTnHivxD3EE9KnqYBjIHDU7o6dTrX7UyQsdhax9bPKEL7OEtm6hXXfwzy4GdqGi124BclFAF0LeBSvBUgmSKIn3wfzJx/XXbt512eOn3WZk2v0TsiteH9kPEgDxVkUykawg2tleak9rTFMzYpDZRHvZD7uHWUZ8ktr2FEKWgq7/1Q2c80Z6H75VK9l1d3KZuoiWoF1s73R7ZAM+CWSrR+S5h+3AhYubDKPa/af+Lnlqe6ocVTqQPYaaRz25/cLBg6pgbdh18Ru6h3ljG2KiysyXeuoEoM5xVYtdIW7l9NeKDpGbZPAOqywXUpK+UCGjumIl7c48KCTIYcdtolnEbfVNBh0LRuftcVI+uF9cvQ0XacaNbgkYJYCjv4VR/n58EJ1b0c7tQBrVqMjDjIUKGhCMQqAeD3g75jeD60bBmVNPrq8RK+zH5VIa5eaBs3eitN98eVzd4b6UYTQd1QxLQZMrhQf4InRj39TZfGvQR5SXlLZQlweVHYkMps3IKbs3B3DCqlWCPUAnTAJBAG7HqWEYr5uEaKBawBSAx9jCQz00T+bp8KXpkOPzZCD6dfEfpHY6Rv6kmGJkiPUCb2hoX145HrS357G12+wDxKLN833oPVC0z
</syntaxhighlight>
Once a key is acquired, its fingerprint can be shown using [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)] to read from '''stdin'''. This can be done directly with a pipe.
<syntaxhighlight lang="shell-session">
$ ssh-keyscan server.example.org | ssh-keygen -l -f -
3072 SHA256:tQlw3vy325KrQibndP3gLS/YXUZjTLVA5yDFpg/Bb6I server.example.org (RSA)
256 SHA256:snnAtb/9csdy0BGhPjdg+VNWqN5bxCa/ge4C6zZ8muk server.example.org (ECDSA)
256 SHA256:agRZDZn8awhQ+tc19Ip/whkHoV33Ln2REO7v1kcYbdU server.example.org (ED25519)
512 SHA256:3Wdc6GbLIcc5mbuF2mhhokhARdMLuMK+ESRfJ+sM0QE server.example.org (MLDSA44-ED25519)
</syntaxhighlight>
If there is more than one public key type is available from the server on the port polled, then [http://man.openbsd.org/ssh-keyscan.1 ssh-keyscan(1)] will fetch each of them. If there is more than one key fed via '''stdin''' or a file, then [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)] will process them in order. Prior to OpenSSH 7.2 manual fingerprinting was a two step process, the key was read to a file and then processed for its fingerprint.
<syntaxhighlight lang="shell-session">
$ ssh-keyscan -t ed25519 host.example.org > key.pub
# host.example.org SSH-2.0-OpenSSH_6.8
$ ssh-keygen -lf key.pub
256 SHA256:ZmS+IoHh31CmQZ4NJjv3z58Pfa0zMaOgxu8yAcpuwuw host.example.org (ED25519)
</syntaxhighlight>
Note that some output from [http://man.openbsd.org/ssh-keyscan.1 ssh-keyscan(1)] is sent to '''stderr''' instead of '''stdout'''.
A hash, or fingerprint, can be generated manually with [http://linux.die.net/man/1/awk awk(1)], [http://linux.die.net/man/1/sed sed(1)] and [http://linux.die.net/man/1/xxd xxd(1)], on systems where they are found.
<syntaxhighlight lang="shell-session">
$ awk '{print $2}' key.pub | base64 -d | md5sum -b | sed 's/../&:/g; s/: .*$//'
$ awk '{print $2}' key.pub | base64 -d | sha256sum -b | sed 's/ .*$//' | xxd -r -p | base64
</syntaxhighlight>
It is possible to find all hosts from a file which have new or different keys from those in '''known_hosts''', if the host names are in clear text and not stored as hashes.
<syntaxhighlight lang="shell-session">
$ ssh-keyscan -t ed25519,mldsa44-ed25519 -f ssh_hosts | \
sort -u - ~/.ssh/known_hosts | \
diff ~/.ssh/known_hosts -
</syntaxhighlight>
====Using ssh-keyscan(1) with ssh_config(5)====
The utility [http://man.openbsd.org/ssh-keyscan.1 ssh-keyscan(1)] does not parse [http://man.openbsd.org/ssh_config.5 ssh_config(5)]. That is in part to keep the code base simple. There are a lot of configuration options which would be complicated to implement, including but not limited to '''ProxyJump''', '''ProxyCommand''', '''Match''', '''BindInterface''', and '''CanonicalizeHostname'''<ref name="keyscan">{{cite mailing list |url=https://lists.mindrot.org/pipermail/openssh-unix-dev/2023-March/040605.html | title=Why does ssh-keyscan not use .ssh/config? |publisher=mindrot.org | access-date=2023-03-01 | date=2023-03-01 | mailing-list=OpenSSH UNIX-dev | first=Damien | last=Miller }}</ref> . Resolving host names via the client configuration file can be done by wrapping the utility in a short shell function:
<syntaxhighlight lang="shell">
my-ssh-keyscan() {
for host in "$@" ; do
ssh-keyscan $(ssh -G "$host" | awk '/^hostname/ {print $2}')
done
}
</syntaxhighlight>
That shell function uses the '''-G''' option of [http://man.openbsd.org/ssh.1 ssh(1)] to resolve each host name using [http://man.openbsd.org/ssh_config.5 ssh_config(5)] and then check the resulting host name for SSH keys.
===ASCII Art Visual Host Key===
An ASCII art representation of the key can be displayed along with the SHA256 base64 fingerprint:
<syntaxhighlight lang="shell-session">
$ ssh-keygen -l -v -f key
256 SHA256:BClQBFAGuz55+tgHM1aazI8FUo8eJiwmMcqg2U3UgWU www.example.org (ED25519)
+--[ED25519 256]--+
|o+=*++Eo |
|+o .+.o. |
|B=.oo. . |
|*B.=.o . |
|= B * S |
|. .@ . |
| +..B |
| *. o |
| o.o. |
+----[SHA256]-----+
</syntaxhighlight>
In OpenSSH 6.7 and earlier the fingerprint is in MD5 hexadecimal form.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -l -v -f key
2048 37:af:05:99:e7:fb:86:6c:98:ee:14:a6:30:06:bc:f0 www.example.net (RSA)
+--[ RSA 2048]----+
| o |
| o . |
| o o |
| o + |
| . . S |
| E .. |
| .o.* .. |
| .*=.+o |
| ..==+. |
+-----------------+
</syntaxhighlight>
==More on Verifying SSH Keys==
Keys on the client or the server can be verified against known good keys by comparing the base64-encoded SHA256 fingerprints.
===Verifying Stray Client Keys===
Sometimes is is necessary to compare two uncertain key files to check if they are part of the same key pair. However, public keys are more or less disposable. So the easy way in such situations on the client machine is to just rename or erase the old, problematic, public key and replace it with a new one generated from the existing private key.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -y -f ~/.ssh/my_key_ed25519
</syntaxhighlight>
But if the two parts must really be compared, it is done in two steps using [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)]. First, a new public key is re-generated from the known private key and used to make a fingerprint to '''stdout'''. Next, the fingerprint of the unknown public key is generated for comparison. In this example, the private key '''my_key_a_ed25519''' and the public key '''my_key_b_ed25519.pub''' are compared:
<syntaxhighlight lang="shell-session">
$ ssh-keygen -y -f my_key_a_ed25519 | ssh-keygen -l -f -
$ ssh-keygen -l -f my_key_b_ed25519.pub
</syntaxhighlight>
The result is a base64-encoded SHA256 checksum for each key with the one fingerprint displayed right below the other for easy visual comparison. Older versions don't support reading from '''stdin''' so an intermediate file will be needed then. Even older versions will only show an MD5 checksum for each key. Either way, automation with a shell script is simple enough to accomplish but outside the scope of this book.
===Verifying Server Keys===
Reliable verification of a server's host key must be done when first connecting. It can be necessary to contact the system administrator who can provide it out of band so as to know the fingerprint in advance and have it ready to verify the first connection.
Here is an example of the server's Ed25519 key being read and its fingerprint shown as SHA256 base64:
<syntaxhighlight lang="shell-session">
$ ssh-keygen -l -f /etc/ssh/ssh_host_ed25519_key.pub
256 SHA256:bFzzouaWmE5HuZIv+YnGUYI2q06i6M43V+6jMU3LHpA root@server.example.org (ED25519)
</syntaxhighlight>
And here the corresponding ECDSA key is read, but shown as an MD5 hexadecimal hash:
<syntaxhighlight lang="shell-session">
$ ssh-keygen -E md5 -l -f /etc/ssh/ssh_host_ecdsa_key.pub
256 MD5:ed:d2:34:b4:93:fd:0e:eb:08:ee:b3:c4:b3:4f:28:e4 root@server.example.net (ECDSA)
</syntaxhighlight>
Prior to 6.8, the fingerprint was expressed as an MD5 hexadecimal hash:
<syntaxhighlight lang="shell-session">
$ ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub
2048 MD5:e4:a0:f4:19:46:d7:a4:cc:be:ea:9b:65:a7:62:db:2c root@server.example.net (RSA)
</syntaxhighlight>
It is also possible to use [http://man.openbsd.org/ssh-keyscan.1 ssh-keyscan(1)] to get keys from an active SSH server. However, the fingerprints still needs to be verified out of band.
====Warning: Remote Host Identification Has Changed!====
If a server's key does not match what the client finds has been recorded in either the system's or the local account's '''authorized_keys''' files, then the client will issue a warning along with the fingerprint of the suspicious key.
<pre>
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256:bFzzouaWmE5HuZIv+YnGUYI2q06i6M43V+6jMU3LHpA.
Please contact your system administrator.
Add correct host key in /home/fred/.ssh/known_hosts to get rid of this message.
Offending ED25519 key in /home/fred/.ssh/known_hosts:11
Host key for server.example.org has changed and you have requested strict checking.
Host key verification failed.
</pre>
Three reasons for the warning are common.
One reason is that the server's keys were replaced, often because the server's operating system was reinstalled without backing up the old keys. Another reason can be when the system administrator has phased out deprecated or compromised keys. However that can be planned better and if there is time to plan the migration, new keys can just be added to the server and have the clients use the '''UpdateHostKeys''' option so that the new keys are accepted if the old keys match. A third situation is when the connection is made to the wrong machine, such as when the remote system changes IP addresses because of dynamic address allocation.
In all three cases where the key has changed there is only one thing to do: contact the system administrator and verify the key. Ask if the OpenSSH-server was recently reinstalled, or was the machine restored from an old backup? Keep in mind that the system administrator may be you yourself in some cases.
The case which is rather rare but serious enough that it should be ruled out for sure is that the wrong machine is part of a man-in-the-middle attack.
In all four cases, an authentic key fingerprint can be acquired by any method where it is possible to verify the integrity and origin of the message, for example via PGP-signed e-mail. If physical access is possible, then use the console to get the right fingerprint. Once the authentic key fingerprint is available, return to the client machine where you got the error and remove the old key from '''~/.ssh/known_hosts'''
<syntaxhighlight lang="shell-session">
$ ssh-keygen -R server.example.org
</syntaxhighlight>
Then try logging in, but compare the key fingerprints first and proceed if and '''only''' if the key fingerprint matches what you received out of band. If the key fingerprint matches, then go through with the login process and the key will be automatically added. If the key fingerprint does not match, stop immediately and figure out what you are connecting to. It would be a good idea to get on the phone, a real phone not a computer phone, to the remote machine's system administrator or the network administrator.
===Multiple Keys for a Host, Multiple Hosts for a Key in known_hosts===
Multiple host names or IP addresses can use the same key in the '''known_hosts''' file by using pattern matching or simply by listing multiple systems for the same key. That can be done in either the global list of keys in '''/etc/ssh/ssh_known_hosts''' and the local, account-specific lists of keys in each account's '''~/.ssh/known_hosts''' file. Labs, computational clusters, and similar pools of machines can make use of keys in that way. Here is a key shared by three specific hosts, identified by name, one host per line:
<pre>
server1 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMIId09yQEh9634wNXR+y7L79th2M4awBgCwqWJobJuQ fred@desk.example.org
server2 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMIId09yQEh9634wNXR+y7L79th2M4awBgCwqWJobJuQ fred@desk.example.org
server3 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMIId09yQEh9634wNXR+y7L79th2M4awBgCwqWJobJuQ fred@desk.example.org
</pre>
Or a range can be specified by using globbing to a limited extent in either '''/etc/ssh/ssh_known_hosts''' or '''~/.ssh/known_hosts'''.
<pre>
172.19.40.* ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMIId09yQEh9634wNXR+y7L79th2M4awBgCwqWJobJuQ fred@desk.example.org
</pre>
Conversely, a pool of servers might have multiple keys for the same address. In that case, it is necessary to make multiple entries in either '''/etc/ssh/ssh_known_hosts''' or '''~/.ssh/known_hosts''' for each key.
<pre>
server1 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMIId09yQEh9634wNXR+y7L79th2M4awBgCwqWJobJuQ fred@desk.example.org
server1 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBrsIIaDl/bJ40vyprvF+HYAq+kE2jWUsOt+WqIheaBw fred@desk.example.org
server1 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIC2CgwWTPH/qZDeHmW7ZUea18wa9As7Txq3P5dXCfoXj fred@desk.example.org
</pre>
Thus in order to get a pool of servers to share a pool of keys, each server-key combination must be added manually to the '''known_hosts''' file:
<pre>
server1 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMIId09yQEh9634wNXR+y7L79th2M4awBgCwqWJobJuQ fred@desk.example.org
server1 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBrsIIaDl/bJ40vyprvF+HYAq+kE2jWUsOt+WqIheaBw fred@desk.example.org
server1 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIC2CgwWTPH/qZDeHmW7ZUea18wa9As7Txq3P5dXCfoXj fred@desk.example.org
server2 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICPSs4OR2LT89mv2tM4TKqeVhh4XvoLQ77MSBmjyrMGm fred@desk.example.org
server2 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHChTzAoJr53A7VP1BdMHqLTFK5cz/2Vc065+VcpP4VA fred@desk.example.org
server2 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHP+4BvU4DzwYQgznARxx/qyBWmu49PAywHwDRgslRaM fred@desk.example.org
</pre>
Though upgrading to certificates might be a more appropriate approach that manually updating lots of keys.
===Another way of Dealing with Dynamic (roaming) IP Addresses===
It is possible to manually point to the right key using '''HostKeyAlias''' either as part of [http://man.openbsd.org/ssh_config.5 ssh_config(5)] or as a runtime parameter. Here the key for machine ''Foobar'' is used to connect to host 192.168.11.15
<syntaxhighlight lang="shell-session">
$ ssh -o StrictHostKeyChecking=accept-new \
-o HostKeyAlias=foobar \
192.168.11.15
</syntaxhighlight>
This is useful when DHCP is not configured to try to keep the same addresses for the same machines over time or when using certain stdio forwarding methods to pass through intermediate hosts.
===Host Key Update and Rotation in known_hosts===
A protocol extension to rotate weak public keys out of '''known_hosts''' has been in OpenSSH from version 6.8<ref name="djm_rotation">
{{cite web
| title=Key rotation in OpenSSH 6.8+
| author=Damien Miller
| url=http://blog.djm.net.au/2015/02/key-rotation-in-openssh-68.html
| date=2015-02-01
| publisher=DJM's Personal Weblog
| accessdate=2016-03-05
}}
</ref> and later. With it the server is able to inform the client of all its host keys and update '''known_hosts''' with new ones when at least one trusted key already known. This method still requires the private keys be available to the server <ref name="djm_rotation_redux">
{{cite web
| title=Hostkey rotation, redux
| author=Damien Miller
| url=http://blog.djm.net.au/2015/02/hostkey-rotation-redux.html
| date=2015-02-17
| publisher=DJM's Personal Weblog
| accessdate=2016-03-05
}}
</ref> so that proofs can be completed. In [http://man.openbsd.org/ssh_config.5 ssh_config(5)], the directive '''UpdateHostKeys''' specifies whether the client should accept updates of additional host keys from the server after authentication is completed and add them to '''known_hosts'''. A server can offer multiple keys of the same type for a period before removing the deprecated key from those offered, thus allowing an automated option for rotating keys as well as for upgrading from weaker algorithms to stronger ones. See also [https://datatracker.ietf.org/doc/html/rfc4819 RFC 4819: Secure Shell Public Key Subsystem] about key management standards.
==Converting Between SSH Key Formats==
OpenSSH has its own format for keys which it uses by default when new keys are made. However, other SSH clients and servers may use other formats such as [https://www.rfc-editor.org/rfc/rfc4716 RFC 4716], [https://www.rfc-editor.org/rfc/rfc5958 PKCS8], or [https://www.rfc-editor.org/rfc/rfc1421 PEM]. Any of these can be converted to the default OpenSSH format by [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)]. The default to format to try to convert from is RFC 4716. The utility [https://linux.die.net/man/1/puttygen puttygen(1)] makes keys in that format for [https://linux.die.net/man/1/putty putty(1)] and they need conversion when used with OpenSSH's server.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -i -f /var/tmp/key_public.ppk
</syntaxhighlight>
However, you can use the '''-m''' option to specify either that format explicitly or else choose another one to convert from.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -i -m RFC4716 -f /var/tmp/key_public.ppk
$ ssh-keygen -i -m PKCS8 -f /var/tmp/key_public.ppk
</syntaxhighlight>
Both examples above are for importing public keys into OpenSSH's own format.
By default OpenSSH will write newly-generated keys in its own format, so the '''-m''' option is obligatory to produce public keys in another format.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -e -m PKCS8 -f ~/.ssh/key.pub
</syntaxhighlight>
It is not yet possible to export private keys from the OpenSSH format to one of the other formats using the '''-e''' option. Even if a private key is specified as input, a public key is produced:
<syntaxhighlight lang="shell-session">
$ ssh-keygen -e -m RFC4716 -f ~/.ssh/key
</syntaxhighlight>
Not all key types are supported by all key formats.
It is also possible to use export to display the key pair as a traditional hex dump.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -e -m hexdump -f ~/.ssh/key
Enter passphrase for "key":
Public ED25519 key:
buffer len = 51
0000: 00 00 00 0b 73 73 68 2d 65 64 32 35 35 31 39 00 ....ssh-ed25519.
0016: 00 00 20 b0 c5 cc 2c cb d8 8b 8d 75 80 eb e6 e9 .. ...,....u....
0032: 2c f4 36 08 7b 5b ad ad 0b 54 4f 7f 21 9d 1b e8 ,.6.{[...TO.!...
0048: 9e e0 32 ..2
Private ED25519 key:
buffer len = 119
0000: 00 00 00 0b 73 73 68 2d 65 64 32 35 35 31 39 00 ....ssh-ed25519.
0016: 00 00 20 b0 c5 cc 2c cb d8 8b 8d 75 80 eb e6 e9 .. ...,....u....
0032: 2c f4 36 08 7b 5b ad ad 0b 54 4f 7f 21 9d 1b e8 ,.6.{[...TO.!...
0048: 9e e0 32 00 00 00 40 e1 c3 a2 4d d9 89 49 72 9b ..2...@...M..Ir.
0064: 86 72 6c 07 17 1b 40 4f 62 50 62 45 4f 4c cf cf .rl...@ObPbEOL..
0080: 57 8b 9d c0 04 8f 9b b0 c5 cc 2c cb d8 8b 8d 75 W.........,....u
0096: 80 eb e6 e9 2c f4 36 08 7b 5b ad ad 0b 54 4f 7f ....,.6.{[...TO.
0112: 21 9d 1b e8 9e e0 32 !.....2
</syntaxhighlight>
<noinclude>
== References ==
{{reflist}}
{{OpenSSH/TOC|mini}}
</noinclude>
{{BookCat}}
{{status|100%}}
gk2u3ndyhu5onggmpqpe26630e4np4c
4676712
4676709
2026-10-18T09:01:23Z
Larsnooden
430753
move subsections, clarify some text
4676712
wikitext
text/x-wiki
<noinclude>{{simple chapter navigation|previous=File Transfer with SFTP|next=Certificate-based Authentication}}</noinclude>
Authentication keys can improve efficiency, if done properly. As a bonus advantage, the passphrase and private key never leave the client<ref name="RFC4252§7">{{cite web |url=https://tools.ietf.org/html/rfc4252#section-7 |title=The Secure Shell (SSH) Authentication Protocol |publisher=IETF |year=2006| accessdate=2015-05-06}}</ref>. Key-based authentication is generally recommended for outward facing systems so that password authentication can be turned off.
==Key-based authentication==
OpenSSH can use public key cryptography for authentication. In public key cryptography, encryption and decryption are asymmetric. The keys are used in pairs, a public key to encrypt and a private key to decrypt. The [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)] utility can make RSA, Ed25519, MLDSA44-Ed25519, ECDSA, Ed25519-SK, or ECDSA-SK keys for authenticating. Even though DSA keys can still be made, being exactly 1024 bits in size, they are no longer recommended and should be avoided. RSA keys are allowed to vary from 1024 bits on up. The default is now 3072. However, there is only limited benefit after 2048 bits and that makes elliptic curve algorithms preferable. ECDSA can be 256, 384 or 521 bits in size. Ed25519, Ed25519-SK, and ECDSA-SK keys each have a fixed length of 256 bits. Shorter keys are faster, but less secure. Longer keys are much slower to work with but provide better protection, up to a point.
Keys can be named to help remember what they are for. Because the key files can be named anything it is possible to have many keys each named for different services or tasks. The comment field at the end of the public key can also be useful in helping to keep the keys sorted, if you have many of them or use them infrequently.
The process of key-based authentication uses these keys to make a couple of exchanges using the keys to encrypt and decrypt some short message. At the start, a copy of the client's public key is stored on the server and the client's private key is on the client, both stay where they are. The private key never leaves the client. As the client first contacts the server, the server responds by using the client's public key to encrypt a random number and return that encrypted random number as a challenge to the client. The client responds to the challenge by using the matching private key to decrypt the message and extract the random number. The client then makes an MD5 hash of the session ID along with the random number from the challenge and returns that hash to the server. The server then makes its own hash of the session ID and the random number and compares that to the hash returned by the client. If there is a match, the login is allowed. If there is not a match, then the next of any public keys on the server registered as belonging to the same account is tried until either a match is found or all the keys have been tried or the maximum number of failures has been reached. <ref name="How Key Challenges Work">{{cite web | url=http://www.unixwiz.net/techtips/ssh-agent-forwarding.html#chal | title=An Illustrated Guide to SSH Agent Forwarding | author=Steve Friedl | date=2006-02-22 | accessdate=2013-04-27 | publisher=Unixwiz.net }}</ref>
When an agent is used on the client side to manage authentication, the process is similar. The difference is that [http://man.openbsd.org/ssh.1 ssh(1)] passes the challenge off to the agent which then calculates the response and passes it back to [http://man.openbsd.org/ssh.1 ssh(1)] which then passes the agent's response back to the server.
===Basics of Public Key Authentication===
A matching pair of SSH keys, one public and one private, is needed for public key authentication. The [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)] utility is used to make such a key pair. Out of that pair the public key must be properly stored on the remote host before using key-based authentication. The default location for it is the designated '''authorized_keys''' file, usually one such file resides inside each remote user account. The private key stays stored safely on the client.
Once the keys have been prepared and the remote account configured, they can be used for login. Before starting, there must already be an account on the remote system. The details of doing that are outside of the scope of this book. However, once you have a remote account, there are four steps to set up key-based authentication for it:
'''1''') Prepare a directory on the client (say a laptop or a desktop) where the keys will stay, if there isn't one already. For example, if the '''.ssh''' directory is not on the client machine, create it and set the permissions correctly. It is important that it not be writable by any account except its owner:
<syntaxhighlight lang="shell-session">
$ mkdir ~/.ssh/
$ chmod 0700 ~/.ssh/
</syntaxhighlight>
'''2''') Create a key pair inside the designated directory. The example here creates an Ed25519 key pair in the directory '''~/.ssh'''. The option '''-t''' decides the key type and the option '''-f''' assigns the key file a name. It is good to give key files descriptive names, especially if larger numbers of keys are managed. Below, the public key will be named '''fred_example_org_ed25519.pub''' and the private key will be called '''fred_example_org_ed25519'''. Lastly, the '''-C''' option is used to embed a descriptive comment inside the private key itself. The comment is useful for figuring out later what the key is for when one has many keys or a lot of time has passed or both.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -t ed25519 -f ~/.ssh/fred_example_org_ed25519 \
-C "from fred's laptop to server.example.org"
</syntaxhighlight>
Be sure to enter a solid passphrase so that the private key gets encrypted using 128-bit AES. That way the private key can only be read or used when the passphrase is given.
Ed25519, Ed25519-SK, and ECDSA-SK keys have fixed lengths. For RSA and ECDSA keys, the '''-b''' option sets the number of bits used for those kinds of keys.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -o -b 4096 -t rsa -f ~/.ssh/fred_example_org_rsa \
-C "from fred's laptop to server.example.org"
</syntaxhighlight>
Since 6.5 a new private key format is available using a [http://man.openbsd.org/bcrypt.3 bcrypt(3)] key derivative function (KDF) to better protect keys at rest. This new format is always used for Ed25519 keys, and sometime in the future will be the default for all keys. But for right now it may be requested when generating or saving existing keys of other types via the '''-o''' option in [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)].
Details of the new format are found in the source code in the file '''PROTOCOL.key'''.
'''3''') Get the keys to the right places. Transfer only the public key to remote machine. The following assume the default locations for the authorized keys as specified in the server's configuration file by the '''AuthorizedKeysFile''' directive.
'''3a''') If the utility <code>ssh-copy-id</code> exists, and if password authentication is allowed, then it can be used to put the public key into place on the remote system. The ''.pub'' is optional here, the script will figure it out if omitted.
<syntaxhighlight lang="shell-session">
$ ssh-copy-id -i ~/.ssh/fred_example_org_ed25519 fred@server.example.org
</syntaxhighlight>
If that script was successful in transferring the public key, then go on to step 4 below and test the key. If not, then try transferring the public key manually as described in step 3b next.
'''3b''') Or the public key can be put in place manually on the remote machine. For that the remote '''.ssh''' directory is needed, and within that a special file to store the public keys, the default file name is '''authorized_keys'''. If either the '''authorized_keys''' file or '''.ssh''' directory do not exist on the remote machine, they need to be created.
<syntaxhighlight lang="shell-session">
$ mkdir -m 700 ~/.ssh/
$ touch ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys
$ nano -w ~/.ssh/authorized_keys
</syntaxhighlight>
Then any editor which does not wrap long lines can be used to add the public key. However the '''authorized_keys''' file is edited to add the key, the key itself must be in the file whole and unbroken on a single line. For example, [http://linux.die.net/man/1/nano nano(1)] can be started with the '''-w''' option to prevent wrapping of long lines. (Another way to set line wrapping permanently in [http://linux.die.net/man/1/nano nano(1)] is by editing [http://linux.die.net/man/5/nanorc nanorc(5)].)
If the key pair is not already on the client, transfer both the public and private keys there. It is usually best to keep both the public and private keys together in the directory '''~/.ssh/''', though the public key is not always needed on the client after this step and could even be regenerated if it is ever needed again.
'''4''') Test the keys
While remaining logged in via the first terminal, use the client system to open another window and in it start another SSH session and try authenticating to the remote machine from the client using the private key.
<syntaxhighlight lang="shell-session">
$ ssh -i ~/.ssh/fred_example_org_ed25519 -l fred server.example.org
</syntaxhighlight>
The option '''-i''' tells [http://man.openbsd.org/ssh.1 ssh(1)] which private key to try.
Only after verifying that the key-based authentication works should you close the original window.
It is possible to make permanent shortcuts on the client using [http://man.openbsd.org/ssh_config.5 ssh_config(5)], explained further below, once key-based authentication is working. In particular, see the '''IdentityFile''', '''IdentitiesOnly''', and '''AddKeysToAgent''' configuration directives, to name three.
It is also a good idea to turn off password authentication, if and only if key-based authentication is setup for all the necessary remote accounts.
➥ '''Troubleshooting of Key-based Authentication''':
If the server refuses to accept the key and fails over to the next authentication method (e.g.: "Server refused our key"), then there are several possible mistakes to look for on the server side.
One of the most common errors is that the file and directory permissions are wrong. The authorized keys file must be owned by the user in question and not be group writable. Nor may the key file's directory be group or world writable.
<syntaxhighlight lang="shell-session">
$ chmod u=rwx,g=rx,o= ~/.ssh
$ chmod u=rw,g=,o= ~/.ssh/authorized_keys
</syntaxhighlight>
Another mistake that can happen is if the key inside the '''authorized_keys''' file on the remote host is broken by line breaks or has other whitespace in the middle. That can be fixed by joining up the lines and removing the spaces or by recopying the key more carefully.
And, though it should go without saying, the halves of the key pair need to match. The public key on the server needs to match the private key held on the client. If the public key is lost, then a new one can be generated with the '''-y''' option, but not the other way around. If the private key is lost, then the public key should be erased as it is no longer of any use. If many keys are in use for an account, it might be a good idea to add comments to them. On the client, it can be a good idea to know which server the key is for, either through the file name itself or through the comment field. A comment can be added using the '''-C''' option.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -t ed25519 -f ~/.ssh/fred_example_org_ed25519 -C "web server mirror"
</syntaxhighlight>
On the server, it can be important to annotate which client they key is from if there is more than one public key there in an account. There the comment can be added to the authorized keys file on the server in the last column if a comment does not already exist. Again, the format of the authorized keys file is given in the manual page for [http://man.openbsd.org/sshd.8 sshd(8)] in the section "AUTHORIZED_KEYS FILE FORMAT". If the keys are not labeled they can be hard to match, which might or might not be what you want.
====Associating Keys Permanently with a Server====
A key can be specified at run time, but to save retyping the same paths again and again, the '''Host''' directive in [http://man.openbsd.org/ssh_config.5 ssh_config(5)] can apply specific settings to a target host. In this case, by changing '''~/.ssh/config''' it is possible to assign particular keys to be tried automatically whenever making a connection to that specific host. After adding the following lines to '''~/.ssh/config''', all that's needed is to type <code>ssh ''web1''</code> to connect with the key for that server.
<syntaxhighlight lang="apache" line="1">
Host web1
Hostname 198.51.100.32
IdentitiesOnly yes
IdentityFile /home/fred/.ssh/web_key_ed25519
</syntaxhighlight>
The '''~/.ssh/config''' below uses different keys for ''server'' versus ''server.example.org'', regardless whether they resolve to the same machine. This is possible because the host name argument given to [http://man.openbsd.org/ssh.1 ssh(1)] is not converted to a canonicalized host name before matching.
<syntaxhighlight lang="apache" line="1">
Host server
IdentitiesOnly yes
IdentityFile /home/fred/.ssh/key_a_ed25519
Host server.example.org
IdentitiesOnly yes
IdentityFile /home/fred/.ssh/key_b_ed25519
</syntaxhighlight>
In this example the shorter name is tried first, but of course less ambiguous shortcuts can be made instead. The configuration file gets parsed on a first-match basis. So the most specific rules go at the beginning and the most general rules go at the end.
====Encrypted Home Directories====
When using encrypted home directories the keys must be stored in an unencrypted directory. That means somewhere outside the actual home directory which means [http://man.openbsd.org/sshd.8 sshd(8)] needs to be configured appropriately to find the keys in that special location.
Here is one method for solving the access problem. Each user is given a subdirectory under '''/etc/ssh/keys/''' which they can then use for storing their '''authorized_keys''' file. This is set in the server's configuration file '''/etc/ssh/sshd_config'''
<syntaxhighlight lang="apache" line="1">
AuthorizedKeysFile /etc/ssh/keys/%u/authorized_keys
</syntaxhighlight>
Setting a special location for the keys opens up more possibilities as to how the keys can be managed and multiple key file locations can be specified if they are separated by whitespace. The user does not have to have write permissions for the '''authorized_keys''' file. Only read permission is needed to be able to log in. But if the user is allowed to add, remove, or change their keys, then they will need write access to the file to do that.
One symptom of having an encrypted home directory is that key-based authentication only works when you are already logged into the same account, but fails when trying to make the first connection and log in for the first time.
Sometimes it is also necessary to add a script or call a program from '''/etc/ssh/sshrc''' immediately after authentication to decrypt the home directory.
====Passwordless Login====
One solution for passwordless logins is to still have a passphrase and work with an authentication agent in conjunction with a single-purpose key. Most desktop environments launch an SSH agent automatically these days. It will be visible in the '''SSH_AUTH_SOCK''' environment variable if it is. On accounts with an agent, [http://man.openbsd.org/ssh-add.1 ssh-add(1)] can load private keys into an available agent.
<syntaxhighlight lang="shell-session">
$ ssh-add ~/.ssh/fred_example_org_ed25519
</syntaxhighlight>
Thereafter, the client will automatically check the agent for the key when appropriate. If there are many keys in the agent, it will become necessary to set '''IdentitiesOnly'''. See the above section on using '''~/.ssh/config''' for that. See [[OpenSSH/Cookbook/Public_Key_Authentication#Key-based_Authentication_Using_an_Agent|Key-based Authentication Using an Agent]] below.
Another, riskier, way of allowing passwordless logins is to follow the steps above, but simply do not enter a passphrase when asked for one while creating the key. Note that using keys that lack a passphrase is very risky, so the key files should be very well protected and kept track of, and ideally locked down with a '''command=''' option or '''ForceCommand''' directive on the server. That includes those keys which will only be used as single-purpose keys as described below.
Timely key rotation becomes especially important. In general, it is not a good idea to make a key without a passphrase.
====Requiring Both Keys and a Password====
While users should have strong passphrases for their keys, there is no way to enforce or verify that. Indeed, since neither the private key nor its the passphrase ever leave the client machine there is nothing that the server can do to have any influence over that. Instead, it is possible to require both a key and a password. Starting with OpenSSH 6.2, it is possible for the server to require multiple authentication methods for login using the '''AuthenticationMethods''' directive.
<syntaxhighlight lang="apache" line="1">
AuthenticationMethods publickey,password
</syntaxhighlight>
This example from [http://man.openbsd.org/sshd_config.5 sshd_config(5)] requires that users first authenticate using a key and it only queries for a password if the key succeeds. Thus with that configuration it is not possible to get to the system password prompt without first authenticating with a valid key. Changing the order of the arguments changes the order of the authentication methods.
====Requiring Two or More Keys====
Since OpenSSH 6.8, the server now remembers which public keys have been used for authentication and refuses to accept previously-used keys. This allows a set up requiring that users authenticate using two different public keys, maybe one in the file system and the other in a hardware token.
<syntaxhighlight lang="apache" line="1">
AuthenticationMethods publickey,publickey
</syntaxhighlight>
The '''AuthenticationMethods''' directive, whether for keys or passwords, can also be set on the server under a '''Match''' directive to apply only to certain groups or situations.
====Requiring Certain Key Types For Authentication====
Also since OpenSSH 6.8, the '''PubkeyAcceptedKeyTypes''' directive, later changed to '''PubkeyAcceptedAlgorithms''', can specify which key algorithms are accepted for authentication. Those not in the comma-separated pattern list are not allowed.
<syntaxhighlight lang="apache" line="1">
PubkeyAcceptedAlgorithms ssh-ed25519*,ssh-rsa*,ecdsa-sha2*,sk-ssh-ed25519*,sk-ecdsa-sha2*
</syntaxhighlight>
Either the actual key types or a pattern can be in the list. Spaces are not allowed in the pattern list. The exact list of key types supported for authentication can be found by the '''-Q''' option using the client. The following two lines are equivalent.
<syntaxhighlight lang="shell-session">
$ ssh -Q key-sig | sort
$ ssh -Q PubkeyAcceptedAlgorithms | sort
</syntaxhighlight>
For host-based authentication, it is the '''HostbasedAcceptedAlgorithms''' directive which determines the key types which are allowed for authentication.
===Key-based Authentication Using the AuthorizedKeysCommand Directive===
It is possible to use a program or script to look up public keys rather than keeping them in a static file or files. Any command called by the '''AuthorizedKeysCommand''' directive needs to either produce a syntactically correct public key while returning the exit code for a successful run or else return the exit code for failure. The string sent to '''stdout''' will then be processed as part of the authentication work flow.
Here is a shell script<ref name="janpietmens">{{cite web |url=https://jpmens.net/2025/03/25/authorizedkeyscommand-in-sshd/ |title=SSH keys from a command: sshd's AuthorizedKeysCommand directive |accessdate=2025-04-04 |date=2025-03-25 | author=Jan-Piet Mens }}</ref> at its simplest, without constraints, demonstrating a public key lookup:
<syntaxhighlight lang="shell">
#!/bin/sh
echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKs/UouletvojgB1YeRZ4MY6iRblQ2ERDuNhQO4tOvdL"
exit 0
</syntaxhighlight>
For authentication to succeed, the script must return exit code 0 (success) after sending the syntactically correct matching public key to '''stdout'''. For the SSH daemon to even run the script in the first place, the script must have the correct file and directory permissions.
Both the '''AuthorizedKeysCommandUser''' directive and '''AuthorizedKeysCommand''' must be used together. The former designates which account the script or program use when run. If set to ''none'' or if it does not refer to a valid account then [http://man.openbsd.org/sshd sshd(8)] will just ignore the command. If '''AuthorizedKeysCommand''' is set, and '''AuthorizedKeysCommandUser''' is left empty or missing, then [http://man.openbsd.org/sshd sshd(8)] won't even run when invoked. The error will be:
<syntaxhighlight lang="text">
AuthorizedKeysCommand set without AuthorizedKeysCommandUser
</syntaxhighlight>
The '''AuthorizedKeysFile''' is always tried first when it is present in the server configuration. The '''AuthorizedKeysCommand''' directive will not even be tried when the authorized keys file can provide a relevant key first.
====A More Detailed Example Using the AuthorizedKeysCommand Directive====
By default the user name trying to log in is passed to the script when no tokens or arguments are provided. Whether or how that information is used is up to the script. The SSH daemon can also pass any combination of the tokens described in the TOKENS section of [http://man.openbsd.org/sshd_config sshd_config(5)] into the program or script being called. Furthermore, the program or script can even be a front end for a database, such as OpenLDAP, or any similar system, as long as '''stdout''' produces a public key.
Below is a more detailed example which uses a local script named '''keyfinder''' run with the account '''keys''' to look up the a public key for certain accounts. First in [http://man.openbsd.org/sshd_config sshd_config(5)] the two directives:
<syntaxhighlight lang="apache" line="1">
AuthorizedKeysCommand /usr/local/sbin/keyfinder %U
AuthorizedKeysCommandUser keys
</syntaxhighlight>
The script below is only a demonstration and a more complex program can call databases or do advanced lookups or heuristics:
<syntaxhighlight lang="shell">
#!/bin/sh
set -e
case $1 in
"1000")
echo "ssh-ed25519 AAAAC3NzaC1lZDIE5AAAAIK89...UT9hz"
;;
"1001")
echo "restrict ssh-ed25519 AAAAC3NzaC1lZDI1NTAAIBvGx...Y0zxV"
;;
"1002")
echo "command=\"/usr/libexec/sftp-server\" ssh-ed25519 AAAAC3NzaC1lZDI1TE5AIPSyY...cPTg3"
;;
*)
exit 1
;;
esac
exit 0
</syntaxhighlight>
The '''AuthorizedKeysCommand''' scripts or programs can return any correctly formatted public key to '''stdout''' for consideration in the authentication process. That includes adding constraints to the keys. Above, the account with the UID 1000 has no constraints, while the account with UID 1001 is quite constrained. Finally, the account with the UID 1002 can only access the SFTP service. See the section "AUTHORIZED_KEYS FILE FORMAT" in [http://man.openbsd.org/sshd sshd(8)] for the full set of possibilities.
===Key-based Authentication Using an Agent===
When an authentication agent, such as [http://man.openbsd.org/ssh-agent.1 ssh-agent(1)], is going to be used, it should generally be started at the beginning of a session and used to launch the login session or X-session so that the environment variables pointing to the agent and its UNIX-domain socket are passed to each subsequent shell and process. Many desktop distros do this automatically upon login or startup.
Starting an agent entails setting a pair of environment variables:
* SSH_AGENT_PID : the process id of the agent
* SSH_AUTH_SOCK : the filename and full path to the UNIX-domain socket
The various SSH and SFTP clients find these variables automatically and use them to contact the agent and try when authentication is needed. However, it is mainly SSH_AUTH_SOCK which is ever used. If the shell or desktop session was launched using [http://man.openbsd.org/ssh-agent.1 ssh-agent(1)], then these variables are already set and available. If they are not available, then it is necessary to either set the variables manually inside each shell or for each application in order to use the agent or else to point to the agent's socket using the directive '''IdentityAgent''' in the client's configuration file.
Once an agent is available, a relevant private key needs to be loaded before the agent can be used. Once in the agent the private key can then be used many times. Private keys are loaded into an agent with [http://man.openbsd.org/ssh-add.1 ssh-add(1)].
<syntaxhighlight lang="shell-session">
$ ssh-add /home/fred/.ssh/mykey_ed25519
Identity added: /home/fred/.ssh/mykey_ed25519 (/home/fred/.ssh/mykey_ed25519)
</syntaxhighlight>
Keys stay in the agent for as long as it is running unless specified otherwise. A timeout can be set either with the '''-t''' option when starting the agent itself or when actually loading the key using [http://man.openbsd.org/ssh-add.1 ssh-add(1)]. In either case, the '''-t''' option will set a timeout interval, after which the key will be purged from the agent.
<syntaxhighlight lang="shell-session">
$ ssh-add -t 1h30m /home/fred/.ssh/mykey_ed25519
Identity added: /home/fred/.ssh/mykey_ed25519 (/home/fred/.ssh/mykey_ed25519)
Lifetime set to 5400 seconds
</syntaxhighlight>
The option '''-l''' will list the fingerprints of all of the identities in the agent.
<syntaxhighlight lang="shell-session">
$ ssh-add -l
256 SHA256:77mfUupj364g1WQ+O8NM1ELj0G1QRx/pHtvzvDvDlOk mykey for task x (ED25519)
3072 SHA256:7unq90B/XjrRbucm/fqTOJu0I1vPygVkN9FgzsJdXbk myotherkey rsa for task y (RSA)
</syntaxhighlight>
It is also possible to remove individual identities from the agent using '''-d''' which will remove them one at a time if identified by file name, but only if the file name is given and without the file name of the private key to be remove, '''-d''' will fail silently. Using '''-D''' instead will remove all of them at once without needing to specify any by name.
By default [http://man.openbsd.org/ssh-add.1 ssh-add(1)] uses the agent connected via the socket named in the environment variable '''SSH_AUTH_SOCK''', if it is set. Currently, that is its only option. However, for [http://man.openbsd.org/ssh.1 ssh(1)] an alternative to using the environment variable is the client configuration directive '''IdentityAgent''' which tells the SSH clients which socket to use to communicate with the agent. If both the environment variable and the configuration directive are available at the same time, then the value in '''IdentityAgent''' takes precedence over what's in the environment variable. '''IdentityAgent''' can also be set to ''none'' to prevent the connection from trying to use any agent at all.
The client configuration directive '''AddKeysToAgent''' can also be useful in getting keys into an agent as needed. When set, it automatically loads a key into a running agent the first time the key is called for if it is not already loaded. Likewise the '''IdentitiesOnly''' directive can ensure that the relevant key is offered on the first try. Rather than typing these out whenever the client is run, they can be added to '''~/.ssh/config''' and thereby added automatically for designated host connections.
====Agent Forwarding====
Agent forwarding is one means of passing through one or more intermediate hosts. However, the '''-J''' option for '''ProxyJump''' would be a safer option. See [[OpenSSH/Cookbook/Proxies_and_Jump_Hosts#Jump_Hosts_--_Passing_Through_a_Gateway_or_Two | Passing Through a Gateway or Two]] in the section on jump hosts about that. With agent forwarding, intermediate machines forward challenges and responses back and forth between the client and the final destination. This comes with some risks but eliminates the need for using passwords or holding keys on any of these intermediate machines.
A main advantage of agent forwarding is that the private key itself is not needed on any remote machine, thus hindering unwanted file system access to it. <ref name="OpenSSH key management, Part 3">{{cite web | url=http://www.ibm.com/developerworks/library/l-keyc3/ | title=Common threads: OpenSSH key management, Part 3 | author=Daniel Robbins | publisher=IBM | date=2002-02-01 | accessdate=2013-04-27}}</ref> Another advantage is that the actual agent to which the user has authenticated does not go anywhere and is thus less susceptible to analysis.
One risk with agents is that they can be re-used to tailgate in if the permissions allow it. Keys cannot be copied this way, but authentication is possible when there are incorrect permissions. Note that disabling agent forwarding does not improve security unless users are also denied shell access, as they can always install their own forwarders.
The risks of agent forwarding can be mitigated by confirming each use of a key by adding the '''-c''' option when adding the key to the agent. This requires the SSH_ASKPASS variable be set and available to the agent process, but will generate a prompt on the host running the agent upon each use of the key by a remote system. So if passing through one or more intermediate hosts, it is usually better to instead have the SSH client use stdio forwarding with '''-W''' or '''-J'''.
On the client side agent forwarding is disabled by default and so if it is to be used it must be enabled explicitly. Put the following line in [http://man.openbsd.org/ssh_config.5 ssh_config(5)] to enable agent forwarding for a particular server:
<syntaxhighlight lang="apache" line="1">
Host gateway.example.org
ForwardAgent yes
</syntaxhighlight>
On the server side the default configuration files allow authentication agent forwarding, so to use it, nothing needs to be done there, just on the client side. However, again, it would be preferable to take a look at '''ProxyJump''' instead.
=====New Style SSH Agent Destination Constraints=====
Using the '''ProxyJump''' option instead of authentication agent forwarding is still the best way to pass through other systems while avoiding the exposure of private keys, something which could happen fowarding agents. However, from 8.9 onward, [http://man.openbsd.org/ssh-agent.1 ssh-agent(1)] will allow the agent to limit which hosts it will use for authentication as specified by [http://man.openbsd.org/ssh-add.1 ssh-add(1)] using the '''-h''' option. These constraints have been added through two agent protocol extensions and a modification to the public key authentication protocol. This feature may evolve, but for now the result is such that keys for account authentication can be loaded into the agent in four ways:
* no limits on forwarding (not recommended)
* local use only, these will not get forwarded
* forwarding, but only to specific remote hosts
* forwarding to specific remote hosts via specified routes
The intent is that the restrictions fail safely so that they do not allow authentication when one or more hosts in the route lack the needed protocol features. The destinations and routes cannot be modified once the keys are loaded, but multiple routes to the same destination can be loaded and the routes can be any number of hops. If the routes need changing, then the key must be reloaded into the agent with the new route or routes.
The general default for the client is to keep keys in the agent for local use only. However, that can be enforced explicitly by adding the '''-a''' option when starting the client or else setting the '''ForwardAgent''' directive in [http://man.openbsd.org/ssh_config.5 ssh_config(5)] to 'no' in the relevant configuration block.
In order to load keys for unlimited forwarding, which is not the best idea, just add them using [http://man.openbsd.org/ssh-add.1 ssh-add(1)] as normal. Then use the '''-A''' option with the client or set the '''ForwardAgent''' directive in [http://man.openbsd.org/ssh_config.5 ssh_config(5)] to 'yes' in the relevant configuration block.
In order to limit keys for connection only to a specific remote host, or to load keys for connection to a specific remote host with forwarding via one or more intermediate hosts, use the '''-h''' option when loading keys into the agent. Here the one key may be used only to connect to the specific destination:
<syntaxhighlight lang="shell-session">
$ ssh-agent -h server.example.org server.key.ed25519
</syntaxhighlight>
If an intermediate system is passed through, the best way is to use '''ProxyJump''' which is the '''-J''' option for the SSH Client. If agent forwarding must be allowed then the tightest way is to constrain which systems may use the keys, again using the '''-h''' option.
<syntaxhighlight lang="shell-session">
$ ssh-agent -h middle.example.org -h "middle.example.org>server.example.org" server.key.ed25519
</syntaxhighlight>
Multiple steps can be included, even multiple routes. They just have to be enumerated explicitly, though patterns may still be used for the destination hosts as well as specific names. Each host in the chain must support these protocol extensions for the connection to complete.
Any keys designated for forwarding are unusable for authentication on any other hosts than those which have been explicitly identified for forwarding. These permitted hosts are identified by host key or host certificate from the '''known_hosts''' file or another file designated by the '''-H''' option when loading the key with [http://man.openbsd.org/ssh-add.1 ssh-add(1)]. If '''-H''' is not used at the time the keys are loaded into the agent, then the default known hosts file(s) will be used: '''~/.ssh/known_hosts''', '''/etc/ssh/ssh_known_hosts''', '''~/.ssh/known_hosts2''', and '''/etc/ssh/ssh_known_hosts2'''.
In the case of keys, the '''known_hosts''' list must be maintained conscientiously <ref name="ssh-agent-restrictions">{{ cite web | author=Damien Miller|url=https://www.openssh.org/agent-restrict.html | title=SSH agent restriction | publisher=OpenSSH | date=2021-12-16|accessdate=2022-03-06}}</ref>, perhaps with the help of the '''UpdateHostkeys''' and '''CanonicalizeHostname''' client configuration directives. Use of certificates requires the agent to only need to be aware of the Certificate Authority (CA).
Again, see [[OpenSSH/Cookbook/Proxies_and_Jump_Hosts#Jump_Hosts_--_Passing_Through_a_Gateway_or_Two | Passing Through a Gateway or Two]] in the section on jump hosts about a way to pass through one or more intermediate machines without needing to forward an SSH agent.
=====Old Style, Somewhat Safe SSH Agent Forwarding=====
The best way to pass through one or more intermediate hosts is to use the '''ProxyJump''' option instead of authentication agent forwarding and thereby not risking the exposure of any private keys. If authentication agent forwarding must be used, then it would be advisable in the interest of following the principle of least privilege to forward an agent containing the minimum necessary number of keys. There are several ways to solve that.
In version 8.8 and earlier a partial solution is to make a one-off, ephemeral agent to hold just the one key or keys needed for the task at hand. Another partial solution would be to set up a user-accessible service at the operating system level and then use [http://man.openbsd.org/ssh_config.5 ssh_config] for the rest.
Automatically launching an ephemeral agent unique to each session can be done by crafting either a special shell alias or function to launch a single-use agent. Either the function or the alias can be written to require confirmation for each requested signature. The following example is a function is inspired by an updated blog post by Vincent Bernat<ref name="safer-agent-forwarding">{{cite web |url=https://vincent.bernat.ch/en/blog/2020-safer-ssh-agent-forwarding |title=Safer SSH agent forwarding |author=Vincent Bernat|date=2020-04-05 |accessdate=2020-10-04}}</ref> on SSH agent forwarding:
<syntaxhighlight lang="shell-session">
$ agentssh() {
ssh-agent ssh -o AddKeysToAgent=confirm -o ForwardAgent=yes
}
</syntaxhighlight>
Note the use of [http://man.openbsd.org/ssh-agent.1 ssh-agent(1)]. When invoking that alias, the SSH client will be launched with a unique, ephemeral supporting key agent. The alias sets up a new agent, including setting the two environment variables, and then sets two client options while calling the client. This arrangement still checks with [http://man.openbsd.org/ssh_config.5 ssh_config(5)] for other options and settings. When the SSH session is finished the agent which launched it ends and goes away, thus cleaning up after itself automatically.
Another way is to rely on the client's configuration file for some of the settings. Such methods rely mostly on [http://man.openbsd.org/ssh_config.5 ssh_config(5)] but still require an independent method to launch an ephemeral agent because the OpenSSH client is already running by the time it reads the configuration file and is thus not affected by any changes to environment variables caused by the configuration file and it is through the environment variables that contain information about the agent. However, when the path to the UNIX-domain socket used to communicate with the authentication agent is decided in advance then the '''IdentityAgent''' option can point to it once the one-off agent<ref name="wikimedia_ssh_agents">{{cite web |url=https://wikitech.wikimedia.org/wiki/Managing_multiple_SSH_agents#Linux_solutions |title=Managing multiple SSH agents |publisher=Wikimedia|accessdate=2020-04-07}}</ref> is actually launched. The following uses a specific agent's pre-defined socket whenever connecting to either of two particular domains:
<syntaxhighlight lang="apache" line="1">
Host *.wikimedia.org *.wmflabs.org
User fred
IdentitiesOnly yes
IdentityFile %d/.ssh/id_cloud_01
IdentityAgent /run/user/%i/ssh-cloud-01.socket
ForwardAgent yes
AddKeysToAgent yes
</syntaxhighlight>
The '''%d''' stands for the path to the home directory and the '''%i''' stands for the user id (UID) for the current account. In some cases the '''%i''' token might also come in handy when setting the '''IdentityAgent''' option inside the configuration file. Again, be careful when forwarding agents with which keys are in the forwarded agent. See the section "TOKENS" in [http://man.openbsd.org/ssh_config.5 ssh_config(5)] for more such abbreviations.
With those configuration settings, the authentication agent must already be up and running and point to the designated socket prior to starting the SSH client for that configuration to work. Additionally, it should place the socket in a directory which is inaccessible to any other accounts. [http://man.openbsd.org/ssh-agent.1 ssh-agent(1)] must use the '''-a''' option to name the socket:
<syntaxhighlight lang="shell-session">
$ ssh-agent -a /run/user/${UID}/ssh-cloud-01.socket
</syntaxhighlight>
That agent configuration can be launched manually or via a script or service manager. However, in the interests of privacy and security in general, agent forwarding is to be avoided. The configuration directive '''ProxyJump''' is the best alternative and, on older systems, host traversal using '''ProxyCommand''' with [http://man.openbsd.org/nc.1 netcat] are preferable. Again, see the section on [[OpenSSH/Cookbook/Proxies and Jump Hosts|Proxies and Jump Hosts]] for how those methods are used.
====Checking the Agent for Specific Keys====
The [http://man.openbsd.org/ssh_add ssh_add(1)] utility's '''-T''' option can test whether a specific private key is available in the agent or not by looking up the matching public key. That can be useful in a shell script.
<syntaxhighlight lang="shell">
#!/bin/sh
key=/home/fred/.ssh/some.key.ed25519.pub
if ssh-add -T ${key}; then
echo "Key ${key} Found"
else
echo "Key ${key} missing"
fi
</syntaxhighlight>
Or it could be done with an alternate syntax just as well either in a script or in an interactive shell sessions,
<syntaxhighlight lang="shell-session">
$ key=/home/fred/.ssh/some.key.ed25519.pub
$ ssh-add -T ${key} && echo "Key found" || echo "Key missing"
</syntaxhighlight>
However, if the desired result would be to add key to the agent then the '''AddKeysToAgent''' client configuration option can ensure that a specific key is added to the SSH agent upon first use during any given login session. That can be done using '''-o AddKeysToAgent=yes''' as a run-time argument, or by modifying [http://man.openbsd.org/ssh_config ssh_config(5)] as appropriate:
<syntaxhighlight lang="apache" line="1">
Host www
HostName www.example.com
IdentityFile %d/.ssh/www.ed25519
IdentitiesOnly yes
AddKeysToAgent yes
</syntaxhighlight>
With those options in the configuration file, the first time <code>ssh www</code> is run the specified key will get added to the agent and remain available.
===Key-based Authentication Using A Hardware Security Token===
While stand-alone keys have been around for a long time, it has been possible since version 8.2 to use keys backed by hardware security tokens, such as OnlyKey, Yubikey, or many others, though the FIDO2 protocol. The Universal 2nd Factor (U2F) authentication is supported directly in OpenSSH through FIDO2 and does not need third party software. At the moment there are two types of hardware backed keys, ECDSA-SK and Ed25519-SK, but only the latest hardware tokens support the latter. If the key Ed25519-SK format is not supported by the token's firmware, then the following error message will be presented when attempts to use that key type are made:
<syntaxhighlight lang="text">
Key enrollment failed: invalid format
</syntaxhighlight>
If supported, either key type can be created with [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)]. The steps are almost identical to creating normal keys but the token must be available to the system (plugged in) first. Then if called for, the token's PIN must be entered and the token touched or otherwise activated. After that, the key creation proceeds as normal. Mind the key type as specified by the '''-t''' option.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -t ed25519-sk -f /home/fred/.ssh/server.ed25519-sk -C "web server for fred"
Generating public/private ed25519-sk key pair.
You may need to touch your authenticator to authorize key generation.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/fred/.ssh/server.ed25519-sk
Your public key has been saved in /home/fred/.ssh/server.ed25519-sk.pub
The key fingerprint is:
SHA256:41wVVDnKJ9gKr2Sj4CFuYMhcNvYebZ6zq0PWyP4rRDo web server
The key's randomart image is:
+[ED25519-SK 256]-+
| .o... |
| .o |
| +.. . |
| = . . ..= . |
|+ + * + So.. o |
|o+.EoO *+oo |
|.o oBo+++o |
| o .=.+. |
| . .=== |
+----[SHA256]-----+
</syntaxhighlight>
Once created, the public and private key files get handled like with any other type of key. But when authenticating, the hardware token must be present and activated when called for.
<syntaxhighlight lang="shell-session">
$ ssh -i /home/fred/.ssh/server.ed25519-sk server.example.org
Enter passphrase for key '/home/fred/.ssh/server.ed25519-sk':
Confirm user presence for key ED25519-SK SHA256:41wVVDnKJ9gKr2Sj4CFuYMhcNvYebZ6zq0PWyP4rRDo
</syntaxhighlight>
The resulting private key file is not actually the key itself but instead a "key handle" which is used by the hardware security token to derive the real private key on demand at the time it is actually used<ref name="OpenBSD_tech_U2F_FIDO">{{cite web |url=https://marc.info/?l=openbsd-tech&m=157376801917387&w=2 |title=OpenSSH U2F/FIDO support in base
|publisher=OpenBSD-Tech Mailing List | date=2019-11-14
|accessdate=2021-03-24}}</ref>. As a result, the hardware-backed private key file is useless without the accompanying hardware token. This also means that these key files are not portable across hardware tokens, say when having multiple tokens in reserve or as backup, even when used by the same account. So when multiple hardware tokens are in use, different key pairs must be generated for each token.
====Hardware Security Token Resident Private Key====
It is possible to store the private key within the token itself, but for the moment it cannot be used directly from inside the token and must first be saved as a file. Also, the key can only be loaded into the FIDO authenticator at the time of creation using the '''-O resident''' option with [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)]. Otherwise, the process is the same as above.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -O resident -t ed25519-sk -f /home/fred/.ssh/server.ed25519-sk -C "web server for fred"
. . .
</syntaxhighlight>
When needed, the resident key can be extracted from the FIDO2 hardware token and saved into a file using the '''-K''' option. At this stage a passphrase can be added to the file, but no passphrase is kept within the token itself, only an optional PIN protects the key there.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -K
Enter PIN for authenticator:
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Saved ED25519-SK key to id_ed25519_sk_rk
$ mv -i id_ed25519_sk_rk /home/fred/.ssh/server.ed25519-sk
</syntaxhighlight>
Since the output file name is fixed, any pre-existing file with that name can get overwritten but there will be a warning first. However, it is not recommended to keep the key on the hardware token because it provides more protection when kept separately.
==Single-purpose Keys==
Tailored single-purpose keys can eliminate use of remote root logins for many administrative activities. A finely tailored '''sudoers''' is needed along with an unprivileged account. When done right, it gives just enough access to get the job done, following the security principle of Least Privilege.
Single-purpose keys are accompanied by use of either the '''ForceCommand''' directive in [http://man.openbsd.org/ssh_config.5 sshd_config(5)] or the '''command="..."''' directive inside the '''authorized_keys''' file. The method is to generate a new key pair, transfer the public key to '''authorized-keys''' on the remote system, and then prepend the appropriate command or script there to the line with the key.
<syntaxhighlight lang="shell-session">
$ grep '^command' ~/.ssh/authorized_keys
command="/usr/local/bin/somescript.sh" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEcgdzDvSebOEjuegEx4W1I/aA7MM3owHfMr9yg2WH8H
</syntaxhighlight>
The '''command="..."''' directive inserted there overrides everything else and ensures that when logging in with just that key only the script '''/usr/local/bin/somescript.sh''' is run. If it is necessary to pass parameters to the script, have a look at the contents of the '''SSH_ORIGINAL_COMMAND''' environment variable and use it in a case statement. Do not ever trust the contents of that variable nor use the contents directly, always indirectly.
Single-purpose keys are useful for allowing only a tunnel and nothing more. The following key will only echo some text and then exit, unless used non-interactively with the '''-N''' option.
<syntaxhighlight lang="shell-session">
$ grep '^command' ~/.ssh/authorized_keys
command="/bin/echo do-not-send-commands" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBzTIWCaILN3tHx5WW+PMVDc7DfPM9xYNY61JgFmBGrA
</syntaxhighlight>
No matter what the user tries while logging in with that key, the session will only echo the given text and then exits. Using the '''-N''' option disables running the remote program, allowing the connection to stay open, allowing a tunnel.
<syntaxhighlight lang="shell-session">
$ ssh -L 3306:localhost:3306 \
-i ~/.ssh/tunnel_ed25519 \
-N \
-l fred \
server.example.com
</syntaxhighlight>
That creates a tunnel and stays connected despite a key configuration which would close an interactive session. See also the '''-n''' or '''-f''' option for [http://man.openbsd.org/ssh.1 ssh(1)].
===Single-purpose Keys to Avoid Remote Root Access===
The easy way is to write a short shell script, place it '''/usr/local/bin/''', and then configure '''sudoers''' to allow the otherwise unprivileged account to run just that script and only that script.
<syntaxhighlight lang="apache" line="1">
%wheel ALL=(root:root) NOPASSWD: /usr/sbin/service httpd stop
%wheel ALL=(root:root) NOPASSWD: /usr/sbin/service httpd start
</syntaxhighlight>
Then the key calls the script using '''command="..."''' inside '''authorized_keys'''. Here the one key starts the web server, the other stops the web server.
<syntaxhighlight lang="shell-session">
$ grep '^command' ~/.ssh/authorized_keys
command="/usr/bin/sudo /usr/sbin/service httpd stop" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEcgdzDvSebOEjuegEx4W1I/aA7MM3owHfMr9yg2WH8H
command="/usr/bin/sudo /usr/sbin/service httpd start" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMidyqZ6OCvbWqA8Zn+FjhpYE6NoWSxVjFnFUk6MrNZ4
</syntaxhighlight>
Complicated programs like [http://linux.die.net/man/1/rsync rsync(1)], [http://man.openbsd.org/tar.1 tar(1)], [http://linux.die.net/man/1/mysqldump mysqldump(1)], and so on require an advanced approach when building a single-purpose key. For them, the '''-v''' option can show exactly what is being passed to the server so that '''sudoers''' can be set up correctly. That way they can be restricted to only access designated parts of the file system. For example, here is what <code>ssh -v</code> shows from one particular usage of [http://linux.die.net/man/1/rsync rsync(1)], note the "Sending command" line:
<syntaxhighlight lang="shell-session">
$ rsync -e 'ssh -v' fred@server.example.org:/etc/ ./backup/etc/
. . .
debug1: Sending command: rsync --server --sender -e.LsfxC . /etc/
. . .
</syntaxhighlight>
That output can then be added to '''sudoers''' so that the key can do only that function.
<syntaxhighlight lang="shell-session">
%backup ALL=(root:root) NOPASSWD: /usr/bin/rsync --server --sender -e.LsfxC . /etc/
</syntaxhighlight>
Then to tie it all together, the account "backup" needs a key:
<syntaxhighlight lang="shell-session">
$ grep '^command' ~/.ssh/authorized_keys
command="/usr/bin/rsync --server --sender -e.LsfxC . /etc/" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMm0rs4eY8djqBb3dIEgbQ8lmdlxb9IAEuX/qFCTxFgb
</syntaxhighlight>
Many of these programs have a '''--dry-run''' or equivalent option. Remember to use it when figuring out the right settings.
===Read-only Access to Keys===
In some cases it is necessary to prevent accounts from being able to changing their own authentication keys. However, such situations may be a better case for using certificates. However, if done with keys it is accomplished by putting the key file in an external directory where the user has read-only access, both to the directory and to the key file. Then the '''AuthorizedKeysFile''' directive assigns where [http://man.openbsd.org/sshd.8 sshd(8)] looks for the keys and can point to a secured location for the keys instead of the default location.
A good alternate location could be a new directory '''/etc/ssh/authorized_keys''' which could store the selected accounts' key files there. The change can be made to apply to only a group of accounts by putting the settings under a '''Match''' directive. The default location for keys on most systems is usually '''~/.ssh/authorized_keys'''.
<syntaxhighlight lang="apache" line="1">
Match Group sftpusers
AuthorizedKeysFile /etc/ssh/authorized_keys/%u
</syntaxhighlight>
Then the permissions there would allow the keys to be read but not written:
<syntaxhighlight lang="shell-session">
$ ls -dhln /etc/ssh/
drwxr-x--x 3 0 0 4.0K Mar 30 22:16 /etc/ssh/authorized_keys/
$ ls -dhln /etc/ssh/*.pub
-rw-r--r-- 1 0 0 173 Mar 23 13:34 /etc/ssh/fred
-rw-r--r-- 1 0 0 93 Mar 23 13:34 /etc/ssh/user1
-rw-r--r-- 1 0 0 565 Mar 23 13:34 /etc/ssh/user2
. . .
</syntaxhighlight>
The keys could even be within subdirectories, though the same restrictions apply regarding permissions and ownership.
For chrooted SFTP, the method is the same to keep the key files out of reach of the accounts:
<syntaxhighlight lang="apache" line="1">
Match Group sftpusers
ChrootDirectory /home
ForceCommand internal-sftp -d %u
AuthorizedKeysFile /etc/ssh/authorized_keys/%u
</syntaxhighlight>
Of course a '''Match''' directive is not essential. The settings could be made to apply to all accounts by putting the directive in the main part of the server configuration file instead.
==Mark Public Keys as Revoked==
Keys can be revoked. Keys that have been revoked can be stored in '''/etc/ssh/revoked_keys''', a file specified in [http://man.openbsd.org/ssh_config.5 sshd_config(5)] using the directive '''RevokedKeys''', so that [http://man.openbsd.org/sshd.8 sshd(8)] will prevent attempts to log in with them. No warning or error on the client side will be given if a revoked key is tried. Authentication will simply progress to the next key or method.
The revoked keys file should contain a list of public keys, one per line, that have been revoked and can no longer be used to connect to the server. The key cannot contain any extras, such as [[OpenSSH/Client_Configuration_Files#Available_key_login_options | login options]] or it will be ignored. If one of the revoked keys is tried during a login attempt, the server will simply ignore it and move on to the next authentication method. An entry will be made in the logs of the attempt, including the key's fingerprint. See the section on [[OpenSSH/Logging_and_Troubleshooting | logging]] for a little more on that.
<syntaxhighlight lang="apache" line="1">
RevokedKeys /etc/ssh/revoked_keys
</syntaxhighlight>
The '''RevokedKeys''' configuration directive is not set in [http://man.openbsd.org/ssh_config.5 sshd_config(5)] by default. It must be set explicitly if it is to be used. This is another situation that might be better fulfilled through using certificate since a validity interval can be set in any combination of seconds, minutes, hours, days, or weeks can be set for certificates while keys are valid indefinitely.
===Key Revocation Lists===
A Key Revocation List (KRL) is a compact, binary form of representing revoked keys and certificates. In order to use a KRL, the server's configuration file must point to a valid list using the '''RevokedKeys''' directive. KRLs themselves are generated with [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)] and can be created from scratch or edited in place. Here a new one is made, populated with a single public key:
<syntaxhighlight lang="shell-session">
$ ssh-keygen -k -f /etc/ssh/revoked_keys -z 1 ~/.ssh/old_key_rsa.pub
</syntaxhighlight>
Here an existing KRL is updated by adding the '''-u''' option:
<syntaxhighlight lang="shell-session">
$ ssh-keygen -u -k -f /etc/ssh/revoked_keys -z 2 ~/.ssh/old_key_dsa.pub
</syntaxhighlight>
Once a KRL is in place, it is possible to test if a specific key or certificate is in the revocation list.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -Q -f /etc/ssh/revoked_keys ~/.ssh/old_key_rsa.pub
</syntaxhighlight>
Only public keys and certificates will be loaded into the KRL. Corrupt or broken keys will not be loaded and will produce an error message if tried. Like with the regular '''RevokedKeys''' list, the public key destined for the KRL cannot contain any extras like login options or it will produce an error when an attempt is made to load it into the KRL or search the KRL for it.
==Verify a Host Key by Fingerprint==
The above examples have been about using keys to authenticate the client to the server. A different context in which keys are used is when the server identifies itself to the client, which happens automatically at the beginning of each non-multiplexed session. In order for that identification to happen the client acquires a public key from the server, usually on or prior to first contact, which it can subsequently use to ensure that it is connecting to the same server again and not an impostor. The default locations for storing these acquired host keys on the client are in '''/etc/ssh/ssh_known_hosts''', if managed by the system administrator, or in '''~/.ssh/known_hosts''' if managed by the client's own account. The format of the contents is a line with a host address and its matching public key. The file is described in detail in the [http://man.openbsd.org/sshd.8 sshd(8)] manual page in the section "SSH_KNOWN_HOSTS FILE FORMAT".
When connecting for the first time to a remote host, the server's host key should be verified in order to ensure that the client is connecting to the right machine and not an impostor or anything else. Usually this verification is done by comparing the fingerprint of the server's host key rather than trying to compare the whole key itself. By default the client will show the fingerprint if the key is not already found in the '''known_hosts''' register.
<syntaxhighlight lang="shell-session">
$ ssh -l fred server.example.org
The authenticity of host 'server.example.org (192.0.32.10)' can't be established.
ECDSA key fingerprint is SHA256:LPFiMYrrCYQVsVUPzjOHv+ZjyxCHlVYJMBVFerVCP7k.
Are you sure you want to continue connecting (yes/no)?
</syntaxhighlight>
That can be compared to a fingerprint received out of band, say by post, e-mail, SMS, courier, and so on. Specifically, the example represents the key's fingerprint as a base64 encoded SHA256 checksum. That is the default style. The fingerprint can also be displayed as an MD5 hash in hexadecimal instead by passing the client's '''FingerprintHash''' configuration directive as a runtime argument or setting it in [http://man.openbsd.org/ssh_config.5 ssh_config(5)].
<syntaxhighlight lang="shell-session">
$ ssh -o FingerprintHash=md5 host.example.org
The authenticity of host 'host.example.org (192.0.32.203)' can't be established.
RSA key fingerprint is MD5:10:4a:ec:d2:f1:38:f7:ea:0a:a0:0f:17:57:ea:a6:16.
Are you sure you want to continue connecting (yes/no)?
</syntaxhighlight>
But the default in new versions is SHA256 in base64 has a lower chance of collision.
In OpenSSH 6.7 and earlier, the client showed fingerprints as a hexadecimal MD5 checksum instead a of the base64-encoded SHA256 checksum currently used:
<syntaxhighlight lang="shell-session">
$ ssh -l fred server.example.org
The authenticity of host 'server.example.org (192.0.32.10)' can't be established.
RSA key fingerprint is 4a:11:ef:d3:f2:48:f8:ea:1a:a2:0d:17:57:ea:a6:16.
Are you sure you want to continue connecting (yes/no)?
</syntaxhighlight>
Another way of comparing keys is to use the ASCII art visual host key. See further below about that.
===Downloading keys===
Even though a host’s key is usually displayed for review the first time the SSH client tries to connect, it can also be fetched on demand at any time using [http://man.openbsd.org/ssh-keyscan.1 ssh-keyscan(1)]:
<syntaxhighlight lang="shell-session">
$ ssh-keyscan server.example.org
# server.example.org:22 SSH-2.0-OpenSSH_10.6
server.example.org ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEWKepJgkC2XTG5cAr2Nyew6hOp5AjG7vi2RYFtPWqN3bo5XGuCX2d2YVyn++/2PtyMYBaKWyFpCNTT9X0F1Epg=
# server.example.org:22 SSH-2.0-OpenSSH_10.6
server.example.org ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDKyERe8k+fnsrt4JrcLD3AW0kXj90r9ybrEZuY/CTrXIqYSizO335SxGJoWrKijaRy8htuueMkmNfxxhnBPoAjul/4T/FCRGKaV0jC96xYNnKcXbnXxSLVQ0OW2EIPvQhw/TU/G3vEqtiRYGyaNcZS6xrnVv3xuPuvVC1VRKspNLEq7zfvToC0OB89X5DIbvBbHY13PjJ0NrDdX3sSA8lxPsYagBuDIvyxH0S4Z5fQHeYrdvENS5zX6LwJeMeGSOqDuD0Zb4hpKxhaGVwP5e435VcFuImbFaDPM4w71PzaSUEj+tnUA0mGDoLiCrpW3txkJszog9lN3C/nLGghFaT7ajrfH55qut81JnvdhMju9+SzxrKPJmtQZfKVLIc4whEbtFsPCdm2bstz7ROWxTJ3t/Vr8/QVm2G2aY4FHuPwo2jUQDbQA7mCV+fe1sADy2jLzGhn1TCeYvWSv5PNJAT97IrLfD3+0Uo+qJD/6CU7F8oabj1Ql2H8fPN5kGSWfkM=
# server.example.org:22 SSH-2.0-OpenSSH_10.6
server.example.org ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJo5gc4VrxVQ5apAOd7qK6UqGlLMpWOPuunjB53JBN2s
# server.example.org:22 SSH-2.0-OpenSSH_10.6
# server.example.org:22 SSH-2.0-OpenSSH_10.6
# server.example.org:22 SSH-2.0-OpenSSH_10.6
server.example.org ssh-mldsa44-ed25519 AAAAE3NzaC1tbGRzYTQ0LWVkMjU1MTkAAAVAyIw5r9FaniSYqBX0yd9vgBz5nCkebaQlMQN9N0p//Ukfn/CnZ3YtZWn6pUGjDM85/bqdL1gqah1OLfnl1eHk0qvTACrym07uKaMLoEHuakIXHbTi/ELPRoRP3F+DpEgjtYSjLc/fJiobRMgSvmLJxTUzZTStsqWAL1L9/1zuwHEngR+THpUcCSTi6KKkYcQiWGOFwpO22VdiuOg+zdQSH+9jW6eXYk1z81KU6UlHZps8zVrlqCd3FDDghgbH5U8DcGN2t6GvVfn6jFjpEk0ouj0of3/7010eRXjnv3QSbprCpMq73lAemQM+3LvTtrMBhFWNhCXhyOHfO1Yq7c8xaOwlFK78PlERjdHTvVJaCaDFDy7Pg9I+wxv+uC+W0wtzJ2S1y9XCYUgJo9yEiIGuSZdhMkYUwMnXLzQMm44hQOW153pdlHWze3kESCLg/LJf9RbUoSB43t6rghSHEiUkIi5TtCtFZ4nAGeH+wVwlB9Fwog5uZuJN1FYuuY5sSrLHJAQDUwudkdak0ifOhtPtsM/ClYr3baolQ/qi0ABYUVLKSV5b+A5DlTXa23zc7JAXm2YVfkWpOfVJG4TY81wrJoDumsd1y3XaH28/4QbADsZCE3wYsBou8ff0xKgPu8xm2K+sYSmzUbBGprArAQA0LtIDGNGqrb4JsZ1ru+viwzfSlxV7Nz7ZrSw6h+Ddq4J9A6oKXy6YS3uf1GFOtBQm6JfuyMHQEEUtYZrU4UK3C/fKHx9vjuw7YdhsL8JRgxbF14qJLFizkmVbK2e6aWEE4iCqLLLlZ0dC2peYUUqyGb9PsW7sewYzGbipzPpQ/GobRT3Obc3Gmu8P386pDGR7hmkOpFmVwIcfc431cUmZixK7CkPxzUvfaAAQkmNs/p4eNNoP0gq/xPGsV14/heULbWp/njGWk1ysjjGxP6YMwHcEZpUdSGbD05zbL0KkMtmKsr8yuJYjdVAgtH2bVAvrxXRXLgavmm97VYYq1A9rOYiQFlMrKRg6yZhT10Xt8Hukf6ySLk+fieFc3nH99YeysoA5rsfp9kdXr65GpwrBerZlf/20ZLJ7s4xaYb9SukR/8tiPt9iAVQjqPdb0MseZVrzhKo/jK44JHbHejHMoMMs7etPAS5TIjHxcJTP66B3eO9A0l2fAage2ka7ehTnHivxD3EE9KnqYBjIHDU7o6dTrX7UyQsdhax9bPKEL7OEtm6hXXfwzy4GdqGi124BclFAF0LeBSvBUgmSKIn3wfzJx/XXbt512eOn3WZk2v0TsiteH9kPEgDxVkUykawg2tleak9rTFMzYpDZRHvZD7uHWUZ8ktr2FEKWgq7/1Q2c80Z6H75VK9l1d3KZuoiWoF1s73R7ZAM+CWSrR+S5h+3AhYubDKPa/af+Lnlqe6ocVTqQPYaaRz25/cLBg6pgbdh18Ru6h3ljG2KiysyXeuoEoM5xVYtdIW7l9NeKDpGbZPAOqywXUpK+UCGjumIl7c48KCTIYcdtolnEbfVNBh0LRuftcVI+uF9cvQ0XacaNbgkYJYCjv4VR/n58EJ1b0c7tQBrVqMjDjIUKGhCMQqAeD3g75jeD60bBmVNPrq8RK+zH5VIa5eaBs3eitN98eVzd4b6UYTQd1QxLQZMrhQf4InRj39TZfGvQR5SXlLZQlweVHYkMps3IKbs3B3DCqlWCPUAnTAJBAG7HqWEYr5uEaKBawBSAx9jCQz00T+bp8KXpkOPzZCD6dfEfpHY6Rv6kmGJkiPUCb2hoX145HrS357G12+wDxKLN833oPVC0z
</syntaxhighlight>
Once a key is acquired, its fingerprint can be shown using [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)] to read from '''stdin'''. This can be done directly with a pipe.
<syntaxhighlight lang="shell-session">
$ ssh-keyscan server.example.org | ssh-keygen -l -f -
3072 SHA256:tQlw3vy325KrQibndP3gLS/YXUZjTLVA5yDFpg/Bb6I server.example.org (RSA)
256 SHA256:snnAtb/9csdy0BGhPjdg+VNWqN5bxCa/ge4C6zZ8muk server.example.org (ECDSA)
256 SHA256:agRZDZn8awhQ+tc19Ip/whkHoV33Ln2REO7v1kcYbdU server.example.org (ED25519)
512 SHA256:3Wdc6GbLIcc5mbuF2mhhokhARdMLuMK+ESRfJ+sM0QE server.example.org (MLDSA44-ED25519)
</syntaxhighlight>
If there is more than one public key type is available from the server on the port polled, then [http://man.openbsd.org/ssh-keyscan.1 ssh-keyscan(1)] will fetch each of them. If there is more than one key fed via '''stdin''' or a file, then [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)] will process them in order. Prior to OpenSSH 7.2 manual fingerprinting was a two step process, the key was read to a file and then processed for its fingerprint.
<syntaxhighlight lang="shell-session">
$ ssh-keyscan -t ed25519 host.example.org > key.pub
# host.example.org SSH-2.0-OpenSSH_6.8
$ ssh-keygen -lf key.pub
256 SHA256:ZmS+IoHh31CmQZ4NJjv3z58Pfa0zMaOgxu8yAcpuwuw host.example.org (ED25519)
</syntaxhighlight>
Note that some output from [http://man.openbsd.org/ssh-keyscan.1 ssh-keyscan(1)] is sent to '''stderr''' instead of '''stdout'''.
A hash, or fingerprint, can be generated manually with [http://linux.die.net/man/1/awk awk(1)], [http://linux.die.net/man/1/sed sed(1)] and [http://linux.die.net/man/1/xxd xxd(1)], on systems where they are found.
<syntaxhighlight lang="shell-session">
$ awk '{print $2}' key.pub | base64 -d | md5sum -b | sed 's/../&:/g; s/: .*$//'
$ awk '{print $2}' key.pub | base64 -d | sha256sum -b | sed 's/ .*$//' | xxd -r -p | base64
</syntaxhighlight>
It is possible to find all hosts from a file which have new or different keys from those in '''known_hosts''', if the host names are in clear text and not stored as hashes.
<syntaxhighlight lang="shell-session">
$ ssh-keyscan -t ed25519,mldsa44-ed25519 -f ssh_hosts | \
sort -u - ~/.ssh/known_hosts | \
diff ~/.ssh/known_hosts -
</syntaxhighlight>
====Using ssh-keyscan(1) with ssh_config(5)====
The utility [http://man.openbsd.org/ssh-keyscan.1 ssh-keyscan(1)] does not parse [http://man.openbsd.org/ssh_config.5 ssh_config(5)]. That is in part to keep the code base simple. There are a lot of configuration options which would be complicated to implement, including but not limited to '''ProxyJump''', '''ProxyCommand''', '''Match''', '''BindInterface''', and '''CanonicalizeHostname'''<ref name="keyscan">{{cite mailing list |url=https://lists.mindrot.org/pipermail/openssh-unix-dev/2023-March/040605.html | title=Why does ssh-keyscan not use .ssh/config? |publisher=mindrot.org | access-date=2023-03-01 | date=2023-03-01 | mailing-list=OpenSSH UNIX-dev | first=Damien | last=Miller }}</ref> . Resolving host names via the client configuration file can be done by wrapping the utility in a short shell function:
<syntaxhighlight lang="shell">
my-ssh-keyscan() {
for host in "$@" ; do
ssh-keyscan $(ssh -G "$host" | awk '/^hostname/ {print $2}')
done
}
</syntaxhighlight>
That shell function uses the '''-G''' option of [http://man.openbsd.org/ssh.1 ssh(1)] to resolve each host name using [http://man.openbsd.org/ssh_config.5 ssh_config(5)] and then check the resulting host name for SSH keys.
===ASCII Art Visual Host Key===
An ASCII art representation of the key can be displayed along with the SHA256 base64 fingerprint:
<syntaxhighlight lang="shell-session">
$ ssh-keygen -l -v -f key
256 SHA256:BClQBFAGuz55+tgHM1aazI8FUo8eJiwmMcqg2U3UgWU www.example.org (ED25519)
+--[ED25519 256]--+
|o+=*++Eo |
|+o .+.o. |
|B=.oo. . |
|*B.=.o . |
|= B * S |
|. .@ . |
| +..B |
| *. o |
| o.o. |
+----[SHA256]-----+
</syntaxhighlight>
In OpenSSH 6.7 and earlier the fingerprint is in MD5 hexadecimal form.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -l -v -f key
2048 37:af:05:99:e7:fb:86:6c:98:ee:14:a6:30:06:bc:f0 www.example.net (RSA)
+--[ RSA 2048]----+
| o |
| o . |
| o o |
| o + |
| . . S |
| E .. |
| .o.* .. |
| .*=.+o |
| ..==+. |
+-----------------+
</syntaxhighlight>
==More on Verifying SSH Keys==
Keys on the client or the server can be verified against known good keys by comparing the base64-encoded SHA256 fingerprints.
===Verifying Stray Client Keys===
Sometimes is is necessary to compare two uncertain key files to check if they are part of the same key pair. However, public keys are more or less disposable. So the easy way in such situations on the client machine is to just rename or erase the old, problematic, public key and replace it with a new one generated from the existing private key.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -y -f ~/.ssh/my_key_ed25519
</syntaxhighlight>
But if the two parts must really be compared, it is done in two steps using [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)]. First, a new public key is re-generated from the known private key and used to make a fingerprint to '''stdout'''. Next, the fingerprint of the unknown public key is generated for comparison. In this example, the private key '''my_key_a_ed25519''' and the public key '''my_key_b_ed25519.pub''' are compared:
<syntaxhighlight lang="shell-session">
$ ssh-keygen -y -f my_key_a_ed25519 | ssh-keygen -l -f -
$ ssh-keygen -l -f my_key_b_ed25519.pub
</syntaxhighlight>
The result is a base64-encoded SHA256 checksum for each key with the one fingerprint displayed right below the other for easy visual comparison. Older versions don't support reading from '''stdin''' so an intermediate file will be needed then. Even older versions will only show an MD5 checksum for each key. Either way, automation with a shell script is simple enough to accomplish but outside the scope of this book.
===Verifying Server Keys===
Reliable verification of a server's host key must be done when first connecting. It can be necessary to contact the system administrator who can provide it out of band so as to know the fingerprint in advance and have it ready to verify the first connection.
Here is an example of the server's Ed25519 key being read and its fingerprint shown as SHA256 base64:
<syntaxhighlight lang="shell-session">
$ ssh-keygen -l -f /etc/ssh/ssh_host_ed25519_key.pub
256 SHA256:bFzzouaWmE5HuZIv+YnGUYI2q06i6M43V+6jMU3LHpA root@server.example.org (ED25519)
</syntaxhighlight>
And here the corresponding ECDSA key is read, but shown as an MD5 hexadecimal hash:
<syntaxhighlight lang="shell-session">
$ ssh-keygen -E md5 -l -f /etc/ssh/ssh_host_ecdsa_key.pub
256 MD5:ed:d2:34:b4:93:fd:0e:eb:08:ee:b3:c4:b3:4f:28:e4 root@server.example.net (ECDSA)
</syntaxhighlight>
Prior to 6.8, the fingerprint was expressed as an MD5 hexadecimal hash:
<syntaxhighlight lang="shell-session">
$ ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub
2048 MD5:e4:a0:f4:19:46:d7:a4:cc:be:ea:9b:65:a7:62:db:2c root@server.example.net (RSA)
</syntaxhighlight>
It is also possible to use [http://man.openbsd.org/ssh-keyscan.1 ssh-keyscan(1)] to get keys from an active SSH server. However, the fingerprints still needs to be verified out of band.
====Warning: Remote Host Identification Has Changed!====
If a server's key does not match what the client finds has been recorded in either the system's or the local account's '''authorized_keys''' files, then the client will issue a warning along with the fingerprint of the suspicious key.
<pre>
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256:bFzzouaWmE5HuZIv+YnGUYI2q06i6M43V+6jMU3LHpA.
Please contact your system administrator.
Add correct host key in /home/fred/.ssh/known_hosts to get rid of this message.
Offending ED25519 key in /home/fred/.ssh/known_hosts:11
Host key for server.example.org has changed and you have requested strict checking.
Host key verification failed.
</pre>
Three reasons for the warning are common.
One reason is that the server's keys were replaced, often because the server's operating system was reinstalled without backing up the old keys. Another reason can be when the system administrator has phased out deprecated or compromised keys. However that can be planned better and if there is time to plan the migration, new keys can just be added to the server and have the clients use the '''UpdateHostKeys''' option so that the new keys are accepted if the old keys match. A third situation is when the connection is made to the wrong machine, such as when the remote system changes IP addresses because of dynamic address allocation.
In all three cases where the key has changed there is only one thing to do: contact the system administrator and verify the key. Ask if the OpenSSH-server was recently reinstalled, or was the machine restored from an old backup? Keep in mind that the system administrator may be you yourself in some cases.
The case which is rather rare but serious enough that it should be ruled out for sure is that the wrong machine is part of a man-in-the-middle attack.
In all four cases, an authentic key fingerprint can be acquired by any method where it is possible to verify the integrity and origin of the message, for example via PGP-signed e-mail. If physical access is possible, then use the console to get the right fingerprint. Once the authentic key fingerprint is available, return to the client machine where you got the error and remove the old key from '''~/.ssh/known_hosts'''
<syntaxhighlight lang="shell-session">
$ ssh-keygen -R server.example.org
</syntaxhighlight>
Then try logging in, but compare the key fingerprints first and proceed if and '''only''' if the key fingerprint matches what you received out of band. If the key fingerprint matches, then go through with the login process and the key will be automatically added. If the key fingerprint does not match, stop immediately and figure out what you are connecting to. It would be a good idea to get on the phone, a real phone not a computer phone, to the remote machine's system administrator or the network administrator.
===Multiple Keys for a Host, Multiple Hosts for a Key in known_hosts===
Multiple host names or IP addresses can use the same key in the '''known_hosts''' file by using pattern matching or simply by listing multiple systems for the same key. That can be done in either the global list of keys in '''/etc/ssh/ssh_known_hosts''' and the local, account-specific lists of keys in each account's '''~/.ssh/known_hosts''' file. Labs, computational clusters, and similar pools of machines can make use of keys in that way. Here is a key shared by three specific hosts, identified by name, one host per line:
<pre>
server1 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMIId09yQEh9634wNXR+y7L79th2M4awBgCwqWJobJuQ fred@desk.example.org
server2 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMIId09yQEh9634wNXR+y7L79th2M4awBgCwqWJobJuQ fred@desk.example.org
server3 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMIId09yQEh9634wNXR+y7L79th2M4awBgCwqWJobJuQ fred@desk.example.org
</pre>
Or a range can be specified by using globbing to a limited extent in either '''/etc/ssh/ssh_known_hosts''' or '''~/.ssh/known_hosts'''.
<pre>
172.19.40.* ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMIId09yQEh9634wNXR+y7L79th2M4awBgCwqWJobJuQ fred@desk.example.org
</pre>
Conversely, a pool of servers might have multiple keys for the same address. In that case, it is necessary to make multiple entries in either '''/etc/ssh/ssh_known_hosts''' or '''~/.ssh/known_hosts''' for each key.
<pre>
server1 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMIId09yQEh9634wNXR+y7L79th2M4awBgCwqWJobJuQ fred@desk.example.org
server1 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBrsIIaDl/bJ40vyprvF+HYAq+kE2jWUsOt+WqIheaBw fred@desk.example.org
server1 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIC2CgwWTPH/qZDeHmW7ZUea18wa9As7Txq3P5dXCfoXj fred@desk.example.org
</pre>
Thus in order to get a pool of servers to share a pool of keys, each server-key combination must be added manually to the '''known_hosts''' file:
<pre>
server1 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMIId09yQEh9634wNXR+y7L79th2M4awBgCwqWJobJuQ fred@desk.example.org
server1 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBrsIIaDl/bJ40vyprvF+HYAq+kE2jWUsOt+WqIheaBw fred@desk.example.org
server1 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIC2CgwWTPH/qZDeHmW7ZUea18wa9As7Txq3P5dXCfoXj fred@desk.example.org
server2 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICPSs4OR2LT89mv2tM4TKqeVhh4XvoLQ77MSBmjyrMGm fred@desk.example.org
server2 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHChTzAoJr53A7VP1BdMHqLTFK5cz/2Vc065+VcpP4VA fred@desk.example.org
server2 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHP+4BvU4DzwYQgznARxx/qyBWmu49PAywHwDRgslRaM fred@desk.example.org
</pre>
Though upgrading to certificates might be a more appropriate approach that manually updating lots of keys.
===Another way of Dealing with Dynamic (roaming) IP Addresses===
It is possible to manually point to the right key using '''HostKeyAlias''' either as part of [http://man.openbsd.org/ssh_config.5 ssh_config(5)] or as a runtime parameter. Here the key for machine ''Foobar'' is used to connect to host 192.168.11.15
<syntaxhighlight lang="shell-session">
$ ssh -o StrictHostKeyChecking=accept-new \
-o HostKeyAlias=foobar \
192.168.11.15
</syntaxhighlight>
This is useful when DHCP is not configured to try to keep the same addresses for the same machines over time or when using certain stdio forwarding methods to pass through intermediate hosts.
===Host Key Update and Rotation in known_hosts===
A protocol extension to rotate weak public keys out of '''known_hosts''' has been in OpenSSH from version 6.8<ref name="djm_rotation">
{{cite web
| title=Key rotation in OpenSSH 6.8+
| author=Damien Miller
| url=http://blog.djm.net.au/2015/02/key-rotation-in-openssh-68.html
| date=2015-02-01
| publisher=DJM's Personal Weblog
| accessdate=2016-03-05
}}
</ref> and later. With it the server is able to inform the client of all its host keys and update '''known_hosts''' with new ones when at least one trusted key already known. This method still requires the private keys be available to the server <ref name="djm_rotation_redux">
{{cite web
| title=Hostkey rotation, redux
| author=Damien Miller
| url=http://blog.djm.net.au/2015/02/hostkey-rotation-redux.html
| date=2015-02-17
| publisher=DJM's Personal Weblog
| accessdate=2016-03-05
}}
</ref> so that proofs can be completed. In [http://man.openbsd.org/ssh_config.5 ssh_config(5)], the directive '''UpdateHostKeys''' specifies whether the client should accept updates of additional host keys from the server after authentication is completed and add them to '''known_hosts'''. A server can offer multiple keys of the same type for a period before removing the deprecated key from those offered, thus allowing an automated option for rotating keys as well as for upgrading from weaker algorithms to stronger ones. See also [https://datatracker.ietf.org/doc/html/rfc4819 RFC 4819: Secure Shell Public Key Subsystem] about key management standards.
==Converting Between SSH Key Formats==
OpenSSH has its own format for keys which it uses by default when new keys are made. However, other SSH clients and servers may use other formats such as [https://www.rfc-editor.org/rfc/rfc4716 RFC 4716], [https://www.rfc-editor.org/rfc/rfc5958 PKCS8], or [https://www.rfc-editor.org/rfc/rfc1421 PEM]. Any of these can be converted to the default OpenSSH format by [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)]. The default to format to try to convert from is RFC 4716. The utility [https://linux.die.net/man/1/puttygen puttygen(1)] makes keys in that format for [https://linux.die.net/man/1/putty putty(1)] and they need conversion when used with OpenSSH's server.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -i -f /var/tmp/key_public.ppk
</syntaxhighlight>
However, you can use the '''-m''' option to specify either that format explicitly or else choose another one to convert from.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -i -m RFC4716 -f /var/tmp/key_public.ppk
$ ssh-keygen -i -m PKCS8 -f /var/tmp/key_public.ppk
</syntaxhighlight>
Both examples above are for importing public keys into OpenSSH's own format.
By default OpenSSH will write newly-generated keys in its own format, so the '''-m''' option is obligatory to produce public keys in another format.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -e -m PKCS8 -f ~/.ssh/key.pub
</syntaxhighlight>
It is not yet possible to export private keys from the OpenSSH format to one of the other formats using the '''-e''' option. Even if a private key is specified as input, a public key is produced:
<syntaxhighlight lang="shell-session">
$ ssh-keygen -e -m RFC4716 -f ~/.ssh/key
</syntaxhighlight>
Not all key types are supported by all key formats.
It is also possible to use export to display the key pair as a traditional hex dump.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -e -m hexdump -f ~/.ssh/key
Enter passphrase for "key":
Public ED25519 key:
buffer len = 51
0000: 00 00 00 0b 73 73 68 2d 65 64 32 35 35 31 39 00 ....ssh-ed25519.
0016: 00 00 20 b0 c5 cc 2c cb d8 8b 8d 75 80 eb e6 e9 .. ...,....u....
0032: 2c f4 36 08 7b 5b ad ad 0b 54 4f 7f 21 9d 1b e8 ,.6.{[...TO.!...
0048: 9e e0 32 ..2
Private ED25519 key:
buffer len = 119
0000: 00 00 00 0b 73 73 68 2d 65 64 32 35 35 31 39 00 ....ssh-ed25519.
0016: 00 00 20 b0 c5 cc 2c cb d8 8b 8d 75 80 eb e6 e9 .. ...,....u....
0032: 2c f4 36 08 7b 5b ad ad 0b 54 4f 7f 21 9d 1b e8 ,.6.{[...TO.!...
0048: 9e e0 32 00 00 00 40 e1 c3 a2 4d d9 89 49 72 9b ..2...@...M..Ir.
0064: 86 72 6c 07 17 1b 40 4f 62 50 62 45 4f 4c cf cf .rl...@ObPbEOL..
0080: 57 8b 9d c0 04 8f 9b b0 c5 cc 2c cb d8 8b 8d 75 W.........,....u
0096: 80 eb e6 e9 2c f4 36 08 7b 5b ad ad 0b 54 4f 7f ....,.6.{[...TO.
0112: 21 9d 1b e8 9e e0 32 !.....2
</syntaxhighlight>
<noinclude>
== References ==
{{reflist}}
{{OpenSSH/TOC|mini}}
</noinclude>
{{BookCat}}
{{status|100%}}
qou85r6627dpnqyb808xo4sn8vuuz7p
4676715
4676712
2026-10-18T09:05:32Z
Larsnooden
430753
typos
4676715
wikitext
text/x-wiki
<noinclude>{{simple chapter navigation|previous=File Transfer with SFTP|next=Certificate-based Authentication}}</noinclude>
Authentication keys can improve efficiency, if done properly. As a bonus advantage, the passphrase and private key never leave the client<ref name="RFC4252§7">{{cite web |url=https://tools.ietf.org/html/rfc4252#section-7 |title=The Secure Shell (SSH) Authentication Protocol |publisher=IETF |year=2006| accessdate=2015-05-06}}</ref>. Key-based authentication is generally recommended for outward facing systems so that password authentication can be turned off.
==Key-based authentication==
OpenSSH can use public key cryptography for authentication. In public key cryptography, encryption and decryption are asymmetric. The keys are used in pairs, a public key to encrypt and a private key to decrypt. The [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)] utility can make RSA, Ed25519, MLDSA44-Ed25519, ECDSA, Ed25519-SK, or ECDSA-SK keys for authenticating. Even though DSA keys can still be made, being exactly 1024 bits in size, they are no longer recommended and should be avoided. RSA keys are allowed to vary from 1024 bits on up. The default is now 3072. However, there is only limited benefit after 2048 bits and that makes elliptic curve algorithms preferable. ECDSA can be 256, 384 or 521 bits in size. Ed25519, Ed25519-SK, and ECDSA-SK keys each have a fixed length of 256 bits. Shorter keys are faster, but less secure. Longer keys are much slower to work with but provide better protection, up to a point.
Keys can be named to help remember what they are for. Because the key files can be named anything it is possible to have many keys each named for different services or tasks. The comment field at the end of the public key can also be useful in helping to keep the keys sorted, if you have many of them or use them infrequently.
The process of key-based authentication uses these keys to make a couple of exchanges using the keys to encrypt and decrypt some short message. At the start, a copy of the client's public key is stored on the server and the client's private key is on the client, both stay where they are. The private key never leaves the client. As the client first contacts the server, the server responds by using the client's public key to encrypt a random number and return that encrypted random number as a challenge to the client. The client responds to the challenge by using the matching private key to decrypt the message and extract the random number. The client then makes an MD5 hash of the session ID along with the random number from the challenge and returns that hash to the server. The server then makes its own hash of the session ID and the random number and compares that to the hash returned by the client. If there is a match, the login is allowed. If there is not a match, then the next of any public keys on the server registered as belonging to the same account is tried until either a match is found or all the keys have been tried or the maximum number of failures has been reached. <ref name="How Key Challenges Work">{{cite web | url=http://www.unixwiz.net/techtips/ssh-agent-forwarding.html#chal | title=An Illustrated Guide to SSH Agent Forwarding | author=Steve Friedl | date=2006-02-22 | accessdate=2013-04-27 | publisher=Unixwiz.net }}</ref>
When an agent is used on the client side to manage authentication, the process is similar. The difference is that [http://man.openbsd.org/ssh.1 ssh(1)] passes the challenge off to the agent which then calculates the response and passes it back to [http://man.openbsd.org/ssh.1 ssh(1)] which then passes the agent's response back to the server.
===Basics of Public Key Authentication===
A matching pair of SSH keys, one public and one private, is needed for public key authentication. The [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)] utility is used to make such a key pair. Out of that pair the public key must be properly stored on the remote host before using key-based authentication. The default location for it is the designated '''authorized_keys''' file, usually one such file resides inside each remote user account. The private key stays stored safely on the client.
Once the keys have been prepared and the remote account configured, they can be used for login. Before starting, there must already be an account on the remote system. The details of doing that are outside of the scope of this book. However, once you have a remote account, there are four steps to set up key-based authentication for it:
'''1''') Prepare a directory on the client (say a laptop or a desktop) where the keys will stay, if there isn't one already. For example, if the '''.ssh''' directory is not on the client machine, create it and set the permissions correctly. It is important that it not be writable by any account except its owner:
<syntaxhighlight lang="shell-session">
$ mkdir ~/.ssh/
$ chmod 0700 ~/.ssh/
</syntaxhighlight>
'''2''') Create a key pair inside the designated directory. The example here creates an Ed25519 key pair in the directory '''~/.ssh'''. The option '''-t''' decides the key type and the option '''-f''' assigns the key file a name. It is good to give key files descriptive names, especially if larger numbers of keys are managed. Below, the public key will be named '''fred_example_org_ed25519.pub''' and the private key will be called '''fred_example_org_ed25519'''. Lastly, the '''-C''' option is used to embed a descriptive comment inside the private key itself. The comment is useful for figuring out later what the key is for when one has many keys or a lot of time has passed or both.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -t ed25519 -f ~/.ssh/fred_example_org_ed25519 \
-C "from fred's laptop to server.example.org"
</syntaxhighlight>
Be sure to enter a solid passphrase so that the private key gets encrypted using 128-bit AES. That way the private key can only be read or used when the passphrase is given.
Ed25519, Ed25519-SK, and ECDSA-SK keys have fixed lengths. For RSA and ECDSA keys, the '''-b''' option sets the number of bits used for those kinds of keys.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -o -b 4096 -t rsa -f ~/.ssh/fred_example_org_rsa \
-C "from fred's laptop to server.example.org"
</syntaxhighlight>
Since 6.5 a new private key format is available using a [http://man.openbsd.org/bcrypt.3 bcrypt(3)] key derivative function (KDF) to better protect keys at rest. This new format is always used for Ed25519 keys, and sometime in the future will be the default for all keys. But for right now it may be requested when generating or saving existing keys of other types via the '''-o''' option in [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)].
Details of the new format are found in the source code in the file '''PROTOCOL.key'''.
'''3''') Get the keys to the right places. Transfer only the public key to remote machine. The following assume the default locations for the authorized keys as specified in the server's configuration file by the '''AuthorizedKeysFile''' directive.
'''3a''') If the utility <code>ssh-copy-id</code> exists, and if password authentication is allowed, then it can be used to put the public key into place on the remote system. The ''.pub'' is optional here, the script will figure it out if omitted.
<syntaxhighlight lang="shell-session">
$ ssh-copy-id -i ~/.ssh/fred_example_org_ed25519 fred@server.example.org
</syntaxhighlight>
If that script was successful in transferring the public key, then go on to step 4 below and test the key. If not, then try transferring the public key manually as described in step 3b next.
'''3b''') Or the public key can be put in place manually on the remote machine. For that the remote '''.ssh''' directory is needed, and within that a special file to store the public keys, the default file name is '''authorized_keys'''. If either the '''authorized_keys''' file or '''.ssh''' directory do not exist on the remote machine, they need to be created.
<syntaxhighlight lang="shell-session">
$ mkdir -m 700 ~/.ssh/
$ touch ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys
$ nano -w ~/.ssh/authorized_keys
</syntaxhighlight>
Then any editor which does not wrap long lines can be used to add the public key. However the '''authorized_keys''' file is edited to add the key, the key itself must be in the file whole and unbroken on a single line. For example, [http://linux.die.net/man/1/nano nano(1)] can be started with the '''-w''' option to prevent wrapping of long lines. (Another way to set line wrapping permanently in [http://linux.die.net/man/1/nano nano(1)] is by editing [http://linux.die.net/man/5/nanorc nanorc(5)].)
If the key pair is not already on the client, transfer both the public and private keys there. It is usually best to keep both the public and private keys together in the directory '''~/.ssh/''', though the public key is not always needed on the client after this step and could even be regenerated if it is ever needed again.
'''4''') Test the keys
While remaining logged in via the first terminal, use the client system to open another window and in it start another SSH session and try authenticating to the remote machine from the client using the private key.
<syntaxhighlight lang="shell-session">
$ ssh -i ~/.ssh/fred_example_org_ed25519 -l fred server.example.org
</syntaxhighlight>
The option '''-i''' tells [http://man.openbsd.org/ssh.1 ssh(1)] which private key to try.
Only after verifying that the key-based authentication works should you close the original window.
It is possible to make permanent shortcuts on the client using [http://man.openbsd.org/ssh_config.5 ssh_config(5)], explained further below, once key-based authentication is working. In particular, see the '''IdentityFile''', '''IdentitiesOnly''', and '''AddKeysToAgent''' configuration directives, to name three.
It is also a good idea to turn off password authentication, if and only if key-based authentication is setup for all the necessary remote accounts.
➥ '''Troubleshooting of Key-based Authentication''':
If the server refuses to accept the key and fails over to the next authentication method (e.g.: "Server refused our key"), then there are several possible mistakes to look for on the server side.
One of the most common errors is that the file and directory permissions are wrong. The authorized keys file must be owned by the user in question and not be group writable. Nor may the key file's directory be group or world writable.
<syntaxhighlight lang="shell-session">
$ chmod u=rwx,g=rx,o= ~/.ssh
$ chmod u=rw,g=,o= ~/.ssh/authorized_keys
</syntaxhighlight>
Another mistake that can happen is if the key inside the '''authorized_keys''' file on the remote host is broken by line breaks or has other whitespace in the middle. That can be fixed by joining up the lines and removing the spaces or by recopying the key more carefully.
And, though it should go without saying, the halves of the key pair need to match. The public key on the server needs to match the private key held on the client. If the public key is lost, then a new one can be generated with the '''-y''' option, but not the other way around. If the private key is lost, then the public key should be erased as it is no longer of any use. If many keys are in use for an account, it might be a good idea to add comments to them. On the client, it can be a good idea to know which server the key is for, either through the file name itself or through the comment field. A comment can be added using the '''-C''' option.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -t ed25519 -f ~/.ssh/fred_example_org_ed25519 -C "web server mirror"
</syntaxhighlight>
On the server, it can be important to annotate which client they key is from if there is more than one public key there in an account. There the comment can be added to the authorized keys file on the server in the last column if a comment does not already exist. Again, the format of the authorized keys file is given in the manual page for [http://man.openbsd.org/sshd.8 sshd(8)] in the section "AUTHORIZED_KEYS FILE FORMAT". If the keys are not labeled they can be hard to match, which might or might not be what you want.
====Associating Keys Permanently with a Server====
A key can be specified at run time, but to save retyping the same paths again and again, the '''Host''' directive in [http://man.openbsd.org/ssh_config.5 ssh_config(5)] can apply specific settings to a target host. In this case, by changing '''~/.ssh/config''' it is possible to assign particular keys to be tried automatically whenever making a connection to that specific host. After adding the following lines to '''~/.ssh/config''', all that's needed is to type <code>ssh ''web1''</code> to connect with the key for that server.
<syntaxhighlight lang="apache" line="1">
Host web1
Hostname 198.51.100.32
IdentitiesOnly yes
IdentityFile /home/fred/.ssh/web_key_ed25519
</syntaxhighlight>
The '''~/.ssh/config''' below uses different keys for ''server'' versus ''server.example.org'', regardless whether they resolve to the same machine. This is possible because the host name argument given to [http://man.openbsd.org/ssh.1 ssh(1)] is not converted to a canonicalized host name before matching.
<syntaxhighlight lang="apache" line="1">
Host server
IdentitiesOnly yes
IdentityFile /home/fred/.ssh/key_a_ed25519
Host server.example.org
IdentitiesOnly yes
IdentityFile /home/fred/.ssh/key_b_ed25519
</syntaxhighlight>
In this example the shorter name is tried first, but of course less ambiguous shortcuts can be made instead. The configuration file gets parsed on a first-match basis. So the most specific rules go at the beginning and the most general rules go at the end.
====Encrypted Home Directories====
When using encrypted home directories the keys must be stored in an unencrypted directory. That means somewhere outside the actual home directory which means [http://man.openbsd.org/sshd.8 sshd(8)] needs to be configured appropriately to find the keys in that special location.
Here is one method for solving the access problem. Each user is given a subdirectory under '''/etc/ssh/keys/''' which they can then use for storing their '''authorized_keys''' file. This is set in the server's configuration file '''/etc/ssh/sshd_config'''
<syntaxhighlight lang="apache" line="1">
AuthorizedKeysFile /etc/ssh/keys/%u/authorized_keys
</syntaxhighlight>
Setting a special location for the keys opens up more possibilities as to how the keys can be managed and multiple key file locations can be specified if they are separated by whitespace. The user does not have to have write permissions for the '''authorized_keys''' file. Only read permission is needed to be able to log in. But if the user is allowed to add, remove, or change their keys, then they will need write access to the file to do that.
One symptom of having an encrypted home directory is that key-based authentication only works when you are already logged into the same account, but fails when trying to make the first connection and log in for the first time.
Sometimes it is also necessary to add a script or call a program from '''/etc/ssh/sshrc''' immediately after authentication to decrypt the home directory.
====Passwordless Login====
One solution for passwordless logins is to still have a passphrase and work with an authentication agent in conjunction with a single-purpose key. Most desktop environments launch an SSH agent automatically these days. It will be visible in the '''SSH_AUTH_SOCK''' environment variable if it is. On accounts with an agent, [http://man.openbsd.org/ssh-add.1 ssh-add(1)] can load private keys into an available agent.
<syntaxhighlight lang="shell-session">
$ ssh-add ~/.ssh/fred_example_org_ed25519
</syntaxhighlight>
Thereafter, the client will automatically check the agent for the key when appropriate. If there are many keys in the agent, it will become necessary to set '''IdentitiesOnly'''. See the above section on using '''~/.ssh/config''' for that. See [[OpenSSH/Cookbook/Public_Key_Authentication#Key-based_Authentication_Using_an_Agent|Key-based Authentication Using an Agent]] below.
Another, riskier, way of allowing passwordless logins is to follow the steps above, but simply do not enter a passphrase when asked for one while creating the key. Note that using keys that lack a passphrase is very risky, so the key files should be very well protected and kept track of, and ideally locked down with a '''command=''' option or '''ForceCommand''' directive on the server. That includes those keys which will only be used as single-purpose keys as described below.
Timely key rotation becomes especially important. In general, it is not a good idea to make a key without a passphrase.
====Requiring Both Keys and a Password====
While users should have strong passphrases for their keys, there is no way to enforce or verify that. Indeed, since neither the private key nor its the passphrase ever leave the client machine there is nothing that the server can do to have any influence over that. Instead, it is possible to require both a key and a password. Starting with OpenSSH 6.2, it is possible for the server to require multiple authentication methods for login using the '''AuthenticationMethods''' directive.
<syntaxhighlight lang="apache" line="1">
AuthenticationMethods publickey,password
</syntaxhighlight>
This example from [http://man.openbsd.org/sshd_config.5 sshd_config(5)] requires that users first authenticate using a key and it only queries for a password if the key succeeds. Thus with that configuration it is not possible to get to the system password prompt without first authenticating with a valid key. Changing the order of the arguments changes the order of the authentication methods.
====Requiring Two or More Keys====
Since OpenSSH 6.8, the server now remembers which public keys have been used for authentication and refuses to accept previously-used keys. This allows a set up requiring that users authenticate using two different public keys, maybe one in the file system and the other in a hardware token.
<syntaxhighlight lang="apache" line="1">
AuthenticationMethods publickey,publickey
</syntaxhighlight>
The '''AuthenticationMethods''' directive, whether for keys or passwords, can also be set on the server under a '''Match''' directive to apply only to certain groups or situations.
====Requiring Certain Key Types For Authentication====
Also since OpenSSH 6.8, the '''PubkeyAcceptedKeyTypes''' directive, later changed to '''PubkeyAcceptedAlgorithms''', can specify which key algorithms are accepted for authentication. Those not in the comma-separated pattern list are not allowed.
<syntaxhighlight lang="apache" line="1">
PubkeyAcceptedAlgorithms ssh-ed25519*,ssh-rsa*,ecdsa-sha2*,sk-ssh-ed25519*,sk-ecdsa-sha2*
</syntaxhighlight>
Either the actual key types or a pattern can be in the list. Spaces are not allowed in the pattern list. The exact list of key types supported for authentication can be found by the '''-Q''' option using the client. The following two lines are equivalent.
<syntaxhighlight lang="shell-session">
$ ssh -Q key-sig | sort
$ ssh -Q PubkeyAcceptedAlgorithms | sort
</syntaxhighlight>
For host-based authentication, it is the '''HostbasedAcceptedAlgorithms''' directive which determines the key types which are allowed for authentication.
===Key-based Authentication Using the AuthorizedKeysCommand Directive===
It is possible to use a program or script to look up public keys rather than keeping them in a static file or files. Any command called by the '''AuthorizedKeysCommand''' directive needs to either produce a syntactically correct public key while returning the exit code for a successful run or else return the exit code for failure. The string sent to '''stdout''' will then be processed as part of the authentication work flow.
Here is a shell script<ref name="janpietmens">{{cite web |url=https://jpmens.net/2025/03/25/authorizedkeyscommand-in-sshd/ |title=SSH keys from a command: sshd's AuthorizedKeysCommand directive |accessdate=2025-04-04 |date=2025-03-25 | author=Jan-Piet Mens }}</ref> at its simplest, without constraints, demonstrating a public key lookup:
<syntaxhighlight lang="shell">
#!/bin/sh
echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKs/UouletvojgB1YeRZ4MY6iRblQ2ERDuNhQO4tOvdL"
exit 0
</syntaxhighlight>
For authentication to succeed, the script must return exit code 0 (success) after sending the syntactically correct matching public key to '''stdout'''. For the SSH daemon to even run the script in the first place, the script must have the correct file and directory permissions.
Both the '''AuthorizedKeysCommandUser''' directive and '''AuthorizedKeysCommand''' must be used together. The former designates which account the script or program use when run. If set to ''none'' or if it does not refer to a valid account then [http://man.openbsd.org/sshd sshd(8)] will just ignore the command. If '''AuthorizedKeysCommand''' is set, and '''AuthorizedKeysCommandUser''' is left empty or missing, then [http://man.openbsd.org/sshd sshd(8)] won't even run when invoked. The error will be:
<syntaxhighlight lang="text">
AuthorizedKeysCommand set without AuthorizedKeysCommandUser
</syntaxhighlight>
The '''AuthorizedKeysFile''' is always tried first when it is present in the server configuration. The '''AuthorizedKeysCommand''' directive will not even be tried when the authorized keys file can provide a relevant key first.
====A More Detailed Example Using the AuthorizedKeysCommand Directive====
By default the user name trying to log in is passed to the script when no tokens or arguments are provided. Whether or how that information is used is up to the script. The SSH daemon can also pass any combination of the tokens described in the TOKENS section of [http://man.openbsd.org/sshd_config sshd_config(5)] into the program or script being called. Furthermore, the program or script can even be a front end for a database, such as OpenLDAP, or any similar system, as long as '''stdout''' produces a public key.
Below is a more detailed example which uses a local script named '''keyfinder''' run with the account '''keys''' to look up the a public key for certain accounts. First in [http://man.openbsd.org/sshd_config sshd_config(5)] the two directives:
<syntaxhighlight lang="apache" line="1">
AuthorizedKeysCommand /usr/local/sbin/keyfinder %U
AuthorizedKeysCommandUser keys
</syntaxhighlight>
The script below is only a demonstration and a more complex program can call databases or do advanced lookups or heuristics:
<syntaxhighlight lang="shell">
#!/bin/sh
set -e
case $1 in
"1000")
echo "ssh-ed25519 AAAAC3NzaC1lZDIE5AAAAIK89...UT9hz"
;;
"1001")
echo "restrict ssh-ed25519 AAAAC3NzaC1lZDI1NTAAIBvGx...Y0zxV"
;;
"1002")
echo "command=\"/usr/libexec/sftp-server\" ssh-ed25519 AAAAC3NzaC1lZDI1TE5AIPSyY...cPTg3"
;;
*)
exit 1
;;
esac
exit 0
</syntaxhighlight>
The '''AuthorizedKeysCommand''' scripts or programs can return any correctly formatted public key to '''stdout''' for consideration in the authentication process. That includes adding constraints to the keys. Above, the account with the UID 1000 has no constraints, while the account with UID 1001 is quite constrained. Finally, the account with the UID 1002 can only access the SFTP service. See the section "AUTHORIZED_KEYS FILE FORMAT" in [http://man.openbsd.org/sshd sshd(8)] for the full set of possibilities.
===Key-based Authentication Using an Agent===
When an authentication agent, such as [http://man.openbsd.org/ssh-agent.1 ssh-agent(1)], is going to be used, it should generally be started at the beginning of a session and used to launch the login session or X-session so that the environment variables pointing to the agent and its UNIX-domain socket are passed to each subsequent shell and process. Many desktop distros do this automatically upon login or startup.
Starting an agent entails setting a pair of environment variables:
* SSH_AGENT_PID : the process id of the agent
* SSH_AUTH_SOCK : the filename and full path to the UNIX-domain socket
The various SSH and SFTP clients find these variables automatically and use them to contact the agent and try when authentication is needed. However, it is mainly SSH_AUTH_SOCK which is ever used. If the shell or desktop session was launched using [http://man.openbsd.org/ssh-agent.1 ssh-agent(1)], then these variables are already set and available. If they are not available, then it is necessary to either set the variables manually inside each shell or for each application in order to use the agent or else to point to the agent's socket using the directive '''IdentityAgent''' in the client's configuration file.
Once an agent is available, a relevant private key needs to be loaded before the agent can be used. Once in the agent the private key can then be used many times. Private keys are loaded into an agent with [http://man.openbsd.org/ssh-add.1 ssh-add(1)].
<syntaxhighlight lang="shell-session">
$ ssh-add /home/fred/.ssh/mykey_ed25519
Identity added: /home/fred/.ssh/mykey_ed25519 (/home/fred/.ssh/mykey_ed25519)
</syntaxhighlight>
Keys stay in the agent for as long as it is running unless specified otherwise. A timeout can be set either with the '''-t''' option when starting the agent itself or when actually loading the key using [http://man.openbsd.org/ssh-add.1 ssh-add(1)]. In either case, the '''-t''' option will set a timeout interval, after which the key will be purged from the agent.
<syntaxhighlight lang="shell-session">
$ ssh-add -t 1h30m /home/fred/.ssh/mykey_ed25519
Identity added: /home/fred/.ssh/mykey_ed25519 (/home/fred/.ssh/mykey_ed25519)
Lifetime set to 5400 seconds
</syntaxhighlight>
The option '''-l''' will list the fingerprints of all of the identities in the agent.
<syntaxhighlight lang="shell-session">
$ ssh-add -l
256 SHA256:77mfUupj364g1WQ+O8NM1ELj0G1QRx/pHtvzvDvDlOk mykey for task x (ED25519)
3072 SHA256:7unq90B/XjrRbucm/fqTOJu0I1vPygVkN9FgzsJdXbk myotherkey rsa for task y (RSA)
</syntaxhighlight>
It is also possible to remove individual identities from the agent using '''-d''' which will remove them one at a time if identified by file name, but only if the file name is given and without the file name of the private key to be remove, '''-d''' will fail silently. Using '''-D''' instead will remove all of them at once without needing to specify any by name.
By default [http://man.openbsd.org/ssh-add.1 ssh-add(1)] uses the agent connected via the socket named in the environment variable '''SSH_AUTH_SOCK''', if it is set. Currently, that is its only option. However, for [http://man.openbsd.org/ssh.1 ssh(1)] an alternative to using the environment variable is the client configuration directive '''IdentityAgent''' which tells the SSH clients which socket to use to communicate with the agent. If both the environment variable and the configuration directive are available at the same time, then the value in '''IdentityAgent''' takes precedence over what's in the environment variable. '''IdentityAgent''' can also be set to ''none'' to prevent the connection from trying to use any agent at all.
The client configuration directive '''AddKeysToAgent''' can also be useful in getting keys into an agent as needed. When set, it automatically loads a key into a running agent the first time the key is called for if it is not already loaded. Likewise the '''IdentitiesOnly''' directive can ensure that the relevant key is offered on the first try. Rather than typing these out whenever the client is run, they can be added to '''~/.ssh/config''' and thereby added automatically for designated host connections.
====Agent Forwarding====
Agent forwarding is one means of passing through one or more intermediate hosts. However, the '''-J''' option for '''ProxyJump''' would be a safer option. See [[OpenSSH/Cookbook/Proxies_and_Jump_Hosts#Jump_Hosts_--_Passing_Through_a_Gateway_or_Two | Passing Through a Gateway or Two]] in the section on jump hosts about that. With agent forwarding, intermediate machines forward challenges and responses back and forth between the client and the final destination. This comes with some risks but eliminates the need for using passwords or holding keys on any of these intermediate machines.
A main advantage of agent forwarding is that the private key itself is not needed on any remote machine, thus hindering unwanted file system access to it. <ref name="OpenSSH key management, Part 3">{{cite web | url=http://www.ibm.com/developerworks/library/l-keyc3/ | title=Common threads: OpenSSH key management, Part 3 | author=Daniel Robbins | publisher=IBM | date=2002-02-01 | accessdate=2013-04-27}}</ref> Another advantage is that the actual agent to which the user has authenticated does not go anywhere and is thus less susceptible to analysis.
One risk with agents is that they can be re-used to tailgate in if the permissions allow it. Keys cannot be copied this way, but authentication is possible when there are incorrect permissions. Note that disabling agent forwarding does not improve security unless users are also denied shell access, as they can always install their own forwarders.
The risks of agent forwarding can be mitigated by confirming each use of a key by adding the '''-c''' option when adding the key to the agent. This requires the SSH_ASKPASS variable be set and available to the agent process, but will generate a prompt on the host running the agent upon each use of the key by a remote system. So if passing through one or more intermediate hosts, it is usually better to instead have the SSH client use stdio forwarding with '''-W''' or '''-J'''.
On the client side agent forwarding is disabled by default and so if it is to be used it must be enabled explicitly. Put the following line in [http://man.openbsd.org/ssh_config.5 ssh_config(5)] to enable agent forwarding for a particular server:
<syntaxhighlight lang="apache" line="1">
Host gateway.example.org
ForwardAgent yes
</syntaxhighlight>
On the server side the default configuration files allow authentication agent forwarding, so to use it, nothing needs to be done there, just on the client side. However, again, it would be preferable to take a look at '''ProxyJump''' instead.
=====New Style SSH Agent Destination Constraints=====
Using the '''ProxyJump''' option instead of authentication agent forwarding is still the best way to pass through other systems while avoiding the exposure of private keys, something which could happen forwarding agents. However, from 8.9 onward, [http://man.openbsd.org/ssh-agent.1 ssh-agent(1)] will allow the agent to limit which hosts it will use for authentication as specified by [http://man.openbsd.org/ssh-add.1 ssh-add(1)] using the '''-h''' option. These constraints have been added through two agent protocol extensions and a modification to the public key authentication protocol. This feature may evolve, but for now the result is such that keys for account authentication can be loaded into the agent in four ways:
* no limits on forwarding (not recommended)
* local use only, these will not get forwarded
* forwarding, but only to specific remote hosts
* forwarding to specific remote hosts via specified routes
The intent is that the restrictions fail safely so that they do not allow authentication when one or more hosts in the route lack the needed protocol features. The destinations and routes cannot be modified once the keys are loaded, but multiple routes to the same destination can be loaded and the routes can be any number of hops. If the routes need changing, then the key must be reloaded into the agent with the new route or routes.
The general default for the client is to keep keys in the agent for local use only. However, that can be enforced explicitly by adding the '''-a''' option when starting the client or else setting the '''ForwardAgent''' directive in [http://man.openbsd.org/ssh_config.5 ssh_config(5)] to 'no' in the relevant configuration block.
In order to load keys for unlimited forwarding, which is not the best idea, just add them using [http://man.openbsd.org/ssh-add.1 ssh-add(1)] as normal. Then use the '''-A''' option with the client or set the '''ForwardAgent''' directive in [http://man.openbsd.org/ssh_config.5 ssh_config(5)] to 'yes' in the relevant configuration block.
In order to limit keys for connection only to a specific remote host, or to load keys for connection to a specific remote host with forwarding via one or more intermediate hosts, use the '''-h''' option when loading keys into the agent. Here the one key may be used only to connect to the specific destination:
<syntaxhighlight lang="shell-session">
$ ssh-agent -h server.example.org server.key.ed25519
</syntaxhighlight>
If an intermediate system is passed through, the best way is to use '''ProxyJump''' which is the '''-J''' option for the SSH Client. If agent forwarding must be allowed then the tightest way is to constrain which systems may use the keys, again using the '''-h''' option.
<syntaxhighlight lang="shell-session">
$ ssh-agent -h middle.example.org -h "middle.example.org>server.example.org" server.key.ed25519
</syntaxhighlight>
Multiple steps can be included, even multiple routes. They just have to be enumerated explicitly, though patterns may still be used for the destination hosts as well as specific names. Each host in the chain must support these protocol extensions for the connection to complete.
Any keys designated for forwarding are unusable for authentication on any other hosts than those which have been explicitly identified for forwarding. These permitted hosts are identified by host key or host certificate from the '''known_hosts''' file or another file designated by the '''-H''' option when loading the key with [http://man.openbsd.org/ssh-add.1 ssh-add(1)]. If '''-H''' is not used at the time the keys are loaded into the agent, then the default known hosts file(s) will be used: '''~/.ssh/known_hosts''', '''/etc/ssh/ssh_known_hosts''', '''~/.ssh/known_hosts2''', and '''/etc/ssh/ssh_known_hosts2'''.
In the case of keys, the '''known_hosts''' list must be maintained conscientiously <ref name="ssh-agent-restrictions">{{ cite web | author=Damien Miller|url=https://www.openssh.org/agent-restrict.html | title=SSH agent restriction | publisher=OpenSSH | date=2021-12-16|accessdate=2022-03-06}}</ref>, perhaps with the help of the '''UpdateHostkeys''' and '''CanonicalizeHostname''' client configuration directives. Use of certificates requires the agent to only need to be aware of the Certificate Authority (CA).
Again, see [[OpenSSH/Cookbook/Proxies_and_Jump_Hosts#Jump_Hosts_--_Passing_Through_a_Gateway_or_Two | Passing Through a Gateway or Two]] in the section on jump hosts about a way to pass through one or more intermediate machines without needing to forward an SSH agent.
=====Old Style, Almost Safe SSH Agent Forwarding=====
The best way to pass through one or more intermediate hosts is to use the '''ProxyJump''' option instead of authentication agent forwarding and thereby not risking the exposure of any private keys. If authentication agent forwarding must be used, then it would be advisable in the interest of following the principle of least privilege to forward an agent containing the minimum necessary number of keys. There are several ways to solve that.
In version 8.8 and earlier a partial solution is to make a one-off, ephemeral agent to hold just the one key or keys needed for the task at hand. Another partial solution would be to set up a user-accessible service at the operating system level and then use [http://man.openbsd.org/ssh_config.5 ssh_config] for the rest.
Automatically launching an ephemeral agent unique to each session can be done by crafting either a special shell alias or function to launch a single-use agent. Either the function or the alias can be written to require confirmation for each requested signature. The following example is a function is inspired by an updated blog post by Vincent Bernat<ref name="safer-agent-forwarding">{{cite web |url=https://vincent.bernat.ch/en/blog/2020-safer-ssh-agent-forwarding |title=Safer SSH agent forwarding |author=Vincent Bernat|date=2020-04-05 |accessdate=2020-10-04}}</ref> on SSH agent forwarding:
<syntaxhighlight lang="shell-session">
$ agentssh() {
ssh-agent ssh -o AddKeysToAgent=confirm -o ForwardAgent=yes
}
</syntaxhighlight>
Note the use of [http://man.openbsd.org/ssh-agent.1 ssh-agent(1)]. When invoking that alias, the SSH client will be launched with a unique, ephemeral supporting key agent. The alias sets up a new agent, including setting the two environment variables, and then sets two client options while calling the client. This arrangement still checks with [http://man.openbsd.org/ssh_config.5 ssh_config(5)] for other options and settings. When the SSH session is finished the agent which launched it ends and goes away, thus cleaning up after itself automatically.
Another way is to rely on the client's configuration file for some of the settings. Such methods rely mostly on [http://man.openbsd.org/ssh_config.5 ssh_config(5)] but still require an independent method to launch an ephemeral agent because the OpenSSH client is already running by the time it reads the configuration file and is thus not affected by any changes to environment variables caused by the configuration file and it is through the environment variables that contain information about the agent. However, when the path to the UNIX-domain socket used to communicate with the authentication agent is decided in advance then the '''IdentityAgent''' option can point to it once the one-off agent<ref name="wikimedia_ssh_agents">{{cite web |url=https://wikitech.wikimedia.org/wiki/Managing_multiple_SSH_agents#Linux_solutions |title=Managing multiple SSH agents |publisher=Wikimedia|accessdate=2020-04-07}}</ref> is actually launched. The following uses a specific agent's pre-defined socket whenever connecting to either of two particular domains:
<syntaxhighlight lang="apache" line="1">
Host *.wikimedia.org *.wmflabs.org
User fred
IdentitiesOnly yes
IdentityFile %d/.ssh/id_cloud_01
IdentityAgent /run/user/%i/ssh-cloud-01.socket
ForwardAgent yes
AddKeysToAgent yes
</syntaxhighlight>
The '''%d''' stands for the path to the home directory and the '''%i''' stands for the user id (UID) for the current account. In some cases the '''%i''' token might also come in handy when setting the '''IdentityAgent''' option inside the configuration file. Again, be careful when forwarding agents with which keys are in the forwarded agent. See the section "TOKENS" in [http://man.openbsd.org/ssh_config.5 ssh_config(5)] for more such abbreviations.
With those configuration settings, the authentication agent must already be up and running and point to the designated socket prior to starting the SSH client for that configuration to work. Additionally, it should place the socket in a directory which is inaccessible to any other accounts. [http://man.openbsd.org/ssh-agent.1 ssh-agent(1)] must use the '''-a''' option to name the socket:
<syntaxhighlight lang="shell-session">
$ ssh-agent -a /run/user/${UID}/ssh-cloud-01.socket
</syntaxhighlight>
That agent configuration can be launched manually or via a script or service manager. However, in the interests of privacy and security in general, agent forwarding is to be avoided. The configuration directive '''ProxyJump''' is the best alternative and, on older systems, host traversal using '''ProxyCommand''' with [http://man.openbsd.org/nc.1 netcat] are preferable. Again, see the section on [[OpenSSH/Cookbook/Proxies and Jump Hosts|Proxies and Jump Hosts]] for how those methods are used.
====Checking the Agent for Specific Keys====
The [http://man.openbsd.org/ssh_add ssh_add(1)] utility's '''-T''' option can test whether a specific private key is available in the agent or not by looking up the matching public key. That can be useful in a shell script.
<syntaxhighlight lang="shell">
#!/bin/sh
key=/home/fred/.ssh/some.key.ed25519.pub
if ssh-add -T ${key}; then
echo "Key ${key} Found"
else
echo "Key ${key} missing"
fi
</syntaxhighlight>
Or it could be done with an alternate syntax just as well either in a script or in an interactive shell sessions,
<syntaxhighlight lang="shell-session">
$ key=/home/fred/.ssh/some.key.ed25519.pub
$ ssh-add -T ${key} && echo "Key found" || echo "Key missing"
</syntaxhighlight>
However, if the desired result would be to add key to the agent then the '''AddKeysToAgent''' client configuration option can ensure that a specific key is added to the SSH agent upon first use during any given login session. That can be done using '''-o AddKeysToAgent=yes''' as a run-time argument, or by modifying [http://man.openbsd.org/ssh_config ssh_config(5)] as appropriate:
<syntaxhighlight lang="apache" line="1">
Host www
HostName www.example.com
IdentityFile %d/.ssh/www.ed25519
IdentitiesOnly yes
AddKeysToAgent yes
</syntaxhighlight>
With those options in the configuration file, the first time <code>ssh www</code> is run the specified key will get added to the agent and remain available.
===Key-based Authentication Using A Hardware Security Token===
While stand-alone keys have been around for a long time, it has been possible since version 8.2 to use keys backed by hardware security tokens, such as OnlyKey, Yubikey, or many others, though the FIDO2 protocol. The Universal 2nd Factor (U2F) authentication is supported directly in OpenSSH through FIDO2 and does not need third party software. At the moment there are two types of hardware backed keys, ECDSA-SK and Ed25519-SK, but only the latest hardware tokens support the latter. If the key Ed25519-SK format is not supported by the token's firmware, then the following error message will be presented when attempts to use that key type are made:
<syntaxhighlight lang="text">
Key enrollment failed: invalid format
</syntaxhighlight>
If supported, either key type can be created with [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)]. The steps are almost identical to creating normal keys but the token must be available to the system (plugged in) first. Then if called for, the token's PIN must be entered and the token touched or otherwise activated. After that, the key creation proceeds as normal. Mind the key type as specified by the '''-t''' option.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -t ed25519-sk -f /home/fred/.ssh/server.ed25519-sk -C "web server for fred"
Generating public/private ed25519-sk key pair.
You may need to touch your authenticator to authorize key generation.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/fred/.ssh/server.ed25519-sk
Your public key has been saved in /home/fred/.ssh/server.ed25519-sk.pub
The key fingerprint is:
SHA256:41wVVDnKJ9gKr2Sj4CFuYMhcNvYebZ6zq0PWyP4rRDo web server
The key's randomart image is:
+[ED25519-SK 256]-+
| .o... |
| .o |
| +.. . |
| = . . ..= . |
|+ + * + So.. o |
|o+.EoO *+oo |
|.o oBo+++o |
| o .=.+. |
| . .=== |
+----[SHA256]-----+
</syntaxhighlight>
Once created, the public and private key files get handled like with any other type of key. But when authenticating, the hardware token must be present and activated when called for.
<syntaxhighlight lang="shell-session">
$ ssh -i /home/fred/.ssh/server.ed25519-sk server.example.org
Enter passphrase for key '/home/fred/.ssh/server.ed25519-sk':
Confirm user presence for key ED25519-SK SHA256:41wVVDnKJ9gKr2Sj4CFuYMhcNvYebZ6zq0PWyP4rRDo
</syntaxhighlight>
The resulting private key file is not actually the key itself but instead a "key handle" which is used by the hardware security token to derive the real private key on demand at the time it is actually used<ref name="OpenBSD_tech_U2F_FIDO">{{cite web |url=https://marc.info/?l=openbsd-tech&m=157376801917387&w=2 |title=OpenSSH U2F/FIDO support in base
|publisher=OpenBSD-Tech Mailing List | date=2019-11-14
|accessdate=2021-03-24}}</ref>. As a result, the hardware-backed private key file is useless without the accompanying hardware token. This also means that these key files are not portable across hardware tokens, say when having multiple tokens in reserve or as backup, even when used by the same account. So when multiple hardware tokens are in use, different key pairs must be generated for each token.
====Hardware Security Token Resident Private Key====
It is possible to store the private key within the token itself, but for the moment it cannot be used directly from inside the token and must first be saved as a file. Also, the key can only be loaded into the FIDO authenticator at the time of creation using the '''-O resident''' option with [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)]. Otherwise, the process is the same as above.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -O resident -t ed25519-sk -f /home/fred/.ssh/server.ed25519-sk -C "web server for fred"
. . .
</syntaxhighlight>
When needed, the resident key can be extracted from the FIDO2 hardware token and saved into a file using the '''-K''' option. At this stage a passphrase can be added to the file, but no passphrase is kept within the token itself, only an optional PIN protects the key there.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -K
Enter PIN for authenticator:
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Saved ED25519-SK key to id_ed25519_sk_rk
$ mv -i id_ed25519_sk_rk /home/fred/.ssh/server.ed25519-sk
</syntaxhighlight>
Since the output file name is fixed, any pre-existing file with that name can get overwritten but there will be a warning first. However, it is not recommended to keep the key on the hardware token because it provides more protection when kept separately.
==Single-purpose Keys==
Tailored single-purpose keys can eliminate use of remote root logins for many administrative activities. A finely tailored '''sudoers''' is needed along with an unprivileged account. When done right, it gives just enough access to get the job done, following the security principle of Least Privilege.
Single-purpose keys are accompanied by use of either the '''ForceCommand''' directive in [http://man.openbsd.org/ssh_config.5 sshd_config(5)] or the '''command="..."''' directive inside the '''authorized_keys''' file. The method is to generate a new key pair, transfer the public key to '''authorized-keys''' on the remote system, and then prepend the appropriate command or script there to the line with the key.
<syntaxhighlight lang="shell-session">
$ grep '^command' ~/.ssh/authorized_keys
command="/usr/local/bin/somescript.sh" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEcgdzDvSebOEjuegEx4W1I/aA7MM3owHfMr9yg2WH8H
</syntaxhighlight>
The '''command="..."''' directive inserted there overrides everything else and ensures that when logging in with just that key only the script '''/usr/local/bin/somescript.sh''' is run. If it is necessary to pass parameters to the script, have a look at the contents of the '''SSH_ORIGINAL_COMMAND''' environment variable and use it in a case statement. Do not ever trust the contents of that variable nor use the contents directly, always indirectly.
Single-purpose keys are useful for allowing only a tunnel and nothing more. The following key will only echo some text and then exit, unless used non-interactively with the '''-N''' option.
<syntaxhighlight lang="shell-session">
$ grep '^command' ~/.ssh/authorized_keys
command="/bin/echo do-not-send-commands" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBzTIWCaILN3tHx5WW+PMVDc7DfPM9xYNY61JgFmBGrA
</syntaxhighlight>
No matter what the user tries while logging in with that key, the session will only echo the given text and then exits. Using the '''-N''' option disables running the remote program, allowing the connection to stay open, allowing a tunnel.
<syntaxhighlight lang="shell-session">
$ ssh -L 3306:localhost:3306 \
-i ~/.ssh/tunnel_ed25519 \
-N \
-l fred \
server.example.com
</syntaxhighlight>
That creates a tunnel and stays connected despite a key configuration which would close an interactive session. See also the '''-n''' or '''-f''' option for [http://man.openbsd.org/ssh.1 ssh(1)].
===Single-purpose Keys to Avoid Remote Root Access===
The easy way is to write a short shell script, place it '''/usr/local/bin/''', and then configure '''sudoers''' to allow the otherwise unprivileged account to run just that script and only that script.
<syntaxhighlight lang="apache" line="1">
%wheel ALL=(root:root) NOPASSWD: /usr/sbin/service httpd stop
%wheel ALL=(root:root) NOPASSWD: /usr/sbin/service httpd start
</syntaxhighlight>
Then the key calls the script using '''command="..."''' inside '''authorized_keys'''. Here the one key starts the web server, the other stops the web server.
<syntaxhighlight lang="shell-session">
$ grep '^command' ~/.ssh/authorized_keys
command="/usr/bin/sudo /usr/sbin/service httpd stop" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEcgdzDvSebOEjuegEx4W1I/aA7MM3owHfMr9yg2WH8H
command="/usr/bin/sudo /usr/sbin/service httpd start" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMidyqZ6OCvbWqA8Zn+FjhpYE6NoWSxVjFnFUk6MrNZ4
</syntaxhighlight>
Complicated programs like [http://linux.die.net/man/1/rsync rsync(1)], [http://man.openbsd.org/tar.1 tar(1)], [http://linux.die.net/man/1/mysqldump mysqldump(1)], and so on require an advanced approach when building a single-purpose key. For them, the '''-v''' option can show exactly what is being passed to the server so that '''sudoers''' can be set up correctly. That way they can be restricted to only access designated parts of the file system. For example, here is what <code>ssh -v</code> shows from one particular usage of [http://linux.die.net/man/1/rsync rsync(1)], note the "Sending command" line:
<syntaxhighlight lang="shell-session">
$ rsync -e 'ssh -v' fred@server.example.org:/etc/ ./backup/etc/
. . .
debug1: Sending command: rsync --server --sender -e.LsfxC . /etc/
. . .
</syntaxhighlight>
That output can then be added to '''sudoers''' so that the key can do only that function.
<syntaxhighlight lang="shell-session">
%backup ALL=(root:root) NOPASSWD: /usr/bin/rsync --server --sender -e.LsfxC . /etc/
</syntaxhighlight>
Then to tie it all together, the account "backup" needs a key:
<syntaxhighlight lang="shell-session">
$ grep '^command' ~/.ssh/authorized_keys
command="/usr/bin/rsync --server --sender -e.LsfxC . /etc/" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMm0rs4eY8djqBb3dIEgbQ8lmdlxb9IAEuX/qFCTxFgb
</syntaxhighlight>
Many of these programs have a '''--dry-run''' or equivalent option. Remember to use it when figuring out the right settings.
===Read-only Access to Keys===
In some cases it is necessary to prevent accounts from being able to changing their own authentication keys. However, such situations may be a better case for using certificates. However, if done with keys it is accomplished by putting the key file in an external directory where the user has read-only access, both to the directory and to the key file. Then the '''AuthorizedKeysFile''' directive assigns where [http://man.openbsd.org/sshd.8 sshd(8)] looks for the keys and can point to a secured location for the keys instead of the default location.
A good alternate location could be a new directory '''/etc/ssh/authorized_keys''' which could store the selected accounts' key files there. The change can be made to apply to only a group of accounts by putting the settings under a '''Match''' directive. The default location for keys on most systems is usually '''~/.ssh/authorized_keys'''.
<syntaxhighlight lang="apache" line="1">
Match Group sftpusers
AuthorizedKeysFile /etc/ssh/authorized_keys/%u
</syntaxhighlight>
Then the permissions there would allow the keys to be read but not written:
<syntaxhighlight lang="shell-session">
$ ls -dhln /etc/ssh/
drwxr-x--x 3 0 0 4.0K Mar 30 22:16 /etc/ssh/authorized_keys/
$ ls -dhln /etc/ssh/*.pub
-rw-r--r-- 1 0 0 173 Mar 23 13:34 /etc/ssh/fred
-rw-r--r-- 1 0 0 93 Mar 23 13:34 /etc/ssh/user1
-rw-r--r-- 1 0 0 565 Mar 23 13:34 /etc/ssh/user2
. . .
</syntaxhighlight>
The keys could even be within subdirectories, though the same restrictions apply regarding permissions and ownership.
For chrooted SFTP, the method is the same to keep the key files out of reach of the accounts:
<syntaxhighlight lang="apache" line="1">
Match Group sftpusers
ChrootDirectory /home
ForceCommand internal-sftp -d %u
AuthorizedKeysFile /etc/ssh/authorized_keys/%u
</syntaxhighlight>
Of course a '''Match''' directive is not essential. The settings could be made to apply to all accounts by putting the directive in the main part of the server configuration file instead.
==Mark Public Keys as Revoked==
Keys can be revoked. Keys that have been revoked can be stored in '''/etc/ssh/revoked_keys''', a file specified in [http://man.openbsd.org/ssh_config.5 sshd_config(5)] using the directive '''RevokedKeys''', so that [http://man.openbsd.org/sshd.8 sshd(8)] will prevent attempts to log in with them. No warning or error on the client side will be given if a revoked key is tried. Authentication will simply progress to the next key or method.
The revoked keys file should contain a list of public keys, one per line, that have been revoked and can no longer be used to connect to the server. The key cannot contain any extras, such as [[OpenSSH/Client_Configuration_Files#Available_key_login_options | login options]] or it will be ignored. If one of the revoked keys is tried during a login attempt, the server will simply ignore it and move on to the next authentication method. An entry will be made in the logs of the attempt, including the key's fingerprint. See the section on [[OpenSSH/Logging_and_Troubleshooting | logging]] for a little more on that.
<syntaxhighlight lang="apache" line="1">
RevokedKeys /etc/ssh/revoked_keys
</syntaxhighlight>
The '''RevokedKeys''' configuration directive is not set in [http://man.openbsd.org/ssh_config.5 sshd_config(5)] by default. It must be set explicitly if it is to be used. This is another situation that might be better fulfilled through using certificate since a validity interval can be set in any combination of seconds, minutes, hours, days, or weeks can be set for certificates while keys are valid indefinitely.
===Key Revocation Lists===
A Key Revocation List (KRL) is a compact, binary form of representing revoked keys and certificates. In order to use a KRL, the server's configuration file must point to a valid list using the '''RevokedKeys''' directive. KRLs themselves are generated with [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)] and can be created from scratch or edited in place. Here a new one is made, populated with a single public key:
<syntaxhighlight lang="shell-session">
$ ssh-keygen -k -f /etc/ssh/revoked_keys -z 1 ~/.ssh/old_key_rsa.pub
</syntaxhighlight>
Here an existing KRL is updated by adding the '''-u''' option:
<syntaxhighlight lang="shell-session">
$ ssh-keygen -u -k -f /etc/ssh/revoked_keys -z 2 ~/.ssh/old_key_dsa.pub
</syntaxhighlight>
Once a KRL is in place, it is possible to test if a specific key or certificate is in the revocation list.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -Q -f /etc/ssh/revoked_keys ~/.ssh/old_key_rsa.pub
</syntaxhighlight>
Only public keys and certificates will be loaded into the KRL. Corrupt or broken keys will not be loaded and will produce an error message if tried. Like with the regular '''RevokedKeys''' list, the public key destined for the KRL cannot contain any extras like login options or it will produce an error when an attempt is made to load it into the KRL or search the KRL for it.
==Verify a Host Key by Fingerprint==
The above examples have been about using keys to authenticate the client to the server. A different context in which keys are used is when the server identifies itself to the client, which happens automatically at the beginning of each non-multiplexed session. In order for that identification to happen the client acquires a public key from the server, usually on or prior to first contact, which it can subsequently use to ensure that it is connecting to the same server again and not an impostor. The default locations for storing these acquired host keys on the client are in '''/etc/ssh/ssh_known_hosts''', if managed by the system administrator, or in '''~/.ssh/known_hosts''' if managed by the client's own account. The format of the contents is a line with a host address and its matching public key. The file is described in detail in the [http://man.openbsd.org/sshd.8 sshd(8)] manual page in the section "SSH_KNOWN_HOSTS FILE FORMAT".
When connecting for the first time to a remote host, the server's host key should be verified in order to ensure that the client is connecting to the right machine and not an impostor or anything else. Usually this verification is done by comparing the fingerprint of the server's host key rather than trying to compare the whole key itself. By default the client will show the fingerprint if the key is not already found in the '''known_hosts''' register.
<syntaxhighlight lang="shell-session">
$ ssh -l fred server.example.org
The authenticity of host 'server.example.org (192.0.32.10)' can't be established.
ECDSA key fingerprint is SHA256:LPFiMYrrCYQVsVUPzjOHv+ZjyxCHlVYJMBVFerVCP7k.
Are you sure you want to continue connecting (yes/no)?
</syntaxhighlight>
That can be compared to a fingerprint received out of band, say by post, e-mail, SMS, courier, and so on. Specifically, the example represents the key's fingerprint as a base64 encoded SHA256 checksum. That is the default style. The fingerprint can also be displayed as an MD5 hash in hexadecimal instead by passing the client's '''FingerprintHash''' configuration directive as a runtime argument or setting it in [http://man.openbsd.org/ssh_config.5 ssh_config(5)].
<syntaxhighlight lang="shell-session">
$ ssh -o FingerprintHash=md5 host.example.org
The authenticity of host 'host.example.org (192.0.32.203)' can't be established.
RSA key fingerprint is MD5:10:4a:ec:d2:f1:38:f7:ea:0a:a0:0f:17:57:ea:a6:16.
Are you sure you want to continue connecting (yes/no)?
</syntaxhighlight>
But the default in new versions is SHA256 in base64 has a lower chance of collision.
In OpenSSH 6.7 and earlier, the client showed fingerprints as a hexadecimal MD5 checksum instead a of the base64-encoded SHA256 checksum currently used:
<syntaxhighlight lang="shell-session">
$ ssh -l fred server.example.org
The authenticity of host 'server.example.org (192.0.32.10)' can't be established.
RSA key fingerprint is 4a:11:ef:d3:f2:48:f8:ea:1a:a2:0d:17:57:ea:a6:16.
Are you sure you want to continue connecting (yes/no)?
</syntaxhighlight>
Another way of comparing keys is to use the ASCII art visual host key. See further below about that.
===Downloading keys===
Even though a host’s key is usually displayed for review the first time the SSH client tries to connect, it can also be fetched on demand at any time using [http://man.openbsd.org/ssh-keyscan.1 ssh-keyscan(1)]:
<syntaxhighlight lang="shell-session">
$ ssh-keyscan server.example.org
# server.example.org:22 SSH-2.0-OpenSSH_10.6
server.example.org ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEWKepJgkC2XTG5cAr2Nyew6hOp5AjG7vi2RYFtPWqN3bo5XGuCX2d2YVyn++/2PtyMYBaKWyFpCNTT9X0F1Epg=
# server.example.org:22 SSH-2.0-OpenSSH_10.6
server.example.org ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDKyERe8k+fnsrt4JrcLD3AW0kXj90r9ybrEZuY/CTrXIqYSizO335SxGJoWrKijaRy8htuueMkmNfxxhnBPoAjul/4T/FCRGKaV0jC96xYNnKcXbnXxSLVQ0OW2EIPvQhw/TU/G3vEqtiRYGyaNcZS6xrnVv3xuPuvVC1VRKspNLEq7zfvToC0OB89X5DIbvBbHY13PjJ0NrDdX3sSA8lxPsYagBuDIvyxH0S4Z5fQHeYrdvENS5zX6LwJeMeGSOqDuD0Zb4hpKxhaGVwP5e435VcFuImbFaDPM4w71PzaSUEj+tnUA0mGDoLiCrpW3txkJszog9lN3C/nLGghFaT7ajrfH55qut81JnvdhMju9+SzxrKPJmtQZfKVLIc4whEbtFsPCdm2bstz7ROWxTJ3t/Vr8/QVm2G2aY4FHuPwo2jUQDbQA7mCV+fe1sADy2jLzGhn1TCeYvWSv5PNJAT97IrLfD3+0Uo+qJD/6CU7F8oabj1Ql2H8fPN5kGSWfkM=
# server.example.org:22 SSH-2.0-OpenSSH_10.6
server.example.org ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJo5gc4VrxVQ5apAOd7qK6UqGlLMpWOPuunjB53JBN2s
# server.example.org:22 SSH-2.0-OpenSSH_10.6
# server.example.org:22 SSH-2.0-OpenSSH_10.6
# server.example.org:22 SSH-2.0-OpenSSH_10.6
server.example.org ssh-mldsa44-ed25519 AAAAE3NzaC1tbGRzYTQ0LWVkMjU1MTkAAAVAyIw5r9FaniSYqBX0yd9vgBz5nCkebaQlMQN9N0p//Ukfn/CnZ3YtZWn6pUGjDM85/bqdL1gqah1OLfnl1eHk0qvTACrym07uKaMLoEHuakIXHbTi/ELPRoRP3F+DpEgjtYSjLc/fJiobRMgSvmLJxTUzZTStsqWAL1L9/1zuwHEngR+THpUcCSTi6KKkYcQiWGOFwpO22VdiuOg+zdQSH+9jW6eXYk1z81KU6UlHZps8zVrlqCd3FDDghgbH5U8DcGN2t6GvVfn6jFjpEk0ouj0of3/7010eRXjnv3QSbprCpMq73lAemQM+3LvTtrMBhFWNhCXhyOHfO1Yq7c8xaOwlFK78PlERjdHTvVJaCaDFDy7Pg9I+wxv+uC+W0wtzJ2S1y9XCYUgJo9yEiIGuSZdhMkYUwMnXLzQMm44hQOW153pdlHWze3kESCLg/LJf9RbUoSB43t6rghSHEiUkIi5TtCtFZ4nAGeH+wVwlB9Fwog5uZuJN1FYuuY5sSrLHJAQDUwudkdak0ifOhtPtsM/ClYr3baolQ/qi0ABYUVLKSV5b+A5DlTXa23zc7JAXm2YVfkWpOfVJG4TY81wrJoDumsd1y3XaH28/4QbADsZCE3wYsBou8ff0xKgPu8xm2K+sYSmzUbBGprArAQA0LtIDGNGqrb4JsZ1ru+viwzfSlxV7Nz7ZrSw6h+Ddq4J9A6oKXy6YS3uf1GFOtBQm6JfuyMHQEEUtYZrU4UK3C/fKHx9vjuw7YdhsL8JRgxbF14qJLFizkmVbK2e6aWEE4iCqLLLlZ0dC2peYUUqyGb9PsW7sewYzGbipzPpQ/GobRT3Obc3Gmu8P386pDGR7hmkOpFmVwIcfc431cUmZixK7CkPxzUvfaAAQkmNs/p4eNNoP0gq/xPGsV14/heULbWp/njGWk1ysjjGxP6YMwHcEZpUdSGbD05zbL0KkMtmKsr8yuJYjdVAgtH2bVAvrxXRXLgavmm97VYYq1A9rOYiQFlMrKRg6yZhT10Xt8Hukf6ySLk+fieFc3nH99YeysoA5rsfp9kdXr65GpwrBerZlf/20ZLJ7s4xaYb9SukR/8tiPt9iAVQjqPdb0MseZVrzhKo/jK44JHbHejHMoMMs7etPAS5TIjHxcJTP66B3eO9A0l2fAage2ka7ehTnHivxD3EE9KnqYBjIHDU7o6dTrX7UyQsdhax9bPKEL7OEtm6hXXfwzy4GdqGi124BclFAF0LeBSvBUgmSKIn3wfzJx/XXbt512eOn3WZk2v0TsiteH9kPEgDxVkUykawg2tleak9rTFMzYpDZRHvZD7uHWUZ8ktr2FEKWgq7/1Q2c80Z6H75VK9l1d3KZuoiWoF1s73R7ZAM+CWSrR+S5h+3AhYubDKPa/af+Lnlqe6ocVTqQPYaaRz25/cLBg6pgbdh18Ru6h3ljG2KiysyXeuoEoM5xVYtdIW7l9NeKDpGbZPAOqywXUpK+UCGjumIl7c48KCTIYcdtolnEbfVNBh0LRuftcVI+uF9cvQ0XacaNbgkYJYCjv4VR/n58EJ1b0c7tQBrVqMjDjIUKGhCMQqAeD3g75jeD60bBmVNPrq8RK+zH5VIa5eaBs3eitN98eVzd4b6UYTQd1QxLQZMrhQf4InRj39TZfGvQR5SXlLZQlweVHYkMps3IKbs3B3DCqlWCPUAnTAJBAG7HqWEYr5uEaKBawBSAx9jCQz00T+bp8KXpkOPzZCD6dfEfpHY6Rv6kmGJkiPUCb2hoX145HrS357G12+wDxKLN833oPVC0z
</syntaxhighlight>
Once a key is acquired, its fingerprint can be shown using [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)] to read from '''stdin'''. This can be done directly with a pipe.
<syntaxhighlight lang="shell-session">
$ ssh-keyscan server.example.org | ssh-keygen -l -f -
3072 SHA256:tQlw3vy325KrQibndP3gLS/YXUZjTLVA5yDFpg/Bb6I server.example.org (RSA)
256 SHA256:snnAtb/9csdy0BGhPjdg+VNWqN5bxCa/ge4C6zZ8muk server.example.org (ECDSA)
256 SHA256:agRZDZn8awhQ+tc19Ip/whkHoV33Ln2REO7v1kcYbdU server.example.org (ED25519)
512 SHA256:3Wdc6GbLIcc5mbuF2mhhokhARdMLuMK+ESRfJ+sM0QE server.example.org (MLDSA44-ED25519)
</syntaxhighlight>
If there is more than one public key type is available from the server on the port polled, then [http://man.openbsd.org/ssh-keyscan.1 ssh-keyscan(1)] will fetch each of them. If there is more than one key fed via '''stdin''' or a file, then [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)] will process them in order. Prior to OpenSSH 7.2 manual fingerprinting was a two step process, the key was read to a file and then processed for its fingerprint.
<syntaxhighlight lang="shell-session">
$ ssh-keyscan -t ed25519 host.example.org > key.pub
# host.example.org SSH-2.0-OpenSSH_6.8
$ ssh-keygen -lf key.pub
256 SHA256:ZmS+IoHh31CmQZ4NJjv3z58Pfa0zMaOgxu8yAcpuwuw host.example.org (ED25519)
</syntaxhighlight>
Note that some output from [http://man.openbsd.org/ssh-keyscan.1 ssh-keyscan(1)] is sent to '''stderr''' instead of '''stdout'''.
A hash, or fingerprint, can be generated manually with [http://linux.die.net/man/1/awk awk(1)], [http://linux.die.net/man/1/sed sed(1)] and [http://linux.die.net/man/1/xxd xxd(1)], on systems where they are found.
<syntaxhighlight lang="shell-session">
$ awk '{print $2}' key.pub | base64 -d | md5sum -b | sed 's/../&:/g; s/: .*$//'
$ awk '{print $2}' key.pub | base64 -d | sha256sum -b | sed 's/ .*$//' | xxd -r -p | base64
</syntaxhighlight>
It is possible to find all hosts from a file which have new or different keys from those in '''known_hosts''', if the host names are in clear text and not stored as hashes.
<syntaxhighlight lang="shell-session">
$ ssh-keyscan -t ed25519,mldsa44-ed25519 -f ssh_hosts | \
sort -u - ~/.ssh/known_hosts | \
diff ~/.ssh/known_hosts -
</syntaxhighlight>
====Using ssh-keyscan(1) with ssh_config(5)====
The utility [http://man.openbsd.org/ssh-keyscan.1 ssh-keyscan(1)] does not parse [http://man.openbsd.org/ssh_config.5 ssh_config(5)]. That is in part to keep the code base simple. There are a lot of configuration options which would be complicated to implement, including but not limited to '''ProxyJump''', '''ProxyCommand''', '''Match''', '''BindInterface''', and '''CanonicalizeHostname'''<ref name="keyscan">{{cite mailing list |url=https://lists.mindrot.org/pipermail/openssh-unix-dev/2023-March/040605.html | title=Why does ssh-keyscan not use .ssh/config? |publisher=mindrot.org | access-date=2023-03-01 | date=2023-03-01 | mailing-list=OpenSSH UNIX-dev | first=Damien | last=Miller }}</ref> . Resolving host names via the client configuration file can be done by wrapping the utility in a short shell function:
<syntaxhighlight lang="shell">
my-ssh-keyscan() {
for host in "$@" ; do
ssh-keyscan $(ssh -G "$host" | awk '/^hostname/ {print $2}')
done
}
</syntaxhighlight>
That shell function uses the '''-G''' option of [http://man.openbsd.org/ssh.1 ssh(1)] to resolve each host name using [http://man.openbsd.org/ssh_config.5 ssh_config(5)] and then check the resulting host name for SSH keys.
===ASCII Art Visual Host Key===
An ASCII art representation of the key can be displayed along with the SHA256 base64 fingerprint:
<syntaxhighlight lang="shell-session">
$ ssh-keygen -l -v -f key
256 SHA256:BClQBFAGuz55+tgHM1aazI8FUo8eJiwmMcqg2U3UgWU www.example.org (ED25519)
+--[ED25519 256]--+
|o+=*++Eo |
|+o .+.o. |
|B=.oo. . |
|*B.=.o . |
|= B * S |
|. .@ . |
| +..B |
| *. o |
| o.o. |
+----[SHA256]-----+
</syntaxhighlight>
In OpenSSH 6.7 and earlier the fingerprint is in MD5 hexadecimal form.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -l -v -f key
2048 37:af:05:99:e7:fb:86:6c:98:ee:14:a6:30:06:bc:f0 www.example.net (RSA)
+--[ RSA 2048]----+
| o |
| o . |
| o o |
| o + |
| . . S |
| E .. |
| .o.* .. |
| .*=.+o |
| ..==+. |
+-----------------+
</syntaxhighlight>
==More on Verifying SSH Keys==
Keys on the client or the server can be verified against known good keys by comparing the base64-encoded SHA256 fingerprints.
===Verifying Stray Client Keys===
Sometimes is is necessary to compare two uncertain key files to check if they are part of the same key pair. However, public keys are more or less disposable. So the easy way in such situations on the client machine is to just rename or erase the old, problematic, public key and replace it with a new one generated from the existing private key.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -y -f ~/.ssh/my_key_ed25519
</syntaxhighlight>
But if the two parts must really be compared, it is done in two steps using [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)]. First, a new public key is re-generated from the known private key and used to make a fingerprint to '''stdout'''. Next, the fingerprint of the unknown public key is generated for comparison. In this example, the private key '''my_key_a_ed25519''' and the public key '''my_key_b_ed25519.pub''' are compared:
<syntaxhighlight lang="shell-session">
$ ssh-keygen -y -f my_key_a_ed25519 | ssh-keygen -l -f -
$ ssh-keygen -l -f my_key_b_ed25519.pub
</syntaxhighlight>
The result is a base64-encoded SHA256 checksum for each key with the one fingerprint displayed right below the other for easy visual comparison. Older versions don't support reading from '''stdin''' so an intermediate file will be needed then. Even older versions will only show an MD5 checksum for each key. Either way, automation with a shell script is simple enough to accomplish but outside the scope of this book.
===Verifying Server Keys===
Reliable verification of a server's host key must be done when first connecting. It can be necessary to contact the system administrator who can provide it out of band so as to know the fingerprint in advance and have it ready to verify the first connection.
Here is an example of the server's Ed25519 key being read and its fingerprint shown as SHA256 base64:
<syntaxhighlight lang="shell-session">
$ ssh-keygen -l -f /etc/ssh/ssh_host_ed25519_key.pub
256 SHA256:bFzzouaWmE5HuZIv+YnGUYI2q06i6M43V+6jMU3LHpA root@server.example.org (ED25519)
</syntaxhighlight>
And here the corresponding ECDSA key is read, but shown as an MD5 hexadecimal hash:
<syntaxhighlight lang="shell-session">
$ ssh-keygen -E md5 -l -f /etc/ssh/ssh_host_ecdsa_key.pub
256 MD5:ed:d2:34:b4:93:fd:0e:eb:08:ee:b3:c4:b3:4f:28:e4 root@server.example.net (ECDSA)
</syntaxhighlight>
Prior to 6.8, the fingerprint was expressed as an MD5 hexadecimal hash:
<syntaxhighlight lang="shell-session">
$ ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub
2048 MD5:e4:a0:f4:19:46:d7:a4:cc:be:ea:9b:65:a7:62:db:2c root@server.example.net (RSA)
</syntaxhighlight>
It is also possible to use [http://man.openbsd.org/ssh-keyscan.1 ssh-keyscan(1)] to get keys from an active SSH server. However, the fingerprints still needs to be verified out of band.
====Warning: Remote Host Identification Has Changed!====
If a server's key does not match what the client finds has been recorded in either the system's or the local account's '''authorized_keys''' files, then the client will issue a warning along with the fingerprint of the suspicious key.
<pre>
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256:bFzzouaWmE5HuZIv+YnGUYI2q06i6M43V+6jMU3LHpA.
Please contact your system administrator.
Add correct host key in /home/fred/.ssh/known_hosts to get rid of this message.
Offending ED25519 key in /home/fred/.ssh/known_hosts:11
Host key for server.example.org has changed and you have requested strict checking.
Host key verification failed.
</pre>
Three reasons for the warning are common.
One reason is that the server's keys were replaced, often because the server's operating system was reinstalled without backing up the old keys. Another reason can be when the system administrator has phased out deprecated or compromised keys. However that can be planned better and if there is time to plan the migration, new keys can just be added to the server and have the clients use the '''UpdateHostKeys''' option so that the new keys are accepted if the old keys match. A third situation is when the connection is made to the wrong machine, such as when the remote system changes IP addresses because of dynamic address allocation.
In all three cases where the key has changed there is only one thing to do: contact the system administrator and verify the key. Ask if the OpenSSH-server was recently reinstalled, or was the machine restored from an old backup? Keep in mind that the system administrator may be you yourself in some cases.
The case which is rather rare but serious enough that it should be ruled out for sure is that the wrong machine is part of a man-in-the-middle attack.
In all four cases, an authentic key fingerprint can be acquired by any method where it is possible to verify the integrity and origin of the message, for example via PGP-signed e-mail. If physical access is possible, then use the console to get the right fingerprint. Once the authentic key fingerprint is available, return to the client machine where you got the error and remove the old key from '''~/.ssh/known_hosts'''
<syntaxhighlight lang="shell-session">
$ ssh-keygen -R server.example.org
</syntaxhighlight>
Then try logging in, but compare the key fingerprints first and proceed if and '''only''' if the key fingerprint matches what you received out of band. If the key fingerprint matches, then go through with the login process and the key will be automatically added. If the key fingerprint does not match, stop immediately and figure out what you are connecting to. It would be a good idea to get on the phone, a real phone not a computer phone, to the remote machine's system administrator or the network administrator.
===Multiple Keys for a Host, Multiple Hosts for a Key in known_hosts===
Multiple host names or IP addresses can use the same key in the '''known_hosts''' file by using pattern matching or simply by listing multiple systems for the same key. That can be done in either the global list of keys in '''/etc/ssh/ssh_known_hosts''' and the local, account-specific lists of keys in each account's '''~/.ssh/known_hosts''' file. Labs, computational clusters, and similar pools of machines can make use of keys in that way. Here is a key shared by three specific hosts, identified by name, one host per line:
<pre>
server1 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMIId09yQEh9634wNXR+y7L79th2M4awBgCwqWJobJuQ fred@desk.example.org
server2 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMIId09yQEh9634wNXR+y7L79th2M4awBgCwqWJobJuQ fred@desk.example.org
server3 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMIId09yQEh9634wNXR+y7L79th2M4awBgCwqWJobJuQ fred@desk.example.org
</pre>
Or a range can be specified by using globbing to a limited extent in either '''/etc/ssh/ssh_known_hosts''' or '''~/.ssh/known_hosts'''.
<pre>
172.19.40.* ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMIId09yQEh9634wNXR+y7L79th2M4awBgCwqWJobJuQ fred@desk.example.org
</pre>
Conversely, a pool of servers might have multiple keys for the same address. In that case, it is necessary to make multiple entries in either '''/etc/ssh/ssh_known_hosts''' or '''~/.ssh/known_hosts''' for each key.
<pre>
server1 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMIId09yQEh9634wNXR+y7L79th2M4awBgCwqWJobJuQ fred@desk.example.org
server1 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBrsIIaDl/bJ40vyprvF+HYAq+kE2jWUsOt+WqIheaBw fred@desk.example.org
server1 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIC2CgwWTPH/qZDeHmW7ZUea18wa9As7Txq3P5dXCfoXj fred@desk.example.org
</pre>
Thus in order to get a pool of servers to share a pool of keys, each server-key combination must be added manually to the '''known_hosts''' file:
<pre>
server1 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMIId09yQEh9634wNXR+y7L79th2M4awBgCwqWJobJuQ fred@desk.example.org
server1 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBrsIIaDl/bJ40vyprvF+HYAq+kE2jWUsOt+WqIheaBw fred@desk.example.org
server1 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIC2CgwWTPH/qZDeHmW7ZUea18wa9As7Txq3P5dXCfoXj fred@desk.example.org
server2 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICPSs4OR2LT89mv2tM4TKqeVhh4XvoLQ77MSBmjyrMGm fred@desk.example.org
server2 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHChTzAoJr53A7VP1BdMHqLTFK5cz/2Vc065+VcpP4VA fred@desk.example.org
server2 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHP+4BvU4DzwYQgznARxx/qyBWmu49PAywHwDRgslRaM fred@desk.example.org
</pre>
Though upgrading to certificates might be a more appropriate approach that manually updating lots of keys.
===Another way of Dealing with Dynamic (roaming) IP Addresses===
It is possible to manually point to the right key using '''HostKeyAlias''' either as part of [http://man.openbsd.org/ssh_config.5 ssh_config(5)] or as a runtime parameter. Here the key for machine ''Foobar'' is used to connect to host 192.168.11.15
<syntaxhighlight lang="shell-session">
$ ssh -o StrictHostKeyChecking=accept-new \
-o HostKeyAlias=foobar \
192.168.11.15
</syntaxhighlight>
This is useful when DHCP is not configured to try to keep the same addresses for the same machines over time or when using certain stdio forwarding methods to pass through intermediate hosts.
===Host Key Update and Rotation in known_hosts===
A protocol extension to rotate weak public keys out of '''known_hosts''' has been in OpenSSH from version 6.8<ref name="djm_rotation">
{{cite web
| title=Key rotation in OpenSSH 6.8+
| author=Damien Miller
| url=http://blog.djm.net.au/2015/02/key-rotation-in-openssh-68.html
| date=2015-02-01
| publisher=DJM's Personal Weblog
| accessdate=2016-03-05
}}
</ref> and later. With it the server is able to inform the client of all its host keys and update '''known_hosts''' with new ones when at least one trusted key already known. This method still requires the private keys be available to the server <ref name="djm_rotation_redux">
{{cite web
| title=Hostkey rotation, redux
| author=Damien Miller
| url=http://blog.djm.net.au/2015/02/hostkey-rotation-redux.html
| date=2015-02-17
| publisher=DJM's Personal Weblog
| accessdate=2016-03-05
}}
</ref> so that proofs can be completed. In [http://man.openbsd.org/ssh_config.5 ssh_config(5)], the directive '''UpdateHostKeys''' specifies whether the client should accept updates of additional host keys from the server after authentication is completed and add them to '''known_hosts'''. A server can offer multiple keys of the same type for a period before removing the deprecated key from those offered, thus allowing an automated option for rotating keys as well as for upgrading from weaker algorithms to stronger ones. See also [https://datatracker.ietf.org/doc/html/rfc4819 RFC 4819: Secure Shell Public Key Subsystem] about key management standards.
==Converting Between SSH Key Formats==
OpenSSH has its own format for keys which it uses by default when new keys are made. However, other SSH clients and servers may use other formats such as [https://www.rfc-editor.org/rfc/rfc4716 RFC 4716], [https://www.rfc-editor.org/rfc/rfc5958 PKCS8], or [https://www.rfc-editor.org/rfc/rfc1421 PEM]. Any of these can be converted to the default OpenSSH format by [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)]. The default to format to try to convert from is RFC 4716. The utility [https://linux.die.net/man/1/puttygen puttygen(1)] makes keys in that format for [https://linux.die.net/man/1/putty putty(1)] and they need conversion when used with OpenSSH's server.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -i -f /var/tmp/key_public.ppk
</syntaxhighlight>
However, you can use the '''-m''' option to specify either that format explicitly or else choose another one to convert from.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -i -m RFC4716 -f /var/tmp/key_public.ppk
$ ssh-keygen -i -m PKCS8 -f /var/tmp/key_public.ppk
</syntaxhighlight>
Both examples above are for importing public keys into OpenSSH's own format.
By default OpenSSH will write newly-generated keys in its own format, so the '''-m''' option is obligatory to produce public keys in another format.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -e -m PKCS8 -f ~/.ssh/key.pub
</syntaxhighlight>
It is not yet possible to export private keys from the OpenSSH format to one of the other formats using the '''-e''' option. Even if a private key is specified as input, a public key is produced:
<syntaxhighlight lang="shell-session">
$ ssh-keygen -e -m RFC4716 -f ~/.ssh/key
</syntaxhighlight>
Not all key types are supported by all key formats.
It is also possible to use export to display the key pair as a traditional hex dump.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -e -m hexdump -f ~/.ssh/key
Enter passphrase for "key":
Public ED25519 key:
buffer len = 51
0000: 00 00 00 0b 73 73 68 2d 65 64 32 35 35 31 39 00 ....ssh-ed25519.
0016: 00 00 20 b0 c5 cc 2c cb d8 8b 8d 75 80 eb e6 e9 .. ...,....u....
0032: 2c f4 36 08 7b 5b ad ad 0b 54 4f 7f 21 9d 1b e8 ,.6.{[...TO.!...
0048: 9e e0 32 ..2
Private ED25519 key:
buffer len = 119
0000: 00 00 00 0b 73 73 68 2d 65 64 32 35 35 31 39 00 ....ssh-ed25519.
0016: 00 00 20 b0 c5 cc 2c cb d8 8b 8d 75 80 eb e6 e9 .. ...,....u....
0032: 2c f4 36 08 7b 5b ad ad 0b 54 4f 7f 21 9d 1b e8 ,.6.{[...TO.!...
0048: 9e e0 32 00 00 00 40 e1 c3 a2 4d d9 89 49 72 9b ..2...@...M..Ir.
0064: 86 72 6c 07 17 1b 40 4f 62 50 62 45 4f 4c cf cf .rl...@ObPbEOL..
0080: 57 8b 9d c0 04 8f 9b b0 c5 cc 2c cb d8 8b 8d 75 W.........,....u
0096: 80 eb e6 e9 2c f4 36 08 7b 5b ad ad 0b 54 4f 7f ....,.6.{[...TO.
0112: 21 9d 1b e8 9e e0 32 !.....2
</syntaxhighlight>
<noinclude>
== References ==
{{reflist}}
{{OpenSSH/TOC|mini}}
</noinclude>
{{BookCat}}
{{status|100%}}
8ziips6fmbs1ioyspx5i7pxpy5u1f08
4676716
4676715
2026-10-18T09:23:16Z
Larsnooden
430753
Add subsection for Disadvantages of Keys, in Contrast to Certificates
4676716
wikitext
text/x-wiki
<noinclude>{{simple chapter navigation|previous=File Transfer with SFTP|next=Certificate-based Authentication}}</noinclude>
Authentication keys can improve efficiency, if done properly. As a bonus advantage, the passphrase and private key never leave the client<ref name="RFC4252§7">{{cite web |url=https://tools.ietf.org/html/rfc4252#section-7 |title=The Secure Shell (SSH) Authentication Protocol |publisher=IETF |year=2006| accessdate=2015-05-06}}</ref>. Key-based authentication is generally recommended for outward facing systems so that password authentication can be turned off.
==Key-based authentication==
OpenSSH can use public key cryptography for authentication. In public key cryptography, encryption and decryption are asymmetric. The keys are used in pairs, a public key to encrypt and a private key to decrypt. The [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)] utility can make RSA, Ed25519, MLDSA44-Ed25519, ECDSA, Ed25519-SK, or ECDSA-SK keys for authenticating. Even though DSA keys can still be made, being exactly 1024 bits in size, they are no longer recommended and should be avoided. RSA keys are allowed to vary from 1024 bits on up. The default is now 3072. However, there is only limited benefit after 2048 bits and that makes elliptic curve algorithms preferable. ECDSA can be 256, 384 or 521 bits in size. Ed25519, Ed25519-SK, and ECDSA-SK keys each have a fixed length of 256 bits. Shorter keys are faster, but less secure. Longer keys are much slower to work with but provide better protection, up to a point.
Keys can be named to help remember what they are for. Because the key files can be named anything it is possible to have many keys each named for different services or tasks. The comment field at the end of the public key can also be useful in helping to keep the keys sorted, if you have many of them or use them infrequently.
The process of key-based authentication uses these keys to make a couple of exchanges using the keys to encrypt and decrypt some short message. At the start, a copy of the client's public key is stored on the server and the client's private key is on the client, both stay where they are. The private key never leaves the client. As the client first contacts the server, the server responds by using the client's public key to encrypt a random number and return that encrypted random number as a challenge to the client. The client responds to the challenge by using the matching private key to decrypt the message and extract the random number. The client then makes an MD5 hash of the session ID along with the random number from the challenge and returns that hash to the server. The server then makes its own hash of the session ID and the random number and compares that to the hash returned by the client. If there is a match, the login is allowed. If there is not a match, then the next of any public keys on the server registered as belonging to the same account is tried until either a match is found or all the keys have been tried or the maximum number of failures has been reached. <ref name="How Key Challenges Work">{{cite web | url=http://www.unixwiz.net/techtips/ssh-agent-forwarding.html#chal | title=An Illustrated Guide to SSH Agent Forwarding | author=Steve Friedl | date=2006-02-22 | accessdate=2013-04-27 | publisher=Unixwiz.net }}</ref>
When an agent is used on the client side to manage authentication, the process is similar. The difference is that [http://man.openbsd.org/ssh.1 ssh(1)] passes the challenge off to the agent which then calculates the response and passes it back to [http://man.openbsd.org/ssh.1 ssh(1)] which then passes the agent's response back to the server.
===Basics of Public Key Authentication===
A matching pair of SSH keys, one public and one private, is needed for public key authentication. The [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)] utility is used to make such a key pair. Out of that pair the public key must be properly stored on the remote host before using key-based authentication. The default location for it is the designated '''authorized_keys''' file, usually one such file resides inside each remote user account. The private key stays stored safely on the client.
Once the keys have been prepared and the remote account configured, they can be used for login. Before starting, there must already be an account on the remote system. The details of doing that are outside of the scope of this book. However, once you have a remote account, there are four steps to set up key-based authentication for it:
'''1''') Prepare a directory on the client (say a laptop or a desktop) where the keys will stay, if there isn't one already. For example, if the '''.ssh''' directory is not on the client machine, create it and set the permissions correctly. It is important that it not be writable by any account except its owner:
<syntaxhighlight lang="shell-session">
$ mkdir ~/.ssh/
$ chmod 0700 ~/.ssh/
</syntaxhighlight>
'''2''') Create a key pair inside the designated directory. The example here creates an Ed25519 key pair in the directory '''~/.ssh'''. The option '''-t''' decides the key type and the option '''-f''' assigns the key file a name. It is good to give key files descriptive names, especially if larger numbers of keys are managed. Below, the public key will be named '''fred_example_org_ed25519.pub''' and the private key will be called '''fred_example_org_ed25519'''. Lastly, the '''-C''' option is used to embed a descriptive comment inside the private key itself. The comment is useful for figuring out later what the key is for when one has many keys or a lot of time has passed or both.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -t ed25519 -f ~/.ssh/fred_example_org_ed25519 \
-C "from fred's laptop to server.example.org"
</syntaxhighlight>
Be sure to enter a solid passphrase so that the private key gets encrypted using 128-bit AES. That way the private key can only be read or used when the passphrase is given.
Ed25519, Ed25519-SK, and ECDSA-SK keys have fixed lengths. For RSA and ECDSA keys, the '''-b''' option sets the number of bits used for those kinds of keys.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -o -b 4096 -t rsa -f ~/.ssh/fred_example_org_rsa \
-C "from fred's laptop to server.example.org"
</syntaxhighlight>
Since 6.5 a new private key format is available using a [http://man.openbsd.org/bcrypt.3 bcrypt(3)] key derivative function (KDF) to better protect keys at rest. This new format is always used for Ed25519 keys, and sometime in the future will be the default for all keys. But for right now it may be requested when generating or saving existing keys of other types via the '''-o''' option in [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)].
Details of the new format are found in the source code in the file '''PROTOCOL.key'''.
'''3''') Get the keys to the right places. Transfer only the public key to remote machine. The following assume the default locations for the authorized keys as specified in the server's configuration file by the '''AuthorizedKeysFile''' directive.
'''3a''') If the utility <code>ssh-copy-id</code> exists, and if password authentication is allowed, then it can be used to put the public key into place on the remote system. The ''.pub'' is optional here, the script will figure it out if omitted.
<syntaxhighlight lang="shell-session">
$ ssh-copy-id -i ~/.ssh/fred_example_org_ed25519 fred@server.example.org
</syntaxhighlight>
If that script was successful in transferring the public key, then go on to step 4 below and test the key. If not, then try transferring the public key manually as described in step 3b next.
'''3b''') Or the public key can be put in place manually on the remote machine. For that the remote '''.ssh''' directory is needed, and within that a special file to store the public keys, the default file name is '''authorized_keys'''. If either the '''authorized_keys''' file or '''.ssh''' directory do not exist on the remote machine, they need to be created.
<syntaxhighlight lang="shell-session">
$ mkdir -m 700 ~/.ssh/
$ touch ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys
$ nano -w ~/.ssh/authorized_keys
</syntaxhighlight>
Then any editor which does not wrap long lines can be used to add the public key. However the '''authorized_keys''' file is edited to add the key, the key itself must be in the file whole and unbroken on a single line. For example, [http://linux.die.net/man/1/nano nano(1)] can be started with the '''-w''' option to prevent wrapping of long lines. (Another way to set line wrapping permanently in [http://linux.die.net/man/1/nano nano(1)] is by editing [http://linux.die.net/man/5/nanorc nanorc(5)].)
If the key pair is not already on the client, transfer both the public and private keys there. It is usually best to keep both the public and private keys together in the directory '''~/.ssh/''', though the public key is not always needed on the client after this step and could even be regenerated if it is ever needed again.
'''4''') Test the keys
While remaining logged in via the first terminal, use the client system to open another window and in it start another SSH session and try authenticating to the remote machine from the client using the private key.
<syntaxhighlight lang="shell-session">
$ ssh -i ~/.ssh/fred_example_org_ed25519 -l fred server.example.org
</syntaxhighlight>
The option '''-i''' tells [http://man.openbsd.org/ssh.1 ssh(1)] which private key to try.
Only after verifying that the key-based authentication works should you close the original window.
It is possible to make permanent shortcuts on the client using [http://man.openbsd.org/ssh_config.5 ssh_config(5)], explained further below, once key-based authentication is working. In particular, see the '''IdentityFile''', '''IdentitiesOnly''', and '''AddKeysToAgent''' configuration directives, to name three.
It is also a good idea to turn off password authentication, if and only if key-based authentication is setup for all the necessary remote accounts.
➥ '''Troubleshooting of Key-based Authentication''':
If the server refuses to accept the key and fails over to the next authentication method (e.g.: "Server refused our key"), then there are several possible mistakes to look for on the server side.
One of the most common errors is that the file and directory permissions are wrong. The authorized keys file must be owned by the user in question and not be group writable. Nor may the key file's directory be group or world writable.
<syntaxhighlight lang="shell-session">
$ chmod u=rwx,g=rx,o= ~/.ssh
$ chmod u=rw,g=,o= ~/.ssh/authorized_keys
</syntaxhighlight>
Another mistake that can happen is if the key inside the '''authorized_keys''' file on the remote host is broken by line breaks or has other whitespace in the middle. That can be fixed by joining up the lines and removing the spaces or by recopying the key more carefully.
And, though it should go without saying, the halves of the key pair need to match. The public key on the server needs to match the private key held on the client. If the public key is lost, then a new one can be generated with the '''-y''' option, but not the other way around. If the private key is lost, then the public key should be erased as it is no longer of any use. If many keys are in use for an account, it might be a good idea to add comments to them. On the client, it can be a good idea to know which server the key is for, either through the file name itself or through the comment field. A comment can be added using the '''-C''' option.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -t ed25519 -f ~/.ssh/fred_example_org_ed25519 -C "web server mirror"
</syntaxhighlight>
On the server, it can be important to annotate which client they key is from if there is more than one public key there in an account. There the comment can be added to the authorized keys file on the server in the last column if a comment does not already exist. Again, the format of the authorized keys file is given in the manual page for [http://man.openbsd.org/sshd.8 sshd(8)] in the section "AUTHORIZED_KEYS FILE FORMAT". If the keys are not labeled they can be hard to match, which might or might not be what you want.
====Associating Keys Permanently with a Server====
A key can be specified at run time, but to save retyping the same paths again and again, the '''Host''' directive in [http://man.openbsd.org/ssh_config.5 ssh_config(5)] can apply specific settings to a target host. In this case, by changing '''~/.ssh/config''' it is possible to assign particular keys to be tried automatically whenever making a connection to that specific host. After adding the following lines to '''~/.ssh/config''', all that's needed is to type <code>ssh ''web1''</code> to connect with the key for that server.
<syntaxhighlight lang="apache" line="1">
Host web1
Hostname 198.51.100.32
IdentitiesOnly yes
IdentityFile /home/fred/.ssh/web_key_ed25519
</syntaxhighlight>
The '''~/.ssh/config''' below uses different keys for ''server'' versus ''server.example.org'', regardless whether they resolve to the same machine. This is possible because the host name argument given to [http://man.openbsd.org/ssh.1 ssh(1)] is not converted to a canonicalized host name before matching.
<syntaxhighlight lang="apache" line="1">
Host server
IdentitiesOnly yes
IdentityFile /home/fred/.ssh/key_a_ed25519
Host server.example.org
IdentitiesOnly yes
IdentityFile /home/fred/.ssh/key_b_ed25519
</syntaxhighlight>
In this example the shorter name is tried first, but of course less ambiguous shortcuts can be made instead. The configuration file gets parsed on a first-match basis. So the most specific rules go at the beginning and the most general rules go at the end.
====Encrypted Home Directories====
When using encrypted home directories the keys must be stored in an unencrypted directory. That means somewhere outside the actual home directory which means [http://man.openbsd.org/sshd.8 sshd(8)] needs to be configured appropriately to find the keys in that special location.
Here is one method for solving the access problem. Each user is given a subdirectory under '''/etc/ssh/keys/''' which they can then use for storing their '''authorized_keys''' file. This is set in the server's configuration file '''/etc/ssh/sshd_config'''
<syntaxhighlight lang="apache" line="1">
AuthorizedKeysFile /etc/ssh/keys/%u/authorized_keys
</syntaxhighlight>
Setting a special location for the keys opens up more possibilities as to how the keys can be managed and multiple key file locations can be specified if they are separated by whitespace. The user does not have to have write permissions for the '''authorized_keys''' file. Only read permission is needed to be able to log in. But if the user is allowed to add, remove, or change their keys, then they will need write access to the file to do that.
One symptom of having an encrypted home directory is that key-based authentication only works when you are already logged into the same account, but fails when trying to make the first connection and log in for the first time.
Sometimes it is also necessary to add a script or call a program from '''/etc/ssh/sshrc''' immediately after authentication to decrypt the home directory.
====Passwordless Login====
One solution for passwordless logins is to still have a passphrase and work with an authentication agent in conjunction with a single-purpose key. Most desktop environments launch an SSH agent automatically these days. It will be visible in the '''SSH_AUTH_SOCK''' environment variable if it is. On accounts with an agent, [http://man.openbsd.org/ssh-add.1 ssh-add(1)] can load private keys into an available agent.
<syntaxhighlight lang="shell-session">
$ ssh-add ~/.ssh/fred_example_org_ed25519
</syntaxhighlight>
Thereafter, the client will automatically check the agent for the key when appropriate. If there are many keys in the agent, it will become necessary to set '''IdentitiesOnly'''. See the above section on using '''~/.ssh/config''' for that. See [[OpenSSH/Cookbook/Public_Key_Authentication#Key-based_Authentication_Using_an_Agent|Key-based Authentication Using an Agent]] below.
Another, riskier, way of allowing passwordless logins is to follow the steps above, but simply do not enter a passphrase when asked for one while creating the key. Note that using keys that lack a passphrase is very risky, so the key files should be very well protected and kept track of, and ideally locked down with a '''command=''' option or '''ForceCommand''' directive on the server. That includes those keys which will only be used as single-purpose keys as described below.
Timely key rotation becomes especially important. In general, it is not a good idea to make a key without a passphrase.
====Requiring Both Keys and a Password====
While users should have strong passphrases for their keys, there is no way to enforce or verify that. Indeed, since neither the private key nor its the passphrase ever leave the client machine there is nothing that the server can do to have any influence over that. Instead, it is possible to require both a key and a password. Starting with OpenSSH 6.2, it is possible for the server to require multiple authentication methods for login using the '''AuthenticationMethods''' directive.
<syntaxhighlight lang="apache" line="1">
AuthenticationMethods publickey,password
</syntaxhighlight>
This example from [http://man.openbsd.org/sshd_config.5 sshd_config(5)] requires that users first authenticate using a key and it only queries for a password if the key succeeds. Thus with that configuration it is not possible to get to the system password prompt without first authenticating with a valid key. Changing the order of the arguments changes the order of the authentication methods.
====Requiring Two or More Keys====
Since OpenSSH 6.8, the server now remembers which public keys have been used for authentication and refuses to accept previously-used keys. This allows a set up requiring that users authenticate using two different public keys, maybe one in the file system and the other in a hardware token.
<syntaxhighlight lang="apache" line="1">
AuthenticationMethods publickey,publickey
</syntaxhighlight>
The '''AuthenticationMethods''' directive, whether for keys or passwords, can also be set on the server under a '''Match''' directive to apply only to certain groups or situations.
====Requiring Certain Key Types For Authentication====
Also since OpenSSH 6.8, the '''PubkeyAcceptedKeyTypes''' directive, later changed to '''PubkeyAcceptedAlgorithms''', can specify which key algorithms are accepted for authentication. Those not in the comma-separated pattern list are not allowed.
<syntaxhighlight lang="apache" line="1">
PubkeyAcceptedAlgorithms ssh-ed25519*,ssh-rsa*,ecdsa-sha2*,sk-ssh-ed25519*,sk-ecdsa-sha2*
</syntaxhighlight>
Either the actual key types or a pattern can be in the list. Spaces are not allowed in the pattern list. The exact list of key types supported for authentication can be found by the '''-Q''' option using the client. The following two lines are equivalent.
<syntaxhighlight lang="shell-session">
$ ssh -Q key-sig | sort
$ ssh -Q PubkeyAcceptedAlgorithms | sort
</syntaxhighlight>
For host-based authentication, it is the '''HostbasedAcceptedAlgorithms''' directive which determines the key types which are allowed for authentication.
===Key-based Authentication Using the AuthorizedKeysCommand Directive===
It is possible to use a program or script to look up public keys rather than keeping them in a static file or files. Any command called by the '''AuthorizedKeysCommand''' directive needs to either produce a syntactically correct public key while returning the exit code for a successful run or else return the exit code for failure. The string sent to '''stdout''' will then be processed as part of the authentication work flow.
Here is a shell script<ref name="janpietmens">{{cite web |url=https://jpmens.net/2025/03/25/authorizedkeyscommand-in-sshd/ |title=SSH keys from a command: sshd's AuthorizedKeysCommand directive |accessdate=2025-04-04 |date=2025-03-25 | author=Jan-Piet Mens }}</ref> at its simplest, without constraints, demonstrating a public key lookup:
<syntaxhighlight lang="shell">
#!/bin/sh
echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKs/UouletvojgB1YeRZ4MY6iRblQ2ERDuNhQO4tOvdL"
exit 0
</syntaxhighlight>
For authentication to succeed, the script must return exit code 0 (success) after sending the syntactically correct matching public key to '''stdout'''. For the SSH daemon to even run the script in the first place, the script must have the correct file and directory permissions.
Both the '''AuthorizedKeysCommandUser''' directive and '''AuthorizedKeysCommand''' must be used together. The former designates which account the script or program use when run. If set to ''none'' or if it does not refer to a valid account then [http://man.openbsd.org/sshd sshd(8)] will just ignore the command. If '''AuthorizedKeysCommand''' is set, and '''AuthorizedKeysCommandUser''' is left empty or missing, then [http://man.openbsd.org/sshd sshd(8)] won't even run when invoked. The error will be:
<syntaxhighlight lang="text">
AuthorizedKeysCommand set without AuthorizedKeysCommandUser
</syntaxhighlight>
The '''AuthorizedKeysFile''' is always tried first when it is present in the server configuration. The '''AuthorizedKeysCommand''' directive will not even be tried when the authorized keys file can provide a relevant key first.
====A More Detailed Example Using the AuthorizedKeysCommand Directive====
By default the user name trying to log in is passed to the script when no tokens or arguments are provided. Whether or how that information is used is up to the script. The SSH daemon can also pass any combination of the tokens described in the TOKENS section of [http://man.openbsd.org/sshd_config sshd_config(5)] into the program or script being called. Furthermore, the program or script can even be a front end for a database, such as OpenLDAP, or any similar system, as long as '''stdout''' produces a public key.
Below is a more detailed example which uses a local script named '''keyfinder''' run with the account '''keys''' to look up the a public key for certain accounts. First in [http://man.openbsd.org/sshd_config sshd_config(5)] the two directives:
<syntaxhighlight lang="apache" line="1">
AuthorizedKeysCommand /usr/local/sbin/keyfinder %U
AuthorizedKeysCommandUser keys
</syntaxhighlight>
The script below is only a demonstration and a more complex program can call databases or do advanced lookups or heuristics:
<syntaxhighlight lang="shell">
#!/bin/sh
set -e
case $1 in
"1000")
echo "ssh-ed25519 AAAAC3NzaC1lZDIE5AAAAIK89...UT9hz"
;;
"1001")
echo "restrict ssh-ed25519 AAAAC3NzaC1lZDI1NTAAIBvGx...Y0zxV"
;;
"1002")
echo "command=\"/usr/libexec/sftp-server\" ssh-ed25519 AAAAC3NzaC1lZDI1TE5AIPSyY...cPTg3"
;;
*)
exit 1
;;
esac
exit 0
</syntaxhighlight>
The '''AuthorizedKeysCommand''' scripts or programs can return any correctly formatted public key to '''stdout''' for consideration in the authentication process. That includes adding constraints to the keys. Above, the account with the UID 1000 has no constraints, while the account with UID 1001 is quite constrained. Finally, the account with the UID 1002 can only access the SFTP service. See the section "AUTHORIZED_KEYS FILE FORMAT" in [http://man.openbsd.org/sshd sshd(8)] for the full set of possibilities.
===Key-based Authentication Using an Agent===
When an authentication agent, such as [http://man.openbsd.org/ssh-agent.1 ssh-agent(1)], is going to be used, it should generally be started at the beginning of a session and used to launch the login session or X-session so that the environment variables pointing to the agent and its UNIX-domain socket are passed to each subsequent shell and process. Many desktop distros do this automatically upon login or startup.
Starting an agent entails setting a pair of environment variables:
* SSH_AGENT_PID : the process id of the agent
* SSH_AUTH_SOCK : the filename and full path to the UNIX-domain socket
The various SSH and SFTP clients find these variables automatically and use them to contact the agent and try when authentication is needed. However, it is mainly SSH_AUTH_SOCK which is ever used. If the shell or desktop session was launched using [http://man.openbsd.org/ssh-agent.1 ssh-agent(1)], then these variables are already set and available. If they are not available, then it is necessary to either set the variables manually inside each shell or for each application in order to use the agent or else to point to the agent's socket using the directive '''IdentityAgent''' in the client's configuration file.
Once an agent is available, a relevant private key needs to be loaded before the agent can be used. Once in the agent the private key can then be used many times. Private keys are loaded into an agent with [http://man.openbsd.org/ssh-add.1 ssh-add(1)].
<syntaxhighlight lang="shell-session">
$ ssh-add /home/fred/.ssh/mykey_ed25519
Identity added: /home/fred/.ssh/mykey_ed25519 (/home/fred/.ssh/mykey_ed25519)
</syntaxhighlight>
Keys stay in the agent for as long as it is running unless specified otherwise. A timeout can be set either with the '''-t''' option when starting the agent itself or when actually loading the key using [http://man.openbsd.org/ssh-add.1 ssh-add(1)]. In either case, the '''-t''' option will set a timeout interval, after which the key will be purged from the agent.
<syntaxhighlight lang="shell-session">
$ ssh-add -t 1h30m /home/fred/.ssh/mykey_ed25519
Identity added: /home/fred/.ssh/mykey_ed25519 (/home/fred/.ssh/mykey_ed25519)
Lifetime set to 5400 seconds
</syntaxhighlight>
The option '''-l''' will list the fingerprints of all of the identities in the agent.
<syntaxhighlight lang="shell-session">
$ ssh-add -l
256 SHA256:77mfUupj364g1WQ+O8NM1ELj0G1QRx/pHtvzvDvDlOk mykey for task x (ED25519)
3072 SHA256:7unq90B/XjrRbucm/fqTOJu0I1vPygVkN9FgzsJdXbk myotherkey rsa for task y (RSA)
</syntaxhighlight>
It is also possible to remove individual identities from the agent using '''-d''' which will remove them one at a time if identified by file name, but only if the file name is given and without the file name of the private key to be remove, '''-d''' will fail silently. Using '''-D''' instead will remove all of them at once without needing to specify any by name.
By default [http://man.openbsd.org/ssh-add.1 ssh-add(1)] uses the agent connected via the socket named in the environment variable '''SSH_AUTH_SOCK''', if it is set. Currently, that is its only option. However, for [http://man.openbsd.org/ssh.1 ssh(1)] an alternative to using the environment variable is the client configuration directive '''IdentityAgent''' which tells the SSH clients which socket to use to communicate with the agent. If both the environment variable and the configuration directive are available at the same time, then the value in '''IdentityAgent''' takes precedence over what's in the environment variable. '''IdentityAgent''' can also be set to ''none'' to prevent the connection from trying to use any agent at all.
The client configuration directive '''AddKeysToAgent''' can also be useful in getting keys into an agent as needed. When set, it automatically loads a key into a running agent the first time the key is called for if it is not already loaded. Likewise the '''IdentitiesOnly''' directive can ensure that the relevant key is offered on the first try. Rather than typing these out whenever the client is run, they can be added to '''~/.ssh/config''' and thereby added automatically for designated host connections.
====Agent Forwarding====
Agent forwarding is one means of passing through one or more intermediate hosts. However, the '''-J''' option for '''ProxyJump''' would be a safer option. See [[OpenSSH/Cookbook/Proxies_and_Jump_Hosts#Jump_Hosts_--_Passing_Through_a_Gateway_or_Two | Passing Through a Gateway or Two]] in the section on jump hosts about that. With agent forwarding, intermediate machines forward challenges and responses back and forth between the client and the final destination. This comes with some risks but eliminates the need for using passwords or holding keys on any of these intermediate machines.
A main advantage of agent forwarding is that the private key itself is not needed on any remote machine, thus hindering unwanted file system access to it. <ref name="OpenSSH key management, Part 3">{{cite web | url=http://www.ibm.com/developerworks/library/l-keyc3/ | title=Common threads: OpenSSH key management, Part 3 | author=Daniel Robbins | publisher=IBM | date=2002-02-01 | accessdate=2013-04-27}}</ref> Another advantage is that the actual agent to which the user has authenticated does not go anywhere and is thus less susceptible to analysis.
One risk with agents is that they can be re-used to tailgate in if the permissions allow it. Keys cannot be copied this way, but authentication is possible when there are incorrect permissions. Note that disabling agent forwarding does not improve security unless users are also denied shell access, as they can always install their own forwarders.
The risks of agent forwarding can be mitigated by confirming each use of a key by adding the '''-c''' option when adding the key to the agent. This requires the SSH_ASKPASS variable be set and available to the agent process, but will generate a prompt on the host running the agent upon each use of the key by a remote system. So if passing through one or more intermediate hosts, it is usually better to instead have the SSH client use stdio forwarding with '''-W''' or '''-J'''.
On the client side agent forwarding is disabled by default and so if it is to be used it must be enabled explicitly. Put the following line in [http://man.openbsd.org/ssh_config.5 ssh_config(5)] to enable agent forwarding for a particular server:
<syntaxhighlight lang="apache" line="1">
Host gateway.example.org
ForwardAgent yes
</syntaxhighlight>
On the server side the default configuration files allow authentication agent forwarding, so to use it, nothing needs to be done there, just on the client side. However, again, it would be preferable to take a look at '''ProxyJump''' instead.
=====New Style SSH Agent Destination Constraints=====
Using the '''ProxyJump''' option instead of authentication agent forwarding is still the best way to pass through other systems while avoiding the exposure of private keys, something which could happen forwarding agents. However, from 8.9 onward, [http://man.openbsd.org/ssh-agent.1 ssh-agent(1)] will allow the agent to limit which hosts it will use for authentication as specified by [http://man.openbsd.org/ssh-add.1 ssh-add(1)] using the '''-h''' option. These constraints have been added through two agent protocol extensions and a modification to the public key authentication protocol. This feature may evolve, but for now the result is such that keys for account authentication can be loaded into the agent in four ways:
* no limits on forwarding (not recommended)
* local use only, these will not get forwarded
* forwarding, but only to specific remote hosts
* forwarding to specific remote hosts via specified routes
The intent is that the restrictions fail safely so that they do not allow authentication when one or more hosts in the route lack the needed protocol features. The destinations and routes cannot be modified once the keys are loaded, but multiple routes to the same destination can be loaded and the routes can be any number of hops. If the routes need changing, then the key must be reloaded into the agent with the new route or routes.
The general default for the client is to keep keys in the agent for local use only. However, that can be enforced explicitly by adding the '''-a''' option when starting the client or else setting the '''ForwardAgent''' directive in [http://man.openbsd.org/ssh_config.5 ssh_config(5)] to 'no' in the relevant configuration block.
In order to load keys for unlimited forwarding, which is not the best idea, just add them using [http://man.openbsd.org/ssh-add.1 ssh-add(1)] as normal. Then use the '''-A''' option with the client or set the '''ForwardAgent''' directive in [http://man.openbsd.org/ssh_config.5 ssh_config(5)] to 'yes' in the relevant configuration block.
In order to limit keys for connection only to a specific remote host, or to load keys for connection to a specific remote host with forwarding via one or more intermediate hosts, use the '''-h''' option when loading keys into the agent. Here the one key may be used only to connect to the specific destination:
<syntaxhighlight lang="shell-session">
$ ssh-agent -h server.example.org server.key.ed25519
</syntaxhighlight>
If an intermediate system is passed through, the best way is to use '''ProxyJump''' which is the '''-J''' option for the SSH Client. If agent forwarding must be allowed then the tightest way is to constrain which systems may use the keys, again using the '''-h''' option.
<syntaxhighlight lang="shell-session">
$ ssh-agent -h middle.example.org -h "middle.example.org>server.example.org" server.key.ed25519
</syntaxhighlight>
Multiple steps can be included, even multiple routes. They just have to be enumerated explicitly, though patterns may still be used for the destination hosts as well as specific names. Each host in the chain must support these protocol extensions for the connection to complete.
Any keys designated for forwarding are unusable for authentication on any other hosts than those which have been explicitly identified for forwarding. These permitted hosts are identified by host key or host certificate from the '''known_hosts''' file or another file designated by the '''-H''' option when loading the key with [http://man.openbsd.org/ssh-add.1 ssh-add(1)]. If '''-H''' is not used at the time the keys are loaded into the agent, then the default known hosts file(s) will be used: '''~/.ssh/known_hosts''', '''/etc/ssh/ssh_known_hosts''', '''~/.ssh/known_hosts2''', and '''/etc/ssh/ssh_known_hosts2'''.
In the case of keys, the '''known_hosts''' list must be maintained conscientiously <ref name="ssh-agent-restrictions">{{ cite web | author=Damien Miller|url=https://www.openssh.org/agent-restrict.html | title=SSH agent restriction | publisher=OpenSSH | date=2021-12-16|accessdate=2022-03-06}}</ref>, perhaps with the help of the '''UpdateHostkeys''' and '''CanonicalizeHostname''' client configuration directives. Use of certificates requires the agent to only need to be aware of the Certificate Authority (CA).
Again, see [[OpenSSH/Cookbook/Proxies_and_Jump_Hosts#Jump_Hosts_--_Passing_Through_a_Gateway_or_Two | Passing Through a Gateway or Two]] in the section on jump hosts about a way to pass through one or more intermediate machines without needing to forward an SSH agent.
=====Old Style, Almost Safe SSH Agent Forwarding=====
The best way to pass through one or more intermediate hosts is to use the '''ProxyJump''' option instead of authentication agent forwarding and thereby not risking the exposure of any private keys. If authentication agent forwarding must be used, then it would be advisable in the interest of following the principle of least privilege to forward an agent containing the minimum necessary number of keys. There are several ways to solve that.
In version 8.8 and earlier a partial solution is to make a one-off, ephemeral agent to hold just the one key or keys needed for the task at hand. Another partial solution would be to set up a user-accessible service at the operating system level and then use [http://man.openbsd.org/ssh_config.5 ssh_config] for the rest.
Automatically launching an ephemeral agent unique to each session can be done by crafting either a special shell alias or function to launch a single-use agent. Either the function or the alias can be written to require confirmation for each requested signature. The following example is a function is inspired by an updated blog post by Vincent Bernat<ref name="safer-agent-forwarding">{{cite web |url=https://vincent.bernat.ch/en/blog/2020-safer-ssh-agent-forwarding |title=Safer SSH agent forwarding |author=Vincent Bernat|date=2020-04-05 |accessdate=2020-10-04}}</ref> on SSH agent forwarding:
<syntaxhighlight lang="shell-session">
$ agentssh() {
ssh-agent ssh -o AddKeysToAgent=confirm -o ForwardAgent=yes
}
</syntaxhighlight>
Note the use of [http://man.openbsd.org/ssh-agent.1 ssh-agent(1)]. When invoking that alias, the SSH client will be launched with a unique, ephemeral supporting key agent. The alias sets up a new agent, including setting the two environment variables, and then sets two client options while calling the client. This arrangement still checks with [http://man.openbsd.org/ssh_config.5 ssh_config(5)] for other options and settings. When the SSH session is finished the agent which launched it ends and goes away, thus cleaning up after itself automatically.
Another way is to rely on the client's configuration file for some of the settings. Such methods rely mostly on [http://man.openbsd.org/ssh_config.5 ssh_config(5)] but still require an independent method to launch an ephemeral agent because the OpenSSH client is already running by the time it reads the configuration file and is thus not affected by any changes to environment variables caused by the configuration file and it is through the environment variables that contain information about the agent. However, when the path to the UNIX-domain socket used to communicate with the authentication agent is decided in advance then the '''IdentityAgent''' option can point to it once the one-off agent<ref name="wikimedia_ssh_agents">{{cite web |url=https://wikitech.wikimedia.org/wiki/Managing_multiple_SSH_agents#Linux_solutions |title=Managing multiple SSH agents |publisher=Wikimedia|accessdate=2020-04-07}}</ref> is actually launched. The following uses a specific agent's pre-defined socket whenever connecting to either of two particular domains:
<syntaxhighlight lang="apache" line="1">
Host *.wikimedia.org *.wmflabs.org
User fred
IdentitiesOnly yes
IdentityFile %d/.ssh/id_cloud_01
IdentityAgent /run/user/%i/ssh-cloud-01.socket
ForwardAgent yes
AddKeysToAgent yes
</syntaxhighlight>
The '''%d''' stands for the path to the home directory and the '''%i''' stands for the user id (UID) for the current account. In some cases the '''%i''' token might also come in handy when setting the '''IdentityAgent''' option inside the configuration file. Again, be careful when forwarding agents with which keys are in the forwarded agent. See the section "TOKENS" in [http://man.openbsd.org/ssh_config.5 ssh_config(5)] for more such abbreviations.
With those configuration settings, the authentication agent must already be up and running and point to the designated socket prior to starting the SSH client for that configuration to work. Additionally, it should place the socket in a directory which is inaccessible to any other accounts. [http://man.openbsd.org/ssh-agent.1 ssh-agent(1)] must use the '''-a''' option to name the socket:
<syntaxhighlight lang="shell-session">
$ ssh-agent -a /run/user/${UID}/ssh-cloud-01.socket
</syntaxhighlight>
That agent configuration can be launched manually or via a script or service manager. However, in the interests of privacy and security in general, agent forwarding is to be avoided. The configuration directive '''ProxyJump''' is the best alternative and, on older systems, host traversal using '''ProxyCommand''' with [http://man.openbsd.org/nc.1 netcat] are preferable. Again, see the section on [[OpenSSH/Cookbook/Proxies and Jump Hosts|Proxies and Jump Hosts]] for how those methods are used.
====Checking the Agent for Specific Keys====
The [http://man.openbsd.org/ssh_add ssh_add(1)] utility's '''-T''' option can test whether a specific private key is available in the agent or not by looking up the matching public key. That can be useful in a shell script.
<syntaxhighlight lang="shell">
#!/bin/sh
key=/home/fred/.ssh/some.key.ed25519.pub
if ssh-add -T ${key}; then
echo "Key ${key} Found"
else
echo "Key ${key} missing"
fi
</syntaxhighlight>
Or it could be done with an alternate syntax just as well either in a script or in an interactive shell sessions,
<syntaxhighlight lang="shell-session">
$ key=/home/fred/.ssh/some.key.ed25519.pub
$ ssh-add -T ${key} && echo "Key found" || echo "Key missing"
</syntaxhighlight>
However, if the desired result would be to add key to the agent then the '''AddKeysToAgent''' client configuration option can ensure that a specific key is added to the SSH agent upon first use during any given login session. That can be done using '''-o AddKeysToAgent=yes''' as a run-time argument, or by modifying [http://man.openbsd.org/ssh_config ssh_config(5)] as appropriate:
<syntaxhighlight lang="apache" line="1">
Host www
HostName www.example.com
IdentityFile %d/.ssh/www.ed25519
IdentitiesOnly yes
AddKeysToAgent yes
</syntaxhighlight>
With those options in the configuration file, the first time <code>ssh www</code> is run the specified key will get added to the agent and remain available.
===Key-based Authentication Using A Hardware Security Token===
While stand-alone keys have been around for a long time, it has been possible since version 8.2 to use keys backed by hardware security tokens, such as OnlyKey, Yubikey, or many others, though the FIDO2 protocol. The Universal 2nd Factor (U2F) authentication is supported directly in OpenSSH through FIDO2 and does not need third party software. At the moment there are two types of hardware backed keys, ECDSA-SK and Ed25519-SK, but only the latest hardware tokens support the latter. If the key Ed25519-SK format is not supported by the token's firmware, then the following error message will be presented when attempts to use that key type are made:
<syntaxhighlight lang="text">
Key enrollment failed: invalid format
</syntaxhighlight>
If supported, either key type can be created with [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)]. The steps are almost identical to creating normal keys but the token must be available to the system (plugged in) first. Then if called for, the token's PIN must be entered and the token touched or otherwise activated. After that, the key creation proceeds as normal. Mind the key type as specified by the '''-t''' option.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -t ed25519-sk -f /home/fred/.ssh/server.ed25519-sk -C "web server for fred"
Generating public/private ed25519-sk key pair.
You may need to touch your authenticator to authorize key generation.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/fred/.ssh/server.ed25519-sk
Your public key has been saved in /home/fred/.ssh/server.ed25519-sk.pub
The key fingerprint is:
SHA256:41wVVDnKJ9gKr2Sj4CFuYMhcNvYebZ6zq0PWyP4rRDo web server
The key's randomart image is:
+[ED25519-SK 256]-+
| .o... |
| .o |
| +.. . |
| = . . ..= . |
|+ + * + So.. o |
|o+.EoO *+oo |
|.o oBo+++o |
| o .=.+. |
| . .=== |
+----[SHA256]-----+
</syntaxhighlight>
Once created, the public and private key files get handled like with any other type of key. But when authenticating, the hardware token must be present and activated when called for.
<syntaxhighlight lang="shell-session">
$ ssh -i /home/fred/.ssh/server.ed25519-sk server.example.org
Enter passphrase for key '/home/fred/.ssh/server.ed25519-sk':
Confirm user presence for key ED25519-SK SHA256:41wVVDnKJ9gKr2Sj4CFuYMhcNvYebZ6zq0PWyP4rRDo
</syntaxhighlight>
The resulting private key file is not actually the key itself but instead a "key handle" which is used by the hardware security token to derive the real private key on demand at the time it is actually used<ref name="OpenBSD_tech_U2F_FIDO">{{cite web |url=https://marc.info/?l=openbsd-tech&m=157376801917387&w=2 |title=OpenSSH U2F/FIDO support in base
|publisher=OpenBSD-Tech Mailing List | date=2019-11-14
|accessdate=2021-03-24}}</ref>. As a result, the hardware-backed private key file is useless without the accompanying hardware token. This also means that these key files are not portable across hardware tokens, say when having multiple tokens in reserve or as backup, even when used by the same account. So when multiple hardware tokens are in use, different key pairs must be generated for each token.
====Hardware Security Token Resident Private Key====
It is possible to store the private key within the token itself, but for the moment it cannot be used directly from inside the token and must first be saved as a file. Also, the key can only be loaded into the FIDO authenticator at the time of creation using the '''-O resident''' option with [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)]. Otherwise, the process is the same as above.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -O resident -t ed25519-sk -f /home/fred/.ssh/server.ed25519-sk -C "web server for fred"
. . .
</syntaxhighlight>
When needed, the resident key can be extracted from the FIDO2 hardware token and saved into a file using the '''-K''' option. At this stage a passphrase can be added to the file, but no passphrase is kept within the token itself, only an optional PIN protects the key there.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -K
Enter PIN for authenticator:
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Saved ED25519-SK key to id_ed25519_sk_rk
$ mv -i id_ed25519_sk_rk /home/fred/.ssh/server.ed25519-sk
</syntaxhighlight>
Since the output file name is fixed, any pre-existing file with that name can get overwritten but there will be a warning first. However, it is not recommended to keep the key on the hardware token because it provides more protection when kept separately.
==Single-purpose Keys==
Tailored single-purpose keys can eliminate use of remote root logins for many administrative activities. A finely tailored '''sudoers''' is needed along with an unprivileged account. When done right, it gives just enough access to get the job done, following the security principle of Least Privilege.
Single-purpose keys are accompanied by use of either the '''ForceCommand''' directive in [http://man.openbsd.org/ssh_config.5 sshd_config(5)] or the '''command="..."''' directive inside the '''authorized_keys''' file. The method is to generate a new key pair, transfer the public key to '''authorized-keys''' on the remote system, and then prepend the appropriate command or script there to the line with the key.
<syntaxhighlight lang="shell-session">
$ grep '^command' ~/.ssh/authorized_keys
command="/usr/local/bin/somescript.sh" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEcgdzDvSebOEjuegEx4W1I/aA7MM3owHfMr9yg2WH8H
</syntaxhighlight>
The '''command="..."''' directive inserted there overrides everything else and ensures that when logging in with just that key only the script '''/usr/local/bin/somescript.sh''' is run. If it is necessary to pass parameters to the script, have a look at the contents of the '''SSH_ORIGINAL_COMMAND''' environment variable and use it in a case statement. Do not ever trust the contents of that variable nor use the contents directly, always indirectly.
Single-purpose keys are useful for allowing only a tunnel and nothing more. The following key will only echo some text and then exit, unless used non-interactively with the '''-N''' option.
<syntaxhighlight lang="shell-session">
$ grep '^command' ~/.ssh/authorized_keys
command="/bin/echo do-not-send-commands" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBzTIWCaILN3tHx5WW+PMVDc7DfPM9xYNY61JgFmBGrA
</syntaxhighlight>
No matter what the user tries while logging in with that key, the session will only echo the given text and then exits. Using the '''-N''' option disables running the remote program, allowing the connection to stay open, allowing a tunnel.
<syntaxhighlight lang="shell-session">
$ ssh -L 3306:localhost:3306 \
-i ~/.ssh/tunnel_ed25519 \
-N \
-l fred \
server.example.com
</syntaxhighlight>
That creates a tunnel and stays connected despite a key configuration which would close an interactive session. See also the '''-n''' or '''-f''' option for [http://man.openbsd.org/ssh.1 ssh(1)].
===Single-purpose Keys to Avoid Remote Root Access===
The easy way is to write a short shell script, place it '''/usr/local/bin/''', and then configure '''sudoers''' to allow the otherwise unprivileged account to run just that script and only that script.
<syntaxhighlight lang="apache" line="1">
%wheel ALL=(root:root) NOPASSWD: /usr/sbin/service httpd stop
%wheel ALL=(root:root) NOPASSWD: /usr/sbin/service httpd start
</syntaxhighlight>
Then the key calls the script using '''command="..."''' inside '''authorized_keys'''. Here the one key starts the web server, the other stops the web server.
<syntaxhighlight lang="shell-session">
$ grep '^command' ~/.ssh/authorized_keys
command="/usr/bin/sudo /usr/sbin/service httpd stop" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEcgdzDvSebOEjuegEx4W1I/aA7MM3owHfMr9yg2WH8H
command="/usr/bin/sudo /usr/sbin/service httpd start" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMidyqZ6OCvbWqA8Zn+FjhpYE6NoWSxVjFnFUk6MrNZ4
</syntaxhighlight>
Complicated programs like [http://linux.die.net/man/1/rsync rsync(1)], [http://man.openbsd.org/tar.1 tar(1)], [http://linux.die.net/man/1/mysqldump mysqldump(1)], and so on require an advanced approach when building a single-purpose key. For them, the '''-v''' option can show exactly what is being passed to the server so that '''sudoers''' can be set up correctly. That way they can be restricted to only access designated parts of the file system. For example, here is what <code>ssh -v</code> shows from one particular usage of [http://linux.die.net/man/1/rsync rsync(1)], note the "Sending command" line:
<syntaxhighlight lang="shell-session">
$ rsync -e 'ssh -v' fred@server.example.org:/etc/ ./backup/etc/
. . .
debug1: Sending command: rsync --server --sender -e.LsfxC . /etc/
. . .
</syntaxhighlight>
That output can then be added to '''sudoers''' so that the key can do only that function.
<syntaxhighlight lang="shell-session">
%backup ALL=(root:root) NOPASSWD: /usr/bin/rsync --server --sender -e.LsfxC . /etc/
</syntaxhighlight>
Then to tie it all together, the account "backup" needs a key:
<syntaxhighlight lang="shell-session">
$ grep '^command' ~/.ssh/authorized_keys
command="/usr/bin/rsync --server --sender -e.LsfxC . /etc/" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMm0rs4eY8djqBb3dIEgbQ8lmdlxb9IAEuX/qFCTxFgb
</syntaxhighlight>
Many of these programs have a '''--dry-run''' or equivalent option. Remember to use it when figuring out the right settings.
===Read-only Access to Keys===
In some cases it is necessary to prevent accounts from being able to changing their own authentication keys. However, such situations may be a better case for using certificates. However, if done with keys it is accomplished by putting the key file in an external directory where the user has read-only access, both to the directory and to the key file. Then the '''AuthorizedKeysFile''' directive assigns where [http://man.openbsd.org/sshd.8 sshd(8)] looks for the keys and can point to a secured location for the keys instead of the default location.
A good alternate location could be a new directory '''/etc/ssh/authorized_keys''' which could store the selected accounts' key files there. The change can be made to apply to only a group of accounts by putting the settings under a '''Match''' directive. The default location for keys on most systems is usually '''~/.ssh/authorized_keys'''.
<syntaxhighlight lang="apache" line="1">
Match Group sftpusers
AuthorizedKeysFile /etc/ssh/authorized_keys/%u
</syntaxhighlight>
Then the permissions there would allow the keys to be read but not written:
<syntaxhighlight lang="shell-session">
$ ls -dhln /etc/ssh/
drwxr-x--x 3 0 0 4.0K Mar 30 22:16 /etc/ssh/authorized_keys/
$ ls -dhln /etc/ssh/*.pub
-rw-r--r-- 1 0 0 173 Mar 23 13:34 /etc/ssh/fred
-rw-r--r-- 1 0 0 93 Mar 23 13:34 /etc/ssh/user1
-rw-r--r-- 1 0 0 565 Mar 23 13:34 /etc/ssh/user2
. . .
</syntaxhighlight>
The keys could even be within subdirectories, though the same restrictions apply regarding permissions and ownership.
For chrooted SFTP, the method is the same to keep the key files out of reach of the accounts:
<syntaxhighlight lang="apache" line="1">
Match Group sftpusers
ChrootDirectory /home
ForceCommand internal-sftp -d %u
AuthorizedKeysFile /etc/ssh/authorized_keys/%u
</syntaxhighlight>
Of course a '''Match''' directive is not essential. The settings could be made to apply to all accounts by putting the directive in the main part of the server configuration file instead.
==Mark Public Keys as Revoked==
Keys can be revoked. Keys that have been revoked can be stored in '''/etc/ssh/revoked_keys''', a file specified in [http://man.openbsd.org/ssh_config.5 sshd_config(5)] using the directive '''RevokedKeys''', so that [http://man.openbsd.org/sshd.8 sshd(8)] will prevent attempts to log in with them. No warning or error on the client side will be given if a revoked key is tried. Authentication will simply progress to the next key or method.
The revoked keys file should contain a list of public keys, one per line, that have been revoked and can no longer be used to connect to the server. The key cannot contain any extras, such as [[OpenSSH/Client_Configuration_Files#Available_key_login_options | login options]] or it will be ignored. If one of the revoked keys is tried during a login attempt, the server will simply ignore it and move on to the next authentication method. An entry will be made in the logs of the attempt, including the key's fingerprint. See the section on [[OpenSSH/Logging_and_Troubleshooting | logging]] for a little more on that.
<syntaxhighlight lang="apache" line="1">
RevokedKeys /etc/ssh/revoked_keys
</syntaxhighlight>
The '''RevokedKeys''' configuration directive is not set in [http://man.openbsd.org/ssh_config.5 sshd_config(5)] by default. It must be set explicitly if it is to be used. This is another situation that might be better fulfilled through using certificate since a validity interval can be set in any combination of seconds, minutes, hours, days, or weeks can be set for certificates while keys are valid indefinitely.
===Key Revocation Lists===
A Key Revocation List (KRL) is a compact, binary form of representing revoked keys and certificates. In order to use a KRL, the server's configuration file must point to a valid list using the '''RevokedKeys''' directive. KRLs themselves are generated with [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)] and can be created from scratch or edited in place. Here a new one is made, populated with a single public key:
<syntaxhighlight lang="shell-session">
$ ssh-keygen -k -f /etc/ssh/revoked_keys -z 1 ~/.ssh/old_key_rsa.pub
</syntaxhighlight>
Here an existing KRL is updated by adding the '''-u''' option:
<syntaxhighlight lang="shell-session">
$ ssh-keygen -u -k -f /etc/ssh/revoked_keys -z 2 ~/.ssh/old_key_dsa.pub
</syntaxhighlight>
Once a KRL is in place, it is possible to test if a specific key or certificate is in the revocation list.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -Q -f /etc/ssh/revoked_keys ~/.ssh/old_key_rsa.pub
</syntaxhighlight>
Only public keys and certificates will be loaded into the KRL. Corrupt or broken keys will not be loaded and will produce an error message if tried. Like with the regular '''RevokedKeys''' list, the public key destined for the KRL cannot contain any extras like login options or it will produce an error when an attempt is made to load it into the KRL or search the KRL for it.
==Verify a Host Key by Fingerprint==
The above examples have been about using keys to authenticate the client to the server. A different context in which keys are used is when the server identifies itself to the client, which happens automatically at the beginning of each non-multiplexed session. In order for that identification to happen the client acquires a public key from the server, usually on or prior to first contact, which it can subsequently use to ensure that it is connecting to the same server again and not an impostor. The default locations for storing these acquired host keys on the client are in '''/etc/ssh/ssh_known_hosts''', if managed by the system administrator, or in '''~/.ssh/known_hosts''' if managed by the client's own account. The format of the contents is a line with a host address and its matching public key. The file is described in detail in the [http://man.openbsd.org/sshd.8 sshd(8)] manual page in the section "SSH_KNOWN_HOSTS FILE FORMAT".
When connecting for the first time to a remote host, the server's host key should be verified in order to ensure that the client is connecting to the right machine and not an impostor or anything else. Usually this verification is done by comparing the fingerprint of the server's host key rather than trying to compare the whole key itself. By default the client will show the fingerprint if the key is not already found in the '''known_hosts''' register.
<syntaxhighlight lang="shell-session">
$ ssh -l fred server.example.org
The authenticity of host 'server.example.org (192.0.32.10)' can't be established.
ECDSA key fingerprint is SHA256:LPFiMYrrCYQVsVUPzjOHv+ZjyxCHlVYJMBVFerVCP7k.
Are you sure you want to continue connecting (yes/no)?
</syntaxhighlight>
That can be compared to a fingerprint received out of band, say by post, e-mail, SMS, courier, and so on. Specifically, the example represents the key's fingerprint as a base64 encoded SHA256 checksum. That is the default style. The fingerprint can also be displayed as an MD5 hash in hexadecimal instead by passing the client's '''FingerprintHash''' configuration directive as a runtime argument or setting it in [http://man.openbsd.org/ssh_config.5 ssh_config(5)].
<syntaxhighlight lang="shell-session">
$ ssh -o FingerprintHash=md5 host.example.org
The authenticity of host 'host.example.org (192.0.32.203)' can't be established.
RSA key fingerprint is MD5:10:4a:ec:d2:f1:38:f7:ea:0a:a0:0f:17:57:ea:a6:16.
Are you sure you want to continue connecting (yes/no)?
</syntaxhighlight>
But the default in new versions is SHA256 in base64 has a lower chance of collision.
In OpenSSH 6.7 and earlier, the client showed fingerprints as a hexadecimal MD5 checksum instead a of the base64-encoded SHA256 checksum currently used:
<syntaxhighlight lang="shell-session">
$ ssh -l fred server.example.org
The authenticity of host 'server.example.org (192.0.32.10)' can't be established.
RSA key fingerprint is 4a:11:ef:d3:f2:48:f8:ea:1a:a2:0d:17:57:ea:a6:16.
Are you sure you want to continue connecting (yes/no)?
</syntaxhighlight>
Another way of comparing keys is to use the ASCII art visual host key. See further below about that.
===Downloading keys===
Even though a host’s key is usually displayed for review the first time the SSH client tries to connect, it can also be fetched on demand at any time using [http://man.openbsd.org/ssh-keyscan.1 ssh-keyscan(1)]:
<syntaxhighlight lang="shell-session">
$ ssh-keyscan server.example.org
# server.example.org:22 SSH-2.0-OpenSSH_10.6
server.example.org ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEWKepJgkC2XTG5cAr2Nyew6hOp5AjG7vi2RYFtPWqN3bo5XGuCX2d2YVyn++/2PtyMYBaKWyFpCNTT9X0F1Epg=
# server.example.org:22 SSH-2.0-OpenSSH_10.6
server.example.org ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDKyERe8k+fnsrt4JrcLD3AW0kXj90r9ybrEZuY/CTrXIqYSizO335SxGJoWrKijaRy8htuueMkmNfxxhnBPoAjul/4T/FCRGKaV0jC96xYNnKcXbnXxSLVQ0OW2EIPvQhw/TU/G3vEqtiRYGyaNcZS6xrnVv3xuPuvVC1VRKspNLEq7zfvToC0OB89X5DIbvBbHY13PjJ0NrDdX3sSA8lxPsYagBuDIvyxH0S4Z5fQHeYrdvENS5zX6LwJeMeGSOqDuD0Zb4hpKxhaGVwP5e435VcFuImbFaDPM4w71PzaSUEj+tnUA0mGDoLiCrpW3txkJszog9lN3C/nLGghFaT7ajrfH55qut81JnvdhMju9+SzxrKPJmtQZfKVLIc4whEbtFsPCdm2bstz7ROWxTJ3t/Vr8/QVm2G2aY4FHuPwo2jUQDbQA7mCV+fe1sADy2jLzGhn1TCeYvWSv5PNJAT97IrLfD3+0Uo+qJD/6CU7F8oabj1Ql2H8fPN5kGSWfkM=
# server.example.org:22 SSH-2.0-OpenSSH_10.6
server.example.org ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJo5gc4VrxVQ5apAOd7qK6UqGlLMpWOPuunjB53JBN2s
# server.example.org:22 SSH-2.0-OpenSSH_10.6
# server.example.org:22 SSH-2.0-OpenSSH_10.6
# server.example.org:22 SSH-2.0-OpenSSH_10.6
server.example.org ssh-mldsa44-ed25519 AAAAE3NzaC1tbGRzYTQ0LWVkMjU1MTkAAAVAyIw5r9FaniSYqBX0yd9vgBz5nCkebaQlMQN9N0p//Ukfn/CnZ3YtZWn6pUGjDM85/bqdL1gqah1OLfnl1eHk0qvTACrym07uKaMLoEHuakIXHbTi/ELPRoRP3F+DpEgjtYSjLc/fJiobRMgSvmLJxTUzZTStsqWAL1L9/1zuwHEngR+THpUcCSTi6KKkYcQiWGOFwpO22VdiuOg+zdQSH+9jW6eXYk1z81KU6UlHZps8zVrlqCd3FDDghgbH5U8DcGN2t6GvVfn6jFjpEk0ouj0of3/7010eRXjnv3QSbprCpMq73lAemQM+3LvTtrMBhFWNhCXhyOHfO1Yq7c8xaOwlFK78PlERjdHTvVJaCaDFDy7Pg9I+wxv+uC+W0wtzJ2S1y9XCYUgJo9yEiIGuSZdhMkYUwMnXLzQMm44hQOW153pdlHWze3kESCLg/LJf9RbUoSB43t6rghSHEiUkIi5TtCtFZ4nAGeH+wVwlB9Fwog5uZuJN1FYuuY5sSrLHJAQDUwudkdak0ifOhtPtsM/ClYr3baolQ/qi0ABYUVLKSV5b+A5DlTXa23zc7JAXm2YVfkWpOfVJG4TY81wrJoDumsd1y3XaH28/4QbADsZCE3wYsBou8ff0xKgPu8xm2K+sYSmzUbBGprArAQA0LtIDGNGqrb4JsZ1ru+viwzfSlxV7Nz7ZrSw6h+Ddq4J9A6oKXy6YS3uf1GFOtBQm6JfuyMHQEEUtYZrU4UK3C/fKHx9vjuw7YdhsL8JRgxbF14qJLFizkmVbK2e6aWEE4iCqLLLlZ0dC2peYUUqyGb9PsW7sewYzGbipzPpQ/GobRT3Obc3Gmu8P386pDGR7hmkOpFmVwIcfc431cUmZixK7CkPxzUvfaAAQkmNs/p4eNNoP0gq/xPGsV14/heULbWp/njGWk1ysjjGxP6YMwHcEZpUdSGbD05zbL0KkMtmKsr8yuJYjdVAgtH2bVAvrxXRXLgavmm97VYYq1A9rOYiQFlMrKRg6yZhT10Xt8Hukf6ySLk+fieFc3nH99YeysoA5rsfp9kdXr65GpwrBerZlf/20ZLJ7s4xaYb9SukR/8tiPt9iAVQjqPdb0MseZVrzhKo/jK44JHbHejHMoMMs7etPAS5TIjHxcJTP66B3eO9A0l2fAage2ka7ehTnHivxD3EE9KnqYBjIHDU7o6dTrX7UyQsdhax9bPKEL7OEtm6hXXfwzy4GdqGi124BclFAF0LeBSvBUgmSKIn3wfzJx/XXbt512eOn3WZk2v0TsiteH9kPEgDxVkUykawg2tleak9rTFMzYpDZRHvZD7uHWUZ8ktr2FEKWgq7/1Q2c80Z6H75VK9l1d3KZuoiWoF1s73R7ZAM+CWSrR+S5h+3AhYubDKPa/af+Lnlqe6ocVTqQPYaaRz25/cLBg6pgbdh18Ru6h3ljG2KiysyXeuoEoM5xVYtdIW7l9NeKDpGbZPAOqywXUpK+UCGjumIl7c48KCTIYcdtolnEbfVNBh0LRuftcVI+uF9cvQ0XacaNbgkYJYCjv4VR/n58EJ1b0c7tQBrVqMjDjIUKGhCMQqAeD3g75jeD60bBmVNPrq8RK+zH5VIa5eaBs3eitN98eVzd4b6UYTQd1QxLQZMrhQf4InRj39TZfGvQR5SXlLZQlweVHYkMps3IKbs3B3DCqlWCPUAnTAJBAG7HqWEYr5uEaKBawBSAx9jCQz00T+bp8KXpkOPzZCD6dfEfpHY6Rv6kmGJkiPUCb2hoX145HrS357G12+wDxKLN833oPVC0z
</syntaxhighlight>
Once a key is acquired, its fingerprint can be shown using [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)] to read from '''stdin'''. This can be done directly with a pipe.
<syntaxhighlight lang="shell-session">
$ ssh-keyscan server.example.org | ssh-keygen -l -f -
3072 SHA256:tQlw3vy325KrQibndP3gLS/YXUZjTLVA5yDFpg/Bb6I server.example.org (RSA)
256 SHA256:snnAtb/9csdy0BGhPjdg+VNWqN5bxCa/ge4C6zZ8muk server.example.org (ECDSA)
256 SHA256:agRZDZn8awhQ+tc19Ip/whkHoV33Ln2REO7v1kcYbdU server.example.org (ED25519)
512 SHA256:3Wdc6GbLIcc5mbuF2mhhokhARdMLuMK+ESRfJ+sM0QE server.example.org (MLDSA44-ED25519)
</syntaxhighlight>
If there is more than one public key type is available from the server on the port polled, then [http://man.openbsd.org/ssh-keyscan.1 ssh-keyscan(1)] will fetch each of them. If there is more than one key fed via '''stdin''' or a file, then [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)] will process them in order. Prior to OpenSSH 7.2 manual fingerprinting was a two step process, the key was read to a file and then processed for its fingerprint.
<syntaxhighlight lang="shell-session">
$ ssh-keyscan -t ed25519 host.example.org > key.pub
# host.example.org SSH-2.0-OpenSSH_6.8
$ ssh-keygen -lf key.pub
256 SHA256:ZmS+IoHh31CmQZ4NJjv3z58Pfa0zMaOgxu8yAcpuwuw host.example.org (ED25519)
</syntaxhighlight>
Note that some output from [http://man.openbsd.org/ssh-keyscan.1 ssh-keyscan(1)] is sent to '''stderr''' instead of '''stdout'''.
A hash, or fingerprint, can be generated manually with [http://linux.die.net/man/1/awk awk(1)], [http://linux.die.net/man/1/sed sed(1)] and [http://linux.die.net/man/1/xxd xxd(1)], on systems where they are found.
<syntaxhighlight lang="shell-session">
$ awk '{print $2}' key.pub | base64 -d | md5sum -b | sed 's/../&:/g; s/: .*$//'
$ awk '{print $2}' key.pub | base64 -d | sha256sum -b | sed 's/ .*$//' | xxd -r -p | base64
</syntaxhighlight>
It is possible to find all hosts from a file which have new or different keys from those in '''known_hosts''', if the host names are in clear text and not stored as hashes.
<syntaxhighlight lang="shell-session">
$ ssh-keyscan -t ed25519,mldsa44-ed25519 -f ssh_hosts | \
sort -u - ~/.ssh/known_hosts | \
diff ~/.ssh/known_hosts -
</syntaxhighlight>
====Using ssh-keyscan(1) with ssh_config(5)====
The utility [http://man.openbsd.org/ssh-keyscan.1 ssh-keyscan(1)] does not parse [http://man.openbsd.org/ssh_config.5 ssh_config(5)]. That is in part to keep the code base simple. There are a lot of configuration options which would be complicated to implement, including but not limited to '''ProxyJump''', '''ProxyCommand''', '''Match''', '''BindInterface''', and '''CanonicalizeHostname'''<ref name="keyscan">{{cite mailing list |url=https://lists.mindrot.org/pipermail/openssh-unix-dev/2023-March/040605.html | title=Why does ssh-keyscan not use .ssh/config? |publisher=mindrot.org | access-date=2023-03-01 | date=2023-03-01 | mailing-list=OpenSSH UNIX-dev | first=Damien | last=Miller }}</ref> . Resolving host names via the client configuration file can be done by wrapping the utility in a short shell function:
<syntaxhighlight lang="shell">
my-ssh-keyscan() {
for host in "$@" ; do
ssh-keyscan $(ssh -G "$host" | awk '/^hostname/ {print $2}')
done
}
</syntaxhighlight>
That shell function uses the '''-G''' option of [http://man.openbsd.org/ssh.1 ssh(1)] to resolve each host name using [http://man.openbsd.org/ssh_config.5 ssh_config(5)] and then check the resulting host name for SSH keys.
===ASCII Art Visual Host Key===
An ASCII art representation of the key can be displayed along with the SHA256 base64 fingerprint:
<syntaxhighlight lang="shell-session">
$ ssh-keygen -l -v -f key
256 SHA256:BClQBFAGuz55+tgHM1aazI8FUo8eJiwmMcqg2U3UgWU www.example.org (ED25519)
+--[ED25519 256]--+
|o+=*++Eo |
|+o .+.o. |
|B=.oo. . |
|*B.=.o . |
|= B * S |
|. .@ . |
| +..B |
| *. o |
| o.o. |
+----[SHA256]-----+
</syntaxhighlight>
In OpenSSH 6.7 and earlier the fingerprint is in MD5 hexadecimal form.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -l -v -f key
2048 37:af:05:99:e7:fb:86:6c:98:ee:14:a6:30:06:bc:f0 www.example.net (RSA)
+--[ RSA 2048]----+
| o |
| o . |
| o o |
| o + |
| . . S |
| E .. |
| .o.* .. |
| .*=.+o |
| ..==+. |
+-----------------+
</syntaxhighlight>
==More on Verifying SSH Keys==
Keys on the client or the server can be verified against known good keys by comparing the base64-encoded SHA256 fingerprints.
===Verifying Stray Client Keys===
Sometimes is is necessary to compare two uncertain key files to check if they are part of the same key pair. However, public keys are more or less disposable. So the easy way in such situations on the client machine is to just rename or erase the old, problematic, public key and replace it with a new one generated from the existing private key.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -y -f ~/.ssh/my_key_ed25519
</syntaxhighlight>
But if the two parts must really be compared, it is done in two steps using [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)]. First, a new public key is re-generated from the known private key and used to make a fingerprint to '''stdout'''. Next, the fingerprint of the unknown public key is generated for comparison. In this example, the private key '''my_key_a_ed25519''' and the public key '''my_key_b_ed25519.pub''' are compared:
<syntaxhighlight lang="shell-session">
$ ssh-keygen -y -f my_key_a_ed25519 | ssh-keygen -l -f -
$ ssh-keygen -l -f my_key_b_ed25519.pub
</syntaxhighlight>
The result is a base64-encoded SHA256 checksum for each key with the one fingerprint displayed right below the other for easy visual comparison. Older versions don't support reading from '''stdin''' so an intermediate file will be needed then. Even older versions will only show an MD5 checksum for each key. Either way, automation with a shell script is simple enough to accomplish but outside the scope of this book.
===Verifying Server Keys===
Reliable verification of a server's host key must be done when first connecting. It can be necessary to contact the system administrator who can provide it out of band so as to know the fingerprint in advance and have it ready to verify the first connection.
Here is an example of the server's Ed25519 key being read and its fingerprint shown as SHA256 base64:
<syntaxhighlight lang="shell-session">
$ ssh-keygen -l -f /etc/ssh/ssh_host_ed25519_key.pub
256 SHA256:bFzzouaWmE5HuZIv+YnGUYI2q06i6M43V+6jMU3LHpA root@server.example.org (ED25519)
</syntaxhighlight>
And here the corresponding ECDSA key is read, but shown as an MD5 hexadecimal hash:
<syntaxhighlight lang="shell-session">
$ ssh-keygen -E md5 -l -f /etc/ssh/ssh_host_ecdsa_key.pub
256 MD5:ed:d2:34:b4:93:fd:0e:eb:08:ee:b3:c4:b3:4f:28:e4 root@server.example.net (ECDSA)
</syntaxhighlight>
Prior to 6.8, the fingerprint was expressed as an MD5 hexadecimal hash:
<syntaxhighlight lang="shell-session">
$ ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub
2048 MD5:e4:a0:f4:19:46:d7:a4:cc:be:ea:9b:65:a7:62:db:2c root@server.example.net (RSA)
</syntaxhighlight>
It is also possible to use [http://man.openbsd.org/ssh-keyscan.1 ssh-keyscan(1)] to get keys from an active SSH server. However, the fingerprints still needs to be verified out of band.
====Warning: Remote Host Identification Has Changed!====
If a server's key does not match what the client finds has been recorded in either the system's or the local account's '''authorized_keys''' files, then the client will issue a warning along with the fingerprint of the suspicious key.
<pre>
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256:bFzzouaWmE5HuZIv+YnGUYI2q06i6M43V+6jMU3LHpA.
Please contact your system administrator.
Add correct host key in /home/fred/.ssh/known_hosts to get rid of this message.
Offending ED25519 key in /home/fred/.ssh/known_hosts:11
Host key for server.example.org has changed and you have requested strict checking.
Host key verification failed.
</pre>
Three reasons for the warning are common.
One reason is that the server's keys were replaced, often because the server's operating system was reinstalled without backing up the old keys. Another reason can be when the system administrator has phased out deprecated or compromised keys. However that can be planned better and if there is time to plan the migration, new keys can just be added to the server and have the clients use the '''UpdateHostKeys''' option so that the new keys are accepted if the old keys match. A third situation is when the connection is made to the wrong machine, such as when the remote system changes IP addresses because of dynamic address allocation.
In all three cases where the key has changed there is only one thing to do: contact the system administrator and verify the key. Ask if the OpenSSH-server was recently reinstalled, or was the machine restored from an old backup? Keep in mind that the system administrator may be you yourself in some cases.
The case which is rather rare but serious enough that it should be ruled out for sure is that the wrong machine is part of a man-in-the-middle attack.
In all four cases, an authentic key fingerprint can be acquired by any method where it is possible to verify the integrity and origin of the message, for example via PGP-signed e-mail. If physical access is possible, then use the console to get the right fingerprint. Once the authentic key fingerprint is available, return to the client machine where you got the error and remove the old key from '''~/.ssh/known_hosts'''
<syntaxhighlight lang="shell-session">
$ ssh-keygen -R server.example.org
</syntaxhighlight>
Then try logging in, but compare the key fingerprints first and proceed if and '''only''' if the key fingerprint matches what you received out of band. If the key fingerprint matches, then go through with the login process and the key will be automatically added. If the key fingerprint does not match, stop immediately and figure out what you are connecting to. It would be a good idea to get on the phone, a real phone not a computer phone, to the remote machine's system administrator or the network administrator.
===Multiple Keys for a Host, Multiple Hosts for a Key in known_hosts===
Multiple host names or IP addresses can use the same key in the '''known_hosts''' file by using pattern matching or simply by listing multiple systems for the same key. That can be done in either the global list of keys in '''/etc/ssh/ssh_known_hosts''' and the local, account-specific lists of keys in each account's '''~/.ssh/known_hosts''' file. Labs, computational clusters, and similar pools of machines can make use of keys in that way. Here is a key shared by three specific hosts, identified by name, one host per line:
<pre>
server1 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMIId09yQEh9634wNXR+y7L79th2M4awBgCwqWJobJuQ fred@desk.example.org
server2 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMIId09yQEh9634wNXR+y7L79th2M4awBgCwqWJobJuQ fred@desk.example.org
server3 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMIId09yQEh9634wNXR+y7L79th2M4awBgCwqWJobJuQ fred@desk.example.org
</pre>
Or a range can be specified by using globbing to a limited extent in either '''/etc/ssh/ssh_known_hosts''' or '''~/.ssh/known_hosts'''.
<pre>
172.19.40.* ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMIId09yQEh9634wNXR+y7L79th2M4awBgCwqWJobJuQ fred@desk.example.org
</pre>
Conversely, a pool of servers might have multiple keys for the same address. In that case, it is necessary to make multiple entries in either '''/etc/ssh/ssh_known_hosts''' or '''~/.ssh/known_hosts''' for each key.
<pre>
server1 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMIId09yQEh9634wNXR+y7L79th2M4awBgCwqWJobJuQ fred@desk.example.org
server1 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBrsIIaDl/bJ40vyprvF+HYAq+kE2jWUsOt+WqIheaBw fred@desk.example.org
server1 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIC2CgwWTPH/qZDeHmW7ZUea18wa9As7Txq3P5dXCfoXj fred@desk.example.org
</pre>
Thus in order to get a pool of servers to share a pool of keys, each server-key combination must be added manually to the '''known_hosts''' file:
<pre>
server1 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMIId09yQEh9634wNXR+y7L79th2M4awBgCwqWJobJuQ fred@desk.example.org
server1 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBrsIIaDl/bJ40vyprvF+HYAq+kE2jWUsOt+WqIheaBw fred@desk.example.org
server1 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIC2CgwWTPH/qZDeHmW7ZUea18wa9As7Txq3P5dXCfoXj fred@desk.example.org
server2 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICPSs4OR2LT89mv2tM4TKqeVhh4XvoLQ77MSBmjyrMGm fred@desk.example.org
server2 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHChTzAoJr53A7VP1BdMHqLTFK5cz/2Vc065+VcpP4VA fred@desk.example.org
server2 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHP+4BvU4DzwYQgznARxx/qyBWmu49PAywHwDRgslRaM fred@desk.example.org
</pre>
Though upgrading to certificates might be a more appropriate approach that manually updating lots of keys.
===Another way of Dealing with Dynamic (roaming) IP Addresses===
It is possible to manually point to the right key using '''HostKeyAlias''' either as part of [http://man.openbsd.org/ssh_config.5 ssh_config(5)] or as a runtime parameter. Here the key for machine ''Foobar'' is used to connect to host 192.168.11.15
<syntaxhighlight lang="shell-session">
$ ssh -o StrictHostKeyChecking=accept-new \
-o HostKeyAlias=foobar \
192.168.11.15
</syntaxhighlight>
This is useful when DHCP is not configured to try to keep the same addresses for the same machines over time or when using certain stdio forwarding methods to pass through intermediate hosts.
===Host Key Update and Rotation in known_hosts===
A protocol extension to rotate weak public keys out of '''known_hosts''' has been in OpenSSH from version 6.8<ref name="djm_rotation">
{{cite web
| title=Key rotation in OpenSSH 6.8+
| author=Damien Miller
| url=http://blog.djm.net.au/2015/02/key-rotation-in-openssh-68.html
| date=2015-02-01
| publisher=DJM's Personal Weblog
| accessdate=2016-03-05
}}
</ref> and later. With it the server is able to inform the client of all its host keys and update '''known_hosts''' with new ones when at least one trusted key already known. This method still requires the private keys be available to the server <ref name="djm_rotation_redux">
{{cite web
| title=Hostkey rotation, redux
| author=Damien Miller
| url=http://blog.djm.net.au/2015/02/hostkey-rotation-redux.html
| date=2015-02-17
| publisher=DJM's Personal Weblog
| accessdate=2016-03-05
}}
</ref> so that proofs can be completed. In [http://man.openbsd.org/ssh_config.5 ssh_config(5)], the directive '''UpdateHostKeys''' specifies whether the client should accept updates of additional host keys from the server after authentication is completed and add them to '''known_hosts'''. A server can offer multiple keys of the same type for a period before removing the deprecated key from those offered, thus allowing an automated option for rotating keys as well as for upgrading from weaker algorithms to stronger ones. See also [https://datatracker.ietf.org/doc/html/rfc4819 RFC 4819: Secure Shell Public Key Subsystem] about key management standards.
==Converting Between SSH Key Formats==
OpenSSH has its own format for keys which it uses by default when new keys are made. However, other SSH clients and servers may use other formats such as [https://www.rfc-editor.org/rfc/rfc4716 RFC 4716], [https://www.rfc-editor.org/rfc/rfc5958 PKCS8], or [https://www.rfc-editor.org/rfc/rfc1421 PEM]. Any of these can be converted to the default OpenSSH format by [http://man.openbsd.org/ssh-keygen.1 ssh-keygen(1)]. The default to format to try to convert from is RFC 4716. The utility [https://linux.die.net/man/1/puttygen puttygen(1)] makes keys in that format for [https://linux.die.net/man/1/putty putty(1)] and they need conversion when used with OpenSSH's server.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -i -f /var/tmp/key_public.ppk
</syntaxhighlight>
However, you can use the '''-m''' option to specify either that format explicitly or else choose another one to convert from.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -i -m RFC4716 -f /var/tmp/key_public.ppk
$ ssh-keygen -i -m PKCS8 -f /var/tmp/key_public.ppk
</syntaxhighlight>
Both examples above are for importing public keys into OpenSSH's own format.
By default OpenSSH will write newly-generated keys in its own format, so the '''-m''' option is obligatory to produce public keys in another format.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -e -m PKCS8 -f ~/.ssh/key.pub
</syntaxhighlight>
It is not yet possible to export private keys from the OpenSSH format to one of the other formats using the '''-e''' option. Even if a private key is specified as input, a public key is produced:
<syntaxhighlight lang="shell-session">
$ ssh-keygen -e -m RFC4716 -f ~/.ssh/key
</syntaxhighlight>
Not all key types are supported by all key formats.
It is also possible to use export to display the key pair as a traditional hex dump.
<syntaxhighlight lang="shell-session">
$ ssh-keygen -e -m hexdump -f ~/.ssh/key
Enter passphrase for "key":
Public ED25519 key:
buffer len = 51
0000: 00 00 00 0b 73 73 68 2d 65 64 32 35 35 31 39 00 ....ssh-ed25519.
0016: 00 00 20 b0 c5 cc 2c cb d8 8b 8d 75 80 eb e6 e9 .. ...,....u....
0032: 2c f4 36 08 7b 5b ad ad 0b 54 4f 7f 21 9d 1b e8 ,.6.{[...TO.!...
0048: 9e e0 32 ..2
Private ED25519 key:
buffer len = 119
0000: 00 00 00 0b 73 73 68 2d 65 64 32 35 35 31 39 00 ....ssh-ed25519.
0016: 00 00 20 b0 c5 cc 2c cb d8 8b 8d 75 80 eb e6 e9 .. ...,....u....
0032: 2c f4 36 08 7b 5b ad ad 0b 54 4f 7f 21 9d 1b e8 ,.6.{[...TO.!...
0048: 9e e0 32 00 00 00 40 e1 c3 a2 4d d9 89 49 72 9b ..2...@...M..Ir.
0064: 86 72 6c 07 17 1b 40 4f 62 50 62 45 4f 4c cf cf .rl...@ObPbEOL..
0080: 57 8b 9d c0 04 8f 9b b0 c5 cc 2c cb d8 8b 8d 75 W.........,....u
0096: 80 eb e6 e9 2c f4 36 08 7b 5b ad ad 0b 54 4f 7f ....,.6.{[...TO.
0112: 21 9d 1b e8 9e e0 32 !.....2
</syntaxhighlight>
==Disadvantages of Keys, in Contrast to Certificates==
Keys are quite useful in small environments. There they are still considered established best practice. However, keys have trouble scaling when deployments increase greatly in scope or duration. The following limitations tend to get in the way as environments grow or age:
* Deployment and removal are done manually unless orchestration tools are already in place. Copying and configuring each key for each account on each server takes more time and effort as either or both numbers grow.
* Keys are valid indefinitely, with neither start dates nor expiration dates. They are usable until hunted down and removed. It's hard to find them all.
* Host verification must be done manually and thus some will omit it.
* Access control is not embedded inside keys but added in separate, server-side configurations which might or might not be editable by the accounts in question.
* Identity information is not embedded inside keys either.
When any of those limitations start to become problematic, it can be time to consider escalating to [[OpenSSH/Cookbook/Certificate-based_Authentication | Certificate-based Authentication]] instead. It is addressed in the next chapter.
<noinclude>
== References ==
{{reflist}}
{{OpenSSH/TOC|mini}}
</noinclude>
{{BookCat}}
{{status|100%}}
df3sgvf4iisvtqbh69vpbd9svt6y982
Teachers' Toolbox/Ways to improve your own teaching
0
93533
4676580
4327683
2026-10-17T23:55:50Z
BlueCuddleBear
3627179
/* Video feedback */
4676580
wikitext
text/x-wiki
There are several ways to continuously improve and develop your own teaching.
==Peer coaching==
Resources
*[http://www.modares.ac.ir/elearning/Mchizari/AEA/Page/Class14/peer.htm Peer Coaching: An Innovation in Teaching]
*[http://webserver3.ascd.org/ossd/peercoaching.html Peer Coaching]
==Feedback to other teachers==
==Student evaluations==
===Feedback to the supervisor===
Below is a sample of a questionaire for the students. But keep contact to the students during the project, also outside the lab/classroom to get a feeling for how the group is working and what they might need from you.
====''EXAMPLE:'' Feedback questionnaire====
We would like you to write a brief answer to the following questions, so we can improve the supervision and overall teaching of courses:
The theory and background:
*Has the goal of the project been clear to you ?
*Have you been in doubt about why you were doing something (if yes, please give an example) ?
*Did you find the project matched and challenged your knowledge, or was it too easy/difficult ?
*How did your supervisor teach you - did you miss some specific kind of help (more help on basic theory, more structured teaching etc.) ?
*Whats the best experience you had during the project ?
*Whats the worst experience you had during the project ?
**if you had a bad experience, what would you suggest to avoid this in the future?
Groupwork:
*Are you satisfied with your own engagement in the project ?
*Are you satisfied with your groupmembers engagement ?
*What kind of problems did you encounter in the team and why did they occur ?
*Did you manage to distribute the workload evenly ?
*Did you manage to follow your strategy plan ?
*Could /should you supervisor help you more with how the group works, and how ?
==Teaching portfolio==
Writing down in your CV or in a teaching portfolio what you have been working on and how you have approached the teaching with various methods depending on the aim and students level is a valuable source of inspiration when you get the 'grand picture' rather than solving day to day problems.
==Video feedback==
Nobody seems to like this, but having your teaching recorded on video and the having a look at yourself afterwards is probably a very efficient way to see what you could improve...
{{BookCat}}
fcsuajc0f89footvz5u4jsj7krm8fpv
Wikibooks:Reading room/General
4
112405
4676695
4676442
2026-10-18T06:22:06Z
Pine
504037
/* October 2026 Wikimedia Café: legal issues on Commons, and WMF Board selection process */ new section
4676695
wikitext
text/x-wiki
__NEWSECTIONLINK__ {{Discussion Rooms}} {{Shortcut|WB:CHAT|WB:RR/G|WB:GENERAL}} {{TOC left|limit=3}}
{{User:MiszaBot/config
|archive = Wikibooks:Reading room/Archives/%(year)d/%(monthname)s
|algo = old(60d)
|counter = 1
|minthreadstoarchive = 1
|minthreadsleft = 1
|key = 7a0ac23cf8049e4d9ff70cabb5649d1a
}}
Welcome to the '''General reading room'''. On this page, Wikibookians are free to talk about the Wikibooks project in general. For proposals for improving Wikibooks, see the [[../Proposals/]] reading room.
{{clear}}
[[Category:Reading room]]
== Call for administrators ==
Any experienced editor who has a good understanding of Wikibooks' policies should consider applying for administrator permissions at [[Wikibooks:Requests for permissions]]. Thank you. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] ([[User talk:Codename Noreste|discuss]] • [[Special:Contributions/Codename Noreste|contribs]]) 22:10, 5 August 2026 (UTC)
:Is there a page here that describes what admins do? I am curious because I checked [https://en.wikibooks.org/wiki/Special:ListUsers?username=&group=sysop&wpsubmit=&wpFormIdentifier=mw-listusers-form&limit=50 List of admins] and I see that there are already quite a few admins here and wonder which areas have a shortage.
:Just curious. [[Special:Contributions/~2026-40500-29|~2026-40500-29]] ([[User talk:~2026-40500-29|talk]]) 00:56, 16 September 2026 (UTC)
::[[Wikibooks:Administrators]]. ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 01:09, 16 September 2026 (UTC)
== Wikibooks project is not defined by goal ==
If it is for texbooks why is it called Wikibooks? It should be called Wikitextbooks! If it is for textbooks why does it contain cookbooks? For textbooks it's not supposed to have a [[Wikibooks:Featured books]]. [[User:Vivairan2|Vivairan2]] ([[User talk:Vivairan2|discuss]] • [[Special:Contributions/Vivairan2|contribs]]) 09:20, 1 September 2026 (UTC)
:It's "textbooks" broadly construed: guides, manuals, how-tos, etc. ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 11:15, 1 September 2026 (UTC)
::So we should change "Wikibooks:Featured books" to "Wikibooks:Featured texts". [[User:Vivairan2|Vivairan2]] ([[User talk:Vivairan2|discuss]] • [[Special:Contributions/Vivairan2|contribs]]) 11:17, 1 September 2026 (UTC)
:::I disagree and even if I agreed, it would be priority #49,389. ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 11:20, 1 September 2026 (UTC)
::::It's according to community consensus that says this website contains textbooks not books. [[User:Vivairan2|Vivairan2]] ([[User talk:Vivairan2|discuss]] • [[Special:Contributions/Vivairan2|contribs]]) 11:23, 1 September 2026 (UTC)
:::::"[[wb:WIW|Simply, Wikibooks is a collection of open-content textbooks.]]" [[User:Vivairan2|Vivairan2]] ([[User talk:Vivairan2|discuss]] • [[Special:Contributions/Vivairan2|contribs]]) 11:26, 1 September 2026 (UTC)
:Most textbooks are made by collaboration of some authors, co-authors and editors. Wikibooks help pages and guidelines remain silent when it comes to stages of writing a new texbooks. Even [[Using Wikibooks]] is not complete emough for enthusiasts. --[[User:Vivairan2|Vivairan2]] ([[User talk:Vivairan2|discuss]] • [[Special:Contributions/Vivairan2|contribs]]) 18:13, 3 September 2026 (UTC)
:@[[User:Vivairan2|Vivairan2]], In my opinion this is a good question. I wish more users would chime in. [[Special:Contributions/~2026-40500-29|~2026-40500-29]] ([[User talk:~2026-40500-29|talk]]) 16:10, 19 September 2026 (UTC)
== Wishlist 2027, invitation to share feedback ==
Hi, I’m [[m:User:SPerry-WMF|Sonja]] and I lead some of the [[mw:Contributors|teams]] at the Foundation who will be responsible for picking up wish work under the new wishlist process.
As you may know, the [[m:Community_Wishlist|Community Wishlist]] started out as an annual process through which Wikimedia contributors submit and vote on technical improvements they would like the Wikimedia Foundation to work on. The main goal of it is and has been to improve the editing experience by making changes and features the community asks for specifically.
In recent years, the process behind the wishlist has changed, and we’ve heard from many of you that it no longer meets many community members’ needs. So now, the Foundation is designing a new process with the community to improve how wishes are triaged, voted on, and prioritized in a way that is transparent, balanced across project families and language editions, and takes into account what the Foundation can deliver.
I would like to get community input specifically on these three stages of the Wishlist process:
* The [[m:Special:MyLanguage/Community_Wishlist/Community_Wishlist_2027#triage|'''triage stage''']], meaning how wishes are fleshed out, organized and filtered prior to voting
** We recommend to have a working group, including volunteers from various wikis and Wikimedia Foundation staff to work through this together
* The [[m:Special:MyLanguage/Community_Wishlist/Community_Wishlist_2027#vote|'''voting stage''']], including who may vote and how votes are structured
* The [[m:Special:MyLanguage/Community_Wishlist/Community_Wishlist_2027#postvote|'''post-vote stage''']], including how to bring equity into what work is prioritized
** One way to do this is to rank wishes within 3 categories: Large Wikipedias or covering all wikis, small and medium-sized Wikipedias, and '''sister projects''', so that top-voted wishes from smaller projects also get attention
This message is an abstract of the full proposed process. As you [[m:Special:MyLanguage/Community_Wishlist/Community_Wishlist_2027|read the proposed ideas on Meta]] (available in your language), please speak up about whether you think this will work well or if there are ways to make it stronger.
Regarding the timeline, this consultation is open for two weeks. You can post your feedback on Meta (in your preferred language) or in response below.
For this year’s cycle, [[m:Special:MyLanguage/Community_Wishlist/Community_Wishlist_2027#timeline|we plan]] to have the wish submission period in late October/early November and the triage process completed by late November. To respect the end-of-year holiday season, voting would happen in early to mid January. This first voting cycle is meant as a first step to try out a new process, and there will be more opportunities to provide feedback along the way, so that we can figure out the best process for future years together.
[[oldwikisource:M:User:SPerry-WMF|SPerry-WMF]], delivered by [[User:Trizek (WMF)|Trizek (WMF)]] ([[User talk:Trizek (WMF)|discuss]] • [[Special:Contributions/Trizek (WMF)|contribs]]) 13:52, 1 September 2026 (UTC)
:Thank you to everyone who engaged in the discussion around [[m:Talk:Community_Wishlist/Community_Wishlist_2027|the proposal from August 26]]. We've processed your feedback and [https://meta.wikimedia.org/w/index.php?title=Community_Wishlist/Community_Wishlist_2027&diff=prev&oldid=31041090 made changes] accordingly. Note that we weren’t able to implement all of it for this cycle, mostly for logistical reasons, but this is merely meant to be a first step and we will continue to improve this process with you all before we run through the next cycle. We plan to use [[m:Community_Wishlist/Community_Wishlist_2027#Updated_Community_Wishlist_Process_2027/2028|this updated version]] for the Wishlist 2027, and we look forward to hearing from you all during the submission and voting periods.
:[[:M:User:SPerry-WMF|SPerry-WMF]], delivered by [[User:Trizek (WMF)|Trizek (WMF)]] ([[User talk:Trizek (WMF)|discuss]] • [[Special:Contributions/Trizek (WMF)|contribs]]) 14:49, 17 September 2026 (UTC)
::@[[User:SPerry-WMF|User:SPerry-WMF]],@[[User:Trizek (WMF)|Trizek (WMF)]]: Thank you for posting info regarding the wishlist to the English Wikibooks. I am sure there are many new users here who can benefit.
::I used to participate in those discussions years ago and I know a lot of effort goes into making discussions useful not only for users of wikipedia, but also for the many language versions of the smaller wikimedia projects such as Wikibooks. [[Special:Contributions/~2026-40500-29|~2026-40500-29]] ([[User talk:~2026-40500-29|talk]]) 16:28, 19 September 2026 (UTC)
== How Do I Get My Book On A Shelf? ==
Help, I don't know how shelves work. I don't know how to put my book on a shelf. Can anyone help?
The book is called''' Art And AI''' [[User:3MMPEYTON|3MMPEYTON]] ([[User talk:3MMPEYTON|discuss]] • [[Special:Contributions/3MMPEYTON|contribs]]) 23:00, 8 September 2026 (UTC)
: Which shelf are you referring? [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:45, 10 September 2026 (UTC)
== Who is allowed to delete pages here? ==
On Aug 14, 2026 a user by the name of Max deleted a page I created in my user space. I don't see max in the list of admins here. Do they have the right to delete pages? Is there any documentation here I can consult?
Thanks in advance, [[Special:Contributions/~2026-40500-29|~2026-40500-29]] ([[User talk:~2026-40500-29|talk]]) 22:38, 15 September 2026 (UTC)
:We have local admins who have the technical ability to delete pages and virtually all material deleted here would be done by us (I'm one of them). A fairly small amount of users have global rights across all Wikimedia Foundation wikis and they will very rarely make deletions (e.g. if there are some kind of legal implications to material). [[User:Ottawahitech/American politics]] was deleted by [[User:Max]], who has [[Special:UserRights/Max|no special rights here]] but is one of the [[:m:Global sysops|global sysops]] I mentioned earlier. ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 22:55, 15 September 2026 (UTC)
: Probably unrelated to the above, but Ottawahitech should do that with their account, unless if they are blocked. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 23:33, 15 September 2026 (UTC)
::Agreed and [[User:Ottawahitech]] is not blocked here, so no idea why he's using a temp account. ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 23:43, 15 September 2026 (UTC)
:::There may be many reasons registered users are "editing" without logging in. Is it possible that they want to go about peacefully without attracting too much attention? [[Special:Contributions/~2026-40500-29|~2026-40500-29]] ([[User talk:~2026-40500-29|talk]]) 15:01, 16 September 2026 (UTC)
:::: We neither have a policy nor a guideline about this, probably. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 19:12, 20 September 2026 (UTC)
::::Notwithstanding a claim that the temp account is actually User:Ottawahitech, we have no idea that they are the same person. If the temp account is the same person, and they want to have a user space page, they can create temp account ones. The registered user account pages are intended for that registered user account and not as a dumping ground for anyone to create pages. [[User:MarcGarver|MarcGarver]] ([[User talk:MarcGarver|discuss]] • [[Special:Contributions/MarcGarver|contribs]]) 08:29, 13 October 2026 (UTC)
== Assistance to get page reviewed ==
My page is a translation page: [[Baiyi Zhuan]]
It is a single page, it is translated according to my own ability and familiarity with the language with a disclosure on external tools. I would like it to get reviewed if possible as I do not have the rights. [[User:Taitesena|Taitesena]] ([[User talk:Taitesena|discuss]] • [[Special:Contributions/Taitesena|contribs]]) 11:19, 18 September 2026 (UTC)
== Translation of books ==
Hello,
I would like to translate books from other Wikibooks into English. Are there any guidelines regarding how to do this? [[User:TechVindicator|TechVindicator]] ([[User talk:TechVindicator|discuss]] • [[Special:Contributions/TechVindicator|contribs]]) 00:34, 20 September 2026 (UTC)
: This has yet to be expanded, but you might want to take a look at [[Wikibooks:Content translation]]. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 19:13, 20 September 2026 (UTC)
== Feedback on Wikibooks redirect ==
I would like your feedback on my proposal to make [[Wikibooks:Username|this page]] redirect to [[Using Wikibooks/Setting Up A User Account#Choosing a Username|this page]]? I would do it myself, but it is not possible due to the fact that [[Wikibooks:Username]] can only be made by admins. This is because [[Wikibooks:Username policy]] also links to [[Using Wikibooks/Setting Up A User Account#Choosing a Username|this page]]. Regards, [[User:TechVindicator|TechVindicator]] ([[User talk:TechVindicator|discuss]] • [[Special:Contributions/TechVindicator|contribs]]) 04:37, 21 September 2026 (UTC)
:{{support}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 00:00, 22 September 2026 (UTC)
:This seems like a good idea to me. [[User:Alextejthompson|''Alextejthompson'']] (''Ping me or leave a message on my [[User talk:Alextejthompson|talk page]]'') 17:49, 21 September 2026 (UTC)
: {{done}}, I restored the redirect per consensus here. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:03, 13 October 2026 (UTC)
== Pages created by [[User:Sisterian]] ==
I have checked with AI checkers (GPTZero, ZeroGPT) and they claim that these pages have been made with the use of GenAI. I do not know whether this is correct or not; because yes, AI checkers can and do make mistakes. I have tried reaching out to the person via talk page, to no response. I am asking for input just to see what the future of these pages are. [[User:TechVindicator|TechVindicator]] ([[User talk:TechVindicator|discuss]] • [[Special:Contributions/TechVindicator|contribs]]) 12:00, 22 September 2026 (UTC)
:Thank you for flagging this @[[User:TechVindicator|TechVindicator]]. I have looked at these pages personally, and there is fairly conclusive evidence that this user has been using genAI/LLMs for their contributions. I have warned them accordingly. Cheers —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 20:50, 22 September 2026 (UTC)
== I'm in the process of creating a separate page describing the removal of admin permissions ==
As the section title says, please see [[User:Codename Noreste/sandbox]] and feel free to make any adjustments. We might consider moving this to [[Wikibooks:Administrators/De-adminship]] someday. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 18:05, 24 September 2026 (UTC)
== Your feedback wanted: Remove ''(Language link added:) and similar'' edits from Special:RecentChanges ==
''(Apologies for posting in English. You can help by translating it)''
Hello, I’m Danny from [[:en:w:Wikimedia_Deutschland|Wikimedia Deutschland’s]] [[m:Wikidata_For_Wikimedia_Projects|Wikidata For Wikimedia Projects]] team.<br/>
We have been investigating and examining how Wikidata’s use in the [[Special:RecentChanges]] and [[Special:Watchlist]] pages can be made to be more useful, or less ‘noisy’ (fewer edits that have little value to the reader).
We are currently exploring to make a change in the volume and the type of Wikidata edits that appear in these pages, and '''we need your feedback''' to help us ensure this is a positive change for the Wikis and won’t disrupt your workflows.<br/>
Language links are also known as sitelinks or interlanguage links and describe when a Wikidata item is connected to a Wiki, adding it to the language dropdown tool for other connected Wikis.
[[File:Types of Lang Link changes.png|x350px|frame|A variety of "Language Link" edits as seen in the Recent Changes feed]]
The request for feedback is whether you support the removal of these language link edits from the Recent Changes and Watchlist feed, or would you oppose such a change and if so, why?
Please share you thoughts on the dedicated '''[[m:Talk:Wikidata_For_Wikimedia_Projects/Clearer_Wikidata_Edit_Summaries/Hide_Language_Link_edits|metawiki Talk page]]'''.
Further information about this change: [[m:Wikidata_For_Wikimedia_Projects/Clearer_Wikidata_Edit_Summaries/Hide_Language_Link_edits|m:Wikidata_For_Wikimedia_Projects/Hide_Language_Link_edits]]
Thank you for any participation or feedback you give, -- [[m:User:Danny_Benjafield_(WMDE)|User:Danny Benjafield (WMDE)]] 11:46, 25 September 2026 (UTC)
<!-- Message sent by User:Danny Benjafield (WMDE)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=User:Danny_Benjafield_(WMDE)/MassMessage_test_list&oldid=31080832 -->
== FlaggedRevs again ==
<div class="cd-moveMark">''Moved to [[Wikibooks:Reading room/Proposals#FlaggedRevs again]]. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 18:01, 1 October 2026 (UTC)''</div>
== Wikidata Sitelink changes in Recent Changes and Watchlist ==
''(Apologies for cross-posting in English, translating it will help spread the message)''
Editors on group 1 wikis, including Wikiquote, Wikibooks, Wikiversity, Wikivoyage, and Wikisource, will no longer see notifications on [[Special:RecentChanges|Recent Changes]] and [[Special:Watchlist|Watchlist]] when a link to ''another'' language version of a page is added, removed, or changed in its Wikidata item. This change will begin on '''October 5 at 07:00 UTC''' as a two-week trial to reduce high-volume, low-value notifications and make higher-value changes easier to identify. Editors who rely on these notifications should be aware of the change and can share feedback or concerns on the [[m:Wikidata For Wikimedia Projects/Clearer Wikidata Edit Summaries/Hide Language Link edits|project]] or [[m:Talk:Wikidata_For_Wikimedia_Projects/Clearer_Wikidata_Edit_Summaries/Hide_Language_Link_edits|talk page]].<br/>Please reach out if you have any questions, thank you! -- [[User:Danny_Benjafield_(WMDE)|Danny Benjafield (WMDE)]] ([[User_talk:Danny_Benjafield_(WMDE)|talk]]) sent via [[User:MediaWiki message delivery|MediaWiki message delivery]] ([[User talk:MediaWiki message delivery|discuss]] • [[Special:Contributions/MediaWiki message delivery|contribs]]) 12:42, 1 October 2026 (UTC)
<!-- Message sent by User:Danny Benjafield (WMDE)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=User:Danny_Benjafield_(WMDE)/MassMessage_test_list&oldid=31106967 -->
== Approved Revs extension ==
If we were to have this extension, we should only limit this to the Wikijunior namespace, since we will eventually stop using FlaggedRevs, unless if we want Approved Revs to work in another namespace.
Remember, this is not a vote, but an overall discussion. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 01:17, 11 October 2026 (UTC)
== An apology ==
Due to the removal of the <code>editor</code> and <code>autoreview</code> user groups and my failure to immediately correct the [https://github.com/JJPMaster/jjpmaster-bot-enwb-t1 code of my bot], the markAdmins gadget data has not been updated for 39 hours. I apologize if anyone has been affected. [https://github.com/JJPMaster/jjpmaster-bot-enwb-t1/commit/65e615ef04d82500674a3711f2d99fe7cd8968d0 This commit] corrected the problem. [[User:JJPMaster|JJP]]<sub>[[User talk:JJPMaster|Mas]]<sub>[[Special:Contributions/JJPMaster|ter]]</sub></sub> ([[wikt:she|she]]/[[wikt:they|they]]) 06:05, 17 October 2026 (UTC)
== October 2026 Wikimedia Café: legal issues on Commons, and WMF Board selection process ==
<div class="border-box" style="background-color: var(--background-color-warning-subtle, #f8eaba); max-width: 875px; padding: 5px; border: 1px solid black; margin: 5px; color: var(--clr-dark)">
<div class="box" style="float:left; padding-top: 10px; padding-right: 10px; padding-left: 10px; padding-bottom: 10px;">[[File:Wikimedia Café logo in plain SVG format.svg|60px|alt=The logo for the Wikimedia Café]]</div>
Hello! There will be two '''[https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9 Wikimedia Café]''' discussion opportunities in October. In a change from the usual Café practice, this month's sessions will have different topics. Anyone who meets the Café attendance criteria is welcome to attend either or both sessions.
Session A will happen on Saturday, 24 October 2026 at 15:00 UTC ([https://zonestamp.toolforge.org/1792854000 timestamp converter]), at a time friendly to the Americas, Africa, and Europe. This session will feature [https://meta.wikimedia.org/wiki/User:PBradley-WMF Wikimedia Foundation lawyer Phil Bradley-Schmieg]. We will discuss legal issues on Wikimedia Commons, including complexities of international law. (I am hoping that in a future month, a similar Café session will be offered at a time friendly to Asia and the Pacific.)
Session B will happen on Sunday, 25 October 2026 at 03:00 UTC ([https://zonestamp.toolforge.org/1792897200 timestamp converter]), at a time friendly to Asia and the Pacific, we will discuss [https://meta.wikimedia.org/wiki/Wikimedia_Foundation_elections/2027/Proposed_eligibility_criteria proposed changes to how Wikimedia Foundation Board candidates are selected]. The latest proposals are much different from the earlier July 2026 proposals. The due date for feedback on current proposals is 27 October, and Wikimedians are welcome to participate on the [https://meta.wikimedia.org/wiki/Talk:Wikimedia_Foundation_elections/2027/Proposed_eligibility_criteria proposal talk page] regardless of Café attendance.
Please see the [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9 Café] page for more information, including [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9#How_to_attend_the_session how to register]!
To subscribe or unsubscribe for Café notices on your talk page please [https://meta.wikimedia.org/wiki/Global_message_delivery/Targets/Wikimedia_Caf%C3%A9 go here].
<br />
[[File:Buntstifte Eberhard Faber crop 64h.jpg|860px|alt=cropped image of colored pencils]]</div>
<span style="white-space:nowrap;">[[User:Pine|<span style="color:#01796f; text-shadow:#00BFFF 0 0 1.0em">༄ᨒ𖠰 Pine</span>]] [[User talk:Pine|<span style="color:DeepSkyBlue">(<b style="color:#FFDF00;text-shadow:#FFDF00 0 0 1.0em">✉</b>)</span>]]</span> 06:22, 18 October 2026 (UTC)
6cygworg3uj3fe1by2v94qm1ldzt0vp
Wikibooks:Reading room/Administrative Assistance
4
140081
4676702
4676477
2026-10-18T08:10:40Z
ArchiverBot
1227662
Bot: Archiving 1 thread (older than 14 days) to [[Wikibooks:Reading room/Administrative Assistance/Archives/2026/October]]
4676702
wikitext
text/x-wiki
{{/Header}} {{User:MiszaBot/config
|archive = Wikibooks:Reading room/Administrative Assistance/Archives/%(year)d/%(monthname)s
|algo = old(14d)
|counter = 1
|minthreadstoarchive = 1
|minthreadsleft = 1
}}
== ~2026-51118-27 reported by EggRoll97 ==
* {{anonlinks|~2026-51118-27}}
Vandalism <!-- USERREPORTED:/~2026-51118-27/ --> [[User:EggRoll97|EggRoll97]] ([[User talk:EggRoll97|discuss]] • [[Special:Contributions/EggRoll97|contribs]]) 07:28, 4 October 2026 (UTC)
: {{done}} by NDG (GS). [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:13, 4 October 2026 (UTC)
== ~2026-53393-86 reported by MathXplore ==
* {{anonlinks|~2026-53393-86}}
Vandalism <!-- USERREPORTED:/~2026-53393-86/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:37, 5 October 2026 (UTC)
:Various contributions deleted—watching to see how this develops. —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 19:15, 5 October 2026 (UTC)
== [[CustomChessTheory]] ==
Reason for reporting: Wrong title, renaming needed. [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:45, 5 October 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 15:21, 8 October 2026 (UTC)
== Siddhgiritubes reported by MathXplore ==
* {{userlinks|Siddhgiritubes}}
Spam <!-- USERREPORTED:/Siddhgiritubes/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:31, 7 October 2026 (UTC)
: Page deleted by JJPMaster. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 15:09, 8 October 2026 (UTC)
== Editbots reported by MathXplore ==
* {{userlinks|Editbots}}
Link spam ([[Special:AbuseLog/316068]], [[Special:Contributions/~2026-54143-79]]) <!-- USERREPORTED:/Editbots/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:13, 8 October 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 15:10, 8 October 2026 (UTC)
== Lenawalker1 reported by TechVindicator ==
* {{userlinks|Lenawalker1}}
Spam <!-- USERREPORTED:/Lenawalker1/ --> [[User:TechVindicator|TechVindicator]] ([[User talk:TechVindicator|discuss]] • [[Special:Contributions/TechVindicator|contribs]]) 04:07, 10 October 2026 (UTC)
:{{done|Dealt with}} by SHB —[[User:Kittycataclysm|Kittycataclysm]] ([[User talk:Kittycataclysm|discuss]] • [[Special:Contributions/Kittycataclysm|contribs]]) 04:31, 11 October 2026 (UTC)
== Cleanwipes reported by MathXplore ==
* {{userlinks|Cleanwipes}}
Link spam, [[Special:AbuseLog/316154]] <!-- USERREPORTED:/Cleanwipes/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:21, 14 October 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 15:20, 14 October 2026 (UTC)
== Suniluv2026 reported by MathXplore ==
* {{userlinks|Suniluv2026}}
Link spam, [[Special:AbuseLog/316149]] <!-- USERREPORTED:/Suniluv2026/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:22, 14 October 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 15:21, 14 October 2026 (UTC)
== Rudrashares01 reported by MathXplore ==
* {{userlinks|Rudrashares01}}
Spam <!-- USERREPORTED:/Rudrashares01/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:26, 15 October 2026 (UTC)
:{{done}} ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 19:25, 15 October 2026 (UTC)
== Rimshad12 reported by Morkoz ==
* {{userlinks|Rimshad12}}
Spam ([[:m:special:GlobalContributions/Rimshad12|cross-wiki]]) <!-- USERREPORTED:/Rimshad12/ --> [[User:Morkoz|Morkoz]] ([[User talk:Morkoz|discuss]] • [[Special:Contributions/Morkoz|contribs]]) 06:06, 16 October 2026 (UTC)
:{{done|Locked}} --[[User:SHB|SHB]] ([[User talk:SHB|discuss]] • [[Special:Contributions/SHB|contribs]]) 11:41, 16 October 2026 (UTC)
69ng8qlc8fzjsi8sfmptxw8575fcfpc
Wikibooks:Requests for import
4
140082
4676698
4669472
2026-10-18T07:21:32Z
TechVindicator
3626296
/* Import this page→ User:TechVindicator/Wikibooks Magazine Layout */ new section
4676698
wikitext
text/x-wiki
{{User:MiszaBot/config
|archive = Wikibooks:Requests for import/Archives/%(year)d/%(monthname)s
|algo = old(31d)
|counter = 1
|minthreadstoarchive = 1
|minthreadsleft = 1
|key =
}}
__NEWSECTIONLINK__ {{Discussion Rooms}} {{shortcut|WB:RFI}} {{TOC left}}{{clear}}
=== Importing and import uploading ===
To preserve edit histories and observe the attribution requirements of the licenses, content from our sister projects should be '''imported''' rather than simply pasted into a new module.
* [[Wikibooks:Importers|Importers]] can import pages from any of the English-language projects, Simple English Wikibooks, Meta, and Wikispecies.
* [[Wikibooks:Administrators|Administrators]], and import uploaders, can import from any wiki (even non-WMF).
'''Requests to import''' can be made to help in making or expanding a book, and to move works from other projects that fit [[Wikibooks:What is Wikibooks|Wikibooks' scope]].
* Place requests below and an administrator or importer will try to perform the import promptly.
* Note that administrators and importers are not responsible for moving and cleaning up pages. Please watch this page for when the import is complete and take care of the imported page.
'''Administrators and importers:'''
* Please read [[Help:Importing]] first.
* To import a page, go to [[Special:Import]].
* Pages will by default import into <code>Transwiki:Page's name</code>, which can be moved to a new location.
* After import, add {{tl|dewikify}} to the page and make a note where the imported page has ended up.
* Pages with extremely long edit histories may fail to import. In this case, a single revision which gives attribution to the source wiki will be imported. While this isn't ideal, it should satisfy our [[WB:CC-BY-SA|licensing]]. Note that repeated attempts to import may eventually bring over the history, so if it fails on the first attempt, you might want to try it a few more times. Please see [[phab:17000|T17000]], and ask for it to be resolved sooner.
{{Warning|In some cases an import may partially fail and need to be repeated. If this happens, the revisions may be out of sequence in the history so you need to check the current revision is the one you want to use as the base for your book}}
=== Non-free media uploading ===
'''Where non-free media is required''' in a book, editors may request an administrator or [[Wikibooks:Uploaders|uploader]] to upload the file by making a request at [[Wikibooks:Files for upload|files for upload]].
{{clear}}
=Import and Merge=
''Use this section for imports that need to be "history-merged" with a module that has already been started using copy-paste.''
Add requests using the form: <pre>*[[Project:Page name]] → [[Target Page]] ~~~~</pre>
== Import request: Transwiki: Laplace Transform ==
Hello, I'd like to request to import
https://en.wikibooks.org/wiki/Transwiki:Laplace_transform
(part of the curriculum of Differential Equations) to the book [[Ordinary Differential Equations]].
Neither seem to me to be actively maintained.
I believe the import within the scope of this project since there the book is completely missing the Transwiki topic. [[User:DavidMDay|DavidMDay]] ([[User talk:DavidMDay|discuss]]) 20:20, 11 August 2026 (UTC)
:I'm a little confused: the page is already imported here and [[Ordinary Differential Equations/Laplace Transform]] already exists. Do you want someone to merge the histories or overwrite the existing page or something? ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 22:06, 11 August 2026 (UTC)
:: Pinging [[User:DavidMDay|DavidMDay]] to Koavf's response above. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 21:17, 31 August 2026 (UTC)
:Hi Justin, It's great to communicate with you. I am '''new''' to Wikipedia and almost surely more confused than you. My suggestion is to expand, but not revise, the book by appending the wiki page. I do find this to be a big improvement. I am guessing that orphan Wiki pages with long life spans are adopted by Wiki books that are missing the content.
:I did make a trivial change to the main page for the book. The revision is pending review. Did I do something wrong? I don't remember the details. If nothing is wrong, did I optionally request a review, or are reviews required?
:I do not know how revision history is archived at Wiki books. The text of the revision history of the page could be included in the commit message that appends it to the book, for example. I do not know the rules, much less the practices, at Wiki books. I worry more about things like figuring out how to leave a webpage that I have opened.
:Yes, the book does have a section of a chapter is on the topic of the Wiki page. The wiki page could be added after this section, instead of creating a new chapter. Or nothing will happen. In any case, thanks for responding and for your kind note, -- David [[User:DavidMDay|DavidMDay]] ([[User talk:DavidMDay|discuss]] • [[Special:Contributions/DavidMDay|contribs]]) 20:05, 9 September 2026 (UTC)
::{{Ping|DavidMDay}} No worries: I think the material that you wanted to be here is already here. If it's not, please let me know. ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 23:53, 9 September 2026 (UTC)
== Import [https://wikikids.nl/Sjabloon:WikiKids_Magazine_layout this page]→ [[User:TechVindicator/Wikibooks Magazine Layout]] ==
Hello, could the page be imported please? The page is licensed under the CC-BY-SA-3.0 license (see [https://wikikids.nl/Wikikids:Voorwaarden this]) It will be translated. Thank you. [[User:TechVindicator|TechVindicator]] ([[User talk:TechVindicator|discuss]] • [[Special:Contributions/TechVindicator|contribs]]) 07:21, 18 October 2026 (UTC)
ednk1egrcaw50sjmqt3g033mm5jkany
4676699
4676698
2026-10-18T07:22:52Z
TechVindicator
3626296
/* Import this page→ User:TechVindicator/Wikibooks Magazine Layout */
4676699
wikitext
text/x-wiki
{{User:MiszaBot/config
|archive = Wikibooks:Requests for import/Archives/%(year)d/%(monthname)s
|algo = old(31d)
|counter = 1
|minthreadstoarchive = 1
|minthreadsleft = 1
|key =
}}
__NEWSECTIONLINK__ {{Discussion Rooms}} {{shortcut|WB:RFI}} {{TOC left}}{{clear}}
=== Importing and import uploading ===
To preserve edit histories and observe the attribution requirements of the licenses, content from our sister projects should be '''imported''' rather than simply pasted into a new module.
* [[Wikibooks:Importers|Importers]] can import pages from any of the English-language projects, Simple English Wikibooks, Meta, and Wikispecies.
* [[Wikibooks:Administrators|Administrators]], and import uploaders, can import from any wiki (even non-WMF).
'''Requests to import''' can be made to help in making or expanding a book, and to move works from other projects that fit [[Wikibooks:What is Wikibooks|Wikibooks' scope]].
* Place requests below and an administrator or importer will try to perform the import promptly.
* Note that administrators and importers are not responsible for moving and cleaning up pages. Please watch this page for when the import is complete and take care of the imported page.
'''Administrators and importers:'''
* Please read [[Help:Importing]] first.
* To import a page, go to [[Special:Import]].
* Pages will by default import into <code>Transwiki:Page's name</code>, which can be moved to a new location.
* After import, add {{tl|dewikify}} to the page and make a note where the imported page has ended up.
* Pages with extremely long edit histories may fail to import. In this case, a single revision which gives attribution to the source wiki will be imported. While this isn't ideal, it should satisfy our [[WB:CC-BY-SA|licensing]]. Note that repeated attempts to import may eventually bring over the history, so if it fails on the first attempt, you might want to try it a few more times. Please see [[phab:17000|T17000]], and ask for it to be resolved sooner.
{{Warning|In some cases an import may partially fail and need to be repeated. If this happens, the revisions may be out of sequence in the history so you need to check the current revision is the one you want to use as the base for your book}}
=== Non-free media uploading ===
'''Where non-free media is required''' in a book, editors may request an administrator or [[Wikibooks:Uploaders|uploader]] to upload the file by making a request at [[Wikibooks:Files for upload|files for upload]].
{{clear}}
=Import and Merge=
''Use this section for imports that need to be "history-merged" with a module that has already been started using copy-paste.''
Add requests using the form: <pre>*[[Project:Page name]] → [[Target Page]] ~~~~</pre>
== Import request: Transwiki: Laplace Transform ==
Hello, I'd like to request to import
https://en.wikibooks.org/wiki/Transwiki:Laplace_transform
(part of the curriculum of Differential Equations) to the book [[Ordinary Differential Equations]].
Neither seem to me to be actively maintained.
I believe the import within the scope of this project since there the book is completely missing the Transwiki topic. [[User:DavidMDay|DavidMDay]] ([[User talk:DavidMDay|discuss]]) 20:20, 11 August 2026 (UTC)
:I'm a little confused: the page is already imported here and [[Ordinary Differential Equations/Laplace Transform]] already exists. Do you want someone to merge the histories or overwrite the existing page or something? ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 22:06, 11 August 2026 (UTC)
:: Pinging [[User:DavidMDay|DavidMDay]] to Koavf's response above. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 21:17, 31 August 2026 (UTC)
:Hi Justin, It's great to communicate with you. I am '''new''' to Wikipedia and almost surely more confused than you. My suggestion is to expand, but not revise, the book by appending the wiki page. I do find this to be a big improvement. I am guessing that orphan Wiki pages with long life spans are adopted by Wiki books that are missing the content.
:I did make a trivial change to the main page for the book. The revision is pending review. Did I do something wrong? I don't remember the details. If nothing is wrong, did I optionally request a review, or are reviews required?
:I do not know how revision history is archived at Wiki books. The text of the revision history of the page could be included in the commit message that appends it to the book, for example. I do not know the rules, much less the practices, at Wiki books. I worry more about things like figuring out how to leave a webpage that I have opened.
:Yes, the book does have a section of a chapter is on the topic of the Wiki page. The wiki page could be added after this section, instead of creating a new chapter. Or nothing will happen. In any case, thanks for responding and for your kind note, -- David [[User:DavidMDay|DavidMDay]] ([[User talk:DavidMDay|discuss]] • [[Special:Contributions/DavidMDay|contribs]]) 20:05, 9 September 2026 (UTC)
::{{Ping|DavidMDay}} No worries: I think the material that you wanted to be here is already here. If it's not, please let me know. ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 23:53, 9 September 2026 (UTC)
== Import [https://wikikids.nl/Sjabloon:WikiKids_Magazine_layout this page]→ [[User:TechVindicator/Wikibooks Magazine Layout]] ==
Hello, could the page be imported please? The page is licensed under the CC-BY-SA-3.0 license (see [https://wikikids.nl/Wikikids:Voorwaarden this]) It will be translated. Thank you. [[User:TechVindicator|TechVindicator]] ([[User talk:TechVindicator|discuss]] • [[Special:Contributions/TechVindicator|contribs]]) 07:21, 18 October 2026 (UTC)
:Note that the page will be a layout for a future Wikibooks Magazine, for news about Wikibooks. [[User:TechVindicator|TechVindicator]] ([[User talk:TechVindicator|discuss]] • [[Special:Contributions/TechVindicator|contribs]]) 07:22, 18 October 2026 (UTC)
0p9fp1glsx5mgqgbmtxhrfyix029g37
4676704
4676699
2026-10-18T08:11:00Z
ArchiverBot
1227662
Bot: Archiving 1 thread (older than 31 days) to [[Wikibooks:Requests for import/Archives/2026/September]]
4676704
wikitext
text/x-wiki
{{User:MiszaBot/config
|archive = Wikibooks:Requests for import/Archives/%(year)d/%(monthname)s
|algo = old(31d)
|counter = 1
|minthreadstoarchive = 1
|minthreadsleft = 1
|key =
}}
__NEWSECTIONLINK__ {{Discussion Rooms}} {{shortcut|WB:RFI}} {{TOC left}}{{clear}}
=== Importing and import uploading ===
To preserve edit histories and observe the attribution requirements of the licenses, content from our sister projects should be '''imported''' rather than simply pasted into a new module.
* [[Wikibooks:Importers|Importers]] can import pages from any of the English-language projects, Simple English Wikibooks, Meta, and Wikispecies.
* [[Wikibooks:Administrators|Administrators]], and import uploaders, can import from any wiki (even non-WMF).
'''Requests to import''' can be made to help in making or expanding a book, and to move works from other projects that fit [[Wikibooks:What is Wikibooks|Wikibooks' scope]].
* Place requests below and an administrator or importer will try to perform the import promptly.
* Note that administrators and importers are not responsible for moving and cleaning up pages. Please watch this page for when the import is complete and take care of the imported page.
'''Administrators and importers:'''
* Please read [[Help:Importing]] first.
* To import a page, go to [[Special:Import]].
* Pages will by default import into <code>Transwiki:Page's name</code>, which can be moved to a new location.
* After import, add {{tl|dewikify}} to the page and make a note where the imported page has ended up.
* Pages with extremely long edit histories may fail to import. In this case, a single revision which gives attribution to the source wiki will be imported. While this isn't ideal, it should satisfy our [[WB:CC-BY-SA|licensing]]. Note that repeated attempts to import may eventually bring over the history, so if it fails on the first attempt, you might want to try it a few more times. Please see [[phab:17000|T17000]], and ask for it to be resolved sooner.
{{Warning|In some cases an import may partially fail and need to be repeated. If this happens, the revisions may be out of sequence in the history so you need to check the current revision is the one you want to use as the base for your book}}
=== Non-free media uploading ===
'''Where non-free media is required''' in a book, editors may request an administrator or [[Wikibooks:Uploaders|uploader]] to upload the file by making a request at [[Wikibooks:Files for upload|files for upload]].
{{clear}}
=Import and Merge=
''Use this section for imports that need to be "history-merged" with a module that has already been started using copy-paste.''
Add requests using the form: <pre>*[[Project:Page name]] → [[Target Page]] ~~~~</pre>
== Import [https://wikikids.nl/Sjabloon:WikiKids_Magazine_layout this page]→ [[User:TechVindicator/Wikibooks Magazine Layout]] ==
Hello, could the page be imported please? The page is licensed under the CC-BY-SA-3.0 license (see [https://wikikids.nl/Wikikids:Voorwaarden this]) It will be translated. Thank you. [[User:TechVindicator|TechVindicator]] ([[User talk:TechVindicator|discuss]] • [[Special:Contributions/TechVindicator|contribs]]) 07:21, 18 October 2026 (UTC)
:Note that the page will be a layout for a future Wikibooks Magazine, for news about Wikibooks. [[User:TechVindicator|TechVindicator]] ([[User talk:TechVindicator|discuss]] • [[Special:Contributions/TechVindicator|contribs]]) 07:22, 18 October 2026 (UTC)
ohxr7vlr9zvx6twsfqq6ly0hpmf02hi
Talk:New Zealand History
1
141393
4676568
3327474
2026-10-17T18:24:47Z
~2026-55888-47
3628633
/* Concise New Zealand History */ Reply
4676568
wikitext
text/x-wiki
== Concise New Zealand History ==
I have decided to change the name of the book to a Concise New Zealand History. I have done this because I have found that enormous books, especially informational ones, can be intimidating to some readers and put them off reading the book. I would like this book to be an easy read. [[User:Helpfulstuffnz|Helpfulstuffnz]] 03:24, 2 December 2007 (UTC)
:yes i agree. [[Special:Contributions/~2026-55888-47|~2026-55888-47]] ([[User talk:~2026-55888-47|talk]]) 18:24, 17 October 2026 (UTC)
elrdxe8615zklapu0e7gkb3zp42h74e
4676572
4676568
2026-10-17T18:44:20Z
~2026-55705-00
3628636
/* Concise New Zealand History */ Reply good point
4676572
wikitext
text/x-wiki
== Concise New Zealand History ==
I have decided to change the name of the book to a Concise New Zealand History. I have done this because I have found that enormous books, especially informational ones, can be intimidating to some readers and put them off reading the book. I would like this book to be an easy read. [[User:Helpfulstuffnz|Helpfulstuffnz]] 03:24, 2 December 2007 (UTC)
:yes i agree. [[Special:Contributions/~2026-55888-47|~2026-55888-47]] ([[User talk:~2026-55888-47|talk]]) 18:24, 17 October 2026 (UTC)
:A good point made in 2007 [[Special:Contributions/~2026-55705-00|~2026-55705-00]] ([[User talk:~2026-55705-00|talk]]) 18:44, 17 October 2026 (UTC)
llaprsgxd5q1lwo745eslqzgud9sbm4
Solved Question Papers - IIT JEE/PhysicsSol1996
0
155713
4676576
4646348
2026-10-17T20:07:29Z
WereSpielChequers
248949
typo
4676576
wikitext
text/x-wiki
==Objectives==
===Cylindrical capacitor===
We might not have studied the structure of a cylindrical capacitor - that does not mean we can not solve this question!
So lets get started
Draw two concentric cylinders. For the electric field, we know we will use Gauss' law. The gaussian surface we choose is a cylinder of radius r (r = distance from the cente at which the field has to be found.)
Intg. E.dS = Qenc/Eo. We will not explain the simplifications on the LHS. However, simplifying it will tell you that the electric field is <span style="color: red;"><B>inversely proportional to r</b></span> and not r^2.
===Field lines through a conductor===
There are two things you need to know while solving this: -
* Electric field inside a conductor is zero. So field lines (direction of electric field) are not defined inside a conductor.
* Electric field near a conductor is perpendicular to its surface, because a conducting surface is equipotential.
This immediately gives us the answer to be <span style="color: red;"><B>D</b></span>.
Now we put forward some descriptive questions whose answers form a part of a normal High School Physics course.
* Why is the electric field inside a conductor always zero? (Answer relates to charge separation till equilibrium is attained between two forces. This is just a hint, the reader has to supply a CBSE styled i.e. explanatory answer.)
* Why is the electric field near an equipotent surface perpendicular to it? (Use the relation between voltage, electric field vector and displacement vector)
* The conductor was placed in an uniform electric field. Why is then the electric field not uniform now? What has caused the disturbance in it? Field lines terminate at the left surface and restart from the right surface. What does this tell you about the charge distribution on the <B>Neutral</B> Sphere?
===RMS Speed===
Purely formulae based. We dont need to provide a solution! The answer is B.
===Virtual Images===
Note first of all that the question must be speaking of only real objects. (u < 0 in standard convention)
Anyone who has drawn ray diagrams properly knows for sure that the answer is Concave lens and a Convex Mirror.
Infact, this is factual for most students. Hence, you might want to prove this using calculations. Go ahead! Do not hesitate here! Remember that whenever something is excessively imple, just pick the pen up and solve it. if you do not do it - you might not be able to reproduce those results when required.
For convex mirror - use the mirror equation to get V (image) in terms of u. Substitute V=(-X) and F=(+F) so that every term on the RHS becomes positive and can be analyzed. The magnification will always be positive u < 0 meaning that the image is virtual!
Similarly for a concave lens.
Answer is <span style="color: red;"><B>B,C</B></span>
===Holes===
Factual - p-type semiconductors
==On projectile motion==
===Introduction===
Collision in midair? Right. Have you ever encountered questions which, upon reading once, make you believe they are pretty difficult, but whose solution makes you slap your forehead? This is one of those typical problems. When you get down to it, there is absolutely no analysis involved! I emphasize through this example how simple questions can be made to look difficult by their presentation.
===Solution===
Shot A - The one which was launched at an angle.
Shot B - The one which was launched horizontally.
This is the first point which you need to think about. Which one of the two was launched first? Think about it, they have to collide. A has to cover the same horizontal displacement as B, but with a lesser horizontal velocity (why lesser horizontal velocity?). Its but obvious that A was launched first.
* If they collide, it just means that they are at the same position at the same instant of time. The two projectiles start from the same point, which means, in order to collide - their displacements must be same at a particular time instant.
For horizontal displacement, we have
[Hor. velocity of Particle 1] x [Time till collision] = [Hor. Vel. of particle 2] x [Time till collision]
* This is the best part about projectile motion! The horizontal motion of projectiles is uniform.
* All we have to do now is to substitute the values. Note that the time till collision for the two particles is not the same! If for the second particle it is T then for the first particle, it is T+t where t is the time interval between the firings.
Sx = xVA x (T+t) = xVB x (T)
This equation gives us T=t, after substituting the two velocities.
Sy = yVA x (T+t) - (0.5)(g)(T+t)^2 = yVB x (T) - (0.5)(g)(T)^2
Substituting T=t from the first equation and solving, we get <span style="color: red;"><B>t=1 second interval between the firings.</B></span>
For the second part, we require horizontal and vertical displacements. Go back to the above equations, plug in t=1/T=1. We get Sx = 5(3)^0.5 and Sy = -5 m
The displacemtent is the final-initial coordinate, so <span style="color: red;"><B>X = 5root3 m, Y = -5 + 10 = 5 m.</B></span> [Launched from (0,10), remember?]
==On adiabatic process==
===Introduction===
I just mentioned excessively simple problems in the projectile motion question above. Bless the heavens! This question on adiabatic expansion is a direct one! And direct means DIRECT! Pocket the 5 marks here - you'll have to work hard for them elsewhere.
===Final Temperature===
Use T1(V1)^(@-1) = T2(V2)^(@-1) where @ is the adiabatic exponent (gamma) of the gas, 5/3 in our case.
T2 = 300 K x (1/2)^(2/3) = <span style="color: red;"><B>189 K</B></span>
===Change in internal energy===
nCv(T2-T1) = -2767J. We will not tell you what n and cv are. Please forgive us.
===Work done by the gas===
We wont even tell you the answer over here! Use the first law to relate Q, Work done (IntegPdV) and DelE.
===Note===
Please note that P(V)^@ = Constant is valid only for a reversible adiabatic process. The question paper does not mention specifically that the process carried out is reversible adiabatic. If the process were irreversible with expansion carried out against constant external pressure = final pressure, use
* PV = NRT over initial and final stages
* P(V2-V1) [Integ.PdV] + nCv(T2-T1) = 0 [Q=0. If we are dealing with adiabatic process, how can we forget to use this equation?]
Also note that this is NOT a trick question! If the student had to consider irreversible processes as well, the JEE would have given MAJOR hints pointing towards that possibility. e.g., "Answer all possible cases" and such.
==Question 4 - Fraunhofer Diffraction Pattern==
DIRECT Question. Two marks not to be missed!
The angular width is 2Lamda/b where b is slit width (constant).
* If by changing the wavelength we decrease the width by 30%, it is evident from the equation that the wavelength was also reduced by 30%. Hence the answer to this part is 6000 x (70/100) = 4200 Angstorms.
That is, we used light of wavelength <span style="color: red;"><B>4200 Angstorms</b></span> the second time.
Now, even if the apparatus is immersed in some liquid (A hypothetical question), the answer will be judged by the change in wavelength of the 6000 A light in that medium.
It is clear that the light of wavelength 6000 A in air behaves as light of 4200 A wavelength.
* 4200 = (6000)/(Mu) giving <span style="color: red;"><B>Mu = 1.429</B></span>
==Question 4 - The Prism==
===Introduction===
This is the first question that we expect prepared students to mess up at the JEE. However, bear in mind that I'm saying this just because the question involves more calculation than the others. However, it is as simple as the others.
===Critical incidence at the hypotenuse===
We are told to find that angle of incidence on AB for which the ray hits the cemented interface at the critical angle. Now, some students may find this a bit intriguing, but frankly speaking - I do not have anything to chase away that vagueness.
Recall the geometrical construction you made for a prism to find R1 + R2.
Here, R2 = Sin-1 (n1/n). If you realize that the normals at the two points and the two faces form a cyclic quadrilateral, it won't take you much time to realize that R1 = 45 - R2
Now relate R1 and the angle of incidence using Snell's law.
Finally we get Sin-1(sinI/n) = 45 - Sin-1 (n1/n).
i.e. (Sini) = n/root2[root(1-(n1/n)^2) - (n1/n)]
Tha angle i obtained from here is the answer. That is, <span style="color: red;"><B>sin-1 [n/root2[root(1-(n1/n)^2) - (n1/n)]]</B></span></red>
===Angle of incidence for no deviatio
the hypotenuse, either the two refractive indices need to be same or the ray has to be incident normally on the hypotenuse.
In that case - R2 = 0. Giving R1 = 45. the angle of incidence can then be found using Snell's law.
Sini = (1.352)/(root 2), giving i = sin-1 0.956
==Wrapping up the first four questions==
Considering the calculations involved in the last Question 4, we do not expect everyone to do it in examination conditions without any silly mistake. Then, we can expect that majority of the prepared students would fetch 18-21 marks in this section, however scoring full 25 in the first four questions is not difficult as well. Its just that the proportion of such students would be less.
{{BookCat}}
kujw3f1txg9ldd8di1iy40cczb2q5ok
Scheme Programming/A taste of Scheme
0
180265
4676584
4376529
2026-10-18T02:48:03Z
Acrions
3509296
8 is being applied
4676584
wikitext
text/x-wiki
{{Navigation|Book=Scheme Programming|previous=Using a Scheme interpreter|current=A taste of Scheme|next=Scheme Datatypes}}
Now that we have an idea of how to run a Scheme interpreter, let's see
what we can do with it in some short examples. We won't consider these
programs in any depth. For now, the intention is to give the reader a
feel for Scheme.
A Scheme interpreter evaluates Scheme expressions typed by the user. With our
interpreter running, we first evaluate a very simple expression.
<syntaxhighlight lang="scheme">
> 4
4
</syntaxhighlight>
When we enter '4' and hit Enter, we are asking our Scheme interpreter
to evaluate the expression '4'. Unsurprisingly, 4 evaluates to 4.
Next, we try some basic arithmetic.
<syntaxhighlight lang="scheme">
> (+ 3 6)
9
> (* 18 5) ; multiplication
90
> (- 4 7)
-3
</syntaxhighlight>
These examples illustrate some important things about Scheme syntax.
First, the syntax is ''fully-parenthesized''; the parentheses in the
above expressions are required, and extra parentheses cannot be added
without changing the meaning of the expression. For example, the
following causes the interpreter to report an error:
<syntaxhighlight lang="scheme">
> ((+ 3 6))
;; Error: application of non-procedure 9
</syntaxhighlight>
Secondly, we see that Scheme uses ''prefix notation''. In each
expression, the ''operator'' (+, *, -) comes before the ''operands'' (the
numbers). This is unlike the usual ("infix") convention of
mathematical notation, in which the operator is written ''between'' the
operands. For example, the following isn't a valid Scheme expression:
<syntaxhighlight lang="scheme">
> (8 * 5 - 3)
;; Error: application of non-procedure 8
</syntaxhighlight>
It's easy to translate it into Scheme, however:
<syntaxhighlight lang="scheme">
> (- (* 8 5) 3)
37
</syntaxhighlight>
Notice that here we've used the expression <code>(* 8 5)</code> as an
operand of another expression! This is valid Scheme, and we will see
such nested expressions everywhere.
Scheme allows us to name values for use in other expressions:
<syntaxhighlight lang="scheme">
> (define x 20)
> x
20
> (define y (+ x 4))
> (* y 2)
48
</syntaxhighlight>
The ''definition'' <code>(define x 20)</code> causes the interpreter to
define <code>x</code> to mean the value <code>20</code>. When <code>x</code>
appears in code following the definition, it will be replaced by this
value. We can then use <code>x</code> in the definition of <code>y</code>.
We can also define ''procedures''. Like the built-in operators
<code>+</code>, <code>-</code>, etc., a procedure takes a certain number
of ''parameters'' (also known as ''arguments'') and computes a value.
<syntaxhighlight lang="scheme">
> (define (square x)
(* x x))
> (square 5)
25
</syntaxhighlight>
Here, we have defined <code>square</code> to mean a procedure taking one
parameter, <code>x</code>, and returning the value of <code>(* x x)</code>.
The form of this definition is a little different from those we saw
earlier; here, the name being defined appears in parentheses, followed
by the names of the procedure's parameters. To use this newly-defined
procedure, we evaluate <code>(square 5)</code>.
Here's a more complex procedure which calculates the area of a triangle
with sides <math>a</math>, <math>b</math>, and <math>c</math> using
[[w:Heron's formula|Heron's formula]]:
<syntaxhighlight lang="scheme">
> (define (heron a b c)
(let ((s (/ (+ a b c) 2)))
(sqrt (* s (- s a) (- s b) (- s c)))))
> (heron 4 13 15)
24
</syntaxhighlight>
In this procedure, we need to use the value <math>s</math>, defined by
:<math>s = \frac{a + b + c}{2}</math>,
four times. The definition of <code>heron</code> would be tedious to
write and hard to read if we were to use <code>(/ (+ a b c) 2)</code>
<ref>In previous examples we gave <code>+</code> two arguments. Here,
though, we've given it three. Is this correct? In general, Scheme will
report an error if we give a procedure too few or too many arguments.
<code>+</code>, though, is a ''variadic'' procedure, which means that it
can be passed any number of arguments. The expression <code>(+ a b c)</code>
is equivalent to <code>(+ (+ a b) c)</code>. <code>-</code>,
<code>*</code>, and <code>/</code> are also variadic.</ref>
for each occurrence of <math>s</math>. We solve this problem using the
<code>let</code> form, which allows us to temporarily associate the name
<code>s</code> with this value.<ref>If you're familiar with programming
languages with "local variables", you can think of names bound by
<code>let</code> as much the same thing.</ref>
We can compare values, or test them for certain properties.
<syntaxhighlight lang="scheme">
> (= 4 (+ 3 1))
#t
> (< 9 7)
#f
> (positive? 5)
#t
> (even? 5)
#f
</syntaxhighlight>
What are the <code>#t</code> and <code>#f</code> values which Scheme
gives us back here? As you may have guessed, these are ''boolean''
values representing "true" and "false", respectively.
''Predicates'' like <code>positive?</code> are procedures which take
one argument and return a boolean value. It's a Scheme convention to
give predicates names ending with '?'; hence we have <code>even?</code>,
<code>negative?</code>, and many others.
Procedures can be [[w:Recursive definition|recursive]]. Here's a classic
example.
<syntaxhighlight lang="scheme">
> (define (factorial n)
(if (= n 0)
1
(* n (factorial (- n 1)))))
> (factorial 5)
120
</syntaxhighlight>
Evaluating <code>(factorial 5)</code> gives us the value of <math>5!</math>,
that is, <math>5 \times 4 \times 3 \times 2 \times 1</math>, which we can
express recursively as <math>5 \times 4!</math>. More generally, we
say that factorial of <math>n</math> is 1 if <math>n</math> is zero, and
<math>n</math> times the factorial of <math>n - 1</math> otherwise. This
is precisely what the definition of <code>factorial</code> states in the
language of Scheme:
<syntaxhighlight lang="scheme">
(define (factorial n)
(if (= n 0) ; is the argument 0?
1 ; then the answer is 1
(* n (factorial (- n 1))))) ; otherwise, it's n * (n - 1)!
</syntaxhighlight>
Recursion is a critical notion in Scheme (and in computer science in
general) that we will discuss in greater depth in later sections.
Another new thing in the definition of <code>factorial</code> is the use of
the <code>if</code> form, which evaluates its first argument, then either its
second or third argument depending on whether the first was true or false.
If the first argument evaluates to true, then we get the second argument of
the <code>if</code> form; otherwise, we get the third.
<ref>For now, we'll assume that saying something is "true or false" means it's
a boolean--that is, either <code>#t</code> or <code>#f</code>. In
practice, every Scheme object has a boolean value; namely, <code>#f</code> is
false and everything else is true.</ref>
<syntaxhighlight lang="scheme">
> (if #t 1 0)
1
> (if (> 2 3) 1 0)
0
</syntaxhighlight>
{{Exercises|solutions=1|1=
# Why does evaluating <code>((+ 3 6))</code> cause Scheme to report the "application of a non-procedure"?
}}
{{BookCat}}
nlbts355lgec85vynokp8k3i2i2439o
Aros/Platforms/AROS USB support
0
202147
4676539
4676243
2026-10-17T15:07:12Z
R. Henrik Nilsson
3395618
Curent > Current
4676539
wikitext
text/x-wiki
{{ArosNav}}
==Host Adapter Protocol USB1 OHCI UHCI USB2 EHCI USB3.0 USB3.1 xHCI ==
Please let us know any mistakes or any information to be added, use Prefs/Trident to confirm Vendor and Product IDs
Please chat at [https://www.arosworld.org/index.php AROS World]
*1996 USB1.0
*1998 USB1.1
*2000 USB2.0
*2008 USB3.0
*2013 USB3.1
*2017 USB3.2
AROS has these USB transfers
*Control -
*Bulk - Midi 1.0 ( 'send my data when you can' )
*Interrupt - Midi 2.0
*Isochronous - USBAudio, Webcams, etc
Isochronous is the starting point of modern types of multimedia creativity. IsoChronous isoc code is already in place in poseidon.library and '''scheduled''' transfers are queued to be later rerouted in the host driver code (needs to be written for each host protocol e.g. OCHI, UCHI, EHCI and [https://cdrdv2-public.intel.com/625472/625472_xHCI_Rev1_2b.pdf#:~:text=Page%203.%20Document%20Number:%20625472%2C%20Revision:%201.2b.%203. XHCI rev1.2], [https://www.intel.com/content/www/us/en/content-details/868296/extensible-host-controller-interface-for-universal-serial-bus-xhci-requirements-specification-r2-0.html rev2], etc). There seems to be 2 types of isoc transfers, one is just the normal isoc transfer and the other is realtime implementation of isoc transfer.
For isoc transfer there needs to be a scheduler that makes sure no isoc transfers are dropped (in or out) and that they happen at the right time. It all gets difficult as the device making use of the isoc transfer may be at any point on the device tree. One needs to calculate the USB bandwidth for the packet based periodic transfers that are initiated by the host which have fixed but guaranteed bandwidth. Host controllers guarantee this bandwidth by planning a schedule of transfers ahead of time to ensure there is enough time reserved on the bus.
[https://www.intel.co.uk/content/www/uk/en/products/docs/io/universal-serial-bus/ehci-specification.html EHCI] [https://www.thegoodpenguin.co.uk/blog/understanding-why-usb-isochronous-bandwidth-errors-occur/ bus-bandwidth] vs payload-bandwidth and the algorithm of the EHCI scheduler.
The bandwidth of the endpoint in terms of payload data (stuff we put in a packet) and the protocol overhead, signalling imposed bit stuffing, host delays etc.
Poseidon controls the driver and device tree and it provides an API to communicate with the USB devices. Poseidon really doesn't care much about what sort of transfer pipe is opened or used, it only provides the means to do so and forwards the iorequests to the correct driver. Poseidon code is the higher level code for USB communication and drivers are of course the lower level one.
[[File:Psd.svg|220px|right]]
; Best Hardware - NEC Chipset (OHCI + EHCI), Intel Chipset (UHCI + EHCI), XHCI USB3.0, USB3.1 & gen 2 Type-A Type-B Type-C
; Next Best Set - General OHCI, SIS (OHCI + EHCI),
; Buggy Chipset - [ Early AMD OHCI], ALi OHCI, VIA UHCI, Nvidia OHCI & EHCI,
=== USB1.1 ===
OHCI USB 1.1 - USB-IF sanctioned standard but hardware physical form removed with USB2.0 and replaced with virtual emulation of USB1
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="5%" |Product ID
! width="5%" |Revision
! width="10%" |Boot from USB
! width="10%" |Detect USB device
! width="10%" |USB device works
! width="30%" |Opinion
|-
| ALi Agere M5273 A1 M5237 Lucent USS-312
|
|
|
| <!--Boots-->{{Maybe}}
| <!--Detects-->{{Yes}}
| <!--Works-->{{Maybe|}}
| StarTech PCI425USB, CompUSA Iogear GIC220U-b, Nvidia 220 mobo, USBA2041P, ALi SU2A-PS,
|-
| AMD 756 Chipset (onboard motherboard)
| 0x1022
| 0x740c
| 0x06
| <!--Boots-->{{No}}
| <!--Detects-->{{No}}
| <!--Works-->{{Maybe|}}
| no [http://aros-exec.org/modules/newbb/viewtopic.php?post_id=31308#forumpost31308 usb devices detected] Geode GX1,
|-
| CMD DU-A2 Silicon Image 0670 (pci AMD chipset)
| 0x1095
| 0x0670
| 0x06
| <!--Boots-->{{No}}
| <!--Detects-->{{No}}
| <!--Works-->{{Maybe|}}
|
|-
| Silicon Image 0673 (pci AMD chipset)
| 0x1095
| 0x0673
| 0x06
| <!--Boots-->{{No}}
| <!--Detects-->{{No}}
| <!--Works-->{{Maybe|}}
|
|-
| Nvidia Nforce2 USB
| 0x10de
|
|
| <!--Boots-->{{Maybe|Bios options vary but does with Plop Boot}}
| <!--Detects-->{{Yes}}
| <!--Works-->{{Maybe|}}
| Tested with 20th Aug 2012 improvement
|-
| NEC µPD720100AGM
| 0x1033
| 0x0035
| 0x
| <!--Boots-->{{Unk}}
| <!--Detects-->{{Unk}}
| <!--Works-->{{Maybe|}}
| untested - Amiga Spider card with possible bottleneck issues at higher speeds
|-
| NEC µPD720101AGM 720101GJ
| 0x1033
| 0x0035
| 0x43
| <!--Boots-->{{Yes}}
| <!--Detects-->{{Yes}}
| <!--Works-->{{Maybe|}}
| Mac mini, Belkin F5U219vea (2+1 ports), Belkin F5U220vea1 (4+1 ports), Adaptec 3100LP, BAFO BF-460, GWC UC-160, IOGear GIC250U, Keyspan U2PCI-5, O'toLink U2-C2B U2-C2A U2-P20N U2-P50, Ratoc PCIU5, USBWholesale UII-PCIP
|-
| NEC µPD720102
| 0x1033
| 0x00
| 0x
| <!--Boots-->{{Unk|untested }}
| <!--Detects-->{{Unk|untested }}
| <!--Works-->{{Maybe|}}
|
|-
| Opti 82C861 2-port
| 0x1045
| 0xc861
|
| <!--Boots-->{{No}}
| <!--Detects-->{{No}}
| <!--Works-->{{Maybe|}}
| no USB devices detected - Belkin F5U005,
|-
| SIS 7001 OCHI
| 0x1039
| 0x7001
| 0x0f
| <!--Boots-->{{No}}
| <!--Detects-->{{Yes}}
| <!--Works-->{{Maybe|}}
| 20th Aug 2012 - not booting stalls on GRUB word with Plop Boot
|-
|}
UHCI USB 1.1 - Intel standard but since 2009 no hardware support as USB2 introduced virtual emulation of USB1
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="5%" |Product ID
! width="5%" |Revision
! width="10%" |Boot from USB
! width="10%" |Detect USB device
! width="10%" |USB device works
! width="30%" |Opinion
|-
| Intel
| 0x8086
| 0x
| 0x01
| <!--Boots-->{{No|not in bios use AROS floppy disc boot}}
| <!--Detects-->{{Maybe|}}
| <!--Works-->{{Maybe|}}
|
|-
| Intel 82371AB EB MB PIIX4
| 0x8086
| 0x7112
| 0x01
| <!--Boots-->{{No|none in bios use other booting options}}
| <!--Detects-->{{Maybe|Detects most devices}}
| <!--Works-->{{Maybe|most devices but not RTL8187b WG111v3 blue led not on and does not work}}
|
|-
| Intel 82801DB/DBL/DBM (onboard i830 mbd)
| 0x8086
| 0x24c4
| 0x01
| <!--Boots-->{{Yes|but not from bios but floppy options}}
| <!--Detects-->{{Yes|}}
| <!--Works-->{{Yes|}}
| RTL8187b WG111v3 blue led on and although device has software failure and recoverable error IT STILL WORKS. Fresh start sometimes needs Network Prefs Saved to work.
|-
| VIA MVP4 (onboard mbd)
| 0x1106
| 0x30
| 0x40
| <!--Boots-->{{No}}
| <!--Detects-->{{Maybe|most devices}}
| <!--Works-->{{Maybe|most devices but not wireless options}}
| RTL8187b WG111v3 detected but blue led not on and does not work
|-
| VIA VT82xx (onboard mbd)
| 0x1106
| 0x3038
| 0x40
| <!--Boots-->{{No}}
| <!--Detects-->{{Maybe|most devices}}
| <!--Works-->{{Maybe|most devices but not wireless usb}}
| RTL8187b WG111v3 blue led on but does not work
|-
| VIA VT6202 (VIA VT83C572)
| 0x1106
| 0x3038
|
| <!--Boots-->{{No}}
| <!--Detects-->{{Maybe|}}
| <!--Works-->{{Maybe|}}
| A-Best USB-200, Cables N Mor USBPCI, CompUSA, D-Link DSB500, Digital/Research DRUSBCARD, Kouwell IOFlex 580, StarMount USB VIA,
|-
| VIA VT6112
|
|
|
| <!--Boots-->{{No}}
| <!--Detects-->{{Maybe|}}
| <!--Works-->{{Maybe|}}
|
|-
| VIA VT6212 (pci card)
| 0x1106
| 0x3038
| 0x61
| <!--Boots-->{{No}}
| <!--Detects-->{{Maybe|}}
| <!--Works-->{{Maybe|}}
| 2011 seems to have issues with other identical via based USB controller(s) present
|-
| VIA VT6214L
|
|
|
| <!--Boots-->{{No}}
| <!--Detects-->{{Maybe|}}
| <!--Works-->{{Maybe|}}
|
|-
|}
=== USB 2.0 EHCI ===
The USB-IF insisted on only one implementation of EHCI but it creates 4 virtual hcd to cover USB1.1 support. The virtual HCD on Intel and VIA EHCI controllers are UHCI. All other vendors use virtual OHCI controllers. Hardware EHCI USB2.0 ended in most chipsets in 2014/5 and is now virtual through most newer USB3.0 chipsets
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="5%" |Product ID
! width="5%" |Revision
! width="10%" |Boot from USB
! width="10%" |Detect USB device
! width="10%" |USB device works
! width="30%" |Opinion
|-
| ALi Agere M5273 A1 Lucent USS-344
|
|
|
| <!--Boots-->
| <!--Detects-->
| <!--Works-->{{Maybe|}}
| {{N/A|untested}} belkin F5U006,
|-
| Nvidia Nforce2 USB
|
|
|
| <!--Boots-->{{No}}
| <!--Detects-->{{Yes}}
| <!--Works-->{{Maybe|}}
|
|-
| Intel 82801DB/DBM (onboard mbd)
| 0x8086
| 0x24cd
| 0x01
| <!--Boots-->{{Yes}}
| <!--Detects-->{{Yes}}
| <!--Works-->{{Maybe|}}
|
|-
| NEC µPD720100AGM
| 0x1033
| 0x00E0
| 0x
| <!--Boots-->
| <!--Detects-->
| <!--Works-->{{Maybe|}}
| {{N/A|untested - Amiga Spider card}}
|-
| NEC 72101 GJ
| 0x1033
| 0x00e0
| 0x04
| <!--Boots-->{{Yes}}
| <!--Detects-->{{Yes}}
| <!--Works-->{{Maybe|}}
| Belkin F5U219 VEA1 (pci),
|-
| SIS ECHI
| 0x1039
| 0x7002
| 0x00
| <!--Boots-->{{No}}
| <!--Detects-->{{Maybe|issues about which port is used if it works at all}}
| <!--Works-->{{Maybe|}}
|
|-
| VIA VT6202
| 0x1106
| 0x3104
|
| <!--Boots-->{{No}}
| <!--Detects-->{{Yes}}
| <!--Works-->{{Maybe|}}
|
|-
| VIA VT6212 (pci card)
| 0x1106
| 0x3104
| 0x62
| <!--Boots-->{{No}}
| <!--Detects-->{{Yes|detects}}
| <!--Works-->{{Maybe|}}
|
|-
|}
=== USB 3.x SuperSpeed SS (Speed 5Gbit/s 3.1 gen 1) aka xHCI eXtensible ===
USB Attached SCSI (UAS or UASP) is a protocol used for high-speed data transfer between computers and external storage devices like SSDs, HDDs, and some flash drives. It provides up to 70% faster read/write speeds than traditional Bulk-Only Transport (BOT) by allowing multiple commands to run in parallel, rather than waiting in a queue
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="5%" |Product ID
! width="5%" |Revision
! width="10%" |Boot from USB
! width="10%" |Detect USB device
! width="10%" |USB device works
! width="30%" |Opinion
|-
| <!--Description-->AMD
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Boots-->{{unk| }}
| <!--Detects-->{{unk|}}
| <!--Works-->{{unk|}}
| <!--Opinion-->
|-
| <!--Description-->AMD
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Boots-->{{unk| }}
| <!--Detects-->{{unk|}}
| <!--Works-->{{unk|}}
| <!--Opinion-->
|-
| <!--Description-->AMD
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Boots-->{{unk| }}
| <!--Detects-->{{unk|}}
| <!--Works-->{{unk|}}
| <!--Opinion-->
|-
| <!--Description-->Fresco Logic FL1000 FL 1000
| <!--Vendor ID-->0x1B73
| <!--Product ID-->0x1000
| <!--Revision-->
| <!--Boots-->{{unk| }}
| <!--Detects-->{{unk|}}
| <!--Works-->{{unk|}}
| <!--Opinion-->link power management (LPM, USB 3.0 power saving) cannot be disabled so random connection issues
|-
| <!--Description-->Fresco Logic FL1009-200 FL 1009
| <!--Vendor ID-->
| <!--Product ID-->0x1009
| <!--Revision-->
| <!--Boots-->{{unk| }}
| <!--Detects-->{{unk|}}
| <!--Works-->{{unk|}}
| <!--Opinion-->Orico PFU3-2P
|-
| <!--Description-->Fresco Logic FL1100-100 FL 1100SX
| <!--Vendor ID-->
| <!--Product ID-->0x1100
| <!--Revision-->
| <!--Boots-->{{unk| }}
| <!--Detects-->{{unk|}}
| <!--Works-->{{unk|}}
| <!--Opinion-->LPM cannot be disabled so issues with disconnecting WD drives etc - CalDigit, ORICO PFU3-2P, FASTA-6GU3 Pro, inatech KTU3FR-2P 2 port USB 3.0, and Inateck KT4004 (KTU3FR-4PA rev B2) for storage and hubs, etc
|-
| <!--Description-->Fresco Logic FL1400 FL 1400
| <!--Vendor ID-->
| <!--Product ID-->0x1400
| <!--Revision-->
| <!--Boots-->{{unk| }}
| <!--Detects-->{{unk|}}
| <!--Works-->{{unk|}}
| <!--Opinion-->
|-
| <!--Description-->Fresco Logic
| <!--Vendor ID-->
| <!--Product ID-->0x
| <!--Revision-->
| <!--Boots-->{{unk| }}
| <!--Detects-->{{unk|}}
| <!--Works-->{{unk|}}
| <!--Opinion-->
|-
| <!--Description-->NEC Renesas xHCI µPD720200 uPD720200a chip
| <!--Vendor ID-->0x1d6b
| <!--Product ID-->0x0194
| <!--Revision-->
| <!--Boots-->{{unk| }}
| <!--Detects-->{{unk|}}
| <!--Works-->{{Maybe|no USB3 but seems to works like USB2}}
| <!--Opinion-->recognized but not supported for USB3 but works like USB2 - ORICO PRU3-4P 4 Port USB, early Dell Wyse zx0 thin client,
|-
| <!--Description-->NEC Renesas xHCI µPD720201 uPD720201 chip
| <!--Vendor ID-->
| <!--Product ID-->0x114 0x0115
| <!--Revision-->
| <!--Boots-->{{unk| }}
| <!--Detects-->{{unk|}}
| <!--Works-->{{unk|}}
| <!--Opinion-->recognized but not supported
|-
| <!--Description-->NEC Renesas xHCI µPD720202 uPD720202 chip
| <!--Vendor ID-->0x1912
| <!--Product ID-->0x0015
| <!--Revision-->
| <!--Boots-->{{unk| }}
| <!--Detects-->{{unk|}}
| <!--Works-->{{unk|}}
| <!--Opinion-->recognized but not supported
|-
| <!--Description-->[http://www.ti.com/product/tusb7340 TI] tusb7340 TUSB732
| <!--Vendor ID-->
| <!--Product ID-->0x8241
| <!--Revision-->
| <!--Boots-->{{unk| }}
| <!--Detects-->{{unk|}}
| <!--Works-->{{unk|}}
| <!--Opinion-->recognized but not supported Koutech IO-PEU436 but only one with open docs
|-
| <!--Description-->Intel xHCI
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Boots-->{{unk| }}
| <!--Detects-->{{unk|}}
| <!--Works-->{{unk|}}
| <!--Opinion-->recognized but not supported - integrated since Ivybridge
|-
| <!--Description-->Intel xHCI
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Boots-->{{unk| }}
| <!--Detects-->{{unk|}}
| <!--Works-->{{unk|}}
| <!--Opinion-->
|-
| <!--Description-->Marvell
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Boots-->{{unk| }}
| <!--Detects-->{{unk|}}
| <!--Works-->{{unk|}}
| <!--Opinion-->
|-
| <!--Description-->Via Labs VL800 xHCI 0.96 support in VL800, VIA VL811
| <!--Vendor ID-->
| <!--Product ID-->0x3432 0x3438 0x3515 and 0x9201
| <!--Revision-->
| <!--Boots-->{{unk| }}
| <!--Detects-->{{unk|}}
| <!--Works-->{{Maybe|}} 2.0 backwards support
| <!--Opinion-->Anker 68UPPCIE-2S20PU 2 port, Plugable 4-Port, GA-z77x-ud5h rev. 1.1 mobo,
|-
| <!--Description-->Via Labs VL811+
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Boots-->{{unk| }}
| <!--Detects-->{{unk|}}
| <!--Works-->{{unk|}}
| <!--Opinion-->
|-
| <!--Description-->Via Labs VL812
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Boots-->{{unk| }}
| <!--Detects-->{{unk|}}
| <!--Works-->{{unk|}}
| <!--Opinion-->
|-
| <!--Description-->xHCI 1.0 support in VL805
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Boots-->{{unk| }}
| <!--Detects-->{{unk|}}
| <!--Works-->{{unk|}}
| <!--Opinion-->
|-
|}
USB 3.1 (power up to 100W and data 10Gbit/s USB 3.2 gen 2 - USB-A Full size plug - USB-B micro USB size - USB-C reversible)
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="5%" |Product ID
! width="5%" |Revision
! width="10%" |Boot from USB
! width="10%" |Detect USB device
! width="10%" |USB device works
! width="30%" |Opinion
|-
| <!--Description-->Asmedia ASM1142
| <!--Vendor ID-->0x1B21
| <!--Product ID-->
| <!--Revision-->
| <!--Boots-->{{N/A}}
| <!--Detects-->{{N/A|}}
| <!--Works-->{{No| }}
| <!--Opinion-->Connector: USB Type C and USB Type A x 1 - Ugreen USB C PCI Card 2 Port USB 3.1 Type C
|-
| <!--Description-->Marvell
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Boots-->{{N/A}}
| <!--Detects-->{{N/A|}}
| <!--Works-->{{No| }}
| <!--Opinion-->
|-
| <!--Description-->AMD
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Boots-->{{N/A}}
| <!--Detects-->{{N/A|}}
| <!--Works-->{{No| }}
| <!--Opinion-->
|-
| <!--Description-->Intel
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Boots-->{{N/A}}
| <!--Detects-->{{N/A|}}
| <!--Works-->{{No| }}
| <!--Opinion-->
|-
| <!--Description-->Intel xHCI
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Boots-->{{unk| }}
| <!--Detects-->{{unk|}}
| <!--Works-->{{unk|}}
| <!--Opinion-->
|-
| <!--Description-->[ Intel] Revision 1.8 1.9 Updated
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Boots-->{{unk| }}
| <!--Detects-->{{unk|}}
| <!--Works-->{{unk|}}
| <!--Opinion-->
|-
| <!--Description-->VLI
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Boots-->{{N/A}}
| <!--Detects-->{{N/A|}}
| <!--Works-->{{N/A|}}
| <!--Opinion-->AUKEY 4 Ports USB C ,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Boots-->{{N/A}}
| <!--Detects-->{{N/A|}}
| <!--Works-->{{N/A|}}
| <!--Opinion-->Startech - PEXUSB312C - 2-port Usb 3.1 10Gbit/s
|-
|}
USB 3.2 (power up to 100W and data 20Gbit/s gen 2x2 - USB-A Full size plug - USB-B micro USB size - USB-C reversible)
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="5%" |Product ID
! width="5%" |Revision
! width="10%" |Boot from USB
! width="10%" |Detect USB device
! width="10%" |USB device works
! width="30%" |Opinion
|-
| <!--Description-->Marvell
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Boots-->{{N/A}}
| <!--Detects-->{{N/A|}}
| <!--Works-->{{No| }}
| <!--Opinion-->
|-
| <!--Description-->AMD
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Boots-->{{N/A}}
| <!--Detects-->{{N/A|}}
| <!--Works-->{{No| }}
| <!--Opinion-->
|-
| <!--Description-->Intel
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Boots-->{{N/A}}
| <!--Detects-->{{N/A|}}
| <!--Works-->{{No| }}
| <!--Opinion-->
|-
| <!--Description-->Intel xHCI
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Boots-->{{unk| }}
| <!--Detects-->{{unk|}}
| <!--Works-->{{unk|}}
| <!--Opinion-->
|-
| <!--Description-->[ Intel] Revision 2.6 Update
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Boots-->{{unk| }}
| <!--Detects-->{{unk|}}
| <!--Works-->{{unk|}}
| <!--Opinion-->
|-
| <!--Description-->VLI
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Boots-->{{N/A}}
| <!--Detects-->{{N/A|}}
| <!--Works-->{{N/A|}}
| <!--Opinion-->
|-
|}
=== USB 4 (40Gbps thunderbolt, pcie 3.0 tunnelling, ) ===
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="5%" |Product ID
! width="5%" |Revision
! width="10%" |Boot from USB
! width="10%" |Detect USB device
! width="10%" |USB device works
! width="30%" |Opinion
|-
| <!--Description-->Marvell
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Boots-->{{N/A}}
| <!--Detects-->{{N/A|}}
| <!--Works-->{{No| }}
|
|-
| <!--Description-->AMD Ryzen7 6800U
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Boots-->{{N/A}}
| <!--Detects-->{{N/A|}}
| <!--Works-->{{No| }}
|
|-
| <!--Description-->Intel Goshen Ridge JHL8440 Controller
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Boots-->{{N/A}}
| <!--Detects-->{{N/A|}}
| <!--Works-->{{No| }}
|
|-
| <!--Description-->VLI
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Boots-->{{N/A}}
| <!--Detects-->{{N/A|}}
| <!--Works-->{{N/A|}}
|
|-
|}
== hid.class (Human Interface Device) ==
=== Keyboard ===
Some multi-finger touchpad support works but not on all touchpads
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->8BitDo Retro N C64 edition Keyboard, the super button accessory and optional N30 mouse
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 87 keys Kailh white}}
|-
| <!--Description-->8bitdo 108 Retro Mechanical Keyboard (white kailh) and two superbuttons (green)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| Apple Pro Keyboard
| 0x05ac
| 0x0205
| 0x0122
| {{yes|works (its two hub ports) but mouse scroll wheel issues}}
|-
| Apple Pro Keyboard
| 0x05AC
| 0x020B
|
| {{yes|works (two onboard ports also)}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Aigo K68 60% red switches, A68 A87 wireless 2G
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->[http://amigakit.leamancomputing.com/catalog/product_info.php?cPath=49&products_id=973 AmigaOne Keyboard]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{yes|works}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Akko TAC87
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| 80% TKL }}
|-
| <!--Description-->Akko MonsGeek FUN60 PRO&MAX HE
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| 60% hall effect }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Akko
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2025 hall effect, good but expensive and software poor}}
|-
| <!--Description-->Akko
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2026 magnetic hall effect software should be better and surpasses mechanical}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Arteck HW197
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2026 keyboard and touchpad combo, aluminum frame, aa battery }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Azio Cascade
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2022 }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Chilkey ND75
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2024 good 75% expensive}}
|-
| <!--Description-->Chilkey ND104 (Wuque Studios)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 premium clicky (WS Blue) or silent (WS White) key options with Ansi and ISO formats also numpad and calculator, aluminum machined, tri mode, }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2026 untested magnetic hall effect software should be better and surpasses mechanical}}
|-
| <!--Description-->Corsair K65 Mech MX no numeric keypad
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Corsair CH-9000045 K70 Blue MX
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Corsair K90
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Corsair K95
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Corsair K
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Cherry G80 G80-3000L[x]C[yy]-[z]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Cooler Master CM Storm Quickfire Rapid
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Corsair K100 Air
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->2025 okay low profile but expensive
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2027 magnetic hall effect software should be better and surpasses mechanical}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->Dell SK-8135 Dell USB Keyboard for Internet and Multimedia rev H for Dimension 4500, Dimension 8250, OptiPlex GX260n, OptiPlex GX60n, Precision 350 (R42232)
| <!--Vendor ID-->0x413C
| <!--Product ID-->0x2010
| <!--Revision-->0200
| <!--Opinion-->{{Yes| usb1.1 keyboard hub 0x413C 0x1003 works as well - multimedia keys not mapped }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Deepcool KG722
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 65% }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Ducky Channel Zero DK2108 Mech Mechanical Cherry MX Red
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Ducky Shine 3 Brown or Blue (DK9087) MX keys
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Das Keyboard Model S Ultimate
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Epomaker Cidoo V75 Pro
| <!--Vendor ID-->0x3151
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2023 untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->epomaker rt100
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2024 plastic build and no screws, numpad with small 0, mostly quiet seasalt switches, gimmick usb-c 1in screen}}
|-
| <!--Description-->EPOMAKER TH99
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }} USB-C full numpad keyboard
|-
| <!--Description-->eopmaker P75
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| expensive but good}}
|-
| <!--Description-->eopmaker p87
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| expensive but good}}
|-
| <!--Description-->epomaker x Leobog Hi75
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2024 }}
|-
| <!--Description-->epomaker x Feker Galaxy80
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2024 }}
|-
| <!--Description-->epomaker x Galaxy100 gmk/via
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2024 good 96% }}
|-
| <!--Description-->epomaker Aula F75
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2024 budget version good 75% choice of 4 leobog switches}}
|-
| <!--Description-->eopmaker Tide75
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2024 good 75% and not too expensive}}
|-
| <!--Description-->Epomaker Ajazz AK992
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2023 109 key }}
|-
| <!--Description-->Epomaker Ajazz AK820 Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2024 }}
|-
| <!--Description-->Epomaker Ajazz AK35I V3 MAX
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 104 keys - two models: wired and tri-mode connection - }}
|-
| <!--Description-->epomaker Aula F108 PRO
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 pricy but okay 100% but only leobog graywood switches but hotswap available afterwards}}
|-
| <!--Description-->eopmaker Ajazz AK980
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 97 keys }}
|-
| <!--Description-->Epomaker G87
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 }}
|-
| <!--Description-->Epomaker RT82 RT85
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 }}
|-
| <!--Description-->Epomaker RT100 Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 96% }}
|-
| <!--Description-->epomaker x Galaxy100 lite
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 good 96% }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->ATTACK SHARK X98
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 98% maybe silent linear feel with Two-color PBT keycap}}
|-
| <!--Description-->Epomaker ATTACK SHARK X68HE and X65HE 65% Wired Gaming Keyboard
| <!--Vendor ID-->0x3151
| <!--Product ID-->0x502D
| <!--Revision-->
| <!--Opinion-->{{yes|2025 tested on Aros running on Raspberry Pi wired usb-c with magnetic hall effect keys}}
|-
| <!--Description-->Epomaker
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2027 magnetic hall effect software should be better and surpasses mechanical}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Filco Ninja Majestouch-2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Focus FK-760 Wireless Keyboard & Trackball
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| {{yes|works}} but quality build issues raised
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2027 magnetic hall effect software should be better and surpasses mechanical}}
|-
| <!--Description-->GMMK Tenkeyless
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested default Gateron Brown switches for Kailh Box Jades default Gateron Brown switches for Kailh Box Jades}}
|-
| <!--Description-->GK61
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2023 untested }}
|-
| <!--Description-->GMK67 GMK87
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested budget good option}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2027 magnetic hall effect software should be better and surpasses mechanical}}
|-
| <!--Description-->Hengchangtong HCT Limeme gk103s Entry Keyboard
| <!--Vendor ID-->0xC0F4
| <!--Product ID-->0x0009
| <!--Revision-->0100
| <!--Opinion-->{{yes|half Keyboard left side only}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2027 magnetic hall effect software should be better and surpasses mechanical}}
|-
| <!--Description-->Hexgears M2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2024 untested hotswap kaihl green switches}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Hexgears
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Iqunix mq80
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->2025 good 75% low profile keys
|-
| <!--Description-->Iqunix Magi65
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested good 65% low profile keys }}
|-
| <!--Description-->iqunix ez60 ez80
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2025 untested specific hall effect switches - actuation point, rapid trigger, etc }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2027 magnetic hall effect software should be better and surpasses mechanical}}
|-
| <!--Description-->Jomaa YiChip Wireless 50% key with touchpad
| <!--Vendor ID-->0x3151
| <!--Product ID-->0x3000
| <!--Revision-->
| <!--Opinion-->{{No|dongle detected, keys and pad not working - 2 AAA NM}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2027 magnetic hall effect software should be better and surpasses mechanical}}
|-
| <!--Description-->Keychron q0
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2022 untested numpad only}}
|-
| <!--Description-->Keychron q1 v1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2022 untested okay}}
|-
| <!--Description-->Keychron Q6 Max
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2023 untested 75% with numeric numpad, barebones so choose switches and keycaps to suit }}
|-
| <!--Description-->Keychron q1 MAX V1 MAX
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2023 untested }}
|-
| <!--Description-->Keychron Lemokey P1 QMK
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested best option to customise switches and keycaps}}
|-
| <!--Description-->Keychron LemoKey X1 X3
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2024 untested keycap swap only not switches}}
|-
| <!--Description-->Keychron K2HE
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested okay}} wireless hall effect analogue on all keys
|-
| <!--Description-->Keychron K4HE
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2025 untested hall effect but software }}
|-
| <!--Description-->Keychron K5 K17
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 untested okay low profile but }}
|-
| <!--Description-->Keychron Q5
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 }}
|-
| <!--Description-->Keychron K10 HE
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2027 magnetic hall effect software should be better and surpasses mechanical}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2024 }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2024 }}
|-
| <!--Description-->Kiiboom Breeze 75
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2025 good 75% }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2025 }}
|-
| <!--Description-->Meletrix Boog 75
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2024 magnetic hall effect, good but expensive and software poor}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2025 }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2025 }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2027 magnetic hall effect software should be better and surpasses mechanical}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2025 }}
|-
| <!--Description-->Melgeek O2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2025 low profile 75% but not repairable}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2027 magnetic hall effect software should be better and surpasses mechanical}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2025 }}
|-
| <!--Description-->MOSART 2.4G Wireless 60% Keyboard Trackball
| <!--Vendor ID-->0x062a
| <!--Product ID-->0x4105
| <!--Revision-->
| <!--Opinion-->{{Yes|dongle recognised HID, keys worked, roller worked, scroll wheel works and shoulders works but buttons around left, top and right hand side (RHS) do not work and plastic and 2 AA MN1500}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Mucai SiGma Micro MKA610
| <!--Vendor ID-->0x1c4f
| <!--Product ID-->0x0084
| <!--Revision-->
| <!--Opinion-->{{No| unknown red keys - rgb backlighting - }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->[http://hjldemo.clsc.cn/ Guangzhou Zhentian Electronics Ltd] Perixx Periboard 505 Plus with Trackball
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{Yes|okay dome keyboard - poor trackball}}
|-
| <!--Description-->Guangzhou Zhentian Electronics Co., Ltd Perixx Periboard 706 Plus with Trackball Wireless
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{Yes|generally okay dome with good sized keys but piano black surround fingerprint magnet, occasional brief trackball freezes after no use, takes some time to get used to the trackball size}}
|-
| <!--Description-->Perixx Periboard-716 Wireless (Chicony)
| <!--Vendor ID-->04f2:1013
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{Yes|okay dome keyboard and trackpad}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested}}
|-
| <!--Description-->Perixx Periboard-
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{Unk|okay keyboard}}
|-
| <!--Description-->Perixx Periboard-
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{Unk|okay keyboard}}
|-
| <!--Description-->Lenovo SK-8825 41A5327 SIL12-W07
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->works manufactured for
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Lite-On USB NetVista Full Width Keyboard
| <!--Vendor ID-->0x04b3
| <!--Product ID-->0x3025
| <!--Revision-->
| <!--Opinion-->works
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Logitech K320 Wireless Keyboard
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|The Logitech USB Unifying, Bolt, Lightspeed, or Nano receiver pairing}}
|-
| <!--Description-->Logitech K340 Wireless Keyboard
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|The Logitech Unifying Receiver pairing}}
|-
| <!--Description-->Logitech K400
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{Unk|okay keyboard}}
|-
| <!--Description-->[http://www.logitech.com/en-us/product/wireless-touch-keyboard-k400r Logitech Wireless Touch Keyboard k400]
| <!--Vendor ID--> 0x046D
| <!--Product ID--> 0xC52B
| <!--Revision--> 1201
| <!--Opinion--> {{yes|All (including multimedia) keys work. Some keys requires remapping with Trident. Touchpad works and acts as normal mouse. Presents itself in Trident as USB Receiver from Logitech with 3 HID bindings}}
|-
| <!--Description-->Logitech K400 Plus K400+
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{Unk|okay keyboard}}
|-
| <!--Description-->Logitech K600
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{Unk|okay keyboard}}
|-
| <!--Description-->Logitech TK820
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{Unk|okay keyboard}}
|-
| <!--Description-->Logitech TK830
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{Unk|okay keyboard}}
|-
| <!--Description-->Logitech G915 TKL
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{Unk|okay keyboard TKL means no number pad}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2027 magnetic hall effect software should be better and surpasses mechanical}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Lofree Lite84
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 }}
|-
| <!--Description-->Lofree Flow Lite100
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 silent switches and low profile keys}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->MACHENIKE K500 Wired
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2024 94 keys untested Hot Swappable 94 Keys 90% Layout }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->MechLands Vibe99
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2024 100 keys untested Gasket-mounted Wired/Bluetooth/2.4GHz Wireless Mechanical Keyboard}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Microsoft Comfortable Curve 2000
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no| recognized but not supported}}
|-
| <!--Description-->Microsoft Natural Ergonomic Keyboard 4000
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|recognized but not supported}}
|-
| <!--Description-->Microsoft Wireless Media Desktop 1000 (1356)
| <!--Vendor ID-->0x045e
| <!--Product ID-->0x00f9
| <!--Revision-->
| <!--Opinion-->{{maybe|working but not mouse part}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2027 magnetic hall effect software should be better and surpasses mechanical}}
|-
| <!--Description-->Niz Micro84 Duo82 X87
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2022 electro capacitive }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2027 magnetic hall effect software should be better and surpasses mechanical}}
|-
| <!--Description-->nuphy gem80
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| expensive but good}}
|-
| <!--Description-->nuphy kick 75
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 low profile 75% }}
|-
| <!--Description-->nuphy Air75 V3
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 75% }}
|-
| <!--Description-->nuphy node 100
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| 96% layout, }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2027 magnetic hall effect software should be better and surpasses mechanical}}
|-
| <!--Description-->Qpad MK-50 MK-80
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Qpad MK-90
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2027 magnetic hall effect software should be better and surpasses mechanical}}
|-
| <!--Description-->Razer Chroma
| <!--Vendor ID-->0x1532
| <!--Product ID-->0203
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->[https://openrazer.github.io/ Razer] Lycosa
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Razer Blackwidow 2013
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| Cherry MX Blue }}
|-
| <!--Description-->Razr Blackwidow Ultimate
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| Cherry MX Blue }}
|-
| <!--Description-->Razer Blackwidow V4
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| Razer Orange keys }}
|-
| <!--Description-->Razer Blackwidow V4 Low Profile
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| Razer keys }}
|-
| <!--Description-->Razer Blackwidow V4 Pro 75%
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| Razer keys }}
|-
| <!--Description-->Razer Cynosa Lite V2
| <!--Vendor ID-->1532
| <!--Product ID-->0x023f
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Razer DeathStalker
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Razer HuntsMan
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Razer Ornata
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Razer Orbweaver Chroma Keypad
| <!--Vendor ID-->0x1532
| <!--Product ID-->0207
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Razer Tartarus Keypad
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| not hall effect and very expensive}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2027 magnetic hall effect software should be better and surpasses mechanical}}
|-
| <!--Description-->Redragon K668 RGB Gaming Keyboard Wired
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2023 untested 108 Keys Mechanical Keyboard w/Extra 4 Hotkeys Upgraded Hot-swappable Socket,Red Switch}}
|-
| <!--Description-->Redragon K689 PRO Wireless
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2024 untested Gasket RGB Gaming Keyboard, 108 Keys Mechanical Keyboard w/Extra 4 Hotkeys, Upgraded Hot-swappable}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Rii K22
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 keyboard trackpad combo, non replaceable lithium battery, very compact}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2027 magnetic hall effect software should be better and surpasses mechanical}}
|-
| <!--Description-->Risophy 60
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2024 75% mechanical, hotswap so okay for price untested }}
|-
| <!--Description-->Risophy
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2028 magnetic hall effect software should be better and surpasses mechanical}}
|-
| <!--Description-->Royal Kludge RK65
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested cream switches }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2028 magnetic hall effect software should be better and surpasses mechanical}}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->SINO WEALTH Gaming KB SkyLion K68
| <!--Vendor ID-->0x258a
| <!--Product ID-->0x003a
| <!--Revision-->
| <!--Opinion-->{{No| blue stalks with rgb lighting}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->SKYLOONG GK104 Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested gateron }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2028 magnetic hall effect software should be better and surpasses mechanical}}
|-
| <!--Description-->SteelSeries
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->TeckNet x300 2.4G Keyboard Mouse MosART
| <!--Vendor ID-->0x062A
| <!--Product ID-->0x4101
| <!--Revision-->0312
| <!--Opinion-->{{Yes|1 AAA for each and works well - mouse slightly better built than keyboard rubberised membrane}}
|-
| <!--Description-->TeckNet X331 HDE 2.4G Keyboard wireless RCMCU
| <!--Vendor ID-->0x0C45
| <!--Product ID-->0x7000
| <!--Revision-->0001
| <!--Opinion-->{{Yes|wireless can be glitchy but few extra keys are mapped }}
|-
| <!--Description-->TeckNet X500 2.4G Keyboard Mouse MOSArt
| <!--Vendor ID-->0x062A
| <!--Product ID-->0x2901
| <!--Revision-->0112
| <!--Opinion-->{{Yes|works well especially large touchpad - usual rubber domed membraned keyboard mechanism }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Tecware Specter
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested good 75%}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2028 magnetic hall effect software should be better and surpasses mechanical}}
|-
| <!--Description-->Unicomp Model M USB 104 key
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }} IBM's and later Lexmark buckling spring switches
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Varmilo Minilo Bluebell (prestige silent) and Eculapytus (violet tactile)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2023 75% plastic build no screws not great to mod}}
|-
| <!--Description-->Varmilo Sword 68
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| expensive but good}}
|-
| <!--Description-->Varmilo 98
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2024 expensive but good and Kailh silent}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2028 magnetic hall effect software should be better and surpasses mechanical}}
|-
| <!--Description-->Weikav Velocifire Choice65
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Weikav Velocifire Lucky65
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2024 }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2028 magnetic hall effect software should be better and surpasses mechanical}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Wobkey Rainy 75
| <!--Vendor ID-->0x320F
| <!--Product ID-->0x5055
| <!--Revision-->
| <!--Opinion-->{{unk|2024 good 75% but not as expensive CNC Aluminum HMX/JWK/Cocoa Switches}}
|-
| <!--Description-->Wobkey Crush 80
| <!--Vendor ID-->0x320F
| <!--Product ID-->0x5588
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Wobkey Crush80 Reboot Pro
| <!--Vendor ID-->0x320F
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2024 very good but expensive Aluminum Hotswap Wireless RGB}}
|-
| <!--Description-->Wobkey Rainy 75 Pro
| <!--Vendor ID-->0x320F
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2026 magnetic hall effect software should be better and surpasses mechanical}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Wooting HE60 HE80 HE90
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2024 hall effect but expensive with good software}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2028 magnetic hall effect software should be better and surpasses mechanical}}
|-
| <!--Description-->Womier WK61
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2021 untested }}
|-
| <!--Description-->Womier Sk71
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2024 }}
|-
| <!--Description-->Womier Sk75
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2024 }}
|-
| <!--Description-->Womier Sk75 TMR
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 hall effect }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2028 magnetic hall effect software should be better and surpasses mechanical}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Xenta White Wireless HK6718B+HM3302-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{Maybe|works with Raspberry Pi untested on AROS native}}
|-
| <!--Description-->Xinmeng X87 MAGIC_REFINER
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2024 untested keycap swap but not hotswapable switches}}
|-
| <!--Description-->Yunzii AL66
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| milk switches, cherry PBT, }}
|-
| <!--Description-->Yunzi B75 Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2024 budget good with cocoa cream switches }}
|-
| <!--Description-->Yunzii AL75 Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|good budget option with swappable switches, }}
|-
| <!--Description-->Yunzii AL80
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 switches }}
|-
| <!--Description-->Yunzi C75 Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 budget good with switches }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2028 magnetic hall effect software should be better and surpasses mechanical}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
|}
<pre>
linear - creamy
tactile - thocky
clicky - clacky
</pre>
<pre >
Cherry MX Black are linear switches (no feedback); good for gaming.
Cherry MX Red are linear (less noise no click) but more squishy;
Cherry MX Brown are in between Blue and Red in style and tactile;
Cherry MX Clear switches have soft tactile feedback (with no click).
Cherry MX Blue have tactile feedback with a click (noisy); good for typing.
Gateron Yellows KS-3, KS-3x47 or better Pros have a milky top and black bottom and linear
TTC Silent Frozen v2. Linear and dead silent
Mouse the huano brown with yellow dot for silent mouse clicks
Kailh red dust proof encoder for smooth and close to silent scrolling
Boba U4 Silent Tactile switches
Husky linears
HMX
</pre >
=== Mouse ===
if the USB mouse is non-functional put a USB pendrive in before or add the following to user-startup in '''s''' drawer/folder/directory
sys:prefs/trident NOGUI > NIL:
{| class="wikitable sortable" width="90%"
! width="10%" | Brand
! width="20%" | Description
! width="10%" | Model
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| 3Dconnexion
| 3D Mouse
| <!--Model-->[http://www.3dconnexion.com/products/spacenavigator.html SpaceNavigator]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| {{N/A|untested}}
|-
| 3Dconnexion
| 3D Mouse
| <!--Model-->SpacePilot Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| {{N/A|untested}}
|-
| 3Dconnexion
| Mouse
| <!--Model-->SpaceExplorer
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| {{N/A|untested}}
|-
| 3Dconnexion
| Wireless Mouse
| <!--Model-->SpaceMouse
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| {{N/A|untested}}
|-
| <!--Brand-->3D Optical
| <!--Description-->Wired
| <!--Model-->
| <!--Vendor ID-->0000:3825
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested}}
|-
| <!--Brand-->
| <!--Description-->
| <!--Model-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested}}
|-
| Belkin
| Combo mouse
|
| 0x05FE
| 0x0011
| Low 0100
| {{yes|works}}
|-
| <!--Brand-->
| <!--Description-->
| <!--Model-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested}}
|-
| <!--Brand-->Cytec
| <!--Description-->Wired Mouse Gaming
| <!--Model-->R.A.T 5
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested}}
|-
| <!--Brand-->
| <!--Description-->
| <!--Model-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested}}
|-
| Dell
| Mouse
| MO56UC
| 0x413C
| 0x3200
|
| {{yes|works}}
|-
| <!--Brand-->
| <!--Description-->
| <!--Model-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested}}
|-
| <!--Brand-->
| <!--Description-->
| <!--Model-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested}}
|-
| <!--Brand-->equatech / clone logitech
| <!--Description-->wireless mouse
| <!--Model-->49779 / M185
| <!--Vendor ID--> 3151:2020 later 3151:3020
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{Yes|detected and works}}
|-
| <!--Brand-->
| <!--Description-->
| <!--Model-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested}}
|-
| Hama
| RF Optical Mouse
| AM-6000
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| {{N/A|untested}}
|-
| <!--Brand-->Keychron
| <!--Description-->Optical
| <!--Model-->M3
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested}}
|-
| <!--Brand-->Keychron
| <!--Description-->Optical
| <!--Model-->M5
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested}}
|-
| <!--Brand-->Keycron
| <!--Description-->Optical Wireless
| <!--Model-->M6
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested 1k polling and 16k dpi }}
|-
| <!--Brand-->Keychron
| <!--Description-->Optical Wireless
| <!--Model-->M7
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested barebones 1k polling and 16k dpi, great for small hands, loud clicks}}
|-
| <!--Brand-->
| <!--Description-->
| <!--Model-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested}}
|-
| <!--Brand-->LogiCAD 3D
| <!--Description-->3D Mouse
| <!--Model-->Magellan
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| {{N/A|untested}}
|-
| <!--Brand-->
| <!--Description-->
| <!--Model-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested}}
|-
| Logitech
| Cordless Desktop Navigator
| <!--Model-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| {{No|The Logitech Unifying Receiver pairing}}
|-
| Logitech Inc.
| First/Pilot Wheel Mouse
| N48/M-BB48 M-BE58
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| {{N/A|untested }}
|-
| Logitech
| Wireless mouse
| [http://www.logitech.com/en-roeu/mice_pointers/mice/devices/5484 M305]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| {{yes|works}}
|-
| Logitech
| Wireless RF Mouse
| MK710
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| {{No|The Logitech Unifying Receiver pairing}}
|-
| <!--Brand-->Logitach
| <!--Description-->Optical
| <!--Model-->G304
| <!--Vendor ID-->0x
| <!--Product ID-->0x
| <!--Revision-->
| <!--Opinion-->{{unk|2021 very clicky}}
|-
| <!--Brand-->Logitech
| <!--Description-->Wireless Mouse
| <!--Model-->MX Master Anywhere 2S
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{No|untested}} micro USB charge port on front
|-
| <!--Brand-->Logitech
| <!--Description-->Wireless
| <!--Model-->M220 silent touch MR0085
| <!--Vendor ID-->0x
| <!--Product ID-->0x
| <!--Revision-->
| <!--Opinion-->{{N/A|2018 needs usb dongle - quiet clicking }}
|-
| <!--Brand-->Logitech Logi
| <!--Description-->Optical
| <!--Model-->MX Master 3S
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{No|2021 untested usb-c bluetooth, inbuilt battery but muted clicks}}
|-
| <!--Brand-->Logitach
| <!--Description-->Optical
| <!--Model-->G502 X Plus
| <!--Vendor ID-->0x
| <!--Product ID-->0x
| <!--Revision-->
| <!--Opinion-->{{N/A|2022 very clicky}}
|-
| <!--Brand-->Logitech
| <!--Description-->Wireless
| <!--Model-->M240 silent touch MR0105
| <!--Vendor ID-->0x
| <!--Product ID-->0x
| <!--Revision-->
| <!--Opinion-->{{maybe|2022 no dongle as bluetooth enabled but could work with Logi Bolt USB Receiver - 1 aa battery - quiet clicking}}
|-
| <!--Brand-->Logitech
| <!--Description-->Optical
| <!--Model-->MX Master 4 MXM
| <!--Vendor ID-->0x
| <!--Product ID-->0x
| <!--Revision-->
| <!--Opinion-->{{No|Bluetooth usb-c dongle, inbuilt lithium battery}}
|-
| <!--Brand-->
| <!--Description-->
| <!--Model-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested}}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Brand
| Description
| Model
| Vendor ID
| Product ID
| Revision
| Opinion-->
|-
| <!--Brand-->Maxxter
| <!--Description-->Wireless
| <!--Model-->
| <!--Vendor ID-->248a:8566
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested}}
|-
| <!--Brand-->Maxxter
| <!--Description-->Wireless
| <!--Model-->
| <!--Vendor ID-->248a:8518
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested}}
|-
| <!--Brand-->OrzerHome Maxxter
| <!--Description-->Wireless
| <!--Model-->
| <!--Vendor ID-->248a:8514
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested 1 aa with no on/off switch }}
|-
| <!--Brand-->
| <!--Description-->
| <!--Model-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested}}
|-
| Microsoft
| Wheel Mouse optical
| <!--Model-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| {{N/A|untested}}
|-
| Microsoft
| Sidewinder Mouse
| <!--Model-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| {{N/A|untested}}
|-
| Microsoft
| IntelliMouse Explorer USB optical
| <!--Model-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| {{N/A|untested}}
|-
| Microsoft
| Wireless Optical Mouse 2000
|
| 0x045E
| 0x00F9
|
| {{no|not working see keyboard Media Desktop 2000 above}}
|-
| <!--Brand-->Microsoft
| <!--Description-->
| <!--Model-->1461 1447
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{No|usb dongle matched to one mouse only no others}}
|-
| <!--Brand-->
| <!--Description-->
| <!--Model-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested}}
|-
| <!--Brand-->
| <!--Description-->
| <!--Model-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested}}
|-
| <!--Brand-->Razer
| <!--Description-->USB optical
| <!--Model-->Orochi
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested}}
|-
| <!--Brand-->Razer
| <!--Description-->USB optical
| <!--Model-->Mamba
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested}}
|-
| <!--Brand-->Razer
| <!--Description-->USB optical
| <!--Model-->Naga
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested}} 17 buttons
|-
| <!--Brand-->Razer
| <!--Description-->USB Optical
| <!--Model-->Naga Hex V2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested}} MOBA Gaming Mouse, Professional Grade 16,000 DPI Sensor - RGB lighting
|-
| <!--Brand-->Razer
| <!--Description-->USB optical
| <!--Model-->DeathAdder
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested}}
|-
| <!--Brand-->Razer
| <!--Description-->USB optical
| <!--Model-->Viper
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested}}
|-
| <!--Brand-->Razer
| <!--Description-->USB optical
| <!--Model-->Basilisk V3 Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested 1k polling, 35k dpi, }}
|-
| <!--Brand-->
| <!--Description-->
| <!--Model-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested}}
|-
| Trust
| Slimline Lasermouse
| <!--Model-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| {{N/A|untested}}
|-
| SteelSeries
| Tobii EyeX EyeMobile PCEye
| Eye Tracking Control
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| {{N/A|untested}} gaze interaction track technology for augment augmentative and alternative communication (AAC).
|-
| <!--Brand-->
| <!--Description-->
| <!--Model-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested}}
|-
| <!--Brand-->The Eye Tribe Tracker
| <!--Description-->Eye
| <!--Model-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested}}
|-
| <!--Brand-->
| <!--Description-->USB Optical Mouse
| <!--Model-->MV3000
| <!--Vendor ID-->0x192f
| <!--Product ID-->0x0916
| <!--Revision-->
| <!--Opinion-->{{yes|works}}
|-
| <!--Brand-->
| <!--Description-->
| <!--Model-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested}}
|-
| <!--Brand-->
| <!--Description-->
| <!--Model-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested}}
|-
| <!--Brand-->
| <!--Description-->
| <!--Model-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested}}
|-
| <!--Brand-->
| <!--Description-->
| <!--Model-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> {{N/A|untested}}
|}
=== Trackball ===
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| <!--Description-->3Dconnexion SpaceBall 5000
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| {{N/A|untested}} Labtec designed and rolled into new company 3dconnexion 2001 by owners Logitech
|-
| <!--Description-->ACCO Kensington Orbit optical F1233A
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Kensington Turbo Mouse 64210
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Clearly Superior Technologies. Model:CST 1000-RC
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Logitech Trackman Marble Mouse Wired USB
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Logitech Cordless Trackman Wheel
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Logitech Optical Trackman T-RB22 - Cordless
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Logitech M570 wireless
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Microsoft Trackball Mouse Optical 1.0 USB
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Microsoft X05-87473 Trackball USB Optical
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
|}
=== KVM ===
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->NanoKVM
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
|}
=== Gamepad ===
Controllers have mostly decided that the left analog joystick is keyboard equivalent of WASD and right joystick is your mouse. You also have 2 bumpers above the triggers. Shoot could be right trigger (so it doesn't involve taking your thumb off the right joystick). Face buttons for reloading or jump or other non-critical functions. Crank up the sensitivity and practice.
Testing can be done with the TRIDENT Prefs, [https://devicetests.com/controller-tester html5], [https://greggman.github.io/html5-gamepad-test/ html5], or [https://gamepad-tester.com/ Tester]
==== Dinput Poseidon Default Plugin - Playstation(TM) style ====
{| class="wikitable sortable" width="90%"
! width="35%" |Description
! width="5%" |Vendor ID
! width="5%" |Product ID
! width="5%" |Revision
! width="10%" |Merge with USB on Digital Pad
! width="10%" |Analogue Hack with Analog Stick
! width="30%" |Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Betop Betong Bat D2E BTP-BD2E XD4D2E
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Gravis Eliminator Gamepad Pro USB
| <!--Vendor ID-->047d
| <!--Product ID-->4005
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->{{N/A}}
| <!--Opinion-->2002 2d only
|-
| Hama Black Force USB Gamepad
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{Maybe| }}
| <!--Analogue Hack with Analog Stick-->{{Maybe| }}
| <!--Opinion-->2003 psx clone look
|-
| <!--Description-->Jess Tech Game Elements Philips GGE909 PC Recoil Pad
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Merge with USB on Digital Pad
| Analogue Hack with Analog Stick
| Opinion
|-
| [http://www.youtube.com/watch?v=TCbAmIhj6P4 Logitech Wingman Precision USB] G-UC3B
| <!--Vendor ID-->0x046d
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->{{Yes| }}
| <!--Analogue Hack with Analog Stick-->{{N/A| }}
| 2002 no 3D but good for 2D retro games like Turrican II
|-
| <!--Description-->Logitech Wingman Action Pad G-UB3A
| <!--Vendor ID-->0x046d
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{Yes| }}
| <!--Analogue Hack with Analog Stick-->{{Maybe|untested }}
| <!--Opinion-->2002 1 blue lucid translucent - thin analog stick N64 type -
|-
| Logitech Wingman RumblePad UB05B
| <!--Vendor ID-->0x046d
| 0xc20a
| 1.12
| <!--Merge with USB Digital Pad-->{{Yes| }}
| <!--Analogue Hack with Analog Stick-->{{Maybe|untesed }}
| 2000 twin blue analogue sticks N64 type - poor 2d controls with single molded blue piece - vibration feedback - single shoulder buttons with throttle control below right one
|-
| Logitech Wingman Cordless RumblePad G-RA4A
| <!--Vendor ID-->0x046d
| 0xc211
| 1.12
| <!--Merge with USB Digital Pad-->{{Yes| }}
| <!--Analogue Hack with Analog Stick-->{{Maybe|untested }}
| 2001 twin blue analogue sticks N64 type - poor 2d controls with single molded black piece - vibration feedback - dual shoulder buttons L1 L2 R1 R2 with blue throttle control below right one - 4 aa mn1500 batteries; life not great - C-UD10A usb dongle - overall big and bulky
|-
| <!--Description-->Logitech Precision Wired G-UG15
| <!--Vendor ID-->0x046d
| <!--Product ID-->0x
| <!--Revision-->0x
| <!--Merge with USB on Digital Pad-->{{Maybe| }}
| <!--Analogue Hack with Analog Stick-->{{N/A|N/A}}
| <!--Opinion-->2002 psx styling blue outer shell - no 3D analog and no shoulder buttons - no rumble
|-
| <!--Description-->Logitech Cordless Precision G-X2E14A
| <!--Vendor ID-->0x046d
| <!--Product ID-->0x
| <!--Revision-->0x
| <!--Merge with USB on Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{N/A|N/A}}
| <!--Opinion-->2002 ps2 styling blue outer shell - no 3D analog and no shoulder buttons - no rumble
|-
| <!--Description-->Logitech G-X5C11A Cordless Precision Wireless Controllers
| <!--Vendor ID-->0x046d
| <!--Product ID-->0x
| <!--Revision-->0x
| <!--Merge with USB on Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{N/A|N/A}}
| <!--Opinion-->2002 psx styling black outer shell - no 3D analog and no shoulder buttons - no rumble
|-
| [http://www.testfreaks.co.uk/game-console-accessories-controls/logitech-dual-actiontm-gamepad/ Logitech Dual Action]
* G-UD8 has no mode (2D only?) button and no rumble
* G-UF13A later
| <!--Vendor ID-->0x046d
| 0xc2
|
| <!--Merge with USB Digital Pad-->{{Yes| }}
| <!--Analogue Hack with Analog Stick-->{{Yes|[http://www.morphzone.org/modules/newbb_plus/viewtopic.php?topic_id=7018&forum=12 G-UF13A tested only]}}
| 2003 New body shape psx style - dual analog 3D sticks - 4 small travel shoulder triggers no 5,6,7,8
|-
| Logitech RumblePad 2 G-UF13
| <!--Vendor ID-->0x046d
| 0xc218
| 1.00
| <!--Merge with USB Digital Pad-->{{Yes| }}
| <!--Analogue Hack with Analog Stick-->{{Yes| }}
| 2006 light blue top/black base - twin analogues 3D along with dual short travel shoulder buttons - rumble present -
|-
| <!--Description-->[Logitech RumblePad 2 Cordless]
* G-RC?? OLD version that take FOUR batteries and RED Logitech logo
* G-RC14 uses TWO batteries has an ORANGE logo - dongle C-UE10
| <!--Vendor ID-->0x046d
| <!--Product ID-->0xc219
| <!--Revision-->0x0200
| <!--Merge with USB Digital Pad-->{{Yes| }}
| <!--Analogue Hack with Analog Stick-->{{Yes|mostly}}
| <!--Opinion-->2008 may have to remove 1 battery - G-RC?? 5 + 7 buttons - G-RC14 use buttons 6 + 8 to reset sticks - replace battery and push large button on receiver -
|-
| <!--Description-->Logitech F310 Wired Dual Action G-U0001
| <!--Vendor ID-->0x046d
| <!--Product ID-->0xc21
| <!--Revision-->0x
| <!--Merge with USB on Digital Pad-->{{Yes| }}
| <!--Analogue Hack with Analog Stick-->{{Yes|D mode switch}}
| <!--Opinion-->2010 dual analog 3D with pc-xbox/psx switch on back (only D works) - both rear shoulder RT LT buttons have excess travel - no rumble vibration -
|-
| <!--Description-->Logitech F510 Wired G-UG0002
| <!--Vendor ID-->0x046d
| <!--Product ID-->0xc21
| <!--Revision-->0x
| <!--Merge with USB on Digital Pad-->{{Maybe| }}
| <!--Analogue Hack with Analog Stick-->{{Maybe| }}
| <!--Opinion-->2010 dual analog with dual xbox pc/psx X/D switched compatibility modes -
|-
| Logitech F710 Wireless / Cordless RumblePad 2 G-R0001
| <!--Vendor ID-->0x046d
| 0xc219
| 3.05
| <!--Merge with USB Digital Pad-->{{Yes| }}
| <!--Analogue Hack with Analog Stick-->{{Maybe| }}
| When switch on top set to D and nano receiver for each controller to pair - 2 aa mn1500 batteries required - rumble support sometimes - rear back shoulder buttons excessive travel needed
|-
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Merge with USB on Digital Pad
| Analogue Hack with Analog Stick
| Opinion
|-
| <!--Description-->Megaworld 'TIME' USB pad
| <!--Vendor ID-->0x0735
| <!--Product ID-->0x9902
| <!--Revision-->Low 0100
| <!--Merge with USB Digital Pad-->{{Yes| }}
| <!--Analogue Hack with Analog Stick-->{{No |}}
| <!--Opinion-->2000 Poor quality
|-
| <!--Description-->Microsoft
* SideWinder Precision Pro USB (1997)
* SideWinder Precision 2 (1998)
* Game Pad Pro (1999)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Microsoft Sidewinder Game Pad USB
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{yes| }}}
| <!--Analogue Hack with Analog Stick-->{{yes| }}
| <!--Opinion-->[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1149&rowstart=140&pid=5934#post_5931 must setup first]
|-
| <!--Description-->Microsoft Sidewinder Gamepad X04 Freestyle
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->{{Maybe| }}
| <!--Analogue Hack with Analog Stick-->{{N/A|N/A }}
| <!--Opinion-->{{N/A|untested}} 1998 might need USB adapter
|-
| <!--Description-->Microsoft Sidewinder X05 63895 92626 Flight stick
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->{{Yes| }}
| <!--Analogue Hack with Analog Stick-->{{unk| }}
| <!--Opinion-->{{Yes|2000 [https://ae.amigalife.org/index.php?topic=929.msg11309#new tested]}}
|-
| <!--Description-->Microsoft Sidewinder Flight Stick X08-58736
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Microsoft
Plug & Play Game Pad (2000)
SideWinder Joystick (2000)
Game Pad 2.0 (2001)
SideWinder Force Feedback 2 (2002)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2002 long-standing static buildup problem and Force Feedback 2 was the removal of the power brick
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| Saitek [http://www.testfreaks.co.uk/game-console-accessories-controls/saitek-ps1000/ PS1000 Cyborg V.1], [http://www.testfreaks.co.uk/game-console-accessories-controls/saitek-ps2700-rumble-pad/ PS2700]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->{{Yes| }}
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2000 no rumble function
|-
| Saitek [http://www.youtube.com/watch?v=xG0v-hf6ZPA P2600] [http://compactiongames.about.com/od/hardware/tp/gamepads.htm P3600],
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->{{Yes| }}
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2000 no rumble function
|-
| Saitek P2900 wireless
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| {{N/A|untested but runs on 1 AA battery}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Merge with USB on Digital Pad
| Analogue Hack with Analog Stick
| Opinion
|-
| <!--Description-->Sony Batoh PS3 mini USB Wired hookup [http://ps3.jim.sh/sixaxis/usb/ SIXAXIS]
*PCB Ribbon Notes
*Protos ALPS MSU Rev3 M3 and the later CBEH-1019
*? SA1Q135A for sixaxis
*PP4
*V2
*V25
*VX SA1Q146A first dualshock 3 model
*VX SA1Q147A CECHZC2U (USA)
*VX35 SA1Q159A
*VX3 SA1Q160A
*VX? SA1Q188A
*VX4 SA1Q189A shipped with a CECH-2504 datecode 0C
*VX5 SA1Q194A changed design ALPS, PS button changes
*VX6 SA1Q195A red case,
*VX7 SA1Q222A superslims 2 ribbons
*VX8 SA1Q224A superslims 2 ribbons
| <!--Vendor ID-->0x054c
| <!--Product ID-->0x0268
| <!--Revision-->1.00
| <!--Merge with USB on Digital Pad-->{{No|}}
| <!--Analogue Hack with Analog Stick-->{{No|}}
| <!--Opinion-->Sometimes detected but no support - no sixaxis features detected - mini usb lead will have varying results -
|-
| <!--Description-->Sony PS4
*JDM JDS 001 010 011
*JDM 030 040 055
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Sony PS5 Dual Sense
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Speed Link Strike 2 FX
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Thrustmaster Firestorm Dual Power 2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->{{Yes| }}
| <!--Analogue Hack with Analog Stick-->{{Yes|[http://www.morphzone.org/modules/newbb_plus/viewtopic.php?topic_id=7018&forum=12 only 1 axis joystick only]}}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Trust Predator GM-1500 GM-1520
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Merge with USB on Digital Pad
| Analogue Hack with Analog Stick
| Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Haute42 M series Aluminum Metal Joystick Hitbox Controller Arcade Fighting Stick
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Haute42 T series
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Haute42 G series Gamefinger G12 G13 G16
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion--> plastic -
|-
| <!--Description-->Haute42 S series
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion--> thinner and lighter than G series
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Mad Catz sf2 fightstick
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Mayflash Datel Paewang Arcade Pro Stick
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Mayflash F300 Fighting Stick
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Mayflash F500 Fighting Stick
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Pico Flatbox GP2040-CE Hot Swappable Mini Hitbox Keyboard
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion--> default it is configured for PS4 but before plugging usbc cable in, X for Dinput, B Xinput, RT HID - plastic build case - Rev4 based on RP2040 chip and firmware is based on GP2040-CE (Community Edition) -
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Shenzhen Onebitdo Tech 8bitdo Fighting stick
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Venom 8 button
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
|}
==== Xinput Xbox Style Plugin ====
2018 extension added originally called AROSx but later redacted. Latest [https://github.com/medusalix/xone linux driver] might be useful.
{| class="wikitable sortable" width="90%"
! width="35%" |Description
! width="5%" |Vendor ID
! width="5%" |Product ID
! width="5%" |Revision
! width="10%" |Merge with USB on Digital Pad
! width="10%" |Analogue Hack with Analog Stick
! width="30%" |Opinion
|-
| <!--Description-->8bitdo Ultimate C Wired 82CB (Shenzhen ONEBITDO TECH - GWOWO)
| <!--Vendor ID-->0x2dc8
| <!--Product ID-->0x3106
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| <!--Opinion-->2022 - 4 t6 torx screws - non hall effect so drifting issues - triggers go faulty often -
|-
| <!--Description-->8bitdo Ultimate 2C Wired Controller 82CD
| <!--Vendor ID-->0x2dc8
| <!--Product ID-->0x310A
| <!--Revision-->0114
| <!--Merge with USB on Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| <!--Opinion-->2024 - HID keyboard assigned - 4 t6 torx screws - hall effect analogs and triggers - 1000Hz polling -
|-
| <!--Description-->8bitdo Ultimate 2C wireless
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| <!--Opinion-->2024 - 400mw battery - hall effect 3d nubs and triggers - micro switch shoulder buttons - d-pad poor for retro games -
|-
| <!--Description-->8bitdo ULtimate Mini Wired Controller for Xbox
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2024 hall effect
|-
| <!--Description-->8BitDo Pro 2
*Wired Controller
*Wireless
*Bluetooth
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2024 hall effect - playstation style layout for pc - slide button for S-A-D-X switch, android, dinput or xinput -
|-
| <!--Description-->8BitDo Pro 2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2025 tmr hall effect analogs, hall effect triggers and some microswitches - button swap - ps2 style layout -
|-
| <!--Description-->8bitdo Ultimate 3
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| <!--Opinion-->2026 - mw battery - hall effect 3d nubs and triggers - micro switch shoulder buttons - d-pad for retro games -
|-
| <!--Description-->8BitDo Pro 3
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2026 hall effect analogs, hall effect triggers and some microswitches - button swap - ps2 style layout -
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Ace Aurora
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2025 hall effect joysticks with no deadzone mode, gyro, linear rumble, trigger stops, back paddles, button swap, macro, turbo, RGB LED effects - tri-mode connection -
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Betop Beitong Spartan BTP-2270U
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| <!--Opinion--> no hall effect
|-
| <!--Description-->Betop Betong Asura 2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| <!--Opinion--> no hall effect - noble linear trigger potentiometer and alps shoulder LB/RB micro switch
|-
| <!--Description-->BEITONG ASURA 2 Pro+ Game Controller Wireless Gamepad
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Beitong Zeus 2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->BebonCool Dinofire Model Number: Q218 / TP28
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2021 - triggers aren't progressive but ON/OFF -
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->EasySMX X05
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2024 hall effect analog and triggers - tri mode connection -
|-
| <!--Description-->EasySMX Wireless Controller PC PS3, 9013pro ESM-9013PRO
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2024 linear hall effect but device sometimes will not connect tried multiple attempts with the dongle
|-
| <!--Description-->EasySMX X10
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->EasySMX X20
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2024 ABXY MICRO SWITCH - Bumpers Tactile switch Hall Effect analog
|-
| <!--Description-->EasySMX X15
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2025 hall effect analog and triggers - membrane buttons -
|-
| <!--Description-->EasySMX S10 Wireless Gamepad
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2025 TMR Hall effect and compatible with Switch 2/PC/Phone/TV/Steam, NFC, Gyro, HD Rumble -
|-
| <!--Description-->EasySMX
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->202
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Fantech World EOS Pro WGP15
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2024 hall effect trigger and sticks,2 back paddles, motion controlling
|-
| <!--Description-->Fantech EOS PRO II S
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2025 controller with TMR hall effect analogues, mechanical face buttons and D-pad, 63 input macro, back paddles, turbo - analog triggers with trigger stops - tri mode bt wifi and wired - slide switch on back for switch, macos/android and xinput -
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Flydigi Apex
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| <!--Opinion-->2023 luxury model
|-
| <!--Description-->Flydigi Vader Pro 3
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| <!--Opinion-->2023 the Pro(Hall Effects) and Non-Pro (No Hall)
|-
| <!--Description-->Flydigi Direwolf 2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| <!--Opinion-->2023 hall effect sticks and triggers - poor wifi connection -
|-
| <!--Description-->Flydigi Apex 4
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| <!--Opinion-->2024 luxury model
|-
| <!--Description-->Flydigi Vader 4 Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| <!--Opinion-->2024 - hall effect, DInput mode (o+A hold) -
|-
| <!--Description-->Flydigi Direwolf 3
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| <!--Opinion-->2024 hall effect analog and triggers but membrane buttons with gold contacts - 800mhA battery -
|-
| <!--Description-->Flydigi Dunefox
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| <!--Opinion-->2024 basic model hall effect analog and triggers but membrane buttons - 500mha battery - no gyros -
|-
| <!--Description-->Flydigi Vader 5 Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| <!--Opinion-->2025 - hall effect stick with tension control, linear triggers, DInput mode (o+A hold) -
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Gamesir T4K Keleid, T4C Cyclone wired
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2023 poor to ok switch
|-
| <!--Description-->Gamesir Nova
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{no|| }}
| <!--Analogue Hack with Analog Stick-->{{no| }}
| <!--Opinion-->2024 - switch type layout
|-
| <!--Description-->Guangzhou Chicken Run Network Tech Nova Lite GameSir-T4n LITE - Zikway HID gamepad
*[https://www.reddit.com/r/Gamesir/comments/1c185ve/psa_keep_gamesir_nova_lite_t4n_lite_firmware_at/ fw 4200 seems to be xbox so B then Home for Xinput (green LED), A then Home for HID BT Android (green/yellow LED), Y then Home for Switch Pro (Red LED)] or X then Home for Wifi and start and select to alternatively swap modes
* and if on [https://www.reddit.com/r/Gamesir/comments/1c185ve/psa_keep_gamesir_nova_lite_t4n_lite_firmware_at/ fw 5700 ds4 so Home + B (blue LED), ]
* firmware 6900
| <!--Vendor ID-->0x3537
| <!--Product ID-->0x1040 0x1041
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{no| }}
| <!--Analogue Hack with Analog Stick-->{{no| }}
| <!--Opinion-->2024 - hall effect 3d nubs - no usb-c cable - rubber membrane analog trigger travel and bumpers shoulder buttons - wifi 2.4G and bluetooth - xbox layout so ab and xy might need to be swapped via m and a buttons for switch type [https://www.youtube.com/watch?v=po-nNuC5fps fixes video] - 250Hz polling - 600mah battery - rigid carry case - poor d-pad esp diagonals - gamesir settings software only on android 6+ or ios based only -
|-
| <!--Description-->Gamesir Nova 2 Lite
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->GameSir G7 SE Wired Controller
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2024 hall effect
|-
| <!--Description-->GameSir G8
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Gamesir TEGENARIA T3 Lite Wired
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2024 playstation aesthetic hall effect analog and membrane buttons - X+Home button connects as an Xbox controller
|-
| <!--Description-->GameSir Cyclone 2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2024 TMR Joysticks with anti-friction rings and metal anti-friction rings around the stems, gyro, rumble, macro, turbo, 2 back paddles, hall analog triggers with micro-switch trigger - tri mode bluetooth, 2.4GHz wifi and wired, 1000hz polling rate - gamesir connect software -
|-
| <!--Description-->GameSir G7 Pro for Xbox
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2024 TMR hall effect - hall effect triggers, tri mode connection - gamesir nexus software -
|-
| <!--Description-->GameSir Super Nova Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2026 hall effect sticks and triggers, 1000Hz polling, tri mode connectivity,
|-
| <!--Description-->GameSir
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->GameSir
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->GameSir
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->GuliKit
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| <!--Opinion-->
|-
| <!--Description-->GuliKit KingKong 2 NS08
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| <!--Opinion-->Electromagnetic Stick hall effect - hall linear triggers - Mechanical face buttons - wired and wireless - Built-in rechargeable lithium battery
|-
| <!--Description-->GuliKit KingKong 2 PRO NS09
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| <!--Opinion-->hall efect - wired and wireless - Mechanical face buttons - Built-in rechargeable lithium battery
|-
| <!--Description-->GuliKit KingKong MAX 3 KK3
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| <!--Opinion-->hall effect - wired and wireless - lithium battery -
|-
| <!--Description-->Gulikit KK3 Max USB-c Bluetooth Controller
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2024 Hall Joysticks and Triggers, Maglev/Rotor/HD Vibration, 1000Hz Polling Rate, 4 Back Buttons,
|-
| <!--Description-->GuliKit KK3 PRO
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| <!--Opinion-->2024 smaller version of KK3 MAX - hall effect analog and triggers, face buttons , maglev rumble, gyro, 4 back paddles - rigid case - 950mAh up to 8 hrs -
|-
| <!--Description-->GuliKit
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Hyperkin
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Hori EX2 Turbo UHX3-45
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Machenike G1 Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2024 Wireless Gaming Controller with 1K Polling Rate Hall Effect Trigger Joystick For Nintendo Switch PC iOS Android
|-
| <!--Description-->Machenike G5 Pro Wireless Gaming Controller
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2024 ABXY Switch Membrane, Bumpers Tactile switch and hall effect analog
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->microsoft sidewinder precision pro
| <!--Vendor ID-->0x045E
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| [https://pineight.com/mw/index.php?title=USB_game_controllers Xbox 360 Wired Controller]
| 0x045e
| 0x028e
| 0x
| <!--Merge with USB Digital Pad-->{{No|needs specific driver and has poor 2D control pad}}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| <!--Opinion-->
|-
| Microsoft (R) [https://blog.tkjelectronics.dk/2012/12/xbox-360-receiver-added-to-the-usb-host-library/ Xbox 360] (TM) Wireless Receiver for Windows(R) Model 1086 and Controller
| 0x045e
| 0x0719, 0x or 0x0291
| 0x0100
| <!--Merge with USB Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| <!--Opinion-->{{No|separate standalone usb dongle detected and shows as 8 vendor interfaces but no class associated and so not working - may need new class from code from xpad or xboxdrv to work the controllor}}
|-
| <!--Description-->Xbox 360 Kinect [http://hackaday.com/2010/11/10/kinect-open-source-driver-demo-and-hacking/ Video]
[http://git.marcansoft.com/?p=libfreenect.git;a=commit;h=7655fcf7239ba4907654089dba535a196685dbe5 GIT]
| <!--Vendor ID-->0x045E
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| <!--Opinion-->2007 proprietary 2.4GHz RF protocol,
|-
| <!--Description-->Xbox One Wired Controller
| <!--Vendor ID-->0x045E
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{no| }}
| <!--Analogue Hack with Analog Stick-->{{no| }}
| <!--Opinion-->
|-
| <!--Description-->Xbox One wireless controller newer model with the 3.5mm headphone jack 1537 1697 and microsoft adapter
| <!--Vendor ID-->0x045E
| <!--Product ID-->0x02d1 or 0x02dd
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{no| }}
| <!--Opinion-->2014
|-
| <!--Description-->Microsoft Elite Series 1
| <!--Vendor ID-->0x045E
| <!--Product ID-->0x02e3
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{no| }}
| <!--Analogue Hack with Analog Stick-->{{no| }}
| <!--Opinion-->2016 ok -
|-
| <!--Description-->Xbox later models 1708+ Xbox One and Series use 5GHz and use Bluetooth,
| <!--Vendor ID-->0x045E
| <!--Product ID-->0x02e0
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{no| }}
| <!--Analogue Hack with Analog Stick-->{{no| }}
| <!--Opinion-->2017
|-
| <!--Description-->Xbox One S
| <!--Vendor ID-->0x045E
| <!--Product ID-->0x02ea 0x02fd
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{no| }}
| <!--Analogue Hack with Analog Stick-->{{no| }}
| <!--Opinion-->2019
|-
| <!--Description-->Microsoft Elite Series 2 Core
| <!--Vendor ID-->0x045E
| <!--Product ID-->0x02ff
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{no| }}
| <!--Analogue Hack with Analog Stick-->{{no| }}
| <!--Opinion-->2022 ok - no hall - 125Hz polling -
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Minisform MGP01
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2024
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->MOBAPAD N1HD
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2024 has liquid silicone face buttons, hall effect analog, D-Pad swap, two back paddles, USB-A dongle, HD Rumble -
|-
| <!--Description-->Mobapad Huben 2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2025
|-
| <!--Description-->Mobapad
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->BIGBIG WON Gale 墨将 mòjiāng
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->BIGBIG WON Blitz PRO 2 TMR
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->BIGBIG WON now MOJHON AETHER
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2025 hall effect joysticks, hall effect triggers, mechanical bumpers, 1000hz polling rate, mechanical D-pad, membrane face buttons, mechanical back paddles, rumble, deadzone issues - tri mode
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->MSI FORCE GC20 GC30 V2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2021 not hall effect
|-
| <!--Description-->MSI
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Mytrix Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2024
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->NACON GC-100XF Controller
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2024 average
|-
| <!--Description-->PXN P5
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2024 hall effect joysticks & triggers, limited trigger stops, 1000hz polling rate on wired, 4 back paddles, 32 macro record, anti-deadzone mode, RAW mode, gyro, turbo, tri-mode connection -
|-
| <!--Description-->PXN P50L
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| <!--Opinion-->
|-
| <!--Description-->PowerA
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->QRD Stellar T5
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->QRD Junior E5 Mini
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->QRD
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Razer Wolverine V3 Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2024 hall
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->RetroFlag
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Speedlink XEOX Pro Analog Wireless
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| <!--Opinion-->enclosed lithium battery? - xbox layout - switchable on back of controller to directinput (dinput) or xinput - USB dongle switchable to pc and ps3
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->SCUF Instinct Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2022 good
|-
| <!--Description-->SCUF Envision Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2023 good
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Steel Series Stratus Duo XL
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| <!--Opinion-->usb adapter needed
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->[https://inputlabs.io/Inputlabs InputLabs Alpakka Open Source and build yourself]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| <!--Opinion-->DIY it with 3d printer, pcb and components - pi pico needed - 2 gyros for better accuracy -
|-
| <!--Description-->[https://inputlabs.io/kapybara Inputlabs kapybara]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| <!--Opinion-->DIY one handed version wip
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Vilcorn Z03 BT Wireless
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| <!--Opinion-->2024 - other Bluetooth modes (green, red, blue, purple, etc.) Select + M1 (or M2) - 400mAh - not great latency wired - 800mhz polling -
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->zd ultimate legend
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->zd 0+ elite
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2024
|-
| <!--Description-->zd 0+excellent
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->2024
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
|}
<pre>
#ifndef AROSX_LIBRARY_H
#define AROSX_LIBRARY_H
#include <exec/types.h>
#define AROSX_CONTROLLER_TYPE_UNKNOWN 0x00
#define AROSX_CONTROLLER_TYPE_GAMEPAD 0x01
#define AROSX_GAMEPAD_DPAD_UP 0x0001
#define AROSX_GAMEPAD_DPAD_DOWN 0x0002
#define AROSX_GAMEPAD_DPAD_LEFT 0x0004
#define AROSX_GAMEPAD_DPAD_RIGHT 0x0008
#define AROSX_GAMEPAD_START 0x0010
#define AROSX_GAMEPAD_BACK 0x0020
#define AROSX_GAMEPAD_LEFT_THUMB 0x0040
#define AROSX_GAMEPAD_RIGHT_THUMB 0x0080
#define AROSX_GAMEPAD_LEFT_SHOULDER 0x0100
#define AROSX_GAMEPAD_RIGHT_SHOULDER 0x0200
#define AROSX_GAMEPAD_A 0x1000
#define AROSX_GAMEPAD_B 0x2000
#define AROSX_GAMEPAD_X 0x4000
#define AROSX_GAMEPAD_Y 0x8000
struct AROSX_GAMEPAD {
ULONG Timestamp;
UWORD Buttons;
UBYTE LeftTrigger;
UBYTE RightTrigger;
WORD ThumbLX;
WORD ThumbLY;
WORD ThumbRX;
WORD ThumbRY;
};
#define AROSX_EHMB_CONNECT 0x00
#define AROSX_EHMB_DISCONNECT 0x01
#define AROSX_EHMF_CONNECT (1L<<AROSX_EHMB_CONNECT)
#define AROSX_EHMF_DISCONNECT (1L<<AROSX_EHMB_DISCONNECT)
struct AROSX_EventHook {
struct Node eh_Node;
struct MsgPort *eh_MsgPort;
ULONG eh_MsgMask;
};
struct AROSX_EventNote {
struct Message en_Msg;
ULONG en_Event;
APTR en_Param1;
APTR en_Param2;
};
#endif /* AROSX_LIBRARY_H */
</pre>
=== Joystick ===
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="10%" |Merge with USB on Digital Pad
! width="10%" |Analogue Hack with Analog Stick
! width="50%" |Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->CH Products CombatStick 568
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Cyborg X
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Logitech Extreme 3D
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{N/A|untested }}
|-
| [Logitech Attack 3 Joystick]
| 0x0464
| 0xC214
| 0205
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| {{yes|works}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->saitek X-52 x52 pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->saitek aviator
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{N/A|untested }}
|-
| Speedlink Competition Pro USB
|
|
|
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| {{maybe|works but games not working "out of the box"}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Trust Predator QZ 501
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{yes|works}}
|-
| <!--Description-->Trust Predator TH 400
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{yes|works}}
|-
| <!--Description-->Trust Predator GM-2500
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{yes|works}}
|-
| <!--Description-->Trust XK 100
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{N/A|untested }}
|-
|}
===[https://github.com/JacKeTUs/linux-steering-wheels Gaming Racing Steering Wheels]===
{| class="wikitable sortable" width="90%"
! width="25%" |Description
! width="5%" |Vendor ID
! width="5%" |Product ID
! width="5%" |Revision
! width="10%" |Merge with USB on Digital Pad
! width="10%" |Analogue Hack with Analog Stick
! width="40%" |Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion--> [https://www.usb.org/sites/default/files/documents/pid1_01.pdf USB PID standard not supported],
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Cammus C5
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Fanatec CSL Elite
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->PS4 and Xbox - belt driven wheel - 30cm wheel swapping
|-
| <!--Description-->Fanatec Club Sport
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion--> top belt $600 £500 system
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->FFBeast
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Merge with USB on Digital Pad
| Analogue Hack with Analog Stick
| Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Genius TRIO RACER F1 Racing Wheel
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->Cheap and cheerful but not great - may need calibrating
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Hama PC Racing Wheel Thunder V18
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->Average
|-
| <!--Description-->Hori Racing Wheel 3 with pedals
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->PS3 PC
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Logic3 PXU450 TopDrive GT450 Steering Wheel for PS3, PS4, XBox One and PC
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Merge with USB on Digital Pad
| Analogue Hack with Analog Stick
| Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Logitech MOMO
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->Very good
|-
| <!--Description-->Logitech Driving Force GT
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Logitech Drive Force Pro DFP
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion--> wheel 900 degree - weighs in at 15 lbs
|-
| <!--Description-->Logitech Formula Force EX
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->200 degrees turn for the EX model is arcade-like driving - adds PS3 compatibility via the PSx/2 adaptor - weighs in at 9 lbs
|-
| <!--Description-->Logitech G25
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion--> - needs external psu -
|-
| <!--Description-->Logitech G27 PC/PS3
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion--> comes with gear shifter - needs external psu -
|-
| <!--Description-->Logitech G29 PC PS3/PS4
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion--> may need additional shifter - gear 900deg wheel / rumble - 3 peddle - needs external psu -
|-
| <!--Description-->Logitech G920 PC XboxOne
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion--> may need additional shifter - gear 900deg wheel / rumble - 3 peddle - needs external psu -
|-
| <!--Description-->Logitech G923
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Microsoft(R) SideWinder Precision Racing Wheel (1999)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Moza R3
| <!--Vendor ID-->0x346E
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Moza R5
| <!--Vendor ID-->0x346E
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Moza R9
| <!--Vendor ID-->0x346E
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Moza R12
| <!--Vendor ID-->0x346E
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->[https://github.com/Ultrawipf/OpenFFBoard OpenFFBoard],
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->PXN V10
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->PXN V12
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->PXN V12 Lite
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Merge with USB on Digital Pad
| Analogue Hack with Analog Stick
| Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Simagic M10
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion--> base direct drive $900 £800
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Simplicity Simwheel
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion--> direct
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Simucube
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Simucube
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Simucube
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Simxperience Accuforce V2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->SPEEDLINK Drift O.Z. Racing Wheel with Pedals and Gear Stick
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->SteelSeries Simraceway SRW-S1 Steering Wheel (PC)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Merge with USB on Digital Pad
| Analogue Hack with Analog Stick
| Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Thrustmaster Nascar Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Thrustmaster Ferrari Challenge Wheel
| <!--Vendor ID-->0x044f
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion--> Poor
|-
| <!--Description-->Thrustmaster Ferrari FGT Rumble GT Experience 3-in-1 (PC/PS3)
| <!--Vendor ID-->0x044f
| <!--Product ID-->b658
| <!--Revision-->0102
| <!--Merge with USB Digital Pad-->{{Yes|Wheel and all buttons detected}}
| <!--Analogue Hack with Analog Stick-->{{Maybe|}}
| <!--Opinion-->Not great - gear driven 240deg wheel rotation - no psu needed - 2 peddle - flappy gear change - rumble untested - red switch for PC PS3 selection
|-
| <!--Description-->Thrustmaster F430
| <!--Vendor ID-->0x044f
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Thrustmaster T500 RS Wheel
| <!--Vendor ID-->0x044f
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion--> belt driven wheel/rumble for GT5
|-
| <!--Description-->Thrustmaster T60 Challenge
| <!--Vendor ID-->0x044f
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Thrustmaster T150 Wheel
| <!--Vendor ID-->0x044f
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion--> gear / belt combo wheel / rumble - 2 peddle
|-
| <!--Description-->Thrustmaster TMX Pro PC/XboxOne
| <!--Vendor ID-->0x044f
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->{{No| }}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| <!--Opinion--> direct drive rumble - no manual gear shift included
|-
| <!--Description-->Thrustmaster T80
| <!--Vendor ID-->0x044f
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->Base level and OK - PS4 - 270deg rumble - 2 peddle
|-
| <!--Description-->Thrustmaster T300 RS GT
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->PS3 PS4 - belt driven - 900deg rotation and modular 28cm wheel out - 2 peddles but 3 available
|-
| <!--Description-->Thrustmaster TX Leather
| <!--Vendor ID-->0x044f
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->TX Xbox version - 900deg rotation
|-
| <!--Description-->Thrustermaster TS PC
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->PC only belt wheel
|-
| <!--Description--> TS XW Racer PC Xbox1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion--> top belt system
|-
| <!--Description-->Thrustmaster T-GT
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->PS4 $700 £600 with T-DFB
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Merge with USB on Digital Pad
| Analogue Hack with Analog Stick
| Opinion
|-
| <!--Description-->Tracer Zonda Racing Steering Wheel PC PS3 Vibration Feedback Pedals Gearbox
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->{{unk| }}
|-
|}
===Gamepad Joypad Adapters===
* Most adapters will work in most OS's without installing a driver. Special functions needing drivers will be noted.
* Some adapters do not work with some [http://www.stepmania.com/wiki/Dance_Pads dance pads] because of voltage issues. Other adapters map the dancemat arrows as axes and not as buttons, causing problems.
* If using an adapters should be compatible with '''original''' PlayStation PS/Xbox Xbox/GameCube GC /Dreamcast DC/Sega Saturn SS gamepads.
{| class="wikitable sortable" width="90%"
! width="35%" |Description
! width="5%" |Vendor ID
! width="5%" |Product ID
! width="5%" |Revision
! width="10%" |Merge with USB on Digital Pad
! width="10%" |Analogue Hack with Analog Stick
! width="30%" |Opinion
|-
| <!--Description-->[http://www.maplin.co.uk/psx-usb-bridge-34887?tabid=3&worldid=&doy=21m9&faqitem=playstation%20controller%20to%20pc%20adaptor Maplin] [http://www.rockfire.com.tw/ Padix Co. Ltd. Rockfire] PX-205 PSX/USB Bridge
| <!--Vendor ID-->0x0583
| <!--Product ID-->0x2050
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{Yes}} but buttons mapped different from others
| <!--Analogue Hack with Analog Stick-->{{Maybe|poor}}
| <!--Opinion-->Ok with dpads, but very poor support with analogue hack
|-
| Boom PS Joy Converter adaptor
|
|
|
| <!--Merge with USB Digital Pad-->{{Yes| }}
| <!--Analogue Hack with Analog Stick-->
| discontinued (2004/5). Hold Up, Start, and Select for three seconds. Very good [http://www.stepmania.com stepmania] recommendation.
|-
| [http://www.hkems.com/m_main.htm EMS] [http://www.hkems.com/product/ps2/ps2-usb2.htm USB2] grey plastic box with 2 PSX ports, one on either side - UP and Select pressed for 3 seconds at the same time or the dance code (start+select+up)
|
|
|
| <!--Merge with USB Digital Pad-->{{Yes|Tests/joystick shows the PS port works in digital mode on d-pad}}
| <!--Analogue Hack with Analog Stick-->
| Set in PC switch mode. Does not work when using 2 pads at the same time, likely higher power requirements. FPSE emu DualShock untested, Mat and Guitar untested but known lag involved
|-
| Joytech (play.com) (EMS USB2 bad clone) Black box twin PSX
| 0x0b43
| 0x0003
| 0x0
| <!--Merge with USB Digital Pad-->{{Maybe| }}
| <!--Analogue Hack with Analog Stick-->{{No|buggy hardware}}
| but poor on dance ddr mat and guitar hero as the left and right keys do not like being pressed together, Dual shock untested
|-
| [ EMS Trio Linker ] 1 PSone connection at bottom
|
|
|
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| 1PSX discontinued 2005
|-
| [http://psxemulator.proboards.com/index.cgi?board=support&action=display&thread=421 EMS Trio Linker Plus] (blue box) 1 PSx at bottom
|
|
|
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| 1PSX discontinued
|-
| Gamtec [http://www.gamestone.co.uk/gradius/guides_usb_smartjoy_guide.php SmartJoy Plus] Lik Sang PS->USB converter Red 2005
| 0x0925
| 0x0005
| Low 0110
| <!--Merge with USB Digital Pad-->{{Maybe|detected and digital dpad works with [http://aros-exec.org/modules/newbb/viewtopic.php?topic_id=4138&forum=2&post_id=35952#forumpost35952 joystick and testjoystick tests] but the second analog control is not mapping correctly in digital mode}}
| <!--Analogue Hack with Analog Stick-->{{No|Analogue Hack - hardware buggy not useable}}
| Dual shock untested, Mat and Guitar untested. Nothing picked up upon plugging it in. Quite common, these items have grounding issues or feed voltage back into the USB host and freeze the host controller, preventing any plugins or removals being detected.
|-
| Gamtec SmartJoy Plus Dual PS->USB converter Red
| 0x0925
| 0x00
| Low
| <!--Merge with USB Digital Pad-->{{Maybe| }}
| <!--Analogue Hack with Analog Stick-->{{No|buggy hardware}}
|
|-
| [http://uk.gear.ign.com/articles/700/700334p1.html Lik-Sang Super SmartJoy PSX]
|
|
|
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| 1PSX
|-
| Soyo Kiki Kiky
|
|
|
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
|
|-
| eXcel PSX adaptor shaped a little like a stealth bomber with USB pass through
|
|
|
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
|
|-
| Venom
|
|
|
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
|
|-
| Dragon Plus (Radio Shack) Pantherlord GreenAsia USB to PS2/PS3 converter single black cable
| 0x0e8f
| 0x03
| 1.07
| <!--Merge with USB Digital Pad-->{{Yes| }}
| <!--Analogue Hack with Analog Stick-->{{Yes| }}
|
|-
| Deal Extreme 2 PSX black cables from 1 USB port
|
|
|
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| {{N/A|untested }}
|-
| <!--Description-->HDE 2014 Personal Communication Systems Inc
| <!--Vendor ID-->0x0810
| <!--Product ID-->0x0001
| <!--Revision-->0106
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Same as single cable above but with black block midway along cable
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
|-
| <!--Description-->TigerGame Ltd Mayflash PC001 Super Joy Box 3
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| TigerGame Ltd Mayflash PC016 Super Joy Box arrowhead triangle twin PSX] Original was lack with RED Leds. Clones Dilong pu203, Blue HDE Neewer ShineData SD-APS2USB, Red Octane and Black PC Power Box (NS3454) '''embossed circle''' on top
| 0x0810
| 0x0001
| 1.06
| <!--Merge with USB Digital Pad-->{{Yes|Tests/joystick shows one PS port does not work with analog control at all but the other port does and maps correctly in digital mode}}
| <!--Analogue Hack with Analog Stick-->{{Yes|Analogue hack works }}
| Still available 2013, poor construction though, falls to pieces easily. Dual Shock untested, Mat and Guitar untested
|-
| <!--Description-->TigerGame Ltd [http://www.mayflash.com/pc/pc038/pc038-1.htm Mayflash PC038 Super Joy Box Pro triangle twin PSX]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| TigerGame Limited Mayflash SuperJoy Box 5 PC006 long V-shaped 4 port PS/PS2 Game Controller Adapter
|
|
|
| <!--Merge with USB Digital Pad-->{{Yes| }}
| <!--Analogue Hack with Analog Stick-->
|
|-
| <!--Description-->TigerGame Limited Mayflash SuperJoy Box 5 PRO PC039 PS/PS2 Game Controller Adapter
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Merge with USB on Digital Pad
| Analogue Hack with Analog Stick
| Opinion
|-
| Boom PSX+N64 USB converter (purple or blue see through box) (2003/4) - red led for psx and green led for n64
| 0x6666
| 0x0667
| 0x0
| <!--Merge with USB Digital Pad-->{{No|not detected by Tests/joystick}}
| <!--Analogue Hack with Analog Stick-->{{No|Analogue hack }}
| Rumble Pak untested
|-
| [http://www.hkems.com/product/ps2/TrioLinkerPlus2.htm EMS Trio Linker Plus II]
|
|
|
| <!--Merge with USB Digital Pad-->{{Yes| }} [http://aros-exec.org/modules/newbb/viewtopic.php?topic_id=4753&forum=24&post_id=43102#forumpost43102 ]
| <!--Analogue Hack with Analog Stick-->
| 1DC 1GC 1PSX but not for ddr mat games
|-
| TigerGame Mayflash PC043 clone HuiJia Black twin N64 converter for PC USB
| 0x0e8f
| 0x3013
| 0x0
| <!--Merge with USB Digital Pad-->{{No|detected by Tests/joystick though two digital pads have their settings wrong}}
| <!--Analogue Hack with Analog Stick-->{{Yes|Analogue hack works well with middle handle/grip little joystick}}
| Rumble Pack untested
|-
| TigerGame Mayflash PC MagicBox SuperBox 3
|
|
|
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| untested 1SS 1DC 1PSX }
|-
| <!--Description-->Lik Sang SmartJoy X
| <!--Vendor ID-->0x045e
| <!--Product ID-->0x0285
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->SmartJoy X2
| <!--Vendor ID-->0x045e
| <!--Product ID-->0x0289
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| TigerGame Mayflash PC018 Super Joy Box 9 Xbox (NOT 360)
| 0x05e3
| 0x060
|
| <!--Merge with USB Digital Pad-->{{No|shows up as a Genesys Logic Hub}}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| does not work. Hub(s) 0x0288 detected but 0x0289 xbox1 joypads are not detected as hid let alone as [http://www.amiga.org/forums/archive/index.php/t-62940.html xpad] or [http://pingus.seul.org/~grumbel/xboxdrv/ linux xboxdrv driver]
|-
| TigerGame Mayflash PC019 Super Joy Box 10 Xbox Twin ports (NOT 360)
| 0x05e3
| 0x060
|
| <!--Merge with USB Digital Pad-->{{No|shows up as a Genesys Logic Hub}}
| <!--Analogue Hack with Analog Stick-->{{No| }}
| does not work with the big Fatty Duke or smaller S Akebono controller(s)
|-
| TigerGame Ltd Mayflash PC020 Super Joy Box 11 Xbox Quad ports (NOT 360)
| 0x05e3
| 0x0604
|
| <!--Merge with USB Digital Pad-->{{No|shows up as a Genesys Logic Hub}}
| <!--Analogue Hack with Analog Stick-->{{No| }}
|
|-
| <!--Description-->TigerGame Ltd Mayflash PC035 3 in 1 Magic Joy box PS GC Xbox
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->USB to NES [http://wiki.nesdev.com/w/index.php/Standard_controller SPI like protocol]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Buffalo Classic USB Pad SNES like
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{Yes| }}
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Mayflash PC044 USB to SNES
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->USB to MEGADRIVE GENESIS Joypad
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->[http://www.retrousb.com/product_info.php?cPath=21&products_id=70 USB to 9 pin ATARI RETROPORT style JOYSTICK PORT]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->{{Yes| }}
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Atari RetroLink 9pin to SB
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->SLS Sega Saturn USB pad
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB on Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Mayflash PC050 Dual Saturn ports
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Guitar Hero for PC/Mac
| <!--Vendor ID-->0x1430
| <!--Product ID-->0x474C
| <!--Revision-->
| <!--Merge with USB Digital Pad-->{{Yes| }}
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Cronus Max
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->BrookX One
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Mayflash Gamecube to USB
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->Mayflash Magic NS
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion--> WiiU
|-
| <!--Description-->Brook Converter WiiU P3 P4
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
| <!--Description-->CooV Xbox One Converter
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Merge with USB Digital Pad-->
| <!--Analogue Hack with Analog Stick-->
| <!--Opinion-->
|-
|}
* [http://www.bemanistyle.com/forum/f6/best-metal-pad-19066/ Metal dance pads with LEDs] - My My Box Blue Shark (Nexen), Cobalt Flux (CF) (Let's Groove), Red Octane Afterburner, TX-2000, Logic3 (Dance Dance Dance), Gamerose (Stay Cool),
* Hard foam mat - [http://www.mayflash.eu/3in1-deluxe-dansmat-ignition-foam-ps2xboxpc-p-5.html Mayflash] FutureMax Deluxe 3 in 1 Ignition, [http://www.gamerose.com/ Gamerose] (Stay Cool), TrinPad orange,
* Soft foam mat - Logic3 (PS420N), [http://www.positivegaming.com/index.php?id=36 Positive Gaming Impact], Gamerose Miss Daisys Naki (Stay Cool), Pelican, MadCatz
*PS1 PS2 PS3 PS4 flex ribbon big source of button/trigger issues with all controllers
*PS2 Phat KSA1Q40A (Board), SA1Q33A (Membrane) SCHP-10010 H
*PS2 SA1Q42A SCHP-10010 A
*PS2 SA1Q43-A SCHP-10010 H
The primary axes are either the Control Pad or the left stick. Buttons come in a rough order: face buttons, then shoulder buttons, then Select and Start, then buttons under sticks, and finally Control Pad directions if not assigned to a hat. But the order and number of buttons within a category are unpredictable, as is which button the user expects to use for each action.
{| class="wikitable sortable" width="90%"
! width="10%" | Joypad
! width="5%" | HATS
! width="5%" | Button 01
! width="5%" | Button 02
! width="5%" | Button 03
! width="5%" | Button 04
! width="5%" | Button 05
! width="5%" | Button 06
! width="5%" | Button 07
! width="5%" | Button 08
! width="5%" | Button 09
! width="5%" | Button 10
! width="5%" | Button 11
! width="5%" | Button 12
! width="5%" | Button 13
! width="5%" | Button 14
! width="5%" | Axes 1
! width="5%" | Axes 2
! width="5%" | Axes 3
! width="5%" | Axes 4
! width="5%" | Axes 5
! width="5%" | Axes 6
! width="10%" | Comment
|-
| [https://pineight.com/mw/index.php?title=USB_game_controllers Xbox 360 Wired Controller]
|
| A (down-green)
| B (right-red)
| X (left-blue)
| Y (up-yellow)
| LB (white)
| RB (black)
| Back
| Start
| Guide
| L3
| R3
|
|
|
| Left X
| Left Y
| LT
| Right X
| Right Y
| RT
| Poor 2D, Good 3D
|-
| <!--Description-->Gravis GamePad / Original PlayStation Controller
| <!--HATS DPAD-->
| <!--Button 01-->Red (Sqleft)
| Yellow X (X down)
| Green O (O right)
| Blue (Tri up)
| L1
| R1
| L2
| R2
| Select
| <!--Button 10-->Start
|
|
|
|
| <!--Axes 1-->Stick X
| Stick Y
|
|
|
|
| <!--Opinion-->
|-
| <!--Description--> PlayStation 2 Older Adapters
| <!--HATS DPAD-->
| <!--Button 01-->Blue X (down)
| Red O (right)
| Pink Sq (left)
| Green Tri (up)
| L1
| R1
| L2
| R2
| Select
| <!--Button 10-->Start
| Stick 1
| Stick 2
|
|
| <!--Axes 1-->
|
|
|
|
|
| <!--Opinion-->
|-
| <!--Description--> PlayStation 2 Newer Adapters
| <!--HATS DPAD-->
| <!--Button 01-->Up
| Right
| Down
| Left
| L2
| R2
| L1
| R1
| Select
| <!--Button 10-->Start
| Stick 1 (analogue Hack)
| Stick 2
|
|
| <!--Axes 1-->
|
|
|
|
|
| <!--Opinion-->
|-
| <!--Description--> Wish Technologies N64 Adaptoid
| <!--HATS DPAD-->
| <!--Button 01--> A
| C Down
| C Right
| B
| C Left
| C Up
| L
| R
| Start
| <!--Button 10-->Z
| Pad Up
| Pad Down
| Pad Left
| Pad Right
| <!--Axes 1-->Stick X
| Stick Y
|
|
|
|
| <!--Opinion-->
|-
| <!--Description-->
| <!--HATS DPAD-->
| <!--Button 01-->
|
|
|
|
|
|
|
|
| <!--Button 10-->
|
|
|
|
| <!--Axes 1-->
|
|
|
|
|
| <!--Opinion-->
|-
| <!--Description-->
| <!--HATS DPAD-->
| <!--Button 01-->
|
|
|
|
|
|
|
|
| <!--Button 10-->
|
|
|
|
| <!--Axes 1-->
|
|
|
|
|
| <!--Opinion-->
|-
|}
Just plug in your digital/analogue joystick or gamepad into USB port. The device will be handled by Poseidon USB stack. Poseidon is the USB stack with Trident adding a GUI (graphical user interface) prefs.
the context sensitive page would come up right on pressing the help key inside the relevant window. The manual is in this archive, just in case it isn't in SYS:Locale/Help
*How to change joystick mode to analogue?
By default a connected USB joystick emulates Amiga digital joystick. To change this behaviour so that the joystick is presented as analogue you need to use Trident preferences application (System:Prefs/Trident).
Open Trident and go to Devices on the left hand side (mouse click once on it). Select your controller from the list to the right and then click on Settings button below. This will open a new window. On the "General" tab find the "Lowlevel Library Joypad Emulation" section near the bottom. Find ports which are set to "Merge with USB" or "Override with USB" and change them to "Analogue Hack".
Please note that analogue joystick support is an extension of original Amiga functionality, thus an Amiga application must be explicitly written to use it. AROS SDL library uses this functionality, thus all SDL applications that use joystick, can use the analogue joystick feature.
The HID class has several options how to handle the input data:
* Don't touch: The movement and button data for is not modified by the hid class. This is the default for the ports 0, 2, and 3.
* Overwrite with USB: This will kill the original data that might had come from the internal ports and overwrites it with the joypad data for this USB interface. Note well: If you have multiple joypads connected, take care which setting you have selected for each port, because only the last interface with this option will actually send the joypad data to the game.
* Merge with USB: This option merges the input data of the lowlevel.library with the USB stream. This only works, if the connected device on the original Amiga ports is NOT a mouse (because then the streams are incompatible). Merging should be the preferred method, because it leaves the original joysticks working.
* Disable: Turns off the port for the application.
* Analogue Hack: Tells Poseidon to force reporting of analogue data at the port. Please note that this only works with programs that understand the analogue data, because it's an extension to the original lowlevel.library standard made by Commodore. If you want to incorporate this feature in your software, just contact me and I will send you the necessary information.
* Rumble Port: As addition to the analogue data, the HID class supports applications and games that want to utilize a rumble pack or force feedback motors in the gamepads. This field selects to which lowlevel port the hid device responds, when attempting to use the rumble pack. Normally, this corresponds to the port that has been set in the actions for the joypad.
*How to change joystick port assignment?
The low level library supports up to four ports. Port 0 is usually used by the mouse, port 1 is the standard port for joysticks/joypads. By default a connected USB joystick is present in Port 1. To change its location to Port 0 you need to use Trident preferences.
Open Trident and go to Devices window. Select your controller from the list and then click on Settings button. This will open a new window. On the "General" tab find the "Lowlevel Library Joypad Emulation" section. Port 1 should be set as either "Merge with USB" or "Override with USB". Change this setting to "Don't touch". Change Port 0 setting to "Merge with USB".
Go to "Actions" tab. In the "Reports and collection" select first entry named "Joystick". in the "Usage items" select "X axis". Go to "Performed actions" area. On the left there will be a list of triggers. Each of them should have (port1) in their params. Click on the first trigger and using buttons to the right of the list change port1 into port 0. Repeat this for all triggers and for all items on "Usage items" list.
*How to make joystick simulate keyboard keys?
With Poseidon it is possible to make the joystick simulate the keyboard pressings. This might enable using joystick for playing games which only have keyboard support. This feature is configured in Trident preferences.
Open Trident and go to Devices window. Select your controller from the list and then click on Settings button. This will open a new window. Go to "Actions" tab. On the right top window select X axis. On the left bottom list select an entry "Digital Joystick, Push left(port 1)". On the panel to the right change "Digital joystick" into "Raw Key". A list of keys will be displayed. Select key you wish to send. Repeat the same procedure for "Digital Joystick, Release left (port 1)" option but this time check "Send key up even instead of key down". Open shell and move your joystick to the left - your selected letter should appear in the shell.
*Analogue in Trident Prefs
* Open the Trident USB Prefs -> Devices -> Select your joypad -> Settings button -> Action TAB
* See some "axis" listed under "Usage items" in the top right of the window. They are your analog stick(s)
* Check [x] Track Incoming Events which is half way down the window on the left
And you should see some axis activity in "Usage items" when you move the analog stick
*Actions
HID class item -> Settings -> HID Class Window -> Action Tab -> Action handling area
Reports and collections -> Usage Items -> Performed actions
Qualifier keys are *special*. You don't only need to create the actual keypress but also modify the qualifiers.
Go to the keyboard panel and find the windows menu key by enabling key tracking and pressing the windows menu key. Then assign the right amiga key to it.
Go to the actions panel and find the right amiga key (it's called "Keyboard right GUI"). Remember the actions stored there, best write them down in exact order. Then delete them.
Find the windows menu item and add the missing qualifier action. Be sure the parameters are exactly the same and the order is right.
Set them to Raw, then assign an up and down button for each character, etc.
when you change the settings to RAW so you can assign keyboard strokes. it will always say, KEYDOWN or what ever on the left, it never provides and option for key release.
The problem still remains though that if I try to assign the Directional Pad (Hat) to Arrow Keys, that things will get screwed up and you either can not move with the directional PAD (HAT), or movements are assigned to the Left Analog, and do not work as they should, it's as if the right and down arrow keys are ALWAYS On, regardless of the fact that I did indeed assign a Key release command to each input.
check that by pressing analog directions and see the current values, and the thresholds configured in poseidon to bind them to left/right/up/down.
misconfigured too much stuff in the HID settings, you can always go in poseidon->config list entry and delete the config item related to your device (or the HID class setting itself), back to basics.
*Rumble in Trident Prefs
Open Trident Prefs and click on the Devices option in the left hand window. Click with the mouse once on your gamepad choice on the right hand side and again on the Settings button below. In the new window, select the '''General''' TAB and half way down on the right there is an "Open Now" button in the section "HID output control window". Clicking on that button opens another window (HID Control) with sliders for the two rumble engines inside the controllers and you can test if they work. '''Sometimes clicking that button does nothing, other times it will open the window and say nothing is detected.''' The leftmost two sliders do nothing, the third one has a large rumble effect, and the fourth one has a small rumble effect.
===Graphic Drawing Tablet===
There is a standard in HID for tablets possibly mouse type. If the tablet is HID conforming in that sense, it should work. Aiptek does a fairly good job at this. The other competitor, Wacom, didn't pay too much attention to this and simply adapted their legacy serial protocol into HID in a very awkward way. Older Wacom tablets have worked with the special support in the HID class, but not the more recent ones.
to use graphic tablets fully, applications need to be written that make use of the AmigaOS NewTablet events (which AROS has)
* Entry level - A6 (6x4) work area
* Medium A5 (6x8) A4 (10x7) size (recommended but only a few ie years 2000 to 2003 models supported)
* Semi Pro A3 (12x9)
* Pro Cintiq
* 2005/6 Some support added for Wacom tablets
* 2008 Wacom's patent on battery free pens expires
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| <!--Description-->Micrograf Tabby (late 1980s and early 1990s)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|Serial RS232 based }}
|-
| <!--Description-->podscat pt 3030 graphics tablet
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|Serial RS232 based }}
|-
| <!--Description-->Summagraphics
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|Serial RS232 based }}
|-
| <!--Description-->Wacom IV compatible (Graphire, ArtPad, A3, A4, A5 and PenPartner CT-0405-P - Wacom intuos GD-0405-R) Waycom Digitiser II UD-0608-R
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|Serial RS232 based }}
|-
| <!--Description-->Wacom Artpad II (KT-0405-R)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|Serial RS232 based }}
|-
| <!--Description-->AceCad boards
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|Serial RS232 based }}
|-
| <!--Description-->AipTek HyperPen 6000
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|Serial RS232 based }}
|-
| <!--Description-->Calcomp
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|Serial RS232 based }}
|-
| <!--Description-->AipTek HyperPen 8000 - Aldi/Medion MD 9310 and Aldi/Tevion LT 9310
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|Serial RS232 based }}
|-
| <!--Description-->Tablet PC penabled
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|Serial RS232 based like x61t X60t NC4200 NC4400 }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|Serial RS232 based }}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->
* Wacom PenPartner
* PenPartner 2
* PenStation 2
| <!--Vendor ID-->0x056a
| <!--Product ID-->0x0000
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Wacom Graphire - Wacom Tablet ET-0405-U UV1.1-1 (Slate Blue) ET-0405UL (lime) (orange) (red) (purple)
| <!--Vendor ID-->0x056A
| <!--Product ID-->0X0010
| <!--Revision-->0100
| <!--Opinion-->{{Yes|late 90s with A6 size - [Wacom Support] of X-axis 00000-10205 Y-AXIS 0000-7421 Tip Pressure 000-511 under Trident prefs. Air pen mouse type movements }}
|-
| <!--Description-->
* Grapphire 2 4x5 ET-0405A-U UV2.0-3 (Steel Blue)
* Graphire 2 5x7 ET-0507A
| <!--Vendor ID-->0x056A
| <!--Product ID-->0x0011 and 0x0012
| <!--Revision-->0110
| <!--Opinion-->{{Yes|A6 and A5 versions - [Wacom Support] of X-axis 00000-10205 Y-AXIS 0000-7421 Tip Pressure 000-511. Air pen mouse type movements - mouse EC-120-0K tested}}
|-
| <!--Description-->Wacom Graphire 3
* cte-430/w 4x5 pearl sapphire
* cte 630 6x8
| <!--Vendor ID-->0x056A
| <!--Product ID-->0x0013 and 0x0014
| <!--Revision-->0314
| <!--Opinion-->{{Yes|A6 and A5 size - [Wacom Support] Xaxis 0-10207 yaxis 0-7423 tip pressure 0-511 and the erase end appears to respond but avoid bluetooth BT versions }}
|-
| Wacom Graphire 4
* cte-440/B Blue cte 440/s Silver 4x5
* cte-640 6x8 cte 640 u 0403
| <!--Vendor ID-->0x056A
| <!--Product ID-->0x0015 and 0x0016
| <!--Revision-->403
| {{Yes|A6 and A5 work area detected [Wacom Support] x-axis 0000-10207 Y axis 0000-7423 Tip Pressure 000-511 and delete rub out end of the pencil seems detected but avoid bluetooth BT versions }}
|-
| <!--Description-->
* Wacom Intuos 4x5 GD-0405
* Intuos 6x8 GD-0608
* Intuos 9x12 GD-0912
* Intuos 12x12 GD-1212-U
* Intuos 12x18 GD-1218
| <!--Vendor ID-->
| <!--Product ID-->0x0020 0x0021 0x0022 0x0023 0x0024
| <!--Revision-->
| <!--Opinion-->{{Yes|detected and responses delivered back - x axis up to 30479 and y axis 31679, tip pressure up to 1023 and x and y tilt up to 127 - Wacom intuos GD-0912-A for Apple Macs NOT SUPPORTED}}
|-
| <!--Description-->
* Intuos 2 4x5 A6 - XD-0405-U
* Intuos 2 6x8 A5 - xd 0608u uoc
* Intuos 2 9x12 XD-0912-U
* Intuos 2 12x12 XD-1212-U
* Intuos 2 12x18 XD-1218-U
| <!--Vendor ID-->0x056a
| <!--Product ID-->0x0041 0x0042 0x0043 0x0044 0x0045
| <!--Revision-->0126
| <!--Opinion-->{{No|various sizes and recognised as [Wacom Support] but not working. x-axis 00000-20319 y-axis 00000-16239 tip presure 0000-1023 x-tilt y-tilt 000-127. HID mouse xc-100-03 works but never could use it as a real tablet with pressure with TVPaint 3.6 }}
|-
| <!--Description-->
* Intuos 3 4x5 (PTZ-430)
* Intuos 3 4x6 (PTZ-431W )
* Intuos 3 6x8 (PTZ-630 PTZ630)
* Intuos 3 6x11 (PTZ-631W A3 wide)
* Intuos 3 9x12 (A4 PTZ-930 PTZ930)
* Intuos 3
| <!--Vendor ID-->056a
| <!--Product ID-->0x00b0 0x00b1 0x00b2 0x00b3 0x00b4 0x00b5
| <!--Revision-->
| <!--Opinion-->{{No}} Actions in HID setup window definitively locks the Pointer (mouse) reports settings and even after a clear and save, nothing changes, the configuration returns to default values. "[Wacom]" reports don't see any events from the tablet, even with "Pointer" reports cleared and save, so is locked a in "mouse" state - but can send a special command to the tablet in order to put it into a special vendor mode. This mode enables Wacom specificities like pressure, tilt, absolute position, buttons, etc... you should send an HID report feature with ReportID=2 and data=2, the current HID class driver doesn't give a way to change that, even using the "initial startup actions" item in the extra collection. No listed features work
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| Wacom Volito - Promethean FT-0405-U06 UV1.4-1
| <!--Vendor ID-->0x056A
| <!--Product ID-->0x0060
| <!--Revision-->0141
| <!--Opinion-->{{Yes|A6 work area with [Wacom Support] of x-axis 0000-5103 Y axis 0000-3711 Tip Pressure 000-511. Air and touch mouse movement - appears to be the budget option with some but limited features}}
|-
| <!--Description-->Wacom Volito 2
* CTF-??? 2x3
* CTF-420G CTF-420 V2.0-0 4x5
* Serif Penabled 6742 rebadge of CTF 420/020-B CTF-420/02
| <!--Vendor ID-->0x056A
| <!--Product ID-->0x0062
| <!--Revision-->0200
| <!--Opinion-->{{Yes|A6 work area with [Wacom Support] of x-axis 0000-5103 Y axis 0000-3711 Tip Pressure 000-511. Air and touch mouse movement - no erase function on the end of the pen - nylon nibs value option}}
|-
| <!--Description-->
* Wacom PL-400 LCD
* PL-500
* PL-510
* PL-550
| <!--Vendor ID-->
| <!--Product ID-->0x0030 0x0031 0x0032 0x0034
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
* PL-600
* PL-600 SX
* PL-700
* PL-710
* PL-800
| <!--Vendor ID-->
| <!--Product ID-->0x0033 0x0035 0x0036 0x0037
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Wacom Cintiq 21 UX and Cintiq Partner DTF-720
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->Wacom PenTablet Bamboo (MTE), Bamboo Craft (CTH), Bamboo Fun (CTE), Bamboo Pen (CTL) and Bamboo Pen & Touch (CTH)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| Wacom Bamboo Fun Medium CTE-650
|
| 0x0018
|
| {{Maybe|[http://www.a1k.org/forum/showthread.php?t=11432 works on a1k forum]}}
|-
| <!--Description-->Bamboo Fun Small CTE-450 white
| <!--Vendor ID-->
| <!--Product ID-->0x0017
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Wacom Bamboo One CTF-430 V2.0-0 CTF 430/S
| <!--Vendor ID-->0x056A
| <!--Product ID-->0x0069
| <!--Revision-->0200
| <!--Opinion-->{{Maybe|A5 wired air pen and acts like a mouse only}}
|-
| <!--Description-->Wacom Intuos 4
* Small PTK-440 PTK-540
* Medium - PTK-640 - PTK 540WL Wireless -
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested Intuos4 surface sheet was revised in October 2010 to reduce nib wear}}
|-
| <!--Description-->Wacom Intuos 5 Touch
*
* Medium - PTH-650 - USB Wired and Wireless Kit
| <!--Vendor ID-->
| <!--Product ID-->0x0027
| <!--Revision-->
| <!--Opinion-->{{N/A|untested work, however wireless may glitch or drag }}
|-
| <!--Description-->Wacom Intuos Pro Medium - PTH-651 -
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Bamboo Small Pen Tablet - MTE 450 MTE-450A (MTE-450/k) -
| <!--Vendor ID-->0x056A
| <!--Product ID-->0x0065
| <!--Revision-->0116
| <!--Opinion-->{{Maybe|A6 work area - mouse movement but no pen detection except x-axis 2 to -2 and y-axis 2 to -2 - mini usb lead - 4 blue led lit buttons not detected as well as circular touch button?? }}
|-
| <!--Description-->Bamboo Pen CTL 460
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested all Bamboo versions were criticized for the drawing surface's roughness (which got smoother over time), which caused the small pressure-sensitive 'nib' to wear down, and become slanted or scratchy in the same way as pencil lead, albeit more slowly}}
|-
| <!--Description-->Wacom Bamboo Fun CTH-461/S wired
| <!--Vendor ID-->0x056A
| <!--Product ID-->0x00D2
| <!--Revision-->0106
| <!--Opinion-->{{Maybe|A6 size - Pen tracking not working but finger touch works }}
|-
| <!--Description-->Wacom Bamboo Connect Pen Tablet CTL-470 CTL-470K 470-DE
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->CTH 470K
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Wacom CTH 480/S wireless
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }} lithium battery for pad -
|-
| <!--Description-->Wacom Intuos Pen Small CTL-480/S CTL 480 K wired
| <!--Vendor ID-->0x056A
| <!--Product ID-->0x030E
| <!--Revision-->0200
| <!--Opinion-->{{No|A5 detected as Intuos PS but not working although the RHS blue led responds to pen on tablet }}
|-
| <!--Description-->CTH 490 PK S Photo - CTH-490CK-S Comic - CTH-490AK-S Art
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested lower hovering height pen nibs wear fast and input lag/responsiveness}}
|-
| <!--Description-->Intuos Pen & Touch Medium - CTH-680 - USB Wired and Wireless Kit work
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Wacom Intuos Pro (PTH-660 and PTH-860)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->Waltop Media Tablet 10.6"
Genius G-Pen M609
Genius G-Pen M609X
iVista Media Tablet 10.6
Aiptek MediaTablet 10000u
| <!--Vendor ID-->172f:0501
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Slim Tablet 12.1"
| <!--Vendor ID-->0x172F
| <!--Product ID-->0x0034
| <!--Revision-->0x1105
| <!--Opinion-->{{yes|works}}
|-
| <!--Description-->Waltop Media Tablet 12 by 9"
Aiptek HyperPen 12000u T-12000U Tablet Series
Nisis T-12000u USB Tablet Series Version 1.05 (aiptek rebadged)
Trust item #1535
ADESSO Cyber Tablet 12000 Graphic design tablet
iVista Media Tablet 12
PENTAGRAM O'pen Wide P 2003
Genius G-Pen M712
| <!--Vendor ID-->172f:0500, 0x08ca
| <!--Product ID-->0x0010
| <!--Revision-->0105
| <!--Opinion-->{{Yes|detected with Nisis/Aiptek functioning as a tablet, untested with others - Puck (mouse) x axis 0000 to 6000 y axis 0000 to 6000 - stylus (pen) x axis 00000 to 12000 y axis 00000 to 12000 tip pressure 0000 to 1023 - 16 function keys - AAA battery needed for pen and another for the mouse}}
|-
| <!--Description-->Waltop Media Tablet 14.1" v5.1e
Genius G-Pen M714X
Aiptek MediaTablet 14000u WMK-H141
Trust item #15358
Adesso CyberTablet 14000 M14
iVista Media Tablet 14.1
PENTAGRAM O'pen Wide P 2004
| <!--Vendor ID-->0X172f
| <!--Product ID-->0X0500
| <!--Revision-->0114
| <!--Opinion-->{{Yes|detected with Nisis/Aiptek functioning as a tablet - Stylus (Pen) X 16838 Y 16838 Tip Pressure 1023 }}
|-
| <!--Description-->Waltop PID 0038
Genius G-Pen F509
Manhattan 177405
| <!--Vendor ID-->172f:0038
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Waltop PID 0052
Yiynova MSP19
| <!--Vendor ID-->172f:0052
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Waltop Q Pad
Aiptek HyperPen Mini
NGS Flexi Style
VisTablet PenPad
iVistaTablet Q Flex Pad
Bravod Q-PD65-S
Trust Flex Design Tablet (#16937)
| <!--Vendor ID-->172f:0037
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Waltop Sirius Battery Free Tablet
VisTablet Muse
PENTAGRAM Designer P 2700
Princeton PTB-S1BK
| <!--Vendor ID-->172f:0502
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Waltop Slim Tablet 12.1"
Genius G-Pen F610
Trust Slimline Widescreen Tablet (#16529)
VisTablet Original 12"
Adesso CyberTablet Z12
Adesso CT-Z12A
PenPower Tooya Pro
Aiptek Slim 12.1 Inch
Aiptek SlimTablet 600u Premium II
NGS Slim Proguess
iVistaTablet Slim 12.1
PENTAGRAM ThinType P 2006
| <!--Vendor ID-->172f:0034
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Waltop Slim Tablet 5.8"
Genius G-Pen F350
Trust item #16485
VisTablet Mini
iVistaTablet Slim 5.8
| <!--Vendor ID-->172f:0032
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Waltop Venus S Tablet
Trust eBrush Widescreen Tablet (#17939)
| <!--Vendor ID-->172f:0503
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Aiptek GmBH MediaTablet Ultimate II - 16:10 Professional Graphic Tablet Model 1400U
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->Hanvon Beijing HanWang HW Micro Drawing Tablet ET0504U
| <!--Vendor ID-->0x0b57
| <!--Product ID-->0x8030
| <!--Revision-->01111
| <!--Opinion-->{{No|does not work - recognised as an HID mouse - no tablet extensions detected}}
|-
| <!--Description-->KYE EasyPen 340, Genius EasyPen 340
| <!--Vendor ID-->0458:5014
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|untested }}
|-
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| Aiptek Hyper Pen 6000u PC Tablet APT
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| {{No|detected but does not work - win98 era cordless 6in by 4.5in - }}
|-
| <!--Description-->nisis T-8000U APT-2 Aiptek rebadge
| <!--Vendor ID-->0x08CA
| <!--Product ID-->0x0021
| <!--Revision-->
| <!--Opinion-->{{No|A5 detected but no responses }}
|-
| <!--Description-->Acecad Flair II GT-504 Init Fkt Fkt 0x5ab450c0
AIPTEK HyperPen 10000 U
Aiptek HyperPen 10000U,
AIPTEK Slim Tablet U600 Premium II
| <!--Vendor ID-->0x0460
| <!--Product ID-->0x0004
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Ace Cad Enterprise Co., Ltd Tablet - 5x3.75 drawing area
| <!--Vendor ID-->0x0460
| <!--Product ID-->0x0004
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Bosto's
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }} UCLogic Digitizer
|-
| <!--Description-->Adesso CyberTablet Z7, Adesso CyberTablet 12000, Adesso CT-12000A
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->UC-Logic / Lapazz WP8060, UC-Logic / Lapazz PF1209, UC-Logic / Lapazz Artistic Tablet 5540, Manhattan 8"x6", Manhattan 3"x4", Manhattan
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested but suspect not working}}
|-
| <!--Description-->DigiPro 5.5×4” Graphics Tablet
Digital Ink Pad (A4 format)
DigiPro WP8060, DigiPro WP5540,
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Genius G-pen
G-Pen 4500
Genius Wizardpen
Genius Mousepen
Genius Easypen i405 M610
Genius PenSketch 9x12, Genius MousePen i608, Genius MousePen 8x6, Genius MousePen / WizardPen 5x4,
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Genius G-Pen F610
Genius G-Pen M610
Genius G-Pen 340 (UC-LOGIC Tablet WP4030U)
Genius G-Pen 450 (UC-LOGIC Tablet WP5540U)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Genius
UC-LOGIC
iBall Tablet PF8060
iBall
Iball Pen Tablet 8060U, Iball Pen Tablet 5540U, Iball Pen Tablet 4030U, Iball Design Tablet PF1209,
NGS CADBOY (UC-LOGIC Tablet WP5540U)
Pentagram
QWare
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Trust TB-3100
Trust TB-5300 Trust 15356
Trust TB-6300 Trust 15357 WP8060U Slimline but bulky with metal backing A5 size
Trust 16486, Trust 16447, Sketch Design Tablet,
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|clashes with usb and crashes AROS }}
|-
| <!--Description-->UC-Logic Tablet WP1062
Aiptek HyperPen 10000U
Monoprice 10X6.25 Inches Graphic Drawing Tablet
Pickle 10x6.25 Inch Graphic Drawing tabletguess
| <!--Vendor ID-->5543:0064
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| [ VTech KidiPhoto Art Studio]
|
|
|
| {{yes|works}}
|-
|}
Tablet has a squared lines of wires which induce a current into the pen which is then detected by the metal grid in the tablet pad. Tablets report pressure (and tilt on expensive models) and are absolute pointing devices (put the pen at the top left and the mouse pointer will go to the top left of the screen). Graphic drawing area, what keys, report rate, resolution lpi lpmm, accuracy, pressure levels (may come from the app), origin position,
Wacom tablets use electromagnetic resonance technology. Since the tablet provides power to the pen through resonant inductive coupling, no power is required for the pointing device. As a result, no batteries are inside the pen (or the accompanying puck), making them lighter and slimmer.
Under the tablet's surface (or LCD in the case of the Cintiq) is a printed circuit board with a grid of multiple send/receive coils and a magnetic reflector attached behind the grid. In send mode, the tablet generates a close-coupled electromagnetic field (also known as a B-field) at a frequency of 531 kHz. This close-coupled field stimulates oscillation in the pen's coil/capacitor (LC) circuit when brought into range of the B-field. Any excess resonant electromagnetic energy is reflected back to the tablet. In receive mode, the energy of the resonant circuit’s oscillations in the pen is detected by the tablet's grid. This information is analyzed by the computer to determine the pen's position, by interpolation and Fourier analysis of the signal intensity.
In addition, the pen communicates information such as pen tip pressure, side-switch status, tip vs. eraser orientation and ID number (to differentiate between different pens, mice, etc.). For example, applying more or less pressure to the tip of the pen changes the value of the pen's timing circuit capacitor. This signal change can be communicated in an analog or digital method. An analog implementation modulates the phase angle of the resonant frequency, while a digital method is communicated to a modulator that distributes the information digitally. The tablet forwards this and other relevant tool information in packets, up to 200 times per second, to the computer.
If you disable (delete all of them except for one that needs to be set to "no action", so that it will not be regenerated as default) the Extra Startup actions, the tablet should remain in relative mouse mode—you will not get pressure information in that mode though. [http://tech.groups.yahoo.com/group/highway_usb/message/2394]}}
=== Handheld Barcode Scanner Readers ===
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| <!--Description-->Farsun 9100 barcode scanner 0-12"
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Motorola Symbol LS2203 CMOS
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Tysso
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested Simple}} Code 11, Code 39, Code 93, Code 128, Coda Bar, UPC-A, UPC-E, EAN-8, EAN-13, MSI/Plessey, Telepen, Interleaved 2 of 5, Industrial 2 of 5, Matrix 2 of 5
|-
| <!--Description-->Unitech MS320
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Wasp WCS3905 CCD 1"
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }} Code 93, Matrix 2 of 5, Industrial 2 of 5, Code 39, UCC/EAN-128, ISBN, Code 32, EAN/JAN-8 , EAN/JAN-13 , UPC-A, UPC-E, Codabar, Code 128, Code 11, Interleaved 2 of 5, MSI-Plessey, China Post, IATA 2 of 5, ISSN, UK-Plessey
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->Datalogic Touch 90
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Intermec
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Honeywell Metrologic MK9540-32A38
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Motorola LS2208 Laser
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Wasp WWS800 Laser 1D
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->Datalogic GD4130-BK-C066
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Honeywell 1202G-1USB-5
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Motorola / Symbol DS6707-DC20007ZZR
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->DataMan 8000 2D
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Honeywell Voyager 9520/40
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Metrologic MS1690 USB 2D Barcode Scanner
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }} QR Code GS1 Databar PDF417
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Syscan GM800
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
|}
[http://www.scandit.com/2011/11/04/types-of-barcodes-choosing-the-right-barcode-type-ean-upc-code128-itf-14-or-code39/ Types of Barcode]
<pre>
UPC-A Grocery most common
Code 128
EAN-13 Library Books ISBN & ISSN,
Code 39
Codabar blood bank,
2D barcodes such as
Data Matrix
PDF417e
Maxicode
Aztec
QR Code old Nokia handsets,
MicroPDF417
</pre>
===TouchScreens===
Projected capacitive (PCAP) touch screen product, amongst many options the widely used are I2C and USB
*USB host–device structure which dominates consumer and industrial electronics devices where higher bandwidth needed and user-friendly (multiswipes)
*I2C Inter-Integrated Circuit simple serial standard for LCD display in embedded systems because of cost and low power
*SPI arduino and rpi single boards
We cover the USB here
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| eGalax Touch 4a
| 0eef
| 0001
| 0001
| {{yes|2009 works}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Lilliput HDMI Monitors
669GL-70NP/C/T (7 inch)
869GL-80NP/C/T (8 inch)
FA1011-NP/C/T (10 inch)
FA1046-NP/C/T (10 inch)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Iilyama Prolite Monitors
PROLITE T1513SR-1 (15 inch)
PROLITE T1730 (17 inch)
PROLITE T1713SR-1 (17 inch)
PROLITE T1913SR-1 (19 inch)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Smart Display Company (SDC) Touchscreens TFT Monitors
TOUCH-TFT-TS07 (7 inch)
TOUCH-TFT-TS08 (8 inch)
TOUCH-TFT-TS10 (10 inch)
TOUCH-TFT-TS12 (12 inch)
TOUCH-TFT-TS15 (15 inch)
TOUCH-TFT-TS17 (17 inch)
TOUCH-TFT-TS19W (19 inch wide)
TOUCH-TFT-TS22W (22 inch wide)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->XENARC Monitors 7 inch models
700TSH
700TSU
700TSV
702TSV
705TSV
706TSA
700IDT
MDT-X7000
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->XENARC
8 inch models:
800TSV
805TSV
10 inch models:
1020TSV
1026TSA
1040TS
12 inch models:
1200TS
1200TR
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->Asus VT229H 21.5"
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->CUQI 7" Monitor Touchscreen 1024x600 IPS
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Espresso 15" Portable Touchscreen Display Monitor
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Hannspree HT225HPB 21.5 inch
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->WaveShare 13.3inch HDMI LCD (H) (with case)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
|}
===GPS tracking, running, cycling, biking, walking, hiking, ORIENTEERING, boaters and mapping===
Support for OpenStreetMap but not for Ordnance Survey, Map Pilot or National Geographic's Topo maps data gdb,
Data output supported nmea 0183 V1.5 APA, V1.5 XTE and V2.1 GSA formats, gpx, kml/kmz, tracks from tcx files, geo: URIs,
NMEA0183(which is RS232, voltages range from -15 volts to 15 volts, 4800 baud), or need NMEA sentences connected to your computer
other method that some units support is a special serial cable that actually emits raw RS232 NMEA. These usually take 10->30 volts input, can run the unit, and have full voltage I/O for RS232 (not like spanner mode, which effectively turns the unit into a USB->Serial adapter inside the case).
Equivalent apps - merkator, mapsource,
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| <!--Description-->Garmin gpsmap 180 GPS/chart plotter
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->1992 GARMIN GPS 55 AVD Portable System
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->Garmin GPS V
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested - waas pinpoint within 3 metres - nmea - 4AA battery}}
|-
| <!--Description-->Garmin GPS 12 12XL
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->Garmin Legend C
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->Garmin eMap
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|possibly through usbmodem rs232 connection nmea 0183 protocol}}
|-
| <!--Description-->Garmin eTrex
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}} rs232 these older units supported it and would provide the stream in either the standard NMEA 0183 format or a proprietary Garmin format.
|-
| <!--Description-->Garmin GPS 75 AVD
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Magellan GPS Map 7000 model 45006 (1994)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Magellan GPS Tracker
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Magellan Pioneer Satellite Navigator
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Magellan GPS 300 315 320 Mentor Receiver (2003)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Not for dedicated sat nav units like the Nuvi, TomTom, etc
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->NaviLock NL-402U
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested u-blox 5 SuperSense® chipset with receivers for GPS, GLONASS, Galileo, BeiDou and QZSS}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->GM1-86UB
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| U-BLOX UB-6010 GGA,GSA,GSV, RMC and support VTG, GLL, TXT ublox binary and NMEA Command Dynamic Condition }}
|-
| <!--Description-->NAVILOCK GPS NL-602U USB
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{Yes|works via usbmodem.device - ublox ag 6 chipset - 50 channel}}
|-
| <!--Description-->TOPGNSS ton Receiver & Antenna GM702 u-blox 7
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{Yes|UBLOX7020 chip design bloc u-blox}}
|-
| <!--Description-->VK-162 G-MOUSE u blox 7
| <!--Vendor ID-->0x1546
| <!--Product ID-->0x01a7
| <!--Revision-->0100
| <!--Opinion-->{{N/A|UBX G70xx with RMC VTG GSV TXT GLL GGA GSA}}
|-
| <!--Description-->VK-172 u-blox 7 G7020-KT gps gnss white pen stick receiver - over 1 inch long
| <!--Vendor ID-->0x1546
| <!--Product ID-->0x01a7
| <!--Revision-->0100
| <!--Opinion-->{{N/A| detected as cdc controlled plug in device - 18x18x2mm patch antenna but can be slow to update - nmea 0183 and ublox binary protocol}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->GlobalSat BU-353 WaterProof USB GPS Receiver
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested SiRF Star III}}
|-
| <!--Description-->Haicom HI-206 USB GPS receiver with RS-232 interfaces, RJ11 and PS/II connector EB
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|usb-serial prolific pl2303 detected but GSP3F SiRF Star IV technology not detected or bound}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->BT760Y,
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested Skytraq Venus 5 GPS chipset}}
|-
| <!--Description-->GM-65 USB GPS Receiver
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested Skytraq Venus 6 GPS chipset - 65 channel}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested Skytraq Venus 7 GPS chipset}}
|-
| <!--Description-->GM-65 USB GPS Receiver
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested Skytraq Venus 8 GPS chipset - 167 channels}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->Garmin Colorado 300
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}} USB
|-
| <!--Description-->Garmin Geko 101 201
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}} limited waas enabled only - waypoints - aaa battery
|-
| <!--Description-->Garmin Edge 200 bike mount
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->Garmin ForeRunner 10 15 watch
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->Garmin Montana 600
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->Garmin Dakota 10 20
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->Garmin Map76s
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->Garmin Oregon 450T
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}} USB nmea 0183
|-
| <!--Description-->Garmin eTrex 10
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested - no nmea0183 sentences data stream output - configuration an option to set it to "Garmin" mode, or "Mass Storage" mode. Since the mass storage mode seems to be required for waypoint/track/etc data exchange, the 'Garmin' mode would be for this data stream. Yet putting it in that mode doesnt seem to produce anything.}}
|-
| <!--Description-->Garmin Oregon 650T
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->Garmin GPSMAP 64S
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{Maybe|untested}}
|-
| <!--Description-->GPSMap 78S or GPSMap 76CSX which has a NMEA port for talking to Nav equipment
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{Maybe|untested}}
|-
| <!--Description-->Garmin eTrex Vista Cx GPS Receiver
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested - 2AA battery}}
|-
| <!--Description-->Garmin GPSmap 276c
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->Magellan 2000 XL
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->Magellan
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->Magellan 3000
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->Magellan Triton 300
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}} SiRFstarIII™, Antenna Type Multidirectional Patch with WAAS, EGNOS, MSAS support
|-
| <!--Description-->Magellan Triton 400
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
|}
==massstorage.class (MSC/UMS - most cameras and mp3 players)==
=== USB Card Readers ===
{| class="wikitable sortable" width="90%"
! width="15%" | Description
! width="5%" |Vendor ID
! width="5%" |Product ID
! width="5%" |Revision
! width="15%" |Installing
! width="15%" |Booting
! width="30%" |Opinion
|-
| A-Tec Model CR-362
|
|
|
| <!--Installing-->
| <!--Booting-->
| {{N/A|untested}}
|-
| [http://www.belkin.com/IWCatProductPage.process?Merchant_Id=&Section_Id=200406&pcount=&Product_Id=179164 Belkin 15 in 1 Card Reader]
|
|
|
| <!--Installing-->
| <!--Booting-->
| {{yes|works}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Installing-->
| <!--Booting-->
| <!--Opinion-->{{N/A|untested }}
|-
| Conrad CP440 60 in 1
|
|
|
| <!--Installing-->
| <!--Booting-->
| {{yes|works on a1k forum}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Installing-->
| <!--Booting-->
| <!--Opinion-->{{N/A|untested }}
|-
| Genesys Gtech Logic 19 in 1
| 0x05E3
| 0x0710
| High 0200
| <!--Installing-->
| <!--Booting-->
| {{yes|works}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Installing-->
| <!--Booting-->
| <!--Opinion-->{{N/A|untested }}
|-
| Hama 19 in 1 Card Reader
|
|
|
| <!--Installing-->
| <!--Booting-->
| {{yes|works}}
|-
| Hama 35 in 1 Card Reader
|
|
|
| <!--Installing-->
| <!--Booting-->
| {{yes|works}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Installing-->
| <!--Booting-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Integral Single Slot SD
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Installing-->
| <!--Booting-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Installing-->
| <!--Booting-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Kingston USB 3.0
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Installing-->
| <!--Booting-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Lexar microsd adapter
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Installing-->
| <!--Booting-->
| <!--Opinion-->{{N/A|untested }} but wider than Sandisk version - could block other slot if below
|-
| Pretec CardDriver
|
|
|
| <!--Installing-->
| <!--Booting-->
| {{no|no driver}}
|-
| Sandisk MicroMate
|
|
|
| <!--Installing-->
| <!--Booting-->
| {{yes|works}}
|-
| <!--Description-->Sandisk MobileMate SD
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Installing-->
| <!--Booting-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Sandisk MobileMate Micro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Installing-->
| <!--Booting-->
| <!--Opinion-->{{N/A|untested }} has satisfying 'click' when microsd inserted
|-
| <!--Description-->Sandisk MobileMate Duo MicroSD
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Installing-->
| <!--Booting-->
| <!--Opinion-->{{N/A|untested }} no 'click' insertion uses pressure so future wear and tear issues
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Installing-->
| <!--Booting-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Serena metal cased microsd only
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Installing-->
| <!--Booting-->
| <!--Opinion-->{{N/A|Maybe}} hit or miss on quality
|-
| <!--Description-->Serena "Sandisk MobileMate" look-alike
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Installing-->
| <!--Booting-->
| <!--Opinion-->{{N/A|Maybe}} hit or miss on quality
|-
| SilverCrest 16in1
|
|
|
| <!--Installing-->
| <!--Booting-->
| {{yes|works}}
|-
| <!--Description-->Transcend
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Installing-->
| <!--Booting-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Transcend P5 8 in 1 TSRDP5K
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Installing-->
| <!--Booting-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Transcend P8 15 in 1 TSRDP8K
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Installing-->
| <!--Booting-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Installing-->
| <!--Booting-->
| <!--Opinion-->{{N/A|untested }}
|-
| Zyxel integralmemory 8 in 1
| 0x0aec
| 0x3260
|
| <!--Installing-->
| <!--Booting-->
| {{no|not detected}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Installing-->
| <!--Booting-->
| <!--Opinion-->{{N/A|untested }}
|-
|}
=== USB Hard Drives ===
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| Datel MaxDrive
|
|
|
| {{N/A|untested}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Inateck 2.5 Inch USB 3.0 Hard Drive Disk Enclosure/ Case (FE2001)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }} Full USB 3.0 port but plastic teeth keeping drive in place can snap
|-
| <!--Description-->Inateck case (FE2002)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }} full USB 3.0 port - updated design
|-
| <!--Description-->Inateck case (FE3001)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }} wider USB 3.0 port and no on/off switch Jmicron JMS578 chipset
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| Iomega Desktop Hard Drive 500GB, 3,5“, USB2.0
|
|
|
| {{N/A|untested}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| Samsung
|
|
|
| {{N/A|untested}}
|-
| Samsung
|
|
|
| {{N/A|untested}}
|-
| Samsung T3 SSD
|
|
|
| {{N/A|untested}} USB 3.1 Gen 1 space grey / black metal/ plastic
|-
| Samsung T5 SSD
|
|
|
| {{N/A|untested}} USB 3.1 Gen 2 256GB 512GB alluring blue 1Tb 2Tb black unibody metal
|-
| Samsung
|
|
|
| {{N/A|untested}}
|-
| Seagate
|
|
|
| {{N/A|untested}}
|-
| Seagate
|
|
|
| {{N/A|untested}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Toshiba Canvio 1TB
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{Yes|partition fat32 or sfs to 100GB max - ntfs partitions not detected out of the box - select usb drive in trident prefs and press disable to shutdown}}
|-
| Verbatim 160GB Smartdisk
|
|
|
| {{yes|works }}
|-
| Western Digital USB
|
|
|
| {{N/A|untested}}
|-
| <!--Description-->WD Essential
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->WD Passport
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
|}
=== USB DVD CD ROM Drives ===
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->12.5mm
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->12.5mm enclosure mini-sata dvd-rw
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested needs sole usb3 port to power it}}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->9.5mm enclosure ECD829 mini-sata dvd-rw with Initio Corporation INIC-1618L SATA
| <!--Vendor ID-->0x13fd
| <!--Product ID-->0x0840
| <!--Revision-->
| <!--Opinion-->{{N/A|untested but probably needs sole usb3 port to power it}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|}
=== USB to NGFF NVMe SDD HDD DVD CD ROM Drives ===
The older Jmicron JMS539B seems to result in massive filesystem corruption given the amount of corrupted content. Prehaps always avoided Jmicron and opted for Asmedia even if it costed a bit more. Realtek seems to be working okay for me generally speaking and newer Jmicron chipsets are less buggy – but evidently not perfect.
From [https://goughlui.com/2025/08/17/psa-validate-your-storage-jmicron-jms583-kioxia-bg4-series-ssd-issue/ thread]
Here is a [https://forums.anandtech.com/threads/stable-nvme-usb-adapter.2572973/ very long thread] that discusses data corruption and stability issues with these bridges. The majority of the posts are complaining of dropouts, hangs and the like, which usually down to either a poor USB 3.x implementation (SuperSpeed connections are very picky as to cables, ports and trace routing) or problematic compatibility. Regardless, the [https://www.legitreviews.com/jmicron-jms583-controller-version-matters-for-portable-usb-drives_219422 JMS583 is known to have several versions] noting that the last revision (C) in that article is a 2021 release which should fix earlier stability and cable quality compatibility issues.
JMS583-STD-Release-v00.02.01.04-Bus Power.bin is the latest JMS583 firmware as of August 2025.
Early firmware RTL9210 seems to have issues as well
* RTL9210B
* JMS583 rev1 with firmware A2 or A3
* RTL9210A
* JMS583 firmware 2.0.9
* Asmedia ASM2362
* RTL9201A
The reference Hardware ID for the JMS583 chipset from JMicron is:
VID_152D&PID_0583&REV_0209
where "VID_152D" identifies a JMicron product;
"PID_0583" is the generation chipset;
"REV_0209" is the firmware version installed.
In the same way, the reference Hardware ID for the RTL9210 from Realtek is:
VID_0BDA&PID_9210&REV_3100
"VID_0BDA" is for a Realtek product, "PID_9210" is referred to the chipset and "REV_3100" to the firmware.
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| <!--Description-->ASM1153E / ASM1153 with firmware 140509_A1_82_40 or 141126_A1_EE_82. Both supports UASP and TRIM on USB 3.1 Gen.1 adapter
| <!--Vendor ID-->0x174c
| <!--Product ID-->0x55aa
| <!--Revision-->
| <!--Opinion-->{{maybe|works with sabrent ec-uasp}}
|-
| <!--Description-->ASM235CM Ugreen aluminum bridging the USB3.2 Gen2x1 to Serial ATA host interface
| <!--Vendor ID-->0x174c
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->TI 9261
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->ASM225
| <!--Vendor ID-->0x174c
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->JMicron JMS578 issues USB 3.1 Gen.1 adapter
| <!--Vendor ID-->152d
| <!--Product ID-->0578
| <!--Revision-->
| <!--Opinion-->{{maybe|needs fixing on pi4 storage quirks}}
|-
| <!--Description-->JMicron JMS576 issues USB 3 to usb-c adapter
| <!--Vendor ID-->152d
| <!--Product ID-->0576
| <!--Revision-->
| <!--Opinion-->{{maybe|orico}}
|-
| <!--Description-->JMS562 JMicron Technology Corp
| <!--Vendor ID-->152d
| <!--Product ID-->0562
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->JMS561U
| <!--Vendor ID-->0x152d
| <!--Product ID-->0x1561
| <!--Revision-->
| <!--Opinion-->{{maybe|works with sabrent ec-uasp}}
|-
| <!--Description-->VL716Q4 Orico black meshed aluminum usb c
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Asmedia ASM1053E
| <!--Vendor ID-->0x1B21
| <!--Product ID-->0x55aa
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->ASmedia ASM1051E
| <!--Vendor ID-->0x174c
| <!--Product ID-->0x55aa
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Asmedia ASM1053
| <!--Vendor ID-->0x174C
| <!--Product ID-->0x1536
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Asmedia ASM104x
| <!--Vendor ID-->0x1B21
| <!--Product ID-->0x1042
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Unknown Chinese version
| <!--Vendor ID-->0x0bc2
| <!--Product ID-->0x2312
| <!--Revision-->
| <!--Opinion-->{{maybe|sometimes works}}
|-
| <!--Description-->JMicron N5321 gr
| <!--Vendor ID-->0x152d
| <!--Product ID-->0xa583
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Initio Corp INIC-1618L mini slimline sata 6 + 7 pins to usb2 adapter
| <!--Vendor ID-->0x13FD
| <!--Product ID-->0x0840
| <!--Revision-->0114
| <!--Opinion-->{{maybe|sometimes works mini sata to usb2 detects 201x laptop DVD as MassStorage(CD/DVD) but may need powered USB hub}}
|-
| <!--Description-->Unknown mini sata to usb3 adaptor
| <!--Vendor ID-->0x01F75
| <!--Product ID-->0x0621
| <!--Revision-->0036
| <!--Opinion-->{{maybe|sometimes works mini sata to usb3 detects 201x notebook DVD drive as MassStorage(SCSI) but 5V 1.5Amp needs powered hub to burn }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|}
=== External Floppy ===
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| <!--Description-->[http://techtravels.org/amiga/amigablog/ Amiga Floppy Project]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| {{no|no driver}}
|-
| <!--Description-->[http://amigakit.leamancomputing.com/catalog/product_info.php?products_id=842 Catweasel Mk4]
| 0xE159
| 0x0001
| 0x00
| {{yes|[http://archives.aros-exec.org/index.php?function=browse&cat=driver/storage works]}}
|-
| <!--Description-->[http://hxc2001.free.fr/floppy_drive_emulator/ HxC Floppy Emulator]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| {{no|no driver}}
|-
| <!--Description-->[http://www.softpres.org/glossary:kryoflux KyroFlux]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| {{no|no driver}}
|-
| <!--Description-->Samsung SFD-321U/EP USB Floppy
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| {{no|no driver}}
|-
| <!--Description-->[http://www.cbmstuff.com/proddetail.php?prod=SCP SuperCard Pro]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->[https://github.com/tebl/Amiga-DrawBridge Amiga-DrawBridge][https://www.facebook.com/groups/greaseweazle Greaseweazle STM hardware], [https://cowlark.com/fluxengine/index.html Greaseweasel support], [https://github.com/keirf/Greaseweazle/wiki software], [https://amigakit.amiga.store/greaseweazle-p-91279.html buy],
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->
|-
| <!--Description-->FL-2501 USB Portable Diskette Drive
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->2009 usb - [https://amiga.robsmithdev.co.uk/ Drawbridge] [https://github.com/RobSmithDev/ArduinoFloppyDiskReader software] ribbon cable compat with p/n 19308801-19 and s/n U356244 - model ASM P/N 27l4226 and FRU P/N 05k9283 -
|-
| <!--Description-->Dell Floppy Drive Module USB External 3.5" - Teac FD-05PUB 1.44mb
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->2004 usb 1.1
|-
| <!--Description-->USB FLOPPY DISK DRIVE (USB External Floppy Disk)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->[https://github.com/SukkoPera/OpenFlops OpenFlops] with [https://github.com/keirf/flashfloppy FlashFloppy] Gotech clone
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->[https://github.com/hmerrett/HenryFlops HenryFlops reworked OpenFlops]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested }}
|-
|}
==ptp.class (PTP and MTP - other cameras and mp3 players)==
=== Cameras ===
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| <!--Description-->Canon EOS 20D
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2004 }}
|-
| <!--Description-->Canon 350D (also known as the Digital Rebel XT/Kiss Digital N)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2005 DIGIC II processor 8-megapixel }}
|-
| <!--Description-->Canon PowerShot A430 A560
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2006 }}
|-
| <!--Description-->Canon EOS 400D (XTi) digital SLR
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2007 }}
|-
| <!--Description-->Canon EOS 1000D also known as Rebel XS
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2008 10.2mp 720p }}
|-
| <!--Description-->Canon 450D aka Rebel Xsi
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2008 12.2mp }}
|-
| <!--Description-->Canon PowerShot S90 S95
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2009 2010 720p video - 10Mpixel }}
|-
| <!--Description-->Canon Powershot SD960 IS Digtal ELPH
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2009 Still Image: Exif 2.2 (JPEG), Movie: MOV (Image: H.264; Audio: Linear PCM) Lithium-ion Battery Pack NB-4L }}
|-
| <!--Description-->Canon EOS 500D aka Rebel
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2009 1080p 15.1MP Lithium }}
|-
| <!--Description-->Canon EOS 550D 600D aka Rebel T2i T3i DSLR
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2010-2011 1080p 18MP Lithium LP-E8 }}
|-
| <!--Description-->Canon Powershot S100 S110 S120
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2011-2013 720p-1080p video 12.1MP and above versions - }}
|-
| <!--Description-->Canon EOS 1100D DSLR Camera aka Rebel T3 SLR, EOS Kiss X50
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2011 720p 10Mpixels Lithium }}
|-
| <!--Description-->Canon EOS 650D 700D aka Rebel T4i T5i T6i SLR
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2012-2013 1080p 18Mpixels Lithium LP-E8 articulating flip out twistable screen }}
|-
| <!--Description-->Canon ELPH 300 HS (IXUS 220 HS) 230 100
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2012 blogging camera }}
|-
| <!--Description-->Canon PowerShot N
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2013 12.1 MP CMOS, DIGIC 5 Wifi Lithium Battery Pack NB-9L }}
|-
| <!--Description-->Canon Powershot G7 X, G7X-II
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2014-2016 1080p video 12.1MP and above versions - }}
|-
| <!--Description-->Canon EOS 1300D DSLR Camera aka Rebel T6 SLR
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2016 1080p 16Mpixels Lithium }}
|-
| <!--Description-->Canon Powershot G7x G5X
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| G7X flip up and G5X flip out - same batteries - no external microphone input - }}
|-
| <!--Description-->Canon EOS M3 M5
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| flip out - same batteries - }}
|-
| <!--Description-->Canon EOS 60D 70D 80D
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Canon 6D 7D 8D
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|untested}}
|-
| <!--Description-->Canon 5D Mark II III IV DSLR
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Canon
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Canon
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Fuji FinePix A850
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->FujiFilm Finepix F100fd
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Fuji FinePix F810
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Fuji xf1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| pocketable exr cmos 12mp }}
|-
| <!--Description-->Fuji xt1 x-t1 x10 x-t10
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| 1080p }}
|-
| <!--Description-->Fujifilm x100 x100s x100t
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Fuji xPro1 xPro2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Fuji xt2 / x-t2 x-t20
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| 4K video }}
|-
| <!--Description-->Fuji
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Fuji
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|untested}}
|-
| <!--Description-->Fuji
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|untested}}
|-
| <!--Description-->GoPro HERO 3 HERO4 HERO 5
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Nikon
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Nikon D100, D60
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2004 Compact flash storage - non interchangeable lenses up to 12.3MP sensor }}
|-
| <!--Description-->Nikon D50, D50x
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2005 storage - 6.1MP sensor }}
|-
| <!--Description-->Nikon D70, D80, D90
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2006 Compact flash storage - 10MP sensor }}
|-
| <!--Description-->Nikon D40, D40x
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2007 storage - 10MP sensor }}
|-
| <!--Description-->Nikon D300, D700
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2008 storage - 12.3MP sensor }}
|-
| <!--Description-->Nikon D2Xs, D2Hs, D3
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2006-2008 storage - sensor }}
|-
| <!--Description-->Nikon D3000
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2008 720p video }}
|-
| <!--Description-->Nikon D5000
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2010 720p video unlike D3000 }}
|-
| <!--Description-->Nikon D6000
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2010 16mpixel}}
|-
| <!--Description-->Nikon D7000
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2010 16.2mp 720p video }}
|-
| <!--Description-->Nikon L26 L27 L28 L29 L31 Coolpix compact cameras
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2011 720p video - 2 AA - pocket sized }}
|-
| <!--Description-->Nikon D3100
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2011 720p video 14.2mp}}
|-
| <!--Description-->Nikon D5100 DSLR
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2011 16.2mp 720p}}
|-
| <!--Description-->Nikon L810 L820 L830
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2012-2014 720p video }}
|-
| <!--Description-->Nikon D4
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2012 storage - sensor }}
|-
| <!--Description-->Nikon D7100 D7200
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2012-2014 up to 24.2mp 1080p video }}
|-
| <!--Description-->Nikon D3200
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2012 1080p 24MPixel}}
|-
| <!--Description-->Nikon D5200 D5300
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2013 24.1MP 1080p }}
|-
| <!--Description-->Nikon D800 D600
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2014 1080p video sd card storage - dust/oil issue at start}}
|-
| <!--Description-->Nikon D3300 DSLR
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2014 24.2MP 1080p }}
|-
| <!--Description-->Nikon D500, a high-performance DX-format (APS-C) DSLR
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2016 }}
|-
| <!--Description-->Nikon D3400
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2016 24.2MP 1080p }}
|-
| <!--Description-->Nikon D5500 D5600
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2016-2018 24.1MP 1080p }}
|-
| <!--Description-->Nikon D810 D610
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2018 1080p video sd card storage }}
|-
| <!--Description-->Nikon D7300
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| 4K UHD video }}
|-
| <!--Description-->Nikon D900 D850 D820
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| 4k 46MP }}
|-
| <!--Description-->Nikon
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Nikon
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Olympus C-370
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2004 3.2mp }}
|-
| <!--Description-->Olympus Camedia C-725 Ultrazoom
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2004 3mp aa batteries, }}
|-
| <!--Description-->Olympus Evolt E-500
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2005 8mp }}
|-
| <!--Description-->Olympus
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Olympus Evolt E-410
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2007 }}
|-
| <!--Description-->Olympus Evolt E-510
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2007 10MP Live MOS sensor with TruePic III processor, }}
|-
| <!--Description-->Olympus E-420
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2008 10mp, compactflash and xD cards, }}
|-
| <!--Description-->Olympus E-520
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2008 10mp, compactflash and xD cards, }}
|-
| <!--Description-->Olympus E-620
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2009 12.3mp, compactflash, xD and microdrive cards, }}
|-
| <!--Description-->Olympus E-30
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2009 }}
|-
| <!--Description-->Olympus E-450
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2009 10mp, }}
|-
| <!--Description-->Olympus
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Olympus
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Pentax * ist DS DSLR camera
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2005 6.1mp }}
|-
| <!--Description-->Pentax K10D
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2006 10.2mp APS-C CCD no video and older manual Pentax K-mount lenses}}
|-
| <!--Description-->Pentax K20D
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2008 14.6MP APS-C but no video recording mode }}
|-
| <!--Description-->Pentax K30 K-5 II
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2012 16MP full HD (1080p) recording at 24/25/30 fps}}
|-
| <!--Description-->Pentax K-3
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2014 24MP 1080p }}
|-
| <!--Description-->Pentax K-3 II
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2015 24MP }}
|-
| <!--Description-->Pentax K-3 III
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2021 25.7MP BSI CMOS sensor }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Panasonic Lumix LZ10 LZ20 DMC-LZ30
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| 720p video }}
|-
| <!--Description-->Panasonic TZ1 TZ5 TZ9
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Panasonic Lumix GH1 GH2 like the DMC-GH2HEB-K - GH3 DMC-GH3HEB-K
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| Four Thirds (GH2) MFT Micro Four Thirds (GH3) limited to 29mins recording }}
|-
| <!--Description-->Panasonic AF series AF100 AF101 AF102
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Panasonic Lumix DMC-G2 DMC-G3 G5
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Panasonic TZ60
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Panasonic DMC LX7 10 LX15
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Panasonic GF7 GX8
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Panasonic G80 G85
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| micro 4/3 }}
|-
| <!--Description-->Panasonic GH4
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| micro 4/3 - shooting in MOV or MP4 formats recording limited to sd card size but split files because the FAT32 file system only supports files up 4GB in size, which amounts to around 5 minutes of 4K (100mbps) footage - GH4 appears to create 4GB files as a rule, regardless of whether the memory card’s file system supports larger files or not - }}
|-
| <!--Description-->Panasonic GH5 gx80 gx85
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| Effective: 20.3 Megapixel 5184 x 3888 - 2 sd card slots compatible with high-speed, high capacity UHS-II - sd card v rating like the v90 should record at 60MB/s to be compatible with the GH5 in the All-I format - possible file corruption with .mdt files - new firmware 2.0 update, the Panasonic GH5 becomes the first 5K - }}
|-
| <!--Description-->Panasonic FZ2000 FZ2500
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Panasonic
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Samsung
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Samsung WB100 WB1100 WB150 WB2200
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| 16MP }}
|-
| <!--Description-->Samsung NX11
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Samsung NX200, NX20, NX1000 and NX210
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| 20.3Mp APS-C sized CMOS image sensor }}
|-
| <!--Description-->Samsung
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Samsung
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Sanyo Xacti CG65
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Sanyo
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Sony Alpha DSLR-A100
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2005 6.1MP }}
|-
| <!--Description-->Sony Cyber-shot DSC camera models W110 W220 H300 H400
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2007 }}
|-
| <!--Description-->Sony Alpha DSLR-A200
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2008 10.2MP }}
|-
| <!--Description-->Sony Alpha DSLR-A230
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2009 10.2MP }}
|-
| <!--Description-->Sony A290 DSLR Camera
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2010 14.2MP }}
|-
| <!--Description-->Sony Cybershot HX20V HX30V
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2011 18mp 720p - steady shot unit / optical block can cause buzzing noise and/or jumping image in lcd / viewfinder - dots are dirt and this voids the warranty }}
|-
| <!--Description-->Sony Cybershot HX50V HX60V
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2012 20.2MP 1080p - steady shot unit / optical block can cause buzzing noise and/or jumping image in lcd / viewfinder - dots are dirt and this voids the warranty }}
|-
| <!--Description-->Sony A77 A99
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2012 }}
|-
| <!--Description-->Sony WX100 WX150 wx220
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2012 2014 }}
|-
| <!--Description-->Sony NEX-6 Sony NEX-7
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2011 16 to 24MP }}
|-
| <!--Description-->Sony NEX-3N Sony NEX-5N
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2013 16MP }}
|-
| <!--Description-->Sony α58 Sony α68
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2013 20.1 MP 2014 24mp }}
|-
| <!--Description-->Sony rx100 mk III
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2014 20.1MP 1.0-type back-illuminated Exmor R CMOS sensor, often after boot-up, the motor starts running for no reason for first versions' - }}
|-
| <!--Description-->Sony α5000 a5000
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2014 20.1 Megapixel APS-C Exmor APS HD CMOS 1080p Sony E-mount [https://github.com/ma1co/Sony-PMCA-RE hack] using [https://www.youtube.com/watch?v=8M4hR9HiOzM this] }}
|-
| <!--Description-->Sony α6000 a6000
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2014 24MP APS-C sensor }}
|-
| <!--Description-->Sony α7 A7S a7r a7c
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2014 mirror less - more compact }}
|-
| <!--Description-->Sony α77 II, α99 II,
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2015 24.3 MP, 2016 42.4mp }}
|-
| <!--Description-->Sony rx100 mk IV V
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2015 2016 }}
|-
| <!--Description-->Sony RX0 RX zero, RX0 II
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2015 2017 }}
|-
| <!--Description-->Sony α6500 a6500
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2016 24.2MP APS-C sensor 4K }}
|-
| <!--Description-->Sony α7 Alpha 7 II E-mount interchangeable lens mirrorless camera
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2017 24.2mp, }}
|-
| <!--Description-->Sony α7 A7Sii a7r a7c
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2018 mirror less - more compact }}
|-
| <!--Description-->Sony a7 III α77 ILCE7M3/B Full-Frame Mirrorless Interchangeable-Lens Camera
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2019 24.2mp, }}
|-
| <!--Description-->Sony ZV-1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2021 24mm optical zoom, }}
|-
| <!--Description-->Sony ZV-1F
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2022 entry-level vlogging, 1-inch 20.1MP, ultra-wide 20mm f/2 prime lens}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|}
<pre >
Lens Mounts
Canon EF EF-S
Nikon F
Panasonic
Olympus OM
Pentax DA, FA, F, A, M, and K series
Fujifilm X mount
</pre >
<pre >
Sensors
APS-C
S35
Full Frame
43 Four Thirds
M43 MFT Micro four thirds
</pre >
=== Digital Voice Recorder Dictaphone Dictation Machine Handheld ===
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->Olympus VN-7000
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested 2011 }}
|-
| <!--Description-->Olympus VN-7200
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|untested 2012 no usb }}
|-
| <!--Description-->Olympus VN-7500
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested 2012 }}
|-
| <!--Description-->Olympus VN-7600
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested 2013 }}
|-
| <!--Description-->Olympus WS-100
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested usb}}
|-
| <!--Description-->Olympus VN-7700
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->Olympus VN-8600
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->Olympus VN-711PC
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->Olympus VN-712PC
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->Olympus VN-731PC
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->Olympus
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->Olympus WS-811
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested slide out usb-a - aaa battery - ok recordings }}
|-
| <!--Description-->Olympus VN-540PC Olympus VN-541PC
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->Philips DVT1250
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->Sony
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->Sony
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->Sony
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->Sony ICD-UX470
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->Sony ICD-UX560
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->Sony ICD-UX570
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
|}
=== USB eBooks Readers drm free EPUB version 2.0.1 (2007), 3.0 (2011), 3.1 (2015) or [https://www.w3.org/TR/epub-33/ 3.3 (2024)] [https://github.com/thansen0/sample-epub-minimal epub examples] formats access ===
EPUB file format is an open standard based on XHTML for content and XML for metadata, contained in a zip file archive
PDF v2.0 in 2017, 2009 takeover by ISO Org, 1.7 in 2006 , 1.6 in 2005, 1.4 in 2001, 1.3 in 1999, 1.0 in 1993
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="5%" |Product ID
! width="5%" |Revision
! width="15%" |Access
! width="30%" |Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Barnes and Noble Nook Simple Touch NST BNRV300
| <!--Vendor ID-->0x2080
| <!--Product ID-->0x0003
| <!--Revision-->
| <!--Access-->when finding the right micro usb cable that works, internal nook memory not accessible but sd card fat32 readable and writable outside
| <!--Opinion-->{{N/A|2011 6in 600x800 e-ink 16 grayscale .jpg}} battery remove sd card and Torx T5 back top for Cameron Sino CS-BNR003SL - USA 1.2.2 md5sum 351e26527e80156183e74be2da2ce89f *nook_1_2_update.zip - 1.2.1 UK fdba3981f7f221cc5143db6329645bc2 *nook_1_2_update.zip - skip registration, Turn on the device, but do NOT start setting it up. Hold down the top right button on the front of the device and slide your finger from left to right across the top of the E Ink screen. A ‘Factory’ button should appear in the top left corner of the screen. Press it. Once in the Factory menu, hold down the top right button on the front of the device and tap the bottom right corner of the screen should now see a ‘Skip Oobe’ button. Tap that and the Nook should finally load the home screen. Poor battery management -
|-
| <!--Description-->Barnes and Noble Nook Simple Touch with Glowlight
*2012 Nook Simple Touch with GlowLight BNRV350
*2013 Nook GlowLight BNRV500
| <!--Vendor ID-->0x2080
| <!--Product ID-->0x0004 0x0007
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{N/A|2012 untested }} perform a hard reset: Turn off the nook completely, turn it on, as soon as you see the screen flash begin holding the bottom page turn buttons until the screen flashes with a message asking reset, press the 'n' key twice to start the reset - Poor battery management -
|-
| <!--Description-->Nook Glowlight 4 Plus 7.8-inch screen
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{N/A|untested }} Poor battery management -
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
*NOOK 1st Edition (2009-2018) BNRZ100
*NOOK Color (2010-2024) BNRV200
*NOOK Tablet (8GB/16GB) (2011-2024) BNTV250A / BNTV250
*NOOK HD (2012-2024) BNTV400
*NOOK HD+ (2012-2024) BNTV600
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Elonex 511EB
| <!--Vendor ID-->045e:ffff
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{N/A|2009 untested Preferences->advanced->debug device detection}}
|-
| <!--Description-->[https://jaforeck.wordpress.com/2012/08/05/ready-to-meet-viktor-navorski-gained-access-to-elonex-621ebs-terminal-52/ Elonex 621EB] eBook
| <!--Vendor ID-->0x1f85
| <!--Product ID-->0x1688
| <!--Revision-->
| <!--Access-->unlocked ootb
| <!--Opinion-->{{N/A|2010 untested usb mini charging 6" diagonal eInk Screen - 800 x 600 pixels, 8 Level 166dpi Paperlike screen, Embedded 1GB Flash NAND, full SD Card Slot up to 16GB - WAV, MP3, JPG, PNG, BMP, GIF support and ePub and PDF(with reflow) (TXT, HTML) support}}
|-
| <!--Description-->Elonex 700eb
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{N/A|2011 untested adjust screen blanking by menu then settings then device standby, you can then turn it off}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->iRiver Story HD eBook
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{N/A|untested }} freescale imx.508 arm mcimx508cvkbb cpu with 2gb samsung nand, m13892aj charging chip, eb07_main_mp1_110321 mobo, mini usb, atheros ar61026 wifi -
|-
| <!--Description-->iRiver Story
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Kobo Rakuten Touch A/B kobo3
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Kobo Touch C, Kobo Mini, Kobo Glo N613, Kobo Aura HD N514 N204 kobo4
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Kobo Aura, Kobo Aura H2O, kobo5
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{N/A|2013 6in untested }}
|-
| <!--Description-->Kobo Aura H2O Edition 2 v1, Kobo Glo HD, Kobo Touch 2.0, Kobo Aura ONE N709, Kobo Aura ONE Limited Edition, Kobo Aura Edition 2 v1 N236, kobo6
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Kobo Aura H2O Edition 2 v2, Kobo Aura Edition 2 v2, Kobo Nia, Kobo Clara HD, Kobo Forma, Kobo Libra H2O kobo7
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->Kobo Elipsa, Kobo Sage kobo8
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
*Kobo Libra 2 kobo9, Kobo Clara 2E kobo10, Kobo Elipsa 2E kobo11
*Kobo Libra Colour kobo13, Kobo Clara BW, Kobo Clara Colour kobo12
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Pandigital Personal eReader aka? Papyre 6.2 very similar to BQ Avant Firmware
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk|2011 }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Sony PRS 300
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Sony PRS 350
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{N/A|2009 epub bbeb cbz untested }}
|-
| <!--Description-->Sony PRS-650
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Kindle K1 D00111 - Main Menu=: Settings: Menu=: Device Info shows S/N
| <!--Vendor ID-->0x1949
| <!--Product ID-->0x0002
| <!--Revision-->100
| <!--Access-->256mb
| <!--Opinion-->{{N/A|2007 untested Marvell Xscale PXA255}}
|-
| <!--Description-->Kindle K2, D00511 170-1012-00, D00701 D00801 S11S01B
* k2 means K2 US
* k2i means K2 GW
* dx means KDX US
* dxi means KDX GW
* dxg means KDX Graphite
| <!--Vendor ID-->0x1949
| <!--Product ID-->0x0003
| <!--Revision-->100
| <!--Access-->2gb unless jb
| <!--Opinion-->{{N/A|2010 untested Freescale i.MX31 }} the Kindle is a small computer running Linux 2.6 on an ARM processor
|-
| <!--Description-->AMAZON Kindle D00901 3rd Gen with keyboard - Menu, Settings for S/N and then Menu again to choose Update
* S/N starts B006 means k3g aka K3 3G US
* S/N starts B008 means k3w aka K3 WiFi
* S/N starts B00A means k3gb aka K3 3G UK EU
- debug mode with ;debugON and ~help
| <!--Vendor ID-->0x1949
| <!--Product ID-->0x0004
| <!--Revision-->100
| <!--Access-->{{yes|4Gb internal no access until jailbroken JB}}
| <!--Opinion-->2010 with mobi and azw3 formats only - micro usb 5v 0.85a - freescale i.mx35 ARM soc with 12bit parallel interface with epson e-ink cpu, 256MB synchronous dynamic RAM, 4GB eMMC internal memory only but no sd slot, MC13892 PMIC - atheros wifi 54mbit pci-e a e keyed wifi - ?? later models wm96103 audio codec - display has 2Mbit serial memory ic on ribbon cable with 4bpp inverse grayscale display not touchscreen - 3g module - screen replacement really annoying - 4 test points near T07 = TX RX GND ? - as of 2025, JB v0.13.N, MKK2014, MKK2025, KUAL, KoReader Legacy2025, and maybe later SS v0.47.N, Python 0.14.N, Fonts v5.16.N, USBNet v0.57.N - USB-downloader mode when Vol+ is pressed during startup - Shift + Alt + M for Minesweeper -
|-
| <!--Description-->Amazon Kindle 4th Generation k4 D01100 two buttons, square movement and two buttons at bottom
*B00E
plastic back clipped in [https://www.youtube.com/watch?v=LV1dyNkjjro many places] and strongly taped down to battery cover
| <!--Vendor ID-->0x1949
| <!--Product ID-->0x0005
| <!--Revision-->100
| <!--Access-->2gb unless jb with USB MS, USBMS aka also known as USB MSC or UMS
| <!--Opinion-->{{unk|2012 once back off use Torx T5 to remove battery cover screws - battery glued down S2011-001-A 515-1058-01 DR-A015 MC-265360 - Freescale i.MX508 SOC, 2Gb eMMC storage, 256MiB of LPDDR1, MC13892 PMIC - vendor modified u-boot imximage based on u-boot v2009.08 - USB-downloader mode press the fiveway down button during startup resetmykindle - as of 2025 upgrade firmware from 4.1.x and to 4.1.4, sign into account and copy jb.1.8 bits, mkk-2014, mkk-2025, kual and then uninstall kual, koreader2025 - }}
|-
| <!--Description-->Kindle Touch WiFi (Kindle 5th Gen) D01200 K5, KT
*Once signed into an Amazon Account get S/N under Settings -> Device Options
*B00F Kindle Touch 3G + WiFi (Kindle 5) (U.S. and Canada) [Mostly]
*B011 Kindle Touch WiFi (Kindle 5)
*B010 Kindle Touch 3G + WiFi (Kindle 5) (Europe)
| <!--Vendor ID-->0x1949
| <!--Product ID-->0x0006
| <!--Revision-->100
| <!--Access-->4gb unless jb
| <!--Opinion-->{{unk|2013 touchscreen i.MX508 SOC, 256MiB of LPDDR1 and USB-downloader mode by the SOC microcode when a specific key is pressed during startup: the home button on model D01200 - update firmware 5.3.2 to 5.3.7.3, access account, }}
|-
| <!--Description-->Kindle PaperWhite 3G + WiFi (U.S.) [Mostly] PW
<pre>
B024 Kindle PaperWhite WiFi
B01B Kindle PaperWhite 3G + WiFi (U.S.) [Mostly]
B020 Kindle PaperWhite 3G + WiFi (Brazil)
B01C Kindle PaperWhite 3G + WiFi (Canada)
B01D Kindle PaperWhite 3G + WiFi (Europe)
B01F Kindle PaperWhite 3G + WiFi (Japan)
</pre>
| <!--Vendor ID-->0x1949
| <!--Product ID-->0x0007
| <!--Revision-->100
| <!--Access-->2gb
| <!--Opinion-->{{unk|2013 Freescale i.MX508 }}
|-
| <!--Description-->
| <!--Vendor ID-->0x1949
| <!--Product ID-->0x0008
| <!--Revision-->100
| <!--Access-->2gb
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Kindle PaperWhite 2 (2013) PW2
*B0D4, 90D4 WiFi (U.S., Intl.)
*B05A, 905A WiFi (Japan)
*B0D5, 90D5 3G + WiFi (U.S.) [Mostly]
*B0D6, 90D6 3G + WiFi (Canada]
*B0D7, 90D7 3G + WiFi (Europe)
*B0D8, 90D8 3G + WiFi (Russia)
*B0F2, 90F2 3G + WiFi (Japan)
*B017, 9017 WiFi (4GB) (U.S., Intl.)
*B060, 9060 3G + WiFi (4GB) (Europe)
*B062, 9062 3G + WiFi (4GB) (U.S.) [Mostly]
*B05F, 905F 3G + WiFi (4GB) (Canada)
*B061, 9061 3G + WiFi (4GB) (Brazil)
| <!--Vendor ID-->0x1949
| <!--Product ID-->0x0009
| <!--Revision-->100
| <!--Access-->2gb or 4gb
| <!--Opinion-->{{unk| PW2 uses Freescale/NXP i.MX6 SoloLite }}
|-
| <!--Description-->Kindle Paperwhite 3 PW3 i.e. Kindle 7th gen
*G090G1 (2015) WiFi
*G090G2 (2015) 3G + WiFi (U.S.) [Mostly]
*G090G4 (2015) 3G + WiFi (Mexico)
*G090G5 (2015) 3G + WiFi (Europe, Australia)
*G090G6 (2015) 3G + WiFi (Canada)
*G090G7 (2015) 3G + WiFi (Japan)
*G090KB (2015) WiFi
*G090KC (2015) 3G + WiFi (Japan)
*G090KE (2016) 3G + WiFi (International) White
*G090KF (2016) 3G + WiFi (International) White
*G090LK (2016) WiFi, 32GB (Japan)
*G090LL (2016) WiFi, 32GB (Japan) White
| <!--Vendor ID-->0x1949
| <!--Product ID-->0x000A
| <!--Revision-->100
| <!--Access-->4gb
| <!--Opinion-->{{unk| ease up glued down front bezel rim panel gently, remove 11 screws underneath and lift screen up from bottom end - battery underneath - }}
|-
| <!--Description-->Kindle PaperWhite 4 (2018) PW4
*G000PP, G8S0PP WiFi, 8GB
*G000T6, G8S0T6 WiFi, 32GB
*G000T1 WiFi+4G, 32GB
*G000T2 WiFi+4G, 32GB (Europe)
*G00102 WiFi, 8GB (India)
*G000T3 WiFi+4G, 32GB (Japan)
*G0016T, G8S16T WiFi, 8GB Twilight Blue
*G0016Q, G8S16Q WiFi, 32GB Twilight Blue
*G0016U WiFi, 8GB Plum
*G0016V, G8S16V WiFi, 8GB Sage
*G00103 WiFi, 32GB (India)
*G0016R WiFi, 32GB Plum
*G0016S WiFi, 32GB Sage
| <!--Vendor ID-->0x1949
| <!--Product ID-->0x000B
| <!--Revision-->100
| <!--Access-->8gb or 32gb
| <!--Opinion-->{{unk| Freescale/NXP i.MX6 SoloLite }}
|-
| <!--Description-->Kindle Oasis 2 and 3
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->8gb or 32gb
| <!--Opinion-->{{unk| NXP i.MX7D }}
|-
| <!--Description-->Kindle Paperwhite 5
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->8gb or 16gb
| <!--Opinion-->{{unk| MediaTek MT8110 }}
|-
| <!--Description-->Kindle 11 Scribe
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->8gb or 16gb
| <!--Opinion-->{{unk| MediaTek MT8113 }}
|-
| <!--Description-->Kindle Paperwhite 6
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->16gb or 32gb
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Kindle Paperwhite Gen 11 and 12 - Signature
| <!--Vendor ID-->0x1949
| <!--Product ID-->0x0
| <!--Revision-->
| <!--Access-->16Gb or 32Gb
| <!--Opinion-->{{unk|2024 account not blocked, }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->[https://github.com/Modos-Labs Modos Labs] open source e-ink 60Hz 75Hz caster controller and glider monitor
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Xteink X3
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->[https://www.xteink.com Xteink X4]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->2025 4.3in 220ppi no touchscreen so [https://www.youtube.com/watch?v=R7RuokaVauo buttons navigation] - 650mAh battery - micro-sd slot up to 512Gb covering epub, txt, and jpg in directories with [https://github.com/crosspoint-reader crosspoint reader] esp32 cpu custom rom firmware using [https://xteink.dve.al/ Flash website] on usb-c but no ecosystem store
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|}
{| class="wikitable sortable" width="90%"
! width="15%" | Description
! width="5%" |Vendor ID
! width="5%" |Product ID
! width="5%" |Revision
! width="15%" |Access
! width="30%" |Opinion
|-
| <!--Description-->Amazon D01400 Kindle Fire (1st Generation)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{No|2010 too old }} android 2.3 and touchscreen digitizer fails often, battery SWE P/N 1002000004742 Model KC1 (EU) QP01 (US) 16.28whr, ti 257epl9l omap 4430 with elpida 88164b3pf-10-f88164b3pf or hynix, mobo ??,, DAOKC1MB8F0 Rev F, ti aic3110 audio codec,
|-
| <!--Description-->Amazon Fire 7in X43260 X43Z60 2nd Gen
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk|2012 untested FireOS Android 4 omap 4460 and PowerVR SGX540}}
|-
| <!--Description-->Amazon Kindle Fire HD (3rd Gen) P48WVB4
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk|2013 untested }}
|-
| <!--Description-->Amazon
*Amazon Fire HD10 (2015)
*Amazon Fire HD8 (2015)
*Amazon Fire HD7 (2015) (5th Generation) 7 inch 8GB SV98LN
*Amazon Fire HD7 (2014)
*Amazon Fire HD6 (2014)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk|untested android 5.1 max}}
|-
| <!--Description-->
*Amazon Fire 10 (2017)
*Amazon Fire 8 (2017) 7th Gen 8 inch SX034OT
*Amazon Fire 7 (2017) (7th Generation) 7 inch 16GB (SR043KL)
*Amazon Kindle Fire 7 (7th Generation) 7 inch 8GB WIFI Tablet (SR043KL)
*Amazon Fire HD8 (2016)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| Android 5.1 max 7in screen resolution of 1024 x 600, }}
|-
| <!--Description-->
*Amazon Fire 10/10+ (2021)
*Amazon Fire 8/8+ (2020)
*Amazon Fire 10 (2019)
*Amazon Fire 7 (2019)
*Amazon Kindle Fire 7 9th Gen 16GB M8S26G
*Amazon Fire 8 (2018) 8th Gen 8 inch 32GB L5S83A
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| android 9 max}}
|-
| <!--Description-->Amazon
*Amazon Fire HD 10 (2023)
*Amazon Fire Max 11 (2023)
*Amazon Fire 8 (2022)
*Amazon Fire 7 (2022)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| android 11 max}}
|-
| <!--Description-->Amazon Kindle Scribe
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk|2025 }}
|-
| <!--Description-->Amazon
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Minimal Phone, Mudita Kompakt
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| eink }}
|-
| <!--Description-->Bigme B751C
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{N/A|2022 android untested }}
|-
| <!--Description-->Bigme B7 Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk|2025 }}
|-
| <!--Description-->Bigme B6
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk|2025 android based color eink small - 300dpi b/w 150ppi color -}}
|-
| <!--Description-->Bigme
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| e-ink }}
|-
| <!--Description-->Bigme Hibreak Pro, Hisense A9
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| e-ink}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->iFlyTech AINote
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk|2024 }}
|-
| <!--Description-->iFlyTech AINote 2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk|2026 }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Meebook
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Onyx Boox Page Palma
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk|2016 android untested }}
|-
| <!--Description-->Onyx Boox Leaf3C
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Onyx Boox Go Color 7
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk|2023 untested 7in e-ink e-reader android tablet }}
|-
| <!--Description-->Onyx BooxTab Ultra X C
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Onyx Boox Note Max Air4 C
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Onyx Boox Leaf5C
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Onyx Boox Poke6S
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Onyx Boox Go 10.3
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Onyx Boox MC
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| color e-ink 13.3in }}
|-
| <!--Description-->Onyx Boox Go 10.3 (Gen 2) Lumi
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk|2026 b/w eink with front light, no EMR annd capacitance pen, }}
|-
| <!--Description-->Onyx Moaan Pantone 6
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->reMarkable 1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{N/A|2021 untested but subscriptions needed for some features }}
|-
| <!--Description-->reMarkable 2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{N/A|2023 untested but subscriptions needed for some features }}
|-
| <!--Description-->reMarkable Paper Pro Move
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{N/A|2024 untested but subscriptions needed for some features }}
|-
| <!--Description-->reMarkable 3
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk|2026 untested but subscriptions needed for some features}}
|-
| <!--Description-->reMarkable
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Supernote A5 X2 Manta
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk|2022 }}
|-
| <!--Description-->Supernote A6 X2 Nomad
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk|2023 }}
|-
| <!--Description-->Supernote
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Tolino Vision 2 3 4
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Tolino Epos2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Viwoods AI Paper and AI Paper Mini
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Access-->
| <!--Opinion-->{{unk| }}
|}
==printer.class==
As the only printer driver that AROS supports natively is Postscript, our focus is on applications that generally output postscript formatted data for printing purposes.
There has been an attempt at recent AirPrint support
*Inkjet
*Laser
Start simple and then test every higher level...
* can if you ping your printer (the IP addy is good)?
* set up LPR/IPP to talk to that known good IP address.
* see if you can copy a few words of plain ASCII text to the IPP/LPR device (do you have a connection)?
* see if you can find a simple postscript file and then copy it to the IPP/LPR device.
* see if you can set up to print directly to the IPP/LPR device (set "Output file" to PRT: or LPR:).
* see if you can set up a PS printer config to the IPP/LPR device.
* go back and try the tests with the other driver (LPR or IPP).
See [http://www.irseesoft.de/tp_drive7.htm here] for compatibility with TP7 (TurboPrint 7) Last update 2004. Not tested under emulation. Janus-UAE, Emumiga, Amiberry etc
usbparallel.device
untested with USB->Centronics - The printer.class is rather 'clever'. It remembers to which unit the printers were connected (until you reboot). So if you first plug in Printer1, it gets unit 0, and Printer2 gets unit 1. If you now remove both printers and replug Printer2, it still will get unit 1 and not 0. This is used not to confuse the programs using the different units (moreover, if some program uses the usbparallel.device unit of an USB printer, and the printer is unplugged, the device unit cannot be freed immediately as the application still keeps it open).
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| Beige cream D shape centronics end (Prolific chipset?)
|
|
|
| {{N/A|untested}}
|-
| Belkin F5U002v1 centronics end (chipset?)
|
|
|
| {{N/A|untested}}
|-
| Belkin F5U002VEA v2 centronics end (Prolific PL2305L chipset)
|
|
|
| {{N/A|untested}}
|-
| DYNAMODE USB-C-PP-1284 USB to 36pin (Prolific 2305 chipset)
| 0x067b
| 0x2305
| 0x02
| {{N/A|untested but similar to BAFO below}}
|-
| IOGear GUC1284B
|
|
|
| {{N/A|untested}}
|-
| My-Link (raised ellipse on centronics plastic end) (unknown chipset)
|
|
|
| {{N/A|untested but more expensive }}
|-
| NEWLink (Prolific chipset?)
|
|
|
| {{N/A|untested}}
|-
| Targus PA096E centronics end (chipset?)
|
|
|
| {{N/A|untested}}
|-
| TRENDnet ware TU-P1284
|
|
|
| {{N/A|untested}}
|-
| True PnP (Prolific chipset 2305) cheap 36pin Centronics (series of ridges along both short sides)
| 0x067b
| 0x2305
| 2.00
| {{N/A|untested on BAFO BF-1284 but reports of poor quality and lack of support on other OSs }}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| Transparent See Through Blue
|
|
|
| {{N/A|untested but possible poor quality build }}
|-
| Dynamode USB-PARALLEL 25pin female (prolific)
| 0x067b
| 0x2305
| 0x02
| {{N/A|untested}}
|-
| FDL USB to 25pin
|
|
|
| {{N/A|untested}}
|-
| PlusKom USB to 25pin female connector for printer (IEEE 1284)
|
|
|
| {{N/A|untested}}
|-
| QinHeng Electronics (CH340S chipset)
| 0x1a86
| 0x7584
|
| {{N/A|untested curvy sides - flat top }}
|-
| StarTech
|
|
|
| {{N/A|untested}}
|-
| Syba SD-USB-DB25
|
|
|
| {{N/A|untested}}
|-
|}
Postscript interpreters (eg ghostscript) have been developed as a cheaper option which sit in between postscript data streams and non postscript printers.
Ghostscript has internal printer drivers
gs -h
and with something like
gs -sDEVICE=stcolor -r300 -sOutputFile=RAM:tempfile gs813:examples/tiger.ps
copytopar ram:tempfile
It checks if in RAM: exists a outputfile (Cinnamon can export to PS postscript) then it sends this via copytopar to the printer. There was only support for parport (parallel) but Terminillis added support for USB and ethernet. A big issue with using ghostscript for drivers is that data has to originate as postscript (.PS) file.
gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=ljet4 -sOutputFile=RAM:tempfile RAM:file.pdf
the ljet4 output device generates PCL
also the pxlmono driver, which generates more generic PXL (PCL 6)
gs -q -sstdout=%stderr -sDEVICE=pswrite -sOutputFile=- -dBATCH -dNOPAUSE -dPARANOIDSAFER testpage-a4.ps > test.pdf
gs -q -sstdout=%stderr -sDEVICE=pxlmono -sOutputFile=- -dBATCH -dNOPAUSE -dPARANOIDSAFER test.pdf > test.pxl
Printers supported by ghostscript...Explanation [http://freebooks.by.ru/view/RedHatLinux6Unleashed/rhl6u151.htm here] or [http://www.gnu.org/software/ghostscript/devices.html here] and [http://pages.cs.wisc.edu/~ghost/doc/printer.htm here]
<pre>
bit cljet5 ljet4d pjxl300 pxlcolor
bitcmyk cljet5c ljetplus pkm pxlmono
bitrgb deskjet nullpage pkmraw stp
bj10e djet500 pbm pksm tiff12nc
bj200 epswrite pbmraw pksmraw tiff24nc
bjc600 faxg3 pcx16 png16 tiffcrle
bjc800 faxg32d pcx24b png16m tiffg3
bmp16 faxg4 pcx256 png256 tiffg32d
bmp16m ijs pcxcmyk pnggray tiffg4
bmp256 jpeg pcxgray pngmono tifflzw
bmp32b jpeggray pcxmono pnm tiffpack
bmpgray laserjet pdfwrite pnmraw uniprint
bmpmono lj5gray pgm ppm x11
bmpsep1 lj5mono pgmraw ppmraw x11alpha
bmpsep8 ljet2p pgnm psgray x11cmyk
cdeskjet ljet3 pgnmraw psmono x11gray2
cdj550 ljet3d pj psrgb x11gray4
cdjcolor ljet4 pjxl pswrite x11mono
cdjmono
</pre>
==rawwrap.class - some old flatbed scanners supported==
Scandal is the MUI frontend to [http://www.ppa.pl/bugtracker/ Betascan Bugtracker] and [http://aminet.net/search?query=betascan Search for Betascan scanner drivers] derived from [http://www.sane-project.org/sane-backends.html sane backends]
[http://www.sane-project.org/sane-backends.html#S-EPSON2 Epson2]
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| Expression 1600 1640XL 1680 10000XL
| 0x04b8
| 0x0107
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| Prefection 1200U, 1200 Photo,
| 0x04b8
| 0x0104
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| Perfection 1240U
| 0x04b8
| 0x010b
| <!--Revision-->
| <!--Opinion-->{{[https://amigaworld.net/modules/newbb/viewtopic.php?topic_id=45760&forum=25 works]|Needs 24V 0.8A psu but in Trident, click on "Classes", then on "rawwrap.class", then on "Configure". There, under "Global", activate the Option "Bind to Vendor/Unknown Interfaces". Now go to the second tab "Default Interface" and select/enter these values:
Default usbraw.device Unit: 0
Exclusive access: Yes
Out NAK Timeout: 20000ms
In NAK Timeout: 20000ms
In Buffer Mode: No buffering
Buffer Size: 36 KB
Short Reads Terminate: Yes
Now click on "Use as Default" and select "Devices" on the left. There, click on your scanner and click on "Class Scan". Now close Trident by clicking on "Save". }}
|-
| Perfection 1640SU Photo
| 0x04b8
| 0x010a
| 0x0104
| {{yes|works, even the transparency unit}}
|-
| Perfection 1650 Photo, 1660 Photo, 3200 Photo
| 0x04b8
| 0x011c
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| Perfection 2400 Photo, 2450 Photo
| 0x04b8
| 0x011b
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| Perfection 4870 Photo, 4990 Photo,
| 0x04b8
| 0x0128
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| Perfection V700 V750 Photo
| 0x04b8
| 0x012c
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| Stylus CX2800 2900 3200 3500 3600 3650 3700 3800 3900
Stylus CX4100 4200 3500 4600 4700 4800 4900 500 5100 5200 5300 5400 5900
| 0x04b8
| 0x0802
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| Stylus Office BX300F USB
| 0x04b8
| 0x0848
|
| {{yes| works with good scan quality}}
|-
|}
[http://www.meier-geinitz.de/sane/gt68xx-backend/ gt68xx] scanners based on the Grandtech GT-6801 and GT-6816 "System-On-Chip" scanner chipsets
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| Artec Ultima 2000 and e+, Trust Flat Scan USB 19200 (ePlus2k.usb / Gt680xfw.usb)
| 0x05d8
| 0x4002
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| Genius Colorpage Vivid3x 4x 1200x
| 0x0458
| 0x2011 to 0x201f
| <!--Revision-->
| <!--Opinion-->{{unk| (ccd548.fw)}}
|-
| <!--Description-->Lexmark X70 also X73 [http://subfusion.net/drivers/oslo3071b2.usb OSLO3071b2.usb]
| <!--Vendor ID-->0x043d
| <!--Product ID-->0x002d
| <!--Revision-->
| <!--Opinion-->
|-
| <!--Description-->Medion/Lifetec/Tevion/Cytron MD/LT 9375 and Artec Ultima 2000, MD LT 9385 Gt680xfw.usb
| <!--Vendor ID-->0x05d8
| <!--Product ID-->0x4002
| <!--Revision-->
| <!--Opinion-->
|-
| BearPaw 2448 CS and TA Plus [http://www.meier-geinitz.de/sane/gt68xx-backend/firmware/A2Nfw.usb A2Nfw.usb]
| 0x055f
| 0x021a
| <!--Revision-->
| <!--Opinion-->{{unk|2009 }}
|-
| Mustek BearPaw 1200 CS
| 0x055f
| 0x021e
| <!--Revision-->
| <!--Opinion-->{{unk| ([http://www.meier-geinitz.de/sane/gt68xx-backend/firmware/A1fw.usb A1fw.usb])}}
|-
| <!--Description-->Mustek 1200 CU Plus Scanner [http://www.meier-geinitz.de/sane/gt68xx-backend PS1Dfw.usb / SBSfw.usb]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2000 }}
|-
| Mustek ScanExpress 1200 UB plus, Trust Compact Scan USB 19200, ScanMagic 1200 UB Plus
| 0x05d8
| 0x4002
| <!--Revision-->
| <!--Opinion-->{{unk| ([http://www.meier-geinitz.de/sane/gt68xx-backend/firmware/sbfw.usb sbfw.usb])}}
|-
| Mustek ScanExpress 1248 UB aka PC-World PC Line PCL-3000
| 0x055f
| 0x021f
| <!--Revision-->
| <!--Opinion-->{{unk| ([http://www.meier-geinitz.de/sane/gt68xx-backend/firmware/SBSfw.usb SBSfw.usb])}}
|-
| Mustek BearPaw 2400CS TA aka Goodmans GSC 12/24
| 0x055f
| 0x0218
| <!--Revision-->
| <!--Opinion-->{{unk| (Transparency adapter untested) }}
|-
| BearPaw 2400 CS aka TA Plus
| 0x055f
| 0x0219
| <!--Revision-->
| <!--Opinion-->{{unk| (Transparency adapter) }}
|-
| Packard Bell Diamond 1200 Plus
| 0x055f
| 0x021c or 0x021b
| 0x0
| {{yes|works - [http://www.meier-geinitz.de/sane/gt68xx-backend/ firmware required] but slow usb 1.1 speed with poor quality output (scanner fault not scandal)}}
|-
| Packard Bell Diamond 2400 Plus aka BearPaw 2400 CU Plus [http://www.meier-geinitz.de/sane/gt68xx-backend/ PS2Dfw2.usb firmware rename to PS2Dfw.usb]
| 0x055f
| 0x021d
| 1.00
| {{yes|works slow usb 1.1 speed with ok quality output (scanner fault not scandal)}}
|-
| Plustek OpticPro 1248U
| 0x07B3
| 0x0400 0x0401
| <!--Revision-->
| <!--Opinion-->{{unk| (ccd548.fw)}}
|-
| Plustek OpticSlim 2400
| 0x07b3
| 0x0422
| <!--Revision-->
| <!--Opinion-->{{unk| (cis3R5B1.fw)}}
|-
| Visioneer OneTouch 7300
| 0x04a7
| 0x0444
| <!--Revision-->
| <!--Opinion-->{{unk| (Cis3r5b1.fw)}}
|-
| <!--Description-->Mustek ScanEpress 1200 UB (Plus) clone [http://www.meier-geinitz.de/sane/ use mustek_usb backend]
| <!--Vendor ID-->0x055f
| <!--Product ID-->0x0006
| <!--Revision-->
| <!--Opinion-->{{no| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
|}
Lexmark - needs testing
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| Lexmark X1110
|
|
|
| {{N/A|untested}}
|-
| Lexmark X1140
|
|
|
| {{N/A|untested}}
|-
| Lexmark X1150
|
|
|
| {{N/A|untested}}
|-
| Lexmark X1170
|
|
|
| {{N/A|untested}}
|-
| Lexmark X1180
|
|
|
| {{N/A|untested}}
|-
| Lexmark X1185
| 0x043d
| 0x007c
|
| {{N/A|untested}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| Lexmark X12xx
|
|
|
| {{N/A|untested in USB1.1, not fully tested in USB2.0}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| Dell A920
|
|
|
| {{N/A|untested}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
|}
HP - no driver
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| HP ScanJet 4100C
| 0x03f0
| 0x0101
|
| {{no|no driver}}
|-
| HP ScanJet 5200C
| 0x03f0
| 0x0401
|
| {{no|no driver}}
|-
| HP ScanJet 62X0C
| 0x03f0
| 0x0201
|
| {{no|no driver}}
|-
| HP ScanJet 63X0C
| 0x03f0
| 0x0601
|
| {{no|no driver}}
|-
| HP
| 0x03f0
| 0x0102, 0x0105, 0x0205, 0x0305, 0x0405
|
| {{no|no driver}}
|-
| HP
| 0x03f0
| 0x0705, 0x0805, 0x0901, 0x0a01
|
| {{no|no driver}}
|-
| HP
| 0x03f0
| 0x1205, 0x1305, 0x2005, 0x2205
|
| {{no|no driver}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
|}
Plustek [http://www.sane-project.org/sane-backends.html#S-PLUSTEK LM983x] - no driver
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| Plustek OticPro U12 UT12 UT16 U24 UT24
| 0x07B3
| 0x0010 to 0x0017
|
| {{no|no driver}}
|-
| KYE/Genius Colorpage HR6-V2 HR6A HR7 HR7LE HR6X
| 0x0458
| 0x2008 to 0x2016
|
| {{no|no driver}}
|-
| Hewlett-Packard ScanJet 2100C and 2200C
| 0x03F0
| 0x0505 and 0x0605
|
| {{no|no driver}}
|-
| Mustek BearPaw 1200 and 2400
| 0x0400
| 0x1000 and 0x1001
|
| {{no|no driver}}
|-
| UMAX 3400/3450 and 5400
| 0x1606
| 0x0050, 0x0060 and 0x0160
|
| {{no|no driver}}
|-
| Epson Perfection 1250 and 1260
| 0x04B8
| 0x010f and 0x011d
|
| {{no|no driver}}
|-
| CANON CanoScan N650/656U N1220U D660U N670/676U N1240U LIDE20 LIDE25 LIDE30
| 0x04A9
| 0x2206 to 0x2220
|
| {{no|no driver}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|}
[http://snapscan.sourceforge.net/ SnapScan] - no driver
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| Acer Benq 310U, 320U, 340U
| 0x4a5
| 0x0
|
| {{no|no driver}}
|-
| Acer Benq 620U, 620UT, 640U, 640UT
| 0x4a5
| 0x20
|
| {{no|no driver}}
|-
| Acer Benq 1240 3300 4300
| 0x4a5
| 0x020
|
| {{no|no driver}}
|-
| Agfa SnapScan e10 e20 e25 e26 e40 e42 e50 e52
| 0x06bd
| 0x20
|
| {{no|no driver}}
|-
| Epson Perfection 660
| 0x04b8
| 0x0114
|
| {{no|no driver}}
|-
| Epson Perfection 1270 1670
| 0x04b8
| 0x0
|
| {{no|no driver}}
|-
| Epson Perfection 2480 2580
| 0x04b8
| 0x0
|
| {{no|no driver}}
|-
| Epson Perfection 3490 3590
| 0x04b8
| 0x0
|
| {{no|no driver}}
|-
| Mitsubishi
| 0x0
| 0x0
|
| {{no|no driver}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
|}
==hub.class (self-powered and external ac powered hubs)==
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| <!--Description-->Dynamode USB-H41 4 ports
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| Belkin 4 Port
|
|
|
| {{yes|works}}
|-
| Conrad
|
|
|
| {{yes|[http://www.a1k.org/forum/showthread.php?t=11432 works on a1k forum] }}
|-
| DLink DUB-H4 AC Adapter
| 0x05e3
| 0x0608
| High 0200
| {{maybe|WARNING Genesys Logic Hub Broken - Will cause failures with USB}}
|-
| [http://service.targa.co.uk/faq.php?lang_id=2&baseid=178&artdesc=SilverCrest+USB+Hub+2040&artid=760&artpic=silvercrestHUB2040.jpg SilverCrest 4-port slim USB 2.0 HUB - HUB2040 (40775) - Targa GmbH]
| 0x05e3
| 0x0608
| 0901
| {{yes|works Genesys Logic, Inc., [http://service.targa.co.uk/dokumente/USB_HUB_2040_0109_manual_EN.pdf Manual]}}
|-
| Skymaster
| 0x05e3
| 0x0605
| 060B
| {{yes|works}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| No Name active 4-port
| 0x1a40
| 0x0101
| 0111
| {{yes|works}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->
|-
| <!--Description-->Thinkpad USB 3.0 Dock DU9019D1
| <!--Vendor ID-->0x17e9
| <!--Product ID-->0x4302
| <!--Revision-->0014
| <!--Opinion-->{{Maybe|works a bit}} classed as dfu.class with two further USB 2.0 hubs - USB 3.0 ports detected and work (2.0 backwards compatibility) - DisplayLink DL-3900 with VIA VL811 chipset - usb ethernet not working - two dvi not working - 20V psu 2a (40w) with a 5.5 - 2.5mm tip (no bus power) - data through a-b printer/scanner usb lead -
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->
|-
|}
==Internet==
===rndis.class USB Tethering ===
The rndis class provides support for Ethernet access over Remote NDIS. Most USB based devices should be supported including smartfones.
Before opening Network Prefs, activate USB Tethering on the Smartfon, on Network prefs, type in usbrndis.device and tick "Start Network during system boot" and saved the configuration, the Connection is immediate no reboot is needed.
When restart AROS my Smartphone deactivates the connection and to access the network again, have to reactivate it before starting the browser.
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| <!--Description-->Alcatel
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{yes|untested}}
|-
| Huawei U8800
| 0x12d1
| 0x1039
|
| {{yes|works}}
|-
| <!--Description-->Huawei
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{yes|untested}}
|-
| HTC (Android phone)
| 0x0bb4
| 0x0ffe
|
| {{Yes|any android phone with usb tethering option}}
|-
| <!--Description-->Nokia
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{yes|untested}}
|-
| <!--Description-->Oppo
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{yes|untested}}
|-
| <!--Description-->Samsung Galaxy
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{yes|untested}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
|-
| <!--Description-->iPhone
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Microsoft winPhone
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|}
===USB → ethernet lan adaptor===
*2002 playstation 2 usb1.1 era - a little support but very old and slow
*2006 wii asix era - a little support but very much miss than hit
*2026 usb0: or eth0: of CDC Ethernet protocol (cdcether) with Ethernet Control Model (ECM) and [https://www.usb.org/document-library/class-definitions-communication-devices-12 others like Wireless Mobile Communication Devices WMC] and later CDC EEM (Ethernet Emulation Model) and NCM (Network Control Model) are USB Communication Device Class (CDC) protocols packing more Ethernet traffic over every USB bundle. For CDC Ethernet - NCM is better than EEM is better than ECM
* USB1.1 Up to 010 meg broadband (1.25MBytes/s) - ADM8511, DM9601 poor speeds
* USB2.0 Up to 400 meg broadband (60MBytes/s) - MCS7830, AX88772 a little especially the 2010 apple version but buy many as very very poor odds of working one
* USB3.0 Over 400 meg broadband (60+MBytes/s) - not supported at the moment
SANA (Standard Amiga Network Architecture) to usb
ADMtek Infineon ADM8511 Pegasus II (USB 1.1 and 10Mbit/s - Sony PlayStation 2 network adapter)
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="5%" |Product ID
! width="5%" |Revision
! width="50%" |Opinion
|-
| 3Com 3c460b
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2001 }}
|-
| Abocom UFE1000 / Abocom DSB650TX
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| Accton USB320-EC / Accton SpeedStream Ethernet
| 0x083a
| 0x0320
| <!--Revision-->
| {{unk|2002 }}
|-
| AEI USB Fast Ethernet / Allied Telesyn AT-USB100
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2002 }}
|-
| ATEN UC-110T
| 0x0557
| 0x4000
|
| {{unk|2001 }}
|-
| BAFO USB To Ethernet Adapter BF-310
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2001 }}
|-
| Belkin F5D5050 v1 1101
| 0x050D
|
| <!--Revision-->
| {{maybe|2002 sometimes works from old amiga.org post which is now removed}}
|-
| Belkin F5D5050 v2 2101
| 0x050D
| 0x0121
| <!--Revision-->
| {{no|2006 does not works}}
|-
| Belkin F5U122-PC
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| Billionton USB-100 / Billionton USBLP-100
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| Billionton USBEL-100 / Billionton USBE-100
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| Compex LinkPort/UE202A
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| D-Link DSB-H3ETX
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| D-Link DSB-650 / D-Link DSB-650TX / D-Link DSB-650TX-PNA
| 0x2001
| 0x4000
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| D-Link DU-E10 / D-Link DU-E100
| 0x2001
|
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| Edimax USB Ethernet Adapter EU-4201
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| Elsa AG MicroLink USB2 Lan Ethernet adapter
| 0x05cc
| 0x3000
| <!--Revision-->1.01
| <!--Opinion-->{{unk| }}
|-
| GetNet
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| GIGABYTE GN-BR402W Wireless Router
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Goodway Fellowes USB UE-120 REV:V1 UE120 ADMTek 1011594 HO2419741
| <!--Vendor ID-->0x07a6
| <!--Product ID-->0x0986
| <!--Revision-->0001
| <!--Opinion-->{{maybe|2001 USB Specification 1.1 compliant}}
|-
| GWC Tech USB Ethernet Adapter
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| Hawking UF100
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| HP HN210E / I/O DATA USB ETTX / Kingston KNU101TX
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| Jinco USB Ethernet Adapter 10/100 Base-T UE-110
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| Kouwell USB to Ethernet 588A
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| Linksys USB10T / TA / TX
| 0x066b
| 0x2202
| <!--Revision-->
| <!--Opinion-->{{unk|untested - possible peg1/peg2}}
|-
| Linksys (Cisco) USB100TX / H1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| Logitec LAN-TX/U1 H2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| [http://www.mayflash.com/psps2/ps2024/ps2024.htm Mayflash PS2024] Playstation2 compatible clone of Proxim/Farallon NetLine?
| 0x07a6
| 0x8511
| <!--Revision-->1.01
| <!--Opinion-->{{maybe|works with DHCP router option on old 32bit distros but not on newer 64bit, best to go asixeth apple 2010 but buy many of them as poor success rate i.e. a lottery}}
|-
| Netgear FA101
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| Philips CPWUE01/00
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| Planet UE-9500
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| PlayStation 2 SCPH-10000 50000 models
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| Proxim (formerly Farallon) NetLine USB PN796-650
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| Siemens SpeedStream USB
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| SOHOware NUB100
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| SMC EZNET-USB 2202USB/ETH / SMC 2206USB/ETH
| 0x0707
| 0x0100 0x0200 0x0201
| <!--Revision-->
| {{unk|untested but should work very well }}
|-
| Surecom EP-1427X 100/10M
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| Target USB to 10/100M Fast Ethernet Converter
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Trendnet TU-ET100C
| 0x07a6
| 0x8511
| <!--Revision-->0x0
| {{yes| sometimes works well, very stable}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->Digitus USB NIC DN-3016-A
| 0x07a6
| 0x8513
| 1.01
| {{unk|untested new chipset }}
|-
| Digitus lanusb ADM8515
| 0x07a6
| 0x8515
| 1.01
| {{unk|untested because new chipset }}
|-
| VE285 usblan ADMtek 8515
| 0x07a6
| 0x8515
| 1.01
| {{no|not working as new chipset }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
|}
Davicom DM9601 eth (USB 1.1 and up to 10Mbit/s)
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| Davicom USB-100 see clone below
| 0x0a46
| 0x9601
| <!--Revision-->
| <!--Opinion-->{{unk|2001 }}
|-
| [http://wiki.maemo.org/USB_to_ethernet_networking chinese translucent transparent crystal blue] but variants are also found in clear, white and black. Just over 6 cm long.
| 0x0a46
| 0x9601
| 0x0
| {{yes|2002 success can be sporadic so technically okay, but lacking in reliability. Out of 4 tested by me, only 2 worked. One case cracked open. }}
|-
| Corega FEther USB-TXC
| 0x07aa
| 0x9601
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| Dynamode USB-NIC-1427-100
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| Hirose USB-100
| 0x0a47
| 0x9601
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| KY-RS9600
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{yes|[http://www.amiga.org/forums/showpost.php?p=585358&postcount=12 works] }}
|-
| ShanTou ST268 USB NIC
| 0x0a46
| 0x0268
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| ZT6688 USB NIC
| 0x0a46
| 0x6688
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->ICS Advent DM9601 USB 2.0 10/100M Ethenet Adaptor JP1081B
| <!--Vendor ID-->0x0FE6
| <!--Product ID-->0x9700
| <!--Revision-->0101
| <!--Opinion-->{{No|not working 32bit and 64bit - USB 1.1 10M ethernet}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->
|-
|}
MosChip MCS7830 (USB 2)
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| Digitus DN-10050
| 0x9710
| 0x7830
| <!--Revision-->
| <!--Opinion-->{{unk|2004 }}
|-
| Edimax [http://www.edimax.co.uk/images/Image/datasheet/USB/EU-4206/EU-4206.pdf EU-4206]
|
|
| <!--Revision-->
| <!--Opinion-->{{unk|2005 }}
|-
| Speed Dragon
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| STLabs
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| StarTech Compact USB2105S [http://www.kustompcs.co.uk/acatalog/info_6790.html USB2106S]
| 0x9710
| 0x7830
| <!--Revision-->
| <!--Opinion-->{{unk|2007 }}
|-
| Sunrich Technologies [http://www.st-lab.com/admin/upfile/UploadFile/manual/manual(u-250).zip U-250]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2006 }}
|-
| Syba
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->MCS 7832
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|2008 }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->
|-
|}
* USB2 [https://www.asix.com.tw/en/product/USBEthernet Asix Ethernet] AX88178A, AX88772C, AX88772B, AX88772A (wii), AX88172A
* USB3 AX88179A, AX88179
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| AirLink101 AGIGAUSB
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2009 AX88172}}
|-
| ATEN UC210T
| 0x0557
| 0x2009
| 0x
| <!--Opinion-->{{unk| AX88172}}
|-
| <!--Description-->Billionton Systems USB2AR
| <!--Vendor ID-->0x08dd
| <!--Product ID-->0x90ff
| <!--Revision-->
| <!--Opinion-->{{No| }}
|-
| <!--Description-->Buffalo LUA-U2-KTX
| <!--Vendor ID-->0x0411
| <!--Product ID-->0x003d
| <!--Revision-->
| <!--Opinion-->{{No| }}
|-
| <!--Description-->corega FEther USB2-TX
| <!--Vendor ID-->0x07aa
| <!--Product ID-->0x0017
| <!--Revision-->
| <!--Opinion-->{{no| }}
|-
| D-Link DUB-E100 up to rev A4
| 0x2001
| 0x1a00
|
| <!--Opinion-->{{No| }}
|-
| <!--Description-->D-Link DUB-E100 rev B1 onwards
| 0x07d1 or 0x2001
| 0x3c05
| <!--Revision-->
| <!--Opinion-->{{Maybe|AX88172 works on Deneb with [http://amigax.com/2010/02/21/usb-ethernet-speed-test-amigaos-4-0-classic/ Amiga OS4 Classic] and [http://www.a1k.org/forum/showthread.php?t=11432 on a1k] }}
|-
| <!--Description-->goodway corp USB gwusb2e
| <!--Vendor ID-->0x1631
| <!--Product ID-->0x6200
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Hawking UF200
| 0x07b8
| 0x420a
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->[Linksys USB200M]
| 0x077b
| 0x2226
| <!--Revision-->
| <!--Opinion-->{{yes|[http://www.amiga.org/forums/showpost.php?p=585601&postcount=20 works] }}
|-
| <!--Description-->Netgear FA120
| 0x0846
| 0x1040
| <!--Revision-->
| <!--Opinion-->{{N/A|untested 2002 10/100 Rev.B1" is silkscreened on the board of the device populating this entry (S/N: FA12254CB100409, date code 0508). This device may be manuf. by [http://www.cameo.com.tw/ Cameo] "AX88172 L", "F05040157", and "ED3" Chip1 ASIX AX88172 Chip2 Realtek RTL8201BL}}
|-
| <!--Description-->Intellinet
| 0x0b95
| 0x1720
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->JVC MP-PRX1 Port Replicator
| <!--Vendor ID-->0x04f1
| <!--Product ID-->0x3008
| <!--Revision-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->
|-
| <!--Description-->ST Lab USB Ethernet
| <!--Vendor ID-->0x0b95
| <!--Product ID-->0x1720
| <!--Revision-->
| <!--Opinion-->
|-
| <!--Description-->Sitecom LN-029 "USB 2.0 10/100 Ethernet adapter"
| <!--Vendor ID-->0x6189
| <!--Product ID-->0x182d
| <!--Revision-->0
| <!--Opinion-->{{No| }}
|-
| <!--Description-->Surecom EP-1427X-2
| <!--Vendor ID-->0x1189
| <!--Product ID-->0x0893
| <!--Revision-->
| <!--Opinion-->{{No| }}
|-
| <!--Description-->TrendNet TU2-ET100 v2
| 0x07b8
| 0x420a
| <!--Revision-->
| <!--Opinion-->{{Maybe|version 2}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->A-LINK NA1GU
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| 88772}}
|-
| <!--Description-->AirLink101 ASOHOUSB Wii
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->AirLive EtherWe-1000U
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->APPLE AX88772 Model No. A1277 MC704LL/A P/N 825-7098-A
| <!--Vendor ID-->0x05ac
| <!--Product ID-->0x1402
| <!--Revision-->
| <!--Opinion-->{{No|2008 usb2, }}
|-
| <!--Description-->APPLE Model No. A1277 (MB442Z/A 0885909217434) MC704ZM/A PN 825-7579-A
| <!--Vendor ID-->0x05ac
| <!--Product ID-->0x1402
| <!--Revision-->
| <!--Opinion-->{{Maybe|2010 model, usb2 and controller AX88772 where prehaps 1in3 units working with owb - really poor odds i.e. a lottery, could be situation where various ethernet phy chipsets are used - press Use in network prefs after Save initial setup typing in usbasixeth.device, }}
|-
| <!--Description-->ASIX AX88772 bulbous casing
| <!--Vendor ID-->0x0b95
| <!--Product ID-->0x7720
| <!--Revision-->0x0
| <!--Opinion-->{{maybe|2008 works on 32bit and 64bit though setup can take a few attempts but may have issues with phy ethernet chip changing, }}
|-
| <!--Description-->Datel Wii Lan Adapter DUS0204
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2007 }}
|-
| <!--Description-->EdiMax EU-4207
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2008 }}
|-
| <!--Description-->Goodway HE2230 Maplin ASIX 88772
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2008 }}
|-
| <!--Description-->Intec LAN G5626
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2008 }}
|-
| <!--Description-->LevelOne USB-0202
| 0x0b95
| <!--Product ID-->0x07720
| <!--Revision-->0x
| <!--Opinion-->{{unk|2008 }}
|-
| <!--Description-->LevelOne USB-0301
| 0x0b95
| <!--Product ID-->0x07720
| <!--Revision-->0x
| <!--Opinion-->{{unk|2009 }}
|-
| <!--Description-->Linksys USB200M Rev 2
| <!--Vendor ID-->0x13b1
| <!--Product ID-->0x0018
| <!--Revision-->
| <!--Opinion-->{{maybe|2008 sparsely randomly working AX88772 or with "Sana-II Meter Tool 37.11" network monitoring program, showing continuous "Bad Packet" errors which could means "CRC" errors}}
|-
| <!--Description-->Linksys USB300M
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{maybe|2009 AX88772 }}
|-
| <!--Description-->Mayflash W001 or clones Lupo/PEGA S-Wii-0680 light gray rectangular with third of one top 45 degree angled slope
| <!--Vendor ID-->0x0b95
| <!--Product ID-->0x7720
| <!--Revision-->0x0
| <!--Opinion-->{{unk| may have randomly changed phy ethernet chips, }}
|-
| <!--Description-->Max Value MVF00446 ASIN B006EG568A
| <!--Vendor ID-->0x0b95
| <!--Product ID-->0x7720
| <!--Revision-->0x0
| <!--Opinion-->{{Maybe|Trident prefs recognises as AX88772 sometimes works on 32bit and 64bit}}
|-
| <!--Description-->NEWLink N14050
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->NEWLink Wii-ETH USB2.0
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Nintendo Wii LAN Adaptor 2110566 and clones
| <!--Vendor ID-->0x0b95
| <!--Product ID-->0x07720
| <!--Revision-->0x
| <!--Opinion-->{{Maybe|Poseidon recognises as AX88772 with usbasixeth.device sometimes works seems different ethernet phy chips can be matched affecting compatibility}}
|-
| <!--Description-->Nyko Wii Net Connect 87024
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{yes|[http://www.amiga.org/forums/showpost.php?p=585624&postcount=22 works] }}
|-
| <!--Description-->0Q0 cable ethernet
| <!--Vendor ID-->0x1557
| <!--Product ID-->0x7720
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Plugable USB2-E100 (2009/2010) Bulbous housing
| <!--Vendor ID-->0x0b95
| <!--Product ID-->0x7720
| <!--Revision-->0x0
| <!--Opinion-->{{Maybe|Trident prefs recognises it as ax88772A and typing in usbasixeth.device sometimes works}}
|-
| <!--Description-->Sabrent KINAMAX
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->SpeedLink SL-3401-SGY
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->TrendNet TU2-ET100 v3
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->UGreen 20254 USB2 to 10/100
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| AX88772}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->Afunta Apple-style White USB2.0 I/O Crest SY-ADA24005 ASIX Electronics Corp. AX88772A Fast Ethernet Adapter
| <!--Vendor ID-->0x0b95
| <!--Product ID-->0x772a
| <!--Revision-->0x
| <!--Opinion-->{{no|usbasixeth.device accepted by network prefs but does not work}}
|-
| <!--Description-->Amazon Basics USB 2.0 AX88772A
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Digitus DN-10050-1
| <!--Vendor ID-->0x0b95
| <!--Product ID-->0x772a
| <!--Revision-->0x0
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Edimax EU-4230
| <!--Vendor ID-->0x0b95
| <!--Product ID-->0x772a
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Sabrent KINAMAX NT-USB20 AX88772A
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description--> AX88772B USB 2.0 to 10/100M
| <!--Vendor ID-->0x0B95
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2010 }}
|-
| <!--Description-->
| <!--Vendor ID-->0x0B95
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->EdiMax EU-4208
| <!--Vendor ID-->0x0B95
| <!--Product ID-->0x772b
| <!--Revision-->0x
| <!--Opinion-->{{No|Detected but not working}}
|-
| <!--Description-->
| <!--Vendor ID-->0x0B95
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->StarTech USB2100 ASIX AX88772C
| <!--Vendor ID-->0x0B95
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->0x0B95
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->[https://www.asix.com.tw/en/product/USBEthernet/High-Speed_USB_Ethernet/AX88772D AX88772D]
| <!--Vendor ID-->0x0B95
| <!--Product ID-->0x1790
| <!--Revision-->
| <!--Opinion-->{{unk|2011 }}
|-
| <!--Description-->
| <!--Vendor ID-->0x0B95
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->[https://www.asix.com.tw/en/product/USBEthernet/High-Speed_USB_Ethernet/AX88772E AX88772E]
| <!--Vendor ID-->0x0B95
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2012 }}
|-
| <!--Description-->
| <!--Vendor ID-->0x0B95
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->AX88178
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|2004 }}
|-
| <!--Description-->Plugable USB2-E1000 i.e. USB 2.0 to Gigabit Ethernet 10/100/1000 LAN
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2011 ASIX AX88178 Controller and Realtek RTL8211CL PHY}}
|-
| <!--Description-->AX88178A USB 2.0 to 10/100/1000M Gigabit Ethernet controller
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|2005 }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->
|-
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->AmazonBasics USB3.0 adapter [https://github.com/nothingstopsme/AX88179_178A_Linux_Driver AX88179]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Cable Matters SuperSpeed USB 3.0 RJ45 adapter
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Hori Nintendo Switch 1 USB3 ethernet AX88179
| <!--Vendor ID-->0x0b95
| <!--Product ID-->0x1790
| <!--Revision-->
| <!--Opinion-->{{no|2017 AX88179 not binding to asixeth.class }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Plugable USB3-E1000
| <!--Vendor ID-->0x0b95
| <!--Product ID-->0x1790
| <!--Revision-->
| <!--Opinion-->{{no|2020 ASIX AX88179 not binding to class, USB 3.2 Gen1 to Gigabit Ethernet controller with integrated 10/100/1000Mbps Gigabit Ethernet PHY}}
|-
| <!--Description-->Plugable AX88179 = [https://plugable.com/products/usb3-e1000-deal USB3-E1000] before mid-2023 or USB3-E1000; AX88179A = USBC-E1000 after mid-2023
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2022 controller is AX88179 phy is ??, }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->StarTech USB31000SPTW ax88179
| <!--Vendor ID-->0x0b95
| <!--Product ID-->0x1790
| <!--Revision-->
| <!--Opinion-->{{no| AX88179 not binding to asixeth.class, }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->StarTech USB31000NDS AX88179 USB-A
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->StarTech US1GC301AU AX88179 USB-c
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->StarTech US1GC30B2 AX88179A USB-c
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->StarTech USB32000SPT AX88179A USB-c Rev 1 (AX88179) Rev 2 (AX88179A)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->USB32000SPT the Lot code sticker will have a bar code accompanied by a 10 digit number. The 5th and 6th digits of this lot code number would signify the revision. (Ex. xxxx02xxxx which would indicate rev. 2)
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->SYBA SY-ADA24029 Gigabit AX88179
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No| }} may depend on the PHY chip connected to the controller chipset
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->TP-Link UE306 AX88179
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->TeckNet® Orico UL677G 10/100
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->TeckNet® UL688G USB 3.0 10/100/1000 Base-T Ethernet port
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->AX88179 178A
|-
| <!--Description-->Tecknet UL699G
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->TrendNet TU2-ET100 v6
| <!--Vendor ID-->0x07b8
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|no support }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->uGreen 50922 USB3-A to 100/1000 dark grey rounded barrels
| <!--Vendor ID-->0x0b95
| <!--Product ID-->0x
| <!--Revision-->
| <!--Opinion-->{{no| ax88179 not binding to asixeth.class, }}
|-
| <!--Description-->UGreen USB3-C to 100/1000
| <!--Vendor ID-->0x0b95
| <!--Product ID-->0x1790
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->uGreen CR111 20256 usb3 a black plastic
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| AX88179}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description--> AX88179A
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Plugable USB3-E1000 USBC-E1000 after mid-2023 i.e. AX88179A
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->StarTech USB31000SPTB
| <!--Vendor ID-->0x0b95
| <!--Product ID-->0x1790
| <!--Revision-->
| <!--Opinion-->{{unk| AX88179A USB-A, }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description--> AX88179B
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|}
==USB → SerialPort Converter==
*2002 some support for early revisions of PL2303
*2005 Prolific PL2303H PL-2303X and Pl-2303HX (same usb ids as pl2303) no support
*2025 FTDI 232R [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1135&highlight=232r&rowstart=20 work in progress]
*2026 CDC-ACM i.e. Serial port over USB standard
serialpl2303.class make sure you specify serialpl2303.device or Echo "Test" >SER1:
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| ATEN UC-232A
| 0x0557
| 0x2008
| Full 0x0300
| {{N/A|untested}}
|-
| IOGear GUC232A
| 0x0557
| 0x2008
| Full 0x0110
| {{N/A|untested}}
|-
| Alcatel
| 0x11f7
| 0x02df
|
| {{N/A|untested}}
|-
| BAFO BF-810
| 0x067B
| 0x2303
| 0x0
| {{N/A|untested}}
|-
| Belkin F5U103
| 0x
| 0x
| 0x0
| {{N/A|untested}}
|-
| Davibe SP611
| 0x067B
| 0x2303
| 0x0
| {{N/A|untested}}
|-
| Dcu10
| 0x0731
| 0x0528
|
| {{N/A|untested}}
|-
| Elcom
| 0x056e
| 0x5003
|
| {{N/A|untested}}
|-
| IOData
| 0x04bb
| 0x0a03
| 0x0
| {{N/A|untested}}
|-
| Itegno
| 0x0eba
| 0x1080
|
| {{N/A|untested}}
|-
| Nokia CA42
|
|
|
| {{N/A|untested}}
|-
| Radioshack
| 0x1453
| 0x4026
|
| {{N/A|untested}}
|-
| Ratoc
| 0x0584
| 0xb000
|
| {{N/A|untested}}
|-
| Samsung
| 0x04e8
| 0x8001
|
| {{N/A|untested}}
|-
| Siemens DCA-510
| 0x067B
| 0x2303
| 0x0
| {{N/A|untested}}
|-
| Sitecom CN104
| 0x6189
| 0x2068
|
| {{N/A|untested}}
|-
| Sitecom CN116
| 0x6189
| 0x2068
|
| {{N/A|untested}}
|-
| Some Cut Ma620
| 0x0df7
| 0x0620
|
| {{N/A|untested}}
|-
| Speed Dragon Multimedia MS3303H
|
|
|
| {{N/A|untested}}
|-
| Syntech
|
|
|
| {{N/A|untested}}
|-
| <!--Description-->Tripp
| 0x2478
| 0x2008
|
| {{N/A|untested}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->Airlink101 AC-USBS
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver }}
|-
| <!--Description-->Belkin F5U103v
| 0x067B
| 0x2303
| 0x0
| {{no|no driver }}
|-
| Dynamode U232-P9
| 0x067B
| 0x2303
| 300
| {{no| no driver [http://koti.mbnet.fi/lonnberg/pl2303x.html linux patch] and using lsusb -v -d 067b:2303 gave bMaxPacketSize as 64 - pl2303x }}
|-
| Konig CABLE-146/2 USB to RS232
| 0x067b
| 0x2303
| 400
| {{no|no driver }}
|-
| MANHATTAN 205146 USB to Serial Converter
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver }}
|-
| Sabrent SBT-USC1M
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver }}
|-
| <!--Description-->Trendnet TU-59
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver }}
|-
| <!--Description-->Unbranded black case and lead USB 232 Converter
| <!--Vendor ID-->0x067B
| <!--Product ID-->0x2303
| <!--Revision-->0300
| <!--Opinion-->{{No| }}
|-
|}
[http://www.ftdichip.com/index.html Future Technology Devices International Ltd FTDI]-FT232R.class [https://ftdichip.com/software-examples/code-examples/c-builder/ FTProg src], [http://rtr.ca/ft232r/ ft232r src], [https://ftdichip.com/wp-content/uploads/2020/08/DS_FT232R.pdf FT232R datasheet], [],
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver}}
|-
| <!--Description-->
| <!--Vendor ID-->0x0403
| <!--Product ID-->0x6001
| <!--Revision-->
| <!--Opinion-->{{no|no driver}} [https://www.youtube.com/watch?v=1GE-gKgHxZI beware of cheap clones fake with s/n A50285BI SN]
|-
| <!--Description-->Lynx Astro FTDI
| <!--Vendor ID-->0x0403
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver}} FT232R
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver}}
|-
| <!--Description-->Sabrent CB-FTDI
| <!--Vendor ID-->0x0403
| <!--Product ID-->
| <!--Revision-->
| {{no|no driver TTL-232R cables use FTDI's [http://n1mm.hamdocs.com/tiki-index.php?page=USB+Interface+Devices FT232RQ ic device] }}
|-
| <!--Description-->Startech.com 1 Port FTDI USB to Serial RS232 DB9M Adapter Cable with COM Retention ICUSB2321F
| <!--Vendor ID-->0x0403
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver}} FT232RL Chipset
|-
| <!--Description-->StarTech.com 2 Port FTDI USB to Serial RS232 Adapter Cable ICUSB2322F
| <!--Vendor ID-->0x0403
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver}} FTDI FT2232D Chipset
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver}} FT232RL is the SSOP-28 and the FT232RQ is the QFN-32 package option
|}
[https://www.onetransistor.eu/2017/08/ch341a-mini-programmer-schematic.html ch341a.class]
*I2C EEPROMS (3.3V and 5V) compatible and also SPI FLASH memories (3.3V devices) making sure 1.8V is covered
*each having their own [https://winraid.level1techs.com/t/guide-how-to-use-a-ch341a-spi-programmer-flasher-with-pictures/33041 4x2 connection blocks] using [https://github.com/flashrom/flashrom flashrom]
sudo flashrom --programmer ch341a_spi -r backup.bin
sudo flashrom --programmer ch341a_spi -w <new bios name>
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| <!--Description-->Jiangsu QinHeng Ltd CH341A emulate UART communication, standard parallel port, memory parallel port and synchronous serial (I2C, SPI)
| <!--Vendor ID-->0x1A86
| <!--Product ID-->0x5512
| <!--Revision-->
| <!--Opinion-->{{no|no driver}}
|-
| <!--Description-->QinHeng USB2.0-Serial HL-340
| <!--Vendor ID-->0x1A86
| <!--Product ID-->0x7523
| <!--Revision-->0252
| <!--Opinion-->{{no|no driver}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver}}
|}
==simplemidi.class and CAMD==
Currently support includes
* simplemidi.class SimpleMidi maps some keyboard keys to corresponding computer keys as used by music trackers to emulate a musical keyboard
* camdusbmidi.class follows the rules of the m68k implementation of Commodore's CAMD midi specification and usb class compliant
for
* usb host like a computer, pi, etc
* usb device controllers - keyboards, drum machines, djay turntables, grooveboxes, etc
* interfaces - cables or boxes which convert usb to 5pin DIN plug midi
What is needed is a fully class-compliant '''brand name''' USB MIDI keyboard, especially manufactured in the last 15 years are best
*Arturia
*Novation
*M-Audio
*Akai
Plugging this in one of your USB ports, the camd.library will make the keyboard's MIDI IN/OUT ports available in the system.
Then select the keyboard's MIDI IN port (known as a "cluster" in CAMD) for input, and the software instrument's cluster as output
ShowCluster (shows midi ports available in and out)
MidiWatch (usually port usbmidi.in.0 less often usbmidi.out.0) (Ctrl-C to end output stream)
usbmidi.in.0 Message on channel 01, NoteOn 90 39 08 00
usbmidi.in.0 Message on channel 01, NoteOff 80 39 00 00
MidiThru (forwards messages from one port to another)
run >nil: c:midithru usbmidi.out.0 usbmidi.out.2
MidiSendC (sends a middle C to a specific port)
Midi Controller + Sound Module (together aka as a synth) -> Audio Output
The difference between midi and midi over USB is that in old school Midi the transmitter transmits whenever it wants and the receiver always has to be prepared to receive data. Easy to do at the rate of a 1990's modem speed these days.
USB over midi.. turns midi into a polled protocol.. So the USB host (typically the computer) has to ask "do you have anything for me" before the remote will send. If the USB host gets busy doing other things or there is a lot of things on the USB bus to get polled, you can get delays.
For its age midi is still a great protocol for music
* [https://www.usb.org/sites/default/files/midi10.pdf USBIF's "USB Device Class Definition for MIDI Devices" document, version 1.0 from Nov 1, 1999]
* [https://www.usb.org/sites/default/files/USB%20MIDI%20v2_0.pdf MIDI v2.0 from 2020 which AROS still needs, adds support for MIDI 2.0, MIDI-CI, and Universal MIDI Packet]
Nearly all synthesizers now use the 16 MIDI channels available on a MIDI bus in one instrument alone, requiring multiple MIDI busses in a typical setup with more than
one MIDI instrument. In addition, by handling multiple "virtual" cables, USB offers a solution to go beyond MIDI's 16-channel limit.
MIDI data is transferred over USB using 32-bit USB-MIDI Event Packets. These packets provide an efficient method to transfer multiple MIDI streams with fixed length messages. The 32-bit USB-MIDI Event Packet allows multiple "virtual MIDI cables" routed over the same USB endpoint. This approach minimizes the number of required endpoints. It also makes parsing MIDI events easier by packetizing the separate bytes of a MIDI event into one parsed USB-MIDI event.
{| class="wikitable sortable" width="90%"
! width="25%" | Description
! width="5%" |Vendor ID
! width="5%" |Product ID
! width="5%" |Revision
! width="15%" |CAMD
! width="30%" |Opinion
|-
| <!--Description-->Computer
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->
| <!--Opinion-->{{Yes|which acts as USB midi host to get all usb devices talking together}}
|-
| <!--Description-->Hobbytronics usb host standalone
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->bomebox
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->[https://neuma.studio/rpi-as-midi-host/ raspberry pi] with several midi interface(s) and linux scripting
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Kenton MIDI USB Host mk3
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->
| <!--Opinion-->{{N/A|untested}}
|}
{| class="wikitable sortable" width="90%"
! width="25%" | Description
! width="5%" |Vendor ID
! width="5%" |Product ID
! width="5%" |Revision
! width="15%" |CAMD
! width="30%" |Opinion
|-
| <!--Description-->Acorn Instruments Masterkey 49 device
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2018 untested usb powered 5V regulated - similar keybed to keystation 49es but unplug then re-plug the USB cable while it is powered the device might reconnect
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{maybe| }}
| <!--Opinion--> midi keyboard controller
|-
| <!--Description-->Akai SynthStation 25
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2010 - sticky rubber keys - usb
|-
| <!--Description-->Akai MPK Mini Laptop Production Keyboard
| <!--Vendor ID-->0x09e8
| <!--Product ID-->0x007c
| <!--Revision-->0100
| <!--CAMD-->{{Yes|detected and camd usb to use, not tested with apps}}
| <!--Opinion-->2010 25 mini key self powered by mini USB lead - sustain port - no top left corner joystick - tested icaros 2.3 -
|-
| <!--Description-->Akai LPK25 LPK37 LPK49 Laptop Production Keyboard
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested }}
| <!--Opinion-->2012 untested velocity sensitive mini keys with synth action - weak mini USB port - latency issues -
|-
| <!--Description-->Akai Professional APC Key 25
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2012
|-
| <!--Description-->Akai MPK49
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| untested}}
| <!--Opinion-->2012 untested 49 key 49-key full-sized, semi-weighted keyboard with aftertouch -
|-
| <!--Description-->AKAI Max25 MAX49 control keyboard
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested }}
| <!--Opinion-->2014 usb compliant
|-
| <!--Description-->Akai Professional MPK249 MPK261
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2015 USB2 USB-b - full keys semi-weighted aftertouch - midi in out - sustain and peddle port
|-
| <!--Description-->Akai Professional Advance 49
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2016
|-
| <!--Description-->Akai MPK Mini MKII MK2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| untested}}
| <!--Opinion-->2017 untested USB2 USB-b midi connection only - 4 way thumb joystick top left - 25 tiny keys - velocity drum pads - plastic build quality -
|-
| <!--Description-->AKAI Professional APC Key 25 MK2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| driver}}
| <!--Opinion-->2017
|-
| <!--Description-->Akai MPK Mini Play
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2021 untested USB2 USB-b midi connection only - synth basic samples - class compliant? - small led display top centre - 25 mini keys - press and hold the "Prog Select" button then use the "Program" knob to assign a MIDI channel -
|-
| <!--Description-->Akai MPK Mini 3 MKIII MK3
| <!--Vendor ID-->0x09E8
| <!--Product ID-->0x1049
| <!--Revision-->0200
| <!--CAMD-->{{Yes|detected audio class and bindings with camdusbmidi.class - - midi in out untested - }}
| <!--Opinion-->2021 USB2 USB-b midi controller connection no 5pin legacy - small led display top centre - 25 mini keys goofy uneven feel of the akai keyboards - press and hold the "Prog Select" button and press pad 1 to 8 to assign a MIDI channel - tested on AROS One 2.4 usb
|-
| <!--Description-->Akai Force / MPC One
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{Maybe| }}
| <!--Opinion-->
|-
| <!--Description-->Akai Pro MPK Mini Plus
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{Maybe| }}
| <!--Opinion-->2023 untested 37 mini keys - class compliant device - usb-b bus powered only with 5pin midi in and out - Shift and Global for Midi Ch -
|-
| <!--Description-->Akai Pro Ableton Push Mk 1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->
|-
| <!--Description-->Akai Professional MPC Key 37 49 61 midi controller
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| untested}}
| <!--Opinion-->2023 untested USB2 usb-b
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| CAMD
| Opinion
|-
| <!--Description-->Alesis Photon PH-25 X25 Midi & USB keyboard/synth
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2005 midi keyboard controller
|-
| <!--Description-->Alesis Q25 Q49 Q61 Q88
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{Maybe| }}
| <!--Opinion-->2014 untested
|-
| <!--Description-->Alesis Coda Pro Portable 88-Key Digital Piano USB MIDI Keyboard
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2015
|-
| <!--Description-->Alesis V25 V49 V61 midi controller
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| untested}}
| <!--Opinion-->2017
|-
| <!--Description-->Alesis V Mini
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{Maybe| }}
| <!--Opinion-->
|-
| <!--Description-->Alesis VI49 VI61 midi controller
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{Maybe| }}
| <!--Opinion-->
|-
| <!--Description-->Alesis VX49 VX61
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2016 1 5-pin MIDI input, 1 5-pin MIDI output, 1 USB port,
|-
| <!--Description-->Alesis Q25 Q49 Q61 Mk2 MKII
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2018
|-
| <!--Description-->Alesis Recital 88
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2020
|-
| <!--Description-->Alesis V25 V49 V61 MK2 MKII
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2022
|-
| <!--Description-->Alesis Qmini portable 32-key
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2023
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->
|-
| <!--Description-->audiothingies MicroMonsta
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2016 untested synth -
|-
| <!--Description-->audiothingies MicroMonsta 2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2019 synth -
|-
| <!--Description-->Arturia Analog Experience “The Player” USB MIDI Master Keyboard Model APE25
| <!--Vendor ID-->0x1C75
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2010 usb-b bus powered -
|-
| <!--Description-->Arturia MiniLab Mk1
| <!--Vendor ID-->0x1C75
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2013 maybe class complaint
|-
| <!--Description-->Arturia MiniLab MkII Mk2
| <!--Vendor ID-->0x1C75
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2016 maybe class complaint
|-
| <!--Description-->Arturia Keystep 32
| <!--Vendor ID-->0x1C75
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{Maybe| }}
| <!--Opinion-->2016 untested 32 mini keys usb compliant
|-
| <!--Description-->Arturia KeyLab 61 88
| <!--Vendor ID-->0x1C75
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{Maybe| }}
| <!--Opinion-->2017 untested hammer-action Fatar keybed - reset Press and hold Oct + and Oct – buttons then insert the USB cable -
|-
| <!--Description-->Arturia MiniLab mkII
| <!--Vendor ID-->0x1C75
| <!--Product ID-->0x2209
| <!--Revision-->0100
| <!--CAMD-->{{Yes|detected audio class and bindings with camdusbmidi.class - - midi in out untested - }}
| <!--Opinion-->2017 USB2 usb-b bus power - metal base heavier than most - Shift and press a key to select the MIDI Channel - To reset to original factory, unplug the USB cable, hold down the Oct- and Oct + buttons, plug the USB cable back in and continue to hold the buttons until the pads turn white - need software to change parameters like velocity sensitive assistance -
|-
| <!--Description-->Arturia KeyLab MK2 MKII 61 88
| <!--Vendor ID-->0x1C75
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested }}
| <!--Opinion-->2017 untested hammer-action Fatar keybed
|-
| <!--Description-->Arturia MicroFreak
| <!--Vendor ID-->0x1C75
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2019 hybrid digital/analog synthesis,
|-
| <!--Description-->[https://www.youtube.com/watch?v=PeYIAfn3UMs Arturia Minilab 3] [https://www.youtube.com/shorts/chj1WgMupGw ] [https://www.youtube.com/shorts/FMVdfhzg1Dw ]
| <!--Vendor ID-->0x1C75
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| untested}}
| <!--Opinion-->2020 untested usb-c bus powered - 25 mini keys semi -
|-
| <!--Description-->Arturia Keystep Pro
| <!--Vendor ID-->0x1C75
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2020
|-
| <!--Description-->Arturia MiniLab 3 Mk3
| <!--Vendor ID-->0x1C75
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2022 maybe class complaint
|-
| <!--Description-->Arturia MiniFreak
| <!--Vendor ID-->0x1C75
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2022
|-
| <!--Description-->Arturia KeyLab Essential 49 61 88 mk3
| <!--Vendor ID-->0x1C75
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2023 untested usb-c and 1 midi out - lack of aftertouch -
|-
| <!--Description-->Arturia AstroLab
| <!--Vendor ID-->0x1C75
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2024
|-
| <!--Description-->Arturia KeyLab MK3 MKIII 61 88
| <!--Vendor ID-->0x1C75
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2025 untested hammer-action Fatar keybed
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->
|-
| <!--Description-->Behringer UMX61
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{maybe|untested}}
| <!--Opinion-->2007
|-
| <!--Description-->Behringer U-Control UMX490 UMX610
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2010
|-
| <!--Description-->Behringer U-Control
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->
|-
| <!--Description-->Behringer Swing 32-Key
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->
|-
| <!--Description-->Behringer MOTOR 49 - 49-Key USB/MIDI Master Controller Keyboard
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->
|-
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| CAMD
| Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion--> midi keyboard controller
|-
| <!--Description-->Creative EMU Xboard 25 E-MU X-Board 49 61
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No|untested}}
| <!--Opinion-->2008
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->
|-
| <!--Description-->CME M-Key Mkey 49
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2008 stops sending MIDI on a regular basis. The simplest "fix" is to flip it off and on via the power switch at the back
|-
| <!--Description-->CME Ukey U-Key
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2009
|-
| <!--Description-->CME Xkey
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2014 low-profile aluminium full size pressure sensitive with polyphonic aftertouch but keys make too much noise and that they can be too sensitive to velocity - low power draw 25ma
|-
| <!--Description-->CME M-Key 49 V2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2014 simplified version of the U-key Mobiltone
|-
| <!--Description-->CME XKEY AIR 37
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2019
|-
| <!--Description-->cme xkey 37 le
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2020
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{ | }}
| <!--Opinion-->
|-
| <!--Description-->Donner Spaceline DMK-25 Donnerdeal Rantion
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->
|-
| <!--Description-->Donner DMK25 PRO
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion--> 25 mini velocity keys with limited aftertouch - usb-c powered - 8 drum pads - 3.5mm "midi out" socket -
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{ | }}
| <!--Opinion-->
|-
| <!--Description-->Elektron Digitakt
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2015 expensive later midi usb class compliant with since 1.5 Update
|-
| <!--Description-->Elecktron Digitone
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->
|-
| <!--Description-->Elektron Digitone Keys 37-key Digital FM Synthesizer
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2018 expensive
|-
| <!--Description-->Elektron Analog Four MKII
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->
|-
| <!--Description-->Elektron Octatrak MKII
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{ | }}
| <!--Opinion-->
|-
| <!--Description-->ESI keycontrol
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->
|-
| <!--Description-->ESI keycontrol 49+
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->
|-
| <!--Description-->ESI keycontrol 25xt
| <!--Vendor ID-->0x2702
| <!--Product ID-->0x2702
| <!--Revision-->0100
| <!--CAMD-->{{Yes|detected and usb driver working}}
| <!--Opinion-->2011 bus powered or 12v 0.5a dc in - metal base so heavy - midi out 5pin - sustain pedal port - modulation slider - rubber coated knobs becomes sticky -
|-
| <!--Description-->ESI keycontrol 49xt 61xt 88xt
| <!--Vendor ID-->0x2702
| <!--Product ID-->
| <!--Revision-->0100
| <!--CAMD-->{{Yes|detected}}
| <!--Opinion-->2011 12v 0.5a center pin +ve external psu required - USB i/o and 1 legacy 5pin out - full sized keys - heavy aluminium case keyboard metal base -
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{maybe| }}
| <!--Opinion-->
|-
| <!--Description-->Evolution MK-125 MK-149
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->2000 9v
|-
| <!--Description-->Evolution MK-225C MK-249C
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->2003 9v
|-
| <!--Description-->Evolution USB/Midi Controller MK-425C MK-449C MK-461C
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No|25, 49, 61 keys - }}
| <!--Opinion-->2006 9V or 12V -
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{maybe| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> midi keyboard controller
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| CAMD
| Opinion
|-
| <!--Description-->IK Multimedia iRig Keys Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2014 37 full keys
|-
| <!--Description-->IK Multimedia iRig Keys Pro Mobile
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2014 25 or 37 mini keys
|-
| <!--Description-->IK Multimedia iRig Keys 2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2020 mini velocity keys no aftertouch -
|-
| <!--Description-->IK Multimedia iRig Keys 2 PRO
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2020 full velocity keys no aftertouch -
|-
| <!--Description-->IK Multimedia iRig Keys
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{maybe| }}
| <!--Opinion-->
|-
| <!--Description-->Kawai VPC 1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion--> weighted keys - heavy build -
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->
|-
| <!--Description-->Keith McMillen Instruments K-Board
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion--> omni class compliant to all channels? each keypad makes them velocity, pressure, and location sensitive but not really suited for piano playing
|-
| <!--Description-->Keith McMillen BopPad
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion--> omni class compliant to all channels?
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{maybe| }}
| <!--Opinion-->
|-
| <!--Description-->Korg NanoKontrol 1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->mini usb
|-
| <!--Description-->Korg Prophecy
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->
|-
| <!--Description-->KORG microKONTROL
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{no| }}
| <!--Opinion-->2010
|-
| <!--Description-->Korg microKEY
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| untested}}
| <!--Opinion-->2011 velocity-sensitive Natural Touch keys but joystick is an alternative to the common pitch/modulation wheel design - power draw -
|-
| <!--Description-->Korg nanoKey nanoPad
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2011
|-
| <!--Description-->Korg Taktile
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->
|-
| <!--Description-->Korg microKEY2 25 37 49 61 USB
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|2015 untested}}
| <!--Opinion-->2015 USB powered - semi weighted -
|-
| <!--Description-->Korg MiniList
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->
|-
| <!--Description-->Korg MinKey nanoPad nanoPad 2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->
|-
| <!--Description-->Korg Nautilus
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2024
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{maybe| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> midi keyboard controller
|-
| <!--Description-->Kurzweil PC3 7 series - Artis 7
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->fatar TP-8 semi-weighted action
|-
| <!--Description-->Kurzweil PC1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->
|-
| <!--Description-->Kurzweil PC3 A8
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{maybe| }}
| <!--Opinion-->
|-
| <!--Description-->Line 6 Mobile keys 25
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->2006
|-
| <!--Description-->Line 6 POD Studio KB37
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->2006
|-
| <!--Description-->Line 6 Tone Port KB37
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->2007
|-
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| CAMD
| Opinion
|-
| <!--Description-->Midiman (later M-Audio) Oxygen8 Ozone Ozonic 25 32
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{no|not class compliant - untested 5pin legacy }}
| <!--Opinion-->2002 2004 - 25 full keys - slider/fader to left of lcd display -
|-
| <!--Description-->m-audio oxygen keystation (61 key)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{no| }}
| <!--Opinion-->2004
|-
| <!--Description-->M-Audio eKeys 37
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{no| }}
| <!--Opinion-->2005
|-
| <!--Description-->M-Audio Axiom 25, 49, 61
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->2006 bus powered and 12v psu - if sliders/faders are on right - legacy midi 5pin - chunky unit -
|-
| <!--Description-->M-Audio Oxygen 8v2, 49, 61 (silver)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{no| }}
| <!--Opinion-->2006 full size velocity sensitive 12v psu - sending random pitchbend info -
|-
| <!--Description-->M-Audio Keystation 37e 49e, 61e MK1 MKI
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2006 - ok key action -
|-
| <!--Description-->M-Audio Keystation 37es 49se 61es, 88es MK1 MKI
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2008 -
|-
| <!--Description-->M-Audio Oxygen 25/49/61/88 (blue)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2008 [https://m-audio.com/products/view/oxygen-25-legacy advised Class-compliant and GM/GM2/XG SysEx messages] with full size velocity sensitive 12v psu - sending random pitchbend info -
|-
| <!--Description-->M-Audio Axiom 25, 49, 61 (2nd Gen)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2010 semi-weighted mini keys - bus powered and 9v psu for 25/49 and 12v for 61 - if sliders/faders are on left - legacy midi 5pin - chunky unit -
|-
| <!--Description-->M-Audio Axiom Pro 25, 49, 61
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2011 poor construction
|-
| <!--Description-->MAudio Axiom AIR 25 M-Audio Axiom Air Mini 32
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2012
|-
| <!--Description-->M-Audio Oxygen 25 III (3rd Gen)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2012 untested - usb only - rubber keys sticky -
|-
| <!--Description-->MAudio Keyrig 49
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->
|-
| <!--Description-->M-Audio Keystation Mini 32
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2012 - mini usb - plays a few notes and then stops responding randomly - try plugging it into port 1 or 2 on your pc -
|-
| <!--Description-->M-Audio Keystation 49 MK2 II
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2012 USB port and class compliant
|-
| <!--Description-->M-Audio Keystation 61 MK3 MKIII MIDI keyboard
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2015 usb compliant untested
|-
| <!--Description-->M-Audio Oxygen 25 IV
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| untested}}
| <!--Opinion-->2016 choice
|-
| <!--Description-->M-Audio CTRL-49
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2017
|-
| <!--Description-->M-Audio ProKeys 88, 88sx
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->
|-
| <!--Description-->M-Audio Keystation Mini 32 MK3
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2019 mini usb - some power or incompatibility issue with the native USB ports of the laptop, plugged in a passive USB 2.0 HUB (not USB 3.0, not powered)
|-
| <!--Description-->[https://www.youtube.com/watch?v=3328SvuJsLw M-Audio Oxygen25 MKV]
| <!--Vendor ID-->0x0763
| <!--Product ID-->0x0001
| <!--Revision-->0023
| <!--CAMD-->{{Yes|detected audio class and bindings with camdusbmidi.class - midi in out untested}}
| <!--Opinion-->2020 25 full size semi keys - USB2 usb-b but no 5pin classic plugs - channel select SHIFT button and CHANNEL on keybed - plastic build - holding down both the Octave + and - for factory reset - more limited in what you can do with it than IV 4th one - tested on AROS One 2.4 usb
|-
| <!--Description-->M-Audio Oxygen Pro 25 49 61
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2022 untested semi full keys
|-
| <!--Description-->M-Audio Oxygen Pro Mini
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2023 untested - 32 smaller keys - not endless encoders - usb only -
|-
| <!--Description-->M-Audio Hammer 88
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->
|-
| <!--Description-->Moog
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->
|-
| <!--Description-->Moog Minitaur
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->
|-
| <!--Description-->M-VAVE SMK-25mini 25key MIDI Control Keyboard Y6I0
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->
|-
| <!--Description-->Native Instruments NI Primus A25 JamMate
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{no| }}
| <!--Opinion-->2008 not compliant,
|-
| <!--Description-->Native Instruments Maschine MK1 MKI
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->2009 not compliant uses snd-usb-caiaq module,
|-
| <!--Description-->Native Instruments Komplete Kontrol S88 S61 S49
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2012 - weighted keys -
|-
| <!--Description-->Native Instruments Maschine MK2 MKII
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2013 maybe compliant,
|-
| <!--Description-->Native Instruments Maschine Micro Mikro MK2 MKII
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2014 maybe?
|-
| <!--Description-->NI Komplete Kontrol S49 S61 S88 MkII MK2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2017 all MK2 MK3 power up the keyboard using USB, it will set the keyboards MIDI port to computer MIDI only without any option to set it to use the MIDI DIN, meaning you cannot connect the keyboard to hardware and power from USB, you MUST power with the power adapter and physically unplug from any USB connection -
|-
| <!--Description-->Native Instruments Komplete Kontrol A25 A49 A61
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2018 maybe compliant,
|-
| <!--Description-->[https://github.com/sikorak666/maschine-mikro-mk3-driver Native Instruments Maschine Micro Mikro Plus MK3 MKIII]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2019
|-
| <!--Description-->Native Instruments Komplete Kontrol M32
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2019 untested 32 smaller keys - no drum pads - USB only -
|-
| <!--Description-->NI Komplete Kontrol S49 S61 S88 MkIII MK3
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2023
|-
| <!--Description-->NI
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2025
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| CAMD
| Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> midi keyboard controller
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Neusonik iBoard 4
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Nektar Impact LX25+ LX49+ LX61+ LX88+ SE
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2017 budget full-size velocity-sensitive synth-action keyboard -
|-
| <!--Description-->Nektar Impact GX49
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> USB port -
|-
| <!--Description-->Nektar Panorama P4 P6
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> USB & USB Micro B, 5-pin MIDI out, 2 x TRS inputs with 49 semi-weighted, velocity sensitive with aftertouch
|-
| <!--Description-->Nektar SE25 SE49
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> mini keys - micro usb bus powered - velocity and sustain button
|-
| <!--Description-->Nektar Panorama P6 61
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Nektar Panorama T6
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Nord Stage 3 midi controller
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> sysex
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Novation ReMote 25 49 61
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->2003 lhs XY touchpad and the joystick -
|-
| <!--Description-->Novation LaunchKey 25 49 61 88 Mk1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{no| }}
| <!--Opinion-->2005 not USB class compliant
|-
| <!--Description-->Novation 49 61 SL
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->2006 semi-weighted Fatar TP-8 or TP-9 keybed
|-
| <!--Description-->Novation ReMote 25SL 49SL 61SL soft label
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->2006 - two long top liquid-crystal display LCD strips - XY touchpad and the joystick -
|-
| <!--Description-->Novation ReMOTE 25LE
| <!--Vendor ID-->0x1235
| <!--Product ID-->0x0004
| <!--Revision-->0001
| <!--CAMD-->{{Yes|detected, usb driver in devs/midi for camd to use}}
| <!--Opinion-->2007 USB-b powered, 9v center pin positive or 6 MN1500 AA batteries - X/Y touchpad and the combined pitch and modulation joystick - no aftertouch but can use both the legacy MIDI OUT and USB port simultaneously
|-
| <!--Description-->Novation Nocturn 49 61
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{Unk| }}
| <!--Opinion-->2008 untested sending random pitchbend info
|-
| <!--Description-->Novation 49 61 SL MkII
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2009 semi-weighted Fatar TP-8 or TP-9 keybed
|-
| <!--Description-->Novation MiniNova
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2013
|-
| <!--Description-->Novation Impulse 25 49 61
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2012 velocity aftertouch‑sensitive semi-weighted keyboards and eight backlit pads - USB, 5-pin MIDI out -
|-
| <!--Description-->Novation Circuit Tracks / Rhythm
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2015 untested
|-
| <!--Description-->Novation LaunchKey 25 49 61 88 MK2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2015 USB class compliant - full keys -
|-
| <!--Description-->Novation Launchpad Mini MK2 MKII
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2016 untested 8x8 buttons with 16 backlit
|-
| <!--Description-->Novation LaunchKey Mini MK2 MKII
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2018 untested - 25 soft mini keys - 2 rotary wheels lhs -
|-
| <!--Description-->Novation LaunchKey 25 37 49 61 88 MK3 MKIII
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2020 USB class compliant choice - full keys -
|-
| <!--Description-->Novation LaunchKey Mini MK3
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2023 untested - 25 soft mini keys - 2 sliders lhs -
|-
| <!--Description-->Novation 61SL Mk3
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> midi keyboard controller
|-
| <!--Description-->Nymphes Dreadbox
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion--> 6 voice analog synth
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| CAMD
| Opinion
|-
| <!--Description-->Oberheim MC 2000 EX
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2015 88 keys fully weighted - very heavy -
|-
| <!--Description-->PreSonus ATOM SQ Hybrid MIDI Keyboard/Pad
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->[https://polyend.com/tracker/ Polyend Tracker]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->
|-
| <!--Description-->Roland ED PC-300
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->2002 USB MIDI keyboard controller 49-key
|-
| <!--Description-->Roland EDIROL PCR-M30 PCR-M50 PCR-M80
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->2005
|-
| <!--Description-->Roland Edirol PCR-30 PCR-50 PCR-80
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->2007 untested 32 key -
|-
| <!--Description-->Roland PC-50 PC-80
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->2007
|-
| <!--Description-->Roland PCR-500 PCR-800
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2008 61 velocity-sensitive keys with aftertouch
|-
| <!--Description-->Roland A-88 a-49
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2013 USB port - weighted keys velocity no aftertouch - class compliant with press FUNCTION so it is lit. Press the key labelled "ADV.", Press the "+" button so it is lit -
|-
| <!--Description-->Roland PC-200 mkII
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2014 some had fatar keys
|-
| <!--Description-->Roland MC-707 Groovebox
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2015
|-
| <!--Description-->Roland MC-101
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2015 untested
|-
| <!--Description-->Roland A-500 A500Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2018
|-
| <!--Description-->Roland A-300 A300Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2018
|-
| <!--Description-->Roland JUNO DS, FA, Fantom, JUPITER X / Xm
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2019 (be sure that USB driver is set to "Generic" - requires device rebooting)
|-
| <!--Description-->Roland A-88 a-49 MKii MK2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2020 expensive with USB-c port - hammer-action keyboard weighted keys - Class-compliant if USB-C enables bus power - MIDI 2.0 later -
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->ROLI Seaboard RISE 25
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> midi keyboard controller
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| CAMD
| Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> midi keyboard controller
|-
| <!--Description-->Samson Graphite 49
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Samson Carbon 49
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Sequential TAKE 5
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Studiologic VMK-161 and VMK-161 Plus Organ version
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->TP-8O action is the unweighted, organ-style waterfall keybed - usb midi in out - 9v psu -
|-
| <!--Description-->Studiologic SL990XP midi controller
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Studiologic VMK176 Plus
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->USB and midi connectivity
|-
| <!--Description-->Studiologic SL880 midi controller
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Studiologic SL73 SL88 Studio midi controller
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> hammer-action Fatar TP semi-weighted keys
|-
| <!--Description-->Studiologic Numa Organ 2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> 73 key TP-8O action is the unweighted, organ-style waterfall keybed used in nearly all clonewheels
|-
| <!--Description-->Studiologic Numacompact 2/2x, Numa X Piano
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->SubZero CommandKey49 CommandKey25
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->SubZero SZ-MiniCommand Mini-Command USB
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->SubZero SPC61 MIDI Controller
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> bus powered - 5 octave
|-
| <!--Description-->SubZero ControlKey49S 49 Key Slim MIDI Controller Keyboard
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{maybe| }}
| <!--Opinion-->
|-
| <!--Description-->Synido TempoKey K25
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2023 25 mini keys - usb-c powered
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{maybe| }}
| <!--Opinion-->
|-
| <!--Description-->Winterbloom Sol
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{maybe| }}
| <!--Opinion-->
|-
| <!--Description-->Worlde Panda
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> midi keyboard controller
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| CAMD
| Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Yamaha KX8 KX49 KX61
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->2008 not compliant
|-
| <!--Description-->Yamaha CMC-PD
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->2010
|-
| <!--Description-->Yamaha
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2011 not class compliant
|-
| <!--Description-->Yamaha P45B P-45 Digital Piano
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->2011 not compliant
|-
| <!--Description-->Yamaha P-115 midi controller
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2016 untested weighted keys - USB midi port
|-
| <!--Description-->Yamaha MX49
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2020 should compliant untested
|-
| <!--Description-->Yamaha Montage, CP73/88, YC, MODX
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> midi keyboard controller
|-
| <!--Description-->Yamaha PSR-E353, PSR-E443
PSR-S670, PSR-S770, PSR-S970, PSR-A3000, TYROS-5
NP-12, NP-32
DGX-650, DGX-660
P-105, P-115, P-255
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Yamaha MX49 II V2 Black Blue
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2023
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> midi keyboard controller
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| CAMD
| Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->DJM V10
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion--> dj
|-
| <!--Description-->Native Instruments Kontrol DJ Pro midi controller
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> detected but untested
|-
| <!--Description-->Numark Mixtrack Pro II USB DJ Controller Djay
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->older generation pioneer DDJ-SX2 dj
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|}
{| class="wikitable sortable" width="90%"
! width="20%" | Description
! width="10%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="10%" |CAMD
! width="30%" |Opinion
|-
| <!--Description-->Alyseum AL-22 AL22c
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> usb to 5pin midi interface
|-
| <!--Description-->Alyseum AL-88 Schneidersladen AL88c
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> usb to 5pin midi interface
|-
| <!--Description-->Alyseum U3-88c Midi Interface
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> no CopperLan support Midi network using a UTP Ethernet patch cable)
|-
| <!--Description-->Behringer BCF2000 midi interface
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->
|-
| <!--Description-->[http://www.behringer.com/EN/home.aspx Behringer] BCR2000 1in 2out
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->
|-
| <!--Description-->Behringer B-CONTROL DEEJAY BCD3000 DJ Mixer
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Behringer UMD404 UMD202
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> usb to 5pin midi interface
|-
| <!--Description-->Creative EMU 0404/USB midi interface
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{no| }}
| <!--Opinion-->2006
|-
| <!--Description-->DigiDesign / Focusrite Command 8 Control Surface
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->2005 supports MIDI continuous controller (CC) and note data. SysEx dumping and loading is also supported
|-
| <!--Description-->Digidesign Digi 002
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->2006 firewire only
|-
| <!--Description-->Digidesign Digi 003
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->2009 firewire only
|-
| <!--Description-->emagic m4 2x4 AMT8 Unitor 8 Mk2 8x8
| <!--Vendor ID-->0x00d0
| <!--Product ID-->
| <!--Revision-->0x010 0x0103
| <!--CAMD-->{{No| }}
| <!--Opinion-->2000 offers MTS (Midi Time Stamping) - 12v 2a psu centre pos - usb mini with rs232 and rs422 serial ports - 16 channels (8-in / 8-out), this rack-mountable unit -
|-
| <!--Description-->Evolution U-Control UC-16
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| detected}}
| <!--Opinion-->
|-
| <!--Description-->Focusrite Saffire 6 USB 1.1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Guillemot Maxi Studio ISIS Vintage Sound Card MIDI Audio Interface
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No|dedicated driver}}
| <!--Opinion-->1998
|-
| <!--Description-->[http://www.ucapps.de/mbhp_usb.html MidiBox] Hardware Platform USB Module
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{no| }}
| <!--Opinion-->2001
|-
| <!--Description-->Mackie Control Universal Pro XT with One Two Extenders
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{no| }}
| <!--Opinion-->2008 not compliant,
|-
| <!--Description-->M-Audio Audiophile USB
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->2003 not compliant,
|-
| <!--Description-->M-Audio Midisport UNO old version
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->2004 not compliant,
|-
| <!--Description-->M-Audio MidiMan 1x1 midi interface
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->2004 [http://sourceforge.net/projects/linux-hotplug/ firmware update]
|-
| <!--Description-->M-Audio Midisport 2x2 yellowy green blue, green or silver chassis plastic box
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No|MIDISPORT 2x2 or 4x4 interfaces from previous production series (blue, green or silver chassis) are not class-compliant}}
| <!--Opinion-->2004
|-
| <!--Description-->MAudio Audiosport Quattro USB
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No|dedicated driver}}
| <!--Opinion-->2004 not usb compliant as [http://usb-midi-fw.sourceforge.net/ firmware required and that is buggy],
|-
| <!--Description-->M-Audio UC-33
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{no| }}
| <!--Opinion-->2004 not compliant,
|-
| <!--Description-->M-Audio Midisport 1x1 2x2 4x4 Anniversary Edition, black box
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2010 maybe class compliant,
|-
| <!--Description-->Mooer Steep II Multi-Platform USB Audio Interface
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> usb to 5pin midi interface
|-
| <!--Description-->[http://www.amiga.org/forums/showthread.php?t=52920 Mark of the Unicorn Motu Fastlane] 2x2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No|[http://www.amiga.org/forums/showpost.php?p=560852&postcount=8 not working on OS4]}}
| <!--Opinion--> not class compliant,
|-
| <!--Description-->Motu Micro Lite 1x1 and MOTU microlite 5x5 USB
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No|dedicated driver}}
| <!--Opinion--> good unit but poor just plug in support and not class compliant - USB2 usb-b -
|-
| <!--Description-->Motu MIDI Express 128 8x8
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No|dedicated driver}}
| <!--Opinion-->poor support serial port only - offers MTS (Midi Time Stamping) A serial port based MIDI interface or a USB interface without MTS will have a MIDI slop of up to 2ms on record and playback. MTS provides accuracy for record and playback to around .3ms - five times more accurate than serial or non-MTS."
|-
| <!--Description-->MOTU.com MIDI Express XT
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No|dedicated driver}}
| <!--Opinion-->2008 for many USB should have octocoupled connection to reduce groundloop humm, usually the timing is off
|-
| <!--Description-->MOTU MIDI Timepiece AV
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No|dedicated driver}}
| <!--Opinion--> not class compliant is one of the best multi-port MIDI interfaces ever made as USB model connects to the computer as an 8x16 interface
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Native Instruments GmbH Audio 8 DJ, 4 DJ, 2 DJ
| <!--Vendor ID-->0x17CC
| <!--Product ID-->0x
| <!--Revision-->
| <!--CAMD-->{{no|needs dedicated driver}}
| <!--Opinion-->2006 not class compliant,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> usb to 5pin midi interface
|-
| <!--Description-->Qcon
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> usb to 5pin midi interface
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> usb to 5pin midi interface
|-
| <!--Description-->Roland Edirol UA-100
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No|did not match to camdusbmidi.class USB audio midi with onboard DSP}}
| <!--Opinion-->1998
|-
| <!--Description-->Roland Corp Edirol UM-2
| <!--Vendor ID-->0x0582
| <!--Product ID-->0x0005
| <!--Revision-->0200
| <!--CAMD-->{{no|is not bound via camdusbmidi.class }}
| <!--Opinion-->1999 not bound to any midi class - 2x2 - tested Aros One USb 2.4
|-
| <!--Description-->Roland Edirol UA-100G
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No|detected but not working}}
| <!--Opinion-->1999 USB audio midi with onboard DSP
|-
| <!--Description-->Roland Edirol UM-880 8x8 midi interface
| <!--Vendor ID-->0x0582
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No|detected but not working}}
| <!--Opinion-->2000 under poseidon but could work with run >nil: c:midithru out.0 "EDIROL UM-880.out.2"
|-
| <!--Description-->Roland Edirol UM-1 blue plastic
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{Unk| bound??? via camdusbmidi.class - untested midi in out}}
| <!--Opinion-->2000 UM-1 - 1-in/1-out (16 channels)
|-
| <!--Description-->Roland Edirol UM-1S
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No|not working}}
| <!--Opinion-->2000 1-in/1-out (16 channels)
|-
| <!--Description-->Roland Edirol UM-2E
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No|not working}}
| <!--Opinion-->2000
|-
| <!--Description-->Roland Edirol UM550
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->2001
|-
| <!--Description-->Roland Edirol UM-1X midi interface
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No|do not have the Advanced Driver Switch on them}}
| <!--Opinion-->2001
|-
| <!--Description-->Roland Edirol UM-1SX
| <!--Vendor ID-->0x0582
| <!--Product ID-->0x0052
| <!--Revision-->0200
| <!--CAMD-->{{No|do not have the Advanced Driver Switch on them}}
| <!--Opinion-->2003
|-
| <!--Description-->Roland Edirol Cakewalk UM-2C - 2x2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->2003
|-
| <!--Description-->Roland Edirol Cakewalk UM-1G 1x1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->2004
|-
| <!--Description-->Roland Edirol Cakewalk UM-2G 2x2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->2004
|-
| <!--Description-->[https://github.com/spotify/linux/blob/master/sound/usb/usbquirks.h Roland Edirol UA20 UA-20]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No|not working}}
| <!--Opinion-->2004
|-
| <!--Description-->Roland UM-1EX
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->2005
|-
| <!--Description-->Roland Edirol UM-2EX 2x2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{no| }}
| <!--Opinion-->2005 adds a second MIDI OUT
|-
| <!--Description-->Roland Cakewalk UM-3G - 3x3
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->2006
|-
| <!--Description-->Roland Cakewalk ua-25excw 1x1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No|detected but not working}}
| <!--Opinion-->2009 not class compliant mode
|-
| <!--Description-->[https://alsa.opensrc.org/Edirol_UA-25EX Roland Edirol UA55 UA-55 Cakewalk UA25 EX]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No|detected but not working}}
| <!--Opinion-->2011 not usb compliant,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> usb to 5pin midi interface
|-
| <!--Description-->Sonuus B2M Bass MIDI Interface
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> usb to 5pin midi interface
|-
| <!--Description-->Sonuus G2M
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> usb to 5pin midi interface
|-
| <!--Description-->Steinberg CMC Series
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> usb to 5pin midi interface
|-
| <!--Description-->Subzero SZ-MB44
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> usb to 5pin midi interface
|-
| <!--Description-->Swisssonic MIDI1x1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->2012 AmigaOS there is no output at midichannel one and two but if play a midi file there is only output on some channels and if pressed stop the prog freezes or the whole system crashes
|-
| <!--Description-->Teac Tascam US-428 US-422 midi interface
| <!--Vendor ID-->0x0644
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion--> 2000 not compatible
|-
| <!--Description-->Teac Tascam [http://web.archive.org/web/*/http://www.tascam.com/Products/US-224.html US-224]
| <!--Vendor ID-->0x1604
| <!--Product ID-->0x8004
| <!--Revision-->0100
| <!--CAMD-->{{No| }}
| <!--Opinion--> 2002 does not bind to any class
|-
| <!--Description-->Teac Corp Tascam US-1x2
| <!--Vendor ID-->0x0644
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->2002
|-
| <!--Description-->Teac Tascam US-122 MKII midi interface
| <!--Vendor ID-->0x0644
| <!--Product ID-->0x8021
| <!--Revision-->0100
| <!--CAMD-->{{No|not detected / binding to camdusbmidi.class on AROS 2.4 usb }}
| <!--Opinion-->2004 detected but not working 2-in/2-out USB two XLR microphone preamps with phantom power for condenser microphones
|-
| <!--Description-->Teac Tascam US-200 US-400 US-600 US-800 US-1200 US-1800
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No|no driver}}
| <!--Opinion-->2010 may not be totally usb compliant
|-
| <!--Description-->Yamaha UX-16
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No|no driver}}
| <!--Opinion-->2010
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> usb to 5pin midi interface
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> usb to 5pin midi interface
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| CAMD
| Opinion
|-
| <!--Description-->Akai EIE and Pro version midi interface
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2011 dc 6v power - 3 USB hubs, midi in out ,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> usb to 5pin midi interface
|-
| <!--Description-->Alesis I/O2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{no| }}
| <!--Opinion-->2007 powered USB hub required, not compliant
|-
| <!--Description-->Alesis IO2 Express
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2010 usb compliant?
|-
| <!--Description-->Alesis IO4 Express
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2010
|-
| <!--Description-->Behringer XTouch
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> psu needed
|-
| <!--Description-->Behringer X-Touch Compact
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2014 maybe usb compliant?
|-
| <!--Description-->Behringer X-Touch Mini
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2014 maybe usb compliant?, usb to 5pin midi interface
|-
| <!--Description-->Behringer U-Phoria UMD404HD UMD202HD
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2019 maybe class compliant - volume low,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->CME U2 MIDI Pro 1x1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> current model
|-
| Creative EMU XMIDI 1X1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2008 early versions with sysex checksum errors
|-
| <!--Description-->Creative E-MU Xmidi 1x1 Tab (V3)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2010 tab version class compliant but report that when transferring 'System Exclusive' messages (SysEx) the unit could not handle the highest data rate leading to data corruption
|-
| Creative EMU XMIDI 2x2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2008 sysex errors
|-
| <!--Description-->Digidesign Mbox 2 Mini now Avid
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{no| }}
| <!--Opinion-->2005 USB powered but not compliant
|-
| <!--Description-->Digidesign Mbox II Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{no| }}
| <!--Opinion-->2006 USB powered but not compliant
|-
| <!--Description-->Engl Z7 MIDI Interface (E660/E610/E360/E930)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> guitar?
|-
| <!--Description-->Elektron TurboMidi TM-1 1in 1out
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->ESI MidiTerminal M4U 4x4 midi interface
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->supposedly class compliant - USB bus powered -
|-
| <!--Description-->ESI MidiTerminal M8U 8x8
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->ESI MidiTerminal M4U XL 4x4
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> ploytec chipset
|-
| <!--Description-->ESI MidiTerminal M8U XL 8x8
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> no hardware routing e.g. x on input 5 to synth y on output 7 - ploytec chipset
|-
| <!--Description-->ESI MidiMate 1x1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> supposedly class compliant - USB bus powered
|-
| <!--Description-->ESI MidiMate II 2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->ESI ROM I/O
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2005 romio version
|-
| <!--Description-->ESI M4U XT
| <!--Vendor ID-->0x2573
| <!--Product ID-->0x0002
| <!--Revision-->0100
| <!--CAMD-->{{Maybe|is bound via camdusbmidi.class AROS One 2.4 - untested midi in out}}
| <!--Opinion-->2010 -
|-
| <!--Description-->ESI M8U XT 8in 8out
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2010 discontinued 2018
|-
| <!--Description-->ESI M8UEX USB3.0
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2018 current model
|-
| <!--Description-->ESI M4U eX
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2018 current model
|-
| <!--Description-->ESI MidiMate eX midi interface 1x1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2016 current model, well liked and might class compliant??
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> usb to 5pin midi interface
|-
| <!--Description-->icon midiport 2x2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> usb to 5pin midi interface
|-
| <!--Description-->iCON CubeMi 3
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> class compliant?
|-
| <!--Description-->iConnectivity
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> usb to 5pin midi interface
|-
| <!--Description-->iConnectivity mio
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2010 class compliant but reported issues with sending System Exclusive (SysEx) MIDI messages and MIDI signals getting cut off
|-
| <!--Description--> iConnectMidi interface
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2010
|-
| <!--Description-->iCM2 iCM4
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2012
|-
| <!--Description-->iConnectivity iConnectMIDI4+ L
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2014 class compliant??
|-
| <!--Description-->iConnectivity MioXL
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->IK Multimedia iRig MIDI 2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> class compliant
|-
| <!--Description-->iRig Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> usb to 5pin midi interface
|-
| <!--Description-->Kenton
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> usb to 5pin midi interface
|-
| <!--Description-->Kenton Electronics pro solo mk2 midi to cv converter
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> usb to 5pin midi interface
|-
| <!--Description-->Kenton Midi Thru-25 5
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> usb to 5pin midi interface
|-
| <!--Description-->Keytech MT18E 8 Way Midi Thru box
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> 9 to 12v psu required
|-
| <!--Description-->MidiPlus Midi 2x2 midi interface
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> usb to 5pin midi interface
|-
| <!--Description-->MidiPlus Midi 4x4
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> supposedly class compliant - USB bus powered
|-
| <!--Description-->MidiTech MIT-00151 Midiface 4x4
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> usb to 5pin midi interface
|-
| <!--Description-->MidiTech Midiface 4x4 8x8 16x16 thru merge
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> usb to 5pin midi interface
|-
| <!--Description-->Miditech Midilink mini 1x1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> usb to 5pin midi interface
|-
| <!--Description-->M-Audio Midisport UNO only if box is labeled Class Compliant and latest MIDISPORT 1x1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->M-Audio Fast Track Ultra (6 in 6 out)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2008 not usb compliant, -
|-
| <!--Description-->M-Audio Midiman Midisport 2x2 Anniversary Edition [https://gearspace.com/board/electronic-music-instruments-and-electronic-music-production/1133862-why-there-hardly-any-midi-interfaces.html not stable enough]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2009 USB2 usb-b - does not need firmware and supposedly plug and play -
|-
| <!--Description-->M-Audio Midisport 4x4 Anniversary Edition
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> rumored does not need firmware - supposedly plug and play - issues with its firmware for some and lacks configurable routing
|-
| <!--Description-->Maudio Fast Track Ultra 8R
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> usb to 5pin midi interface
|-
| <!--Description-->Native Instruments Komplete Audio 6 Mk1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2011 maybe usb compliant but bus powered,
|-
| <!--Description-->Nektar Midiflex 4
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|untested}}
| <!--Opinion-->2015 class compliant and usb-b powered - used as a 1 in / 3 out, 2 in / 2 out or 4 out 5pin sockets -
|-
| <!--Description-->Neusonik IM-One
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> usb to 5pin midi interface
|-
| <!--Description-->Peavey Xport
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> guitars only
|-
| <!--Description-->Roland UM-ONE UM-1 mk2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->2010 USB class compliant if switch to TAB for class compliant mode rather than the COMPUTER mode
|-
| <!--Description-->Squarp Hermid
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> usb to 5pin midi interface
|-
| <!--Description-->Steinberg Midex 8x8
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> class compliant? supporting MIDI Time Stamping protocol
|-
| <!--Description-->Swissonic MidiConnect 2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> usb to 5pin midi interface
|-
| <!--Description-->Tapco LiNK.midi USB 4x4 (Loud technologies)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{no|dedicated driver}}
| <!--Opinion-->2005
|-
| <!--Description-->Teac Corp Tascam US-2x2
| <!--Vendor ID-->0x0644
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{no| }}
| <!--Opinion--> 2014 5v dc power, midi out in,
|-
| <!--Description-->Teac Corp Tascam US-4x4
| <!--Vendor ID-->0x0644
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->
|-
| <!--Description-->Teac Tascam US-16x08 US-20x20
| <!--Vendor ID-->0x0644
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No| }}
| <!--Opinion-->
|-
| <!--Description-->Zoom U-24
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> midi to 5pin interface
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> midi to 5pin interface
|-
| <!--Description-->Unbranded cable
| 0x552d
| 0x4348
| F110
| <!--CAMD-->{{Maybe|detected but no usb driver in devs/midi for camd to use}}
| <!--Opinion-->detected but not working the USB-MIDI conversion functionality of the cheapo USB MIDI "cable" interface is simply lacking, possibly being incapable of handling MIDI strings longer than 3 bytes long SysEx strings (e.g. SysEx dumps) - tested in Icaros 2.3 -
|-
| <!--Description-->USB2.0-MIDI Unbranded cable with clear braided underneath leads
| <!--Vendor ID-->0x1A86
| <!--Product ID-->0x752D
| <!--Revision-->0254
| <!--CAMD-->{{Maybe|detected binding to camdusbmidi.class but untested midi in / out}}
| <!--Opinion-->untested but better to get a branded version - tested AROS One 2.4 usb
|-
| <!--Description-->LogiLink USB to Midi In-Out
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk|}}
| <!--Opinion-->untested cheap cable version but issues with latency on other systems
|-
| <!--Description--> gm5 USB midi chip DIY option only
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> usb to 5pin midi interface
|-
| <!--Description-->Doremidi LEKATO MIDI USB C Interface 1x1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> usb to 5pin midi interface
|-
| <!--Description-->Thomann Midi USB 1x1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> Prodipe made
|-
| <!--Description-->Prodipe MIDI 1i/1o
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> usb to 5pin midi interface
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|}
Classic 5pin DIN controllers for above interfaces
{| class="wikitable sortable" width="90%"
! width="20%" | Description
! width="10%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="10%" |CAMD
! width="30%" |Opinion
|-
| <!--Description-->Akai s5000 s6000
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> midi digital samplers
|-
| <!--Description-->Akai AX80
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Casio CZ-5000
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Casio CZ-3000 CZ-1000 CZ-101
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Cheetah MS6 midi controller
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{No|untested}}
| <!--Opinion-->2000 multi-timbral, six-voice (twelve-oscillator), analogue synthesiser module is loaded with CEM 3396s
|-
| <!--Description-->Ensoniq ESQ1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Integra
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Korg Wavestation Ex A/D SR
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->1986 ex has piano and drum sounds
|-
| <!--Description-->Korg DW-8000
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Korg DW-6000
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Korg Poly 800 MK1 Poly-800ii
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> all plastic and can run on batteries - 49 keys non-velocity dco synt analogue filter
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Roland D-50
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->
| <!--Opinion-->{{N/A|1987 untested greater concern would be moisture and wear}}
|-
| <!--Description-->Roland A50 (76) A80 (88)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->
| <!--Opinion-->{{N/A|1989 untested}}
|-
| <!--Description-->ROLAND JUNO-D
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->Roland Juno 106
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->80s kx73 or kx88
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->Roland ED PC-160A PC-180A
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->
| <!--Opinion-->{{N/A|untested}} legacy DIN5 MIDI port only - 6 AA batteries or 9v psu - One regular source of failure for me were emty batteries (even with red control light still active). Another source was a bad MIDI cable - unplug then re-plug the USB cable while it is powered the device might reconnect
|-
| <!--Description-->Roland M1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Roland S-550 S-760
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion--> digital samplers kontakt replaced these?
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Yamaha DX7
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->1983 12bit
|-
| <!--Description-->Yamaha DX7S DX72IID DX7IIFD
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->1987 16bit versions
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--CAMD-->{{unk| }}
| <!--Opinion-->
|-
|}
The MIDI standard was published in August 1983. The inventors, Kakehashi and Smith finally received a Technical Grammy Award in 2013 for their work.
The MIDI files that contained just the note data, velocity and timing meant you could transfer an entire studio session from one place to another on one floppy disk and it could control all the synths and drum samplers. Pass-thru meant that one computer could run an entire bands worth of instruments.
It's bulletproof too. MIDI never goes wrong, it's always a bug in software that causes any issue - you can absolutely rely on it to go gigging with, take your synths, controllers and computers and not crash an entire gig at your 100,000 person venue.
The MIDI hardware specification is very simple (voltage, polarity, screening, protection and a fast enough opto-isolator), it assumes that the data it sends and receives between MIDI devices is to the MIDI data standard and just passes it on. The microprocessor in the hardware does all the work.
The minimum for a computer/MIDI interface is that it meets the MIDI hardware specification. It is attached to the computer bus and handles the electrical conversions required. To meet the MIDI hardware specification, to be class compliant as a USB device all it has to do is report itself properly when plugged in.
The other half of the equation is the MIDI data standard, and for a computer MIDI interface the main issue is the speed of data transmission. The bus speed of the computer is faster than the speed of the MIDI standard so it can generate and send MIDI data faster than a MIDI device can receive it. The MIDI standards have nothing to say on that bottleneck at all. MIDI was designed to be very simple and very open, it just defines a standard for the messages and leaves it up to manufacturers to implement them in the way they want. That's what makes it so powerful a tool, and also what makes it so confusing and frustrating at times.
For midi, the hardware/software combination at various connection points handles the translation to/from midi (or other protocols). Drivers would be needed for midi, including clock and SysEx signal (actually claiming to handle ALL midi quirks transparently
All the important MIDI data types can be sent (CC, NRPN, RPN, MMC, Note On/Off, program change)
There is no official way to solve the data bottleneck. Early software sequencers and librarians tried to solve it by having an option to buffer SYSEX data in software and transmit it at the MIDI data rate. The downside is that hogs the bus and can hit computer performance. Interface manufacturers would add a hardware buffer which would take all the MIDI data from the PC bus and feed it into the MIDI at the slower data rate, but that added cost and created timing issues.
Things have moved on since then, but the principles remain the same. You can buffer in the hardware or in software, whether that is in the application or the interface driver. SYSEX will work perfectly well with that budget cable if your software handles the buffering. And while the cables with hardware buffers make SYSEX easier, they still have potential problems because of the limitations of the MIDI data rate. Your MIDI clock doesn't like being interrupted with a big program dump
The serial / parallel ports were a direct connection, so faster. Now, everything in the computer is virtual and the only thing connected to the hardware is the kernel, hence everything is by default bottlenecked and jittery, regardless of which connection. So by the time the interface gets the information it's already too late.
Ethernet network cable to transport MIDI over large distances, connect 2 MIDI In and 2 MIDI Out ports to patch, remap, filter and merge MIDI flows on a fine channel basis for tight MIDI throughput, latency and jitter
Possibilities for DAWs of the future including a kind of sync reference for timing reference which an interface could sync to, hence all the timings then would be locked between the grid on the DAW screen and the MIDI info.
Preemptible, low latency and accuracy are essential for good communication.
One of the first things you need to do, is make sure your MIDI software sets the interface to the same MIDI channel as your keyboard (usually 1)
Do you want to send just your master keyboard to other synths or to be able to use any keyboard with any synth?
1st option is relatively simple. Just need to send midi from your master keyboard into a midi splitter that redistributes the signal onto your synths. Each synth will be set up to receive midi on a specific channel so the only challenge is to find a way to select to which channel you are sending midi. Some master keyboards can do that although not many that have a dedicated knob or switch on the panel and most require a bit of menu diving. Could use a midi box that offers channel selection but usually this is not very workflow friendly. The software route would require using the mouse.
2nd option is a bit more complex but superior workflow by sending midi messages into a merge box, from there into a hardware sequencer that allows to select midi channel, then on to a midi interface that distributes the signal to the synths.
Master keyboard MIDI-in to computer. External hardware sampler MIDI-out from computer. Audio-out from sampler to audio-in on computer/device.
Blue Ribbon Soundworks Bars & Pipes Professional (1993/4)
GM (1984), GS (1987), XG level 1-3 (1994-1997), GM level 2 (1999)
GM GM1 imposes several requirements beyond the MIDI 1.0 specification. While MIDI 1.0 by itself provides a communication protocol which ensures that different instruments can interoperate at a fundamental level e.g sound modules. GM goes further in two ways. First, GM requires that all compliant MIDI instruments meet a certain minimal set of features, such as being able to play at least 24 notes simultaneously (polyphony). Second, GM attaches specific interpretations to many parameters and control messages which were left unspecified in the MIDI 1.0 specification. A minimum of 128 MIDI Program Numbers (conforming to the GM 1 Instrument Patch Map) and 47 percussion sounds (conforming to the GM 1 Percussion Key Map). Support for controller number 1, 7, 10, 11, 64, 100, 101, 121 and 123; support for channel pressure and pitch bend controllers.
General MIDI Level 2 or GM2 is a specification for synthesizers which defines several requirements beyond the MIDI standard and is based on General MIDI (GM) and Roland GS extensions. It was adopted in 1999 by the MIDI Manufacturers Association (MMA).
* Number of Notes: 32 simultaneous notes
* MIDI Channels: 16
* Simultaneous Melodic Instruments – up to 16 (all Channels)
* Simultaneous Percussion Kits – up to 2 (Channel 10/11)
Program and bank change events
General MIDI 2 compatible synthesizers access all of the 256 instruments by setting cc#0 (Bank Select MSB) to 121 and using cc#32 (Bank Select LSB) to select the variation bank before a Program Change. Variation bank 0 contains the full GM (General MIDI 1) sound set. Variations using other bank numbers are new to General MIDI 2, and correspond to variation sounds introduced in Roland GS.
[https://www.youtube.com/watch?v=CluuHrr7HG4 Major WWHWWWH, Minor WHWWHWW scale], [https://www.youtube.com/watch?v=Jjm7Ti-iwz0 Chords],
==usb audio==
USB audio has recently made available for Aros, there are many standards introduced over the years. Much is still untested.
*Introduced 2000 and from 2014 USB Audio 1 UAC1 16bit 44.1kHz
*Introduced 2006 and from 2014 USB Audio 2 [https://www.usb.org/document-library/usb-device-class-definition-audio-devices-release-20-errata-and-ecn-through-april UAC2] 24bit 192kHz
*Introduced 2016 and from 2024 USB Audio 3 [https://www.usb.org/documents UAC3] 32bit 384kHz
USB group decided to rewrite the audio standard, so [https://os4depot.net/?function=showfile&file=audio/record/usbaudio2.lha UAC2] and [https://archive.fosdem.org/2019/schedule/event/linux_and_usb_audio_class_3/attachments/slides/3345/export/events/attachments/linux_and_usb_audio_class_3/slides/3345/Linux_and_USB_Audio_Class_3___FOSDEM_2019.pdf UAC3]. They added clock selection and control, timing domains and others. Part of the changes included changing many of the descriptors that an audio device uses to describe itself to the machine.
PsdErrorlog/PsdDevlister? The AHI driver generated only supports mono/stereo at any bit rates between 8 and 32 bit per sample, but not multichannel modes and only rates up to 65KHz (because AHI uses a 16-bit word for frequencies). If the soundcard does not offer such a PCM 8-32 bit mode at frequencies lower than 65 KHz, there's nothing much that can be done about it on the computer side other than revising and expanding the AHI standard. Most cheap USB soundcards do though.
AHI does not support six channel playback. It only supports mono, stereo and multichannel (8 channels). Due to the multichannel mode not being used by any application so far, the usbaudio.class does not support multichannel playback, especially not "upchannelling" stereo to six or more channels. If this USB device does not support a two channel mode, you can't use it under AHI.
Untested but most likely to work, at least 2 mic inputs (low impedance) & instruments (high impedance) and made in the last 10 years
*[https://www.youtube.com/watch?v=gMuA-2FbJxE Entry level <100Euro] BOMGE U202, Behringer UMC, Presonus Studio,
*[ Next tier <200Euro] Audient iD, Solid SSL2 and SSL2+, Lewitt, Focusrite Scarlett, Arturia MiniFuse,
*[ Prosumer <300Euro] Focusrite Clarett+,
*[ Professional <500Euro] RME Babyface,
*[ Studio >500Euros]
Bands should need 4 or more mic inputs
[http://forum.xda-developers.com/showthread.php?p=38364030 XDA Forum thread],
<pre>
<- Computer
<- Mobile Phone / Tablet (OTG)
<- Digital Cameras
<- Video <- Webcams
Base Computer <-> OBS like <- Audio Mixer <- Microphone(s)
-> Internet -> Youtube & Chat
</pre>
USB AUDIO CARDS - UAC Compliant
{| class="wikitable sortable" width="90%"
! width="20%" |Description
! width="10%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="10%" |Playback
! width="10%" |Records
! width="30%" |Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Antelope Galaxy 64 Synergy Core
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no| }}
| <!--Records-->{{no| }}
| <!--Opinion--> not compliant so does not wotk with Aros and a high-end 64-channel AD/DA converter HDX, Dante connectivity and a Thunderbolt Audio interface
|-
| <!--Description-->Antelope Galaxy 32 Synergy Core
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no| }}
| <!--Records-->{{no| }}
| <!--Opinion--> not be compliant so does not wotk with Aros as Antelope Audio does not provide official drivers, control software, or an Antelope Launcher
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Arturia Mini Fuse 1
| <!--Vendor ID-->0x1C75
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->2021 maybe usb compliant, okay pre amp 1 combi input, cirrus logic cs4272 ad converter,
|-
| <!--Description-->Arturia MiniFuse 2
| <!--Vendor ID-->0x1C75
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->2021 maybe usb compliant usb-c with usb2.0, okay pre amps with good dynamic range 110dB, cirrus logic cs4272 ad converter, two combi inputs for mic, line or guitar,
|-
| <!--Description-->Arturia MiniFuse 4
| <!--Vendor ID-->0x1C75
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->2022 maybe usb compliant, okay 110dB dynamic range, -129dB EIN,
|-
| <!--Description-->Arturia AudioFuse 16Rig
| <!--Vendor ID-->0x1C75
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->2023 maybe usb compliant, good
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Audient iD44 mk1 mki
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->2018 maybe usb compliant, good,
|-
| <!--Description-->Audient evo4 EVO8
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2020 maybe usb compliant,
|-
| <!--Description-->Audient iD4 mk2 mkII
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2022 maybe usb compliant,
|-
| <!--Description-->Audient id14 mk2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->2022 maybe usb compliant, good,
|-
| <!--Description-->Audient iD24
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->2023 maybe usb compliant and usb-c bus powered, good, , 0-in/14-out audio interface with ADAT expandability, balanced inserts
|-
| <!--Description-->Audient iD44 Mk2 Mkii
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->2022 maybe usb compliant, good,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Behringer U-PHORIA UMC22
| <!--Vendor ID-->0x1397
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2014 maybe usb compliant, okay, midas pre-amps
|-
| <!--Description-->Behringer U-PHORIA UMC202HD
| <!--Vendor ID-->0x1397
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2014 maybe usb compliant, okay, midas pre-amps ein -129 dBu, 24bit ADC,
|-
| <!--Description-->Behringer U-PHORIA UMC404HD
| <!--Vendor ID-->0x1397
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2014 maybe usb compliant, okay, midas pre-amps, 24bit adc,
|-
| <!--Description-->Behringer U-PHORIA UMC204HD 192 Empower Tribe
| <!--Vendor ID-->0x1397
| <!--Product ID-->0x0508
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2015 maybe usb compliant, okay, midas pre-amps
|-
| <!--Description-->Behringer UMC1820
| <!--Vendor ID-->0x1397
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->2016, bus complaint?, okay midas pre amps, adc,
|-
| <!--Description-->Behringer U-PHORIA UM2
| <!--Vendor ID-->0x1397
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2018 maybe usb compliant, poor zenyx pre-amps with high noise floor, plastic build no rf shielding, latency issues,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Focusrite Saffire 6 USB 1.1
| <!--Vendor ID-->0x1235
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2008 maybe usb compliant, , , midi, strictly NEC USB 2.0,
|-
| <!--Description-->Focusrite Scarlett 8i6 Gen 1 MOSC0001
| <!--Vendor ID-->0x1235
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2011 maybe usb compliant, but
|-
| <!--Description-->Focusrite Scarlett 2i2 Gen 1 MOSC0003
*TP1 - 3.3V, tested ok
*TP2 - U4 control signal, 3.3V present at all time.
*TP4 - Ground
*TP6 - 48V, tested ok
*TP7 - Ground
*TP8 - Ground
| <!--Vendor ID-->0x1235
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2011 usually avoid early Gen 1,
|-
| <!--Description-->[https://khronscave.blogspot.com/2021/08/75-focusrite-scarlett-2i4-1st-gen.html Focusrite Scarlet 2i4 Gen 1 (slide toggles) MOSC0004]
*TP1 - 3.3V, tested 3.22v
*TP2 - U4 control signal, 3.3V present
*TP4 - Ground
*TP6 - measure 47.72v
* AKM 4384ET (VDD 5v)
* Cirrus Logic CS4272-CZZ (VA 4.94v/ VD 3.2v/ VL 3.2v)
* all four HC4066 (VCC 4.96v)
* XMOS XS1-L01A-TQ128-C5 (all VDD 1.08v/ all VVDIO 3.23v/ PPLAVDD 0.99v/ PCU-VDDIO 3.23v)
2i4S
*TP1 seems to be 0V
*TP2 should be 5V
*TP3 should be
*TP6 should be 48V
*TP8 should be 3.3V
| <!--Vendor ID-->0x1235
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2011 maybe usb compliant, pre amps JRC NJM2122 and NJM4565, [https://statics.cirrus.com/pubs/proDatasheet/CS4272_F1.pdf CS4272 adc], [https://pdf.datasheet.live/e5e5fd1c/akm.com/AK4384.pdf AK4384 output pair], Xmos XS1-L8A-64-TQ128 processor and firmware in Winbond 25X40CL 4Mbit, an SMSC Microchip USB3343 interface and a Microchip PL611 clock generator - two Intersil / Renesas ISL97519A for the phantom power rail, two OnSemi NCP1521B for the 3.3V (digital) and 1V (Xmos core) rails -
|-
| <!--Description-->Focusrite iTrack Solo USB Audio Interface
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->2012 maybe usb compliant,
|-
| <!--Description-->Focusrite Scarlett 18i20 1st Gen MOSC00
| <!--Vendor ID-->0x1235
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2013 maybe usb compliant, , Cirrus CS4272,
|-
| <!--Description-->[http://wiki.linuxaudio.org/wiki/current_audio_gear Focusrite ] Scarlett 4i4 Gen MOSC00
| <!--Vendor ID-->0x1235
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion--> maybe usb compliant, , Cirrus CS4272,
|-
| <!--Description-->Focusrite Scarlett 6i6 Gen1 MOSC00
| <!--Vendor ID-->0x1235
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2013 maybe usb compliant, , , 12v psu, the headphone outs mirror the outs on the back panel, so that's six independent outs. 4 independent analog output paths, plus two over spdif,
|-
| <!--Description-->[https://khronscave.blogspot.com/2019/03/38-focusrite-scarlett-18i8-gen1-teardown.html Focusrite Scarlett 18i8 1st Gen MOSC0008]
| <!--Vendor ID-->0x1235
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2013 maybe usb compliant, JRC NJM4565 provide most of the opamps, pair of JRC NJM2122's for inputs 1 and 2, [http://www.mouser.com/ds/2/76/cs4272_f1-43250.pdf Cirrus CS4272], 12v 1a +central psu to a pair of National Semiconductor LM2672 for 3.3V rail and the +6.9V rail, Xmos XS1–L16A–128 dual-row QFN package, firmware a Winbond 25X40C 4Mbit SPI Flash and an SMSC USB3343 interface chip, the two headphone outs are completely independent so 6 independent analog output paths, plus two over spdif,
|-
| <!--Description-->Focusrite Clarett+ 8Pre
| <!--Vendor ID-->0x1235
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2015 great, expensive, maybe usb compliant?
|-
| <!--Description-->Focusrite Scarlett 2i2 Gen 2 (slide toggles) MOSC0006
*TP6 should be 48V
| <!--Vendor ID-->0x1235
| <!--Product ID-->0x8202
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2016 maybe usb compliant, USB-b bus powered, good preamps ein equivalent input noise -128 dBu, 24-bit 192kHz CS4272 as well as an additional AKM AK4384ET for the second stereo output pair, 4 screws under bottom rubber,
|-
| <!--Description-->[https://khronscave.blogspot.com/2021/07/focusrite-scarlett-2i4-2nd-gen-teardown.html Focusrite Scarlett 2i4 Gen 2 (slide toggles) MOSC0014]
*TP6 should be 48V
| <!--Vendor ID-->0x1235
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2016 maybe usb compliant, USB-b bus powered, good preamps NJM2122's, NJM4565's and CMOS switches (HEF4053 and HEF4066), CS4272 and a AKM AK4384ET, Xmos XU208-256-TQ64-C10 with firmware stored in a Macronix MX25L8006E 8Mbit flash memory, clocking by a Cirrus Logic CS2100, an MP1542 boost converter creates +6V and -6V rails, powering the opamps and the rest of the analog circuitry,
|-
| <!--Description-->Focusrite Scarlett 6i6 Gen2 MOSC0016
| <!--Vendor ID-->0x1235
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2016 maybe usb compliant, 12v psu,
|-
| <!--Description-->Focusrite Scarlett Solo 2nd Gen MOSC0019
| <!--Vendor ID-->0x1235
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2016 maybe usb compliant,
|-
| <!--Description-->[https://khronscave.blogspot.com/2024/03/focusrite-scarlett-18i8-gen2-teardown.html Focusrite Scarlett 18i8 2nd Gen MOSC00]
| <!--Vendor ID-->0x1235
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2016 maybe usb compliant, 12v psu,
|-
| <!--Description-->Focusrite Red 16Line
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2017 may not be compliant as Focusrite provides no drivers - 64-in/64-out Pro Tools - dual Thunderbolt 3 audio interface with ultra-low latency A-D/D-A conversion - Red Evolution mic preamps
|-
| <!--Description-->Focusrite Scarlett Solo 3rd Gen MOSC0024
| <!--Vendor ID-->0x1235
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2019 maybe usb compliant usb-c but usb2, preamps, ad/dc 24bit 192kHz, most Focusrite gen3 interfaces have encrypted processors,
|-
| <!--Description-->Focusrite Scarlett 18i6 Gen3 MOSC00
| <!--Vendor ID-->0x1235
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2019 maybe usb compliant, USB2 class compliant device, but with custom mixer interface
|-
| <!--Description-->Focusrite Scarlett 2i2 Gen 3 (push in switches) MOSC00
| <!--Vendor ID-->0x1235
| <!--Product ID-->0x8210
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2019 maybe usb compliant, USB-c bus powered, good preamps ein equivalent input noise -128 dBu, 24-bit 192kHz Cirrus Logic xfr002c and cs4272 chips,
|-
| <!--Description-->Focusrite Scarlett 18i20 3rd gen MOSC00
| <!--Vendor ID-->0x1235
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2019 maybe usb compliant,
|-
| <!--Description-->Focusrite Scarlett 18i8 3rd Gen MOSC00
| <!--Vendor ID-->0x1235
| <!--Product ID-->0x8214
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2019 maybe usb compliant, , , no screws under the rubber pads on the bottom, 12v psu,
|-
| <!--Description-->Focusrite Scarlett Solo Studio Mk3 USB Audio Interface MOSC0030
| <!--Vendor ID-->0x1235
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->2020
|-
| <!--Description-->Focusrite Scarlett 2i2 4th Gen USB
| <!--Vendor ID-->0x1235
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2024 maybe usb compliant,
|-
| <!--Description-->Focusrite Scarlett 4i4 4th Gen USB
| <!--Vendor ID-->0x1235
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2024 maybe usb compliant,
|-
| <!--Description-->Focusrite Scarlett Studio 4th Gen USB
| <!--Vendor ID-->0x1235
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2024 maybe usb compliant,
|-
| <!--Description-->Focusrite Scarlett Solo 4th Gen MOSC00
| <!--Vendor ID-->0x1235
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion--> maybe usb compliant,
|-
| <!--Description-->Focusrite Scarlett 18i20 4th Gen MOSC00
| <!--Vendor ID-->0x1235
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2024 maybe usb compliant,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->FractalAudio FM9
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2018
|-
| <!--Description-->Fractal Audio AM4 platform
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2023 not working
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Lewitt Connect 6
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion--> maybe usb compliant,
|-
| <!--Description-->Lewitt
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Mooer Steep II Multi-Platform USB Audio Interface
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Motu UltraLite AVB
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion--> usb not compliant?
|-
| <!--Description-->MOTU M2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion--> maybe not usb compliant?, usb-c, good pre amps, ad/dc,
|-
| <!--Description-->MOTU M4
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion--> maybe not usb compliant, okay,
|-
| <!--Description-->MOTU U2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion--> maybe not usb compliant, good but latest had hardware revision
|-
| <!--Description-->MOTU UltraLite-mk3
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2010 not usb compliant, great
|-
| <!--Description-->MOTU UltraLite-mk5
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2020 not usb compliant, great
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Nuemann MT48
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion--> usb audio compliant, great pre-amps
|-
| <!--Description-->Neumann MT48
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->neuralDSP Quad Cortex QC platform
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2024 cc compliant but plugins not working
|-
| <!--Description-->NeuralDSP QC Lite
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2024 cc complaint
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Neve Genesys Black G16 G32 G64
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion--> not compliant - very good very expensive
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Presonus AudioBox USB
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2008 maybe not usb compliant, usb1.1 usb-b bus powered, okay pre-amps, 24bit ADC 48Khz max,
|-
| <!--Description-->Presonus Audiobox 1818VSL
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2011 maybe not usb compliant,
|-
| <!--Description-->Presonus AudioBox 44VSL
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2011 may not be usb compliant, 12v psu,
|-
| <!--Description-->PreSonus AudioBox 22VSL
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2011 maybe not usb compliant,
|-
| <!--Description-->|PreSonus Studio 2|4 2x2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion--> maybe usb compliant, usb-b,
|-
| <!--Description-->|PreSonus Studio 2|6
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2017 maybe usb compliant,
|-
| <!--Description-->|PreSonus Studio 6|8 USB Audio Interface
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2017 maybe compliant, needs ext psu,
|-
| <!--Description-->PreSonus Studio 24c 2x2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2019 maybe usb compliant, usb-c, good, adc,
|-
| <!--Description-->PreSonus Studio 26c
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2019 maybe usb compliant, usb-c,
|-
| <!--Description-->PreSonus® Studio 68c
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2019 maybe usb compliant, usb-c,
|-
| <!--Description-->PreSonus AudioBox USB 96
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2020 maybe usb compliant, high preamp noise,
|-
| <!--Description-->Presonus Quantum ES2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2022 maybe usb compliant, okay,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->Prism
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->Prism Lyra
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2013 maybe not usb compliant, great
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->Platane UP1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2024 maybe usb compliant usb- UAC2 asynchronous protocol, 64dB Low-noise Mic amplifier, 32Bit High End ADC and DAC, 16dBu High-power ti headphone amplifier
|-
| <!--Description-->Platane UP2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2024 maybe usb compliant,
|-
| <!--Description-->Platane
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->RME Babyface/UC/UFX
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2010 maybe not usb compliant, good
|-
| <!--Description-->RME Fireface UCX
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2012 might be able to put into class compliant cc although a firewire device, pre amps, adc,
|-
| <!--Description-->RME Babyface Pro FS
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2019 maybe not usb compliant, good
|-
| <!--Description-->RME Fireface UCX II
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2021 might be class compliant usb-b, pre amps, adc,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Solid State Logic SSL2 SSL2+ Mk1 1st Gen
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2020 maybe usb compliant, good, adc,
|-
| <!--Description-->Solid State Logic SSL12 SSL18
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2022 maybe usb compliant, bus powered, good pre-amps, up to 32-bit 192kHz AD/DA converters, 12-in 8-out,
|-
| <!--Description-->Solid State Logic SSL2 SSL2+ MkII
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2024 maybe usb compliant, good pre amps ein -130 dBu, ad/dc, okay latency,
|-
| <!--Description-->Solid State Logic
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion--> maybe usb compliant,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->Topping E1x2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2023 maybe usb compliant, good
|-
| <!--Description-->Topping Pro E2x2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2023 maybe usb compliant, good
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->UAD UA Apollo
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2012 maybe not usb compliant,
|-
| <!--Description-->UA apollo 2nd Gen twin X (Duo/Quad), X4, X6, X8, X8P, and X16
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2015 bus compliant?, usb-
|-
| <!--Description-->UA apollo twin x quad 3rd Gen
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2018 bus compliant?, usb-
|-
| <!--Description-->Universal Audio Volt 1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2021 maybe usb compliant, good,
|-
| <!--Description-->|Universal Audio Volt 276 2|76
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2021 maybe usb compliant, good,
|-
| <!--Description-->Universal Audio Volt 2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2022 maybe usb compliant, good,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Playback
| Records
| Opinion
|-
| <!--Description-->Akai EIE Pro AI01 Electromusic Interface Expander -
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2011 maybe not usb compliant, 4-in/4-out USB 2.0 audio interface with a built-in USB hub and MIDI I/O, up to 24-bit/96kHz
|-
| <!--Description-->Akai EIE Pro AI02
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion--> maybe not usb compliant,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->|Alesis io2 io|2, io14 io|14, io26 io|26
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no| }}
| <!--Records-->{{no| }}
| <!--Opinion-->2006 bus powered but not usb compliant, okay pre-amps, 2, 4 or 8 mics respectively,
|-
| <!--Description-->Alesis iO2 Express
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no| }}
| <!--Records-->{{no| }}
| <!--Opinion-->2010 not usb compliant, poor pre-amps,
|-
| <!--Description-->Alesis Core 1 USB Audio Interface
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2014 maybe cc, mini usb, poor latency,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Apogee Duet 1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no| }}
| <!--Records-->{{no| }}
| <!--Opinion-->2009 firewire only, not usb compliant micro-usb with most features, , , two‑channel two‑in, two‑out,
|-
| <!--Description-->Apogee Ensemble
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no| }}
| <!--Records-->{{no| }}
| <!--Opinion-->2009 firewire, not usb compliant micro-usb with most features, , , two‑channel
|-
| <!--Description-->Apogee One USB 1st Gen
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2010 maybe not usb compliant micro-usb for basic features, , , single‑channel up to 48kHz
|-
| <!--Description-->Apogee One USB 2nd Gen
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2013 maybe usb compliant usb- and maybe aa batteries,
|-
| <!--Description-->Apogee Duet 2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2022 maybe usb compliant usb-c with most features, , ,
|-
| <!--Description-->Apogee One USB 3rd Gen
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2016 maybe usb compliant,
|-
| <!--Description-->Apogee Ensemble Thunderbolt
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2020 maybe not usb compliant micro-usb with most features, , , two‑channel
|-
| <!--Description-->Apogee Boom
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2022 maybe usb compliant usb-c, , ,
|-
| <!--Description-->Apogee Duet 3
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2022 maybe usb compliant usb-c with most features, , ,
|-
| <!--Description-->Apogee
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->ART PRO Audio Usb Mix
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2016 maybe usb compliant bus powered,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Avid Digidesign Mbox 1 USB Audio
| <!--Vendor ID-->0x0dba
| <!--Product ID-->01000
| <!--Revision-->
| <!--Playback-->{{no| }}
| <!--Records-->{{no| }}
| <!--Opinion-->2002 mbox original was usb1 and not a usb class compliant device, and had the much hated "focusrite designed" mic preamps, light blue front plate and the sticky out feet
|-
| <!--Description-->Avid Digidesign Mbox 2 USB Audio
| <!--Vendor ID-->0x0dba
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no| }}
| <!--Records-->{{no| }}
| <!--Opinion-->2005 midi not usb compliant
|-
| <!--Description-->Avid Digidesign Mbox 2 Pro USB Audio
| <!--Vendor ID-->0x0dba
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no| }}
| <!--Records-->{{no| }}
| <!--Opinion-->2006 not usb compliant
|-
| <!--Description-->Avid Digidesign Mbox 2 Mini USB Audio
| <!--Vendor ID-->0x0dba
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no| }}
| <!--Records-->{{no| }}
| <!--Opinion-->2007 not usb compliant
|-
| <!--Description-->Avid Digidesign Mbox 2 Micro USB Audio
| <!--Vendor ID-->0x0dba
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no| }}
| <!--Records-->{{no| }}
| <!--Opinion-->2009 not usb compliant
|-
| <!--Description-->AVID MBox 3rd gen Mini or Standard but Pro is Firewire
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->2010 maybe usb compliant,
|-
| <!--Description-->behringer u-control uca202
| <!--Vendor ID-->0x8bb
| <!--Product ID-->0x2902
| <!--Revision-->1.00
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2008 maybe usb compliant, draws a lot of power - dac ti burr-brown - no microphone pre-amp -
|-
| <!--Description-->Behringer U-CONTROL UCA 222
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2009 maybe usb compliant, - no microphone pre-amp -
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->Black Lion Audio 2x2 evolution
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->2021 maybe usb compliant but , okay with 109dB range - poor noise floor, 24-bit 192kHz Cirrus Logic CS4272, average latency,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Bomge 11s
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->2021
|-
| <!--Description-->Bomge 22s
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->2021
|-
| <!--Description-->Bomge BMG22 USB Audio Interface
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->2021 usb-c, 24bit 192kHz but only use much lower, may have to spend time cleaning up some of the noise, high latency,
|-
| <!--Description-->Bomge U202
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->2022 usb-c, 32bit 192kHz but only use much lower, may have to spend time cleaning up some of the noise, high latency,
|-
| <!--Description-->Bomge U204
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->2022 usb-c, 32bit 192kHz but only use much lower , may have to spend time cleaning up some of the noise, high latency,
|-
| <!--Description-->Bomge Mini
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->2024
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->TI Burr-Brown PCM2702E PCM2704 PCM2704C Muse Audio Mini USB DAC board
| <!--Vendor ID-->0x08bb
| <!--Product ID-->0x2704
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion--> maybe usb compliant, no mic input - goodish quality
|-
| <!--Description-->TI Burr-Brown PCM2900 PCM2902 PCM2906 USB DAC board
| <!--Vendor ID-->0x08bb
| <!--Product ID-->0x2900
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion--> maybe usb compliant, no mic input - goodish quality
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Depusheng MD22
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->2022 usb-b powered, 24bit 192kHz though is 96kHz,
|-
| <!--Description-->Depusheng USB Audio
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->2023 usb-b powered, 24bit 192kHz though is 96kHz,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->|Emagic emi 2|6 em2|6
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->2002 not uac
|-
| <!--Description-->|Emagic emi 6|2m
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->2005 not uac
|-
| <!--Description-->|Emagic emi 6|2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->2005 not uac
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Ego Systems, Inc. in Korea (ESI) joining with RIDI GmbH
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->2006 maybe not usb compliant,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->esi Mixvibes U46 Mk II USB audio
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no| }}
| <!--Records-->{{no| }}
| <!--Opinion-->2007 not usb compliant, usb-b powered,
|-
| <!--Description-->ESI ESU22
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->2008 maybe not usb compliant,
|-
| <!--Description-->esi U24XL
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2008 maybe usb compliant, usb-b powered, 24 bits, 2 analogue inputs and outputs with 6.3 mm jack connection, Output L can be used as a headphone output, S / PDIF digital input -
|-
| <!--Description-->esi U46XL
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2008 maybe usb compliant, usb-b powered,
|-
| <!--Description-->ESI Originals, Inc ESIO MAYA22USB
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2013 maybe usb compliant, usb-b powered, 1 xlr,
|-
| <!--Description-->ESI MAYA44USB+
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2013 maybe usb compliant, usb-b powered, xlr,
|-
| <!--Description-->ESI Originals, Inc ESIO MARA22XTU
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2014 maybe usb compliant, usb-b powered, 1 xlr,
|-
| <!--Description-->ESI U22XT
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2016 usb class compliant
|-
| <!--Description-->ESI Gigaport Ex
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2020 usb compliant?, usb-c usb3.1, , ,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->iConnectivity iConnectAUDIO2+ icaudio-02 USB audio interface
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->{{unk|2016 }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->LexiconPro - Omega 8x4x2 (USB-1.1)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no| }}
| <!--Records-->{{no| }}
| <!--Opinion-->2003 not usb complaint
|-
| <!--Description-->Lexicon Alpha
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no| }}
| <!--Records-->{{no| }}
| <!--Opinion-->2006 not usb compliant,
|-
| <!--Description-->Lexicon Lambda
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2006 may not be compliant,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->Line 6 Toneport UX1 and Tone Port UX2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->2004 not usb compliant,
|-
| <!--Description-->Line 6 TonePort UX8
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->2005 maybe not class compliant,
|-
| <!--Description-->Line 6 POD Studio UX1 UX2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->2006 not usb compliant,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->Lokchonk UX22
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->[https://www.youtube.com/watch?v=ljSiNmudMm0 Lokchonk UX44HD]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->2023 usb-b , , , 2in 2out only, average latency,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->Mackie Onyx Artist 1·2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2006 maybe not usb compliant, usb-b powered,
|-
| <!--Description-->Mackie Onyx Producer 2X2 USB Audio Interface
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2008 maybe usb compliant, usb-b midi
|-
| <!--Description-->Mackie Onyx Blackjack
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2011 USB powered but maybe not usb compliant, Two Onyx Preamps, 2-in, 2-out which are combo Neutrik-type connectors to handle XLR, instrument or line level
|-
| <!--Description-->Mackie
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2011 maybe usb compliant, , ,
|-
| <!--Description-->Media Assistance USB-One
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no| }}
| <!--Records-->{{no| }}
| <!--Opinion-->2009 not uac cc comliant,
|-
| <!--Description-->M-Audio Fast Track USB
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2004 maybe not usb compliant, - guitar
|-
| <!--Description-->M-Audio Fast Track Ultra (6 in 6 out)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->2008 maybe usb cc providing 24-bit/96kHz audio capabilities but requires manual configuration of the mixer settings
|-
| <!--Description-->M-Audio M-Track
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2008 usb compliant?, okay - guitar and vocal mainly
|-
| <!--Description-->[https://htyp.org/M-Audio/Fast_Track_Ultra/Linux M-Audio FastTrack Ultra] and Ultra 8R
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2010 maybe usb compliant, low round-trip latency, okay octane pre amps, adc,
|-
| <!--Description-->M-Audio M-Track 2x2M
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2016 usb compliant? usb-c - okay pre-amps, ,
|-
| <!--Description-->M-Audio M-Track (MkII) 2x2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2016 usb compliant? usb-c - okay pre amps, ,
|-
| <!--Description-->M-Audio M-Track Solo
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2021 usb compliant? - okay but issues, MJN4580C opamps (lower gain 55 dB at volume 9-10), ti PCM2900C ADC 16bit means there is a hard noise floor at -96 dB, plastic build no rf shielding,
|-
| <!--Description-->M-Audio M-Track DUO
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2021 usb compliant? - okay but issues, MJN4580C opamps (lower gain 55 dB at volume 9-10), ti PCM2900C ADC 16bit means there is a hard noise floor at -96 dB, plastic build no rf sheild,
|-
| <!--Description-->M-Audio Air
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion--> maybe usb compliant, okay
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->NI AK1
| <!--Vendor ID-->0x17CC
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2008 maybe usb compliant,
|-
| <!--Description-->[https://www.pogo.org.uk/~mark/linuxdj/ Native Instruments Traktor Audio 8 DJ], [ Traktor Audio 4 DJ], [ Traktor Audio 2 DJ],
| <!--Vendor ID-->0x17cc
| <!--Product ID-->0x1978, 0x0839, 0x041C
| <!--Revision-->
| <!--Playback-->{{no| }}
| <!--Records-->{{no| }}
| <!--Opinion-->2009 not usb compliant uses snd-usb-caiaq module, [https://mixxx.discourse.group/t/problems-with-native-instruments-audio-8-dj-on-linux/14719/2 Audio 8 device has 4 subunits which are not recognized correctly], Cirrus Logic DACs spec'd at 24-bit/96KHz over a USB2,
|-
| <!--Description-->NI Komplete Audio 6 Mk1
| <!--Vendor ID-->0x17CC
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2011 maybe usb compliant, pre amps, 24bit 96kHz adc, ocassional dropouts, plastic build top with metal around 3/4,
|-
| <!--Description-->Native Instruments NI Komplete Audio 1 and 2 USB
| <!--Vendor ID-->0x17CC
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2019 maybe usb compliant, good pre amp ein -129.5 dBu, ad/dc,
|-
| <!--Description-->[https://support.native-instruments.com/hc/en-us/articles/360014683497-Apple-Silicon-Compatibility-News Native Instruments Komplete Audio 6 Mk2]
| <!--Vendor ID-->0x17CC
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2019 maybe usb compliant, pre amps, 24bit 192kHz adc, black aluminum glass build,
|-
| <!--Description-->[ Native Instruments Traktor Pro]
| <!--Vendor ID-->0x17cc
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2023 maybe usb compliant
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Novation AudioHub 2x4 NOVHUB01
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2008 maybe usb compliant, usb-b powered, no xlr, focusrite sounds inside,
|-
| <!--Description-->Novation AudioHub
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion--> maybe usb compliant,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Prodipe Studio 22 Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion--> maybe not usb compliant,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Schiit HEL 1 USB Audio Interface
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2019
|-
| <!--Description-->Schiit HEL 2 USB Audio Interface
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2021 gaming headsets mostly
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Roland Edirol UA-3 Audio Capture
| <!--Vendor ID-->0x0582
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->1998 maybe not usb compliant,
|-
| <!--Description-->Roland Edirol UA-30 Audio Capture
| <!--Vendor ID-->0x0582
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no|no driver}}
| <!--Records-->{{no|no driver}}
| <!--Opinion-->1999 not usb compliant,
|-
| <!--Description-->Roland Edirol UA1A UA-1D Audio Capture
| <!--Vendor ID-->0x0582
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no|no driver}}
| <!--Records-->{{no|no driver}}
| <!--Opinion-->2000 not usb compliant,
|-
| <!--Description-->Roland Edirol UA-5 Audio Capture (Roland)
| <!--Vendor ID-->0x0582
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no|no driver}}
| <!--Records-->{{no|no driver}}
| <!--Opinion-->2000 not usb compliant,
|-
| <!--Description-->Roland Edirol UA-1000 Audio Capture
| <!--Vendor ID-->0x0582
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no|no driver}}
| <!--Records-->{{no|no driver}}
| <!--Opinion-->2004 not usb compliant,
|-
| <!--Description-->Roland Edirol UA-1EX, Cakewalk UA-1G
| <!--Vendor ID-->0x0582
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no|no driver}}
| <!--Records-->{{no|no driver}}
| <!--Opinion-->2005 not usb compliant driver also supports ASIO (Steinberg Audio Stream I/O Interface), noisy
|-
| <!--Description-->Roland Duo Capture UA-11
| <!--Vendor ID-->0x0582
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no|no driver}}
| <!--Records-->{{no|no driver}}
| <!--Opinion-->2006 not usb compliant,
|-
| <!--Description-->Roland QUAD-CAPTURE Analog 2x2 Digital 2x2 USB 2.0 4in/4out
| <!--Vendor ID-->0x0582
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no|no driver}}
| <!--Records-->{{no|no driver}}
| <!--Opinion-->2005 not usb compliant, usb-b powered
|-
| <!--Description-->[https://wiki.debian.org/DebianEdu/Documentation/Manuals/Rosegarden/Setup Roland Edirol UA-101 and UA-1000 (Clemens Ladisch driver)]
| <!--Vendor ID-->0x0582
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no| }}
| <!--Records-->{{no| }}
| <!--Opinion-->2006 not usb compliant,
|-
| <!--Description-->[https://github.com/mmueller-kaffeeschluerfercom/UA-25-Firmware-Modification Roland Edirol ua-25]
| <!--Vendor ID-->0x0582
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2007 maybe usb compliant 16bit 44.1kHz sampling without MIDI but not USB class complient when in Advanced mode for 24bit or midi
|-
| <!--Description-->Edirol by Roland USB AudioCapture UA-25EX
| <!--Vendor ID-->0x0582
| <!--Product ID-->0x00e6, 0x00e7
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2008 maybe usb compliant if ADVANCED DRIVER switched to OFF might play and record at 44.1kHz and 16-bit samples
|-
| <!--Description-->Roland Audio Interface V-Studio 20 VS-20 Cakewalk
| <!--Vendor ID-->0x0582
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no| }}
| <!--Records-->{{no| }}
| <!--Opinion-->2010 maybe not usb compliant, usb-b powered, 1 xlr,
|-
| <!--Description-->Roland Edirol UA55 UA-55 Quad Cakewalk
| <!--Vendor ID-->0x0582
| <!--Product ID-->0x012f
| <!--Revision-->
| <!--Playback-->{{no| }}
| <!--Records-->{{no| }}
| <!--Opinion-->2011 not USB class compliant,
|-
| <!--Description-->Roland DUO-CAPTURE EX UA-22 USB Audio
| <!--Vendor ID-->0x0582
| <!--Product ID-->0x0159
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2013 maybe usb compliant but not be used with a USB 3.0 port that is not compatible with USB 2.0 specification, vs pre amps, adc, three AA batteries in base, or an AC adapter psb-1u 9V 2A -
|-
| <!--Description-->Roland Rubix series Roland Rubix22 USB 2.0 Audio Interface
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2017 maybe usb compliant,
|-
| <!--Description-->Roland Rubix series Roland Rubix24 USB 2.0 Audio Interface
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2017 maybe usb compliant,
|-
| <!--Description-->Roland
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion--> maybe usb compliant
|-
| <!--Description-->Steinberg MI2, Steinberg MI4
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no| }}
| <!--Records-->{{no| }}
| <!--Opinion-->2004 not usb compliant,
|-
| <!--Description-->Steinberg (2004 Yamaha buys) MIDI interface hardware including the CC like CC121 CC-121 and CI1 CI2 series.
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no|no driver}}
| <!--Records-->{{no|no driver}}
| <!--Opinion-->2008 not usb compliant,
|-
| <!--Description-->Steinberg UR12 UR22
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2013 maybe not usb compliant, poor pre-amps,
|-
| <!--Description-->Steinberg UR44 usb audio interface
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2014 maybe not usb compliant, poor pre-amps,
|-
| <!--Description-->Steinberg UR242 audio interface
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2015 maybe usb compliant, usb powered or 5v psu, okay pre-amps,
|-
| <!--Description-->Steinberg UR22mkII
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2018 maybe usb compliant, okay pre-amps ein -123 dBu, ad/dc,
|-
| <!--Description-->Steinberg UR-RT 2 USB Audio Interface
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2018 maybe usb compliant, usb2.0 usb-b, pre-amps, ad/dc,
|-
| <!--Description-->Steinberg UR44C (USB3)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2019 maybe usb compliant,
|-
| <!--Description-->Steinberg URX22C UR22C
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2021 maybe usb compliant, preamps okay but little noisy, ad/dc.
|-
| <!--Description-->Steinberg UR22 MkIII UR series
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2024 maybe usb compliant usb-c, okay pre-amps, adc,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Tapco LiNK.USB 2x2 (Loud technologies WA, USA)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no| }}
| <!--Records-->{{no| }}
| <!--Opinion-->2005 maybe not compliant, usb-b, poor pre-amps hum, latency issues,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->[https://git.alsa-project.org/?p=alsa-tools.git;a=blob;f=usx2yloader/README;hb=3843634ef0310a952b256bcb6a4ddd0ad4ebe396 Teac Tascam US-422 US-428 US2XYloader]
| <!--Vendor ID-->0x0644
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no|no driver}}
| <!--Records-->{{no|no driver}}
| <!--Opinion-->2000 not usb compliant,
|-
| <!--Description-->Tascam US-122 US-224
| <!--Vendor ID-->0x0644
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no|no driver}}
| <!--Records-->{{no|no driver}}
| <!--Opinion-->2003 not usb compliant, needing firmware usx2yloader/us122fw.ihx for audio sound card - Tascam US-122 and US-122L are not the same -
|-
| <!--Description-->Tascam US-122L
| <!--Vendor ID-->0x0644
| <!--Product ID-->0x800e
| <!--Revision-->
| <!--Playback-->{{no|no driver}}
| <!--Records-->{{no|no driver}}
| <!--Opinion-->2006 not usb compliant, obsolete needs tascam_loader.ihx and us122fw.ihx firmware loaded each time unless automated
|-
| <!--Description-->Tascam US122 US-122 Mk2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no|no driver}}
| <!--Records-->{{no|no driver}}
| <!--Opinion-->2004 not usb compliant although USB2 downgrade so using USB1.1 UHCI, tascam units suffer from high round-trip latency as do most typical USB units
|-
| <!--Description-->Tascam US144 US-144 Mk2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no|no driver}}
| <!--Records-->{{no|no driver}}
| <!--Opinion-->2004 maybe usb compliant although USB2 downgrade so using USB1.1 UHCI, tascam units suffer from high round-trip latency as do most typical USB units
|-
| <!--Description-->Teac TASCAM US-200 USB 2.0 Audio / MIDI Interface
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no|no driver}}
| <!--Records-->{{no|no driver}}
| <!--Opinion-->2011 maybe not usb compliant,
|-
| <!--Description-->Teac US-366
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no|no driver}}
| <!--Records-->{{no|no driver}}
| <!--Opinion-->2011 maybe not usb compliant,
|-
| <!--Description-->Teac TASCAM US-600 USB 2.0 Audio / MIDI Interface
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no|no driver}}
| <!--Records-->{{no|no driver}}
| <!--Opinion-->2011 maybe not usb compliant,
|-
| <!--Description-->Teac TASCAM US-800 USB 2.0 Audio / MIDI Interface
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no|no driver}}
| <!--Records-->{{no|no driver}}
| <!--Opinion-->2011 may not be totally usb compliant
|-
| <!--Description-->Teac Tascam iU2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{no| }}
| <!--Records-->{{no| }}
| <!--Opinion-->2012 maybe not usb compliant,
|-
| <!--Description-->Teac Corp Tascam US-2x2
| <!--Vendor ID-->0x0644
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2014 usb compliant?, 5v dc power, midi out in,
|-
| <!--Description-->Teac Corp Tascam US-4x4
| <!--Vendor ID-->0x0644
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion--> usb compliant?,
|-
| <!--Description-->Teac Tascam US-16x08 US-20x20
| <!--Vendor ID-->0x0644
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->teyun q12 Q-12, q22 Q-22
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion--> maybe usb compliant - unknown pre amp, unknown ad/dc,
|-
| <!--Description-->Teyun q26 Q-26, q24 Q-24
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion--> maybe usb compliant - unknown pre amp, unknown ad/dc,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->Yamaha UW500
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->2000 not class compliant,
|-
| <!--Description-->Yamaha Audiogram 3 USB Digital Audio Interface
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2012 maybe usb compliant, okay pre amp, 16bit 44kHz adc no advanced features without dedicated asio driver, 1 xlr, 1 instrument,
|-
| <!--Description-->Yamaha Audiogram 6 USB Digital Audio Interface
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2013 maybe usb compliant, okay, 2 xlr, 2 instrument,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->Zoom UAC-232
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion--> maybe not usb compliant, okay,
|-
| <!--Description-->Zoom UAC
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion--> maybe not usb compliant, okay,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Playback
| Records
| Opinion
|-
| <!--Description-->[http://www.arcam.co.uk/products,rseries,usb-dacs,rPAC.htm Arcam rPac]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Audioquest Dragonfly
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Audioengine D1 Premium 24-bit DAC
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Beresford TC-7520 (Burr Brown PCM 1716)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Beresford TC-7520 + Burson Buffer + MK3 JKSPDIF
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->[http://epiphany-acoustics.co.uk/products-page/dacs/e-dac-24bit-miniature-usb-dac/ Epiphany E-DAC 24bit] ES9023 DAC chip
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Firestone Audio FUBAR II Mk2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Firestone Audio iLoveTW 24Bit USB DAC
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->FiiO D5 ta2020 chip amp
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->FiiO E07K Andes
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->FiiO E17 Alpen
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->GoVibe Magnum
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->GoVibe Martini-U
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->GoVibe Vulcan
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Halide Design DAC HD (Wolfson WM8716)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->HRT Steamer II USB DAC
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->John Kenny JKDAC uses a 24-bit/192 kHz Sabre ES9022 DAC or better JKDAC32
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description--> iBasso D12
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Leckerton UHA-6S MKII
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->MyST 1866 PortaDAC
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Objective DAC ODAC+O2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Rega DAC (Wolfson WM8742)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Playback
| Records
| Opinion
|-
| <!--Description-->[http://www.henryaudio.com/open-source.php Henry Audio USB DAC 128 also known as QNKTC AB-1.2 open source DAC]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Henry Audio mkII
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->AKM4430 DAC chip comes from Asahi Kasai
|-
| <!--Description-->DevilSound USB DAC
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Zoom U series
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->KingRex UD-01 SE (Burr-Brown PCM 2702E)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->SuperPro 24/192 USB DAC (24bit 192 kHz, CS-4398 D/A chip)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Playback
| Records
| Opinion
|-
| CMedia CM108 7.1ch emulation I2S in and out
| 0x1926
| 0x0003
| 0x0100
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| [http://www.lindy.co.uk/usb-2-audio-adapter/42961.html Lindy USB 2.0] (Chipset CM108)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| Speed-Link SL-8850-SBK Vigo ([http://mightyohm.com/forum/viewtopic.php?p=1036#p1030 CMedia CM108])
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| Dynamode USB SOUNDCARD 2.0
| <!--Vendor ID-->0x0003
| <!--Product ID-->0x1130
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| Dynamode Virtual 7.1 USB-SOUND7 (C-Media )
| 0x0d8c
| 0x000c 0x000e
| 1.00
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Generic White box with very little red led and white USB lead (CMedia )
| <!--Vendor ID-->0x0d8c
| <!--Product ID--> 0c000e
| <!--Revision-->1.00
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Playback
| Records
| Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| CM109 CiT SC-U119 5.1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Playback
| Records
| Opinion
|-
| CMedia CM1197.1ch I2C MCU port Penguin
| 0x0D8C
| 0x0000
| 0x010
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Playback
| Records
| Opinion
|-
| <!--Description-->Sweex 7.1 Startech External USB, WMA Blue metal box SYBA SD-AUD20040, Sabrent USB-SND8, Sewell Vantec NBA-200U (C-Media CM6206 CM106 like)
| <!--Vendor ID-->0x0d8c
| <!--Product ID-->0x0102
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->50/50 if the item is detected but does not work
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->Creative Labs SoundBlaster X-fi
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Creative X-Fi Go
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Creative X-Fi 5.1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Creative Sound Blaster Play! USB sound adapter (SB1140)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion--> working with [http://www.amiga.org/forums/showpost.php?p=646431&postcount=15 Deneb on OS3]
|-
| <!--Description-->Asus Xonar U1 (ASUS UA100 USB Audio Chip)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Asus Xonar U3
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Playback
| Records
| Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->Griffin iMic
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->M-Audio Transit
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->Icemat Siberia (steel series) (Cmedia chipset)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->JMTek HY554, ZyXEL NSA-220, Logilink (Tenx Technology TP6911 and SSS-1623 headphone set)
| 0x0C76 0x1130
| 0x1605 0x1607 0xf211
| 0x
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion--> reports on other OS not good
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->Plantronics "DSP Adapter-01" (or "USB Adapter-02")
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->Rocksmith Real Tone Cable
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->RSA Intruder Predator
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->StarTech ICUSBAUDIO7
| <!--Vendor ID-->0x0d8c
| <!--Product ID-->0x000c
| <!--Revision-->1.00
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->Stoner Acoustics UD100
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Teac UDH01-B
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->Terratec Aureon 5.1 USB
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Terratec Aureon 5.1 USB MKII
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->TerraTec Electronic GmbH Aureon Dual USB
| 0x0ccd
| 0x0077
| <!--Product ID-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Terratec Phase26
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Trust 510 EX 5.1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Logitech A-5572A USB 2.0 to 3.5mm jacks Virtual 7.1 Surround Sound Adapter or accessory of Logitech Clearchat pro USB or Logitech USB Headset H530
| <!--Vendor ID-->0x0003
| <!--Product ID-->0x046D
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Trumix TM-10 USB Audio Interface
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->2024 maybe cc
|-
| <!--Description-->Trumix TM-12 USB-C
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->2024 maybe cc usb compliant,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->Turtle Beach Audio Advantage Amigo Micro II USB Sound Card & Headset Adapter
| <!--Vendor ID-->0x10F5
| <!--Product ID-->0x0211
| <!--Revision-->0100
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|-
| <!--Description-->Vantec NBA-100U 7.1 Channel
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->{{unk| }}
| <!--Records-->{{unk| }}
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Playback-->
| <!--Records-->
| <!--Opinion-->
|}
Companies including Access, Alesis, Allen&Heath, American Audio, CME, ESI, Infrasonic, Lexicon, Numark, Presonus, Reloop, SIMS, Sound Devices, Steinberg, Swissonic, Tascam, Terrasoniq, Terratec, Yamaha and Yellowtec decided to license and bundle this driver. So fully functional custom drivers are available for Access Virus TI, Access Virus TI snow, Alesis Multimix 8 USB2.0, Alesis Multimix 16 USB2.0, Allen&Heath XONE:2D, Allen&Heath XONE:3D, Allen&Heath XONE:4D, Allen&Heath XONE:DX, Allen&Heath XONE:DB4, American Audio Versa Port, CME XCORPIO, ESI ESU1808, ESI Gigaport AG / DG, ESI Maya 44 USB, Infrasonic Amon, Lexicon I-ONIX U22, Lexicon I-ONIX U42S, Lexicon I-ONIX U82S, Mindprint DI-MOD USB, Numark DJ IO, Numark NS6, Numark NS7, Numark Omni Control, Numark V7, Presonus Audiobox USB, Reloop Digital Jockey, SIMS Primus, Sound Devices USB pre, Steinberg MI2, Steinberg MI4, Swissonic Easy USB, Tascam M-164UF, Tascam US-122L, Tascam US-144, Tascam US-Tascam US-144mkII 122mkII, Tascam US-200, Tascam US-600, Tascam US-1641, Tascam US-1800, Tascam US-2000, Terratec Area 61, Terrasoniq Phase X64, Terratec Phase 26 USB, Yamaha UW10, Yamaha UW500, Yellowtec PUC2 and many others.
Well, those companies are using the same driver framework because all of those interfaces use the same microprocessor/firmware architecture to communicate with the USB bus. Just like almost all FireWire audio interfaces use the same TC Dice or BridgeCo chipsets. Usually it does not make sense for companies to develop their own USB1.1/USB2/FW framework for a product they are going to sell for <$500.
However, that isn't the end of the story. The companies who develop audio interfaces implement different features into their devices and must update the driver and firmware to accommodate those features. That is where things can go wrong. Sometimes there is miss-communication about how things are coded, sometimes the developer who started a project leaves without transferring his knowledge to his successor, etc. You have to keep in mind that there are no "big" computer audio companies. Even the companies that seem big in the scale of the market, probably have fewer employees than you'd think.
A very well made interface that is designed from scratch from the ground up would be a very expensive device, regardless of whether it's USB, FW, PCIe or whatever.
Round-trip latency is the sum of the following:
<pre>
ASIO input buffer
ASIO output buffer
A/D D/A converter latency
The driver's hidden safety buffer
</pre>
At a 64-sample ASIO buffer size/44.1k, Tascam units yield ~18ms total round-trip latency.
Typical USB audio interfaces use a large hidden safety buffer.
This helps ensure glitch-free playback... even under less than ideal circumstances. But... this comes at the expense of much higher round-trip latency. Short of doubling the sample-rate, there's no means of mitigating the higher round-trip latency.
If you have no plans of ever monitoring in realtime thru software based EFX/processing (ie: playing/monitoring DI bass thru an AmpSim plugin as you're playing), then this may not matter to you.
If you want the ability this play/monitor in realtime thru software based EFX/processing, make sure to get an audio interface that yields low round-trip latency.
As a point of reference the best PCI/e audio interfaces yield about 5ms total round-trip latency at a 64-sample ASIO buffer size/44.1k
The best Firewire and USB units yield 5.5-5.6ms total round-trip latency at those same settings.
Typical USB and Firewire units (that use a large hidden safety buffer) yield 12-18ms total round-trip latency at those same settings.
Anything above ~6ms starts to feel sluggish.
Anything above ~10ms feels like playing thru molasses.
USB Microphones
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| <!--Description-->C-Media Electronics, Inc. CM108 Audio Controller Mic
| <!--Vendor ID-->0x0d8c
| <!--Product ID-->0x013c
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Elgato WaveMic
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Elgato Wave:1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2019 no driver }}
|-
| <!--Description-->Elgato Wave:3
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2019 no driver lightweight }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->hyperx solocast
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2018 no driver}}
|-
| <!--Description-->hyperx quadcast
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2018 no driver}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Sennheiser CC510 USB
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->Alesis USB-Mic microphone podcasting kit
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Audio-Technica AT2020 (AT202) AT4040
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Audio-Technica AT2035
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Behringer B1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Blue Microphones Snowball
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Blue Microphones Snowball iCE
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| cardioid only }}
|-
| <!--Description-->Blue Microphones Yeti
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|can pick up a lot of background noise but not sure if right mode used }}
|-
| <!--Description-->Blue Microphones Yeti Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| can pick up a lot of background noise but not sure if right mode used }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->MXL 2001A/600 Studio Microphone Pack / MXL 2003A Studio Condenser
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Microsoft LifeChat LX-3000
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Namtai SingStar(TM) PS2 SCEH-0001 USBMIC
| <!--Vendor ID-->0x1415
| <!--Product ID-->
| <!--Revision-->0.01
| <!--Opinion-->{{unk| mono microphones }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Neumann MT48
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Razer Seiren X
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Razer Seiren Mini USB Condenser Microphone
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Rockband USB Mic
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Rode NT1A VideoMic Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Rode Podcaster 2 USB
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| RODECaster Pro usb audio compatible}}
|-
| <!--Description-->Rode NT1A NT2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| NT2 better }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Roland R-07
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Samson Go Mic - Portable USB Microphone for Recording
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| mini usb r.h.s. and clip on the bottom left hand side}}
|-
| <!--Description-->Samson Go Mic Clip On USB Microphone
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| switch to choose between Cardiod, Omni and -10 dB modes, a 3.5mm headphone socket and a USB socket}}
|-
| <!--Description-->Samson C01U
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| cardoid only}}
|-
| <!--Description-->Samson C03U
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Shure MV7 USB Podcast Microphone
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Shure MV7+ XLR & USB-C dynamic microphone
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->SONY PCM-D50 handy
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| one mini usb 5V, }}
|-
| <!--Description-->Sony PCM-M10
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| one mini usb out 5V, }}
|-
| <!--Description-->SONY
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| one mini usb out, }}
|-
| <!--Description-->SONY
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| one mini usb out, }}
|-
| <!--Description-->TASCAM DR-1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2008, one mini usb out, lithium battery}}
|-
| <!--Description-->Tascam DR-07
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2009, one mini usb out, aa battery}}
|-
| <!--Description-->Tascam DR05
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2011, one mini usb port for file transfer and charging the AA batteries }}
|-
| <!--Description-->Tascam DR-40
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2011 mini usb aa battery }}
|-
| <!--Description-->Tascam DR-07mkII
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2012 , one mini usb out, }}
|-
| <!--Description-->Tascam DR-05X
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2019 , one micro usb out, }}
|-
| <!--Description-->Tascam DR-07X
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2019 , one micro usb out, }}
|-
| <!--Description-->Tascam DR-40X
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2019 , one micro usb 3 aa battery }}
|-
| <!--Description-->Tascam DR-05XP
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 , one usb-c , }}
|-
| <!--Description-->Tascam DR-07XP
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 , one usb-c , }}
|-
| <!--Description-->Tascam DR-40XP
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 , one usb-c, }}
|-
| <!--Description-->Tascam DR-100mkIII
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| , usb , }}
|-
| <!--Description-->Tascam
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| , usb , }}
|-
| <!--Description-->Zoom H4
| <!--Vendor ID-->0x1686
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2006 no driver, mini usb 5V }}
|-
| <!--Description-->Zoom H2
| <!--Vendor ID-->0x1686
| <!--Product ID-->0x0095
| <!--Revision-->
| <!--Opinion-->{{unk|2007 no driver, mini usb 5V audio i/f USB Card and USB Audio; press the Record button when USB Audio is displayed. Press Record again to choose the default }}
|-
| <!--Description-->Zoom H4n
| <!--Vendor ID-->0x1686
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2009 no driver, mini usb 5V }}
|-
| <!--Description-->Zoom H1
| <!--Vendor ID-->0x1686
| <!--Product ID-->0x0120
| <!--Revision-->
| <!--Opinion-->{{unk|2010 no driver, mini usb 5V and display will alternate between USB Card and USB Audio; press the Record button when USB Audio is displayed. Press Record again to choose the default }}
|-
| <!--Description-->Zoom H2n
| <!--Vendor ID-->0x1686
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2011 no driver, mini usb 5V audio i/f press the Record. Press Record again to choose the default }}
|-
| <!--Description-->Zoom H4n PRO
| <!--Vendor ID-->0x1686
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2011 no driver, mini usb 5V }}
|-
| <!--Description-->Zoom H6
| <!--Vendor ID-->0x1686
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2013 untested, 2xlr, 5v mini usb, }}
|-
| <!--Description-->Zoom H5
| <!--Vendor ID-->0x1686
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2014 no driver, 5v mini usb, 2 xlr, }}
|-
| <!--Description-->Zoom H1n-vp handy
| <!--Vendor ID-->0x1686
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2018 no driver, mini usb 5V }}
|-
| <!--Description-->Zoom H6studio
| <!--Vendor ID-->0x1686
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 untested}}
|-
| <!--Description-->Zoom
| <!--Vendor ID-->0x1686
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|no driver}}
|-
| <!--Description-->Zoom Q3
| <!--Vendor ID-->0x1686
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2008 untested usb a cord, no hdmi, 480p}}
|-
| <!--Description-->Zoom Q3HD Handy Video Recorder
| <!--Vendor ID-->0x1686
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2010 untested, built in usb-a cord, mini hdmi, 1 hour on 2 AA batteries, H.264 movies 480p }}
|-
| <!--Description-->Zoom Q2HD Handy
| <!--Vendor ID-->0x1686
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2012 untested, up 720p but no stablisation, mini usb cord, 1 hour on 2 AA batteries}}
|-
| <!--Description-->Zoom Q4
| <!--Vendor ID-->0x1686
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2014 untested, li-ion battery}}
|-
| <!--Description-->Zoom Q4N
| <!--Vendor ID-->0x1686
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2015 untested, li-ion battery}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Audio Technica ATR4697-USB Boundary Microphone
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->CAD Audio CAD USB Condenser Boundary Microphone
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->MXL AC-44 Boundary Conferencing Mic
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Samson Audio SAUB1 Boundary Microphone (USB)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|}
USB Speakers
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Focal XS 2.1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
|}
USB Headset Wired/Wireless
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| Logitech Vantage Wired (came free with PS2 Socom3)
|
|
|
| <!--Opinion-->{{unk| }}
|-
| Logitech G330
|
|
|
| <!--Opinion-->{{unk| }}
|-
| Logitech Premium USB Stereo Headset 350
|
|
|
| <!--Opinion-->{{unk| }}
|-
| Plantronics DSP-300
|
|
|
| <!--Opinion-->{{unk| }}
|-
| Plantronics GameCom 777
|
|
|
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->Wireless
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| Logitech G-930 Wireless
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| [http://www.makeuseof.com/tag/set-usb-wireless-earphones/ Plantronics Audio 995 Wireless RF]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| Sennheiser Wireless
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
|}
[https://www.youtube.com/watch?v=Be1e0QPIPK0 Mixers]
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| <!--Description-->ALESIS MULTIMIX 4 CHANNEL USB MIXER
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Alesis - MultiMix 8 USB FX (USB 1.0)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->2010 usb compliant?, up to 16-bit/48kHz, 18v 500mA -
|-
| <!--Description-->Alesis - MultiMix 8 USB 2.0 FX (USB 2.0)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->2012 usb compliant?, up to 16-bit/48kHz,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Allen&Heath MixWiz16
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> maybe not usb compliant,
|-
| <!--Description-->Allen and Heath ZED Power 1000
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no usb 8 xlr, usb-b out, }}
|-
| <!--Description-->Allen & Heath ZEDi-10
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> maybe not usb compliant,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Behringer XENYX 302USB
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| 5-Input Mixer/Audio Interface - 1 xlr - }}
|-
| <!--Description-->Behringer Xenyx Q502USB Mixer
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|no driver}} Behringer 2*18.5V 250ma psu - 1 xlr - phanton power -
|-
| <!--Description-->Behringer Xenyx Q802USB
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver}} Behringer 2*18.5V 250ma psu - 2 xlr - phanton power -
|-
| <!--Description-->BEHRINGER XENYX 1204USB 8-Channel 2-Bus Mixer USB/Audio Interface Studio/Live
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver}} iec kettle psu lead - can develop constant background hiss over time
|-
| <!--Description-->Behringer XENYX X1222USB
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver - 12-Channel Analog Mixer with USB Interface and Effects}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver}}
|-
| <!--Description-->Depusheng HT-7 HT7USB 7 Channel Audio Mixer
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|2023 cheap no driver, USB MP3 player to work, format your USB stick Fat32 as a Logical drive - not primary}}
|-
| <!--Description-->Depusheng XT7
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|2025 cheap no driver}}
|-
| <!--Description-->Depusheng DT8
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|2025 cheap no driver}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver}}
|-
| <!--Description-->Spirit soundcraft Folio FX8 with Lexicon Effects Processor
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver}} unusual power connector - [https://github.com/lack/soundcraft-utils usb routing] -
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver}}
|-
| <!--Description-->Weymic Professional F7 7-Channel 2-Bus Mixer
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|2022 no driver, cheap mixer with 3pin ac input (introduces noise) and 1 usb-a port}}
|-
| <!--Description-->Weymic Professional F7-Pro 7-Channel 2-Bus Mixer
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|2022 no driver}}
|-
| <!--Description-->Weymic A80
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|2024 no driver}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver}}
|-
| <!--Description-->Yamaha
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver}}
|-
|}
Mixer no hardware usb
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no usb}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no usb}}
|-
| <!--Description-->ALTO Lynx MIX82FX Audio Mixer
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no usb}}
|-
| <!--Description-->Alto L16
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no usb}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no usb}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no usb}}
|-
| <!--Description-->Behringer MXUL5
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no usb}}
|-
| <!--Description-->Behringer MX602A
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no usb}}
|-
| <!--Description-->Behringer Eurorack UB502
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no usb 17.5V 3pin psu needed}}
|-
| <!--Description-->Behringer Eurorack UB802
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no usb 2 xlr,}}
|-
| <!--Description-->Behringer Eurorack UB1002
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no usb 2 xlr,}}
|-
| <!--Description-->Behringer Eurorack UB1202
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no usb 4 xlr, }}
|-
| <!--Description-->Behringer Eurorack UB1602
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no usb}}
|-
| <!--Description-->Behringer RX1602
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no usb}}
|-
| <!--Description-->Behringer 802 XENYX 8-Input 2-Bus Mixer Small Format Mixer
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver}} Behringer 18.5V ???ma psu - 2 xlr - phanton power -
|-
| <!--Description-->Behringer Xenyx 502
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no usb}}
|-
| <!--Description-->Behringer Xenyx
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no usb}}
|-
| <!--Description-->Behringer
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no usb}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no hardware usb connection}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no usb}}
|-
| <!--Description-->IMG stage Line MMX-122
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no usb, 4 xlr, iec cable}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no hardware usb connection}}
|-
| <!--Description-->Mackie 802VLZ4 Mackie 802-VLZ4
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no usb , psu}}
|-
| <!--Description-->Mackie 1202-VLZ Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no usb, mains iec}}
|-
| <!--Description-->Mackie Mix5 Mixer
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no usb}} 18v 300mA psu - 5 Channel -
|-
| <!--Description-->Mackie Mix8 Mixer
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no usb}} 9v x2 600mA psu -
|-
| <!--Description-->Mackie MIX12FX
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no usb, 4 xlr, 9v 500mA x2 psu, }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no hardware usb connection}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no usb}}
|-
| <!--Description-->[https://www.soundcraft.com/en/product_documents/en/owners_manual Soundcraft] Spirit Folio F1 Fader 100
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver}} 16 Channel Mixer -
|-
| <!--Description-->Soundcraft EPM6
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no hardware usb connection}}
|-
| <!--Description-->Soundcraft EPM8
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no hardware usb connection}}
|-
| <!--Description-->Harman Soundcraft EPM 12
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver}} iec kettle power lead -
|-
| <!--Description-->Soundcraft EPM 16
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver}}
|-
| <!--Description-->Soundcraft Notepad 8FX
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no hardware usb connection}}
|-
| <!--Description-->Soundcraft Notepad UI12
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> connect via wifi
|-
| <!--Description-->Soundcraft Notepad UI16
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion--> connect via wifi
|-
| <!--Description-->Soundcraft Notepad 124FX
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no hardware usb connection, 14.8V x2 3 pin psu}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no hardware usb connection}}
|-
| <!--Description-->t.mix xmix 1402fx mp usb
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no hardware usb connection, mains iec, }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no hardware usb connection}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no hardware usb connection}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no hardware usb connection}}
|-
|}
==Webcameras==
A USB camera has two dedicated chips: a controller or bridge and an image sensor.
There was no Commodore support for video interfaces. The only commercial, now discontinued application that defined some sort of standard was VHI Studio by iospirit.
===OLD standards===
See [http://www.e3b.de/usb/main_supported_e.html support pages] and [http://www.e3b.de/usb/main_faq_e.html here] and some [http://webcam-osx.sourceforge.net/cameras/index.php?orderBy=status further compatibility]
Pencam STV680
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| AIPTEK stv680
| 0x0553
| 0x0202
|
| {{N/A|untested}}
|-
| Konica e-mini
| 0x04c8
| 0x0722
|
| {{N/A|untested }}
|-
| DigitalDream l'espion XS
| 0x1183
| 0x0001
|
| {{N/A|untested}}
|-
| [http://reviews.cnet.com/webcams/creative-webcam-go/1707-6502_7-1446174.html Creative WebCam Go mini]
| 0x041e
| 0x4007
|
| {{N/A|untested}}
|-
|}
SonixcamTool (Sonix webcams and derivates)
'''Note [http://amigadev.free.fr/sonix/ some] Sonix Webcams with a Sonix SN9C1xx controller ''and'' a pas106b or tas5110c1b sensor support bulk mode which works even with pciusb.device!'''
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| Macally IceCam II
| 0x0c45
| 0x05d8
|
| {{N/A|untested}}
|-
| Sweex MiniCam 100K
| 0x0c45
| 0x6005
|
| {{N/A|untested - sensor tas5110c1b}}
|-
| Macally IceCam Portable
| 0x0c45
| 0x6007
|
| {{N/A|untested - sensor tas5110d}}
|-
| Sweex 100K
| 0x0c45
| 0x6009
| 0x0101
| {{yes|bulk works - sensor pas106b}}
|-
| [http://www.epinions.com/pr-Chicony_TwinkleCam_Webcam/display_~full_specs Chicony Twinkle DC-2110A]
| 0x0c45
| 0x600d
|
| {{no|no}}
|-
| Unknown
| 0x0c45
| 0x601e
|
| {{no|no}}
|-
| USB PC Camera (SN9C102)
| 0x0c45
| 0x6028
|
| {{no|no - sn9c10x + pas202b}}
|-
| Trust SpaceC@m 120 and 150
| 0x0c45
| 0x6029
|
| {{N/A|untested - sensor pas106a}}
|-
| HiRes Webcam Live
| 0x0c45
| 0x602c
|
| {{no|no - sensor ov7630}}
|-
| [http://www.sweex.com/en/assortiment/sound-vision/webcams/JA000020 Sweex USB Webcam 300K]
| 0x0c45
| 0x608f
|
| {{no|no - sensor ov7630}}
|-
| Speedlink Sphere Webcam SL-6820, 350K
| 0x0c45
| 0x613c
| 0x0101
| {{N/A|untested - sensor HV7131R}}
|-
| WB-3250P
| 0x0c45
| 0x613e
|
| {{no|no - sensor ov7630}}
|-
| Unknown
| 0x0c45
| 0x6207
|
| {{no|no}}
|}
<pre>
micromaxx USB Camera STM 1363 514 works ---
USB Tower Lego 1684 1 works need NCQ
Trust Spycam 100plus STM 1363 514 works
</pre>
ov51x.class - no driver
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| D-Link VGA Webcam (640x480)
| 0x05a9
| 0x8519
|
| {{no|no driver}}
|-
| Sony PS2 EyeToy Logitech/Logicool Black (ov519) SCEH-0004
| 0x054c
| 0x0154
|
| {{no|no driver}}
|-
| Sony PS2 EyeToy Namtai Silver (ov519) SLEH-00031 SLEH-00030
| 0x054c
| 0x0155
|
| {{no|no driver}}
|-
|}
===UVC.class - [https://www.usb.org/document-library/video-class-v15-document-set USB Device Class Definition for Video Devices or USB Video Class]===
AROS does not supported as still needs an uvc.class which might create a virtual UVC.VHI or an expanded streaming device driver for use by AROS apps
*2003 UVC 1.0 baseline streaming of uncompressed YUV422, MJPEG, and compressed MPEG-2 TS, DV
*2005 [http://www.cajunbot.com/wiki/images/8/85/USB_Video_Class_1.1.pdf UVC 1.1] baseline HD 720p streams formats, usb2 support,
*2012 [https://www.usb.org/document-library/video-class-v15-document-set UVC 1.5] added usb3 devices and compressed h.264 and VP8 formats
*2019 the market is filled with UVC Compliant USB HDMI Capture
*Aros needs to read the camera’s class-specific Video Control (VC) unit and terminal descriptors.
*Identifies the devices as UVC-compatible and links it to the native UVC class driver, so no separate driver installation is required.
*Aros and camera determine the appropriate streaming settings, including format, resolution, and frame rate.
*Once set, video data moves from the image sensor to the onboard ISP, then through the USB controller and into the host system for viewing, analysis, or recording
*More advanced functions, such as HDR, ROI, and hardware trigger support, can be managed
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| <!--Description-->Acasis 4K30
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|}}
|-
| <!--Description-->Acasis 4K60 HD VS009
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|4k 60hz ok for chat streams}}
|-
| <!--Description-->Acasis 4K60 HDMI HDR Game Live Video Capture
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| for chat streams }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->AJA U-tap HDMI
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|}}
|-
| <!--Description-->ASUS TUF CU4K30
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->ATEN CAMLIVE HDMI to USB-C UVC Video Capture adapter UC3020 HDMI (F) TO USB-C M
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2019 possibly UVC and UAC standard support allows up to 1080P @ 60}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Avermedia Live Streamer Cap 4K - BU113
| <!--Vendor ID-->0x07ca
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2021 uvc usb3}}
|-
| <!--Description-->AVerMedia GC515 video capturing device
| <!--Vendor ID-->0x07ca
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2021 USB 3.2 Gen 1 (3.1 Gen 1)}}
|-
| <!--Description-->AVerMedia Live Gamer Ultra GC553
| <!--Vendor ID-->0x07ca
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2021 usb3 powered by Type C USB cable and 4K HDMI cable}}
|-
| <!--Description-->AVerMedia Live Gamer Ultra S GC553PROW 302AGC553DL2
| <!--Vendor ID-->0x07ca
| <!--Product ID-->0x1553
| <!--Revision-->
| <!--Opinion-->{{unk|2021 powered by good quality type C USB3 cable and 4K HDMI 2.0 cable}}
|-
| <!--Description-->AVermedia Live Gamer Mini GC311 302AGC311DG9
| <!--Vendor ID-->0x07ca
| <!--Product ID-->0x1311
| <!--Revision-->
| <!--Opinion-->{{unk|2021 uvc compliant up to 1080p 60fps capture and supports internal hardware H.264 encoding - if flashing blue light try another '''quality''' micro usb cable - }}
|-
| <!--Description-->AVerMedia Ez Recorder 330 (ER330)
| <!--Vendor ID-->0x07ca
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2021 designed to work independently and is generally not compatible as a plug-and-play UVC capture card }}
|-
| <!--Description-->AVerMedia Live Gamer extreme3 GC551G2 (LGX3)
| <!--Vendor ID-->0x07ca
| <!--Product ID-->0x3551
| <!--Revision-->
| <!--Opinion-->{{unk|2022 uvc compliant for intensive gaming streams, some vrr but no hdr with maximum recording resolution of 4K30/1080p60 from fully wired usb3 compatible cable - passing through 4K60/1080p120 Game Capture video capturing device HDMI}}
|-
| <!--Description-->AVerMedia Live Gamer Ultra Pro GC553Pro
| <!--Vendor ID-->0x07ca
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2024 usb3 }}
|-
| <!--Description-->AVerMedia Live Gamer Ultra 2.1 GC553G2 61GC553G20BV video capturing device
| <!--Vendor ID-->0x07ca
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 USB 3.2 Gen 1 (3.1 Gen 1)}}
|-
| <!--Description-->AVerMedia GC575
| <!--Vendor ID-->0x07ca
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 usb3 powered by Type C USB cable and 4K HDMI cable}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->AVMatrix
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->ClonerAlliance Flint 4KP Plus
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->DIGITNOW U600 video capture card
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2022 uvc uac }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Epiphan AV.io HD
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Epiphan AV.io 4K
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Elgato Cam Link 4K
| <!--Vendor ID-->0x0FD9
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2018 uvc }}
|-
| <!--Description-->[https://github.com/elgatosf/capture-device-support Elgato HD60 S+]
| <!--Vendor ID-->0x0FD9
| <!--Product ID-->0x006C, 0x006E
| <!--Revision-->
| <!--Opinion-->{{unk|2019 4K 30FPS capture, 1080p 60FPS uvc}}
|-
| <!--Description-->Elgato HD60 X
| <!--Vendor ID-->0x0FD9
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2022 uvc }}
|-
| <!--Description-->Elgato Cam Link 4K HDMI video capture card
| <!--Vendor ID-->0x0FD9
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 uvc compliant but can have usb disconnects}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->EVGA XR1 USB
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2021 USB 3.0 device with 1080/60 capture and 4K/60 passthrough}}
|-
| <!--Description-->EVGA XR1 lite USB
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2022 USB 3.0 device }}
|-
| <!--Description-->EVGA XR1 Pro USB
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2021 USB 3.0 device with 1080/60 capture and 4K/60 passthrough}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->EZcap Game Link Raw - ezcap321 usb3.1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2022 2160p30, 1080p120 and 1440p60 HDMI input and pass-through. - 1080p120, 2160p30 and 1440p60 recording. - Latency less than 50ms uvc}}
|-
| <!--Description-->EZCap GameDock Ultra
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2022 record at 4K30, 1440p60, and 1080p120}}
|-
| <!--Description-->EZcap 360 Game Capture Extreme
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2023 USB 3.0, 4K 60FPS passthru and 1080p 240FPS}}
|-
| <!--Description-->EZCAP 364 GameDock Extreme 2.1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2024 }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Genki ShadowCast 1 & 2, the Pro version
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->HAUPPAUGE HD PVR Pro 60
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2021 4K in/Out 1080P 60fps Capture and Streaming PC Connected and Stand Alone }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->INOGENI 4K2USB3 2830 3826 HDMI 4K to USB 3.0 UHD 1080p Video Capture Card
| <!--Vendor ID-->0x2997
| <!--Product ID-->0x0004
| <!--Revision-->
| <!--Opinion-->{{unk|2019 uvc compliant made in Canada - usb3-b socket and 1 hdmi 1080p from 23.98 up to 60p, 4K@30 fps maybe - }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Kondor Blue
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Nanjing Magewell Electronics Co ltd USB 3.0 XI100DUSB-HDMI Pro Capture
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2013 }}
|-
| <!--Description-->Magewell USB3.0 Silver HDMI Full HD Video Capture Device 1080p 32011
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2013 usb audio extract HDMI embedded audio output via headphones}}
|-
| <!--Description-->Magewell USB capture HDMI PLUS 2K 32040 320400000
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2014 captures video up to 1920×1200, 1920×1080 or 2048×1080 at 60 fps over an HDMI capture from devices such as game consoles in up to DCI 4Kp60 4:2:0 input resolution, and it automatically upscales/downscales the signal to 2K for recording or streaming}}
|-
| <!--Description-->Magewell USB capture HDMI Gen2 32060
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2015 1080p gets hot, 165M HDMI receiver, max input 2048x1080 60fps 4:4:4, RGB/YUV 4:4:4 8/10/12-bit, YUY 4:2:2 12-bit, up to 8-channel 24-bit HDMI-embedded audio at 192kHz, HDMI 1.4a, output from 480p to 1080p, YUY2/UYVY/RGB24/RGB32 support video cropping, up/down scaling, de-interlacing, aspect ratio conversion, color format conversion, frame rate conversion, flip and mirror, up to 2-channel IEC60958 audio streams, 5V 0.5A 2.5W, }}
|-
| <!--Description-->Magewell USB Capture 4K Plus 32090
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2022 limited by the bandwidth of USB 3.0, the maximum frame rate can only reach 30 fps when capturing}}
|-
| <!--Description-->Magewell USB Capture 4K PRO
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2024 }}
|-
| <!--Description-->Magewell Pro Convert IP to USB
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|Captures one network eth NDI® High Bandwidth, NDI® HX2, NDI® HX3 sources or H.264/H.265 video source into software at resolutions up to 1080p60}}
|-
| <!--Description-->Magewell USB Fusion
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|versatile USB video capture device that allows users to switch between two HDMI inputs and one USB webcam input for live presentations}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->ROLAND UVC-01 USB Video Capture
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2020 }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Sunplus Innovation Technology Inc. MiraBox HSV321 ARX321 Video Capture device
| <!--Vendor ID-->ox1bcf
| <!--Product ID-->0x2c99
| <!--Revision-->
| <!--Opinion-->{{unk|2022 uvc uac }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->UGREEN CM716
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| uvc uac but disable HDCP on your source device (PS4/PS5, Xbox) }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->VisionTek UVC HD60 Capture Card
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
|}
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| <!--Description-->Acer Aspire Crystal Eye AOA110 AOA150 0.3M
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|2008 webcam }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|}}
|-
| <!--Description-->AVerMedia Live Streamer CAM 313 (PW313)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|2019 uvc 1080p/30 webcam}}
|-
| <!--Description-->AVerMedia Live Streamer DUO
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|2021 uvc 1080p/60 webcam}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|}}
|-
| <!--Description-->[http://reviews.cnet.co.uk/webcams/creative-live-cam-optia-af-review-49294183/ Creative Live Cam Optia AF] 2.0M
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| {{no|2008 }}
|-
| <!--Description-->DSLR macro extensions + a cheap 50mm E-Series lens + some PVC tubing and a negative holder
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{yes| if uvc camera chosen}}
|-
| <!--Description-->DSLR scanning using a macro lens, for the adapter, for a 3d printed negative holder)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{yes| if uvc camera used }}
|-
| <!--Description-->Logitech C270
| <!--Vendor ID-->0x046d
| <!--Product ID-->0x0825
| <!--Revision-->
| <!--Opinion-->{{unk|720p }}
|-
| <!--Description-->Logitech C910 C920 HD Pro 5Megapixels 720p
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|Output mjpg 1080p}}
|-
| <!--Description-->Logitech C920s c922 HD Pro 5Megapixels 1080p
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|Output mjpg 1080p}}
|-
| <!--Description-->Logitech
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|}}
|-
| <!--Description-->Logitech Brio 100 300 500
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|}} 1080p
|-
| <!--Description-->Logitech MX Brio 4k
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|4k}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|}}
|-
| <!--Description-->Microsoft's LifeCam HD-3000 HD-5000
| <!--Vendor ID-->0x045e
| <!--Product ID--> 0x0779
| <!--Revision-->1.06
| <!--Opinion-->{{no|}}
|-
| <!--Description-->Microsoft LifeCam Cinema
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|}}
|-
| <!--Description-->Microsoft LifeCam Studio
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|}} sony imx179 1080p
|-
| <!--Description-->Pi
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|}} 1/2.8” Sony IMX291 image sensor, it's a 2MP, UVC-compliant, ultra-wide-angle, low light, high-speed USB 2.0
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|}} OV5648
|-
| <!--Description-->razer kiyo
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|}} 4 megapixel sensor 1080p 30fps 720p 60fps - 12 led ring light adjustable
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|}}
|-
| <!--Description-->TeckNet C068 1.3mpixel HTD USB2.0 Camera Vimicro Z-Star Corp
| <!--Vendor ID-->0x0AC8
| <!--Product ID--> 0x3420
| <!--Revision-->0x01FA
| <!--Opinion-->{{no|}}
|-
| <!--Description-->[https://github.com/wltechblog/thingino-installers/tree/main/wyze-cam-4 Wyze Cam V4] [https://www.youtube.com/watch?v=H0QLiC9QoQU firmware]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no| verified with os04d10 sensor (i2c 0x3c) but not GC4653 (i2c 0x29)}}
|-
| <!--Description-->YEALINK(XIAMEN) NETWORK UVC50 is compatible with the UVC 1.1 protocol CP960-UVC50 and CP960-UVC80 kits PTZ, CP960-UVC30 Kit is UVC 1.5
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|}}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->Amcrest ProHD 1080P WiFi Wireless IP Security Camera - 1080P (1920TVL), [https://www.ispyconnect.com/man.aspx%3Fn%3DAmcrest IP2M-841] nvr
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|}} h264/rtsp, motion detection, features Sony image sensor and Ambarella processor - rtsp://[username]:[password]@[IPaddress]:[port]/cam/realmonitor?channel=[channel]&subtype=[stream] - [username] - username to login to the DVR or NVR, [password] - password, [IPaddress] - IP address of the device. If you are not on the same local network, this should be the external IP address of the device's network, [port] - port number, [channel] - channel number of the stream, [stream] - view the Main or Sub stream. (main stream is 0, sub stream is 1) , eg. rtsp://admin:admin@192.108.1.108:80/cam/realmonitor?channel=1&subtype=1 - utilizing RTSP ( rtsp://user:pass@ipcam1 )
|-
| <!--Description-->Axis all modern ones
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|}} RTSP/RTP + H264/mjpeg or MJPEG over HTTP
|-
| <!--Description-->PTZ
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|}}
|-
| <!--Description-->DLink DCS-5222 5222L network camera
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|}} camera streams H.264 over RTP controlled by RTSP
|-
| <!--Description-->Dlink DCS900
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|}}
|-
| <!--Description-->Sony
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|}}
|-
| <!--Description-->Wansview 1080p [http://marc.merlins.org/perso/linuxha/post_2013-11-10_Reviewing-IP-Webcams-for-Linux-and-Zoneminder_Dlink-DCS900_-Ubnt-Aircam_-Foscam-FI8904W-FI8910W_-FFI9820W_-FI9821W_-Wansview-NCB541W_-and-Zavio-F3210.html#NCM625GA NCM625GA] IP Camera WiFi Wireless IP Security Camera , Full HD Plug n Play Home Surveillance / Baby Monitor
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|}} RTSP/RTP + H264/mjpeg - play its HD stream without problem with vlc rtsp://ip/live/ch0 and getting jpegs http://ipaddr/mjpeg/snap.cgi?chn=0 - methods involve transcoding h.264 video from the camera into jpeg's, which is cpu intensive - able to pull images manually, using http://username:password@ip/mjpeg/snap.cgi -
|-
| <!--Description-->Wansview NCB541W
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|}}
|-
|}
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No| not uvc}}
|-
| <!--Description-->Avermedia Game Capture HD C281
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|2011 standalone h.264 recording of up to component cable not hdmi but not uvc}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Avermedia GL310 Live Gamer Portable (LGP Lite)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|2014 not working usb2 and USB Lite no uvc}}
|-
| <!--Description-->Avermedia AVerMedia Live Gamer Portable ([https://github.com/Trouffman/octv_gears_lgp Model C875])
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|2014 usb2 no uvc}}
|-
| <!--Description-->AVerMedia LGX Live Gamer extreme GC550
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|2015 but [https://github.com/ChrisAJS/lgx2userspace driver]}}
|-
| <!--Description-->AVerMedia LGX2 Live Gamer extreme2 gc550 plus gc551
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|2017 but [https://github.com/ChrisAJS/lgx2userspace driver]}}
|-
| <!--Description-->Avermedia ExtremeCap UVC - BU110
| <!--Vendor ID-->0x07ca
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|2017 maybe not uvc and uac}}
|-
| <!--Description-->AVerMedia Live Gamer Portable 2 Plus GC513 Micro-USB Capture Box LGP2 Plus
| <!--Vendor ID-->0x07ca
| <!--Product ID-->0x1513
| <!--Revision-->
| <!--Opinion-->{{no|2017 powered by a standard Micro-USB cable, video capture output up to 1080p60 capture to hdmi in, standalone sd card recording on exFAT or FAT32 of .MOV, 2160p pass-through hdmi out to tv - no vrr - [https://www.avermedia.com/uk/support/download#ans_part firmware latest 2.1.7.13, 2.1.7.14], SN74AVC8T245 8bit, DRV604 stereo, iTE IT6663FN hdmi 2.0 splitter, TLV320DAC3101 DAC, CS42L73 audio codec, CDCE913 PLL clock, W29N01HVSINA nand bios, I-Catch V35MA SOC CPU 32bit MIPS24K, ADV7480 hdmi mhl, }}
|-
| <!--Description-->AVerMedia Live Gamer 4K LG4K GC573
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|2018 not uvc but [https://github.com/derrod/lg4k-linux drivers here], }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No| not uvc }}
|-
| <!--Description-->Blackmagic intensity Extreme Capture Card
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|2011 not uvc }}
|-
| <!--Description-->BlackMagic Intensity Pro 4k
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|2015 }}
|-
| <!--Description-->Elgato Video Capture (1VC108601000)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No| not uvc }}
|-
| <!--Description-->Elgato Game Capture
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No| not uvc, mini usb}}
|-
| <!--Description-->Elgato Game Capture HD60
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No| not uvc, }}
|-
| <!--Description-->Elgato Game Capture HD GCHD 2GC309901000
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No| not uvc https://github.com/tolga9009/elgato-gchd needs firmware mb86h57_h58_idle.bin and mb86h57_h58_enc_h.bin - mini usb}}
|-
| <!--Description-->Elgato HD60S Elgato Game Capture 4K60 S+ Video Capture
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|non uvc, }}
|-
| <!--Description-->August EZCap.tv model 116
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No| }} poor audio recording
|-
| <!--Description-->E-SDS Diamond Maplin
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No| not uvc }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No| not uvc }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No| not uvc }}
|-
| <!--Description-->Hauppauge 1212 HD PVR
| <!--Vendor ID-->0x2040
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No| }} analog and component only - PlayStation (.m2ts), AVCHD (ts), or XBox(.mp4) recording formats - switched the component output from the default YPbPr to RGB.
|-
| <!--Description-->Hauppauge 1431 1445 HD PVR Gaming Edition HDMI Capture
| <!--Vendor ID-->0x2040
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|2014 not working, can get warm}}
|-
| <!--Description-->Hauppauge HD Rocket
| <!--Vendor ID-->0x2040
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No| not uvc}}
|-
| <!--Description-->Hauppauge HD-PVR2 (model 145210 Rev E4)
| <!--Vendor ID-->0x2040
| <!--Product ID-->0xE502
| <!--Revision-->
| <!--Opinion-->{{No| not uvc }}
|-
| <!--Description-->Hauppauge 1480 1482 HD PVR 2 GE Gaming Edition HDMI Capture green LED - 1498 1503 1504 Plus version with Mac support
| <!--Vendor ID-->0x2040
| <!--Product ID-->0xe514 0xe524
| <!--Revision-->
| <!--Opinion-->{{No| can get warm - [https://ez.analog.com/video/w/documents/581/adv7482-design-support-files ADV7482] [https://patchwork.kernel.org/patch/9201075/ video chip] with Magnum DXT H.264 encoder blob, IDR keyframe generation poor - best for model 157210 and not 157221 and Game Edition Plus (model 157320) 2040:E505 E505-00-00AF1234 [http://www.hauppauge.com/site/support/linux.html#tabs-3 ]}}
* HDMI: 1920x1080p50/60, 1920x1080i50/60, 1280x720p50/60, 720x480i, 720x576i, 640x480p60.
* Component: 1920x1080p50/60, 1920x1080i50/60*, 1280x720p50/60, 720x480p60, 720x480i, 720x576i.
* Composite: 720x480i and 720x576i
* Audio Inputs : HDMI PCM and RCA support with Adjustable Bitrate Quality 2 Channel AAC/AC3 audio codec
|-
| <!--Description-->Hauppauge 1512 HD PVR 2 PC blue LED with optical in input on the back
| <!--Vendor ID-->0x2040
| <!--Product ID-->0xe525
| <!--Revision-->
| <!--Opinion-->{{No| }} can get quite warm - IR Blaster added -
|-
| <!--Description-->Hauppauge Colossus2 E585-00-00AF4321
| <!--Vendor ID-->0x2040
| <!--Product ID-->0xe585
| <!--Revision-->
| <!--Opinion-->{{No| not uvc}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No| not uvc }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No| not uvc }}
|-
| <!--Description-->Ion SLIDES2PC 35mm Portable Slide & Film Scanner
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No| not uvc }}
|-
| <!--Description-->Ion Pics 2 PC
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No| not uvc }}
|-
| <!--Description-->ION PowerScan USB film and slide scanner
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|2011 not uvc }}
|-
| <!--Description-->Koolertron Sunny
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No| not uvc }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No| not uvc }}
|-
| <!--Description-->FilmScan35 35mm Film Negative Scanner 1304 marks spencer
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No| not uvc }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No| not uvc }}
|-
| <!--Description-->U3 HD Capture
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No| not uvc }}
|-
| <!--Description-->[https://github.com/openrazer/openrazer Razer Ripsaw HD] Game Capture (RZ20-01780100)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|2017 not uvc put in usb2 slot and use video BGR3 (Emulated) and OpenRazer drivers }}
|-
| <!--Description-->Razer Ripsaw HD USB HDMI Capture Card
| <!--Vendor ID-->0x1532
| <!--Product ID-->0x0d01
| <!--Revision-->
| <!--Opinion-->{{no|2018 not uvc compliant}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No| not uvc }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No| not uvc }}
|-
| <!--Description-->Silvercrest 35mm Photo Slide Scanner
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No| not uvc but not great quality}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No| not uvc }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No| not uvc }}
|-
| <!--Description-->Z-Star Microelectronics Corp. Traveler TV 6500 SF Dia-scanner
| <!--Vendor ID-->0x0ac8
| <!--Product ID-->0x3370
| <!--Revision-->
| <!--Opinion-->{{No|2010 not uvc and poor scans}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No| not uvc }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No| not uvc }}
|-
|}
=== WebAR + WebVR = WebXR Headset ===
AROS needs an usb based uvc.class to vhi like type driver for virtual display
The primary engineering challenge of VR is motion sickness caused by a mismatch of visual and inner ear information, which is extremely well established as causing people to throw up in a wide range of contexts outside of VR. The experiences that make some people sick are low framerate. Foveated rendering doesn't solve vergence accommodation. Your eye will still be focused at infinity regardless of where you are looking, you'll just have the illusion that the foreground or background are out of focus. Eye tracking plus dynamic lenses (perhaps liquid lenses) or real light fields are necessary.
First start with apps that have simple static features at first, then advance to dioramasa and teleportation options for 10, 20 minutes and then gradually upgrade over a timespan of four weeks to train your brain. Avoid smooth motion stuff like rollercoaster or mountain heights until much later. Even with this preparation, VR makes 40% of people seasick nausea. If so, you may be able to use VR glasses just to watch videos and some slow moving apps [https://www.emuvr.net/ emuVR] instead.
*2014-2019 1st Gen, low resolution,
*2020-2025 2nd Gen, higher resolution,
*2026-
Most hardware typically has a 1-3 year retail lifespan with 1-3 years of updates after. Really need "right" tethered PCVR rather than wireless.
The advantage to being tethered to a PC is processing power. Any standalone headset is going to be running purely off of batteries.
VR and AR are known as XR
Technology will get immersed enough so not making people sick. Higher resolution, faster frame rates, and [https://github.com/opentrack/opentrack better tracking].
Eventually, hyper reality brings VR, AR and MR digital layers together as a less chaotic, optic tracking with no delay, agents understanding, experiences with objects
3Dgs 4Dgs gassian splats bullet time slice photo snaps .ply for WebXR
[https://lvra.gitlab.io/docs/hardware/ ],
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Big Screen Beyond 1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2023 pcvr 2560 x 2560, fixed IPD, }}
|-
| <!--Description-->bigscreen Beyond 2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 pcvr oled 5120 x 2560 @75Hz 2688x2688 @90Hz over pancake lenses, 116 FOV, virtual screens, custom facial plate from iphone app, streamvr 2.0 basestations and controllers not included, no passthrough, 107g-196g, }}
|-
| <!--Description-->bigscreen Beyond 2e
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2026 pcvr oled 5120 x 2560 total up to 90Hz pancake lens 116 FOV adjustable IPD app needed for adjustment, eye tracking, custom face mask cushion, streamvr 2.0 basestations and controllers not included, seperate head strap and speaker modules extra costs, 110g-300g }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Dpvr P1 Pro 4k Ultra Vr Headset
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2024 wireless snapdragon, }}
|-
| <!--Description-->DPVR P2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Play for Dream MR
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 android modular 3840x3552 uoled per eye 90Hz or qled mura issues, Arm snapdragon XR2+ Gen 2, eye tracking and 11 cameras 7 sensors 22 ir leds 14ms latency and foveated rendering, 1.5hrs battery, }}
|-
| <!--Description-->Play for Dream GravityXR
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2026 ultralight head gear gx100 3w }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->[https://lvra.gitlab.io/docs/community/ Valve Index HMD]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2019 tethered PC VR headset 1440 x 1600 120Hz, 108° and 104° FOV, fresnel lenses, SteamVR2 compatible tracking ir basestations, controllers aka Knuckles, dp 1.2 and usb3 cable proprietary cable end, no battery, }}
|-
| <!--Description-->Valve Steam Frame (Valve Deckard / Valve’s Index 2)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2026 - 2160 x 2160 up to 144Hz pancake lens, 108° and 96° FOV, wifi 6 fovelated streaming, Qualcomm Snapdragon 8 Gen 3 with [https://github.com/FEX-Emu/FEX fex] arm-to-x86 x64 translation layer, }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Sony PSVR2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|2023 PCVR with adapter, two, one for each eye, 2000 x 2040 resolution OLED panels from 90Hz 120Hz refresh rates, fresnel lenses, 116° and 102° FOV, sony proprietary headset cable end, needs additional comfort options, }}
|-
| <!--Description-->VisionPro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Goertek glasses
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->HTC Vive ?
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No| 2016 2x 1080x1200 needs external power supply, }}
|-
| <!--Description-->HTC Vive Original
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2016 108° and 96° FOV}}
|-
| <!--Description-->HTC Vive Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2016 , uvc, at least 2 powered steamvr basestations so 3 to 5 wall warts in total, proprietary cable end, }}
|-
| <!--Description-->HTC Vive Pro 2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2017 dual 1440x1600 oled displays, 116° and 100° FOV - steamvr 2.0 basestation 2 for 5m2 area 4 for 10m2 - steamvr 2.0 joypads - low latency wireless later - type USB-c headphone adapter required, [https://github.com/CertainLach/VivePro2-Linux-Driver Rust on Linux] with [https://github.com/santeri3700/vive-pro-2-on-linux Shell], proprietary cable end, }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Lynx R1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2023 android Qualcomm Snapdragon XR2 Gen 1, }}
|-
| <!--Description-->Lynx R2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|2026 company liquidated, 2 x 2312x2160 110 FOV pancake lenses, LynxOS android Qualcomm Snapdragon XR2 Gen, openxr 1.1, }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Oculus Rift prototype development kit [https://www.virtual-boy.com/forums/t/the-oculus-rift-dk1-thread/ DK1] with [https://www.youtube.com/watch?v=X_T4DJyy2Bo wired razer hydra controllers]
| <!--Vendor ID-->0x2833
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|2013 pcvr LCD 1280 × 800 resolution 640 × 800 per eye up to 110° FOV, and 3DoF rotational tracking via a 1000Hz 9-axis IMU (Accelerometer, gyroscope, and magnetometer), no positional optical tracking either inside-out or outside-in, 380g, nausea issues, , }}
|-
| <!--Description-->Oculus Rift prototype development kit [https://github.com/facebookarchive/RiftDK2/tree/master DK2], [https://www.ifixit.com/Teardown/Oculus+Rift+Development+Kit+2+Teardown/27613 ifixit teardown]
| <!--Vendor ID-->0x2833
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|2014 pcvr, 5.7" Super AMOLED display with a resolution of 960 x 1080 per eye 100° field of view, 1 usb Positional Tracker DK2 camera, lots of wires}}
|-
| <!--Description-->Facebook [https://github.com/thaytan/OpenHMD/tree/rift-kalman-filter Oculus Rift CV1] [https://noraisin.net/diary/?m=202201 some Linux support] [] [https://github.com/OpenHMD/OpenHMD/issues/330 AMD usb issues] [https://github.com/OpenHMD/OpenHMD/wiki/Xorg ] [https://github.com/Doc-Ok/OculusRiftCV1Camera Live Video] [https://www.youtube.com/@thaytan Youtube] [https://github.com/Fredrum/riftOnLinux Pi] [https://github.com/OhioIon/riftDriverPi ], but not quite there with the [https://www.youtube.com/watch?v=DSsCN6HFkWc consumer CV1], [https://forum.dcs.world/topic/142259-cv1-not-working-in-dcs/#comment-2878168 orange led could be HDMI Signal is not within HDMI Spec and might be Overclocked or usb3 not getting enough power frustrating],
| <!--Vendor ID-->0x2833
| <!--Product ID-->0x3031, 0x2031, 0x0031 and 0x0211 for 3p-a basestations lighthouses, 0x045e 0x02e6 for xbox wireless adapter
| <!--Revision-->
| <!--Opinion-->{{No|2016 powered run from your PC maybe uvc via wired dual PenTile OLED 2160x1200 (1080x1200 per eye) @ exactly 90Hz but screen door effect (space between pixels), 87 FOV, IPD from 58mm to 72mm, good 3D audio and okay mic, constellation headset 6DOF (3-axis rotational tracking + 3-axis positional tracking) with up to 3 usb infrared basestation (1 in front and 2 behind pointing upwards) on usb3 and usb2 to your PC but the tracking can be fragile so set it up on a weekly basis, wired only HDMI 1.3, USB 3.0 bus powered with proprietary plug in headset, 470g 1lb front heavy, 2 robust 1st Gen touch controllers with external sensors i.e. outside-in - 1 aa alkaline over rechargable battery each , press occulus and B buttons for 2 secs to connect, headset traps air so gets very warm inside and random disconnects due to twisting action on the top of the headset and/or cables, t4 torx screws }}
|-
| <!--Description-->Facebook Occulus Go 32Gb
| <!--Vendor ID-->0x2833
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|2018 discontinued 2020 android based, 1280x1440 per eye 60Hz LCD, not gaming, no inside-out and limited self tracking, }}
|-
| <!--Description-->Facebook Oculus Rift S [https://noraisin.net/diary/?m=202201 some Linux support]
| <!--Vendor ID-->0x2833
| <!--Product ID-->0x0051 headset (cdc, audio, tracking data), 0x2052 usb hub,
| <!--Revision-->
| <!--Opinion-->{{No|2019 PCVR wired dual LCD 1080 by 1200, 88 horizontal FOV, display port (fibre optic strands) and annoying USB3 copper cables (power, audio and other data) but proprietary port in the headset, cameras on the headset ("inside-out") tracking so no base stations, non removeable head band and cushions and ipd hard to set, requires specific fragile Rift S/Quest1 2nd Gen Touch controllers which has a ring of translucent plastic with leds inside - t5 torx to disassemble for sticks drifting}}
|-
| <!--Description-->Facebook Occulus Quest 1
*032Gb
*064Gb
| <!--Vendor ID-->0x2833
| <!--Product ID-->0x0183 (single adb boot), 0x0
| <!--Revision-->
| <!--Opinion-->{{No|2019 android standalone wireless, 1440 x 1600 72Hz oled, front heavy though, play area 2m x 2m or bigger, low clocked Qualcomm Snapdragon 835 (MSM8998) (4x Kryo 280 Gold cores ARM Cortex-A73) + (4x Kryo 280 Silver A53), 2 to 3 hrs play time, 575g, 2nd Gen touch controllers, }}
|-
| <!--Description-->Meta Oculus Quest 2 KW49CM aka Codename Del Mar [https://www.meta.com/en-gb/help/quest/967070027432609/ fragile 3rd Gen Touch controllers] [https://www.youtube.com/watch?v=Cgejky8ZeoM internal battery] and selling over 20 million, more than all other quest headsets combined
*064Gb
*128Gb (110Gb free)
*256Gb
Setup continuous wifi, create Meta Oculus account, [https://developers.meta.com/horizon/ verify dev account, click on My apps], [ create Organization -> My Organization Groupings], [https://www.youtube.com/watch?v=QPInS5xxF-0 finally, meta quest mobile app to switch on adb],
| <!--Vendor ID-->0x2833
| <!--Product ID-->0x5010 (), 0x0083 (massstorage), 0x0086 (), 0x0186 (adb and xrsp [https://github.com/shinyquagsire23/xrsp_tests tests]), 0x0090 (composite adb), 0x0081 (),
| <!--Revision-->0419
| <!--Opinion-->{{unk|2021 android stand alone, lcd 1832x1920 per-eye 90Hz refresh rate, 97 FOV, fresnel lenses, 6DOF (degrees of freedom), 58-63-68 IPD settings, low clocked Arm snapdragon xr2 gen 1 apps with Meta Link cable USB-C usb3.2 pcvr maybe, b/w but no color passthrough, 6 t2 torx and 5 ph00 screws in headset (long bit), discontinued December 31, 2024, feature updates until December 2026, critical bug fixes and security updates until December 2027, 470g, Oculus + B button on right controller (move) and Menu + Y button on left controller (click) for about 3 seconds, 10W 5v 2a, RTL8153 chipset usb support,
*V60 unable to
*V77 pcvr issues
*V79 unable to }}
|-
| <!--Description-->Facebook Occulus Quest Pro aka Codename Seacliffe
| <!--Vendor ID-->0x2833
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|2022 android standalone wireless 1440 x 1600 72Hz oled, 106° and 96° FOV mini lcd local dimming, pancake lenses, limited eye tracking, play area 2m x 2m or bigger, higher clocked snapdragon xr2 gen 1 arm cpu Arm apps, 1 to 2 hrs play time, new pro controllers with 3 cameras each, battery at rear, wireless charging, color passthrough, 9V 3A or 5V 3A,
*v77 capped wifi }}
|-
| <!--Description-->Meta Oculus Quest 3 aka Codename Eureka [ Air Light ALVR] or [ WiVRn] with fragile touch plus q3 controllers
*128Gb
*512Gb
streaming from PC with [https://github.com/alvr-org/Monado-ALVR ALVR], runtime of [https://monado.freedesktop.org/ Monado steamvr alternative openxr openVR], with Envision GUI,
| <!--Vendor ID-->0x2833
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2023 standalone, pancake lenses on lcd 2064 x 2208 res panel per eye 1200ppi - 104° and 96° FOV - up to 120Hz, Arm snapdragon xr2 gen 2 apps, foveated rendering, Meta Link cable USB-C 3.2, headstrap clamshell or halo style, speaker arms fragile, color passthrough, 510g, 18W 9v 2A or 15W 5V 3A,
*v74 ok }}
*v76 pcvr issues }}
|-
| <!--Description-->Meta Quest 3S aka Codename Ventura
*128Gb
*256Gb
| <!--Vendor ID-->0x2833
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2024 Arm snapdragon xr2 gen 2 cpu, lcd 1832 x 1920 fresnel lenses, 97 FOV, headphone arms fragile, better air flow, no promixity sensor inside, Meta Link cable USB-C 3.2, passthrough, }}
|-
| <!--Description-->Meta Boba 3
| <!--Vendor ID-->0x2833
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2027 ultra-wide 180° x 120° FOV, snapdragon XR2 G2, }}
|-
| <!--Description-->Meta Tiramisu
| <!--Vendor ID-->0x2833
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2027 µOLED displays with 90 pixels per degree, }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Pimax 5K Super Plus
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2019 }}
|-
| <!--Description-->Pimax 8K
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2020 }}
|-
| <!--Description-->Pimax 8K-X 8KX
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2021 }}
|-
| <!--Description-->Pimax Crystal Light
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 tethered to PC with 2160 x 2160 4k 120Hz, 115° and 96° FOV, inside-out tracking, no battery, display port cable, variable qc and customer service, }}
|-
| <!--Description-->Pimax Crystal Super
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 tethered to PC with 3640 x 3640 4k 90hz, 116°+ and 100° FOV, eye tracking, inside-out tracking, no battery, display port cable, }}
|-
| <!--Description-->Pimax Dream Air with Lighthouse(s)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2026 tethered 3840 by 3552 @90Hz micro oled with pancake lens, 100 HFOV 96 VFOV but FOV IPD changes in app, link box for headset 2 split y cables, removable face gasket, 290g, steamVR2 bases and controllers, eye tracking, }}
|-
| <!--Description-->Pimax Dream Air SLAM
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2026 Simultaneous Localization and Mapping (SLAM) tracking inside-out so no base stations, }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->[https://somniumspace.com/ Somnium VR One VR1] [https://portal.vrgineers.com/user-guide/software/ open source] VR headset
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 pcvr 2880 x 2880 per eye @90 @120Hz, 125° horizontal 100° vertical FOV, 2 x SteamVR 2.0 bases, passthrough, 900g }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Varjo Aero VR-1 Headset
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2022 psu needed, 2 x Mini LED binocular of 150 nits, 2880x2720 per, 90Hz, FOV 102° horizontal, 73° vertical, 720g with headstrap, 2 x SteamVR 2.0 basestations, no speakers/mic, hdmi and usb3.0}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Varjo Aero XR-3
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Varjo Aero XR-4
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Camelo La Melaza Music Shield
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|2026 no usb only bluetooth , }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->InAir 2 elite suite
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 ar nits 46FOV , , 4h battery life, 80g, }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Oakley Vanguard
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->RayNeo Air 3s
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 AR 100in 46FOV 650nits, usb-c 79g }}
|-
| <!--Description-->RayNeo Air 3S Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 AR 135in virtual display 46FOV 1200nits, usb-c 80g }}
|-
| <!--Description-->RayNeo Air 4 Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2026 AR oled vision 4000 processing, HDR10, 47 FOV }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Rokid Max 2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 ar 147in 50 FOV 650nits, usb-c back left, 76g, }}
|-
| <!--Description-->Rokid AI Spatial with Station 2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 AR 600nits 147in 50FOV 75g, }}
|-
| <!--Description-->Rokid
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| ar ai smart glass}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Viture Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 135in 46 FOV 1000nits, magnetic connector, 77g, }}
|-
| <!--Description-->VITURE XR Luma
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 ar 147in 1200p 50 FOV, }}
|-
| <!--Description-->Viture Luma Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 152in 52 FOV 1000nits 1200p, 3dof, , 79g, }}
|-
| <!--Description-->Viture Luma Ultra
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 in FOV, 2 cameras, 3dof 6dof, }}
|-
| <!--Description-->[https://github.com/wheaney/XRLinuxDriver Viture Luma Pro]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Viture Beast
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 ar 1250nits 58FOV 174in, magnetic, 88g, }}
|-
| <!--Description-->VITURE Beast X Glasses models (Immersive 3D Moonlight)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2026 based 2D to 3D conversion with support DP Alt Mode (DisplayPort over USB-C), 1200p, 3df tracking, practic lenses 58deg POV, }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Xreal One
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 ar 600nits, 50FOV, 3dof, usb-c 84g, }}
|-
| <!--Description-->XReal One Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 ar 700nits 57FOV 171in, usb-c, x1 3dof, }}
|-
| <!--Description-->Nreal now Xreal Air
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 , micro-oled 1080p, audio, virtual uvc ar displays, }}
|-
| <!--Description-->Nreal now Xreal Real3D 1S
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2026 AI based 2D to 3D conversion 57 FOV, , virtual uvc ar displays not vr, }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Xiami XR
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Xtal 8k
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->Apple Vision Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|2022 tethered AR mixed reality glasses, 3300ppi, 800g, }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Google XR
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->HTC Vive Focus
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2018 standalone }}
|-
| <!--Description-->HTC Vive Focus Plus
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2018 android with 2 1440 x 1600 75Hz amoled, inside-out, durable motion controllers, Vive port, }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->HTC Vive Pro EYE
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|2019 dual-OLED displays 2880 x 1600 combined resolution), SteamVR 2.0 tracking, foveated rendering, Tobii, it enables gaze-based menu navigation with avatar eye contact, proprietary cables, }}
|-
| <!--Description-->HTC Vibe Cosmos
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|2018 poor tracking and lifespan on controllers, }}
|-
| <!--Description-->HTC Vibe Cosmos Elite
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|2020 1440x1700 per eye resolution, 90 Hz refresh rate, 6 DoF tracking, 2880 x 1700 combined pixel resolution, 97° FoV, two controllers and two base stations. Lighthouse tracking, }}
|-
| <!--Description-->HTC Vive Focus Vision Wired
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No| }}
|-
| <!--Description-->HTC Vive Focus 3
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2021 per-eye resolution of 2448×2448 at 90 Hz, a 120-degree field of view, Qualcomm Snapdragon XR2 Gen 1, }}
|-
| <!--Description-->HTC Vive XR Elite VR Headset Deluxe Pack
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|2022 snapdragon xr2 gen 1, }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Pico Goblin
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2017 android based, 2.5K 1280x1440 per eye @70Hz, 92° FoV, and 3DoF (three degrees of freedom) tracking (Orientation tracking only—yaw, pitch, roll), single controller, snapdragon 820, ipd adjustment 54-71 mm, 600g, }}
|-
| <!--Description-->ByteDance Pico G2 4K
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2020 android standalone VR headset, 3840 x 2160 (4K) LCD screen, Snapdragon 835 processor, 3DoF so rotational movement (looking around, pointing) rather than positional movement (walking, leaning), does not support hand or eye tracking, 800g }}
|-
| <!--Description-->ByteDance Pico NEO 2 EYE
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2020 6DoF 360g snapdragon 845 display 4k 75Hz tracking inside-out - magnetic field for controllers - pico software on android 8 - eye tracking }}
|-
| <!--Description-->ByteDance Pico Neo 3
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2022 Snapdragon XR2 Gen, 4K 3664 x 1920 90Hz lcd, battery at rear, displayport, Pico apparently emulates Oculus controllers, }}
|-
| <!--Description-->ByteDance Pico Neo 3 Pro
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2022 }}
|-
| <!--Description-->ByteDance Pico Neo 3 Link
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2022 }}
|-
| <!--Description-->ByteDance Pico 4
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2023 2160x2160 panel per eye 75Hz 90Hz 105 FOV, Arm snapdragon xr gen 1, }}
|-
| <!--Description-->ByteDance Pico 4 ultra
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2023 2160 x 2160 @90 105 FOV, snapdragon XR2 G2, streaming from PC with alvr, wireless streaming from PC with WiVRn, Pico apparently emulates Oculus controllers, not plug and play, }}
|-
| <!--Description-->ByteDance Pico 5 aka Project Swan aka Vision Pro Competitor
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2026 micro-oled BOE 3840 x 3840 4000ppi per eye, MLA pancake lenses, custom pico arm cpu, pico os 6 android, eye and hand tracking, 300g, }}
|-
| <!--Description-->ByteDance Pico
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Samsung Galaxy XR VR
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 3552 x 3840 @60-90 109 FOV , Arm snapdragon XR2+ Gen 2, }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Shiftall MeganeX 8K
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2024 android }}
|-
| <!--Description-->[https://en.shiftall.net/products/meganex8k MeganeX Superlight 8K]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 android (3552 x 3840 pixels) into pixel count yields 27.27MP 10-bit HDR-compatible 4K resolution micro OLED panels @90Hz, pancake lenses 94 FOV, SteamVR™ tracking, 180g, 5V 2A, }}
|-
| <!--Description-->[https://en.shiftall.net/products/meganex8kmk2 MeganeX 8K Mk2 MkII] [https://github.com/sboys3/CustomHeadsetOpenVR community]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2026 pcvr linux, 4K per eye (1.35inch micro OLED 3552x3840 10 bit HDR) 27MP @90Hz 75Hz 72Hz pancake, upto 108 hor 100 vert FOV, usb-c and dp cables to breakout box, 5V 2.1A, 200g}}
|-
| <!--Description-->Shiftall
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2026 }}
|-
| <!--Description-->Shiftall
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->Acer Windows(TM) MR AH101
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2018 Dual 2.89” LCD panels 2880 x 1440 combined (1440 x 1440 per eye) Up to 90Hz (HDMI 2.0), or 60Hz (HDMI 1.4), Field of View FOV 95, Tracking Inside-out, lots of light leak, }}
|-
| <!--Description-->Acer H7001
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2017 wmr 1440 x 1440 per-eye resolution @90Hz refresh rate, and 100-degree field of view FOV, inside-out tracking with front-mounted cameras so no external sensors, flip-up visor design but has a "screen door effect," subpar foam padding, win10 to win11 24H2, }}
|-
| <!--Description-->Dell Visor Mixed Reality VRP100 VR118
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2017 2x 1440x1440 a bit of nose light leak }}
|-
| <!--Description-->Fujitsu
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2017 cheap and lots of light leak }}
|-
| <!--Description-->[https://github.com/HadesVR HadesVR] with [https://github.com/ManoloMancelli/Persephone-Classic-Controller Persephone Controller]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->[https://www.youtube.com/watch?v=HFaVjB1uNOM Persephone 3 Pro DiY 6Dof SteamVR Headset],
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->HP Reverb G1 VR1000
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2019 WMR 2160 x 2160 @90Hz, 115 FOV, , hp proprietary headset cable end, 2 camera tracking but poor and controllers can be unresponsive, 500g front heavy, flight sims rather than gaming, }}
|-
| <!--Description-->HP 1440p Spatial Computing
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2019 dim display }}
|-
| <!--Description-->[https://forums.x-plane.org/forums/topic/294764-vr-in-linux-without-steam/ HP Reverb G2] WMR VR3000
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2020 2 2160 x 2160 90Hz, needs Windows10 or Win 11 24H2, 4 camera tracking, controllers can be unresponsive, hp proprietary headset cable end, , }}
|-
| <!--Description-->HP
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Mirage Solo is a Standalone VR headset
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2018 Qualcomm Snapdragon 835, 1280x1440 per eye resolution, 75 Hz refresh rate, }}
|-
| <!--Description-->Lenovo Explorer VR2511N (G0A2) VR windows mixed reality (WMR)
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2018 LCD 2.89" 1440 x 1440 per eye @90Hz, 6 DOF position tracking, 400g, }}
|-
| <!--Description-->[https://github.com/relativty/relativty open source relativty]
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Samsung MHD Odyssey XE800ZAA WMR
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2018 9V 500mA oled screens 2x 1440x1600 with usb3 and hdmi cables but bluetooth dongle required }}
|-
| <!--Description-->Samsung MHD Odyssey+ Plus WMR
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2019 dual 3.5-inch AMOLED displays 2880 x 1600 total @90Hz, 6DOF inside-out tracking with usb3 and hdmi cables but bluetooth dongle required, use only win10 or win11 24H2, }}
|-
| <!--Description-->Sony PSVR
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|2016 2x 1080x960 up to 120Hz, lots of cables and computation brick, sony camera needed for tracking, ps4 or move controllers, }}
|-
| <!--Description-->Virtuality
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|1992 , , Amiga 3000 with TI chips, }}
|-
| <!--Description-->Virtuix Omni
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2013 VR treadmill changed course to commercial VR and pivotted back again 2020, }}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
|}
=== HDMI CEC transmitter and receiver ===
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
|}
=== TV Remote Control MCE IR transmitter and receiver ===
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->Compro K100 K300
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|need extra software support}}
|-
| <!--Description-->Elitegroup Computer Systems
| <!--Vendor ID-->0x1019
| <!--Product ID-->0x0f38
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->GMYLE MCE
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{Maybe|acts as usb-hid with limited keyboard like controls }}
|-
| <!--Description-->Hauppauge WinTV-PVR kit
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|untested}}
|-
| <!--Description-->Logitech Harmony 300 i300 600 650 800
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|need extra software support}}
|-
| <!--Description-->Microsoft MCE Commander
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|2005 need extra software support}}
|-
| <!--Description-->Microsoft 1039 rev 1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|2005 home top of square shape direction keys}}
|-
| <!--Description-->Microsoft 1039 rev 2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|2006 home under circle spaced direction keys}}
|-
| <!--Description-->Microsoft 1069 SMK Manufacturing, Inc
| <!--Vendor ID-->0x0609
| <!--Product ID-->0x0334
| <!--Revision-->
| <!--Opinion-->{{No|2007 untested}}
|-
| <!--Description-->Philips RC1974506/00
| <!--Vendor ID-->0x0471
| <!--Product ID-->0x0815
| <!--Revision-->
| <!--Opinion-->{{No|untested}}
|-
| <!--Description-->Sony RM-MCE10E PC REMOTE CONTROL VGN-AR21M VGX-XL100 VGN-AR21B/AR21S
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->Sony RM-MCE20E PC REMOTE CONTROL
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->Sony RM-MCE30E PC REMOTE CONTROL VGN-AW21XY VGX-TP3E VGX-TP3G
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->Sony RM-MCE50E PC REMOTE CONTROL VGC-LA2R
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->TSDX-IR14 USB MCE Media Center External Infrared IR Receiver
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->chipsets support CIR (consumer IR) Winbond W83977F/AF, SMC IrCC 2.0
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|technical reasons it's not possible to use USB IrDA dongles}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| <!--Description-->Zotac RC2604323/01G Zbox Media Remote Control with IR USB Receiver OVU710
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
|}
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| <!--Description-->Anycubic Cobra 2 Max
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Bambu Labs A1 Mini 3D printer
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{No|2019 EMS proprietary slicer app and cloud use, eSUN}}
|-
| <!--Description-->Bambu Labs X1 Carbon
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2022 }}
|-
| <!--Description-->Bambu Labs X2D
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Creality K1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Creality K2
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Creality
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Elegoo
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Lulzbot
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Prusa
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Qidi
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Snapmaker U1
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk|2025 tool changer }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->Sovol SV08 Max
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| open source voron model, }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->desktop pick and place machines AFARCO PNP running OpenPnP for Desktop SMT
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|}
==ethwrap.class - Host Data Link "Cable Bridge" for data transfer==
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| Advance USBNET (eTEK design)
| 0x0525
| 0x9901
|
| {{N/A|untested}}
|-
| ALi Uli M5632 (chip)
|
|
|
| {{N/A|untested}}
|-
| Aten (Ali Corporation) UN201
| 0x0402
| 0x5632
|
| {{maybe|force binding from rawwarp to ethwrap}}
|-
| Belkin (eTek design see below)
| 0x050d
| 0x0004
|
| {{N/A|untested}}
|-
| Digitus DN-3004 - USB Host Link
|
|
|
| {{yes|works}}
|-
| EPSON USB client
| 0x0525
| 0x2888
|
| {{N/A|untested}}
|-
| eTEK
| 0x056c
| 0x8100
|
| {{N/A|untested}}
|-
| KC-190
| 0x050f
| 0x0190
|
| {{N/A|untested}}
|-
| GeneSys GL620USB
|
|
|
| {{no|no driver the half-duplex GL620USB is NOT supported, products using it include the Inland Pro USB Quick Link}}
|-
| GeneSys GL620USB-A
|
|
|
| {{N/A|untested}}
|-
| Laplink Gold (uses NetChip 1080)
|
|
|
| {{N/A|untested}}
|-
| Prolific 2301/2302 (Jaton USB ConNET) (BAFO DirectLinq)
| 0x067b
| 0x0000 and 0x0001
| 0x0004
| {{maybe|detected but untested}}
|-
| Xircom PGUNET (uses AnchorChips 2720)
| 0x0547
| 0x2727
|
| {{N/A|untested}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
|}
==cdcacm.class - USB modem==
The CDC ACM driver exposes the USB modem as a virtual serial modem or a virtual COM port to the operating system. The driver enables sending both data and AT commands, either through ACM (separating data and AT commands over different channels) or through Serial Emulation (passing the AT commands as is and as part of the data stream).
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| Alcatel OT-I650
| 0x1bbb
| 0x0003
|
| {{N/A|untested}}
|-
| Acatel Dymamode/Dynamite
| 0x06b9
| 0xa5a5
|
| {{N/A|untested Zyxel Prestige 630-13 - untested PROLiNK Hurricane 8000 external link }}
|-
| AnyData ADU-100A ADU-E100A ADU-E100D ADU-E100H D10
| 0x16d5
| 0x6501
|
| {{N/A|untested}}
|-
| AnyData ADU-310
| 0x16d5
| 0x650
|
| {{N/A|untested}}
|-
| AnyData ADU-500A ADU-510A ADU-510L ADU-520A
| 0x16d5
| 0x6502
|
| {{N/A|untested}}
|-
| AnyData ADU-610 ADU-620
| 0x16d5
| 0x650
|
| {{N/A|untested}}
|-
| BT On-Air USB MODEM
| 0x079b
| 0x000f
|
| {{N/A|untested}}
|-
| Conexant USB MODEM CX93010
| 0x0572
| 0x1321
|
| {{N/A|untested}}
|-
| Conexant USB MODEM RD02-D400
| 0x0572
| 0x1324
|
| {{N/A|untested}}
|-
| Conexant Chipset
| 0x06ea
| 0x0002
|
| {{N/A|untested AUS N367 Roadster II 56 USB (Model AM5050R3) - untested }}
|-
| [http://accessrunner.sourceforge.net/ Conexant AccessRunner]
| 0x0586
| 0x330a
|
| {{N/A|untested }}
|-
| Creative Modem Blaster USB DE5670
| 0x1690
| 0x0101
|
| {{N/A|untested}}
|-
| FIREFLY, MediaTek Inc
| 0x0e8d
| 0x0003
|
| {{N/A|untested}}
|-
| Huawei E122
| 0x12d1
| 0x1446
|
| {{yes|works}} [http://aros-exec.org/modules/newbb/viewtopic.php?post_id=49126#forumpost49126]
|-
| Huawei E160, E160E, E160G
| 0x12d1
| 0x1003
|
|{{yes|works}} [http://aros-exec.org/modules/newbb/viewtopic.php?post_id=51888#forumpost51888] (Chipset: Qualcomm MSM6246)
|-
| Huawei E169 also known as Vodafone K3715 and Huawei K3715
| 0x12d1
| 0x1001
|
|{{yes|works}} [http://aros-exec.org/modules/newbb/viewtopic.php?topic_id=4941&forum=4&post_id=44683#forumpost44683] (Chipset: Qualcomm MSM7200)
|-
| Huawei E220 "Vodafone EasyBox II" "T-Mobile wnw Box Micro" also known as Huawei K3565
| 0x12d1
| 0x1003
|
| {{yes|works, see E169 above (Chipset: Qualcomm MSM6280)}}
|-
| Huawei E1750
| 0x12d1
| 0x1001
|
| {{N/A|untested (Chipset: Qualcomm MSM6290)}}
|-
| Huawei E170, E172, E176
| 0x12d1
| 0x1003
|
| {{N/A|untested (Chipset: Qualcomm MSM7200)}}
|-
| Huawei E180
| 0x12d1
| 0x1406
|
| {{yes|Works (Chipset: Qualcomm MSM7200)}}
|-
| KYOCERA AH-K3001V
| 0x0482
| 0x0203
|
| {{N/A|untested}}
|-
| LG CU515
|
|
|
| {{N/A|untested}}
|-
| MediaTek Inc GPS
| 0x0e8d
| 0x3329
|
| {{N/A|untested}}
|-
| Metricom GS Modem
| 0x0870
| 0x0001
|
| {{N/A|untested}}
|-
| Motorola MOTOMAGX phones
| 0x22b8
| 0x6425
|
| {{N/A|untested}}
|-
| Motorola Q Phone
| 0x22b8
| 0x7000
|
| {{N/A|untested}}
|-
| Hummingbird huc56s (Conexant)
| 0x0572
| 0x1329
|
| {{N/A|untested}}
|-
| Netcomm Roadster II 128 ISDN
|
|
|
| {{N/A|untested}}
|-
| Nokia n70 N95 HSDPA
|
|
|
| {{yes|works - see [http://aros-exec.org/modules/newbb/viewtopic.php?start=0&topic_id=4415&viewmode=flat&order=ASC here]}}
|-
| OGO
| 0x045E
| 0x0079
| 0090
| {{no|no driver}}
|-
| Olitec ADSL Modem V2
| 0x08e3
| 0x0100 / 0x0102
|
| {{N/A|untested}}
|-
| <!--Description-->Onda PT502HS
| <!--Vendor ID-->0x19D2
| <!--Product ID-->0x0001
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
| Radicom V92HU-E2
|
|
|
| {{N/A|untested}}
|-
| <!--Description-->Samsung i8510 Innov8 Symbian smartphone
| 0x04e8
| 0x6651
| <!--Revision-->
| {{yes|works}} [http://aros-exec.org/modules/newbb/viewtopic.php?start=0&topic_id=5552&viewmode=flat&order=ASC&type=&mode=0]
|-
| Samsung Tocco Lite (aka GT-S5230)
| 0x04e8
| 0x6795
| <!--Revision-->
| {{yes|works}} [http://aros-exec.org/modules/newbb/viewtopic.php?start=0&topic_id=5552&viewmode=flat&order=ASC&type=&mode=0]
|-
| Shiro / Aztech USB MODEM UM-3100
| 0x0572
| 0x1328
|
| {{N/A|untested}}
|-
| ZyDAS 56K USB MODEM
| 0x0ace
| 0x1602
|
| {{N/A|untested}}
|-
| ZyDAS 56K USB MODEM
| 0x0ace
| 0x1608
|
| {{N/A|untested}}
|-
| ZyDAS 56K USB MODEM - new version
| 0x0ace
| 0x1611
|
| {{N/A|untested}}
|-
| Zoom Telephonics Model 3095F USB MODEM
| 0x0803
| 0x3095
|
| {{N/A|untested}}
|-
| Ugobe Pleo
| 0x6962
| 0x0100
| 0x0100
| {{Yes|Works}}
|}
==Misc==
palmpda.class - no [http://aminet.net/package/util/libs/PdaLinkPoseidon pdalink.library and tools] in AROS
Palm PDA (discontinued) synchronisation requires a port of pdalink.library and its tools through virtual usbpalm.device.
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| Palm IIIx (OS3.1) serial rs-232 only
|
|
|
| {{no|no }}
|-
| Palm IIIc (OS3.5)
|
|
|
| {{no|no }}
|-
| Palm V
|
|
|
| {{no|no }}
|-
| Palm m100
|
|
|
| {{no|no }}
|-
| Palm m125 first USB - last with aaa batteries
|
|
|
| {{no|no }}
|-
| Palm m500 (OS4)
|
|
|
| {{no|no }}
|-
| Tungsten T (OS5) first arm cpu
| 0x
| 0x
| 0x
| {{no|no }}
|-
| Zire 31 (OS 5.28) color arm-based
|
|
|
| {{no|no }}
|-
| [[:w:Handspring (company)|Handspring Visor]] – USB support out of box
|
|
|
| {{no|no }}
|-
| Handspring Treo 600 – last one for [[:w:Handspring (company)|Handspring]]
|
|
|
| {{no|no }}
|-
| Treo 700w
|
|
|
| {{no|no }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver}}
|-
|}
bluetooth.class - needs Bluetooth (Viking King Harald "Bluetooth" Gormsson (Old Norse: Haraldr Blátǫnn Gormsson; Danish: Harald Blåtand Gormsen) stack to work (not written due to licensing fees to use the symbol merging the Younger Futhark runes for H (ᚼ) and B (ᛒ), representing Harald's initials)
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver}}
|-
|}
ccid.class - Chip/Smart Card Interface Devices (not implemented)
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| <!--Description-->cyberJack RFID basis
| <!--Vendor ID-->0x0C4B
| <!--Product ID-->0x9102
| <!--Revision-->0001
| <!--Opinion-->{{no|no driver}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{no|no driver}}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{N/A|untested}}
|-
|}
dfu.class - DFU firmware upgrade
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| <!--Description-->iPhone 3, 4, 5, 5c
| <!--Vendor ID-->0x05ac
| <!--Product ID-->0x1290 0x1292 0x1294
| <!--Revision-->
| <!--Opinion-->{{unk| 32bit use with caution could cause damage}}
|-
| <!--Description-->iPhone 5s, 6, 7, 8, X
| <!--Vendor ID-->0x05ac
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| 64bit use with caution could cause damage}}
|-
| <!--Description-->M-Audio/Midiman USB audio
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Description
| Vendor ID
| Product ID
| Revision
| Opinion
|-
| <!--Description-->iPad 1, iPad 2 A1395 A1430, iPad 3, ipad mini A1432, iPad A1458 4th Gen (MD512LL/A),
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->2008-2013 32bit A4, A5 up to Apple A6X, iOS 1 to 10,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->
|-
| <!--Description-->iPad Air (1st generation) A1474, A1475, A1476,
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->2014-2015 [https://github.com/AsahiLinux 64bit], A7, iOS 11 up to
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->2015 64bit A8, A8X,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->2016 64bit A9, A9X,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->2017 64bit A10, A10X,
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->2018 64bit A11
|-
| <!--Description-->iPad Air 3rd Gen A2153, A2123, A2154, iPad Mini 5th Gen,
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->2019 64bit A12
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->{{unk| }}
|-
|}
RocketTool (USB Rocket Launchers - Toy missile launchers)
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="3px" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| Original Launcher and StrikerII (includes laser)
| 0x1130
| 0x0202
|
| {{yes|works }}
|-
| Dream Cheeky USB Missile Launcher or USB Cirus Cannon
| 0x1941
| 0x8021
|
| {{no|no driver }}
|-
| Dream Cheeky USB Webcam Missile Launcher
| 0x1941
|
|
| {{no|no driver }}
|-
| Rocket Baby
| 0x0a81
| 0x0701
|
| {{no|no driver }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->
|}
DRadioTool (FM Radios - USB radio devices D-Link/Gemtek)
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="5%" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| D-Link DSB-R100 USB
| 0x04b4
| 0x1002
| 0x0410
| {{yes|works }}
|-
| [http://www.neoseeker.com/forums/383/t257009-link-usb-dru-r100-radio/ GemTek USB FM Radio 21]
| 0x04b4
| 0x1002
|
| {{N/A|untested }}
|-
| <!--Description-->
| <!--Vendor ID-->
| <!--Product ID-->
| <!--Revision-->
| <!--Opinion-->
|}
UproarTool (Valencia MPX mp3 player and others)
{| class="wikitable sortable" width="90%"
! width="30%" | Description
! width="3px" |Vendor ID
! width="10%" |Product ID
! width="10%" |Revision
! width="50%" |Opinion
|-
| Korean D Square Valencia MPX-Player
| 0x04e8
| various
|
| {{N/A|untested }}
|-
|}
{{BookCat}}
jlbs6ltd4ti6p98lelils878f3e7t1d
Template:Quality/color
10
229054
4676724
3495253
2026-10-18T10:22:21Z
ShakespeareFan00
46022
4676724
wikitext
text/x-wiki
<includeonly>{{#tag:nowiki|{{#switch:{{lc:{{{1|}}}}}
| fb = #6699ff
| a = #66ffff
| b = #b2ff66
| c = #ffff66
| start = #ffaa66
| stub = #ff9393
| category|cat = #abb0c9
| shelf = #e6d9ff
| subject = #e6d9ff
| template = #fbceb1
| nb = #bfbfbf
| project = #98FF98
| unassessed = transparent
| #default = transparent}}}}</includeonly><noinclude>
{{documentation}}
</noinclude>
mxgox483fokmj1lannp5y616zj59nur
4676725
4676724
2026-10-18T10:23:42Z
ShakespeareFan00
46022
Doesn't work as intended.
4676725
wikitext
text/x-wiki
<includeonly>{{#switch:{{lc:{{{1|}}}}}
| fb = #6699ff
| a = #66ffff
| b = #b2ff66
| c = #ffff66
| start = #ffaa66
| stub = #ff9393
| category|cat = #abb0c9
| shelf = #e6d9ff
| subject = #e6d9ff
| template = #fbceb1
| nb = #bfbfbf
| project = #98FF98
| unassessed = transparent
| #default = transparent}}</includeonly><noinclude>
{{documentation}}
</noinclude>
2yl51bqx3qg9o81ldy6n2hy8v268bre
4676726
4676725
2026-10-18T10:24:04Z
ShakespeareFan00
46022
4676726
wikitext
text/x-wiki
<includeonly><nowiki>{{#switch:{{lc:{{{1|}}}}}
| fb = #6699ff
| a = #66ffff
| b = #b2ff66
| c = #ffff66
| start = #ffaa66
| stub = #ff9393
| category|cat = #abb0c9
| shelf = #e6d9ff
| subject = #e6d9ff
| template = #fbceb1
| nb = #bfbfbf
| project = #98FF98
| unassessed = transparent
| #default = transparent}}</nowiki></includeonly><noinclude>
{{documentation}}
</noinclude>
ojt6fhmzd866wpn58z1p563bw2ilcwt
4676727
4676726
2026-10-18T10:25:33Z
ShakespeareFan00
46022
Undid 3 revisions from [[Special:Diff/4676724|4676724]] until [[Special:Diff/4676726|4676726]]
4676727
wikitext
text/x-wiki
<includeonly>{{#tag:nowiki|{{#switch:{{lc:{{{1|}}}}}|fb = #6699ff
|a = #66ffff
|b = #b2ff66
|c = #ffff66
|start = #ffaa66
|stub = #ff9393
|category|cat = #abb0c9
|shelf = #e6d9ff
|subject = #e6d9ff
|template = #fbceb1
| nb = #bfbfbf
| project = #98FF98
| unassessed = transparent
| #default = transparent}}}}</includeonly><noinclude>
{{documentation}}
</noinclude>
euhgltc27emmvr6bqkzaw1f2slft6um
4676728
4676727
2026-10-18T10:26:52Z
ShakespeareFan00
46022
Flatten template
4676728
wikitext
text/x-wiki
<includeonly>{{#tag:nowiki|{{#switch:{{lc:{{{1|}}}}}|fb= #6699ff|a = #66ffff|b = #b2ff66|c = #ffff66|start = #ffaa66|stub = #ff9393|category|cat = #abb0c9|shelf = #e6d9ff|subject = #e6d9ff|template = #fbceb1| nb = #bfbfbf| project = #98FF98| unassessed = transparent| #default = transparent}}}}</includeonly><noinclude>
{{documentation}}
</noinclude>
9ibrxl9ul8n4iju5tnih9egoazjiqvu
Aros/User/Applications
0
237399
4676721
4676332
2026-10-18T10:04:22Z
Jeff1138
301139
4676721
wikitext
text/x-wiki
==Introduction==
[[#Graphical Image Editing Art]]
[[#Office Application]]
[[#Audio]]
[[#Misc Application]]
[[#Games & Emulation]]
[[#Application Guides]]
[[#top|...to the top]]
[[#top|...to the top]]
Most apps can be opened on the Workbench (aka publicscreen pubscreen) which is the default display option but can offer a custom one set to your configurations (aka custom screen mode promotion). These custom ones tend to stack so the possible use of A-M/A-N method of switching between full screens and the ability to pull down screens as well
If you are interested in creating or porting new software, see [http://en.wikibooks.org/wiki/Aros/Developer/Docs here]
{| class="wikitable sortable"
|-
!width:30%;|Internet Applications
!width:10%;|AROS(x86)
!width:10%;|Commodore-Amiga OS 3.1 (68k)
!width:10%;|Hyperion OS4(PPC)
!width:10%;|MorphOS(PPC)
|-
|<!--Sub Menu-->Web Online Browser [],
|<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=network/browser Amelinium], Odyssey 2.0, [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1175&highlight=odyssey&rowstart=100 Odyssey 3.0], [],
|<!--Amiga OS-->[https://juen.in/ Amelinium], [https://blog.alb42.de/programs/amifox/ amifox] with [https://github.com/alb42/wrp wrp server], IBrowse*, [https://github.com/zapek/Voyager Voyager], [https://github.com/amigazen/aweb3/ AWeb 3.6 src], [https://github.com/matjam/aweb AWeb Src], [http://aminet.net/package/comm/www/NetSurf-m68k-sources Netsurf], [],
|<!--AmigaOS4-->[ Odyssey OWB], [ Timberwolf (Firefox port 2011)], [http://amigaworld.net/modules/newbb/viewtopic.php?forum=32&topic_id=32847 OWB-mui], [http://strohmayer.org/owb/ OWB-Reaction], IBrowse*, [http://os4depot.net/index.php?function=showfile&file=network/browser/aweb.lha AWeb], Voyager, [http://www.os4depot.net/index.php?function=browse&cat=network/browser Netsurf],
|<!--MorphOS-->Wayfarer, [http://fabportnawak.free.fr/owb/ Odyssey OWB], [ Netsurf], IBrowse*, AWeb, [],
|-
|<!--Sub Menu-->Downloading videos and/or audio [https://github.com/yt-dlp/yt-dlp yt-dlp], [https://clipgrab.org/ clipgrab],
|<!--AROS-->[], [https://blog.alb42.de/amitube/ Amitube],
|<!--Amiga OS-->[https://blog.alb42.de/amitube/ Amitube], [ smtube],
|<!--AmigaOS4-->[https://blog.alb42.de/amitube/ Amitube], getVideo,
|<!--MorphOS-->[ ytsearch], [https://blog.alb42.de/amitube/ Amitube], [ getVideo], Tubexx
|-
|<!--Sub Menu-->E-mailing SMTP POP3 IMAP based
|<!--AROS-->Emailinium, [http://archives.arosworld.org/index.php?function=browse&cat=network/email SimpleMail], [http://sourceforge.net/projects/simplemail/files/ src], [https://github.com/jens-maus/yam YAM]
|<!--Amiga OS-->Emailinium, [http://sourceforge.net/projects/simplemail/files/ SimpleMail], [https://github.com/jens-maus/yam YAM]
|<!--AmigaOS4-->SimpleMail, YAM,
|<!--MorphOS--> SimpleMail, YAM,
|-
|<!--Sub Menu-->Internet Chat IRC, ICB,
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=network/chat WookieChat], [https://sourceforge.net/projects/wookiechat/ Wookiechat src], [http://archives.arosworld.org/index.php?function=browse&cat=network/chat AiRcOS], Jabberwocky,
|<!--Amiga OS-->[https://github.com/charabaruk/WookieChat Wookiechat], AmIRC
|<!--AmigaOS4-->Wookiechat
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=5 Wookiechat], [ AmIRC],
|-
|<!--Sub Menu-->Instant Messaging IM like [https://github.com/BlitterStudio/amidon Hollywood lang based Mastodon client], BlueSky AT protocol, Facebook(TM), Twitter X (TM), Bitlbee IRC Gateway and others
|<!--AROS-->[https://github.com/kaffeine1/telegram-amiga telegram-amiga], [http://archives.arosworld.org/index.php?function=browse&cat=network/chat jabberwocky],
|<!--Amiga OS-->[http://amitwitter.sourceforge.net/ AmiTwitter], CLIMM, SabreMSN, [https://sourceforge.net/projects/ajabberwocky/ jabberwocky],
|<!--AmigaOS4-->[http://amitwitter.sourceforge.net/ AmiTwitter], SabreMSN,
|<!--MorphOS-->[http://amitwitter.sourceforge.net/ AmiTwitter], [http://morphos.lukysoft.cz/en/vypis.php?kat=5 PolyglotNG], SabreMSN,
|-
|<!--Sub Menu-->Torrents
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=network/p2p ArTorr],
|<!--Amiga OS-->
|<!--AmigaOS4-->CTorrent, Transmission
|<!--MorphOS-->MLDonkey, Beehive, [http://morphos.lukysoft.cz/en/vypis.php?kat=5 Transmission], CTorrent,
|-
|<!--Sub Menu-->FTP
|<!--AROS-->[https://github.com/BlitterStudio/dopus5 Dopus5 Magellan], MarranoFTP, [https://aminet.net/package/comm/tcp/wput-0.3.4c.i386-aros wput i386 c src]
|<!--Amiga OS-->[https://github.com/BlitterStudio/dopus5 Dopus5 Magellan], [http://aminet.net/package/comm/tcp/AmiFTP AmiFTP], AmiTradeCenter, ncFTP, [https://aminet.net/package/comm/tcp/sana2-tftpclient sana2 tftpclient c src]
|<!--AmigaOS4-->[https://github.com/BlitterStudio/dopus5 Dopus5 Magellan],
|<!--MorphOS-->[https://github.com/BlitterStudio/dopus5 Dopus5 Magellan], [http://morphos.lukysoft.cz/en/vypis.php?kat=5 Pftp], [http://aminet.net/package/comm/tcp/AmiFTP-1.935-OS4 AmiFTP],
|-
|<!--Sub Menu-->WYSIWYG Web Site Editor
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Internet Radio Streaming Audio [http://www.gnu.org/software/gnump3d/ gnump3d], [http://www.icecast.org/ Icecast2] Server (Broadcast) and Client (Listen), [ mpd], [http://darkice.sourceforge.net/ DarkIce], [http://www.dyne.org/software/muse/ Muse],
|<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=audio/misc], Mplayer (Icecast Client only),
|<!--Amiga OS-->[https://github.com/sandlbn/TuneFinder TuneFinder C Src], [https://github.com/sandlbn/TuneFinderMUI TuneFinderMUI], [http://amigazeux.net/anr/ AmiNetRadio], [https://github.com/boingball/MintAMP MintAMP], [],
|<!--AmigaOS4-->[http://www.tunenet.co.uk/ Tunenet],
|<!--MorphOS-->Mplayer, AmiNetRadio,
|-
|<!--Sub Menu-->VoIP (Voice over IP) with SIP Client (Session Initiation Protocol) or Asterisk IAX2 Clients Softphone (skype like)
|<!--AROS-->
|<!--Amiga OS-->AmiPhone with Speak Freely,
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Weather Forecast
|<!--AROS-->[http://sourceforge.net/projects/zunetools/files/ WeatherBar], [http://archives.arosworld.org/index.php?function=browse&cat=utility/workbench AWeather], []
|<!--Amiga OS-->[http://amigazeux.net/wetter/ Wetter], [https://github.com/emartisoft/AmiWeatherForecasts AmiWeatherForecasts src],
|<!--AmigaOS4-->[http://os4depot.net/?function=showfile&file=utility/workbench/flipclock.lha FlipClock],
|<!--MorphOS-->[http://amigazeux.net/wetter/ Wetter],
|-
|<!--Sub Menu-->Street Road Maps Route Planning GPS Tracking
|<!--AROS-->[https://blog.alb42.de/programs/muimapparium/ MuiMapparium] [https://build.alb42.de/ Build of MuiMapp versions],
|<!--Amiga OS-->AmiAtlas*, UKRoutePlus*, [http://blog.alb42.de/ AmOSM],
|<!--AmigaOS4-->
|<!--MorphOS-->[http://blog.alb42.de/programs/mapparium/ Mapparium],
|-
|<!--Sub Menu-->Clock and Date setting from the internet by network time protocol (NTP) [https://www.timeanddate.com/worldclock/ World Clock], [http://www.time.gov/ old standard NIST Internet Time Servers],
|<!--AROS-->[https://github.com/bohunamiga/PiNTP PiNTP], [https://archives.arosworld.org/?function=showfile&file=utility/workbench/amitimekeeper.i386-aros.lha amitimekeeper with c src], [http://archives.arosworld.org/index.php?function=browse&cat=network/misc ntpsync], [],
|<!--Amiga OS-->ntpsync, [http://aminet.net/package/util/cdity/AmiTimeKeeper amitimekeeper], [http://aminet.net/comm/misc/netclock netclock], [https://aminet.net/package/comm/net/sntp sntp], [http://aminet.net/package/util/time/ScreenTime ScreenTime],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Newsgroups
|<!--AROS-->
|<!--Amiga OS-->[http://newscoaster.sourceforge.net/ Newscoaster], [https://github.com/jens-maus/newsrog NewsRog], [ WorldNews],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->RSS
|<!--AROS-->
|<!--Amiga OS-->[https://github.com/Team-Boingo/AmiRSS AmiRSS src]
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->AI
|<!--AROS-->
|<!--Amiga OS-->[https://github.com/murinsel/AmigaAI Claude], [https://github.com/geekychris/amiga_mcp AI on host machine], [],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->BBS
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|}
<nowiki>*</nowiki> Commercial product.
==Graphical Image Editing Art==
{| class="wikitable sortable"
|-
!width:30%;|Image Editing
!width:10%;|AROS(x86)
!width:10%;|Commodore-Amiga OS 3.1(68k)
!width:10%;|Hyperion OS4(PPC)
!width:10%;|MorphOS(PPC)
|-
|<!--Sub Menu-->Pixel Raster Artwork [https://github.com/LibreSprite/LibreSprite LibreSprite based on GPL aseprite], [https://github.com/abetusk/hsvhero hsvhero], [],
|<!--AROS-->[https://sourceforge.net/projects/zunetools/files/ZunePaint/ ZunePaint], [http://archives.arosworld.org/index.php?function=browse&cat=graphics/edit LunaPaint], [http://archives.arosworld.org/index.php?function=browse&cat=graphics/edit GrafX2], [ LodePaint needs OpenGL],
|<!--Amiga OS-->[http://www.amigaforever.com/classic/download.html PPaint], GrafX2, [https://github.com/grovdata/Amiga_Sources/blob/master/software.md DeluxePaint], [http://www.amiforce.de/perfectpaint/perfectpaint.php PerfectPaint], Zoetrope, Brilliance2*,
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=graphics/edit LodePaint], GrafX2,
|<!--MorphOS-->Sketch, Pixel*, GrafX2, [http://morphos.lukysoft.cz/en/vypis.php?kat=3 LunaPaint]
|-
|<!--Sub Menu-->Image viewing
|<!--AROS-->[http://sourceforge.net/projects/zunetools/files/ ZuneView], [http://archives.arosworld.org/index.php?function=browse&cat=graphics/viewer LookHere], [http://archives.arosworld.org/index.php?function=browse&cat=graphics/viewer LoView], [http://archives.arosworld.org/index.php?function=browse&cat=graphics/viewer PicShow] , [http://amigaworld.net/modules/newbb/viewtopic.php?mode=viewtopic&topic_id=31400&forum=32&start=80&viewmode=flat&order=0#583458 Picture Album],
|<!--Amiga OS-->PicShow, PicView, Photoalbum,
|<!--AmigaOS4-->WarpView, PicShow, flPhoto, Thumbs, [http://amigaworld.net/modules/newbb/viewtopic.php?mode=viewtopic&topic_id=31400&forum=32&start=80&viewmode=flat&order=0#583458 Picture Album],
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=3 ShowGirls], [http://amigaworld.net/modules/newbb/viewtopic.php?mode=viewtopic&topic_id=31400&forum=32&start=80&viewmode=flat&order=0#583458 Picture Album]
|-
|<!--Sub Menu-->Photography retouching / Image Manipulation like Photoshop(tm)
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=graphics/edit RNOEffects],
|<!--Amiga OS-->[ Tecsoft Video Paint aka TVPaint], Photogenics*, ArtEffect*, ImageFX*, XiPaint, fxPaint, ImageMasterRT, Opalpaint,
|<!--AmigaOS4-->WarpView, flPhoto, [http://www.os4depot.net/index.php?function=browse&cat=graphics/edit Photocrop]
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=3 ShowGirls], ImageFX*,
|-
|<!--Sub Menu-->Manage RAW picture folder galleries like Darktable, RAWtherapy, etc
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Graphic Format Converter - ICC profile support sRGB, Adobe RGB, XYZ and linear RGB
|<!--AROS-->
|<!--Amiga OS-->GraphicsConverter, ImageStudio, [http://www.coplabs.org/artpro.html ArtPro]
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Thumbnail Generator [],
|<!--AROS-->[http://sourceforge.net/projects/zunetools/files/ ZuneView], [http://archives.arosworld.org/index.php?function=browse&cat=utility/shell Thumbnail Generator]
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Icon Editor
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=graphics/iconedit Archives], [http://archives.arosworld.org/index.php?function=browse&cat=utility/workbench Icon Toolbox],
|<!--Amiga OS-->
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=graphics/iconedit IconEditor]
|<!--MorphOS-->
|-
|<!--Sub Menu-->2D Pixel Art Animation
|<!--AROS-->Lunapaint
|<!--Amiga OS-->PPaint, AnimatED, Scala*, GoldDisk MovieSetter*, Walt Disney's Animation Studio*, ProDAD*, [https://github.com/historicalsource/DeluxePaint DeluxePaint src], Brilliance
|<!--AmigaOS4-->
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=3 Titler]
|-
|<!--Sub Menu-->2D SVG based MovieSetter type
|<!--AROS-->
|<!--Amiga OS-->MovieSetter*, Fantavision*
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Morphing
|<!--AROS-->[ GLMorph]
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->2D Cad (qcad->LibreCAD, etc.)
|<!--AROS-->
|<!--Amiga OS-->Xcad, MaxonCAD
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->3D Cad like FreeCad, BRL-CAD, OpenSCAD, AvoCADo, etc. using dxf, obj (vertices), blend,
|<!--AROS-->
|<!--Amiga OS-->XCad3d*, DynaCADD*, [https://aminet.net/package/gfx/3d/Cycas178_EN Cycas]*,
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->3D Model Rendering of glft (json) gbl (png jpg), usdz (USD files with materials, textures, and animations), FBX Filmbox is a proprietary Autodesk format,
|<!--AROS-->POV-Ray
|<!--Amiga OS-->[http://www.discreetfx.com./amigaproducts.html CINEMA 4D]*, POV-Ray, Lightwave3D*, Real3D*, Caligari24*, Reflections/Monzoom*, [https://github.com/privatosan/RayStorm Raystorm src], Tornado 3D, [https://github.com/AlphaPixel/Eric-Graham-1987-Juggler-Raytracer-1.0 Eric-Graham-1987-Juggler-Raytracer-1.0]
|<!--AmigaOS4-->Blender, POV-Ray, Yafray
|<!--MorphOS-->Blender, POV-Ray, Yafray
|-
|<!--Sub Menu-->3D Format Converter [], [],
|<!--AROS-->[https://archives.arosworld.org/?function=showfile&file=graphics/convert/ 3doc.i386-aros], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=showfile&file=graphics/convert/ivcon.lha IVCon]
|<!--MorphOS-->
|-
|<!--Sub Menu-->Screen grabbing display
|<!--AROS-->[ Screengrabber], [http://archives.arosworld.org/index.php?function=browse&cat=utility/misc snapit], [http://archives.arosworld.org/index.php?function=browse&cat=video/record screen recorder], []
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Grab graphics music from apps [https://github.com/Malvineous/ripper6 ripper6], [],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Manage metadata of images [https://github.com/exiv2/exiv2 exiv2], [ EXIF/IPTC/XMP metadata manipulation], [],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|}
<nowiki>*</nowiki> Commercial product.
[[#top|...to the top]]
==Office Application==
{| class="wikitable sortable"
|-
!width:30%;|Office
!width:10%;|AROS (x86)
!width:10%;|[http://en.wikipedia.org/wiki/Amiga_software Commodore-Amiga OS 3.1] (68k)
!width:10%;|[http://en.wikipedia.org/wiki/AmigaOS_4 Hyperion OS4] (PPC)
!width:10%;|[http://en.wikipedia.org/wiki/MorphOS MorphOS] (PPC)
|-
|<!--Sub Menu-->Office Suite
|<!--AROS-->
|<!--Amiga OS-->[ Softwood Final Office], [ Wordworth Office], [ Digita Office], [ The Works!], [ Europress Mini Office], [], [ Papyrus Office Demo],
|<!--AmigaOS4-->
|<!--MorphOS-->[ Papyrus Office],
|-
|<!--Sub Menu-->Word-processing
|<!--AROS-->[https://finalwriter.godaddysites.com/ Final Writer 7*], [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1995&rowstart=20&pid=12668#post_12668 Slovo], [https://github.com/sodero/MUI-Vim/releases MUI-Vim], [https://archives.arosworld.org/index.php?function=browse&cat=office/wordprocessing Cinnamon Writer], [],
|<!--AmigaOS-->[ Softwood FinalCopy II*], Haage AmigaWriter*, Digita WordWorth*, Softwood FinalWriter*, Micro-Systems Excellence 3*, Arnor Protext, Rashumon, [ InterWord], [ KindWords], [WordPerfect], [ New Horizons Flow], [ CygnusEd Pro], [ Micro-systems Scribble],
|<!--AmigaOS4-->AbiWord, [ CinnamonWriter],
|<!--MorphOS-->[ Cinnamon Writer], [http://www.meta-morphos.org/viewtopic.php?topic=1246&forum=53 scriba], [http://morphos.lukysoft.cz/en/index.php Papyrus Office],
|-
|<!--Sub Menu-->Spreadsheets
|<!--AROS-->[https://blog.alb42.de/programs/leu/ Leu], [https://archives.arosworld.org/index.php?function=browse&cat=office/spreadsheet ],
|<!--AmigaOS-->[https://aminet.net/package/biz/spread/ignition-src Ignition Src 1.3], [MaxiPlan 500 Plus], [OXXI Plan/IT v2.0 Speadsheet], [ Superplan], [ Creative Developments TurboCalc], [ ProCalc], [ InterSpread], [Digita DGCalc], [ Gold Disk Advantage], [ Micro-systems Analyze!]
|<!--AmigaOS4-->Gnumeric, [https://ignition-amiga.sourceforge.net/ Ignition],
|<!--MorphOS-->[ ignition], [http://morphos.lukysoft.cz/en/vypis.php Papyrus Office],
|-
|<!--Sub Menu-->Presentations
|<!--AROS-->[http://www.hollywoood-mal.com/ Hollywood]*,
|<!--Amiga OS-->[http://www.hollywoood-mal.com/ Hollywood]*, [https://github.com/evaneykelen/mediapoint-amiga MediaPoint C and asm], PointRider, Scala*,
|<!--Amiga OS4-->[http://www.hollywoood-mal.com/ Hollywood]*, PointRider
|<!--MorphOS-->[http://www.hollywoood-mal.com/ Hollywood]*, PointRider
|-
|<!--Sub Menu-->Databases
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=office/database BeeBase],
|<!--Amiga OS-->Precision Superbase 4 Pro*, Arnor Prodata*, [https://sourceforge.net/projects/beebase/ BeeBase], Datastore, FinalData*, AmigaBase, Fiasco, Twist2*, [Digita DGBase], [],
|<!--AmigaOS4-->BeeBase, SQLite,
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=6 BeeBase],
|-
|<!--Sub Menu-->PDF Viewing, editing and digital signatures
|<!--AROS-->[https://github.com/tomaszstaniak/aros-foliopdf folio version of mupdf], [http://sourceforge.net/projects/arospdf/ ArosPDF via splash xpdf], [https://github.com/wattoc/AROS-vpdf vpdf],
|<!--Amiga OS-->APDF
|<!--AmigaOS4-->AmiPDF
|<!--MorphOS-->APDF, vPDF,
|-
|<!--Sub Menu-->Note Taking markdown support like Obsidian like, joplin, OneNote, EverNotes, xournalpp, etc
|<!--AROS-->
|<!--Amiga OS-->[http://aminet.net/package/text/edit/Kickdown c src with reaction gui], [],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Study and analyse, collect, organize, annotate, cite, and share
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->PIM Personal Information Manager - Day Diary Planner Calendar App Filofax like
|<!--AROS-->[ ], [ ], [ ],
|<!--Amiga OS-->Digita Organiser*, On The Ball, Everyday Organiser, [ Contact Manager],
|<!--AmigaOS4-->AOrganiser,
|<!--MorphOS-->[http://polymere.free.fr/orga_en.html PolyOrga],
|-
|<!--Sub Menu-->Accounting
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=office/misc ETB], LoanCalc, [ ], [ ], [ ],
|[ Digita Home Accounts2], Accountant, Small Business Accounts, Account Master, [ Amigabok],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Project Management Research
|<!--AROS-->
|<!--Amiga OS-->SuperGantt, SuperPlan,
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Desktop
|<!--AROS-->Wanderer, Scalos, Workbook, DOpus5,
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->[https://github.com/zapek/Ambient Ambient Src]
|-
|<!--Sub Menu-->System Wide Search
|<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=utility/filetool Finder], [], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->System Wide Dictionary - multilingual [http://sourceforge.net/projects/babiloo/ Babiloo], [http://code.google.com/p/stardict-3/ StarDict],
|<!--AROS-->[ ],
|<!--AmigaOS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->System wide Thesaurus - multi lingual
|<!--AROS-->[ ],
|Kuma K-Roget*,
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Sticky Desktop Notes (post it type)
|<!--AROS-->[http://aminet.net/package/util/wb/amimemos.i386-aros AmiMemos], [https://aminet.net/package/util/wb/amimemos.src-aros AmiMemos Src], [],
|<!--Amiga OS-->[http://aminet.net/package/util/wb/StickIt-2.00 StickIt v2],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->DTP Desktop Publishing
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=graphics/edit RNOPublisher],
|<!--Amiga OS-->[http://pagestream.org/ Pagestream]*, Professional Pro Page*, Saxon Publisher, Pagesetter, PenPal,
|<!--AmigaOS4-->[http://pagestream.org/ Pagestream]*
|<!--MorphOS-->[http://pagestream.org/ Pagestream]*
|-
|<!--Sub Menu-->Printing
|<!--AROS-->Postscript 3 laser printers, [https://github.com/bohunamiga/MintPRINT MintPRINT AirPrint IPP], [ Ghostscript], [],
|<!--Amiga OS-->[https://github.com/boingball/MintPRINT MintPRINT IPP], [https://github.com/Andiweli/AmiAirprint AmiAirprint], [http://www.irseesoft.de/tp_what.htm TurboPrint]*, [ GutenPrint], [https://aminet.net/package/comm/tcp/NetPrinter NetPrinter LPR], [], [],
|<!--AmigaOS4-->(some native drivers),
|<!--MorphOS-->early TurboPrint included, [https://aminet.net/package/comm/tcp/NetPrinter NetPrinter LPR],
|-
|<!--Sub Menu-->Scanning
|<!--AROS-->[ SCANdal], [],
|<!--Amiga OS-->FxScan*, ScanQuix*, [https://github.com/boingball/MintSCAN MintSCAN],
|<!--AmigaOS4-->SCANdal (Sane)
|<!--MorphOS-->SCANdal
|-
|<!--Sub Menu-->OCR
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=graphics/convert gOCR]
|<!--AmigaOS-->
|<!--AmigaOS4-->
|<!--MorphOS-->[http://morphos-files.net/categories/office/text Tesseract]
|-
|<!--Sub Menu-->Text Editing
|<!--AROS-->Jano Editor (already installed as Editor), [http://archives.arosworld.org/index.php?function=browse&cat=development/edit EdiSyn], [http://archives.arosworld.org/index.php?function=browse&cat=utility/text/edit Annotate], [https://archives.arosworld.org/index.php?function=browse&cat=development/edit Vim], [http://archives.arosworld.org/index.php?function=browse&cat=utility/text/edit FrexxEd] [https://github.com/vidarh/FrexxEd src], [ NoWinEd],
|<!--Amiga OS-->[https://aminet.net/package/text/edit/TurboText20 TurboText20 ttx], Annotate, MicroGoldED/CubicIDE*, CygnusED*, Protext*, NoWinED,
|<!--AmigaOS4-->Notepad, Annotate, CygnusED*, NoWinED,
|<!--MorphOS-->MorphOS ED, NoWinED, GoldED/CubicIDE*, CygnusED*, Annotate,
|-
|<!--Sub Menu-->Office Fonts [http://sourceforge.net/projects/fontforge/files/fontforge-source/ Font Designer]
|<!--AROS-->[ ], [ ],
|<!--Amiga OS-->TypeSmith*, SaxonScript (GetFont Adobe Type 1),
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Drawing Vector
|<!--AROS-->[http://sourceforge.net/projects/amifig/ ZuneFIG previously AmiFIG], [https://github.com/serk118/designworks-aros designworks aros 64bit]
|<!--Amiga OS-->Drawstudio*, ProVector*, ArtExpression*, Professional Draw*, AmiFIG, MetaView, [https://gitlab.com/amigasourcecodepreservation/designworks Design Works Src], [],
|<!--AmigaOS4-->MindSpace, [http://www.os4depot.net/index.php?function=browse&cat=graphics/edit amifig],
|<!--MorphOS-->SteamDraw, [http://aminet.net/package/gfx/edit/amifig amiFIG],
|-
|<!--Sub Menu-->video conferencing (jitsi)
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->source code hosting
|<!--AROS-->Gitlab,
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Remote Desktop (server)
|<!--AROS-->[http://sourceforge.net/projects/zunetools/files/VNC_Server ArosVNCServer],
|<!--Amiga OS-->[http://s.guillard.free.fr/AmiVNC/AmiVNC.htm AmiVNC], [http://dspach.free.fr/amiga/avnc/index.html AVNC]
|<!--AmigaOS4-->[http://s.guillard.free.fr/AmiVNC/AmiVNC.htm AmiVNC]
|MorphVNC, vncserver
|-
|<!--Sub Menu-->Remote Desktop (client) login and connect to another machine
|<!--AROS-->[https://sourceforge.net/projects/zunetools/files/VNC_Client/ ArosVNC], [http://archives.arosworld.org/index.php?function=browse&cat=network/misc rdesktop],
|<!--Amiga OS-->[http://twinvnc.free.fr/index.php?menu=01&lang=eng TwinVNC], [http://dspach.free.fr/amiga/vva/index.html VVA], [http://www.hd-zone.com/ RDesktop]
|<!--AmigaOS4-->[http://twinvnc.free.fr/index.php?menu=01&lang=eng TwinVNC], [http://www.hd-zone.com/ RDesktop]
|[http://twinvnc.free.fr/index.php?menu=01&lang=eng TwinVNC], [http://www.hd-zone.com/ RDesktop]
|-
|<!--Sub Menu-->notifications
|<!--AROS-->
|<!--Amiga OS-->Ranchero
|<!--AmigaOS4-->Ringhio
|<!--MorphOS-->MagicBeacon
|-
|<!--Sub Menu-->Biometric facial logins and fingerprint security features
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Fido U2F (Universal 2nd Factor) and later FIDO2 (W3C WebAuthn with CTAP2) key authorization like Yubico YubiKey, etc
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|}
<nowiki>*</nowiki> Commercial product.
[[#top|...to the top]]
==Audio==
{| class="wikitable sortable"
|-
!width:30%;|Audio
!width:10%;|AROS(x86)
!width:10%;|Commodore-Amiga OS 3.1(68k)
!width:10%;|Hyperion OS4(PPC)
!width:10%;|MorphOS(PPC)
|-
|<!--Sub Menu-->Playing playback Audio like MP3, [https://github.com/chrg127/gmplayer NSF], [https://github.com/kode54/lazyusf miniusf .usflib] [https://gitlab.com/kode54/psflib with pfslib], [], [], etc
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=video/play Mplayer], [ HarmonyPlayer hp], [http://www.a500.org/downloads/audio/index.xhtml playcdda] CDs, [ WildMidi Player], [https://bszili.morphos.me/ UADE mod player], [], [ RNOTunes], [ mp3Player], [],
|<!--Amiga OS-->AmiNetRadio, AmigaAmp, playOGG, [https://codeberg.org/tygre/amimodradio amimodradio]
|<!--AmigaOS4-->TuneNet, SimplePlay, AmigaAmp, TKPlayer
|AmiNetRadio, Mplayer, Kaya, AmigaAmp
|-
|<!--Sub Menu-->Editing Audio
|<!--AROS-->[ Audio Evolution 4]
|<!--Amiga OS-->[https://sourceforge.net/projects/hd-rec/ HD-Rec Src], [http://www.sonicpulse.de/eng/news.html SoundFX], [ Samplitude],
|<!--AmigaOS4-->[https://sourceforge.net/projects/hd-rec/ HD-Rec], AmiSoundED, [http://os4depot.net/?function=showfile&file=audio/record/audioevolution4.lha Audio Evolution 4]
|[http://www.hd-rec.de/HD-Rec/index.php?site=home HD-Rec],
|-
|<!--Sub Menu-->Editing Tracker Music
|<!--AROS-->[https://github.com/hitchhikr/protrekkr Protrekkr], [ Schism Tracker], [http://archives.arosworld.org/index.php?function=browse&cat=audio/tracker MilkyTracker], [http://www.hivelytracker.com/ HivelyTracker], [ Radium in AROS already], [http://www.a500.org/downloads/development/index.xhtml libMikMod],
|<!--Amiga OS-->MilkyTracker, HivelyTracker, DigiBooster, Octamed SoundStudio, [https://github.com/elindstrom/soundtracker soundtracker],
|<!--AmigaOS4-->MilkyTracker, HivelyTracker, GoatTracker
|MilkyTracker, GoatTracker, DigiBooster,
|-
|<!--Sub Menu-->Editing Music [], [https://github.com/kmatheussen/camd CAMD] and/or staves and musical notes on manuscript [https://github.com/ratchov/midish midish] midi sequencer
|<!--AROS-->[http://bnp.hansfaust.de/ Bars and Pipes], [], [],
|<!--Amiga OS-->[http://bnp.hansfaust.de/ Bars'n'Pipes], MusicX* David "Talin" Joiner & Craig Weeks (for Notator-X), Deluxe Music Construction Set DMCS2*, [https://github.com/timoinutilis/midi-sequencer-amigaos Horny c Src] [https://github.com/kas1e/midi-sequencer-amigaos/tree/master/HornyGCC HornyGCC OS4 src] [https://github.com/capehill/midi-sequencer-amigaos Horny OS4 fork src] [https://www.amigans.net/modules/newbb/viewtopic.php?start=0&topic_id=8143&order=ASC&status=&mode=0 OS4 thread], HD-Rec, [https://aminet.net/package/mus/midi/dominatorV1_51 Dominator], [https://github.com/royaltm/Amiga-midiIn Amiga-midiIn], [ Aegis Sonix 2.0]
|<!--AmigaOS4-->[https://sourceforge.net/p/hd-rec/code/HEAD/tree/ HD-Rec Src], Rockbeat, [http://bnp.hansfaust.de/download.html Bars'n'Pipes], [https://github.com/gooofy/freeaction Horny OS4 src fork], Audio Evolution 4,
|<!--MorphOS-->Bars'n'Pipes,
|-
|<!--Sub Menu-->Sound Sampling
|<!--AROS-->[ Advanced AHI Recorder all], [https://archives.arosworld.org/index.php?function=browse&cat=audio/record Audio Evolution 4], [http://www.imica.net/SitePortalPage.aspx?siteid=1&did=162 Quick Record], [https://archives.arosworld.org/index.php?function=browse&cat=audio/misc SOX to get AIFF 16bit files], [https://github.com/aros-development-team/AROS/tree/master/workbench/tools/AHIRecord AHIRecord],
|<!--Amiga OS-->[https://aminet.net/package/mus/edit/AudioEvolution3_src Audio Evolution 3 c src], [ Samplitude]*, Audiomaster IV*,
|<!--AmigaOS4-->[https://github.com/timoinutilis/phonolith-amigaos phonolith c src], HD-Rec, Audio Evolution 4,
|<!--MorphOS-->[https://sourceforge.net/p/hd-rec/code/HEAD/tree/ HD-Rec Src], Audio Evolution 4,
|-
|<!--Sub Menu-->Audio Processing like easyeffects so having limiter, compressor, convolver, equalizer and auto volume and many other plugins
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Live Looping or Audio Misc - Groovebox like
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->CD/DVD burn
|<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=utility IsoTools], [https://code.google.com/p/amiga-fryingpan/ FryingPan],
|<!--Amiga OS-->FryingPan, [ MakeCD],
|<!--AmigaOS4-->FryingPan, AmiDVD,
|<!--MorphOS-->[http://www.amiga.org/forums/printthread.php?t=58736 FryingPan], Jalopeano,
|-
|<!--Sub Menu-->CD/DVD audio rip
|<!--AROS-->Lame, [http://www.imica.net/SitePortalPage.aspx?siteid=1&cfid=0&did=167 Quick CDrip],
|<!--Amiga OS-->Lame,
|<!--AmigaOS4-->Lame,
|<!--MorphOS-->Lame,
|-
|<!--Sub Menu-->MP3 v1 and v2 Tagger
|<!--AROS-->id3ren (v1), [http://archives.arosworld.org/index.php?function=browse&cat=audio/edit mp3info],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|
|-
|<!--Sub Menu-->Audio Convert
|<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=audio/misc Sox], [],
|<!--Amiga OS-->[http://aminet.net/package/mus/misc/SoundBox SoundBox], [http://aminet.net/package/mus/misc/SoundBoxKey SoundBox Key], [http://aminet.net/package/mus/edit/SampleE SampleE], sox
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->DJ mixing jamming
|<!--AROS-->
|<!--Amiga OS-->[https://github.com/djh0ffman/PT1210 Hoffman PT1210 DJ tracker], [],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Radio Automation Software [http://www.rivendellaudio.org/ Rivendell], [http://code.campware.org/projects/livesupport/report/3 Campware LiveSupport], [http://www.sourcefabric.org/en/airtime/ SourceFabric AirTime], [http://www.ohloh.net/p/mediabox404 MediaBox404],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Speakers Audio Sonos Mains AC networked wired controlled
*2005 ZP100 with ZP80
*2008 Zoneplayer ZP120 (multi-room wireless amp) ZP90 receiver only with CR100 controller,
*2009 ZonePlayer S5,
*2010 BR100 wireless Bridge (no support),
*2011 Play:3
*2013 Bridge (no support), Play:1,
*2016 Arc, Play:1,
*Beam (Gen 2), Playbar, Ray, Era 100, Era 300, Roam, Move 2,
*Sub (Gen 3), Sub Mini, Five, Amp S2
|<!--AROS-->SonosController
|<!--Amiga OS-->SonosController
|<!--AmigaOS4-->SonosController
|<!--MorphOS-->SonosController
|-
|<!--Sub Menu-->Smart Speakers
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|}
<nowiki>*</nowiki> Commercial product.
[[#top|...to the top]]
==Video Creativity and Production==
{| class="wikitable sortable"
|-
!width:30%;|Video
!width:10%;|AROS(x86)
!width:10%;|Commodore-Amiga OS 3.1(68k)
!width:10%;|Hyperion OS4(PPC)
!width:10%;|MorphOS(PPC)
|-
|<!--Sub Menu-->Playing Video
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=video/play Mplayer], [ VAMP], [http://www.a500.org/downloads/video/index.xhtml CDXL player], [http://www.a500.org/downloads/video/index.xhtml IffAnimPlay], [],
|<!--Amiga OS-->Frogger*, AMP2, MPlayer, RiVA*, MooViD*,
|<!--AmigaOS4-->DvPlayer, MPlayer
|<!--MorphOS-->MPlayer, Frogger, AMP2, VLC
|-
|<!--Sub Menu-->Streaming Video and game streaming like OBS studio, Parsec, [https://github.com/lizardbyte/sunshine sunshine], [https://github.com/moonlight-stream/moonlight-qt moonlight], etc
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Playing DVD
|<!--AROS-->[http://a-mc.biz/ AMC]*, Mplayer
|<!--Amiga OS-->AMP2, Frogger
|<!--AmigaOS4-->[http://a-mc.biz/ AMC]*, DvPlayer*, AMP2,
|<!--MorphOS-->Mplayer
|-
|<!--Sub Menu-->Screen Recording
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=video/record Screenrecorder], [ ], [ ], [ ], [ ],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->Screenrecorder,
|-
|<!--Sub Menu-->Create Edit Individual Video - Amiga like OSs have no pro NLE
|<!--AROS-->[ Mencoder], [ Quick Videos], [http://archives.arosworld.org/index.php?function=browse&cat=graphics/edit AVIbuild], [http://archives.arosworld.org/index.php?function=browse&cat=graphics/misc FrameBuild], FFMPEG,
|<!--Amiga OS-->[ MainConcept Mainactor Broadcast*], [http://en.wikipedia.org/wiki/Video_Toaster Video Toaster*] with [https://discreetfx.com/openvideotoaster.html some c src], MacroSystem MovieShop 4.3*, proDAD Adorage*, [ IOSpirit VHI studio]*, [Gold Disk ShowMaker], [],
|<!--AmigaOS4-->FFMpeg/GUI
|<!--MorphOS-->Blender, Mencoder, FFmpeg
|-
|<!--Sub Menu-->Subtitle editor
|<!--AROS-->[https://aminet.net/package/text/edit/Slarti_Arosx86ABIv0 Slarti_Arosx86ABIv0], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->IP-based video production workflows with High Dynamic Range (HDR), 10-bit color collaborative NDI,
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Blogging like Lemmy or kbin
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->VR face recognition for Vtubers
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->VR chatting Live2D models with Cubism type editor or [https://github.com/AyagamiDev/ayagami ayagami] like with zipped moc3 with model metadata (model3, cdi3)
<pre>
Model data (cmo3)
Basic motions (can3)
Background image (png)
Set of files for embedding (runtime folder)
• Model data (moc3)
• Motion data (motion3.json)
• Model settings file (model3.json)
• Physics settings file (physics3.json)
• Display auxiliary file (cdi3.json)
</pre>
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->VR chatting chatters .VRML models - standardized 3D file format for VR avatars
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->V-tubers V-tubing like Vseeface with Openseeface tracker or Vpuppr (virtual puppet project) for online live 2d / 3d art models rigging rigged LIV
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|}
<nowiki>*</nowiki> Commercial product.
[[#top|...to the top]]
==Misc Application==
{| class="wikitable sortable"
|-
!width:30%;|Misc Application
!width:10%;|AROS(x86)
!width:10%;|Commodore-Amiga OS 3.1 (68k)
!width:10%;|Hyperion OS4(PPC)
!width:10%;|MorphOS(PPC)
|-
|<!--Sub Menu-->File Management
|<!--AROS-->DOpus4, [https://github.com/BlitterStudio/dopus5 DOpus Magellan aka DOpus 5], [ Scalos], [ FileMaster],
|<!--Amiga OS-->DOpus2, DOpus 4, [https://github.com/BlitterStudio/dopus5 Dopus5 Magellan], ClassAction, FileMaster, DirWork 2*, [https://github.com/RudolphRiedel/DiskMaster2 DiskMaster2 src],
|<!--AmigaOS4-->DOpus4, [https://github.com/BlitterStudio/dopus5 Dopus5 Magellan], Filer, AmiDisk
|<!--MorphOS-->DOpus4, [https://github.com/BlitterStudio/dopus5 Dopus5 Magellan],
|-
|<!--Sub Menu-->Package Application Installer
|<!--AROS-->[https://github.com/tomaszstaniak?tab=repositories Pkg manager], [https://aros-pkg.azurewebsites.net/search?arch=x86_64 Pkg], [ InstallerNG],
|<!--Amiga OS-->InstallerNG, Grunch,
|<!--AmigaOS4-->Jack
|<!--MorphOS-->Jack
|-
|<!--Sub Menu-->Compression archiver [https://github.com/FS-make-simple/paq9a paq9a], [],
|<!--AROS-->XAD system is a toolkit designed for handling various file and disk archiver
|<!--Amiga OS-->
|<!--AmigaOS4-->[https://aminet.net/package/util/pack/decrunchmania_os4 Crunchmania CrM2 depacker],
|<!--MorphOS-->
|-
|<!--Sub Menu-->Binary Hexadecimal Editor
|<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=development/edit Zaphod], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Filesystem Partition Editor formatter Disk Management
|<!--AROS-->[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1440&highlight=partition&pid=8821#post_8821 QuickPart], [ HDToolBox]
|<!--Amiga OS-->[https://github.com/stefanskotte/hdpart hdpart], [https://github.com/ChuckyGang/AmiPart AmiPart],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Filesystem Repair and backups
|<!--AROS-->ArSFSDoctor,
|<!--Amiga OS-->[https://aminet.net/package/disk/bakup/quarterback_src Quarterback Tools C and asm src], [ ], [ ], [ ],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->System Disk check, integrity and history [https://github.com/smartmontools/smartmontools smart tools], [],
|<!--AROS-->
|<!--Amiga OS-->[],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->File Verification / Repair
|<!--AROS-->[https://arosarchives.os4depot.net/index.php?function=browse&cat=utility md5sum], [https://arosarchives.os4depot.net/index.php?function=browse&cat=utility/filetool asum], [http://archives.arosworld.org/index.php?function=browse&cat=utility/filetool workpar2] (PAR2), [http://zakalwe.fi/~shd/foss/cksfv/files/ compile cksfv from website],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->Par2,
|-
|<!--Sub Menu-->Multiple File renaming
|<!--AROS-->DOpus 4 or 5,
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Anti Virus
|<!--AROS-->
|<!--Amiga OS-->VChecker,
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Random Wallpaper Desktop changer [ DOpus5], [ Scalos],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Alarm Clock, Timer, Stopwatch, Countdown
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=utility/workbench DClock], [http://aminet.net/util/time/AlarmClockAROS.lha AlarmClock], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Edge snap window tool
|<!--AROS-->[https://github.com/kaffeine1/edgesnap edgesnap]
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|}
==Misc Application 2==
{| class="wikitable sortable"
|-
!width:30%;|Misc Application
!width:10%;|AROS(x86)
!width:10%;|Commodore-Amiga OS 3.1(68k)
!width:10%;|Hyperion OS4(PPC)
!width:10%;|MorphOS(PPC)
|-
|<!--Sub Menu-->C/C++ IDE Integrated Development
|<!--AROS-->[https://sourceforge.net/projects/aidea/ AIDEa], [ Murks], [],
|<!--Amiga OS-->[http://devplex.awardspace.biz/cubic/index.html Cubic IDE]*, [ StormC], [https://github.com/jens-maus/amide amide], [],
|<!--AmigaOS4-->CodeBench , [https://gitlab.com/boemann/codecraft CodeCraft],
|<!--MorphOS-->[http://devplex.awardspace.biz/cubic/index.html Cubic IDE]*,
|-
|<!--Sub Menu-->C/C++ Text Editors
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=utility/text/edit FrexxEd], [https://github.com/vidarh/FrexxEd FrexxEd src], [http://archives.arosworld.org/index.php?function=browse&cat=utility/text/edit Annotate] with [https://www.onyxsoft.se/files/annotate_src.lha src],
|<!--Amiga OS-->[ Protext], [ CED], [],
|<!--AmigaOS4-->
|<!--MorphOS-->[https://www.onyxsoft.se/annotate.html Annotate],
|-
|<!--Sub Menu-->Repository
|<!--AROS-->[ Git]
|<!--Amiga OS-->
|<!--AmigaOS4-->Git
|<!--MorphOS-->
|-
|<!--Sub Menu-->BASIC Computer Language
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=development/language Basic4SDL], [ Ace Basic], [ X-AMOS], [SDLBasic], [ Alvyn],
|<!--Amiga OS-->[http://www.amiforce.de/main.php Amiblitz 3] with [https://github.com/AmiBlitz/AmiBlitz3 Asm src], [http://amos.condor.serverpro3.com/AmosProManual/contents/c1.html Amos Pro] with [https://github.com/AmiDARK/AmosProfessionalUnity-Official-Releases Asm src], [http://aminet.net/package/dev/basic/ace24dist ACE Basic], [https://github.com/gooofy/aqb aqb], [],
|<!--AmigaOS4-->
|<!--MorphOS-->sdlBasic
|-
|<!--Sub Menu-->Computer Languages Translation [https://tetracorp.github.io/guide/reverse-engineering-amiga.html], [https://amigasourcecodepreservation.gitlab.io/amiga-assembler-insider-guide/], [https://github.com/kermitfrog/Amiga-Re-Engineering Rust, Ghidra and FS-UAE],
|<!--AROS-->
|<!--Amiga OS-->[https://bitbucket.org/rhinoid/convert68000toc/src/main/ convert m68k seka asm-one to c],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Gui Creators
|<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=development/guitool MuiBuilder],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->[ MuiBuilder],
|-
|<!--Sub Menu-->Catalog .cd .ct Custom App Language Editors
|<!--AROS-->FlexCat, [https://archives.arosworld.org/index.php?function=browse&cat=utility Flexcat GUI], [],
|<!--Amiga OS-->[http://www.geit.de/deu_simplecat.html SimpleCat], FlexCat
|<!--AmigaOS4-->[http://aminet.net/package/dev/misc/simplecat SimpleCat], FlexCat
|<!--MorphOS-->[http://www.geit.de/deu_simplecat.html SimpleCat], FlexCat
|-
|<!--Sub Menu-->Cross Development
|<!--AROS-->[], [],
|<!--Amiga OS-->[https://github.com/geekychris/amiga_mcp amiga_mcp], [https://github.com/mbergmann-sh/AmigaED4-IDE AmigaED4-IDE], [https://lemonspawn.com/turbo-rascal-syntax-error-expected-but-begin/ Turbo Rascal], [],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|}
<nowiki>*</nowiki> Commercial product.
==Misc Application 3==
{| class="wikitable sortable"
|-
!width:30%;|Misc Application
!width:10%;|AROS(x86)
!width:10%;|Commodore-Amiga OS 3.1(68k)
!width:10%;|Hyperion OS4(PPC)
!width:10%;|MorphOS(PPC)
|-
|<!--Sub Menu-->System
|<!--AROS-->[ SysExplorer], [ SysMon], [ Scout], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Terminals Shells CLIs
|<!--AROS-->[https://github.com/tomaszstaniak/limpet limpet], [], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->OSK On Screen Keyboard
|<!--AROS-->[],
|<!--Amiga OS-->[https://aminet.net/util/wb/OSK.lha OSK]
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Screen Magnifier Magnifying Glass Magnification
|<!--AROS-->[http://www.onyxsoft.se/files/zoomit.lha ZoomIT],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Comic Book CBR CBZ format reader viewer
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=graphics/viewer comics], [http://archives.arosworld.org/index.php?function=browse&cat=graphics/viewer comicon], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Ebook Reader
|<!--AROS-->[https://blog.alb42.de/programs/#legadon Legadon EPUB],[]
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Ebook Converter
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Text to Speech tts [https://github.com/JonathanFly/bark-installer Bark], [],
|<!--AROS-->[ Echo " " >SPEAK:A1 inbuilt], [http://archives.arosworld.org/index.php?function=browse&cat=audio/misc flite],
|<!--Amiga OS-->[http://www.text2speech.com translator], [https://github.com/sidick/narrator.wyoming narrator.wyoming], [],
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=search&tool=simple FLite]
|<!--MorphOS-->[http://se.aminet.net/pub/aminet/mus/misc/ FLite]
|-
|<!--Sub Menu-->Speech Voice Recognition Dictation - [http://sourceforge.net/projects/cmusphinx/files/ CMU Sphinx], [http://julius.sourceforge.jp/en_index.php?q=en/index.html Julius], [http://www.isip.piconepress.com/projects/speech/index.html ISIP],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Speech Voice Changer [], [], [], [],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Screen Display Blanker screensaver
|<!--AROS-->Blanker Commodity (built in), [https://archives.arosworld.org/index.php?function=browse&cat=graphics/screenblanker GarshneBlanker], [http://sourceforge.net/projects/gblanker/ GBlanker Src], [],
|<!--Amiga OS-->MultiCX,
|<!--AmigaOS4-->
|<!--MorphOS-->ModernArt Blanker,
|-
|<!--Sub Menu-->Fortune Cookie Quotes Sayings
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=utility/misc AFortune],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|}
==Misc Application 4==
{| class="wikitable sortable"
|-
!width:30%;|Misc Application
!width:10%;|AROS(x86)
!width:10%;|Commodore-Amiga OS 3.1(68k)
!width:10%;|Hyperion OS4(PPC)
!width:10%;|MorphOS(PPC)
|-
|<!--Sub Menu-->Fractals mandelbrot, etc
|<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=graphics/misc],
|<!--Amiga OS-->ZoneXplorer,
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Landscape Rendering
|<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=graphics/raytrace WCS World Construction Set],
|<!--Amiga OS-->[ Vista Pro], [http://en.wikipedia.org/wiki/World_Construction_Set World Construction Set]
|<!--AmigaOS4-->[ WCS World Construction Set],
|<!--MorphOS-->[ WCS World Construction Set],
|-
|<!--Sub Menu-->Astronomy [https://sourceforge.net/projects/skychart/ skychart freepascal], [], [],
|<!--AROS-->[ Digital Almanac (ABIv0 only)],
|<!--Amiga OS-->[http://aminet.net/search?query=planetarium Aminet search], [http://aminet.net/misc/sci/DA3V56ISO.zip Digital Almanac], [https://aminet.net/package/misc/sci/da3sourceV58 Src c V58], [ Galileo renamed to Distant Suns]*, [],
|<!--AmigaOS4-->[http://sourceforge.net/projects/digital-almanac/ Digital Almanac], Distant Suns*, [http://www.digitaluniverse.org.uk/ Digital Universe]*,
|<!--MorphOS-->[http://www.aminet.net/misc/sci/da3.lha Digital Almanac], [http://www.aminet.net/package/misc/sci/da3-mos-src Src c V56],
|-
|<!--Sub Menu-->Astrology [https://sourceforge.net/projects/skylendar/ skylendar], [https://github.com/CruiserOne/Astrolog Astrolog], [https://www.astrolog.org/astrolog/astfile.htm Astrology alt site], [https://saravali.github.io/download.html Maitreya], [https://github.com/alamahant/Asteria Asteria],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Genealogy History Family Tree Ancestry Records (FreeBMD, FreeREG, and FreeCEN file formats or GEDCOM GenTree)
|<!--AROS-->
|<!--Amiga OS--> [ Origins], [ Your Family Tree], [ ], [ ], [ ],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Languages
|<!--AROS-->
|<!--Amiga OS-->Fun School,
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Mathematics ([http://www-fourier.ujf-grenoble.fr/~parisse/install_en.html Xcas], etc.),
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=utility/scientific mathX]
|<!--Amiga OS-->Maple V, mathX, Fun School, GCSE Maths, [ ], [ ], [ ],
|<!--AmigaOS4-->Yacas
|<!--MorphOS-->Yacas
|-
|<!--Sub Menu-->Maths Graph Function Plotting
|<!--AROS-->[https://blog.alb42.de/programs/#MUIPlot MUIPlot],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->App Utility Launcher Dock toolbar
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=utility/docky BoingBar], [],
|<!--Amiga OS-->[https://github.com/adkennan/DockBot Dockbot],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->3D Printer [https://github.com/OrcaSlicer/OrcaSlicer OrcaSlicer]
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->CNC control with laser and vinyl cutting
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->PCB design
|<!--AROS-->
|<!--Amiga OS-->[ ], [ ], [ ],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Digital Signage
|<!--AROS-->Hollywood, Hollywood Designer
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->HAM radio, amateur radio, packet radio, [], [], [], [https://cemaxecuter.com/ Dragon OS], [https://github.com/km4ack/73Linux with 73 link update], [https://www.youtube.com/watch?v=YAL5KNePRSg video for],
|<!--AROS-->
|<!--Amiga OS-->[https://github.com/punktniklas/NiKom NiKom], [https://www.amigarealm.com/amiga/amicomms/comm4.htm Comm4], [https://www.amigarealm.com/archives/comms/aarug/ TNC Terminal Node Controller with packets over serial connections on Yaesu or Woxum handheld], [https://aminet.net/comm/misc AmiCom], [ with 7Plus file encoder/decoder], [ mksstv], [ RTTYam],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->modern smart home network like Home Assistant Automation Yellow, Green, Mosquitto, EMQX,
|<!--AROS-->
|<!--Amiga OS-->[https://github.com/evil4dmin/ami2ha HA], [https://github.com/sidick/midge mtqq.lib], [https://aminet.net/package/comm/tcp/AmiHomeassist-0.7 AmiHomeassist],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Teaching classroom learning training [https://github.com/moodle/moodle moodle], [],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|}
<nowiki>*</nowiki> Commercial product.
==Games & Emulation==
Some emulators/games require OpenGL to function and to adjust ahi prefs channels, frequency and unit0 and unit1 and
[http://aros.sourceforge.net/documentation/users/shell/changetaskpri.php changetaskpri -1]
Rom patching https://www.marcrobledo.com/RomPatcher.js/ https://www.romhacking.net/patch/ (ips, ups, bps, etc) and this other site supports the latter formats https://hack64.net/tools/patcher.php
Free public domain roms for use with emulators can be found [http://www.pdroms.de/ here] as most of the rest are covered by copyright rules. If you like to read about old games see [http://retrogamingtimes.com/ here] and [http://www.armchairarcade.com/neo/ here] and a [http://www.vintagecomputing.com/ blog] about old computers. Possibly some of the [http://www.answers.com/topic/list-of-best-selling-computer-and-video-games best selling] of all time. [http://en.wikipedia.org/wiki/List_of_computer_system_emulators Wiki] with emulated systems list.
[https://archive.gamehistory.org/ Archive of VGHF], [https://library.gamehistory.org/ Video Game History Foundation Library search]
{| class="wikitable sortable"
|-
!width:10%;|Games [http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer Emulation]
!width:10%;|AROS(x86)
!width:10%;|AmigaOS3(68k)
!width:10%;|AmigaOS4(PPC)
!width:10%;|MorphOS(PPC)
|-
|<!--Sub Menu-->Games Emulation Amstrad CPC
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer], [ Caprice32 (OpenGL & pure SDL)], [ Arnold], [https://retroshowcase.gr/cpcbox-master/],
|<!--Amiga OS-->
|<!--AmigaOS4-->[http://os4depot.net/index.php?function=browse&cat=emulation/computer]
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=2],
|-
|<!--Sub Menu-->Games Emulation Apple2 and 2GS
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Arcade
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/gamesystem Mame], [ SI Emu (ABIv0 only)],
|<!--Amiga OS-->Mame,
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/gamesystem xmame], amiarcadia,
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=2 Mame],
|-
|<!--Sub Menu-->Games Emulation Atari 2600 [], [],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/gamesystem Stella],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Atari 5200 [https://github.com/wavemotion-dave/A5200DS A5200DS], [],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Atari 7800
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Atari 400 800 130XL [https://github.com/wavemotion-dave/A8DS A8DS], [],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer Atari800],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Atari Lynx
|<!--AROS-->[http://myfreefilehosting.com/f/6366e11bdf_1.93MB Handy (ABIv0 only)],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Atari Jaguar
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Bandai Wonderswan
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation BBC Micro and Acorn Electron [http://beehttps://bem-unix.bbcmicro.com/download.html BeebEm], [http://b-em.bbcmicro.com/ B-Em], [http://elkulator.acornelectron.co.uk/ Elkulator], [http://electrem.emuunlim.com/ ElectrEm],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Dragon 32 and Tandy CoCo [http://www.6809.org.uk/xroar/ xroar], [],
|<!--AROS-->[], [], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Commodore C16 Plus4
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Commodore C64
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer Vice (ABIv0 only)], [],
|<!--Amiga OS-->Frodo,
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/gamesystem viceplus],
|<!--MorphOS-->Vice,
|-
|<!--Sub Menu-->Games Emulation Commodore Amiga
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer Janus UAE], Emumiga,
|<!--Amiga OS-->
|<!--AmigaOS4-->[http://os4depot.net/index.php?function=browse&cat=emulation/computer UAE],
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=2 UAE],
|-
|<!--Sub Menu-->Games Emulation Japanese MSX MSX2
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Mattel Intelivision
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Mattel Colecovision and Adam
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Milton Bradley (MB) Vectrex [ Vectrex OpenGL],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation PICO8 Pico-8 fantasy video game console [https://github.com/egordorichev/pemsa-sdl/ pemsa-sdl], [https://github.com/jtothebell/fake-08 fake-08], [https://github.com/Epicpkmn11/fake-08/tree/wip fake-08 fork],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Nintendo Gameboy
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/gamesystem vba no sound], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/gamesystem vba]
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Nintendo NES
|<!--AROS-->[ EmiNES], [http://archives.arosworld.org/index.php?function=browse&cat=emulation/gamesystem Fceu], [https://github.com/takahirox/nes-js?tab=readme-ov-file nes-js], [https://github.com/bfirsh/jsnes jsnes], [https://github.com/angelo-wf/NesJs NesJs],
|<!--Amiga OS-->AmiNES, [http://www.dridus.com/~nyef/darcnes/ darcNES],
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/gamesystem amines]
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Nintendo SNES
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/gamesystem Zsnes],
|<!--Amiga OS-->
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/gamesystem warpsnes]
|<!--MorphOS-->[http://fabportnawak.free.fr/snes/ Snes9x],
|-
|<!--Sub Menu-->Games Emulation Nintendo N64
*HLE and plugins [ mupen64], [https://github.com/ares-emulator/ares ares], [https://github.com/N64Recomp/N64Recomp N64Recomp], [https://github.com/rt64/rt64 rt64], [https://github.com/simple64/simple64 Simple64],
*LLE [],
|<!--AROS-->[http://code.google.com/p/mupen64plus/ Mupen64+],
|<!--Amiga OS-->[http://code.google.com/p/mupen64plus/ Mupen64+], [http://aminet.net/package/misc/emu/tr-981125_src TR64],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->[ Nintendo Gamecube Wii]
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->[ Nintendo Wii U]
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->[https://github.com/yuzu-emu Nintendo Switch]
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation NEC PC Engine
|<!--AROS-->[], [], [https://github.com/yhzmr442/jspce js-pce],
|[http://www.hugo.fr.fm/ Hugo], [http://mednafen.sourceforge.net/ Mednafen],
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/gamesystem tgemu]
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Sega Master System (SMS)
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/gamesystem Dega], [http://archives.arosworld.org/index.php?function=browse&cat=emulation/gamesystem sms],
|<!--Amiga OS-->
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/gamesystem osmose]
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Sega Genesis/Megadrive
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/gamesystem gp no sound], [http://archives.arosworld.org/index.php?function=browse&cat=emulation/gamesystem DGen],
|<!--Amiga OS-->[http://code.google.com/p/genplus-gx/ Genplus],
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/gamesystem genesisplus]
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Sega Saturn
*HLE [https://mednafen.github.io/ mednafen], [http://yabause.org/ yabause], [],
*LLE [], [],
|<!--AROS-->?
|<!--Amiga OS-->[http://yabause.org/ Yabause],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Sega Dreamcast
*HLE [https://github.com/flyinghead/flycast flycast], [https://code.google.com/archive/p/nulldc/downloads NullDC],
*LLE [], [],
|<!--AROS-->?
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Sinclair ZX80 and ZX81
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer], [], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Sinclair Spectrum
|[http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer Fuse (crackly sound)], [http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer SimCoupe], [ FBZX slow], [https://jsspeccy.zxdemo.org/ jsspeccy], [http://torinak.com/qaop/games qaop],
|<!--Amiga OS-->[http://www.zophar.net/sinclair.html Speculator], [http://www.worldofspectrum.org/x128/index.html X128],
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/computer]
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Sinclair QL
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer], [],
|<!--Amiga OS-->[http://aminet.net/package/misc/emu/QDOS4amiga1 QDOS4amiga]
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation SNK NeoGeo Pocket
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/gamesystem],
|<!--Amiga OS-->
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/gamesystem gngeo], NeoPop,
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation Sony PlayStation
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/gamesystem FPSE],
|<!--Amiga OS-->
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/gamesystem FPSE]
|<!--MorphOS-->
|-
|<!--Sub Menu-->[ Sony PS2]
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->[ Sony PS3]
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->[https://vita3k.org/ Sony Vita]
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->[https://github.com/shadps4-emu/shadPS4 PS4]
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation [http://en.wikipedia.org/wiki/Tangerine_Computer_Systems Tangerine] Oric and Atmos
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer Oricutron]
|<!--Amiga OS-->
|<!--AmigaOS4-->[http://www.os4depot.net/index.php?function=browse&cat=emulation/gamesystem Oricutron]
|<!--MorphOS-->[http://aminet.net/package/misc/emu/oricutron Oricutron]
|-
|<!--Sub Menu-->Games Emulation TI 99/4 99/4A [https://github.com/wavemotion-dave/DS994a DS994a], [], [https://js99er.net/#/ js99er], [],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=emulation/computer],
|<!--Amiga OS-->[http://aminet.net/package/misc/emu/TI4Amiga TI4Amiga], [http://aminet.net/package/misc/emu/TI4Amiga_src TI4Amiga src in c],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation HP 38G 40GS 48 49G/50G Graphing Calculators
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Emulation TI 58 83 84 85 86 - 89 92 Graphing Calculators
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games emulation Ms-Dos Dosbox type
|<!--AROS-->[https://github.com/tomaszstaniak/aros-boxerapp Boxer]
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|}
{| class="wikitable sortable"
|-
!width:10%;|Games [https://www.rockpapershotgun.com/ General]
!width:10%;|AROS(x86)
!width:10%;|AmigaOS3(68k)
!width:10%;|AmigaOS4(PPC)
!width:10%;|MorphOS(PPC)
|- style="background:lightgrey;{{text default color}}; text-align:center; font-weight:bold;"
| Games [https://www.trackawesomelist.com/michelpereira/awesome-open-source-games/ Open Source and others] || AROS || Amiga OS || Amiga OS4 || Morphos
|-
|<!--Sub Menu-->Games Action like [https://github.com/opentomb/OpenTomb opentomb], [https://github.com/LostArtefacts/TRX TRX formerly Tomb1Main], [https://github.com/TombEngine TombEngine], [http://archives.arosworld.org/index.php?function=browse&cat=game/action Thrust], [https://github.com/fragglet/sdl-sopwith sdl sopwith],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=game/action], [https://archives.arosworld.org/index.php?function=browse&cat=game/action BOH], [],
|<!--Amiga OS-->[https://github.com/BSzili/OpenLara/tree/amiga/src source of openlara SDL2],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Adventure like [http://dotg.sourceforge.net/ DMJ], [https://github.com/kromenak/gengine Gabriel Knight 3], [http://www.sarien.net/ Sierra Sarien], [https://github.com/klembot/twinejs twine js], [https://github.com/QSPFoundation/qspgui Quest Soft Player QSP], [],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=game/adventure dmagnetic], [https://archives.arosworld.org/?function=browse&cat=emulation/misc ScummVM], [https://archives.arosworld.org/index.php?function=browse&cat=game/roleplaying frotz infocom], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Board like [https://github.com/aperture-software/colditz-escape escape from colditz], [],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=game/board], [http://amigan.1emu.net/releases Africa]
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Cards
|<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=game/card], [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1443&rowstart=180&pid=12934#post_12934 Balatro],
|<!--AmigaOS-->[http://home.arcor.de/amigasolitaire/e/welcome.html Reko], [https://github.com/samskivert/beschei-en beschei Src],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Misc [https://github.com/michelpereira/awesome-open-source-games Awesome open], [https://github.com/bobeff/open-source-games General Open Source], [https://github.com/SAT-R/sa2 Sonic Advance 2], [https://github.com/velorek1/cwordle Wordle type],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=game/misc], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games FPS like [https://aminet.net/package/game/shoot/D1X_Rebirth_AGA Descent D1X src], [https://github.com/DescentDevelopers/Descent3 Descent 3], [https://github.com/Fewnity/Counter-Strike-Nintendo-DS Counter-Strike-Nintendo-DS], [https://github.com/Aleph-One-Marathon/alephone Bungie Marathon 1994], [https://zdoom.org/downloads UzDoom opengl 3.3], [https://github.com/ZDoom/gzdoom gzdoom opengl 3+], [https://zdoom.org/downloads LZDoom opengl 2.1], [https://github.com/OpenXRay/xray-16 S.T.A.L.K.E.R Xray], [https://staniks.github.io/articles/serious-engine-networking-analysis/ Serious Sam] [https://github.com/Croteam-official/Serious-Engine Serious Engine 1]
|<!--AROS-->Doom, Quake, [http://archives.arosworld.org/index.php?function=browse&cat=game/fps Quake 3 Arena (OpenGL)], [http://archives.arosworld.org/index.php?function=browse&cat=game/fps Cube (OpenGL)], [http://archives.arosworld.org/index.php?function=browse&cat=game/fps Assault Cube (OpenGL)], [http://archives.arosworld.org/index.php?function=browse&cat=game/fps Cube 2 Sauerbraten (OpenGL)], [http://fodquake.net/test/ FodQuake QuakeWorld], [https://archives.arosworld.org/index.php?function=browse&cat=game/fps Duke Nukem 3D], [https://archives.arosworld.org/index.php?function=browse&cat=game/fps Darkplaces Nexuiz Xonotic], [http://archives.arosworld.org/index.php?function=browse&cat=game/fps Doom 3 SDL (OpenGL)], [http://archives.arosworld.org/index.php?function=browse&cat=game/fps Hexenworld and Hexen 2], [https://archives.arosworld.org/index.php?function=browse&cat=game/fps Aliens vs Predator Gold 2000 avp (openGL)], [https://archives.arosworld.org/index.php?function=browse&cat=game/fps Odamex (openGL doom)], [https://archives.arosworld.org/?function=showfile&file=game/fps/ zgloom], [], [https://archives.arosworld.org/?function=showfile&file=game/fps/ ab3dhd], [],
|<!--Amiga OS-->Doom, Quake, AB3D, Fears, Breathless, Gloom,
|<!--AmigaOS4-->Doom, Quake,
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=12 Doom], Quake, Quake 3 Arena,
|-
|<!--Sub Menu-->Games MMORG like
|<!--AROS-->[ Eternal Lands (OpenGL)],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Platform like
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=game/platform], [ Maze of Galious], [ Gish]*(openGL), [ Mega Mario], [https://archives.arosworld.org/?function=showfile&file=game/platform/ thextech SMBX], [http://www.gianas-return.de/ Giana's Return], [http://www.sqrxz.de/ Sqrxz], [www.sqrxz2.de/ Sqrxz 2], [http://www.sqrxz.de/sqrxz-3/ Sqrxz 3], [http://www.sqrxz.de/sqrxz-4/ Sqrxz 4], [http://archives.arosworld.org/index.php?function=browse&cat=game/platform Cave Story], [https://bszili.morphos.me/ Frogatto], [https://bszili.morphos.me/ OpenJazz], [https://archives.arosworld.org/?function=showfile&file=game/platform/ pekkakana2], [ Aquaria], [https://archives.arosworld.org/?function=showfile&file=game/platform/ sonic CD], [],
|<!--Amiga OS-->[ Giana Sisters], [],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Puzzle [https://github.com/mariopartyrd/marioparty4/tree/port Party], [https://github.com/mdodis/OpenSolomonsKey OpenSolomonsKey], [],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=game/puzzle], [ Cubosphere (OpenGL)], [http://archives.arosworld.org/index.php?function=browse&cat=game/puzzle Candy Crisis], [http://bszili.morphos.me/ TailTale],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Racing [ Trigger Rally], [ VDrift], [http://www.ultimatestunts.nl/index.php?page=2&lang=en Ultimate Stunts], [http://maniadrive.raydium.org/ Mania Drive], [https://github.com/plowteam/donut Simpsons Hit and Run], [],
|<!--AROS-->[ Super Tux Kart (OpenGL)], [http://www.dusabledanslherbe.eu/AROSPage/F1Spirit.30.html F1 Spirit (OpenGL)], [http://bszili.morphos.me/index.html MultiRacer], [https://bszili.morphos.me/ Speed Dreams], [https://archives.arosworld.org/?function=showfile&file=game/driving/dethrace-0.10.1.x86_64-aros-v11.zip Carmageddon dethrace 64bit], [http://maniadrive.raydium.org/index.php?downloads=yes maniadrive like trackmania],
|<!--AmigaOS-->
|<!--AmigaOS4-->[http://bszili.morphos.me/index.html Speed Dreams],
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=12], [http://bszili.morphos.me/index.html TORCS],
|-
|<!--Sub Menu-->Games 1st first person DRPG [https://wiki.rpg.net/index.php/Open_Game_Systems Misc], [https://github.com/OpenEnroth/OpenEnroth OpenEnroth MM], []
|<!--AROS-->[https://github.com/BSzili/aros-stuff Arx Libertatis], [http://www.playfuljs.com/a-first-person-engine-in-265-lines/ js raycaster], [https://github.com/Dorthu/es6-crpg webgl], [https://github.com/sonountaleban/AmiShockolate System Shock], [], [],
|<!--AmigaOS-->Phantasie, Faery Tale, Dungeon Master,
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games 3rd third person action CRPG [https://sourceforge.net/projects/sumwars/ Summoning Wars], [https://www.solarus-games.org/ Solarus], [https://wiki.rpg.net/index.php/Open_Game_Systems Misc], [https://github.com/alexbatalov/fallout1-ce fallout ce], [https://github.com/rwengine/openrw gta3], [https://github.com/gta-reversed/gta-reversed gta3 sa], [https://github.com/mrxenginner/reVC gta3 vc revc], [https://github.com/jakobharder/burntime/tree/main Burntime],
|<!--AROS-->[https://archives.arosworld.org/?function=showfile&file=game/strategy/ fheroes2 homm2], [https://archives.arosworld.org/?function=showfile&file=game/roleplaying/ breakhack], [https://archives.arosworld.org/?function=showfile&file=game/roleplaying/ devilutionx diablo 1 hellfire], [https://archives.arosworld.org/?function=showfile&file=game/roleplaying/ fallout 1], [https://archives.arosworld.org/?function=showfile&file=game/strategy/ stratagus], [https://archives.arosworld.org/?function=showfile&file=game/strategy/ hostile-takeover], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games isometric RPG [https://sourceforge.net/projects/sumwars/ Summoning Wars], [https://www.solarus-games.org/ Solarus], [https://wiki.rpg.net/index.php/Open_Game_Systems Misc], [https://github.com/topics/dungeon?l=javascript Dungeon], [], [https://github.com/clintbellanger/heroine-dusk JS Dusk],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=game/roleplaying nethack], [https://archives.arosworld.org/index.php?function=browse&cat=game/roleplaying GemRB], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games card based RPG [https://github.com/open-duelyst/duelyst Duelyst], [], [],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games turn based tactics RPG [], [], [], [], [], [],
|<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=game/strategy UFO AI], [http://play.freeciv.org/ FreeCiv], [https://juen.in Aveterna online civ], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Strategy [http://rtsgus.org/ RTSgus], [http://stargus.sourceforge.net/ Stargus], [https://github.com/KD-lab-Open-Source/Perimeter Perimeter], [https://matty77.itch.io/conflict-3049 conflict-3049], [https://github.com/ZeroK-RTS/Zero-K Zero-K multi player rts lua],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=game/strategy MegaGlest (OpenGL)], [https://archives.arosworld.org/?function=showfile&file=game/strategy/ signus], [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1443&rowstart=140&pid=12446#post_12446 Wargus warcraft 2 setup],
|<!--Amiga OS-->[https://aminet.net/package/game/strat/OpenDUNE_RTG OpenDUNE_RTG src]
|<!--AmigaOS4-->
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=12]
|-
|<!--Sub Menu-->Games Rhythm, Beat, Step [], [], [https://clonehero.net/ clonehero], [https://github.com/MatteoGodzilla/Dj-Engine Dj-Engine],
|<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=game/misc Frets on Fire], [],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Shoot Em Ups [http://www.mhgames.org/oldies/formido/ Formido], [http://code.google.com/p/violetland/ Violetland],
||<!--AROS-->[https://archives.arosworld.org/index.php?function=browse&cat=game/action Open Tyrian], [http://www.parallelrealities.co.uk/projects/starfighter.php Starfighter], [ Alien Blaster], [https://github.com/OpenFodder/openfodder OpenFodder], [https://archives.arosworld.org/?function=showfile&file=game/action/ tbftss The Battle for the Solar System: the Pandora War]
|<!--AmigaOS-->
|<!--AmigaOS4-->[http://www.parallelrealities.co.uk/projects/starfighter.php Starfighter], [ The Battle for the Solar System: the Pandora War]
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Simulations [http://scp.indiegames.us/ Freespace 2], [http://www.heptargon.de/gl-117/gl-117.html GL117], [http://code.google.com/p/corsix-th/ Theme Hospital], [http://code.google.com/p/freerct/ Rollercoaster Tycoon], [http://hedgewars.org/ Hedgewars], [https://github.com/raceintospace/raceintospace raceintospace], [https://github.com/Return-To-The-Roots RTTR Settlers 2], [https://github.com/OoliteProject/oolite oolite elite], [https://github.com/fesh0r/newkind newkind elite], [https://github.com/bohemiainteractive/cwr Arma Cold War Src], [https://github.com/endless-sky/endless-sky endless-sky], [https://github.com/pioneerspacesim/pioneer pioneer space command],
|<!--AROS-->[https://github.com/tomaszstaniak/aros-micropolis micropolis]
|<!--Amiga OS-->SimCity, SimAnt, Sim Hospital, Theme Park, [https://github.com/angree/openttd_amiga_68k openttd amiga_68k],
|<!--AmigaOS4-->
|<!--MorphOS-->[http://morphos.lukysoft.cz/en/vypis.php?kat=12]
|-
|<!--Sub Menu-->Games Life Sim [https://github.com/ACreTeam/forest Animal Crossing], [ ], [], [],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Horror [https://github.com/Mikompilation/MikuPan Fatal Frame], [ ], [], [],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Sandbox Voxel Open World Exploration [https://github.com/ClassiCube/ Classicube],[http://www.michaelfogleman.com/craft/ Craft], [https://github.com/tothpaul/DelphiCraft DelphiCraft],[https://www.minetest.net/ Luanti formerly Minetest], [ infiniminer],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Battle Royale [https://bruh.io/ Play.Bruh.io], [https://www.coolmathgames.com/0-copter Copter Royale], [https://surviv.io/ Surviv.io], [https://nuggetroyale.io/#Ketchup Nugget Royale], [https://miniroyale2.io/ Miniroyale2.io],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Tower Defense [https://chriscourses.github.io/tower-defense/ HTML5], [https://github.com/SBardak/Tower-Defense-Game TD C++], [https://github.com/bdoms/love_defense LUA and LOVE], [https://github.com/HyOsori/Osori-WebGame HTML5], [https://github.com/PascalCorpsman/ConfigTD ConfigTD Pascal], [https://github.com/GloriousEggroll/wine-ge-custom Wine], []
|<!--AROS-->[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=1443&rowstart=180&pid=12871#post_12871 Plants vs Zombies PvZ],
|<!--Amiga OS-->[https://github.com/boingball/miggy-tower-defense miggy-tower-defense],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Visual Novel Engines [https://github.com/diane1f0cd/VisualNovelTemplate Visual Novel Template], [https://github.com/Kirilllive/tuesday-js Tuesday JS], [https://github.com/tejasnayak25/vnsutra vnsutra], [https://github.com/weetabix-su/renpsp-dev RenPSP], [https://github.com/Galladite27/ONScripter-EN ONScripter-EN], [https://github.com/NathanGuilhot/VNES-Raylib https://github.com/NathanGuilhot/VNES VNES in Raylib], [https://www.renpy.org/latest.html renpy ren'py python based],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Virtual Reality VR [https://gitlab.com/madsbuvi/openmw openmw vr], [https://github.com/Team-Beef-Studios/BeefRaiderXR BeefRaiderXR],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Virtual Table Top VTT [ Roll20], [https://www.owlbear.rodeo/ owlbear rodeo], [], [],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Computer assisted TableTop TTRPG OSR [https://www.rpgsolo.com/play.php RPGSolo], [https://github.com/fpsvogel/solo-ttrpgs Solo TTRPG], [], [],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games 2D 3D Engines [https://github.com/fegennari/3DWorld 3DWorld], [https://github.com/GarageGames/Torque3D Torque3D], [https://github.com/gameplay3d/GamePlay GamePlay 3D], [https://www.babylonjs.com/ BabylonJS ], [ Godot], [ Ogre], [ Crystal Space], [https://github.com/JacobHess03/ Dragon-Quest like], [https://github.com/bjornbytes/lovr Lua LOVE for 2D LOVR for 3D], [],
|<!--AROS-->[https://www.arkhamdev.net/wiki.htm?id=agx Arkham Development antiryadgx 8.9 lts with register], [],
|<!--Amiga OS-->[https://github.com/alpyre/Sevgi_Engine Sevgi Engine], [], [],
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games C based game frameworks [https://github.com/orangeduck/Corange Corange], [https://github.com/scottcgi/Mojoc Mojoc], [https://orx-project.org/ Orx], [https://github.com/ioquake/ioq3 Quake 3], [https://www.mapeditor.org/ Tiled], [https://www.raylib.com/ 2d Raylib], [https://github.com/Rabios/awesome-raylib other raylib], [https://github.com/MrFrenik/gunslinger Gunslinger], [https://o3de.org/ o3d], [http://archives.aros-exec.org/index.php?function=browse&cat=development/library GLFW], [],
|<!--AROS-->[http://archives.arosworld.org/index.php?function=browse&cat=development/library Raylib 5],
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games RPGMaker MV/MZ-compatible projects [https://github.com/Psychronic-Games/RPGReactor RPGReactor js],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games Virtual Pinball [https://github.com/vpinball/vpinball vpinball], [],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->Games unpack unarc [], [],
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|-
|<!--Sub Menu-->
|<!--AROS-->
|<!--Amiga OS-->
|<!--AmigaOS4-->
|<!--MorphOS-->
|}
==Application Guides==
[[#top|...to the top]]
===Web Browser===
OWB is now at version 2.0 (which got an engine refresh, from July 2015 to February 2019) and 3.0.
This latest version has a good support for many/most web sites, even YouTube web page now works. [https://www.bilibili.tv/en/search untested]
This improved compatibility comes at the expense of higher RAM usage (now 1GB RAM is the absolute minimum).
Also, keep in mind that the lack of a JIT (Just-In-Time) JS compiler on the 32 bit version, makes the web surfing a bit slow.
Only the 64 bit version of OWB 2.0 will have JIT enabled, thus benefitting of more speed. There are tooltypes that can be added to the icon to provide further features JIT, MSE etc
Certificates from [https://curl.se/docs/caextract.html ca certs],
DNS tracking blocking with [https://easylist.to/easylist/easylist.txt easylist.txt] in PROGDIR:Conf before starting browser with enabled AdBlock [https://github.com/easylist/easylist/tree/master easylist], [https://gitlab.com/eyeo anti abp], [https://firebog.net/ big blocklist], [https://github.com/StevenBlack/hosts Steves], [], [],
This can be enabled with OWB Odyssey with Windows -> Content Blocking and Windows -> Messages and enter
https://www.youtube.com/api/stats/ads*
https://www.youtube.com/pagead/adview*
https://www.youtube.com#@##player-ads*
into your custom filters
Element blocker browser extension might be needed for [https://github.com/easylist/easylist/wiki/Youtube-Issues youtube], [ mid roll], [ pre roll], [ ],
OWB speed is much better when running from RAM Disk, the best way is to add the below into your S:User-Startup which copies OWB drawer from Extras:Internet/OWB to RAM Disk:
So add this :
<pre>
copy Extras:Internet/OWB Ram:OWB/ ALL CLONE >NIL:
copy Extras:Internet/OWB.info Ram: >NIL:
</pre>
Open RAM Disk and open OWB drawer and double click on OWB icon so that the above icon tooltypes are activated
Problems are that the copy time is long (around 20 seconds added in the background), but we can make it faster if we delete useless files from the OWB drawer (docs, …)
If you don’t copy the drawer back onto the HD, you won’t save your cache, cookies, passwords… So you need a script for it.
copy Extras:Internet/Amelinium/#? Ram:Amelinium/ ALL CLONE >NIL:
Error messages
SSL error "cant verify with ca-certificates", check bios clock time date is correct
Error 6, try checking networking prefs settings and Save / Use preferences again or a '''few times''' otherwise the network chipset may not be compatible with Aros
[https://www.google.com/search?q=%s&udm=14 Google search without AI overview]
[ DuckDuckGo]
[ Ecosia]
[ Qwant]
[ Swisscows]
[ Mojeek]
[ Brave Search]
[ PreSearch]
[ Startpage]
===E-mail===
Emailinium is now available for IMAP and POP3 based accounts
YAM does not support SSL and most mail providers now switched to encrypted SMTP/POP3 connections
====SimpleMail====
SimpleMail supports IMAP and appears to work with GMail, but it's never been reliable enough, it can crash with large mailboxes.
Please read more on this [http://www.freelists.org/list/simplemail-usr User list]
GMail
Be sure to activate the pop3 usage in your gmail account setup / configuration first.
pop3:
pop.gmail.com
Use SSL: Yes
Port: 995
smtp:
smtp.gmail.com (with authentication)
Use Authentication: Yes
Use SSL: Yes
Port: 465 or 587
Hotmail/MSN/outlook/Microsoft Mail mid-2017, all outlook.com accounts will be migrated to Office 365 / Exchange
Most users are currently on POP which does not allow showing folders and many other features (technical limitations of POP3). With Microsoft IMAP you will get folders, sync read/unread, and show flags. You still won't get push though, as Microsoft has not turned on the IMAP Idle command as at Sept 2013.
If you want to try it, you need to first remove (you can't edit) your pop account (long-press the account on the accounts screen, delete account). Then set it up this way:
1. Email/Password
2. Manual
3. IMAP
4.
* Incoming: imap-mail.outlook.com, port 993, SSL/TLS should be checked
* Outgoing: smtp-mail.outlook.com, port 587, SSL/TLS should be checked
* POP server name pop-mail.outlook.com, port 995, POP encryption method SSL
Yahoo Mail
On April 24, 2002 Yahoo ceased to offer POP access to its free mail service. Introducing instead a yearly payment feature, allowing users POP3 and IMAP server support, along with such benefits as larger file attachment sizes and no adverts.
Sorry to see Yahoo leaving its users to cough up for the privilege of accessing their mail. Understandable, when competing against rivals such as Gmail and Hotmail who hold a large majority of users and were hacked in 2014 as well.
Incoming Mail (IMAP) Server
* Server - imap.mail.yahoo.com
* Port - 993
* Requires SSL - Yes
Outgoing Mail (SMTP) Server
* Server - smtp.mail.yahoo.com
* Port - 465 or 587
* Requires SSL - Yes
* Requires authentication - Yes
Your login info
* Email address - Your full email address (name@domain.com)
* Password - Your account's password
* Requires authentication - Yes
Note that you need to enable “Web & POP Access” in your Yahoo Mail account to send and receive Yahoo Mail messages through any other email program.
You will have to enable “Allow your Yahoo Mail to be POPed” under “POP and Forwarding”, to send and receive Yahoo mails through any other email client.
Cannot be done since 2002 unless the customer pays Yahoo a subscription subs fee to have access to SMTP and POP3
* Set the POP server for incoming mails as pop.mail.yahoo.com. You will have to enable “SSL” and use 995 for Port.
* “Account Name or Login Name” – Your Yahoo Mail ID i.e. your email address without the domain “@yahoo.com”.
* “Email Address” – Your Yahoo Mail address i.e. your email address including the domain “@yahoo.com”. E.g. myname@yahoo.com
* “Password” – Your Yahoo Mail password.
Yahoo! Mail Plus users may have to set POP server as plus.pop.mail.yahoo.com and SMTP server as plus.smtp.mail.yahoo.com.
* Set the SMTP server for outgoing mails as smtp.mail.yahoo.com. You will also have to make sure that “SSL” is enabled and use 465 for port. you must also enable “authentication” for this to work.
====YAM Yet Another Mailer====
YAM does not support SSL and most mail providers have now switched to encrypted SMTP/POP3 connections
This email client is POP3 only if the SSL library is available [http://www.freelists.org/list/yam YAM Freelists]
One of the downsides of using a POP3 mailer unfortunately - you have to set an option not to delete the mail if you want it left on the server. IMAP keeps all the emails on the server.
Possible issues
Sending mail issues is probably a matter of using your ISP's SMTP server, though it could also be an SSL issue.
getting a "Couldn't initialise TLSv1 / SSL error
Use of on-line e-mail accounts with this email client is not possible as it lacks the OpenSSL AmiSSl v3 compatible library
GMail
Incoming Mail (POP3) Server - requires SSL: pop.gmail.com
Use SSL: Yes
Port: 995
Outgoing Mail (SMTP) Server - requires TLS: smtp.gmail.com (use authentication)
Use Authentication: Yes
Use STARTTLS: Yes (some clients call this SSL)
Port: 465 or 587
Account Name: your Gmail username (including '@gmail.com')
Email Address: your full Gmail email address (username@gmail.com)
Password: your Gmail password
Anyway, the SMTP is pop.gmail.com port 465 and it uses SSLLv3 Authentication. The POP3 settings are for the same server (pop.gmail.com), only on port 995 instead.
Outlook.com access
<pre >
Outlook.com SMTP server address: smtp.live.com
Outlook.com SMTP user name: Your full Outlook.com email address (not an alias)
Outlook.com SMTP password: Your Outlook.com password
Outlook.com SMTP port: 587
Outlook.com SMTP TLS/SSL encryption required: yes
</pre >
Yahoo Mail
<pre >
“POP3 Server” – Set the POP server for incoming mails as pop.mail.yahoo.com. You will have to enable “SSL” and use 995 for Port.
“SMTP Server” – Set the SMTP server for outgoing mails as smtp.mail.yahoo.com. You will also have to make sure that “SSL” is enabled and use 465 for port. you must also enable “authentication” for this to work.
“Account Name or Login Name” – Your Yahoo Mail ID i.e. your email address without the domain “@yahoo.com”.
“Email Address” – Your Yahoo Mail address i.e. your email address including the domain “@yahoo.com”. E.g. myname@yahoo.com
“Password” – Your Yahoo Mail password.
</pre >
Yahoo! Mail Plus users may have to set POP server as plus.pop.mail.yahoo.com and SMTP server as plus.smtp.mail.yahoo.com.
Note that you need to enable “Web & POP Access” in your Yahoo Mail account to send and receive Yahoo Mail messages through any other email program.
You will have to enable “Allow your Yahoo Mail to be POPed” under “POP and Forwarding”, to send and receive Yahoo mails through any other email client.
Cannot be done since 2002 unless the customer pays Yahoo a monthly fee to have access to SMTP and POP3
Microsoft Outlook Express Mail
1. Get the files to your PC.
By whatever method get the files off your Amiga onto your PC. In the YAM folder you have a number of different folders, one for each of your folders in YAM. Inside that is a file usually some numbers such as 332423.283. YAM created a new file for every single email you received.
2. Open up a brand new Outlook Express. Just configure the account to use 127.0.0.1 as mail servers. It doesn't really matter. You will need to manually create any subfolders you used in YAM.
3. You will need to do a mass rename on all your email files from YAM. Just add a .eml to the end of it. Amazing how PCs still rely mostly on the file name so it knows what sort of file it is rather than just looking at it! There are a number of multiple renamers online to download and free too.
4. Go into each of your folders, inbox, sent items etc. And do a select all then drag the files into Outlook Express (to the relevant folder obviously) Amazingly the file format that YAM used is very compatible with .eml standard and viola your emails appear. With correct dates and working attachments.
5. If you want your email into Microsoft Outlook. Open that up and create a new profile and a new blank PST file. Then go into File Import and choose to import from Outlook Express. And the mail will go into there. And viola.. you have your old email from your Amiga in a more modern day format.
===FTP===
Magellan has a great FTP module. It allows transferring files from/to a FTP server over the Internet or the local network and, even if FTP is perceived as a "thing of the past", its usability is all inside the client. The FTP thing has a nice side effect too, since every Icaros machine can be a FTP server as well, and our files can be easily transferred from an Icaros machine to another with a little configuration effort.
First of all, we need to know the 'server' IP address. Server is the Icaros machine with the file we are about to download on another Icaros machine, that we're going to call 'client'. To do that, move on the server machine and 1) run Prefs/Services to be sure "FTP file transfer" is enabled (if not, enable it and restart Icaros); 2) run a shell and enter this command:
ifconfig -a
Make a note of the IP address for the network interface used by the local area network. For cabled devices, it usually is net0:. Now go on the client machine and run Magellan:
Perform these actions: 1) click on FTP; 2) click on ADDRESS BOOK; 3) click on "New".
You can now add a new entry for your Icaros server machine:
1) Choose a name for your server, in order to spot it immediately in the address book. Enter the IP address you got before.
2) click on Custom Options:
1) go to Miscellaneous in the left menu;
2) Ensure "Passive Transfers" is NOT selected;
3) click on Use. We need to deactivate Passive Transfers because YAFS, the FTP server included in Icaros, only allows active transfers at the current stage. Now, we can finally connect to our new file source:
1) Look into the address book for the newly introduced server, be sure that name and IP address are right, and
2) click on Connect. A new lister with server's "MyWorkspace" contents will appear. You can now transfer files over the network choosing a destination among your local (client's) volumes.
Can be adapted to any FTP client on any platform of your choice, just be sure your client allows Active Transfers as well.
===IRC Internet Relay Chat===
Jabberwocky is ideal for one-to-one social media communication, use IRC if you require one to many.
Just type a message in ''lowercase''' letters and it will be posted to all in the [ AROS irc channel]. Please do not use UPPER CASE as it is a sign of SHOUTING which is annoying.
Other things to type in - replace <message> with a line of text and <nick> with a person's name
<pre>
/help
/list
/who
/whois <nick>
/msg <nick> <message>
/query <nick>
<message>s
/query
/away <message>
/away
/quit <going away message>
</pre>
[http://irchelp.org/irchelp/new2irc.html#smiley Intro guide here]. IRC Primer can be found here in [http://www.irchelp.org/irchelp/ircprimer.html html], [http://www.irchelp.org/irchelp/text/ircprimer.txt TXT], [http://www.kei.com/irc/IRCprimer1.1.ps PostScript].
Issue the command /me <text> where <text> is the text that should follow your nickname.
Example: /me slaps ajk around a bit with a large trout
/nick <newNick>
/nickserv register <password> <email address>
/ns instead of /nickserv, while others might need /msg nickserv
/nickserv identify <password>
Alternatives:
/ns identify <password>
/msg nickserv identify <password>
==== IRC WookieChat ====
WookieChat is the most complete internet client for communication across the IRC Network. WookieChat allows you to swap ideas and communicate in real-time, you can also exchange Files, Documents, Images and everything else using the application's DCC capabilities.
add smilies drawer/directory
run wookiechat from the shell and set stack to 1000000 e.g. wookiechat stack 1000000
select a server / server window
* nickname
* user name
* real name - optional
Once you configure the client with your preferred screen name, you'll want to find a channel to talk in.
servers
* New Server - click on this to add / add extra - change details in section below this click box
* New Group
* Delete Entry
* Connect to server
* connect in new tab
* perform on connect
Change details
* Servername - change text in this box to one of the below Server:
* Port number - no need to change
* Server password
* Channel - add #channel from below
* auto join - can click this
* nick registration password,
Click Connect to server button above
<pre>
Server: irc.freenode.net
Channel: #aros
</pre>
irc://irc.freenode.net/aros
<pre>
Server: chat.amigaworld.net
Channel: #amigaworld or #amigans
</pre>
<pre>
On Sunday evenings USA time usually starting around 3PM EDT (1900 UTC)
Server:irc.superhosts.net
Channel #team*amiga
</pre>
<pre>
BitlBee and Minbif are IRCd-like gateways to multiple IM networks
Server: im.bitlbee.org
Port 6667
Seems to be most useful on WookieChat as you can be connected to several servers at once. One for Bitlbee and any messages that might come through that. One for your normal IRC chat server.
</pre>
[http://www.bitlbee.org/main.php/servers.html Other servers],
<pre>
#Amiga.org - irc.synirc.net eu.synirc.net dissonance.nl.eu.synirc.net (IPv6: 2002:5511:1356:0:216:17ff:fe84:68a)
twilight.de.eu.synirc.net zero.dk.eu.synirc.net us.synirc.net avarice.az.us.synirc.net envy.il.us.synirc.net harpy.mi.us.synirc.net
liberty.nj.us.synirc.net snowball.mo.us.synirc.net - Ports 6660-6669 7001 (SSL)
</pre>
<pre>
Multiple server support
"Perform on connect" scripts and channel auto-joins
Automatic Nickserv login
Tabs for channels and private conversations
CTCP PING, TIME, VERSION, SOUND
Incoming and Outgoing DCC SEND file transfers
Colours for different events
Logging and automatic reloading of logs
mIRC colour code filters
Configurable timestamps
GUI for changing channel modes easily
Configurable highlight keywords
URL Grabber window
Optional outgoing swear word filter
Event sounds for tabs opening, highlighted words, and private messages
DCC CHAT support
Doubleclickable URL's
Support for multiple languages using LOCALE
Clone detection
Auto reconnection to Servers upon disconnection
Command aliases
Chat display can be toggled between AmIRC and mIRC style
Counter for Unread messages
Graphical nicklist and graphical smileys with a popup chooser
</pre>
====IRC Aircos ====
Double click on Aircos icon in Extras:Networking/Apps/Aircos. It has been set up with a guest account for trial purposes. Though ideally, choose a nickname and password for frequent use of irc.
====IRC and XMPP Jabberwocky====
Servers are setup and close down at random
You sign up to a server that someone else has setup and access chat services through them.
The two ways to access chat from jabberwocky
<pre >
Jabberwocky -> Server -> XMPP -> open and ad-free
Jabberwocky -> Server -> Transports (Gateways) -> Proprietary closed systems
</pre >
The Jabber.org service connects with all IM services that use XMPP, the open standard for instant messaging and presence over the Internet. The services we connect with include Google Talk (closed), Live Journal Talk, Nimbuzz, Ovi, and thousands more. However, you can not connect from Jabber.org to proprietary services like AIM, ICQ, MSN, Skype, or Yahoo because they don’t yet use XMPP components (XEP-0114) '''but''' you can use Jabber.com's servers and IM gateways (MSN, ICQ, Yahoo etc.) instead.
The best way to use jabberwocky is in conjunction with a public jabber server with '''transports''' to your favorite services, like gtalk, Facebook, yahoo, ICQ, AIM, etc.
You have to register with one of the servers, [https://list.jabber.at/ this list] or [http://www.jabberes.org/servers/ another list], [http://xmpp.net/ this security XMPP list],
Unfortunately jabberwocky can only connect to one server at a time so it is best to check what services each server offers. If you set it up with separate Facebook and google talk accounts, for example, sometimes you'll only get one or the other.
Jabberwocky open a window where the Jabber server part is typed in as well as your Nickname and Password.
Jabber ID (JID) identifies you to the server and other users.
Once registered the next step is to goto Jabberwocky's "Windows" menu and select the "Agents" option. The "Agents List" window will open.
Roster (contacts list)
[http://search.wensley.org.uk/ Chatrooms] (MUC) are available
File Transfer - can send and receive files through the Jabber service but not with other services like IRC, ICQ, AIM or Yahoo. All you need is an installed webbrowser and OpenURL.
Clickable URLs - The message window uses Mailtext.mcc and you can set a URL action in the MUI mailtext prefs like SYS:Utils/OpenURL %s NEWWIN.
There is no consistent Skype like (H.323 VoIP) video conferencing available over Jabber. The move from xmpp to Jingle should help but no support on any amiga-like systems at the moment. [http://aminet.net/package/dev/src/AmiPhoneSrc192 AmiPhone] and [http://www.lysator.liu.se/%28frame,faq,nobg,useframes%29/ahi/v4-site/ Speak Freely] was an early attempt voice only contact. SIP and Asterisk are other PBX options.
Facebook
If you're using the XMPP transport provided by Facebook themselves, chat.facebook.com, it looks like they're now requiring SSL transport. This means jabberwocky method below will no longer work. The best thing to do is to create an ID on a public jabber server which has a Facebook gateway.
<pre >
1. launch jabberwocky
2. if the login window doesn't appear on launch, select 'account' from the jabberwocky menu
3. your jabber ID will be user@chat.facebook.com where user is your user ID
4. your password is your normal facebook password
5. to save this for next time, click the popup gadget next to the ID field
6. click the 'add' button
7. click the 'close' button
8. click the 'connect' button
</pre >
you're done. you can also click the 'save as default account' button if you want. jabberwocky configured to auto-connect when launching the program, but you can configure as you like. there is amigaguide documentation included with jabberwocky.
[http://amigaworld.net/modules/newbb/viewtopic.php?topic_id=37085&forum=32 Read more here]
for Facebook users, you can log-in directly to Facebook with jabberwocky. just sign in as @chat.facebook.com with your Facebook password as the password
Twitter
For a few years, there has been added a twitter transport. Servers include [http://jabber.hot-chilli.net/ jabber.hot-chili.net], and .
An [http://jabber.hot-chilli.net/tag/how-tos/ How-to]
:Read [http://jabber.hot-chilli.net/2010/05/09/twitter-transport-working/ more]
Instagram
no support at the moment best to use a web browser based client
ICQ
The new version (beta) of StriCQ uses a newer ICQ protocol. Most of the ICQ Jabber Transports still use an older ICQ protocol. You can only talk one-way to StriCQ using the older Transports. Only the newer ICQv7 Transport lets you talk both ways to StriCQ. Look at the server lists in the first section to check.
Register on a Jabber server, e.g. this one works: http://www.jabber.de/
Then login into Jabberwocky with the following login data e.g. xxx@jabber.de / Password: xxx Now add your ICQ account under the window->Agents->"Register". Now Jabberwocky connects via the Jabber.de server with your ICQ account.
Yahoo Messenger
although yahoo! does not use xmpp protocol, you should be able to use the transport methods to gain access and post your replies
MSN
early months of 2013 Microsoft will ditch MSN Messenger client and force everyone to use Skype...but MSN protocol and servers will keep working as usual for quite a long time....
Occasionally the Messenger servers have been experiencing problems signing in. You may need to sign in at www.outlook.com and then try again. It may also take multiple tries to sign in. (This also affects you if you’re using Skype.)
You have to check each servers' Agents List to see what transports (MSN protocol, ICQ protocol, etc.) are supported or use the list address' provided in the section above. Then register with each transport (IRC, MSN, ICQ, etc.) to which you need access. After registering you can Connect to start chatting.
msn.jabber.com/registered should appear in the window.
From this [http://tech.dir.groups.yahoo.com/group/amiga-jabberwocky/message/1378 JW group] guide which helps with this process in a clear, step by step procedure.
1. Sign up on MSN's site for a passport account. This typically involves getting a Hotmail address.
2. Log on to the Jabber server of your choice and do the following:
* Select the "Windows/Agents" menu option in Jabberwocky.
* Select the MSN Agent from the list presented by the server.
* Click the Register button to open a new window asking for:
**Username = passort account email address, typically your hotmail address.
**Nick = Screen name to be shown to anyone you add to your buddy list.
**Password = Password for your passport account/hotmail address.
* Click the Register button at the bottom of the new window.
3. If all goes well, you will see the MSN Gateway added to your buddy list. If not, repeat part 2 on another server. Some servers may show MSN in their list of available agents, but have not updated their software for the latest protocols used by MSN.
4. Once you are registered, you can now add people to your buddy list. Note that you need to include the '''msn.''' ahead of the servername so that it knows what gateway agent to use. Some servers may use a slight variation and require '''msg.gate.''' before the server name, so try both to see what works.
If my friend's msn was amiga@hotmail.co.uk and my jabber server was @jabber.meta.net.nz..
then amiga'''%'''hotmail.com@'''msn.'''jabber.meta.net.nz
or another the trick to import MSN contacts is that you don't type the hotmail URL but the passport URL... e.g. Instead of: goodvibe%hotmail.com@msn.jabber.com You type: goodvibe%passport.com@msn.jabber.com
And the thing about importing contacts I'm afraid you'll have to do it by hand, one at the time...
Google Talk
any XMPP server will work, but you have to add your contacts manually. a google talk user is typically either @gmail.com or @talk.google.com. a true gtalk transport is nice because it brings your contacts to you and (can) also support file transfers to/from google talk users.
implement Jingle a set of extensions to the IETF's Extensible Messaging and Presence Protocol (XMPP)
support ended early 2014 as Google moved to Google+ Hangouts which uses it own proprietary format
===Video Player MPlayer===
Many of the menu features (such as doubling) do not work with the current version of mplayer but using
4:3
mplayer -vf scale=800:600 file.avi
16:9
mplayer -vf scale=854:480 file.avi
if you want gui use;
mplayer -gui 1 <other params> file.avi
<pre >
stack 1000000
; using AspireOS 1.xx
; copy FROM SYS:Extras/Multimedia/MPlayer/ TO RAM:MPlayer ALL CLONE > Nil:
; using Icaros Desktop 1.x
; copy FROM SYS:Tools/MPlayer/ TO RAM:MPlayer ALL CLONE > Nil:
; using Icaros Desktop 2.x
; copy FROM SYS:Utilities/MPlayer/ TO RAM:MPlayer ALL CLONE > Nil:
cd RAM:MPlayer
run MPlayer -gui > Nil:
;run MPlayer -gui -ao ahi_dev -playlist http://www.radio-paralax.de/listen.pls > Nil:
</pre >
$ mplayer rtsp://127.0.0.1:554/sample_300kbit.mp4
MPlayer supports multicast streaming, and rtp/rtsp protocols (it might require [http://www.live555.com/openRTSP/ live555 library] to work with some streams). But you might have to build it where it's disabled. Also, multicast won't work with some AmiTCP-likes. MIAMI supported it, though.
AROS supports IPv4 (old but works) and this includes the needed address space for RTP.
If you mean multicast via RTP - mplayer handles it. You can even force UDP over TCP
-rtsp-stream-over-tcp
If the rtsp Real Time Streaming Protocol server needs authentification:
-user -passwd
MPlayer - Menu - Open Playlist and load already downloaded .pls or .m3u file - auto starts around 4 percent cache
MPlayer - Menu - Open Stream and copy one of the .pls lines below into space allowed, press OK and press play button on main gui interface
Old 8bit 16bit remixes chip tune game music
http://www.radio-paralax.de/listen.pls
http://scenesat.com/
http://www.shoutcast.com/radio/Amiga
http://www.theoldcomputer.com/retro_radio/RetroRadio_Main.htm
http://www.kohina.com/
http://www.remix64.com/
http://retrogamer.net/forum/
http://retroasylum.podomatic.com/rss2.xml
http://retrogamesquad.com/
http://www.retronauts.com/
http://monsterfeet.com/noquarter/
http://www.retrogamingradio.com/
http://www.radiofeeds.co.uk/mp3.asp
[[#top|...to the top]]
====ZunePaint====
simplified typical workflow
* importing and organizing and photo management
* making global and regional local correction(s) - recalculation is necessary after each adjustment as it is not in real-time
* exporting your images in the best format available with the preservation of metadata
Whilst achieving 80% of a great photo with just a filter, the remaining 20% comes from a manual fine-tuning of specific image attributes.
For photojournalism, documentary, and event coverage, minimal touching is recommended. Stick to Camera Raw for such shots, and limit changes to level adjustment, sharpness, noise reduction, and white balance correction.
For fashion or portrait shoots, a large amount of adjustment is allowed and usually ends up far from the original. Skin smoothing, blemish removal, eye touch-ups, etc. are common. Might alter the background a bit to emphasize the subject.
Product photography usually requires a lot of sharpening, spot removal, and focus stacking.
For landscape shots, best results are achieved by doing the maximum amount of preparation before/while taking the shot. No amount of processing can match timing, proper lighting, correct gear, optimal settings, etc. Excessive post-processing might give you a dramatic shot but best avoided in the long term.
* White Balance - Left Amiga or F12 and K and under "Misc color effects" tab with a pull down for White Balance - color temperature also known as AKA tint (movies) or tones (painting) - warm temp raise red reduce green blue - cool raise blue lower red green
* Exposure - exposure compensation, highlight/shadow recovery
* Noise Reduction - during RAW development or using external software
* Lens Corrections - distortion, vignetting, chromatic aberrations
* Detail - capture sharpening and local contrast enhancement
* Contrast - black point, levels (sliders) and curves tools (F12 and K)
* Framing - straighten () and crop (F12 and F)
* Refinements - color adjustments and selective enhancements - Left Amiga or F12 and K for RGB and YUV histogram tabs -
* Resizing - enlarge for a print or downsize for the web or email (F12 and D)
* Output Sharpening - customized for your subject matter and print/screen size
White Balance - F12 and K
scan your image for a shade which was meant to be white (neutral with each RGB value being equal) like paper or plastic which is in the same light as the subject of the picture. Use the dropper tool to select this color, similar colours will shift and you will have selected the perfect white balance for your part of the image - for the whole picture make sure RAZ or CLR button at the bottom is pressed before applying to the image above.
Exposure correction
F12 and K - YUV Y luminosity - RGB extra red tint - move red curve slightly down and move blue green curves slightly up
Workflows in practice
* Undo - Right AROS key or F12 and Z
* Redo - Right AROS key or F12 and R
First flatten your image (if necessary) and then do a rotation until the picture looks level.
* Crop the picture. Click the selection button and drag a box over the area of the picture you want to keep. Press the crop button and the rest of the photo will be gone.
* Adjust your saturation, exposure, hue levels, etc., (right AROS Key and K for color correction) until you are happy with the photo. Make sure you zoom in all of the way to 100% and look the photo over, zoom back out and move around. Look for obvious problems with the picture.
* After coloring and exposure do a sharpen (Right AROS key and E for Convolution and select drop down option needed), e.g. set the matrix to 5x5 (roughly equivalent Amount to 60%) and set the Radius to 1.0. Click OK.
And save your picture
Implemented or would like to see for simplification and ease of use
basic filters (presets) like black and white, monochrome, edge detection (sobel), motion/gaussian blur,
* negative, sepiatone, retro vintage, night vision, colour tint, color gradient, color temperature, glows, fire, lightning, lens flare, emboss, filmic, pixelate mezzotint, antialias, etc.
adjust / cosmetic tools such as crop,
* reshaping tools, straighten, smear, smooth, perspective, liquify, bloat, pucker, push pixels in any direction, dispersion, transform like warp, blending with soft light, page-curl, whirl, ripple, fisheye, neon, etc.
* red eye fixing, blemish remover, skin smoothing, teeth whitener, make eyes look brighter, desaturate,
effects like oil paint, cartoon, pencil sketch, charcoal, noise/matrix like sharpen/unsharpen, (right AROS key with A for Artistic effects)
* blend two image, gradient blend, masking blend, explode, implode, custom collage, surreal painting, comic book style, needlepoint, stained glass, watercolor, mosaic, stencil/outline, crayon, chalk, etc.
borders such as
* dropshadow, rounded, blurred, color tint, picture frame, film strip polaroid, bevelled edge, etc.
brushes e.g.
* frost, smoke, etc.
and manual control of
fix lens issues including vignetting (darkening), color fringing and barrel distortion, and chromatic and geometric aberration - lens and body profiles
perspective correction
levels - directly modify the levels of the tone-values of an image, by using sliders for highlights, midtones and shadows
curves - Color Adjustment and Brightness/Contrast
color balance
one single color transparent (alpha channel (color information/selections) for masking and/or blending ) for backgrounds, etc.
Threshold indicates how much other colors will be considered mixture of the removed color and non-removed colors
decompose layer into a set of layers with each holding a different type of pattern that is visible within the image
any selection using any selecting tools like lasso tool, marquee tool etc. the selection will temporarily be save to alpha
If you create your image without transparency then the Alpha channel is not present, but you can add later.
File formats like .psd (Photoshop file has layers, masks etc. contains edited sensor data. The original sensor data is no longer available) .xcf .raw .hdr
Image Picture Formats
* low dynamic range (JPEG, PNG, TIFF 8-bit), 16-bit (PPM, TIFF), typically as a 16-bit TIFF in either ProPhoto or AdobeRGB colorspace - TIFF files are also fairly universal – although, if they contain proprietary data, such as Photoshop Adjustment Layers or Smart Filters, then they can only be opened by Photoshop making them proprietary.
* linear high dynamic range (HDR) images (PFM, [http://www.openexr.com/ ILM .EXR], jpg, [http://aminet.net/util/dtype cr2] (canon tiff based), hdr, NEF, CRW, ARW, MRW, ORF, RAF (Fuji), PEF, DCR, SRF, ERF, DNG files are RAW converted to an Adobe proprietary format - a container that can embed the raw file as well as the information needed to open it)
An old version of [http://archives.aros-exec.org/index.php?function=browse&cat=graphics/convert dcraw]
There is no single RAW file format. Each camera manufacturer has one or more unique RAW formats. RAW files contain the brightness levels data captured by the camera sensor. This data cannot be modified. A second smaller file, separate XML file, or within a database with instructions for the RAW processor to change exposure, saturation etc. The extra data can be changed but the original sensor data is still there. RAW is technically least compatible.
A raw file is high-bit (usually 12 or 14 bits of information) but a camera-generated TIFF file will be usually converted by the camera (compressed, downsampled) to 8 bits. The raw file has no embedded color balance or color space, but the TIFF has both. These three things (smaller bit depth, embedded color balance, and embedded color space) make it so that the TIFF will lose quality more quickly with image adjustments than the raw file. The camera-generated TIFF image is much more like a camera processed JPEG than a raw file. A strong advantage goes to the raw file. The power of RAW files, such as the ability to set any color temperature non-destructively and will contain more tonal values.
The principle of preserving the maximum amount of information to as late as possible in the process. The final conversion - which will always effectively represent a "downsampling" - should prevent as much loss as possible.
Once you save it as TIFF, you throw away some of that data irretrievably. When saving in the lossy JPEG format, you get tremendous file size savings, but you've irreversibly thrown away a lot of image data. As long as you have the RAW file, original or otherwise, you have access to all of the image data as captured.
Keyboard equivalence with Photoshop(tm) would help
File
PHOTOSHOP SHORTCUT GIMP
New Ctrl+n New
Open Ctrl+o Open
Close Ctrl+w Close
Save Ctrl+s Save
Save as Shift+Ctrl+s Save as
Revert F12 Revert
Print Ctrl+p Print
Exit Ctrl+q Quit
Edit
PHOTOSHOP SHORTCUT GIMP
Undo/Redo (1 level) Ctrl+z Undo (Redo is Shift+Ctrl+z)
Cut Ctrl+x Cut
Copy Ctrl+c Copy
Paste Ctrl+v Paste
Paste Into Shift+Ctrl+v Paste Into
Fill with FG color Alt+Backspace Fill with FG color
Fill with BG color Control+Backspace Fill with BG color
Image/Colors
PHOTOSHOP SHORTCUT GIMP
Levels Ctrl+l Levels
Auto Contrast Shift+Ctrl+Alt+l Stretch Contrast (same?)
Curves Ctrl+m Curves
Color Balance Ctrl+b Color Balance
Hue/Saturation Ctrl+u Hue-Saturation
Desaturate Shift+Ctrl+u Desaturate
Invert Ctrl+i Invert
Default Colors d Default Colors
Switch Colors x Switch Colors
Layer
PHOTOSHOP SHORTCUT GIMP
New Layer Shift+Ctrl+n New Layer
Layer via Copy Ctrl+j Duplicate Layer
Bring (layer) to Front Shift+Ctrl+] Layer to Top
Send (layer) to Back Shift+Ctrl+[ Layer to Bottom
Bring (layer) Forward Ctrl+] Raise Layer
Send (layer) Backward Ctrl+[ Lower Layer
Select Top Layer Shift+Alt+] Select Top Layer
Select Bottom Layer Shift+Alt+[ Select Bottom Layer
Select One Layer Forward Alt+] Select Previous Layer
Select One Layer Backward Alt+[ Select Next Layer
Merge Down Ctrl+e Merge Down
Merge Visible Shift+Ctrl+e Merge Visible
Preserve Transparency / Keep Transparency
Cycle Modes Forwards Shift+= Next Layer Mode
Cycle Modes Backwards Shift+- Previous Layer Mode
Select
PHOTOSHOP SHORTCUT GIMP
Select All Ctrl+a Select All
Deselect Ctrl+d Select None
Inverse Shift+Ctrl+i Invert
Feather Ctrl+Alt+d Feather
View
PHOTOSHOP SHORTCUT GIMP
Zoom In Ctrl+= Zoom In
Zoom Out Ctrl+- Zoom Out
Fit on Screen Ctrl+0 Zoom to Fit Window
Actual Pixels Ctrl+Alt+0 Zoom 1:1
Show/Hide Extras Ctrl+h Toggle Show Selection (close enough?)
Show/Hide Guides Ctrl+' Toggle Show Guides
Show/Hide Grid Ctrl+Alt+' Toggle Show Grid
Show/Hide Rulers Ctrl+r Toggle Show Rulers
Snap Ctrl+; Snap to Guides
Scroll View Up Page Up Scroll Page Up
Scroll View Down Page Down Scroll Page Down
Scroll View Left Ctrl+Page Up Scroll Page Left
Scroll View Right Ctrl+Page Down Scroll Page Right
Window/Dialogs
PHOTOSHOP SHORTCUT GIMP
? F5 Tools Dialog
Color Tab F6 Colors Dialog
Layers Tab F7 Layers Dialog
Info Tab F8 Image Information
Tools
PHOTOSHOP SHORTCUT GIMP
Rectangular Marquee Tool m Rect Select Tool
Elliptical Marquee Tool Shift+m Ellipse Select Tool
*This is a toggle between 'Elliptical Marquee Tool' and 'Rectangular Marquee Tool' in Photoshop
Move Tool v Move Tool
Lasso Tool l Free Select Tool
Magic Wand Tool w Fuzzy Select Tool
Crop Tool c Crop & Resize Tool
Airbrush Tool j Airbrush Tool
Paintbrush Tool b Paintbrush Tool
Clone Stamp Tool s Clone Stamp Tool
Eraser Tool e Eraser Tool
Gradient Tool g Blend Tool
Paint Bucket Tool Shift+g Bucket Fill Tool
*This is a toggle between 'Paint Bucket Tool' and 'Gradient Tool' in Photoshop
Blur Tool r Convolve Tool
Dodge Tool o DodgeBurn Tool
Type Tool t Text Tool
Pen Tool p Bezier Select Tool
Eye Dropper Tool i Color Picker Tool
Zoom Tool z Magnify Tool
Previous Brush , Previous Brush
Next Brush . Next Brush
First Brush Shift+< First Brush
Last Brush Shift+> Last Brush
Decrease Brush Size [ Decrease Brush Size
Increase Brush Size ] Increase Brush Size
Decrease Brush Hardness { Decrease Brush Hardness
Increase Brush Hardness } Increase Brush Hardness
Help
PHOTOSHOP SHORTCUT GIMP
Help F1 Help
Context Help Shift+F1 Context Help
Misc.
PHOTOSHOP SHORTCUT GIMP
Last Filter Ctrl+f Repeat Last Filter
? Shift+Ctrl+f Reshow Last Filter
Preferences Ctrl+k Preferences
Liquify Shift+Ctrl+x IWarp (close enough?)
Toggle Quick Mask q Toggle Quick Mask
Spotlights - triangle of white opaque shape
Cutting out and/or replacing unwanted background or features - select large areas with the selection option like the Magic Wand tool (aka Color Range) or the Lasso (quick and fast) with feather 2 to soften edge or the pen tool which adds points/lines/Bézier curves (better control but slower), hold down the shift button as you click to add extra points/areas of the subject matter to remove. Increase the tolerance to cover more areas. To subtract from your selection hold down alt as you're clicking.
* Layer masks are a better way of working than Erase they clip (black hides/hidden white visible/reveal). Clone Stamp can be simulated by and brushes for other areas.
* Leave the fine details like hair, fur, etc. to later with lasso and the shift key to draw a line all the way around your subject. Gradient Mapping - Inverse - Mask. i.e. Refine your selected image with edge detection and using the radius and edge options / adjuster (increase/decrease contrast) so that you will capture more fine detail from the background allowing easier removal.
Remove fringe/halo
saving image as png rather than jpg/jpeg to keep transparency background intact.
Implemented [http://colorizer.org/ colour model representations] [http://paulbourke.net/texture_colour/colourspace/ Mathematical approach] - Photo stills are spatially 2d (h and w), but are colorimetrically 3d (r g and b, or H L S, or Y U V etc.) as well.
* RGB - split cubed mapped color model for photos and computer graphics hardware using the light spectrum (adding and subtracting)
* YUV - Y-Lightness U-blue/yellow V-red/cyan (similar to YPbPr and YCbCr) used in the PAL, NTSC, and SECAM composite digital TV color [http://crewofone.com/2012/chroma-subsampling-and-transcoding/#comment-7299 video]
Histograms
White balanced (neutral) if the spike happens in the same place in each channel of the RGB graphs. If not, you're not balanced.
If you have sky you'll see the blue channel further off to the right.
RGB is best one to change colours. These elements RGB is a 3-channel format containing data for Red, Green, and Blue in your photo scale between 0 and 255. The area in a picture that appears to be brighter/whiter contains more red color as compared to the area which is relatively darker. Similarly in the green channel the area that appears to be darker contains less amount of green color as compared to the area that appears to be brighter. Similarly in the blue channel the area appears to be darker contains less amount of blue color as compared to the area that appears to be brighter. Brightness luminance histogram also matches the green histogram more than any other color - human eye interprets green better e.g. RGB rough ratio 15/55/30%
RGBA (RGB+A, A means alpha channel) . The alpha channel is used for "alpha compositing", which can mostly be associated as "opacity". AROS deals in RGB with two digits for every color (red, green, blue), in ARGB you have two additional hex digits for the alpha channel.
The shadows are represented by the left third of the graph. The highlights are represented by the right third. And the midtones are, of course, in the middle. The higher the black peaks in the graph, the more pixels are concentrated in that tonal range (total black area).
By moving the black endpoint, which identifies the shadows (darkness) and a white light endpoint (brightness) up and down either sides of the graph, colors are adjusted based on these points.
By dragging the central one, can increased the midtones and control the contrast, raise shadows levels, clip or softly eliminate unsafe levels, alter gamma, etc... in a way that is much more precise and creative .
RGB Curves
* Move left endpoint (black point) up or right endpoint (white point) up brightens
* Move left endpoint down or right endpoint down darkens
Color Curves
* Dragging up on the Red Curve increases the intensity of the reds in the image but
* Dragging down on the Red Curve decreases the intensity of the reds and thus increases the apparent intensity of its complimentary color, cyan. Green’s complimentary color is magenta, and blue’s is yellow.
<pre>
Red <-> Cyan
Green <->Magenta
Blue <->Yellow
</pre>
YUV Best option to analyse and pull out statistical elements of any picture (i.e. separate luminance data from color data). The line in Y luma tone box represents the brightness of the image with the point in the bottom left been black, and the point in the top right as white. A low-contrast image has a concentrated clump of values nearer to the center of the graph. By comparison, a high-contrast image has a wider distribution of values across the entire width of the Histogram. A histogram that is skewed to the right would indicate a picture that is a bit overexposed because most of the color data is on the lighter side (increase exposure with higher value F), while a histogram with the curve on the left shows a picture that is underexposed. This is good information to have when using post-processing software because it shows you not only where the color data exists for a given picture, but also where any data has been clipped (extremes on edges of either side): that is, it does not exist and, therefore, cannot be edited. By dragging the endpoints of the line and as well as the central one, can increased the dark/shadows, midtones and light/bright parts and control the contrast, raise shadows levels, clip or softly eliminate unsafe levels, alter gamma, etc... in a way that is much more precise and creative .
The U and V chroma parts show color difference components of the image. It’s useful for checking whether or not the overall chroma is too high, and also whether it’s being limited too much
Can be used to create a negative image but also
With U (Cb), the higher value you are, the more you're on the blue primary color. If you go to the low values then you're on blue complementary color, i.e. yellow.
With V (Cr), this is the same principle but with Red and Cyan.
e.g. If you push U full blue and V full red, you get magenta. If you push U full yellow and V full Cyan then you get green.
YUV simultaneously adds to one side of the color equation while subtracting from the other.
using YUV to do color correction can be very problematic because each curve alters the result of each other: the mutual influence between U and V often makes things tricky. You may also be careful in what you do to avoid the raise of noise (which happens very easily). Best results are obtained with little adjustments
sunset that looks uninspiring and needs some color pop especially for the rays over the hill, a subtle contrast raise while setting luma values back to the legal range without hard clipping.
====Lunapaint====
Pixel based drawing app with onion-skin animation function
Blocking, Shading, Coloring, adding detail
<pre>
b BRUSH
e ERASER
alt eyedropper
v layer tool
z ZOOM / MAGNIFY < > n
spc panning
m marque
q lasso
w same color selection / region
</pre>
<pre>
, LM RM
v
V
f filter
F
. size
p
, pick color
[] last / next color
</pre>
There is not much missing in Lunapaint to be as good as FlipBook and then you have to take into account that Flipbook is considered to be amongst the best and easiest to use animation software out there. Ok to be honest Flipbook has some nice features that require more heavy work but those aren't so much needed right away, things like camera effects, sound, smart fill, export to different movie file formats etc.
Tried Flipbook with my tablet and compared it to Luna. The feeling is the same when sketching. LunaPaint is very responsive/fluent to draw with. Just as Flipbook is, and that responsiveness is something its users have mentioned as one of the positive sides of said software.
author was learning MUI. Some parts just have to be rewritten with proper MUI classes before new features can be added.
* add [Frame Add] / [Frame Del]
* whole animation feature is impossible to use. If you draw 2 color maybe but if you start coloring your cells then you get in trouble
* pickup the entire image as a brush, not just a selection ? And consequently remove the brush from memory when one doesn't need it anymore. can pick up a brush and put it onto a new image but cropping isn't possible, nor to load/save brushes.
* Undo is something I longed for ages in Lunapaint.
* to import into the current layer, other types of images (e.g. JPEG) besides RAW64.
* implement graphic tablet features support
**GENERAL DRAWING**
Miss it very much:
UNDO
ERASER
COLORPICKER - has to show on palette too which color got picked.
BACKGROUND COLOR -Possibility to select from "New project screen"
Miss it somewhat:
ICON for UNDO
ICON for ERASER
ICON for CLEAR SCREEN ( What can I say? I start over from scratch very often )
BRUSH - possibility to cut out as brush not just copy off image to brush
**ANIMATING**
Miss it very much:
NUMBER OF CELLS - Possibity to change total no. of cells during project
ANIM BRUSH - Possibility to pick up a selected part of cells into an animbrush
Miss it somewhat:
ADD/REMOVE FRAMES: Add/remove single frame
In general LunaPaint is really well done and it feels like a new DeluxePaint version. It works with my tablet. Sure there's much missing of course but things can always be added over time. So there is great potential in LunaPaint that's for sure. Animations could be made in it and maybe put together in QuickVideo, saving in .gif or .mng etc some day.
LAYERS
-Layers names don't get saved globally in animation frames
-Layers order don't change globally in an animation (perhaps as default?).
EXPORTING IMAGES
-Exporting frames to JPG/PNG gives problems with colors. (wrong colors. See my animatiopn --> My robot was blue now it's "gold" ) I think this only happens if you have layers.
-Trying to flatten the layers before export doesn't work if you have animation frames only the one you have visible will flatten properly all other frames are destroyed. (Only one of the layers are visible on them)
-Exporting images filenames should be for example e.g. file0001, file0002...file0010 instead as of now file1, file2...file10
LOAD/SAVE (Preferences)
-Make a setting for the default "Work" folder.
* Destroyed colors if exported image/frame has layers
* mystic color cycling of the selected color while stepping frames back/forth (annoying)
<pre>
Deluxe Paint II enhanced key shortcuts
NOTE: @ denotes the ALT key
[Technique]
F1 - Paint
F2 - Single Colour
F3 - Replace
F4 - Smear
F5 - Shade
F6 - Cycle
F7 - Smooth
M - Colour Cycle
[Brush]
B - Restore
O - Outline
h - Halve brush size
H - Double brush size
x - Flip brush on X axis
X - Double brush size on X axis only
y - Flip on Y
Y - Double on Y
z - Rotate brush 90 degrees
Z - Stretch
[Stencil]
` - Stencil On
[Miscellaneous]
F9 - Info Bar
F10 - Selection Bar
@o - Co-Ordinates
@a - Anti-alias
@r - Colourise
@t - Translucent
TAB - Colour Cycle
[Picture]
L - Load
S - Save
j - Page to Spare(Flip)
J - Page to Spare(Copy)
V - View Page
Q - Quit
[General Keys]
m - Magnify
< - Zoom In
> - Zoom Out
[ - Palette Colour Up
] - Palette Colour Down
( - Palette Colour Left
) - Palette Colour Right
, - Eye Dropper
. - Pixel / Brush Toggle
/ - Symmetry
| - Co-Ordinates
INS - Perspective Control
+/- - Brush Size (Fine Control)
w - Unfilled Polygon
W - Filled Polygon
e - Unfilled Ellipse
E - Filled Ellipse
r - Unfilled Rectangle
R - Filled Rectangle
t - Type/text tool
a - Select Font
u/U - Undo
d - Brush
D - Filled Non-Uniform Polygon
f/F - Fill Options
g/G - Grid
h/H - Brush Size (Coarse Control)
K - Clear
c - Unfilled Circle
C - Filled Circle
v - Line
b - Scissor Select and Toggle
B - Brush
{,} - Toggle between two background colours
</pre>
====Lodepaint====
Pixel based painting artwork app
====Grafx2====
Pixel based painting artwork app aesprite like
[https://www.youtube.com/watch?v=59Y6OTzNrhk aesprite workflow keys and tablet use], [],
====Vector Graphics ZuneFIG====
Vector Image Editing of files .svg .ps .eps
*Objects - raise lower rotate flip aligning snapping
*Path - unify subtract intersect exclude divide
*Colour - fill stroke
*Stroke - size
*Brushes -
*Layers -
*Effects - gaussian bevels glows shadows
*Text -
*Transform -
AmiFIG ([http://epb.lbl.gov/xfig/frm_introduction.html xfig manual])
[[File:MyScreen.png|thumb|left|alt=Showing all Windows open in AmiFIG.|All windows available to AmiFIG.]]
for drawing simple to intermediate vector graphic images for scientific and technical uses and for illustration purposes for those with talent
;Menu options
* Load - fig format but import(s) SVG
* Save - fig format but export(s) eps, ps, pdf, svg and png
* PAN = Ctrl + Arrow keys
* Deselect all points
There is no selected object until you apply the tool, and the selected object is not highlighted.
;Metrics - to set up page and styles - first window to open on new drawings
;Tools - Drawing Primitives - set Attributes window first before clicking any Tools button(s)
* Shapes - circles, ellipses, arcs, splines, boxes, polygon
* Lines - polylines
* Text "T" button
* Photos - bitmaps
* Compound - Glue, Break, Scale
* POINTs - Move, Add, Remove
* Objects - Move, Copy, Delete, Mirror, Rotate, Paste
use right mouse button to stop extra lines, shapes being formed and the left mouse to select/deselect tools button(s)
* Rotate - moves in 90 degree turns centered on clicked POINT of a polygon or square
;Attributes which provide change(s) to the above primitives
* Color
* Line Width
* Line Style
* arrowheads
;Modes
Choose from freehand, charts, figures, magnet, etc.
;Library - allows .fig clip-art to be stored
* compound tools to add .fig(s) together
;FIG 3.2 [http://epb.lbl.gov/xfig/fig-format.html Format] as produced by xfig version 3.2.5
<pre>
Landscape
Center
Inches
Letter
100.00
Single
-2
1200 2
4 0 0 50 -1 0 12 0.0000 4 135 1050 1050 2475 This is a test.01
</pre>
# change the text alignment within the textbox. I can choose left, center, or right aligned by either changing the integer in the second column from 0 (left) to 1 or 2 (center, or right).
# The third integer in the row specifies fontcolor. For instance, 0 is black, but blue is 1 and Green3 is 13.
# The sixth integer in the bottom row specifies fontface. 0 is Times-Roman, but 16 is Helvetica (a MATLAB default).
# The seventh number is fontsize. 12 represents a 12pt fontsize. Changing the fontsize of an item really is as easy as changing that number to 20.
# The next number is the counter-clockwise angle of the text. Notice that I have changed the angle to .7854 (pi/4 rounded to four digits=45 degrees).
# twelfth number is the position according to the standard “x-axis” in Xfig units from the left. Note that 1200 Xfig units is equivalent to once inch.
# thirteenth number is the “y-position” from the top using the same unit convention as before.
* The nested text string is what you entered into the textbox.
* The “01″ present at the end of that line in the .fig file is the closing tag. For instance, a change to \100 appends a @ symbol at the end of the period of that sentence.
; Just to note there are no layers, no 3d functions, no shading, no transparency, no animation
[[#top|...to the top]]
===Audio===
# AHI uses linear panning/balance, which means that in the center, you will get -6dB. If an app uses panning, this is what you will get. Note that apps like Audio Evolution need panning, so they will have this problem.
# When using AHI Hifi modes, mixing is done in 32-bit and sent as 32-bit data to the driver. The Envy24HT driver uses that to output at 24-bit (always).
# For the Envy24/Envy24HT, I've made 16-bit and 24-bit inputs (called Line-in 16-bit, Line-in 24-bit etc.). There is unfortunately no app that can handle 24-bit recording.
====Music Mods====
Digital module (mods) trackers are music creation software using samples and sometimes soundfonts, audio plugins (VST, AU or RTAS), MIDI.
Generally, MODs are similar to MIDI in that they contain note on/off and other sequence messages that control the mod player. Unlike (most) midi files, however, they also contain sound samples that the sequence information actually plays. MOD files can have many channels (classic amiga mods have 4, corresponding to the inbuilt sound channels), but unlike MIDI, each channel can typically play only one note at once. However, since that note might be a sample of a chord, a drumloop or other complex sound, this is not as limiting as it sounds.
Like MIDI, notes will play indefinitely if they're not instructed to end. Most trackers record this information automatically if you play your music in live. If you're using manual note entry, you can enter a note-off command with a keyboard shortcut - usually Caps Lock.
In fact when considering file size MOD is not always the best option. Even a dummy song wastes few kilobytes for nothing when a simple SID tune could be few hundreds bytes and not bigger than 64kB. AHX is another small format, AHX tunes are never larger than 64kB excluding comments.
[https://www.youtube.com/watch?v=rXXsZfwgil Protrekkr] (previously aka [w:Juan_Antonio_Arguelles_Rius|NoiseTrekkr])
If Protrekkr does not start, please check if the Unit 0 has been setup in the AHI prefs and still not, go to the directory utilities/protrekkr and double click on the Protrekkr icon
*Sample
*Note - Effect
*Track (column) - Pattern - Order
It all starts with the Sample which is used to create Note(s) in a Track (column of a tracker)
The Note can be changed with an Effect. A Track of Note(s) can be collected into a Pattern (section of a song) and these can be given Order to create the whole song.
Patience (notes have to be entered one at a time) or playing the bassline on a midi controller (faster - see midi section above). Best approach is to wait until a melody popped into your head.
*Up-tempo means the track should be reasonably fast, but not super-fast.
*Groovy and funky imply the track should have some sort of "swing" feel, with plenty of syncopation or off beat emphasis and a recognizable, melodic bass line.
*Sweet and happy mean upbeat melodies, a major key and avoiding harsh sounds.
*Moody - minor key
First, create a quick bass sound, which is basically a sine wave, but can be hand drawn for a little more variance. It could also work for the melody part, too.
This is usually a bass guitar or some kind of synthesizer bass. The bass line is often forgotten by inexperienced composers, but it plays an important role in a musical piece. Together with the rhythm section the bass line forms the groove of a song. It's the glue between the rhythm section and the melodic layer of a song.
The drums are just pink noise samples, played at different frequencies to get a slightly different sound for the kick, snare, and hihats.
Instruments that fall into the rhythm category are bass drums, snares, hi-hats, toms, cymbals, congas, tambourines, shakers, etc. Any percussive instrument can be used to form part of the rhythm section.
The lead is the instrument that plays the main melody, on top of the chords. There are many instruments that can play a lead section, like a guitar, a piano, a saxophone or a flute. The list is almost endless. There is a lot of overlap with instruments that play chords. Often in one piece an instrument serves both roles. The lead melody is often played at a higher pitch than the chords.
Listened back to what was produced so far, and a counter-melody can be imagined, which can be added with a triangle wave.
To give the ends of phrases some life, you can add a solo part with a crunchy synth. By hitting random notes in the key of G, then edited a few of them.
For the climax of the song, filled out the texture with a gentle high-pitch pad… …and a grungy bass synth.
The arrow at A points at the pattern order list. As you see, the patterns don't have to be in numerical order. This song starts with pattern "00", then pattern "02", then "03", then "01", etcetera. Patterns may be repeated throughout a song.
The B arrow points at the song title. Below it are the global BPM and speed parameters. These determine the tempo of the song, unless the tempo is altered through effect commands during the song.
The C arrow points at the list of instruments. An instrument may consist of multiple samples. Which sample will be played depends on the note. This can be set in the Instrument Editing screen. Most instruments will consist of just one sample, though. The sample list for the selected instrument can be found under arrow D.
Here's a part of the main editing screen. This is where you put in actual notes. Up to 32 channels can be used, meaning 32 sounds can play simultaneously. The first six channels of pattern "03" at order "02" are shown here. The arrow at A points at the row number. The B arrow points at the note to play, in this case a C4. The column pointed at by the C arrow tells us which instrument is associated with that note, in this case instrument #1 "Kick".
The column at D is used (mainly) for volume commands. In this case it is left empty which means the instrument should play at its default volume. You can see the volume column being used in channel #6.
The E column tells us which effect to use and any parameters for that effect. In this case it holds the "F" effect, which is a tempo command. The "04" means it should play at tempo 4 (a smaller number means faster).
Base pattern
When I create a new track I start with what I call the base pattern. It is worthwhile to spend some time polishing it as a lot of the ideas in the base pattern will be copied and used in other patterns. At least, that's how I work. Every musician will have his own way of working. In "Wild Bunnies" the base pattern is pattern "03" at order "02".
In the section about selecting samples I talked about the four different categories of instruments: drums, bass, chords and leads. That's also how I usually go about making the base pattern. I start by making a drum pattern, then add a bass line, place some chords and top it off with a lead. This forms the base pattern from which the rest of the song will grow.
Drums
Here's a screenshot of the first four rows of the base pattern. I usually reserve the first four channels or so for the drum instruments. Right away there are a couple of tricks shown here. In the first channel the kick, or bass drum, plays some notes. Note the alternating F04 and F02 commands. The "F" command alters the tempo of the song and by quickly alternating the tempo; the song will get some kind of "swing" feel.
In the second channel the closed hi-hat plays a fairly simple pattern. Further down in the channel, not shown here, some open hi-hat notes are added for a bit of variation.
In the third and fourth channel the snare sample plays. The "8" command is for panning. One note is panned hard to the left and the other hard to the right. One sample is played a semitone lower than the other. This results in a cool flanging effect. It makes the snare stand out a little more in the mix.
Bass line
There are two different instruments used for the bass line. Instrument #6 is a pretty standard synthesized bass sound. Instrument #A sounds a bit like a slap bass when used with a quick fade out. By using two different instruments the bass line sounds a bit more ”human”. The volume command is used to cut off the notes. However, it is never set to zero. Setting the volume to a very small value will result in a reverb-like effect. This makes the song sound more "live".
The bass line hints at the chords that will be played and the key the song will be in. In this case the key of the song is D-major, a positive and happy key.
Chords
The D major chords that are being played here are chords stabs; short sounds with a quick decay (fade out). Two different instruments (#8 and #9) are used to form the chords. These instruments are quite similar, but have a slightly different sound, panning and volume decay. Again, the reason for this is to make the sound more human. The volume command is used on some chords to simulate a delay, to achieve more of a live feel. The chords are placed off-beat making for a funky rhythm.
Lead
Finally the lead melody is added. The other instruments are invaluable in holding the track together, but the lead melody is usually what catches people's attention.
A lot of notes and commands are used here, but it looks more complex than it is. A stepwise ascending melody plays in channel 13. Channel 14 and 15 copy this melody, but play it a few rows later at a lower volume. This creates an echo effect. A bit of panning is used on the notes to create some stereo depth. Like with the bass line, instead of cutting off notes the volume is set to low values for a reverb effect. The "461" effect adds a little vibrato to the note, which sounds nice on sustained notes.
Those paying close attention may notice the instrument used here for the lead melody is the same as the one used for the bass line (#6 "Square"), except played two or three octaves higher. This instrument is a looped square wave sample. Each type of wave has its own quirks, but the square wave (shown below) is a really versatile wave form.
Song structure
Good, catchy songs are often carefully structured into sections, some of which are repeated throughout the song with small variations.
A typical pop-song structure is: Intro - Verse - Chorus - Verse - Chorus - Bridge - Chorus.
Other single sectional song structures are
<pre>
Strophic or AAA Song Form - oldest story telling with refrain (often title of the song) repeated in every verse section melody
AABA Song Form - early popular, jazz and gospel fading during the 1960s
AB or Verse/Chorus Song Form - songwriting format of choice for modern popular music since the 1960s
Verse/Chorus/Bridge Song Form
ABAB Song Form
ABAC Song Form
ABCD Song Form
AAB 12-Bar Song Form - three four-bar lines or sub-sections
8-Bar Song Form
16-Bar Song Form
Hybrid / Compound Song Forms
</pre>
The most common building blocks are:
#INTRODUCTION(INTRO)
#VERSE
#REFRAIN
#PRE-CHORUS / RISE / CLIMB
#CHORUS
#BRIDGE
#MIDDLE EIGHT
#SOLO / INSTRUMENTAL BREAK
#COLLISION
#CODA / OUTRO
#AD LIB (OFTEN IN CODA / OUTRO)
The chorus usually has more energy than the verse and often has a memorable melody line. As the chorus is repeated the most often during the song, it will be the part that people will remember.
The bridge often marks a change of direction in the song. It is not uncommon to change keys in the bridge, or at least to use a different chord sequence. The bridge is used to build up tension towards the big finale, the last repetition of chorus.
Playing
RCTRL: Play song from row 0.
LSHIFT + RCTRL: Play song from current row.
RALT: Play pattern from row 0.
LSHIFT + RALT: Play pattern from current row.
Left mouse on '>': Play song from row 0.
Right mouse on '>': Play song from current row.
Left mouse on '|>': Play pattern from row 0.
Right mouse on '|>': Play pattern from current row.
Left mouse on 'Edit/Record': Edit mode on/off.
Right mouse on 'Edit/Record': Record mode on/off.
Editing
LSHIFT + ESCAPE: Switch large patterns view on/off
TAB: Go to next track
LSHIFT + TAB: Go to prev. track
LCTRL + TAB: Go to next note in track
LCTRL + LSHIFT + TAB: Go to prev. note in track
SPACE: Toggle Edit mode On & Off
(Also stop if the song is being played)
SHIFT SPACE: Toggle Record mode On & Off
(Wait for a key note to be pressed
or a midi in message to be received)
DOWN ARROW: 1 Line down
UP ARROW: 1 Line up
LEFT ARROW: 1 Row left
RIGHT ARROW: 1 Row right
PREV. PAGE: 16 Arrows Up
NEXT PAGE: 16 Arrows Down
HOME / END: Top left / Bottom right of pattern
LCTRL + HOME / END: First / last track
F5, F6, F7, F8, F9: Jump to 0, 1/4, 2/4, 3/4, 4/4 lines of the patterns
+ - (Numeric keypad): Next / Previous pattern
LCTRL + LEFT / RIGHT: Next / Previous pattern
LCTRL + LALT + LEFT / RIGHT: Next / Previous position
LALT + LEFT / RIGHT: Next / Previous instrument
LSHIFT + M: Toggle mute state of the current channel
LCTRL + LSHIFT + M: Solo the current track / Unmute all
LSHIFT + F1 to F11: Select a tab/panel
LCTRL + 1 to 4: Select a copy buffer
Tracking
1st and 2nd keys rows: Upper octave row
3rd and 4th keys rows: Lower octave row
RSHIFT: Insert a note off
/ and * (Numeric keypad)
or F1 F2: -1 or +1 octave
INSERT / BACKSPACE: Insert or Delete a line in current track
or current selected block.
LSHIFT + INSERT / BACKSPACE: Insert or Delete a line in current pattern
DELETE (NOT BACKSPACE): Empty a column or a selected block.
Blocks
(Blocks can also be selected with the mouse by holding the right button and scrolling the pattern with the mouse wheel).
LCTRL + A: Select entire current track
LCTRL + LSHIFT + A: Select entire current pattern
LALT + A: Select entire column note in a track
LALT + LSHIFT + A: Select all notes of a track
LCTRL + X: Cut the selected block and copy it into the block-buffer
LCTRL + C: Copy the selected block into the block-buffer
LCTRL + V: Paste the data from the block buffer into the pattern
LCTRL + I: Interpolate selected data from the first to the last row of a selection
LSHIFT + ARROWS
PREV. PAGE
NEXT PAGE: Select a block
LCTRL + R: Randomize the select columns of a selection, works similar to CTRL + I (interpolating them)
LCTRL + U: Transpose the note of a selection to 1 seminote higher
LCTRL + D: Transpose the note of a selection to 1 seminote lower
LCTRL + LSHIFT + U: Transpose the note of a selection to 1 seminote higher (only for the current instrument)
LCTRL + LSHIFT + D: Transpose the note of a selection to 1 seminote lower (only for the current instrument)
LCTRL + H: Transpose the note of a selection to 1 octave higher
LCTRL + L: Transpose the note of a selection to 1 octave lower
LCTRL + LSHIFT + H: Transpose the note of a selection to 1 octave higher (only for the current instrument)
LCTRL + LSHIFT + L: Transpose the note of a selection to 1 octave lower (only for the current instrument)
LCTRL + W: Save the current selection into a file
Misc
LALT + ENTER: Switch between full screen / windowed mode
LALT + F4: Exit program (Windows only)
LCTRL + S: Save current module
LSHIFT + S: Switch top right panel to synths list
LSHIFT + I: Switch top right panel to instruments list
<pre>
C-x xh xx xx hhhh Volume
B-x xh xx xx hhhh Jump to
A#x xh xx xx hhhh hhhh Slide
F-x xh xx xx hhhh Tempo
D-x xh xx xx hhhh Pattern Break
G#x xh xx xx hhhh
</pre>
h Hex 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13
d Dec 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19
The Set Volume command: C. Input a note, then move the cursor to the effects command column and type a C. Play the pattern, and you shouldn't be able to hear the note you placed the C by. This is because the effect parameters are 00. Change the two zeros to a 40(Hex)/64(Dec), depending on what your tracker uses. Play back the pattern again, and the note should come in at full volume.
The Position Jump command next. This is just a B followed by the position in the playing list that you want to jump to. One thing to remember is that the playing list always starts at 0, not 1. This command is usually in Hex.
Onto the volume slide command: A. This is slightly more complex (much more if you're using a newer tracker, if you want to achieve the results here, then set slides to Amiga, not linear), due to the fact it depends on the secondary tempo. For now set a secondary tempo of 06 (you can play around later), load a long or looped sample and input a note or two. A few rows after a note type in the effect command A. For the parameters use 0F. Play back the pattern, and you should notice that when the effect kicks in, the sample drops to a very low volume very quickly. Change the effect parameters to F0, and use a low volume command on the note. Play back the pattern, and when the slide kicks in the volume of the note should increase very quickly.
This because each part of the effect parameters for command A does a different thing. The first number slides the volume up, and the second slides it down. It's not recommended that you use both a volume up and volume down at the same time, due to the fact the tracker only looks for the first number that isn't set to 0. If you specify parameters of 8F, the tracker will see the 8, ignore the F, and slide the volume up. Using a slide up and down at same time just makes you look stupid. Don't do it...
The Set Tempo command: F, is pretty easy to understand. You simply specify the BPM (in Hex) that you want to change to. One important thing to note is that values of lower than 20 (Hex) sets the secondary tempo rather than the primary.
Another useful command is the Pattern Break: D. This will stop the playing of the current pattern and skip to the next one in the playing list. By using parameters of more than 00 you can also specify which line to begin playing from.
Command 3 is Portamento to Note. This slides the currently playing note to another note, at a specified speed. The slide then stops when it reaches the desired note.
<pre>
C-2 1 000 - Starts the note playing
--- 000
C-3 330 - Starts the slide to C-3 at a speed of 30.
--- 300 - Continues the slide
--- 300 - Continues the slide
</pre>
Once the parameters have been set, the command can be input again without any parameters, and it'll still perform the same function unless you change the parameters. This memory function allows certain commands to function correctly, such as command 5, which is the Portamento to Note and Volume Slide command. Once command 3 has been set up command 5 will simply take the parameters from that and perform a Portamento to Note. Any parameters set up for command 5 itself simply perform a Volume Slide identical to command A at the same time as the Portamento to Note.
This memory function will only operate in the same channel where the original parameters were set up.
There are various other commands which perform two functions at once. They will be described as we come across them.
C-3 04 .. .. 09 00 ---> C-3 04 .. .. 09 00
C-3 04 .. .. 09 00 ---> C-3 04 .. .. 09 02
C-3 04 .. .. 09 00 ---> C-3 04 .. .. 09 05
C-3 04 .. .. 09 00 ---> C-3 04 .. .. 09 08
C-3 04 .. .. 09 00 ---> C-3 04 .. .. 09 0A
C-3 04 .. .. 09 00 ---> C-3 04 .. .. 09 0D
C-3 04 .. .. 09 10 ---> C-3 04 .. .. 09 10
(You can also switch on the Slider Rec to On, and perform parameter-live-recording, such as cutoff transitions, resonance or panning tweaking, etc..) Note: this command only works for volume/panning and fx datas columns.
The next command we'll look at is the Portamento up/down: 1 and 2. Command 1 slides the pitch up at a specified speed, and 2 slides it down. This command works in a similar way to the volume slide, in that it is dependent on the secondary tempo. Both these commands have a memory dependent on each other, if you set the slide to a speed of 3 with the 1 command, a 2 command with no parameters will use the speed of 3 from the 1 command, and vice versa.
Command 4 is Vibrato. Vibrato is basically rapid changes in pitch, just try it, and you'll see what I mean. Parameters are in the format of xy, where x is the speed of the slide, and y is the depth of the slide. One important point to remember is to keep your vibratos subtle and natural so a depth of 3 or less and a reasonably fast speed, around 8, is usually used. Setting the depth too high can make the part sound out of tune from the rest.
Following on from command 4 is command 6. This is the Vibrato and Volume Slide command, and it has a memory like command 5, which you already know how to use.
Command 7 is Tremolo. This is similar to vibrato. Rather than changing the pitch it slides the volume. The effect parameters are in exactly the same format. vibrato effect (0x1dxy) x = speed y = depth (can't be used if arpeggio (0x1b) is turned on)
<pre>
C-7 00 .. .. 1B37 <- Turn Arpeggio effect on
--- .. .. .. 0000
--- .. .. .. 0000
--- .. .. .. 0000
--- .. .. .. 1B38 <- Change datas
--- .. .. .. 0000
--- .. .. .. 0000
--- .. .. .. 0000
--- .. .. .. 1B00 <- Turn it off
</pre>
Command 9 is Sample Offset. This starts the playback of the sample from a different place than the start. The effect parameters specify the sample offset, but only very roughly. Say you have a sample which is 8765(Hex) bytes long, and you wanted it to play from position 4321(Hex). The effect parameter could only be as accurate as the 43 part, and it would ignore the 21.
Command B is the Playing List/Order Jump command. The parameters specify the position in the Playing List/Order to jump to. When used in conjunction with command D you can specify the position and the line to play from.
Command E is pretty complex, as it is used for a lot of different things, depending on what the first parameter is. Let's take a trip through each effect in order.
Command E0 controls the hardware filter on an Amiga, which, as a low pass filter, cuts off the highest frequencies being played back. There are very few players and trackers on other system that simulate this function, not that you should need to use it. The second parameter, if set to 1, turns on the filter. If set to 0, the filter gets turned off.
Commands E1/E2 are Fine Portamento Up/Down. Exactly the same functions as commands 1/2, except that they only slide the pitch by a very small amount. These commands have a memory the same as 1/2 as well.
Command E3 sets the Glissando control. If parameters are set to 1 then when using command 3, any sliding will only use the notes in between the original note and the note being slid to. This produces a somewhat jumpier slide than usual. The best way to understand is to try it out for yourself. Produce a slow slide with command 3, listen to it, and then try using E31.
Command E4 is the Set Vibrato Waveform control. This command controls how the vibrato command slides the pitch. Parameters are 0 - Sine, 1 - Ramp Down (Saw), 2 - Square. By adding 4 to the parameters, the waveform will not be restarted when a new note is played e.g. 5 - Sine without restart.
Command E5 sets the Fine Tune of the instrument being played, but only for the particular note being played. It will override the default Fine Tune for the instrument. The parameters range from 0 to F, with 0 being -8 and F being +8 Fine Tune. A parameter of 8 gives no Fine Tune. If you're using a newer tracker that supports more than -8 to +8 e.g. -128 to +128, these parameters will give a rough Fine Tune, accurate to the nearest 16.
Command E6 is the Jump Loop command. You mark the beginning of the part of a pattern that you want to loop with E60, and then specify with E6x the end of the loop, where x is the number of times you want it to loop.
Command E7 is the Set Tremolo Waveform control. This has exactly the same parameters as command E4, except that it works for Tremolo rather than Vibrato.
Command E9 is for Retriggering the note quickly. The parameter specifies the interval between the retrigs. Use a value of less than the current secondary tempo, or else the note will not get retrigged.
Command EA/B are for Fine Volume Slide Up/Down. Much the same as the normal Volume Slides, except that these are easier to control since they don't depend on the secondary tempo. The parameters specify the amount to slide by e.g. if you have a sample playing at a volume of 08 (Hex) then the effect EA1 will slide this volume to 09 (Hex). A subsequent effect of EB4 would slide this volume down to 05 (Hex).
Command EC is the Note Cut. This sets the volume of the currently playing note to 0 at a specified tick. The parameters should be lower than the secondary tempo or else the effect won't work.
Command ED is the Note Delay. This should be used at the same time as a note is to be played, and the parameters will specify the number of ticks to delay playing the note. Again, keep the parameters lower than the secondary tempo, or the note won't get played!
Command EE is the Pattern Delay. This delays the pattern for the amount of time it would take to play a certain number of rows. The parameters specify how many rows to delay for.
Command EF is the Funk Repeat command. Set the sample loop to 0-1000. When EFx is used, the loop will be moved to 1000- 2000, then to 2000-3000 etc. After 9000-10000 the loop is set back to 0- 1000. The speed of the loop "movement" is defined by x. E is two times as slow as F, D is three times as slow as F etc. EF0 will turn the Funk Repeat off and reset the loop (to 0-1000).
effects 0x41 and 0x42 to control the volumes of the 2 303 units
There is a dedicated panel for synth parameter editing with coherent sections (osc, filter modulation, routing, so on) the interface is much nicer, much better to navigate with customizable colors, the reverb is now customizable (10 delay lines), It accepts newer types of Waves (higher bit rates, at least 24). Has a replay routine.
It's pretty much your basic VA synth. The problem isn't with the sampler being to high it's the synth is tuned two octaves too low, but if you want your samples tuned down just set the base note down 2 octaves (in the instrument panel).
so the synth is basically divided into 3 sections from left to right: oscillators/envelopes, then filter and LFO's, and in the right column you have mod routings and global settings.
for the oscillator section you have two normal oscillators (sine, saw, square, noise), the second of which is tunable, the first one tunes with the key pressed. Attached to OSC 1 is a sub-oscillator, which is a sawtooth wave tuned one octave down. The phase modulation controls the point in the duty cycle at which the oscillator starts. The ADSR envelope sliders (grouped with oscs) are for modulation envelope 1 and 2 respectively. you can use the synth as a sampler by choosing the instrument at the top.
In the filter column, the filter settings are: 1 = lowpass, 2 = highpass, 3 = off. cutoff and resonance. For the LFOs they are LFO 1 and LFO 2, the ADSR sliders in those are for the LFO itself.
For the modulation routings you have ENV 1, LFO 1 for the first slider and ENV 2, LFO 2 for the second, you can cycle through the individual routings there, and you can route each modulation source to multiple destinations of course, which is another big plus for this synth. Finally the glide time is for portamento and master volume, well, the master volume... it can go quite loud.
The sequencer is changed too, It's more like the one in AXS if you've used that, where you can mute tracks to re-use patterns with variation.
<pre>
Support for the following modules formats:
669 (Composer 669, Unis 669),
AMF (DSMI Advanced Module Format),
AMF (ASYLUM Music Format V1.0),
APUN (APlayer), DSM (DSIK internal format),
FAR (Farandole Composer),
GDM (General DigiMusic),
IT (Impulse Tracker),
IMF (Imago Orpheus),
MOD (15 and 31 instruments),
MED (OctaMED),
MTM (MultiTracker Module editor),
OKT (Amiga Oktalyzer),
S3M (Scream Tracker 3),
STM (Scream Tracker),
STX (Scream Tracker Music Interface Kit),
ULT (UltraTracker),
UNI (MikMod),
XM (FastTracker 2),
Mid (midi format via timidity)
</pre>
Possible plugin options include [http://lv2plug.in/ LV2],
====Midi - Musical Instrument Digital Interface====
A midi file typically contains music that plays on up to 16 channels (as per the midi standard), but many notes can simultaneously play on each channel (depending on the limit of the midi hardware playing it).
'''Timidity'''
Although usually already installed, you can uncompress the [http://www.libsdl.org/projects/SDL_mixer/ timidity.tar.gz (14MB)] into a suitable drawer like below's SYS:Extras/Audio/
assign timidity: SYS:Extras/Audio/timidity
added to SYSːs/User-Startup
'''WildMidi playback'''
'''Audio Evolution 4 (2003) 4.0.23 (from 2012)'''
*Sync Menu - CAMD Receive, Send checked
*Options Menu - MIDI Machine Control - Midi Bar Display - Select CAMD MIDI in / out - Midi Remote Setup
MCB Master Control Bus
*Sending a MIDI start-command and a Song Position Pointer, you can synchronize audio with an external MIDI sequencer (like B&P).
*B&P Receive, start AE, add AudioEvolution.ptool in Bars&Pipes track, press play / record in AE then press play in Pipes
*CAMD Receive, receive MIDI start or continue commands via camd.library sync to AE
*MIDI Machine Control
*Midi Bar Display
*Select CAMD MIDI in / out
*Midi Remote Setup - open requester for external MIDI controllers to control app mixer and transport controls cc remotely
Channel - mixer(vol, pan, mute, solo), eq, aux, fx,
Subgroup - Volume, Mute, Solo
Transport - Start, End, Play, Stop, Record, Rewind, Forward
Misc - Master vol., Bank Down, Bank up
<pre>
q - quit
First 3 already opened when AE started
F1 - timeline window
F2 - mixer
F3 - control
F4 - subgroups
F5 - aux returns
F6 - sample list
i - Load sample to use
space - start/stop play
b - reset time 0:00
s - split mode
r - open recording window
a - automation edit mode with p panning, m mute and v volume
[ / ] - zoom in / out
: - previous track
* - next track
x c v f - cut copy paste cross-fade
g - snap grid
</pre>
'''[http://bnp.hansfaust.de/ Bars n Pipes sequencer]'''
BarsnPipes debug ... in shell
Menu (right mouse)
*Song - Songs load and save in .song format but option here to load/save Midi_Files .mid in FORMAT0 or FORMAT1
*Track -
*Edit -
*Tool -
*Timing - SMTPE Synchronizing
*Windows -
*Preferences - Multiple MIDI-in option
Windows (some of these are usually already opened when Bars n Pipes starts up for the first time)
*Workflow -> Tracks, .... Song Construction, Time-line Scoring, Media Madness, Mix Maestro,
*Control -> Transport (or mini one), Windows (which collects all the Windows icons together-shortcut), .... Toolbox, Accessories, Metronome,
Once you have your windows placed on the screen that suits your workflow, Song -> Save as Default will save the positions, colors, icons, etc as you'd like them
If you need a particular setup of Tracks, Tools, Tempos etc, you save them all as a new song you can load each time
Right mouse menu -> Preferences -> Environment... -> ScreenMode - Linkages for Synch (to Slave) usbmidi.out.0 and Send (Master) usbmidi.in.0 - Clock MTC
'''Tracks'''
#Double-click on B&P's icon. B&P will then open with an empty Song. You can also double-click on a song icon to open a song in B&P.
#Choose a track. The B&P screen will contain a Tracks Window with a number of tracks shown as pipelines (Track 1, Track 2, etc...). To choose a track, simply click on the gray box to show an arrow-icon to highlight it. This icon show whether a track is chosen or not. To the right of the arrow-icon, you can see the icon for the midi-input. If you double-click on this icon you can change the MIDI-in setup.
#Choose Record for the track. To the right of the MIDI-input channel icon you can see a pipe. This leads to another clickable icon with that shows either P, R or M. This stands for Play, Record or Merge. To change the icon, simply click on it. If you choose P, this track can only play the track (you can't record anything). If you choose R, you can record what you play and it overwrites old stuff in the track. If you choose M, you merge new records with old stuff in the track. Choose R now to be able to make a record.
#Chose MIDI-channel. On the most right part of the track you can see an icon with a number in it. This is the MIDI-channel selector. Here you must choose a MIDI-channel that is available on your synthesizer/keyboard. If you choose General MIDI channel 10, most synthesizer will play drum sounds. To the left of this icon is the MIDI-output icon. Double-click on this icon to change the MIDI-output configuration.
#Start recording. The next step is to start recording. You must then find the control buttons (they look like buttons on a CD-player). To be able to make a record. you must click on the R icon. You can simply now press the play button (after you have pressed the R button) and play something on you keyboard. To playback your composition, press the Play button on the control panel.
#Edit track. To edit a track, you simply double click in the middle part of a track. You will then get a new window containing the track, where you can change what you have recorded using tools provided. Take also a look in the drop-down menus for more features.
Videos to help understand [https://www.youtube.com/watch?v=A6gVTX-9900 small intro], [https://www.youtube.com/watch?v=abq_rUTiSA4&t=3s Overview], [https://www.youtube.com/watch?v=ixOVutKsYQo Workplace Setup CC PC Sysex], [https://www.youtube.com/watch?v=dDnJLYPaZTs Import Song], [https://www.youtube.com/watch?v=BC3kkzPLkv4 Tempo Mapping], [https://www.youtube.com/watch?v=sd23kqMYPDs ptool Arpeggi-8], [https://www.youtube.com/watch?v=LDJq-YxgwQg PlayMidi Song], [https://www.youtube.com/watch?v=DY9Pu5P9TaU Amiga Midi], [https://www.youtube.com/watch?v=abq_rUTiSA4 Learning Amiga bars and Pipes],
Groups like [https://groups.io/g/barsnpipes/topics this] could help
'''Tracks window'''
* blue "1 2 3 4 5 6 7 8 Group" and transport tape deck VCR-type controls
* Flags
* [http://theproblem.alco-rhythm.com/org/bp.html Track 1, Track2, to Track 16, on each Track there are many options that can be activated]
Each Track has a
*Left LHS - Click in grey box to select what Track to work on, Midi-In ptool icon should be here (5pin plug icon), and many more from the Toolbox on the Input Pipeline
*Middle - (P, R, M) Play, Record, Merge/Multi before the sequencer line and a blue/red/yellow (Thru Mute Play) Tap
*Right RHS - Output pipeline, can have icons placed uopn it with the final ptool icon(s) being the 5pin icon symbol for Midi-OUT
Clogged pipelines may need Esc pressed several times
'''Toolbox (tools affect the chosen pipeline)'''
After opening the Toolbox window you can add extra Tools (.ptool) for the pipelines like keyboard(virtual), midimonitor, quick patch, transpose, triad, (un)quantize, feedback in/out, velocity etc
right mouse -> Toolbox menu option -> Install Tool... and navigate to Tool drawer (folder) and select requried .ptool
Accompany B tool to get some sort of rythmic accompaniment, Rythm Section and Groove Quantize are examples of other tools that make use of rythms
[https://aminet.net/search?query=bars Bars & Pipes pattern format .ptrn] for drawer (folder). Load from the Menu as Track or Group
'''Accessories (affect the whole app)'''
Accessories -> Install... and goto the Accessories drawer for .paccess like adding ARexx scripting support
'''Song Construction'''
<pre>
F1 Pencil
F2 Magic Wand
F3 Hand
F4 Duplicator
F5 Eraser
F6 Toolpad
F7 Bounding box
F8 Lock to A-B-A
A-B-A strip, section, edit flags, white boxes,
</pre>
Bars&Pipes Professional offers three track formats; basic song tracks, linear tracks — which don't loop — and finally real‑time tracks. The difference between them is that both song and linear tracks respond to tempo changes, while real‑time tracks use absolute timing, always trigger at the same instant regardless of tempo alterations
'''Tempo Map'''
F1 Pencil
F2 Magic Wand
F3 Hand
F4 Eraser
F5 Curve
F6 Toolpad
Compositions
Lyrics, Key, Rhythm, Time Signature
'''Master Parameters'''
Key, Scale/Mode
'''Track Parameters'''
Dynamics
'''Time-line Scoring'''
'''Media Madness'''
'''Mix Maestro'''
*ACCESSORIES Allows the importation of other packages and additional modules
*CLIPBOARD Full cut, copy and paste operations, enabling user‑definable clips to be shared between tracks.
*INFORMATION A complete rundown on the state of the current production and your machine.
*MASTER PARAMETERS Enables global definition of time signatures, lyrics, scales, chords, dynamics and rhythm changes.
*MEDIA MADNESS A complete multimedia sequencer which allows samples, stills, animation, etc
*METRONOME Tempo feedback via MIDI, internal Amiga audio and colour cycling — all three can be mixed and matched as required.
*MIX MAESTRO Completely automated mixdown with control for both volume and pan. All fader alterations are memorised by the software
*RECORD ACTIVATION Complete specification of the data to be recorded/merged. Allows overdubbing of pitch‑bend, program changes, modulation etc
*SET FLAGS Numeric positioning of location and edit flags in either SMPTE or musical time
*SONG CONSTRUCTION Large‑scale cut and paste of individual measures, verses or chorus, by means of bounding box and drag‑n‑drop mouse selections
*TEMPO MAP Tempo change using a variety of linear and non‑linear transition curves
*TEMPO PALETTE Instant tempo changes courtesy of four user‑definable settings.
*TIMELINE SCORING Sequencing of a selection of songs over a defined period — ideal for planning an entire set for a live performance.
*TOOLBOX Selection screen for the hundreds of signal‑processing tools available
*TRACKS Opens the main track window to enable recording, editing and the use of tools.
*TRANSPORT Main playback control window, which also provides access to user‑ defined flags, loop and punch‑in record modes.
Bars and Pipes Pro 2.5 is using internal 4-Byte IDs, to check which kind of data are currently processed.
Especially in all its files the IDs play an important role. The IDs are stored into the file in the same order they are laid out in the memory.
In a Bars 'N' Pipes file (no matter which kind) the ID "NAME" (saved as its ANSI-values) is stored on a big endian system (68k-computer) as "NAME". On a little endian system (x86 PC computer) as "EMAN". The target is to make the AROS-BnP compatible to songs, which were stored on a 68k computer (AMIGA).
If possible, setting MIDI channels for Local Control for your keyboard
http://www.fromwithin.com/liquidmidi/archive.shtml
MIDI files are essentially a stream of event data. An event can be many things, but typically "note on", "note off", "program change", "controller change", or messages that instruct a MIDI compatible synth how to play a given bit of music.
* Channel - 1 to 16 -
* Messages - PC presets, CC effects like delays, reverbs, etc
* Sequencing - MIDI instruments, Drums, Sound design,
* Recording -
* GUI - Piano roll or Tracker, Staves and Notes
MIDI events/messages like step entry e.g. Note On, Note Off
MIDI events/messages like PB, PC, CC, Mono and Poly After-Touch, Sysex, etc
MIDI sync - Midi Clocks (SPS Measures), Midi Time Code (h, m, s and frames) SMPTE
Individual track editing with audition edits so easier to test any changes. Possible to stop track playback, mix clips from the right edit flag and scroll the display using arrow keys.
Step entry, to extend a selected note hit the space bar and the note grows accordingly. Ability to cancel mouse‑driven edits by simply clicking the right mouse button — at which point everything snaps back into its original form. Lyrics can now be put in with syllable dividers, even across an entire measure or section. Autoranging when you open a edit window, the notes are automatically displayed — working from the lowest upwards.
Flag editing, shift‑click on a flag immediately open the bounds window, ready for numeric input. Ability to cancel edits using the right‑hand mouse button, plus much improved Bounding Box operations.
Icons other than the BarsnPipes icon -> PUBSCREEN=BarsnPipes (cannot choose modes higher than 8bit 256 colors)
Preferences -> Menu in Tracks window - Send MIDI defaults OFF
Prefs -> Environment -> screenmode (saved to BarsnPipes.prefs binary file)
Customization -> pics in gui drawer (folder) -
Can save as .song files and .mid General Midi
SMF is a “Standard Midi File” ([http://www.music.mcgill.ca/~ich/classes/mumt306/StandardMIDIfileformat.html SMF0, SMF1 and SMF2]), [https://github.com/stump/libsmf libsmf], [https://github.com/markc/midicomp MIDIcomp], [https://github.com/MajicDesigns/MD_MIDIFile C++ src], [], [https://github.com/newdigate/midi-smf-reader Midi player],
* SMF0 All MIDI data is stored in one track only, separated exclusively by the MIDI channel.
* SMF1 The MIDI data is stored in separate tracks/channels.
* SMF2 (rarely used) The MIDI data is stored in separate tracks, which are additionally wrapped in containers, so it's possible to have e.g. several tracks using the same MIDI channels.
Would it be possible to enrich Bars N’Pipes with software synth and sample support along with audio recording and mastering tools like in the named MAC or PC music sequencers?
On the classic AMIGA-OS this is not possible because of missing CPU-power. The hardware of the classic AMIGA is not further developed. So we must say (unfortunately) that those dreams can’t become reality
BarsnPipes is best used with external MIDI-equipment. This can be a keyboard or synthesizer with MIDI-connectors.
<pre>
MIDI can control 16 channels
There are USB-MIDI-Interfaces on the market with 16 independent MIDI-lines (multi-port), which can handle 16 MIDI devices independently – 16×16 = 256 independent MIDI-channels or instruments
handle up to 16 different USB-MIDI-Interfaces (multi-device). That is: 16X16X16 = 4096 independent MIDI-channels – theoretically
</pre>
<pre>
Librarian MIDI SYStem EXplorer (sysex) - PatchEditor and used to be supplied as a separate program like PatchMeister but currently not at present
It should support MIDI.library (PD), BlueRibbon.library (B&P), TriplePlayPlus, and CAMD.library (DeluxeMusic) and
MIDI information from a device's user manual and configure a custom interface to access parameters for all MIDI products connected to the system
Supports ALL MIDI events and the Patch/Librarian data is stored in MIDI standard format
Annette M.Crowling, Missing Link Software, Inc.
</pre>
Composers
<pre>
[https://x.com/hirasawa/status/1403686519899054086 Susumu Hirasawa]
</pre>
<pre>
1988 Todor Fay and his wife Melissa Jordan Gray, who founded the Blue Ribbon Inc
1992 Bars&Pipes Pro published
November 2000, Todor Fay announcement to release the sourcecode of Bars&Pipes Pro 2.5c beta
end of May 2001, the source of the main program and the sources of some tools and accessories were in a complete and compileable state
end of October 2009 stop further development of BarsnPipes New for now on all supported systems and made freeware
2013 Alfred Faust diagnosed with incureable illness, called „Myastenia gravis“ (weak muscles)
</pre>
Protrekkr
How to use Midi In/Out in Protrekkr ?
First of all, midi in & out capabilities of this program are rather limited.
# Go to Misc. Setup section and select a midi in or out device to use (ptk only supports one device at a time).
# Go to instrument section, and select a MIDI PRG (the default is N/A, which means no midi program selected).
# Go to track section and here you can assign a midi channel to each track of ptk.
# Play notes :]. Note off works. F'x' note cut command also works too, and note-volume command (speed) is supported.
Also, you can change midicontrollers in the tracker, using '90' in the panning row:
<pre>
C-3 02 .. .. 0000....
--- .. .. 90 xxyy.... << This will set the value
--- .. .. .. 0000.... of the controller n.'xx' to 'yy' (both in hex)
--- .. .. .. 0000....
</pre>
So "--- .. .. 90 2040...." will set the controller number $20(32) to $40(64).
You will need the midi implementation table of your gear to know what you can change with midi controller messages.
N.B. Not all MIDI devices are created equal!
Although the MIDI specification defines a large range of MIDI messages of various kinds, not every MIDI device is required to work in exactly the same way and respond to all the available messages and ways of working. For example, we don't expect a wind synthesiser to work in the same way as a home keyboard.
Some devices, the older ones perhaps, are only able to respond to a single channel. With some of those devices that channel can be altered from the default of 1 (probably) to another channel of the 16 possible.
Other devices, for instance monophonic synthesisers, are capable of producing just one note at a time, on one MIDI channel. Others can produce many notes spread across many channels.
Further devices can respond to, and transmit, "breath controller" data (MIDI controller number 2 (CC#2)) others may respond to the reception of CC#2 but not be able to create and to send it.
A controller keyboard may be capable of sending "expression pedal" data, but another device may not be capable of responding to that message.
Some devices just have the basic GM sound set. The "voice" or "instrument" is selected using a "Program Change" message on its own.
Other devices have a greater selection of voices, usually arranged in "banks", and the choice of instrument is made by responding to "Bank Select MSB" (MIDI controller 0 (CC#0)), others use "Bank Select LSB" (MIDI controller number 32 (CC#32)), yet others use both MSB and LSB sent one after the other, all followed by the Program Change message. The detailed information about all the different voices will usually be available in a published MIDI Data List.
MIDI Implementation Chart
But in the User Manual there is sometimes a summary of how the device works, in terms of MIDI, in the chart at the back of the manual, the MIDI Implementation Chart.
If you require two devices to work together you can compare the two implementation charts to see if they are "compatible". In order to do this we will need to interpret that chart.
The chart is divided into four columns headed "Function", "Transmitted" (or "Tx"), "Received" (or "Rx"), or more correctly "Recognised", and finally, "Remarks".
<pre>
The left hand column defines which MIDI functions are being described.
The 2nd column defines what the device in question is capable of transmitting to another device.
The 3rd column defines what the device is capable of responding to.
The 4th column is for explanations of the values contained within these previous two columns.
</pre>
There should then be twelve sections, with possibly a thirteenth containing extra "Notes". Finally there should be an explanation of the four MIDI "modes" and what the "X" and the "O" mean.
<pre>
Mode 1: Omni On, Poly;
Mode 2: Omni On, Mono;
Mode 3: Omni Off, Poly;
Mode 4: Omni Off, Mono.
</pre>
O means "yes" (implemented), X means "no" (not implemented).
Sometimes you will find a row of asterisks "**************", these seem to indicate that the data is not applicable in this case. Seen in the transmitted field only (unless you've seen otherwise).
Lastly you may find against some entries an asterisk followed by a number e.g. *1, these will refer you to further information, often on a following page, giving more detail.
Basic Channel
But the very first set of boxes will tell us the "Basic Channel(s)" that the device sends or receives on.
"Default" is what happens when the device is first turned on, "changed" is what a switch of some kind may allow the device to be set to.
For many devices e.g. a GM sound module or a home keyboard, this would be 1-16 for both. That is it can handle sending and receiving on all MIDI channels.
On other devices, for example a synthesiser, it may by default only work on channel 1. But the keyboard could be "split" with the lower notes e.g. on channel 2. If the synth has an arppegiator, this may be able to be set to transmit and or receive on yet another channel.
So we might see the default as "1" but the changed as "1-16".
Modes.
We need to understand Omni On and Off, and Mono and Poly, then we can decipher the four modes.
But first we need to understand that any of these four Mode messages can be sent to any MIDI channel. They don't necessarily apply to the whole device.
If we send an "Omni On" message (CC#125) to a MIDI channel of a device, we are, in effect, asking it to respond to e.g. a Note On / Off message pair, received on any of the sixteen channels. Sound strange? Read it again. Still strange? It certainly is. We normally want a MIDI channel to respond only to Note On / Off messages sent on that channel, not any other. In other words, "Omni Off".
So "Omni Off" (CC#124) tells a channel of our MIDI device to respond only to messages sent on that MIDI channel.
"Poly" (CC#127) is for e.g. a channel of a polyphonic sound module, or a home keyboard, to be able to respond to many simultaneous Note On / Off message pairs at once and produce musical chords.
"Mono" (CC#126) allows us to set a channel to respond as if it were e.g. a flute or a trumpet, playing just one note at a time. If the device is capable of it, then the overlapping of notes will produce legato playing, that is the attack portion of the second note of two overlapping notes will be removed resulting in a "smoother" transition.
So a channel with a piano voice assigned to it will have Omni Off, Poly On (Mode 3), a channel with a saxophone voice assigned could be Omni Off, Mono On (Mode 4).
We call these combinations the four modes, 1 to 4, as defined above.
Most modern devices will have their channels set to Mode 3 (Omni Off, Poly) but be switchable, on a per channel basis, to Mode 4 (Omni Off, Mono).
This second section of data will include first its default value i.e. upon device switch on. Then what Mode messages are acceptable, or X if none.
Finally, in the "Altered" field, how a Mode message that can't be implemented will be interpreted. Usually there will just be a row of asterisks effectively meaning nothing will be done if you try to switch to an unimplemented mode.
Note Number
<pre>
The next row will tell us which MIDI notes the device can send or receive, normally 0-127.
The second line, "True Voice" has the following in the MIDI specification:
"Range of received note numbers falling within the range of true notes produced by the instrument."
My interpretation is that, for instance, a MIDI piano may be capable of sending all MIDI notes (0 to 127) by transposition, but only responding to the 88 notes (21 to 108) of a real piano.
</pre>
Velocity
This will tell us whether the device we're looking at will handle note velocity, and what range from 1-127, or maybe just 64, it transmits or will recognise. So usually "O" plus a range or "X" for not implemented.
After touch
This may have one or two lines two it.
If a one liner the either "O" or "X", yes or no.
If a two liner then it may include "Keys" or "Poly" and "Channel".
This will show whether the device will respond to Polyphonic after touch or channel after touch or neither.
Pitch Bend
Again "O" for implemented, "X" for not implemented.
(Many stage pianos will have no pitch bend capability.)
It may also, in the notes section, state whether it will respond to the full 14 bits, or not, as usually encoded by the pitch bend wheel.
Control Change
This is likely to be the largest section of the chart.
It will list all those controllers, starting from CC#0, Bank Select MSB, which the device is capable of sending, and those that it will respond to using "O" or "X" respectively.
You will, almost certainly, get some further explanation of functionality in the remarks column, or in more detail elsewhere in the documentation.
Of course you will need to know what all the various controller numbers do. Lots of the official technical specifications can be found at the [www.midi.org/techspecs/ MMA], with the table of messages and control change [www.midi.org/techspecs/midimessages.php message numbers]
Program Change
Again "O" or "X" in the Transmitted or Recognised column to indicate whether or not the feature is implemented. In addition a range of numbers is shown, typically 0-127, to show what is available.
True # (number): "The range of the program change numbers which correspond to the actual number of patches selected."
System Exclusive
Used to indicate whether or not the device can send or recognise System Exclusive messages. A short description is often given in the Remarks field followed by a detailed explanation elsewhere in the documentation.
System Common - These include the following:
<pre>
MIDI Time Code Quarter Frame messages (device synchronisation).
Song Position Pointer
Song Select
Tune Request
</pre>
The section will indicate whether or not the device can send or respond to any of these messages.
System Real Time
These include the following:
<pre>
Timing Clock - often just written as "Clock"
Start
Stop
Continue
</pre>
These three are usually just referred to as "Commands" and listed.
Again the section will indicate which, if any, of these messages the device can send or respond to.
<pre>
Aux. Messages
Again "O" or "X" for implemented or not.
Aux. = Auxiliary.
Active Sense = Active Sensing.
</pre>
Often with an explanation of the action of the device.
Notes
The "Notes" section can contain any additional comments to clarify the particular implementation.
Some of the explanations have been drawn directly from the MMA MIDI 1.0 Detailed Specification.
And the detailed explanation of some of the functions will be found there, or in the General MIDI System Level 1 or General MIDI System Level 2 documents also published by the MMA.
OFFICIAL MIDI SPECIFICATIONS
SUMMARY OF MIDI MESSAGES
Table 1 - Summary of MIDI Messages
The following table lists the major MIDI messages in numerical (binary) order (adapted from "MIDI by the Numbers" by D. Valenti, Electronic Musician 2/88, and updated by the MIDI Manufacturers Association.). This table is intended as an overview of MIDI, and is by no means complete.
WARNING! Details about implementing these messages can dramatically impact compatibility with other products. We strongly recommend consulting the official MIDI Specifications for additional information.
MIDI 1.0 Specification
Message Summary Channel Voice Messages [nnnn = 0-15 (MIDI Channel Number 1-16)]
{| class="wikitable sortable" width="90%"
! width="10%" |Status D7----D0
! width="10%" |Data Byte(s) D7----D0
! width="20%" |Description
|-
|<!--Status-->1000nnnn || <!--Data-->0kkkkkkk 0vvvvvvv || <!--Description-->Note Off event.
This message is sent when a note is released (ended). (kkkkkkk) is the key (note) number. (vvvvvvv) is the velocity.
|-
|<!--Status-->1001nnnn || <!--Data-->0kkkkkkk 0vvvvvvv || <!--Description-->Note On event.
This message is sent when a note is depressed (start). (kkkkkkk) is the key (note) number. (vvvvvvv) is the velocity.
|-
|<!--Status-->1010nnnn || <!--Data-->0kkkkkkk 0vvvvvvv || <!--Description-->Polyphonic Key Pressure (Aftertouch).
This message is most often sent by pressing down on the key after it "bottoms out". (kkkkkkk) is the key (note) number. (vvvvvvv) is the pressure value.
|-
|<!--Status-->1011nnnn || <!--Data-->0ccccccc 0vvvvvvv || <!--Description-->Control Change.
This message is sent when a controller value changes. Controllers include devices such as pedals and levers. Controller numbers 120-127 are reserved as "Channel Mode Messages" (below). (ccccccc) is the controller number (0-119). (vvvvvvv) is the controller value (0-127).
|-
|<!--Status-->1100nnnn || <!--Data-->0ppppppp || <!--Description-->Program Change. This message sent when the patch number changes. (ppppppp) is the new program number.
|-
|<!--Status-->1101nnnn || <!--Data-->0vvvvvvv || <!--Description-->Channel Pressure (After-touch). This message is most often sent by pressing down on the key after it "bottoms out". This message is different from polyphonic after-touch. Use this message to send the single greatest pressure value (of all the current depressed keys). (vvvvvvv) is the pressure value.
|-
|<!--Status-->1110nnnn || <!--Data-->0lllllll 0mmmmmmm || <!--Description-->Pitch Bend Change. This message is sent to indicate a change in the pitch bender (wheel or lever, typically). The pitch bender is measured by a fourteen bit value. Center (no pitch change) is 2000H. Sensitivity is a function of the receiver, but may be set using RPN 0. (lllllll) are the least significant 7 bits. (mmmmmmm) are the most significant 7 bits.
|}
Channel Mode Messages (See also Control Change, above)
{| class="wikitable sortable" width="90%"
! width="10%" |Status D7----D0
! width="10%" |Data Byte(s) D7----D0
! width="20%" |Description
|-
|<!--Status-->1011nnnn || <!--Data-->0ccccccc 0vvvvvvv || <!--Description-->Channel Mode Messages.
This the same code as the Control Change (above), but implements Mode control and special message by using reserved controller numbers 120-127. The commands are:
*All Sound Off. When All Sound Off is received all oscillators will turn off, and their volume envelopes are set to zero as soon as possible c = 120, v = 0: All Sound Off
*Reset All Controllers. When Reset All Controllers is received, all controller values are reset to their default values. (See specific Recommended Practices for defaults) c = 121, v = x: Value must only be zero unless otherwise allowed in a specific Recommended Practice.
*Local Control. When Local Control is Off, all devices on a given channel will respond only to data received over MIDI. Played data, etc. will be ignored. Local Control On restores the functions of the normal controllers.
c = 122, v = 0: Local Control Off
c = 122, v = 127: Local Control On
* All Notes Off. When an All Notes Off is received, all oscillators will turn off.
c = 123, v = 0: All Notes Off (See text for description of actual mode commands.)
c = 124, v = 0: Omni Mode Off
c = 125, v = 0: Omni Mode On
c = 126, v = M: Mono Mode On (Poly Off) where M is the number of channels (Omni Off) or 0 (Omni On)
c = 127, v = 0: Poly Mode On (Mono Off) (Note: These four messages also cause All Notes Off)
|}
System Common Messages
System Messages (0xF0)
The final status nybble is a “catch all” for data that doesn’t fit the other statuses. They all use the most significant nybble (4bits) of 0xF, with the least significant nybble indicating the specific category.
The messages are denoted when the MSB of the second nybble is 1. When that bit is a 0, the messages fall into two other subcategories.
System Common
If the MSB of the second second nybble (4 bits) is not set, this indicates a System Common message. Most of these are messages that include some additional data bytes.
System Common Messages
Type Status Byte Number of Data Bytes Usage
<pre>
Time Code Quarter Frame 0xF1 1 Indicates timing using absolute time code, primarily for synthronization with video playback systems. A single location requires eight messages to send the location in an encoded hours:minutes:seconds:frames format*.
Song Position 0xF2 2 Instructs a sequencer to jump to a new position in the song. The data bytes form a 14-bit value that expresses the location as the number of sixteenth notes from the start of the song.
Song Select 0xF3 1 Instructs a sequencer to select a new song. The data byte indicates the song.
Undefined 0xF4 0
Undefined 0xF5 0
Tune Request 0xF6 0 Requests that the receiver retunes itself**.
</pre>
*MIDI Time Code (MTC) is significantly complex. Please see the MIDI Specification
**While modern digital instruments are good at staying in tune, older analog synthesizers were prone to tuning drift. Some analog synthesizers had an automatic tuning operation that could be initiated with this command.
System Exclusive
If you’ve been keeping track, you’ll notice there are two status bytes not yet defined: 0xf0 and 0xf7. These are used by the System Exclusive message, often abbreviated at SysEx. SysEx provides a path to send arbitrary data over a MIDI connection. There is a group of predefined messages for complex data, like fine grained control of MIDI Time code machinery. SysEx is also used to send manufacturer defined data, such as patches, or even firmware updates.
System Exclusive messages are longer than other MIDI messages, and can be any length. The messages are of the following format:
0xF0, 0xID, 0xdd, ...... 0xF7
The message is bookended with distinct bytes.
It opens with the Start Of Exclusive (SOX) data byte, 0xF0.
The next one to three bytes after the start are an identifier.
Values from 0x01 to 0x7C are one-byte vendor IDs, assigned to manufacturers who were involved with MIDI at the beginning.
If the ID is 0x00, it’s a three-byte vendor ID - the next two bytes of the message are the value.
<pre>
ID 0x7D is a placeholder for non-commercial entities.
ID 0x7E indicates a predefined Non-realtime SysEx message.
ID 0x7F indicates a predefined Realtime SysEx message.
</pre>
After the ID is the data payload, sent as a stream of bytes.
The transfer concludes with the End of Exclusive (EOX) byte, 0xF7.
The payload data must follow the guidelines for MIDI data bytes – the MSB must not be set, so only 7 bits per byte are actually usable. If the MSB is set, it falls into three possible scenarios.
An End of Exclusive byte marks the ordinary termination of the SysEx transfer.
System Real Time messages may occur within the transfer without interrupting it. The recipient should handle them independently of the SysEx transfer.
Other status bytes implicitly terminate the SysEx transfer and signal the start of new messages.
Some inexpensive USB-to-MIDI interfaces aren’t capable of handling messages longer than four bytes.
{| class="wikitable sortable" width="90%"
! width="10%" |Status D7----D0
! width="10%" |Data Byte(s) D7----D0
! width="20%" |Description
|-
|<!--Status-->11110000 || <!--Data-->0iiiiiii [0iiiiiii 0iiiiiii] 0ddddddd --- --- 0ddddddd 11110111 || <!--Description-->System Exclusive.
This message type allows manufacturers to create their own messages (such as bulk dumps, patch parameters, and other non-spec data) and provides a mechanism for creating additional MIDI Specification messages. The Manufacturer's ID code (assigned by MMA or AMEI) is either 1 byte (0iiiiiii) or 3 bytes (0iiiiiii 0iiiiiii 0iiiiiii). Two of the 1 Byte IDs are reserved for extensions called Universal Exclusive Messages, which are not manufacturer-specific. If a device recognizes the ID code as its own (or as a supported Universal message) it will listen to the rest of the message (0ddddddd). Otherwise, the message will be ignored. (Note: Only Real-Time messages may be interleaved with a System Exclusive.)
|-
|<!--Status-->11110001 || <!--Data-->0nnndddd || <!--Description-->MIDI Time Code Quarter Frame.
nnn = Message Type
dddd = Values
|-
|<!--Status-->11110010 || <!--Data-->0lllllll 0mmmmmmm || <!--Description-->Song Position Pointer.
This is an internal 14 bit register that holds the number of MIDI beats (1 beat= six MIDI clocks) since the start of the song. l is the LSB, m the MSB.
|-
|<!--Status-->11110011 || <!--Data-->0sssssss || <!--Description-->Song Select.
The Song Select specifies which sequence or song is to be played.
|-
|<!--Status-->11110100 || <!--Data--> || <!--Description-->Undefined. (Reserved)
|-
|<!--Status-->11110101 || <!--Data--> || <!--Description-->Undefined. (Reserved)
|-
|<!--Status-->11110110 || <!--Data--> || <!--Description-->Tune Request. Upon receiving a Tune Request, all analog synthesizers should tune their oscillators.
|-
|<!--Status-->11110111 || <!--Data--> || <!--Description-->End of Exclusive. Used to terminate a System Exclusive dump.
|}
System Real-Time Messages
{| class="wikitable sortable" width="90%"
! width="10%" |Status D7----D0
! width="10%" |Data Byte(s) D7----D0
! width="20%" |Description
|-
|<!--Status-->11111000 || <!--Data--> || <!--Description-->Timing Clock. Sent 24 times per quarter note when synchronization is required.
|-
|<!--Status-->11111001 || <!--Data--> || <!--Description-->Undefined. (Reserved)
|-
|<!--Status-->11111010 || <!--Data--> || <!--Description-->Start. Start the current sequence playing. (This message will be followed with Timing Clocks).
|-
|<!--Status-->11111011 || <!--Data--> || <!--Description-->Continue. Continue at the point the sequence was Stopped.
|-
|<!--Status-->11111100 || <!--Data--> || <!--Description-->Stop. Stop the current sequence.
|-
|<!--Status-->11111101 || <!--Data--> || <!--Description-->Undefined. (Reserved)
|-
|<!--Status-->11111110 || <!--Data--> || <!--Description-->Active Sensing. This message is intended to be sent repeatedly to tell the receiver that a connection is alive. Use of this message is optional. When initially received, the receiver will expect to receive another Active Sensing message each 300ms (max), and if it does not then it will assume that the connection has been terminated. At termination, the receiver will turn off all voices and return to normal (non- active sensing) operation.
|-
|<!--Status-->11111111 || <!--Data--> || <!--Description-->Reset. Reset all receivers in the system to power-up status. This should be used sparingly, preferably under manual control. In particular, it should not be sent on power-up.
|}
Advanced Messages
Polyphonic Pressure (0xA0) and Channel Pressure (0xD0)
Some MIDI controllers include a feature known as Aftertouch. While a key is being held down, the player can press harder on the key. The controller measures this, and converts it into MIDI messages.
Aftertouch comes in two flavors, with two different status messages.
The first flavor is polyphonic aftertouch, where every key on the controller is capable of sending its own independent pressure information. The messages are of the following format:
<pre>
0xnc, 0xkk, 0xpp
n is the status (0xA)
c is the channel nybble
kk is the key number (0 to 127)
pp is the pressure value (0 to 127)
</pre>
Polyphonic aftertouch is an uncommon feature, usually found on premium quality instruments, because every key requires a separate pressure sensor, plus the circuitry to read them all.
Much more commonly found is channel aftertouch. Instead of needing a discrete sensor per key, it uses a single, larger sensor to measure pressure on all of the keys as a group. The messages omit the key number, leaving a two-byte format
<pre>
0xnc, 0xpp
n is the status (0xD)
c is the channel number
pp is the pressure value (0 to 127)
</pre>
Pitch Bend (0xE0)
Many keyboards have a wheel or lever towards the left of the keys for pitch bend control. This control is usually spring-loaded, so it snaps back to the center of its range when released. This allows for both upward and downward bends.
Pitch Bend Wheel
The wheel sends pitch bend messages, of the format
<pre>
0xnc, 0xLL, 0xMM
n is the status (0xE)
c is the channel number
LL is the 7 least-significant bits of the value
MM is the 7 most-significant bits of the value
</pre>
You’ll notice that the bender data is actually 14 bits long, transmitted as two 7-bit data bytes. This means that the recipient needs to reassemble those bytes using binary manipulation. 14 bits results in an overall range of 214, or 0 to 16,383. Because it defaults to the center of the range, the default value for the bender is halfway through that range, at 8192 (0x2000).
Control Change (0xB0)
In addition to pitch bend, MIDI has provisions for a wider range of expressive controls, sometimes known as continuous controllers, often abbreviated CC. These are transmitted by the remaining knobs and sliders on the keyboard controller shown below.
Continuous Controllers
These controls send the following message format:
<pre>
0xnc, 0xcc, 0xvv
n is the status (0xB)
c is the MIDI channel
cc is the controller number (0-127)
vv is the controller value (0-127)
</pre>
Typically, the wheel next to the bender sends controller number one, assigned to modulation (or vibrato) depth. It is implemented by most instruments.
The remaining controller number assignments are another point of confusion. The MIDI specification was revised in version 2.0 to assign uses for many of the controllers. However, this implementation is not universal, and there are ranges of unassigned controllers.
On many modern MIDI devices, the controllers are assignable. On the controller keyboard shown in the photos, the various controls can be configured to transmit different controller numbers. Controller numbers can be mapped to particular parameters. Virtual synthesizers frequently allow the user to assign CCs to the on-screen controls. This is very flexible, but it might require configuration on both ends of the link and completely bypasses the assignments in the standard.
Program Change (0xC0)
Most synthesizers have patch storage memory, and can be told to change patches using the following command:
<pre>
0xnc, 0xpp
n is the status (0xc)
c is the channel
pp is the patch number (0-127)
</pre>
This allows for 128 sounds to be selected, but modern instruments contain many more than 128 patches. Controller #0 is used as an additional layer of addressing, interpreted as a “bank select” command. Selecting a sound on such an instrument might involve two messages: a bank select controller message, then a program change.
Audio & Midi are not synchronized, what I can do ?
Buy a commercial software package but there is a nasty trick to synchronize both. It's a bit hardcore but works for me:
Simply put one line down to all midi notes on your pattern (use Insert key)
and go to 'Misc. Setup', adjust the latency and just search a value
that will make sound sync both audio/midi.
The stock Sin/Saw/Pulse and Rnd waveforms are too simple/common, is there a way to use something more complex/rich ?
You have to ability to redirect the waveforms of the instruments through the synth pipe by selecting the "wav" option for the oscillator you're using for this synth instrument, samples can be used as wavetables to replace the stock signals.
Sound banks like soundfont (sf2) or Kontakt2 are not supported at the moment
====DAW Audio Evolution 4====
Audio Evolution 4 gives you unsurpassed power for digital audio recording and editing on the Amiga. The latest release focusses on time-saving non-linear and non-destructive editing, as seen on other platforms. Besides editing, Audio Evolution 4 offers a wide range of realtime effects, including compression, noise gate, delays, reverb, chorus and 3-band EQ.
Whether you put them as inserts on a channel or use them as auxillaries, the effect parameters are realtime adjustable and can be fully automated. Together with all other mixing parameters, they can even be controlled remotely, using more ergonomic MIDI hardware.
Non-linear editing on the time line, including cut, copy, paste, move, split, trim and crossfade actions
The number of tracks per project(s) is unlimited .... AHI limits you to recording only two at a time. i.e. not on 8 track sound cards like the Juli@ or Phase 88.
sample file import is limited to 16bit AIFF (not AIFC, important distinction as some files from other sources can be AIFC with aiff file extension). and 16bit WAV (pcm only)
Most apps use the Music Unit only but a few apps also use Unit (0-3) instead or as well.
* Set up AHI prefs so that microphone is available. (Input option near the bottom)
stereo++ allows the audio piece to be placed anywhere and the left-right adjusted to sound positionally right
hifi best for music playback if driver supports this option
Load 16bit .aif .aiff only sample(s) to use not AIFC which can have the same ending. AIFF stands for Audio Interchange File Format
sox recital.wav recital.aiff
sox recital.wav −b 16 recital.aiff channels 1 rate 16k fade 3 norm
sox input.wav output.aiff bass −b 16 rate 48k
performs the same format translation, but also applies four effects (down-mix to one channel, sample rate change, fade-in, nomalize), and stores the result at a bit-depth of 16.
rec −c 2 radio.aiff trim 0 30:00
records half an hour of stereo audio
play existing-file.wav
24bit PCM WAV or AIFF do not work
*No stream format handling. So no way to pass on an AC3 encoded stream unmodified to the digital outputs through AHI.
*No master volume handling. Each application has to set its own volume. So each driver implements its own custom driver-mixer interface for handling master volumes, mute and preamps.
*Only one output stream. So all input gets mixed into one output.
*No automatic handling of output direction based on connected cables.
*No monitor input selection. Only monitor volume control.
select the correct input (Don't mistake enabled sound for the correct input.)
The monitor will feedback audio to the lineout and hp out no matter if you have selected the correct input to the ADC. The monitor will provide sound for any valid input. This will result in free mixing when recording from the monitor input instead of mic/line because the monitor itself will provide the hardware mixing for you. Be aware that MIC inputs will give two channel mono. Only Linein will give real stereo.
Now for the not working part. Attempt to record from linein in the AE4 record window, the right channel is noise and the left channel is distorted. Even with the recommended HIFI 16bit Stereo++ mode at 48kHz.
Channels
Monitor
Gain
Inout
Output
Advanced settings - Debugging via serial port
* Options -> Soundcard In/Out
* Options -> SampleRate
* Options -> Preferences
F6 for Sample File List
Setting a grid is easy as is measuring the BPM by marking a section of the sample. Is your kick drum track "not in time" ? If so, you're stumped in AE4 as it has no fancy variable time signatures and definitely no 'track this dodgy rhythm' function like software of the nature of Logic has. So if your drum beat is freeform you will need to work in freeform mode. (Real music is free form anyway).
If the drum *is* accurate and you are just having trouble measuring the time, I usually measure over a range of bars and set the number of beats in range to say 16 as this is more accurate, Then you will need to shift the drum track to match your grid *before* applying the grid. (probably an iterative process as when the grid is active samples snap to it, and when inactive you cannot see it).
AE4 does have ARexx but the functions are more for adding samples at set offsets and starting playback / recording.
These are the usual features found in DAWs...
* Recording digital audio, midi sequencer and mixer
* virtual VST instruments and plug-ins
* automation, group channels, MIDI channels, FX sends and returns, audio and MIDI editors and music notation editor
* different track views
* mixer and track layout (but not the same as below)
* traditional two windows (track and mixer)
Mixing - mixdown
Could not figure out how to select what part I wanted to send to the aux, set it to echo and return. Pretty much the whole echo effect. Or any effect.
Take look at page17 of the manual.
When you open the EQ / Aux send popup window you will see 4 sends. Now from the menu choose the windows menu.
Menus->Windows-> Aux Returns Window
or press F5
You will see a small window with 4 volume controls and an effects button for each. Click a button and add an effects to that aux channel, then set it up as desired (note the reverb effect has a special AUX setting that improves its use with the aux channel, not compulsory but highly useful). You set the amount of 'return' on the main mix in the Aux Return window, and the amount sent from each main mixer channel in the popup for that channel. Again the aux sends are "prefade" so the volume faders on each channel do not affect them.
Tracking
Effects - fade in
To add some echoes to some vocals, tried to add an effect on a track but did not come out. This is made more complicated as I wanted to mute a vocal but then make it echo at the muting point. Want to have one word of a vocal heard and then echoed off. But when the track is mute the echo is cancelled out.
To correctly understand what is happening here you need to study the figure at the bottom of page 15 on the manual. You will see from that that the effects are applied 'prefade' So the automation you applied will naturally mute the entire signal.
There would be a number of ways to achieve the goal,
You have three real time effects slots, one for smoothing like so
Sample -> Amplify -> Delay
Then automate the gain of the amplify block so that it effectively mutes the sample just before the delay at the appropriate moment, the echo effect should then be heard.
Getting the effects in the right order will require experimentation as they can only be added top down and it's not obvious which order they are applied to the signal, but there only two possibilities, so it wont take long to find out.
Using MUTE can cause clicks to the Amplify can be used to mute more smoothly so that's a secondary advantage.
Signal Processing -
Overdub
[[#top|...to the top]]
===Office===
====Spreadsheet Leu====
Support for some xlsx, and ods functions
====Spreadsheet Ignition====
; Needs ABIv1 to be completed before more can be done
File formats supported
* ascii #?.txt and #?.csv (single sheets with data only).
* igs and TurboCalc(WIP) #?.tc for all sheets with data, formats and formulas.
There is '''no''' support for xls, xlsx, ods or uos ([http://en.wikipedia.org/wiki/Uniform_Office_Format Uniform Unified Office Format]) at the moment.
* Always use Esc key after editing Spreadsheet cells.
* copy/paste seems to copy the first instance only so go to Edit -> Clipboard to manage the list of remembered actions.
* Right mouse click on row (1 or 2 or 3) or column header (a or b or c) to access optimal height or width of the row or column respectively
* Edit -> Insert -> Row seems to clear the spreadsheet or clears the rows after the inserted row until undo restores as it should be...
Change Sheet name by Object -> Sheet -> Properties
Click in the cell which will contain the result, and click '''down arrow button''' to the right of the formula box at the bottom of the spreadsheet and choose the function required from the list provided. Then click on the start cell and click on the bottom right corner, a '''very''' small blob, which allows stretching a bounding box (thick grey outlines) across many cells This grey bounding box can be used to '''copy a formula''' to other cells.
Object -> Cell -> Properties to change cell format - Currency only covers DM and not $, Euro, Renminbi, Yen or Pound etc.
Shift key and arrow keys selects a range of cells, so that '''formatting can be done to all highlighted cells'''.
View -> Overview then select ALL with one click (in empty cell in the top left hand corner of the sheet).
Default mode is relative cell referencing e.g. a1+a2 but absolute e.g. $a$1+$a$2 can be entered.
* #sheet-name to '''absolute''' reference another sheet-name cell unless reference() function used.
;Graphs
use shift key and arrow keys to select a bunch of cells to be graph'ed making sure that x axes represents and y axes represents
* value() - 0 value, 1 percent, 2 date, 3 time, 4 unit ...
;Dates
* Excel starts a running count from the 1st Jan 1900 and Ignition starts from 1st Jan 1AD '''(maybe this needs to change)'''
Set formatting Object -> Cell -> Properties and put date in days
;Time
Set formatting Object -> Cell -> Properties and put time in seconds taken
;Database (to be done by someone else)
type - standard, reference (bezug), search criterion (suchkriterium),
* select a bunch of cells and Object -> Database -> Define to set Datenbank (database) and Felder (fields not sure how?)
* Neu (new) or loschen (delete) to add/remove database headings e.g. Personal, Start Date, Finish Date (one per row?)
* Object -> Database -> Index to add fields (felder) like Surname, First Name, Employee ID, etc. to ?
Filtering done with dbfilter(), dbproduct() and dbposition().
Activities with dbsum(), dbaverage(), dbmin() and dbmax().
Table sorting -
;Scripts (Arexx)
;Excel(TM) to Ignition - commas ''',''' replaced by semi-colons ''';''' to separate values within functions
*SUM(),
*AVERAGE(), MAX(), MIN(), INT(), PRODUCT(), MEDIAN(), VAR() becomes Variance(), Percentile(),
*IF(), AND, OR, NOT
*LEFT(), RIGHT(), MID() becomes MIDDLE(), LEN() becomes LENGTH(),
*LOWER() becomes LOWERCASE(), UPPER() becomes UPPERCASE(),
* DATE(yyyy,mm,dd) becomes COMPUTEDATE(dd;mm;yyyy),
*TODAY(), DAY(),WEEK(), MONTH(),=YEAR(TODAY()),
*EOMONTH() becomes MONTHLENGTH(),
*NOW() should be date and time becomes time only, SECOND(), MINUTE(), HOUR(),
*DBSUM() becomes DSUM(),
;Missing and possibly useful features/functions needed for ignition to have better support of Excel files
There is no Merge and Join Text over many cells, no protect and/or freeze row or columns or books but can LOCK sheets, no define bunch of cells as a name, Macros (Arexx?), conditional formatting, no Solver, no Goal Seek, no Format Painter, no AutoFill, no AutoSum function button, no pivot tables, (30 argument limit applies to Excel)
*HLOOKUP(), VLOOKUP(), [http://production-scheduling.com/excel-index-function-most-useful/ INDEX(), MATCH()], CHOOSE(), TEXT(),
*TRIM(), FIND(), SUBSTITUTE(), CONCATENATE() or &, PROPER(), REPT(),
*[https://acingexcel.com/excel-sumproduct-function/ SUMPRODUCT()], ROUND(), ROUNDUP(), *ROUNDDOWN(), COUNT(), COUNTA(), SUMIF(), COUNTIF(), COUNTBLANK(), TRUNC(),
*PMT(), PV(), FV(), POWER(), SQRT(), MODE(), TRUE, FALSE,
*MODE(), LARGE(), SMALL(), RANK(), STDEV(),
*DCOUNT(), DCOUNTA(), WEEKDAY(),
;Excel Keyboard [http://dmcritchie.mvps.org/excel/shortx2k.htm shortcuts needed to aid usability in Ignition]
<pre>
Ctrl Z - Undo
Ctrl D - Fill Down
Ctrl R - Fill right
Ctrl F - Find
Ctrl H - Replace
Ctrl 1 - Formatting of Cells
CTRL SHIFT ~ Apply General Formatting ie a number
Ctrl ; - Todays Date
F2 - Edit cell
F4 - toggle cell absolute / relative cell references
</pre>
====Document Scanning - Scandal====
Scanner usually needs to be connected via a USB port and not via a hub or extension lead.
Check in Trident Prefs -> Devices that the USB Scanner is not bound to anything (e.g. Bindings None)
If not found then reboot the computer and recheck.
Start Scandal, choose Settings from Menu strip at top of screen and in Scanner Driver choose the ?#.device of the scanner (e.g. epson2.device).
The next two boxes - leave empty as they are for morphos SCSI use only
or put ata.device (use the selection option in bigger box below) and Unit as 0 this is needed for gt68xx
* gt68xx - no editing needed in s/gt68xx.conf but needs a firmware file that corresponds to the scanner [http://www.meier-geinitz.de/sane/gt68xx-backend/ gt68xx firmwares] in sys:s/gt68xx.
* epson2 - Need to edit the file epson2.conf in sys/s that corresponds to the scanner being used
'''Save''' the settings but do not press the Use button (aros freezes)
Back to the Picture Scan window and the right-hand sections.
Click on the '''Information''' tab and press Connect button and the scanner should now be detected.
Go next to the '''Scanner''' tab next to Information Tab should have Color, Black and White, etc. and dpi settings now. Selecting an option Color, B/W etc. can cause dpi settings corruption (especially if the settings are in one line) so set '''dpi first'''. Make sure if Preview is set or not.
In the '''Scan''' Tab, press Scan and the scanner will do its duty.
Be aware that nothing is saved to disk yet.
In the Save tab, change format JPEG, PNG or IFF DEEP. Tick incremental and base filename if necessary and then click the Save button. The image will now be saved to permanent storage.
The driver ignores a device if it is already bond to another USB class, rejects it from being usable. However, open Trident prefs, select your device and use the right mouse button to open. Select "NONE" to prevent poseidon from touching the device. Now save settings. It should always work now.
[[#top|...to the top]]
===Emulators===
==== Amiberry ====
==== Amiga Emu - Janus UAE ====
With Amibridge, AROS attempts to make the UAE emulator seem embedded within but it still is acting as an app
There is no dynarec m68k for each hardware that Aros supports or direct patching of motorola calls to AROS hardware accelerated ones unless the emulator has that included
Try starting Janus with a priority of -1 like this little script:
<pre>
cd sys:system/AmiBridge/emulator
changetaskpri -1
run janus-uae -f my_uaerc.config >nil:
cd sys:prefs
endcli
</pre>
This stops Janus hogging all the CPU time.
===Miscellaneous===
====Screensaver Blanker====
Most blankers on the amiga (i.e. aros) run as commodities (they are in the tools/commodities drawer). Double click on blanker.
Control is with an app called Exchange, which you need to run first (double click on app) or run QUIET sys:tools/commodities/Exchange >NIL: but subsequently can use (Cntrl Alt h).
Icon tool types (may be broken) or command line options
<pre>
seconds=number
</pre>
Once the timing is right then add the following to s:icaros-sequence or s:user-startup
e.g. for 5 minutes
run QUIET sys:tools/commodities/Blanker seconds=300 >NIL:
*[http://archives.aros-exec.org/index.php?function=showfile&file=graphics/screenblanker/gblanker.i386-aros.zip Garshneblanker] can make Aros unstable or slow. Certain blankers crashes in Icaros 2.0.x like Dragon, Executor.
*[ Acuario AROS version], the aquarium screen saver.
Startup: extras:acuariofv-aros/acuario
Kill: c:break name=extras:acuariofv-aros/acuario
Managed to start Acuario by the Executor blanker.
<pre>
cx_priority=
cx_popkey= ie CX_POPKEY="Shift F1"
cx_popup=Yes or No
</pre>
<pre>
Qualifier String Input Event Class
---------------- -----------------
"lshift" IEQUALIFIER_LSHIFT
"rshift" IEQUALIFIER_RSHIFT
"capslock" IEQUALIFIER_CAPSLOCK
"control" IEQUALIFIER_CONTROL
"lalt" IEQUALIFIER_LALT
"ralt" IEQUALIFIER_RALT
"lcommand" IEQUALIFIER_LCOMMAND
"rcommand" IEQUALIFIER_RCOMMAND
"numericpad" IEQUALIFIER_NUMERICPAD
"repeat" IEQUALIFIER_REPEAT
"midbutton" IEQUALIFIER_MIDBUTTON
"rbutton" IEQUALIFIER_RBUTTON
"leftbutton" IEQUALIFIER_LEFTBUTTON
"relativemouse" IEQUALIFIER_RELATIVEMOUSE
</pre>
<pre>
Synonym Synonym
String Identifier
------- ----------
"shift" IXSYM_SHIFT /* look for either shift key */
"caps" IXSYM_CAPS /* look for either shift key or capslock */
"alt" IXSYM_ALT /* look for either alt key */
Highmap is one of the following strings:
"space", "backspace", "tab", "enter", "return", "esc", "del",
"up", "down", "right", "left", "f1", "f2", "f3", "f4", "f5",
"f6", "f7", "f8", "f9", "f10", "help".
</pre>
[[#top|...to the top]]
==== World Construction Set WCS (Version 2.031) ====
WCS is a fractal landscape software such as Scenery Animator, Vista Pro and Panorama. Open sourced February 2022, World Construction Set [https://3dnature.com/downloads/legacy-software/ legally and for free] and [https://github.com/AlphaPixel/3DNature c source].
Announced August 1994 this version dates from April 1996 developed by Gary R. Huber and Chris "Xenon" Hanson" from Questar
<pre>
Assign "WCSProjects:" "Volume:Dir/Dir/WCSProjects"
Assign "WCSFrames:" "Volume:Dir/Dir/WCSFrames"
</pre>
<pre>
Load projects .proj by accessing pull down menu Project -> Open then click on CanyonSunset.proj
OK to changing .par file and enlarge Status Log window to show what is happening
Render by pull down menu Modules -> Render with End equal 1 not 300 then click bottom middle button Render
</pre>
[https://www.youtube.com/watch?v=CxQDmf1ZWG0 Youtube walkthrough of above], [], [],
Also try working with the already built file ColoDemo - Then open with the drop-down menu: Project/Open, then WCSProject:ColoDemo.proj
Which allows you to use altimetric DEM files already included and Loading scene parameters from ColoDemo.par
Once this is done, save everything with a new name to start working exclusively on your project.
Then drop-down menu and select Save As ("NewName".proj name), then drop-down menu to open parameter and select Save All ( .par name)
After launching the software, there is a the Module Control Panel composed of five icons.
It is a dock type shortcut of the first few functions of the drop-down menu
*Database - Load (#?.proj), Append, Create, Edit, Save, Dir List (of WCSProject drawer),
*Data Ops - Extract / Convert Interp DEM, Import DLG, DXF, WDB and export LW map 3d formats
*Map View - Database file Loader leading to Map View Control with option to the Database Editor
*Parameters - Editor for Motion, Color, Ecosystem, Clouds, Waves, management of altimeter files DEM, sclock settings etc
*Render - rendering terrain
These are more in the pull down menu but not in the dock
*Motion Editor
*Color Editor
*Ecosys Editor
Simple minimal workflow
*Load database (1st icon - 1st)
*Set parameters and save .par file (4th icon)
*Render scene (5th icon)
[https://www.youtube.com/watch?v=ZbTwwR2qcc4 Youtube], [],
<pre>
.proj new project name which creates a drawer of additional files
.binary array, ascii array .xyz , z buffer, DTED .dt0, vista 1990s dem, iff conversion
.Obj with .elev, .frd with .hdr maps, - digital elevation model (DEM) is a 3D representation of elevation data in various formats
USGS 7.5MinDEM,
.par
</pre>
Since for the time being no project is loaded, a query window indicates a procedural error when clicking on the rendering icon (right end of the bar). The menu is quite traditional; it varies according to the activity of the windows. To display any altimetric file in the "Mapview" (third icon of the panel), There are three possibilities:
* Loading of a demonstration project.
* The import of a DEM file, followed by texturing and packaging from the "Database-Editor" and the "Color-Editor".
* The creation of an altimetric file in WCS format, then texturing.
The altimeter file editing (display in the menu) is only made possible if the "Mapview" window is active.
The software is made up of many windows and won't be able to describe them all. Know that "Color-Editor" and the "Data-Editor" comprise sufficient functions for obtaining an almost real rendering quality. You have the possibility of inserting vector objects in the "Data-Editor" (creation of roads, railways, etc.)
The Map View (MapView) window
*Database - Objects and Topos
*View - Align, Center, Zoom, Pan, Move
*Draw - Maps and distance
*Object - Find, highlight, add points, conform topo, duplicate
*Motion - Camera, Focus, path, elevation
*Windows - DEM designer, Cloud (.cld) and wave (.wve) editor,
You will notice that by selecting this window and simply moving the pointer to various points on the map you will see latitude and longitude values change, along with the height.
Drop-down menu and Modules, then select MapView and change the width of the window with the map to arrange it in the best way on the screen. With the Auto button the center. Window that then displays the contents of my DEM file, in this case the Grand Canyon. MapView allows you to observe the shape of the landscape from above
ZOOM button
Press the Zoom button and then with the pointer position on a point on the map, press the left mouse button and then move to the opposite corner to circumscribe the chosen area and press the left mouse button again, then we will see the enlarged area selected on the map.
Would add that there is a box next to the Zoom button that allows the direct insertion of a value which, the larger it is, the smaller the magnification and the smaller the value, the stronger the magnification. At each numerical change you will need to press the DRAW button to update the view.
PAN button
Under Zoom you will find the PAN button which allows you to move the map at will in all directions by the amount you want. This is done by drawing a line in one direction, then press PAN and point to an area on the map with the pointer and press the left mouse button. At this point, leave it and move the pointer in one direction by drawing a line and press the left mouse button again to trigger the movement of the map on the screen (origin and end points). Do some experiments and then use the Auto button immediately below to recenter everything.
There are parameters such as TOPO, VEC to be left checked and immediately below one that allows different views of the map with the Style command (Single, Multi, Surface, Emboss, Slope, Contour), each with its own particularities to highlight different details.
Now you have the first basics to manage your project visually on the map. Close the MapView window and go further...
Let's start working on ECOSYSTEMS
If we select Emboss from the MapView Style command we will have a clear idea of how the landscape appears, realizing that it is a predominantly desert region of our planet. Therefore we will begin to act on any vegetation present and the appearance of the landscape.
With WCS we will begin to break down the elements of the landscape by assigning defined characteristics. It will be necessary to determine the classes of the ecosystem (Class) with parameters of Elevation Line (maximum altitude), Relative Elevation (arrangement on basins or convexities with respectively positive or negative parameters), Min Slope and Max Slope (slope). WCS offers the possibility of making ecosystems coexist on the same terrain with the UnderEco function, by setting a Density value.
Ecosys Ecosystem Editor
Let's open it from Modules, then Ecosys Editor. In the left pane you will find the list of ecosystems referring to the files present in our project. It will be necessary to clean up that box to leave only the Water and Snow landscapes and a few other predefined ones. We can do this by selecting the items and pressing the Remove button (be careful not for all elements the button is activated, therefore they cannot all be eliminated).
Once this is done we can start adding new ecosystems. Scroll through the various Unused and as soon as the Name item at the top is activated allowing you to write, type the name of your ecosystem, adding the necessary parameters.
<pre>
Ecosystem1: Name: RockBase Class: Rock Density: 80 MinSlope: 15 UnderEco: Terrain
Ecosystem2: Name: RockIncl Clss: Rock Density: 80 MinSlope: 30 UnderEco: Terrain
Ecosystem3: Name: Grass Class Low Veg Density: 50 Height: 1 Elev Line : 1500 Rel El Eff: 5
Max Slope: 10 – Min Slope: 0 UnderEco: Terrain
Ecosistema4: Name: Shrubs Class: Low Veg Density: 40 Height: 8 Elev Line: 3000
Rel El Eff: -2 Max Slope: 20 Min Slope : 5 UnderEco: Terrain
Ecosistema5: Name: Terrain Class: Ground Density: 100 UnderEco: Terrain
</pre>
Now we need to identify an intermediate ecosystem that guarantees a smooth transition between all, therefore we select as Understory Ecosystem the one called Terrain in all ecosystems, except Snow and Water .
Now we need to 'emerge' the Colorado River in the Canyon and we can do this by raising the sea level to 900 (Sea Level) in the Ecosystem called Water.
Please note that the order of the ecosystem list gives priority to those that come after. So our list must have the following order: Water, Snow, Shrubs, RockIncl, RockBase, Terrain. It is possible to carry out all movements with the Swap button at the bottom. To put order you can also press Short List. Press Keep to confirm all the work done so far with Ecosystem Editor.
Remember every now and then to save both the Project 'Modules/Save' and 'Parameter/Save All'
EcoModels are made up of .etp .fgp .iff8 for each model
Color Editor
Now it's time to define the colors of our scene and we can do this by going to Modules and then Color Editor. In the list we focus on our ecosystems, created first.
Let's go to the bottom of the list and select the first white space, assigning the name 'empty1', with a color we like and then we will find this element again in other environments... It could serve as an example for other situations!
So we move to 'grass' which already exists and assign the following colors: R 60 G 70 B50
<pre>
'shrubs': R 60 G 80 B 30
'RockIncl' R 110 G 65 B 60
'RockBase' R 110 G 80 B 80
' Terrain' R 150 G 30 B 30
<pre>
Now we can work on pre-existing colors
<pre>
'SunLight' R 150 G 130 B 130
'Haze and Fog' R 190 G 170 B 170
'Horizon' R 209 G 185 B 190
'Zenith' R 140 G 150 B 200
'Water' R 90 G 125 B 170
</pre>
Ambient R 0 G 0 B 0
So don't forget to close Color Editor by pressing Keep.
Go once again to Ecosystem Editor and assign the corresponding color to each environment by selecting it using the Ecosystem Color button. Press it several times until the correct one appears. Then save the project and parameters again, as done previously.
Motion Editor
Now it's time to take care of the framing, so let's go to Modules and then to Motion Editor. An extremely feature-rich window will open. Following is the list of parameters regarding the Camera, position and other characteristics:
<pre>
-Camera Altitude: 7.0
-Camera Latitude: 36.075
-Camera Longitude: 112.133
-Focus Attitude: -2.0
-Focus Latitude: 36.275
-Focus Longitude: 112.386
-Camera : 512 → rendering window
-Camera Y: 384 → rendering window
-View Arc: 80 → View width in degrees
-Sun Longitude: 172
-Sun Latitude: -0.9
-Haze Start: 3.8
-Haze Range: 78, 5
</pre>
As soon as the values shown in the relevant sliders have been modified, we will be ready to open the CamView window to observe the wireframe preview. Let's not consider all the controls that will appear.
Well from the Motion Editor if you have selected Camera Altitude and open the CamView panel, you can change the height of the camera by holding down the right mouse button and moving the mouse up and down. To update the view, press the Terrain button in the adjacent window. As soon as you are convinced of the position, confirm again with Keep. You can carry out the same work with the other functions of the camera, such as Focus Altitude...
Let's now see the next positioning step on the Camera map, but let's leave the CamView preview window open while we go to Modules to open the window at the same time MapView. We will thus be able to take advantage of the view from the other together with a subjective one.
From the MapView window, select with the left mouse button and while it is pressed, move the Camera as desired. To update the subjective preview, always click on Terrain.
While with the same procedure you can intervene on the direction of the camera lens, by selecting the cross and with the left button pressed you can choose the desired view. So with the pressure of Terrain I update the Preview. Possibly can enlarge or reduce the Map View using the Zoom button, for greater precision.
Also write that the circle around the cameras indicates the beginning of the haze, there are two types (haze and fog) linked to the altitude. Would also add that the camera height is editable through the Motion Editor panel.
The sun
Let's see that changing the position of the sun from the Motion Editor. Press the SUN button at the bottom right and set the time and the date. Longitude and latitude are automatically obtained by the program. Always open the View Arc command from the Motion Editor panel, an item present in the Parameter List box.
Once again confirm everything with Keep and then save again.
Animation
The animation part is not left-back and also occupies a window. The settings possibilities are enormous. A time line with dragging functions ("slide", "drag"...) comparable to that of LightWave completes this window.
A small window is available for positioning the stars as a function of a date, in order to vary the seasons and their various events (and yes...).
At the bottom of the "Motion-Editor", a "cam-view" function will give you access to a control panel. Different preview modes are possible. The rendering is also accessible through a window. No less than nine pages compose it. At this level, you will be able to determine the backup name of your images ("path"), the type of texture to be calculated, the resolution of the images, activate or deactivate functions such as the depth buffer ("zbuffer"), the blur, the background image, etc.
Once all these parameters have been set, all you have to do is click on the "Render" button.
For rendering go to Modules and then Render. Select the resolution, then under IMA select the name of the image. Move to FRA and indicate the level of fractal detail which of 4 is quite good. Then Keep to confirm and then reopen the window, pressing Render you will see the result. The image will be opened with any viewing program.
Strengths:
* Multi-window.
* Quality of rendering.
* Accuracy.
* Opening, preview and rendering on CyberGraphX screen.
* Extract / Convert Interp DEM, Import DLG, DXF, WDB and export LW map 3d formats
* The "zbuffer" function.
Weaknesses:
* No OpenGL management
* Calculation time.
* No network computing tool.
====Writing CD / DVD - Frying Pan====
Can be backup DVDs (4GB ISO size limit due to use of FileInfoBlock), create audio cds from mp3's, and put .iso files on discs
If using for the first time - click Drive button and Device set to ata.device and unit to 0 (zero)
Click Tracks Button - Drive 1 - Create New Disc or Import Existing Disc Image (iso bin/cue etc.) - Session File open cue file
If you're making a data cd, with files and drawers from your hard drive, you should be using the ISO Builder.. which is the MUI page on the left. ("Data/Audio Tracks" is on the right).
You should use the "Data/Audio tracks" page if you want to create music cds with AIFF/WAV/MP3 files, or if you download an .iso file, and you want to put it on a cd.
Click WRITE Button - set write speed - click on long Write button
Examples
Easiest way would be to burn a DATA CD, simply go to "Tracks" page "ISO Builder" and "ADD" everything you need to burn.
On the "Write" page i have "Masterize Disc (DAO)", "Close Disc" and "Eject after Write" set.
One must not "Blank disc before write" if one uses a CDR
AUDIO CD from MP3's are as easy but tricky to deal with. FP only understands one MP3 format, Layer II, everything else will just create empty tracks
Burning bootable CD's works only with .iso files. Go to "Tracks" page and "Data/Audio Tracks" and add the .iso
====odf====
Every ODF file is a collection of several subdocuments within a package (ZIP file), each of which stores part of the complete document.
* content.xml – Document content and automatic styles used in the content.
* styles.xml – Styles used in the document content and automatic styles used in the styles themselves.
* meta.xml – Document meta information, such as the author or the time of the last save action.
* settings.xml – Application-specific settings, such as the window size or printer information.
To read document follow these steps:
* Extracting .ods file.
* Getting content.xml file (which contains sheets data).
* Creating XmlDocument object from content.xml file.
* Creating DataSet (that represent Spreadsheet file).
* With XmlDocument select “table:table” elements, and then create adequate DataTables.
* Parse child’s of “table:table” element and fill DataTables with those data.
* At the end, return DataSet and show it in application’s interface.
To write document follow these steps:
* Extracting template.ods file (.ods file that we use as template).
* Getting content.xml file.
* Creating XmlDocument object from content.xml file.
* Erasing all “table:table” elements from the content.xml file.
* Reading data from our DataSet and composing adequate “table:table” elements.
* Adding “table:table” elements to content.xml file.
* Zipping that file as new .ods file.
XLS file format
The XLS file format contains streams, substreams, and records.
These sheet substreams include worksheets, macro sheets, chart sheets, dialog sheets, and VBA module sheets.
All the records in an XLS document start with a 2-byte unsigned integer to specify Record Type (rt), and another for Count of Bytes (cb). A record cannot exceed 8224 bytes. If larger than the rest is stored in one or more continue records.
* Workbook stream
**Globals substream
***BoundSheet8 record - info for Worksheet substream i.e. name, location, type, and visibility. (4bytes the lbPlyPos FilePointer, specifies the position in the Workbook stream where the sheet substream starts)
**Worksheet substream (sheet) - Cell Table - Row record - Cells (2byte=row 2byte=column 2byte=XF format)
***Blank cell record
***RK cell record 32-bit number.
***BoolErr cell record (2-byte Bes structure that may be either a Boolean value or an error code)
***Number cell record (64-bit floating-point number)
***LabelSst cell record (4-byte integer that specifies a string in the Shared Strings Table (SST). Specifically, the integer corresponds to the array index in the RGB field of the SST)
***Formula cell record (FormulaValue structure in the 8 bytes that follow the cell structure. The next 6 bytes can be ignored, and the rest of the record is a CellParsedFormula structure that contains the formula itself)
***MulBlank record (first 2 bytes give the row, and the next 2 bytes give the column that the series of blanks starts at. Next, a variable length array of cell structures follows to store formatting information, and the last 2 bytes show what column the series of blanks ends on)
***MulRK record
***Shared String Table (SST) contains all of the string values in the workbook.
ACCRINT(), ACCRINTM(), AMORDEGRC(), AMORLINC(),
COUPDAYBS(), COUPDAYS(), COUPDAYSNC(), COUPNCD(), COUPNUM(), COUPPCD(),
CUMIPMT(), CUMPRINC(),
DB(), DDB(), DISC(),
DOLLARDE(), DOLLARFR(),
DURATION(), EFFECT(), FV(), FVSCHEDULE(),
INTRATE(), IPMT(), IRR(), ISPMT(), MDURATION(), MIRR(), NOMINAL(), NPER(), NPV(),
ODDFPRICE(), ODDFYIELD(), ODDLPRICE(), ODDLYIELD(),
PMT(), PPMT(), PRICE(), PRICEDISC(), PRICEMAT(), PV(), RATE(),
RECEIVED(), SLN(), SYD(), TBILLEQ(), TBILLPRICE(), TBILLYIELD(),
VDB(), XIRR(), XNPV(), YIELD(), YIELDDISC(), YIELDMAT(),
<pre>
</pre>
<pre>
</pre>
<pre>
</pre>
{{BookCat}}
ahi8mofl9enomynn9ghw9rolz9g0nu3
JPEG - Idea and Practice/Foreword
0
246147
4676582
4654125
2026-10-18T02:35:22Z
Acrions
3509296
himself -> themselves
4676582
wikitext
text/x-wiki
<gallery widths=160px heights=216px class="center">
File:Juliasetsdkjpegforeword1.jpg|Drawing perfect but file compressed too much
File:Juliasetsdkjpegforeword2.jpg|
File:Juliasetsdkjpegforeword3.jpg|File perfect but drawing incomplete
</gallery>
When the era of digital pictures began, a serious problem arose:
* A digital picture took up a great deal of storage space.
At that time computer memory was more expensive than it is now. The memory requirements were a very significant problem. Moreover, the electronic transmission of data was slow. A method had to be found by which the data could be compressed. The compression method could lose some information. It could be acceptable to introduce small changes in colour values if the overall impression of the picture were preserved. Sadly the solution to this problem is not, as one might hope, a nice piece of mathematical work in the classical sense. It involves experiments with the ability of the human eye to discern colour nuances compared with light intensity. Strange tables appear in the procedure.
The '''JPEG method''' was a result of collaboration. JPEG stands for "Joint Photographic Expert Group". The expert group was organized in 1986 and in 1992 issued a standard for their new image file format, JPEG. Since that time this format has been the most commonly used format for storing and transmitting photos.
The JPEG method is not difficult to understand. However, it ''is'' difficult to acquire knowledge about the method, mainly because it is not a fixed and final procedure but rather a principle. The number of articles that try to explain the method is immense. They often contain misunderstandings strongly suggesting the author themselves has not made, or closely studied, a program that can produce a file or draw the picture from a file.
Hence this Wiki book.
==Parts One and Two ==
This Wiki book is divided into two parts. Each is accompanied by programs. These are closely described and used to make illustrations and experiments.
* '''Part one''' explains the idea. We have altered the method a little so that it is easier to understand. Our alterations allow us to introduce variables in order to make interesting experiments. Our method is rather simple. Naturally, it does not compress as efficiently as the real JPEG method, but it is still surprisingly good. It can compress a file so that the data take up about 7 per cent of the original data of the picture. When you have read ''part one'', you will have a good understanding of the principle of the JPEG method. If it was merely this you were looking for, you will not become very much wiser by reading ''part two''.
* '''Part two''' is based on two articles:
:# The official document (from 1992) where the method is described in full and recommended as international standard;
:# The document (also from 1992) specifying the standard for the implementation of the method which has become the most commonly used - almost all JPEG pictures you will meet are in accordance with this implementation.
We explain all the things necessary for making a program that can produce efficiently compressed JPEG files. We provide a program that can draw the pictures of the most commonly used JPEG file types. We have also made a program that can show all the most relevant information in the header part of a JPEG file. Some experience with this program can help you to understand the arrangement of a JPEG file. You can use this information (copy it or use it as guidelines), if you want to make your own JPEG compressor - for instance as a component of a program that can make computer graphics.
==About the Pictures==
All the pictures in this book were made with the program in ''part two'' - also those in ''part one'', since the files made with the demonstration program are not true JPEG files.
{{BookCat}}
cqne5jmomgakasxrmzd7e5zt6u57gm7
Chess/Arranging The Board
0
273011
4676689
4658175
2026-10-18T05:19:20Z
Mast303
3416213
4676689
wikitext
text/x-wiki
{{Chess diagram|tright
|
|rd|nd|bd|qd|kd|bd|nd|rd
|pd|pd|pd|pd|pd|pd|pd|pd
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
|pl|pl|pl|pl|pl|pl|pl|pl
|rl|nl|bl|ql|kl|bl|nl|rl
|Initial position of the chessboard
}}
Before starting the game, it's very important to arrange the board and the pieces correctly.
The rows are called ''ranks'', and the vertical squares are called ''files''.
Your chess board is an 8×8 board. Place the board in such a manner that the bottom right hand corner on your side is white ("White on the right"). On that white square, place the Rook and place the other Rook on the bottom left corner. Next to the Rooks, place the Knights, followed by the Bishops.
Wrong placement of the Queens is a common mistake. While arranging these pieces, make sure that the black Queen goes on a black square and the white Queen goes on a white square ("Queen on her own color"). The King then goes on the square next to the Queen. It is very important that you place these two pieces properly. Any game found to be set up incorrectly, i.e., King on its own color, will result in the game being voided and a restart called using the same colors.
If the board contains the file letters and rank numbers, remember that the Queen is placed on the d-file ("d for Dame"), and that White starts on the first rank.
Fill the next rank with your eight pawns and repeat for both colours. You're ready to play!
{{-}}
{{BookCat}}
<noinclude>{{Chess/Navigation|Introduction|Playing The Game}}</noinclude>
p7std59co5lgp22hzmu2uy312u0vyye
Aros/Platforms/Arm Raspberry Pi support
0
286123
4676517
4676376
2026-10-17T13:28:40Z
Jeff1138
301139
4676517
wikitext
text/x-wiki
{{ArosNav}}
[[#Native]]
[[#Hosted]]
[[#Build]]
[[#Hardware]]
[[#References]]
[[#Future]]
==Introduction==
[[File:Scalos00.png|thumb|Scalos on Aros Pi3b]]
Aros aims to cover Pi 3 to 5 512Mb+ RAM
Options to boot from using a good power source to prevent the yellow lightning symbol.
*With Pi3b+ the max you can get is 5.1V 2.5A with micro usb.
*With Pi4 5.1V 3A with usb-c
*With Pi5 5.1V 5A, the amps went ever upwards, even to 5.1V 9A with usb-c
* Pi500+ keyboard wedge - working but not much tested esp [https://github.com/aros-development-team/AROS/commit/48e9c8edcca4b5c1e1fe0b1123f2129f624af67b power button]
* Pi500 wedge with up to date bootloader via PiOS - working but not much testing esp [https://github.com/aros-development-team/AROS/commit/48e9c8edcca4b5c1e1fe0b1123f2129f624af67b power button]
* Pi 5 - Quad A76 64bit ARMv8 and RP1 "southbridge" with VideoCore 7 D0 (rev1.1) - untested
* Pi 5 - Quad A76 64bit ARMv8 and RP1 "southbridge" with VideoCore 7 Pre-D0 C1 (Rev1.0) - untested
* Pi400 RPI-400 keyboard wedge - resolution changing and audio from micro hdmi0 (near 40pin) and micro hdmi1 (near usb-c psu) - Fn F10 0x5e power on and off works or held down for over 7 seconds auto shutdown - keyboard ok - wifi and lan ethernet testing -
* Pi 4 - Quad A72 64bit ARMv8 with VideoCore 6
* Pi 3 - Quad A53 [https://www.raspberrypi.com/documentation/computers/processors.html 64 bit] ARMv8 with VideoCore 4 with '''fan''' to prevent overheating cpu 82C+ throttling
* Pi02W - Quad A53 64bit - boots but [https://forums.raspberrypi.com/viewtopic.php?p=2387984#p2387984 usb not working but did in the past],
* Pi 2 - Quad 32bit ARMv6 with VideoCore 4 - mostly not 64bit compatible
* Pi Model B+ 32bit ARMv6 with VideoCore 4 - not 64bit compatible
* Pi Model A and B 32bit ARMv6 with VideoCore 4 - not 64bit compatible
===Native===
* 2013-03 Kalamatee starts work
* 2015-04 Work continues with mschulz on the kernel and Kalamatee (NicJA) on gpio and usb
* 2018 [https://www.patreon.com/posts/i-owe-you-some-20956961 mschulz resume adding BE big endian support], [https://www.patreon.com/michal_schulz/posts Big endian on Pi]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bsek latest commits for pi 3b, 4 and 5 64bit]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=metaneutrons latest commits for Pi5]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bitplane latest commits for ARM]
====64bit====
'''Download''' A [https://archive.org/details/piAROS Pi Distribution (Distro) has started] and the contents copied to fat32 8GB+ microSD card (there will be drawers/folders - boot c Classes Demos Developer Devs Extras etc only showing). The SD can be plugged in to the Pi. And power on. [https://pi.amiga.icu/ Repository]
'''Not recommended''' but [https://aros.sourceforge.io/nightly1.html RaspberryPi 3, 3+, 4 and 5 64bit ArmV8 nightly builds] [https://sourceforge.net/projects/aros/files/ and alternative site and nightly2] which is a test version of '''very few''' apps with both raspi-aarch64-system and raspi-aarch64-contrib can be unbz2'd to a SD or SSD as appropriate.
64bit build works well on a single core LE little endian. Multicore [https://github.com/aros-development-team/AROS/commit/1df0747c2bda3523a43029725a709b1f377d84ec may follow]. Any issues booting could be down to the SD card so please use another SD to see if it is resolved. Remember Aros Arm uses FAT32 and Aros can detect issues with this format very acutely (once fault found, FAT 0x0FFFFFF7 bad cluster so no files written after that, no repair). Please report your experiences in the [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2138&pid=15057#post_15057 Aros forum thread], [https://forums.raspberrypi.com/viewforum.php?f=179 Raspberry Pi Aros Dev and User forums], [https://forums.raspberrypi.com/viewtopic.php?p=2387984#p2387984 previous Raspberry Pi forum thread]. Any bugs or issues can be [https://github.com/aros-development-team/AROS/issues described here to fix]
*Pi500+ untested usb3 booting or nvme ssd
*Pi500 untested usb3 booting
*Pi5 untested usb3 booting
*Pi400 boots with '''USB3''' port based sata3 ssd
*Pi4 untested (may need eeprom update from PiOS or Pi SD Imager)
*Pi 3 B+ is pre-configured for USB sata3 boot - untested
*Pi 3 B may need [https://www.youtube.com/watch?v=ubnwvxF3Klc PiOS to set OTP to boot from usb - do so at your own risk] - if OTP set to usb, boot works but slower than SD card
Speed write wise (top faster)
<pre>
*NVME Pi5 untested >1000MB/sec or faster if matched correctly
*Sata3 ssd 500MB/sec
*SD V90 90MB/sec 4K maybe 8K
*SD V60 60MB/sec 1080p
*SD U3 V30 30MB/sec 720p
*SD C10 U1 V10 A1 A2 10MB/sec minimum should be used now
*SD C06 6MB/sec
*SD C04 4MB/sec
</pre>
As a homage to the past, Aros shows a reduced number of icons but this can be changed by left mouse click in the window and then right click down to Window -> View -> All files
Windows can be manipulated by the top (moving) and the bottom right corner (resizing) only.
Zune like MUI gui interface, has a unique quirk in that after changing a setting in a text box, you may sometimes need to press Enter/Return before clicking OK, Save, etc
Double left mouse click on most picture (Developer/Debug/Tests/Datatypes), audio and video files are supported, via datatypes, by the multiview application.
Esc escape key usually closes open windows even the desktop
In Prefs/Appearance some decorative theming elements need work. There is a few Mason icons in /Prefs/Presets/Icons/Mason/ and the ever present default Gorilla - Icon exchange in works
For more intensive graphics applications, you may need to edit config.txt in the root folder and change 128M to 256M to adjust more memory to graphics usage
If your cursor should '''appear''' to vanish, fear not it is still there. Please head to the top of the screen i.e. the title bar, hold down the left click mouse and drag the screen down a little and the cursor will appear again. Then you can drag the screen up again.
Like most amiga like OSs the audio and networking need to be setup manually
Audio AHI prefs - Mode settings tab - needs both Music unit and Unit 0 set to RPiHDMI:16 bit stereo++ or RPiPWM:16 bit stereo++ at 44100Hz. Press '''Save or Use''' button after each choice
For wireless, please use the Wifi prefs and already selected device bwfm.device. Press Scan and double right click on the router and enter password. You may need to setup after every power off
*if asking for password again - press cancel and go to Network Prefs, Wireless Networks tab and highlight the router line and hit the remove button and press the cancel button. Retry with Wifi prefs again
*...waiting for an address - Disconnect and try Connect
Until, Connected to <router> - 192.168.x.x
For lan ethernet port, please use Network prefs and the following hardware is
*lan9514 Pi3b Pi2 not supported at the moment
*lan7515 Pi3b+ type into Device usblan78xx.device as net0: remove other device(s)
*bcmgenet Pi4 Pi400 choose for Device bcmgenet.device
*cdnsgem Pi5 Pi500 Pi500+ RP1 i/o for cadencegem
(network prefs may forget random information when rebooted)
Summary
<pre>
*3b ethernet not supported, usb ethernet not working but wifi prefs setup works
*3b+ wifi working and ethernet works
*4 untested
*400 wifi and ethernet untested
*5 wifi and ethernet untested
*500 wifi and ethernet untested
*500+ wifi works
</pre>
Type in 'aarch64' in the [https://archives.arosworld.org/index.php?function=search&tool=simple search box] and you will see available software packages / apps. apkg can be used to inspect and install applications.
[http://archives.arosworld.org/index.php?function=browse&cat=network/browser amelinium web browser (JS 1.6 ES9 ECMASCript 2018)] is available with an [https://eab.abime.net/showthread.php?t=122494&page=80 eab thread] reminiscent of [https://github.com/zapek/Voyager Voyager] and to a lesser extent [https://github.com/amigazen/aweb3/ Aweb JavaScript 1.5 (ECMAScript 3)] as css and javascript websites can be slow to load or resolve (no JIT) and nothing from facebook, reddit etc.
Press Cancel at screenmode selector or -wb argument to get windowed version. You could use the Shift + Del shortcut or mouse wheel should work to delete all text at once. Html5test gives 189 (1.29), 300 (1.31), 311 (1.33) out of 555, some bigger Amiga like browsers are around 370+ but it does less better.
You may have to delete the cache (Menu -> Page -> Delete cache) to fully retest big Amelinium updates or free up space.
Be aware [https://pianetaamiga.it/en/reportage-pianeta-amiga-2026/ some site pages] can use up hundreds of MBs of cache very quickly
DNS lookup failed... close browser and reboot and setup wifi again - repeat until it works again
youtube video and audio - js button for javascript must be on/shaded - Settings -> Soundoutput - AHI
Any restriction to lower resolutions is due to [https://docs.invidious.io/faq/#q-where-are-the-360p480p1080p-quality-options bandwidth]. Either CPU/GPU, internet speed and/or video quality. Pi3 can expect 480p (wifi) to 720p (ethernet). Pi4 expect (wifi) (ethernet).
Telegram https://t.me/s/channel_name for public messages from vamped_amiga chatamigagames demoscenecracktros
*art local js apps like dpaint.js
There is normally no Bluetooth support for most amiga like OSs but Aros has one [https://github.com/aros-development-team/AROS/commit/6942cbfbf66426d21963a7fcd8aba6aff611a9e0 work in progress] [https://github.com/RPi-Distro/bluez-firmware/tree/pios/trixie/debian/firmware/broadcom firmware]
*Bluetooth 4.1 BCM43430A1.hcd Pi3B, Pi3A, Zero 2W
*Bluetooth 4.2 BCM4345C0.hcd Pi3B+, Pi4
*Bluetooth 5.0 BCM4345C5.hcd Pi4B rev, CM4 and maybe Pi5 and CM5
<pre>
*bthid keyboard mouse support
*btserial serial
*btpan short range wireless connecting devices
</pre>
Only the Pi5 has a RTC real time clock, the other Pis will need to use ntp services [https://github.com/aros-development-team/AROS/commit/29cd4116330dc7f692d90757eacc59fb3f31ae70 sntp] with time.cloudflare.com pool.ntp.org or Cloudflare 162.159.200.1, 162.159.200.123, 2606:4700:f1::1, 2606:4700:f1::123 or [https://github.com/bohunamiga/PiNTP PiNTP -s goodtime.ijs.si or ntp1.ptb.de] to get the date and time from the internet. Can use date in a shell e.g. date 24-Dec-2026 23:59:59 but this will need to be done again after every reset/power off. Maybe [https://github.com/aros-development-team/AROS/commit/28674a157bc56175aa668e7b62dca6fa740578dc ds3231 rtc with dtoverlay=i2c-rtc,ds3231 in config.txt]
It helps to have all usb devices already plugged in before power on to detect at the moment. Even then some usb devices will freeze the mouse cursor and the only resolution is to remove the offending usb device and reinsert. Sometimes, the reinsert leads to the mouse cursor vanishing, it is still there and responds to left mouse clicks, top of the screen and pull down the screen.
USB classes support from Prefs/Trident is still work in process
*usbaudio working on usb3 port (blue) on pi4, 400 but not working (no rt isochronous) on usb2otg (white or black) for pi3b, zero 2w
*[https://aminet.net/package/mus/midi/camd camdusbmidi] detects midi devices without a preferences file (Prefs/Env-Archive/sys/midi.prefs) as [https://www.youtube.com/watch?v=RBxHkwy4Nrw auto setup now] possibly with [https://github.com/metaneutrons/mt32-pi metaneutrons mt32-pi] [https://github.com/rtzor/mt32-pi mt32-pi fork] [https://github.com/ahmadexp/mt32-pi fork] [https://github.com/gmcn42/mt32-pi-control control of] [https://github.com/dwhinham/mt32-pi mt32-pi pi3+]. Alternative of [https://homspace.nl/samplerbox/ SamplerBox].
Will need developer clang gcc tools to look at 64bit ports of [https://archives.arosworld.org/?function=showfile&file=driver/audio/usbmidi.i386-aros.lha usbmidi], [https://aminet.net/package/mus/midi/CAMD_Toolkit CAMD_Toolkit], [https://aminet.net/package/mus/midi/camdtools camdtools], [https://github.com/cnvogelg/amiditools amiditools], [https://github.com/timoinutilis/midi-sequencer-amigaos horny src], [https://aminet.net/package/mus/midi/horny-base horny-base], [http://bnp.hansfaust.de/index.html BnP], [https://arosarchives.os4depot.net/?function=showfile&file=audio/misc/timidity.lha timidity],
Regarding 680x0 emulation, there are several options (not implemented yet) that could be considered
*[https://github.com/aros-development-team/AROS/blob/6722a0ae9e03fe5d26e32703360bd2059e0864cc/rom/m68kemu/README.md?plain=1#L424 m68kemu.library] for some Amiga productivity where the cpu is emulated and the system calls are redirected to Aros ones
*[https://github.com/BlitterStudio/amiberry amiberry] (winuae) for everything else like games
*[https://github.com/jonx/AROS/tree/aarch64-darwin-graft/arch/all-darwin/libs/emu68k emu68k]
*[https://scriptedamigaemulator.net/ Scripted Amiga] with [https://github.com/naTmeg/ScriptedAmigaEmulator ScriptedAmigaEmulator] or older [https://github.com/gbraad-amiga/ScriptedAmigaEmulator2 ScriptedAmigaEmulator2]
Hopefully getting Pi3 up to 25Mhz 68040 (non JIT) and 50Mhz 68040 (JIT)
Pi4 maybe getting up to 50Mhz 68040 (no JIT) and 100Mhz 68040 (JIT)
[https://pinout.xyz/ GPIO 40 pins] [https://learn.sparkfun.com/tutorials/raspberry-gpio/gpio-pinout pinout]
Some exceptions:
*Physical pins 27, 28 (GPIO0, 1) are an internal I2C bus and should not be used
*The other I2C on pins 3, 5 (GPIO 2, 3) can be used generally, but be aware they have permanent pull-up resistors to 3.3V
*For MIDI use USB but there are dedicated UART pins 8, 10 (GPIO 14, 15).
With a HAT it's more awkward -- you need to know which pins are used by the HAT and avoid them. Hopefully this will be documented.
Remember all GPIOs are 3.3V (not 5V tolerant), floating/noisy inputs can cause odd behavior, and that shorting the power supplies can cause instant death of the Pi.
In the shell (Cntrl + C to end)
GPIO PIN/A/N,SET/N,GET/S,MODE/K,PULL/K
Controls and queries hardware GPIO pins via gpio.resource which is stored in the rom or Devs/ '''please test'''
*PIN -- (Required) Target GPIO pin number (e.g. 12).
*SET -- Set pin output value to 0 (LOW) or 1 (HIGH).
*GET -- Read and print current digital input level (0 or 1).
*MODE -- Configure pin mode: IN (Input), OUT (Output), ALT (Alternate).
*PULL -- Configure pull resistor: NONE, UP, DOWN.
EXAMPLES
<pre>
GPIO 12 MODE OUT
GPIO 12 SET 1
GPIO 12 GET
GPIO 13 PULL UP
</pre>
[https://gpiozero.readthedocs.io/en/stable/installing.html Current] [https://gpiozero.readthedocs.io/en/v1.2.0/api_boards.html old support for gpiozero is unknown at present] [https://energenie4u.co.uk/res/pdfs/ENER314%20UM.pdf and associated 433MHz equipment] [ USA X10 security and lights via USB] [ OpenHab with Shelly Smart Plug connected over Wi-Fi, controlled by MQTT or HTTP]
Printing only with Postscript but [https://github.com/bohunamiga/MintPRINT one] of [https://github.com/boingball/MintPRINT two] [https://github.com/Andiweli/AmiAirPrint/tree/main AirPrint] IPP has been attempted with [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2061&pid=13954#post_13954 discussion]
Youtube
[], [], [https://www.youtube.com/watch?v=X4fmWAIv7FE Aros native on Pi3b],
[], [], [https://www.youtube.com/watch?v=TSxlYb1eQWU Installed on Pi3b+],
[], [], [https://www.youtube.com/watch?v=NFF1H3jCoz8 testing Aros native on Pi400],
[], [], [https://www.youtube.com/watch?v=nIVx7mh1E1Q&pp=ygUHYXJvcyBwadIHCQkTDAGHKiGM7w%3D%3D Aros on Thumb 2 based 32bit-ish ARM STM32H743 board],
[https://www.youtube.com/watch?v=zQM4CD64xDE&t=612s&pp=ugUEEgJlbg%3D%3D Performance under Linux] but on Aros...
{| class="wikitable sortable" width="90%"
! width="10%" |Pi
! width="10%" |Single Core 2D
! width="10%" |Single Core 3D
! width="10%" |Single Core 3D
! width="10%" |SMP 2D
! width="10%" |SMP 3D
! width="10%" |SMP 3D
! width="35%" |Comments
|-
| <!--Pi-->Pi3
| <!--Single Core 2D-->
| <!--Single Core 3D-->
| <!--Single Core 3D-->
| <!--SMP 2D-->
| <!--SMP 3D-->
| <!--SMP 3D-->
| <!--Comments-->
|-
|}
==== 32bit ====
For the Pi1 Pi2 Pi2B the status of AROS native ARMv6 for 32bit RasPi was OK. System booting, USB working (although with some issues but plans to fix them). 32bit native [http://www.aros.org/nightly1.html ARMv6 32bit nightlys] raspi-armhf-system raspi-armhf-contrib unbz2'd to fat32 microSD
===Hosted===
AArch64 CPU backend for AROS, a Cocoa/Metal display, clipboard / host-volume / CoreAudio / BSD-sockets bridges, GPU 2D via gpufx.library, a 68k→AArch64 JIT (run68k), and a full Rust std port. On [https://www.jkn.me/blog/macaros-aros-on-apple-silicon/ latest Apple Silicon] [https://github.com/jonx/Macaros early buggy alpha version of hosted Aros .dmg on MacOS12+]. Please use [https://github.com/jonx/Macaros/issues MACAros github] for issues, features etc and possibly [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2030&pid=13910#post_13910 here]
[http://www.aros.org/snapshots1.html old linux and android hosted 32bit]
==== Hosted ====
=====64bit=====
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80&pid=13667#post_13667 Ubuntu Linux PC hosted Pi compiler build]
[https://github.com/BlitterStudio/aros-compiler-docker Docker based cross compiler for various Aros systems],
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80 From the Aros Raspberry pi 3 64bit thread]
Instructions on building 64-bit Raspberry Pi AROS and cross-compiler from sources.
You will need:
- Ubuntu 24.04 or 26.04
- qemu-system-aarch64 installed
- Internet connection
- rpi-scripts.tar.gz downloaded (https://axrt.org/download/aros/rpi/rpi-scripts.tar.gz)
1) Install prerequisites:
sudo apt install git gcc g++ make gawk bison flex bzip2 netpbm autoconf automake libc6-dev liblzo2-dev libpng-dev gcc-multilib byacc python3-mako cmake yasm curl nasm
2) Clone sources
cd <project-directory>
git clone https://github.com/aros-development-team/AROS.git --recurse-submodules
3) Extract rpi-scripts.tar.gz. Copy all files into your project directory so that you have:
AROS (the directory with cloned sources)
fix-dotdot.py
rebuild.sh
recreate-sdcard.sh
run-qemu.sh
update-sdcard.sh
4) Run ./rebuild.sh. Select option 1) toolchain-core-aarch64
This will execute process of building a cross-compiler. During this process packages will be downloaded from Internet. This process can take up to 2 hours. If there are some missing dependencies, install them with 'sudo apt install' and restart this step.
5) Run ./rebuild.sh again. Select option 2) core-raspi-aarch64
This will build system files for 64-bit Raspberry Pi AROS. This process can take around an hour.
6) Run ./recreate-sdcard.sh
This will create an sdcard.img file with contents of previous step.
7) Run ./run-qemu.sh
This will start QEMU with SD card image and ROM images. It will boot into AROS.
=====32bit=====
Ubuntu VM approach to compiling [http://lallafa.de/blog/2013/06/building-aros-hosted-for-raspbian/ Linux hosted AROS June 04, 2013]
../AROS/configure --target=linux-armhf --enable-includes=/usr/arm-linux-gnueabihf/include --x-includes=/usr/arm-linux-gnueabihf/include --x-libraries=/usr/arm-linux-gnueabihf/lib
arm-elf- is symbol-linked to arm-linux-gnueabi- (arm-linux-gnueabi- is more correct in this case, because it's going to be compiling the ARM AROSBootstrap for ARM Linux)
*armel - many of the "android" machines require since the entire OS is made for soft float VFP.
*armfp - Efika MX target, Raspberry PI, EfikaMX, Pandora and virtually everything (VFP)
Keep in mind it's possible to start hardfp AROS hosted on softfp system, though, as long as no calls between AROS and host require floating point parameters. NOTE: hardfloat objects *cannot* be linked with softfloat objects - they have a different ABI.
Just keep in mind the arm nightly build machine is quite complex beast. It needs the x86_64 host compiler to compile AROS tools. The arm version is built every night using gcc-4.6.2 crosscompiler (built together with AROS) and successfully builds armel and armhf linux hosted targets.
*needs an AROS code compiler for ARM target
*as well as unix compiler for ARM linux host (would be best to have both softfp and armhf, we have softfp only now) with full set of libraries and includes.
with—disable-crosstools $AROS_CC is always a wrapper around $KERNEL_CC ? If so, this is wrong for some ports. This can break Darwin, Windows and Android port.
Yes, Android port will build. And even work. But it's not good because the port will not be ABI-compatible with other ARM ports. Android's ABI is different from GNUEABI. For example:
<pre>
enum test {foo, bar};
enum test testvar;
</pre>
sizeof(testvar) will be equal to sizeof(int) in GNUEABI (Linux and AROS) and sizeof(short) on Android. This affects linking objects from static linklibs, for example.
Previously everything worked because $AROS_CC was a wrapper on top of $HOST_CC. And a real crosscompiler was used on non-ELF hosts.
Android is the same. $KERNEL_CC is incompatible with AROS.
compiler=kernel is appropriate _ONLY FOR CODE WHICH RUNS ON HOST OS_ (or barebone hardware, if we talk about native). This includes bootstraps, their linklibs, and host-side dynamic libraries (Windows makes extensive use of them because of architectural considerations.
No single AROS object should be compiled with this setting. $KERNEL_CC is really compatible with AROS *ONLY IN LINUX-HOSTED* and no more. On other systems (Darwin, Windows, Android) this is not true any more, and compiler=kernel is never going to work.
If you want to compile your AROS module against host OS includes, append the following to USER_INCLUDES (or USER_CFLAGS, this is effectively the same):
-isystem $(GENINCDIR) $(KERNEL_INCLUDES)
$(KERNEL_INCLUDES) expands to:
-isystem <your_os_includes> -isystem <host_OS_gcc_private_includes>
-nostdinc
This makes AROS compiler adhering to host OS APIs.
If you want some preprocessor symbols based on what your host OS actually is, add something like -DHOST_OS_$(AROS_HOST_ARCH).
Why is there $(GENINCDIR) at all? Because host OS has its own libc includes, which would conflict with AROS ones. And the host OS libc is not binary-compatible with AROS one.
Why doesn't Windows-hosted port use $(KERNEL_INCLUDES) ? Because WinAPI includes conflict with AROS ones in fundamental typedefs, like WORD, BYTE and BOOL. It's almost impossible to deal with this in any other way than rewriting WinAPI definitions using AROS types.
Building under centos 6.3 (i386) currently, and AROS creates the toolchain itself. haven't yet committed the necessary changes but "./configure --target=raspi-armhf" is enough to start, then "make arosboot-raspi" will generate arosraspi.img (containing the bootstrap, kernel.resource, and exec.library) as well as arosraspi.rom (containing all the other essentials components such as dos, graphics etc). It will also copy over a config.txt file to make the raspi bootstrap code load the correct kernel, and a cmdline.txt that enables exec debug output.
*armel = typically Debian 6, Ubuntu Maverick, Android,
*armhf = typically Debian 7, Debian 8, Ubuntu Precise,
Cross-compiling Ubuntu ARM softfp
<pre>
sudo sh
echo 'foreign-architecture armel' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armel] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armel.list
apt-get update
apt-get install gcc-arm-linux-gnueabi libx11-dev:armel libsdl-dev:armel
</pre>
<pre>
./configure --target=linux-arm --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabi/include
</pre>
Cross-compiling Ubuntu ARM hard-float
<pre>
sudo sh
echo 'foreign-architecture armhf' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armhf] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armhf.list
apt-get update
apt-get install gcc-arm-linux-gnueabihf libx11-dev:armhf libsdl-dev:armhf
</pre>
<pre>
./configure --target=linux-armhf --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabihf/include
</pre>
Now, the AROS build is configured properly and all you need to do is:
make
==Build==
===64bit===
[https://github.com/aros-development-team/AROS/blob/7016ce28bfdb754182edb16011c98faaf5413c29/arch/aarch64-raspi/boot/mmakefile.src#L180 boot makefile]
===32bit===
# download/checkout the source someplace, e.g. /build/AROS-Src/
# make a directory to store external sources AROS downloads, e.g. /build/Ports
# make a build directory, e.g. /build/aros-raspi-armhf
# cd into the build dir, configure, and then run make -:
<pre>
>cd /build/aros-raspi-armhf
>/build/AROS-Src/configure --target=raspberrypi-armhf --with-serial-debug --enable-ccache --with-portssources=/build/Ports
>make
>make arosboot-raspi
</pre>
then copy the files from /build/aros-raspi-armhf/bin/raspi-armhf/AROS/ onto an sdcard, and download/copy the Raspi firmware files onto it.
You should then be able to boot the sdcard on your RasPi.
The current W.I.P tree to svn. it can be built as follows ..
<pre>
./configure --target=raspi-armhf
make arosboot-raspi
</pre>
That will generate arosraspi.img, arosraspi.rom and config.txt in bin/raspi-arm/AROS - so either copy just those files to a fat formatted SD card (with the firmware files on), or copy the whole contents of the AROS folder.
NB - if you have a Linux/other install, backup the existing config.txt first
arosraspi.img contains the bootstrap (which has very basic mailbox code, framebuffer/gpio init, and console "emulation" via code pinched from our libbootconsole), kernel.resource, and exec.library
arosraspi.rom contains all the other components needed to boot AROS.
The config.txt file will tell the RasPI bootstrap to load the arosraspi kernel and ramdisk (rom).
the bootstrap has minimal mailbox code, planning on adding either a resource or library that driver/app code will use to access it (likewise for GPIO)
Help building AROS hosted on Linux ARM
Was looking a way to use more my Handheld ARM based called Pyra (Dragonbox Pyra) an ARM (Omap5 cpu with 4GB ram) linux based machine (Debian Buster v10 with kernel 5.6.19 adapted) and have a try to compile the latest Aros sources by Deadwood directly on this device.
Compilation stops after build libpopupmenu.a and trying to build libatomic have this error:
<pre>
Configuring build in bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
configure: WARNING: unrecognized options: --disable-nls, --without-x
checking for --enable-version-specific-runtime-libs... no
checking for --enable-generated-files-in-srcdir... no
checking build system type... arm-unknown-linux-gnu
checking host system type... arm-unknown-aros
checking target system type... arm-unknown-aros
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for arm-aros-strip... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-strip
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for arm-aros-gcc... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-gcc
checking whether the C compiler works... no
configure: error: in /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic':
configure: error: C compiler cannot create executables
See config.log' for more details
make[2]: *** [mmakefile:4489: /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic/.configured] Error 77
[MMAKE] make --no-print-directory TOP=/media/farox/pyra2/arosbuilds/toolchain-core-armhf-build SRCDIR=/media/farox/pyra2/arosbuilds/AROS CURDIR=tools/crosstools/gnu TARGET=tools-crosstools-gcc-libatomic-configure -s --file=mmakefile tools-crosstools-gcc-libatomic-configure failed: 512
[MMAKE] Error: Error while running make in tools/crosstools/gnu: No such file or directory
make[1]: *** [Makefile:361: linklibs-libatomic] Error 10
make: *** [Makefile:183: crosstools] Error 2
</pre>
looking at config.log on arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
found that arosbuilds/toolchain-core-armhf/arm-aros-ld: cannot find -laeabi
so do make linklibs-aeabi-arm-quick
and the missing lib was built.
now the next stop is at
fatal error: bits/libc-header-start.h: No such file or directory
and
fatal error: sys/cdefs.h: No such file or directory
in many places so after checking that have this missing include files i have noted that my include path is a bit different, standard searching path is /usr/arm-linux-gnueabihf but in my system is /usr/include/arm-linux-gnueabihf
so if i add my path to some mmakefiles compilation goes on....but is a better way to add this path to avoid every mmakefiles to be changed?
fixed with adding
-I/usr/include/arm-linux-gnueabihf
to where is missing on mmakefiles like
USER_INCLUDES := -isystem $(GENINCDIR) -I/usr/include/arm-linux-gnueabihf $(KERNEL_INCLUDES)
P.s. I have changed many mmakefiles and have at least compiled (after many hours) the toolchain doing make every time in arosbuilds/toolchain-core-armhf-build (also have to disable making tests under cplusplus but don't remember the directory ...) but ask an help to have an automated way to correctly build without modify mmakefiles.
Last time built armhf target was around 2 years ago. At that point built is via cross-compilation from linux (ubuntu 22.04) using linux armhf crosscompiler (this can explain the path differences you are experiencing) as well as using AROS gcc cross-compiler in version 6.5.0 (build with option 21) in rebuild.sh). Since then AROS GCC has been updated to 10.5.0 and don't believe anyone tried to build the armhf target again.
My suggestion would be to downgrade GCC to 6.5.0 (via editing AROS/config/gcc_def file) and try to first build using cross-compilation from x86_64 linux. Once that works, you will have a "template" to compare to native compilation under arm linux.
Thanks for your suggestion...but think the toolchain with GCC 10.5.0 is compilable if i found a way to pass the path of my system to the script that build (option 21 on rebuild).
The other only changes are (but don't know where to modify...) is to add the build of libaeabi and disable the building of some tests under cplusplus that use exceptions and is not supported under ARM. try to crosscompile with my Linux amd64 PC.
For paths look into core-linux-armhf/bin/linux-armhf/gen/config/target.cfg. A number of build-wide variable is set there containing paths to local build system. These variables and the target.cfg file are generated by AROS ./configure script.
Thanks compilation now go forward...changed target.cfg under "toolchain-core-armhf-build/bin/linux-arm/gen/config" and do make on "toolchain-core-armhf-build" dir.
Need to find where to enable build libaeabi.a so can build the entire toolchain with option 21 of rebuild.sh
Found something that looks like libeabi in AROS/arm-all/arm-aeabi/mmakefile.src. Try adding a third line there:
#MM- linklibs-armhd : libklibs-aeabi-arm
Don't remember needing this library. Possibly the 6.5.0 GCC somehow does this while 10.5.0 is missing this.
Try adding this line (and the variant "linklibs-armhf" instead of hd) but it did not solve the automatic building of the missing lib. I must do "linklibs-aeabi-arm-quick".
Anyway after have build the aeabi lib i succefully built the toolchain (after many hours...). Smile
To test I restarted from selecting option 21 (on rebuild.sh) but after many hours i get the same error of the kernel includes not found...maybe i need to modify the configure script for my case.
With the toolchain built i try to build the core-linux-armhf (DEBUG) (option 22) but after a while it stopped with
"cannot find -laeabi " so i made it built manually...and now i can continue compiling...i'll let you know if all goes ok.
== Hardware ==
===64bit===
====BCM2712====
With the Pi5
Broadcom VideoCore 7 vc7 is an integrated GPU with 12 cores and up to 800 MHz clock. VideoCore VII is capable of OpenGL ES 3.1 and Vulkan 1.2. The driver support for the Raspberry Pi continues to build upon the [https://lore.kernel.org/dri-devel/20230928114532.167854-1-itoral@igalia.com/ open-source V3D driver] stack within [https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25450 Mesa] hopefully be merged for Mesa 23.3. x265 HEVC accelerated untested, x264/h.264 and VP9 cpu only.
*Raspberry Pi M.2 HAT+ Expansion Board
*Geekworm X1001 PCIe to M.2 Key-M NVMe
*Geekworm X1003 PCIe to M.2 HAT NVMe SSD PIP Board for Raspberry Pi 5
*Pineboards Pi Hut HatDrive! M.2 HAT 2024/V4
*Hat+ Gen2 Gen3 Nvme
*GeeekPi 52Pi N04 for Raspberry Pi 5 NVME M.2
*
*2024 RPI AI HAT - Hailo 20TOPs no LLMs
*2026 RPI AI HAT+ 2 - Hailo 40TOPs slightly better?
[https://www.raspberrypi.com/documentation/accessories/camera.html Cameras for Pi]
*Raspberry Pi camera module, the V3 with Sony IMX708 back-illuminated CMOS 12 Megapixel sensor
*Raspberry Pi Camera Module V2 – 8MP Sony IMX219 Sensor
*Raspberry Pi camera Rev 1.3, 5MP 1080P OV5647 image/video module, 2592 x 1944 pixels
====BCM2711====
With the Pi4 an ARM a72 cpu is about x3 times the size of an a53 in the Pi3
the 2711b line used more power when idle, compared to the 2711c
*2018 Raspberry Pi PoE HAT Power Over Ethernet Hat - design issues
*2020 Raspberry Pi PoE+ HAT Power Over Ethernet Hat Pi3b+ Pi4 only - better design
*Waveshare PoE HAT (B) with cooling fan for Raspberry Pi 3B+/4B 802.3af PoE
*[https://github.com/axizo-pi/V3DLib vc6 V3D 4.2] is derived from [https://docs.broadcom.com/doc/12358545 vc4], but it is [https://docs.mesa3d.org/drivers/v3d.html significantly different]
The QPU pipeline stays mostly the same, you still have an add ALU and a multiply ALU and it can issue two ALU OPs per cycle. There is still 4 SIMD lanes, interleaved over 4 cycles.
The instruction encoding for the QPUs is different, but the core instructions are the same.
Instructions for packed 8 bit int math has been dropped, along with most of the pack modes.
Instructions for packed 16bit float math has been added (2 floats at in a single operation)
With vc5/vc6, you write two packed 16f value to the tilebuffer (or four writes of 32f, if you are using the rgba32f framebuffer). And there is a handy vfpack operation which allows you to pack two f32s into a single 32bit value in a single instruction. You can vfpack directly into the tile buffer register.
the multiply ALU can now fadd, so you can issue two fadds per instruction. the add ALU has gained a bunch of new instructions
the A and B register files have been merged. You still only get an A read and a B read per instruction, but they read from one big register file (which means the underlying memory block has gone from two sets of "one read port, one write port" to one "two read ports, one write port" block)
The theoretical max FLOPs per QPU remains the same at two per cycle, other than the bump from 400mhz to 500mhx but it looks like a lot of effort has been put putting those theoretical FLOPs to better use.
*vc4 could run one or two threads per QPU. When you ran in two thread mode, the available register file halfed to 32 registers.
*vc5 added a four thread per QPU mode, with 16 registers per thread.
*vc6 doubled the size of the register file. You could now use all 64 threads in two thread mode and 32 registers in for thread mode. Single thread mode was removed, you always have at least two threads.
With the threading improvements, the QPUs should spent much less time idle waiting NOPs for memory requests. Most of the design changes have gone to improving the fixed function hardware around the QPUs. A fixed function blend unit has been added, which should reduce load on the QPUs when doing alpha blending. hope software blending is still possible
The tile buffer can now store upto 4 render targets (up to 128bits per pixel, so if you are using 4 32bit render targets, you can't have a depth buffer)
A MMU, allowing a much simpler/faster kernel driver.
Many more texture formats, framebuffer formats.
h264/x264 as Pi3
All the features needed for opengl es 3.0
H.265 / HEVC decoder is a HEVCv2 Main 4:4:4 10 design supporting bitstreams up to profile 5.1
HEVC hardware decode supports 4kp60, 10-bit. Audio output is pretty much unchanged, but the HDMI audio channels now support 8x192kHz bitrates
Each ALU typically have 2 floating point operators, and as you pointed out in a earlier post videocore 6 is no exception, with both a multiply and additive floating point operator. Thus theoretical GFLOPs are calculated with both operators in mind. That is what the 2 in my formula represents, and is common across any modern programmable shader, whether you calculate Nvidia, AMD, Intel, Boardcom or any other company's GPUs. Total ALUs * 2 * GHz clock = GFLOPs, In the case of Raspberry Pi 3, it's 24 ALUs * 2 operators * 0.4GHz = 19.2GFLOPs
If the Videocore 6 does indeed only have 16 ALUs (16 * 2 * 0.5GHz), you'd have only 16GFLOPs but they are better utilised
Possible maximum performance
<pre>
VideoCore IV @ 250MHz: 250 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 24 Gflop/s
VideoCore IV @ 300MHz: 300 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 28.8 Gflop/s
VideoCore VI @ 500MHz: 500 [MHz] x 2 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 32 Gflop/s
</pre>
Faster LPDDR4 memory.
====BCM2837====
With the Pi3
* Broadcom BCM43438 chip provides 2.4 GHz 802.11n wireless LAN, Bluetooth Low Energy, and Bluetooth 4.1 Classic radio support, 3B+ [https://github.com/aros-development-team/AROS/commit/afa5bc0bb17d5dd06bcfdbac00853a3799ca8d76 LAN7515]
The overclock ability has diminished with each chip version as the energy usage has increased. BCM2837 is one of the warmest yet and benefits from active fan cooling if all four cpu cores are in use for a short while. Video playback maybe affected due to the lack of custom support in the GPU with Aros. 5 V / 2.4 or 2.5 amp power supply recommended if all four cpu cores are running, else throttling (cpu slowdown) might occur.
[https://github.com/hermanhermitage/videocoreiv/wiki/VideoCore-IV-Programmers-Manual Dual VDP] and scalable QPU in [https://docs.mesa3d.org/drivers/vc4.html VC4] and x.264/h.264 accelerated untested only and VP9 on cpu or neon help
ARMv8-A has [https://developer.arm.com/documentation/102412/0100/Privilege-and-Exception-levels privilege levels] where userspace typically runs at ‘EL0’, the kernel at ‘EL1’ or ‘EL2’ and the firmware at the highest level ‘EL3’.
===32bit===
=== Core Kernel ===
====BCM2708(family)====
which includes the [http://elinux.org/RPi_Hardware BCM2835] (ARM1176JZF-S 700 MHz CPU + VideoCore IV GPU + up to 1GB RAM)
*Framebuffer (fb) using mailbox
*IRQ scheduler, etc
*Arasan based SD Card controller
*Synopsis DesignWare USB 2.0 OTG controller [http://networkdirection.net/index.php?option=com_content&view=article&id=106:rasperry-pi-usb-controller&catid=45:raspberry-pi&Itemid=54 Unofficial DOCS pdf], [dwc_otg.c FreeBSD], [], [https://www.riscosopen.org/viewer/view/mixed/RiscOS/Sources/HWSupport/USB/Controllers/DWCDriver/ RiscOS USB Driver], [https://www.riscosopen.org/forum/forums/5/topics/878 RiscOS USB Discussion], [https://www.riscosopen.org/forum/forums/11/topics/1893 Other USB RiscOS], [http://plan9.bell-labs.com/plan9/index.html Plan9 Miller's usb] http://plan9.bell-labs.com/sources/contrib/miller/, [https://github.com/Chadderz121/csud CSUD driver],
*[http://www.smsc.com/media/Downloads_Public/Data_Sheets/9512.pdf SMSC 9512] USB LAN/Hub chip
*CMOS RAM
*VCHIQ port which sends messages to the GPU e.g. for mouse, keyboard, audio on HDMI, etc
*Audio Driver
*Serial Peripheral Interface Bus (SPI)
*[http://www.susa.net/wordpress/2012/06/raspberry-pi-pcf8563-real-time-clock-rtc/ I2C registers]
*I2S
*Universal Asynchronous Receiver Transmitter (UART)
*[http://elinux.org/RPi_BCM2835_GPIOs GPIOs] and [http://www.adafruit.com/blog/2012/08/17/broadcom-bcm2835-peripheral-memory-map-and-gpio-alternate-use-chart-piday-raspberrypi-raspberry_pi/ Alternative view of GPIO]
BCM2836
* For Pi B+, PI 2 and Pi 3 SMSC LAN9514 chip adding 10/100 Ethernet connectivity and four USB channels to the board
*[http://www.andrewscheller.co.uk/rpi_pcb_modules.html PCB], [http://elinux.org/RPi_Low-level_peripherals Low level features],
Implemented so far...
# Modify the configure system so that it correctly builds for the arm hardware float raspi target.
# Implemented the bootstrap to load the aros modules and prepare the arm to jump into them. Reworked the x86 console support so that parts can be stolen for raspi to use since t has no basic functionality to output to the display.
# Implemented a kernel.resource to prepare the raspi for running aros and provide the low level api calls to expose available resources and allow exec, etc function.
# Implemented serial debug support
# Implemented the exec (and kernel) functionality required to make multitasking work (and interrupts, exceptions, syscalls, etc)
# Implemented a timer.device to utilise the hardware timers.
# Implemented a very basic gfx driver to expose the hardware's framebuffer.
# Implemented an SD-Card driver for AROS which presently only supports the raspi's chipset but can easily be modified to support all sd-card hardware and media.
# Fixed the fat filesystem support in AROS so that it can boot on RasPi's normal SD-Card setup. The "rom" image files needed use a different filename than the default linux, etc images so can be easily installed without harming the existing files - you only need to change the loaded images in the config file to get aros to boot.
# Updated the build scripts to automatically download the necessary raspi firmware files and wrap it all up so that you can simply extract the archive to a fat formatted sdcard and boot it on the raspi without having to get anything else.
# fix everything in contrib and ports to build for raspi (needs proper testing/fixes but allows every component to actually compile at least, including owb) + numerous other fixes to get things working on arm/raspi ..
Improvements...
# Implement a USB chipset driver "OR" finish the existing one [https://github.com/aros-development-team/AROS/commit/c07d13c724f944674be5db54fc6a71ee72a01809 usb otg] - the current code is mostly a skeleton that should initialise the chipset and then needs relevant code to support the different transfer types. It also has the "virtual" hub code in place to represent the raspi's USB port (from poseidons p.o.v)
# Implement a driver for the USB NIC (a few weeks - depends on USB above)
# Write an [https://github.com/aros-development-team/AROS/commit/d55d0f74d20b769bbb8c8d386e5c1d7a9154f05a audio driver] (a few weeks - independent of USB) and [https://github.com/aros-development-team/AROS/commit/e93a4c245f27a87c9c4c1d39206694b39059998a HDMI]
# fix syscall bug in the current raspi kernel code
# Graphics depend on having a decent "bcmdma.resource" implemented as to use the cpu's dma engine. The sd card driver needs to use it for transfers to/from the controller - and the gfx system needs to use it for "blitting".
# [https://github.com/aros-development-team/AROS/commit/4019d84e4975d4dad987a12d57fe108f5ac048e6 Improve the gfx driver], [ vc4gfx HIDD] add [http://dri.freedesktop.org/wiki/VC4/ Gallium3D support]
# [https://github.com/aros-development-team/AROS/commit/b13905b3e8e45b089f520b44692c81affddd066f Improve] the [https://github.com/aros-development-team/AROS/commit/3a876755c070f5c73c4f53c7f4d35b4f923088b9 sdcard] device driver - which is also pretty basic but should work with most cards, rework it to also support pci, etc. sd card interfaces on x86
# The current code using very rudimentary access to the gpio interface - so that should be implemented as some resource for other components to access, as-well as the i2c interface exposed over the gpio interface. that should have a hidd class implemented which uses the gpio resource to communicate.
Boot up typical for most other OSs before the open sourcing of many binary blobs from 2017 onwards
On power-up, the rpi [http://www.open.com.au/mikem/bcm2835/ BCM 2835] [https://github.com/hermanhermitage/videocoreiv VideoCore4] GPU, not the ARM CPU, is in control, and the SD card slot is the only peripheral device with power. The firmware burned into the BCM2835's VideoCoreIV GPU PROM requires a DOS-style partition table; a FAT-formatted first partition; and the freely redistributable but closed sourced Broadcom files “bootcode.bin” and “start.elf” in that partition.
The boot sequence carries out several pre-boot tasks
*On powering of the rpi, the GPU reads and executes bootcode.bin, which then loads start.elf
*The GPU loads the “start.elf” file, eventually, into the L2 cache and then executes it
*configures the memory split for the CPU and GPU
*reads and parses “config.txt” from the same partition on the SD card and applies the settings (like a PC’s BIOS settings)
*loads the “kernel.img” file, again from the same partition
*activates the CPU to begin executing the loaded kernel image
The CPU/GPU memory split is hard-coded into start.elf, so Broadcom provides three start.elf images, to give 32M, 64M, or 128M to the GPU for multimedia performance, and the remainder to the CPU.
RPi uses [https://github.com/raspberrypi/firmware some closed source loaders] and at some point it loads a binary blob named "kernel.img" at 0x8000, at that point there would be a rudimentary Aros alive. If one wants to use the SD-card then there would have to be a driver for the interface and a fat filesystem handler (SD-card has to be formatted to fat filesystem)
Boot code and kernel are now linked together and made into that binary blob, just for starters. Raspberry Pi uses [http://kernelnomicon.org/?p=133 u-boot] and [http://kernelnomicon.org/?p=138 UBoot] as bootloader, there's already some code in the Efika MX port for that. UBoot is a native bootloader and not just for the raspberry pi, it loads after start.elf.
You can find Efika MX port from arch implementations, some hacking is needed for the mmakefile.src'es as iit dates back to before the Aros crosstool era or else you get some weird errors while building. You also need to code the bootstrap and serial handling.
At the moment it seems that a fastest route for the native build would be to make one binary blob without using the package system. Raspberry's memory layout is pretty simple and if the implemented u-boot doesn't support loading other modules
<pre>
? - alias for 'help'
mtest - simple RAM test
autoscr - run script from memory
base - print or set address offset
bbm - BBM sub-system
bdinfo - print Board Info structure
boot - boot default, i.e., run 'bootcmd'
bootd - boot default, i.e., run 'bootcmd'
bootm - boot application image from memory
bootp - boot image via network using BootP/TFTP protocol
cmp - memory compare
coninfo - print console devices and information
cp - memory copy
crc32 - checksum calculation
echo - echo args to console
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls - list files in a directory (default /)
go - start application at address 'addr'
help - print online help
iminfo - print header information for application image
itest - return true/false on integer compare
jade -
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loady - load binary file over serial line (ymodem mode)
loop - infinite loop on address range
md - memory display
mm - memory modify (auto-incrementing)
mtest - simple RAM test
mw - memory write (fill)
nfs - boot image via network using NFS protocol
nm - memory modify (constant address)
pci - list and access PCI Configuration Space
ping - send ICMP ECHO_REQUEST to network host
printenv - print environment variables
rarpboot - boot image via network using RARP/TFTP protocol
reset - Perform RESET of the CPU
run - run commands in an environment variable
saveenv - save environment variables to persistent storage
saves - save S-Record file over serial line
setenv - set environment variables
sleep - delay execution for some time
tftpboot - boot image via network using TFTP protocol
USB - USB sub-system
usbboot - boot from USB device
version - print monitor version
</pre>
And there is one more thing about modular ports. In order to actually implement this, your bootstrapping environment should provide the ability to load several files. On PC this is provided by GRUB2. on CHRP you can read filesystem via OpenFirmware, and Sam's Parthenope relies on modified u-boot. If your bootstrap allows to load only a single file, then you stuck with monolithic kickstart. By the way... u-boot allows not only to boot up a single uImage or zImage, it also allows to write client programs AFAIK. With this approach, you actually can write modular bootstrap for ARM AROS using unmodified u-boot.
Most used [http://www.compulab.co.il/workspace/mediawiki/index.php5/U-Boot_quick_reference uboot options] are fatls usb 0:1,
the reason behind INTB_KERNEL is to allow use of the standard Exec function AddIntServer() to add interrupt handlers for
hardware drivers etc. AmigaOS never used it for abstract hardware drivers. AmigaOS routed only raw hardware IRQs there. Their assignment was hardcoded. As well as number of them. Actually on AmigaOS every bus has its own interrupt subsystem. For example PCI bus. PCI interrupts on Amiga are routed to a single exec interrupt. 1:1 relationship between CPU and hardware interrupts is present only on PC.
IMHO we miss things like AddInterrupt/RemInterrupt methods on our PCI subsystem's device class. PCI bus class should map these methods to whatever is appropriate. This is how it is done on AmigaOS and friends. When these are implemented, raw kernel.resource API will be needed only for several PC-specific drivers with hardwired resources. Exec IRQs are real IRQs only on Amiga hardware. On other machines they can be emulated where appropriate (VBlank is a good example). kernel.resource is meant to be different, its IRQs are hardware-agnostic, they are plain "Hardware IRQ number X, whatever this means". They are low-level actually, and meaningful only in the context of a particular system.
Was that not the transition from irq.hidd to kernel.resource? No. A long time ago there was another hacky bit named INTB_TIMERTICK. It was "abstract timer interrupt", used by timer.device. It was the same as VBlank, but with larger frequency. I removed it, because kernel.resource API was a cleaner way to access this interrupt. Furthermore, there can be more than one timer in the system. Thinking about bringing back timer HIDD definitions again. hpet.resource is a bad idea.
Can someone please enlighten me a little on how the scheduler is meant to work?
Poseidon.library creates its "Poseidon Event Task" during RTF_COLDSTART -> then calls Wait(), and ends up in limbo because wait disables interrupts (used for the scheduler heartbeat), and basically waits forever because the sigbit is never set, since krnSwitch doesn't switch the task unless TF_SWITCH is set, and no codepath run during this seems to set it?? TF_SWITCH does not disable/enable switching. This flag just enables to run user-supplied hook when the task is being switched away. It is completely safe to call Wait() in Disable()d state. Doing this actually temporarily breaks this state. IDNestCnt gets remembered in struct Task, then next task is selected, and its IDNestCnt is restored in sysbase (see kernel_scheduler.c). If there are no other tasks, then your cpu_Dispatch() should enable interrupts on the CPU and enter idle mode. See x86 implementation for good example.
You miss what happens next...
1. KrnSwitch() saves context of your task, saves IDNestCnt (core_Switch() and cpu_Switch()), then drops into cpu_Dispatch().
2. cpu_Dispatch() calls core_Dispatch. Then two cases are possible:
2a. There is a READY task. It is picked up, its IDNestCnt is restored in SysBase, then cpu_Dispatch() needs to restore registers and exit. The next task is run.
2b. There are no READY tasks. core_Dispatch() returns NULL. In this case your cpu_Dispatch() should enter idle loop. It should just enable interrupts on the CPU and put it on halt. This allows it to process hardware interrupts. Eventually some of your interrupt handlers wakes up your task and puts it into READY list.
My heartbeat interrupt has been slowed atm to help debugging - but it never actually gets a chance to fire because of the Wait() disabling interrupts. Perhaps you have forgotten to enable interrupts in your idle loop.
There is a change in the format of AROS executables. Until now we were using Elf RELocable files which are usually used as intermediate object files. We had them for various reasons, one of them was how AROS files were built in the past. That days we had no real aros cross compiler and the option to embed relocation data in unix executables (or in executable files in general) was rather new and not every linux/unix system had it. Therefore we have decided to use intermediate files. Although it was somehow working (and it is still working :-)), it has some drawbacks. Therefore decided to introduce real Elf EXEC types, in first turn implemented on ARM target with option to expand in future to all other AROS architectures.
The first patch was pretty easy and appeared to work somehow. It generated nice executables with embedded relocation info. Not only that, it also removed all global symbols adjusting relocation data to be relative to the beginning of the sections. That move reduced number of symbols in each executable significantly (depending on the file between 20 and 80% of all symbols could be removed). The only symbols that stayed in the file are local ones - due to the nature of the patch wasn't able to remove them since we have not seen them in the symbol hash table.
The patch didn't worked though. The files were relocated, AROS kernel loaded, but it crashed very early. What happened? Well, the nature of ARM relocations happened :)
Most of the relocation data on all machines is rather simple. Relocation can be absolute or pc-relative, sometimes the offset has to be bit shifted. On ARM v7 there is another one. There, when one wants to load an address of function/variable into register a combination of two instructions can be used: movw and movt. The first one loads immediate into lower 16 bits of a register while clearing upper 16 bits. The second one loads immediate into upper 16 bits without touching lower halfword. Loading of a pointer into a register looks like this:
movw r0, #:lower16:label
movt r0, #:upper16:label
In this case there are two relocations - one for lower halfword and another for upper. If an overflow of lower 16 bits occurs during relocation process, the upper one should be updated as well. Unfortunately with current patch and with typical ARM executables there is not enough information to perform the calculations.
There are two options - the first one would be to give up and go back to "fake" executables, another one would be to change from REL to RELA relocation info. The latter contains an addend, extra data which can be used to perform all the relocation calculations I need.
Decided for the second option. The patch is already in the works. There is another function for the binutils' bfd backend to perform the final relocation. There can decide what to do with every reloc info, modify data and eventually strip some symbols. An advantage is - at this stage of the linking process have also full access to all local symbols so can change all relocations section relative and eventually strip all symbols from the files.
GPU
VCore developed by Alphamosaic Ltd and now owned by Broadcom. Most of start.elf runs on the GPU. Placing ALL the userland GPU code in the videocore.hidd isn't going to be a terribly big problem because the code they published is nothing more than a shim that sends data straight to the GPU to execute.
The good news about this is that we only need to write our HIDD using the OpenVG API. The shim is relatively small codewise and lives in the ARM memory (the actual OpenVG code itself lives in the GPU RAM area and its loaded from start.elf). That's also the bad news. Our driver has to translate AROS video calls to OpenVG calls, for most tasks it should be easy, for some, not so much. It's still probably less difficult and less work, than controlling the GPU directly.
The other good news is that anything done through OpenVG happens on the GPU, its truly accelerated. It also has some nice font functions, meaning we can lead into an accelerated text mode later.
Basically, AROS resets or locks up when it tries to use AROS_ATOMIC_INC or DEC. If I comment out the byte/word operations in the header files and use non-atomic operations, the code works as expected.
have read that the L1 cache needs to be enabled to use LDREX and co (which I also read is only meant to be used on multi processor systems with shared memory) - however I am certain this is correctly enabled.
If you are using LREX or STREX, you should have L1 cache enabled, at least on the ARM CPU I work with at work.
L1 cache is enabled by enabling the MMU *AND* setting the C and I bits in the CPU - the C bit is ignored, and the I bit only covers the 16 byte instruction pipeline if the MMU is not enabled.
Can you verify that your assembly is generating LDREX/STREX? From the behavior, it almost sounds like its generating the default Semaphore locked atomics.
Impossible. There are no semaphore-locked atomics. There are Disable()/Enable()-based ones instead. And there's a special #define AROS_NO_ATOMIC_OPERATIONS in this case, which tweaks Disable()/Enable() implementations not to recurse forever.
I have tested this on ARMv5 which does not have ldrex/strex, it works fine. On those ARMs there's no way to have real atomics. On other OSes (like Linux) this is done by introducing things like atomic_t, which appears to be a complex structure, holding the value together with accompanying spinlock (implemented using swp).
#warning "TODO: lookup optimal mmu table settings for raspi memory"
/* Set up an identity-mapping for all 4GB */
for(x = 0; x < 4096; x ++)
{
pagetable[x] = x<<20 | (0x40002|0x80000|0x010000|0x00C00|0x04);
}
Shouldn't there be a second loop that sets the 'C' bit in the descriptor for the RAM pages?
Currently, you have TEX=0, C=0, B=1 for all pages (Shared Device).
You should have TEX=0, C=1, B=0 for RAM (Write-Through, Cached)
So ..
pagetable[x] = x<<20 | 2;
should be enough?
No, for RAM you need to change the '| 0x40' to '| 0x80'
tell dosboot the correct defaults to use
Please don't do this. This bootconfig.c is a deprecated legacy thing. I wanted it to go away completely with time. Instead, display drivers should auto-install themselves during own initialization phase. I. e. detect hardware=>instantiate itself. This should make things way simpler. With this approach you only need to add the driver into KS image to get the device autobooted. No hardcoded stuff.
Currently VESA and VGA drivers do this, look there for examples. never rewrote ATI driver because i don't have any test system for it.
they defined a smaller AROSCPUContext than the ExceptionContext - yet reference it as ExceptionContext in other places, and since it hasn't allocated enough storage for ExceptionContext, are corrupting memory/the structure (since the elements that are there don't map 1 to 1 with the exception context).
AFAIK, AROS has been moving in a different direction to this in recent years. It is the job of graphics HIDDs to allocate bitmaps etc. so that they have the most suitable characteristics, including allocating them from GPU RAM where possible. The concept of chip RAM is only for legacy code, and most if not all non-68k platforms should have all system RAM
marked as chip.
BTW, is the video processing code you mention CPU code or GPU code?
Also, IIRC we have support for "external memory allocators". Perhaps that's what we need for the allocation of GPU RAM through the mailbox.
All hosted and x86 native ports should use proper context formats.
trying to clarify if the vblank handler has to have run by this point to prevent this deadlock. Actually, no. Unless you have installed VBlank handler which should wake up at some point. Without VBlank there will be no quantum count. Consequently, there will be no forced preemption. But the rest will work, and multitasking will be cooperative (switch happens only when current task voluntarily gives up the CPU). Does it depend on the vblank having run before this point? and if yes what does that mean on systems where it might be able to run enough code (e.g. get to this point) before the vblank interrupt has triggered? What is it waiting for? It could wait for timer, in this case you need timer.device working. VBlank is currently needed for exec's quantum counter. In current native ports we have only a single timer, which is served by timer.device. VBlank is simulated by timer.device also. If your machine has two timers, then you can use one of them for VBlank, and another for timer.device, this will simplify things down. VBlank needs to be 50 Hz for historical reasons, many programs use it as cheap timer. I am periodically thinking about making some abstract mechanism to be able to change quantum source (and untie it from 50 Hz), but have no time to come up with something good. Additionally i started disliking timer.device hardcoded design when PC has got many timers (old 8253, APIC, HPET).
Currently i think there should be some low-level entity representing tick source. timer.device should just select the most appropriate source for its units.
The BCM2835 has 4 GPU based timer sources - 2 are used by the GPU, so im using Timer3 for our heartbeat and the remaining one will be free to the system. There is also the less capable ARM timer but that is dependent on the CPU frequency. Very good. You won't need any emulation. Set the heartbeat to 50 Hz and drive VBlank from it. Use other timer for MicroHZ.
Can you use the 'econsole.hook' I make for debugging the Sam460 via the serial port?
It provides a before-anything-else shell prompt on the serial port. You can then do 'NewCLI' to test your graphics, or use any DOS command in shellcommands.resource.
You should just be able to add econsole.hook to your module list, and use 'econsole' in your bootargs.
So long as you have a working Exec/RawMayGetChar and Exec/RawPutChar, it should work.
Also make sure to add shell.resource and shellcommands.resource for this.
That should have done it.
If you set "#define DEBUG 1" in arch/all-native/econsole/econsole.c, do you get any additional serial output?
have added it to the build and added econsole to the command line - and can see the bootloader picks up on the emergency bootconsole tag, but I still only get the insert bootable media display?
Im assuming it exposes a fake filesystem that tricks aros into booting?
The contents of which are: ECON:AROS.boot
Way to handle the scheduling code? The implementations I had been following were causing problems, due to cascading interrupts which I cant handle properly in the asm stubs just now (when they break disable etc.) - since it means detecting the interrupted codes cpu mode and getting the correct sp/lr for it, and that's just too tedious for arm.
To work around this ive added a system idle task which does nothing - and when the scheduling code has no task to run switches this in and lets it run, thereby allowing the interrupts etc to resume until something does need to happen.
Also, by adding accounting code to cpu_Switch() and cpu_Dispatch(), it should allow the system to log idle time correctly (as well as running tasks).
have thought of also adding an additional task that never runs, solely to record time spent in IRQ handlers, but I digress..
was under the impression that kernel.resource should *never* be used outside of exec.library. This is a wrong impression.
Michal started designing it because portable nature of AROS does not fit well into exec's API with all its assumptions. So, he started the new, hardware-agnostic kernel API from scratch. Yes, exec sits on top of it in places. But kernel always meant to be open thing. Otherwise it would not exist.
it wasn't meant to be just used willy nilly by user code - but by lower system components (e.g. exec) so that they could be implemented in a more generic fashion, and the kernel resource itself hide the systems quirks.
Adding new things there perfectly keeps up with our decision to minimize AROS-specific intervention into APIs which can clash with MorphOS or Amiga OS4 extensions. We want at least source-level compatibility there. Binary compatibility on PPC would be extremely cool, but at the other hand we have no maintainer for this, as well as their ABIs splintering.
It depends on what exactly is being implemented - there's no reason we should have everything crammed into kernel.resource if it doesn't need to be (i.e. if its better suited as a separate component/subsystem in its own right)
The _LE versions are for when you have endian swapping taking place. If the graphics are the same endian as the CPU, no swapping should occur. I ran into a similar terminology problem in SDL with a friend insisting that his Radeon 7000 on his PC was big-endian. It is not, it just uses the same endianness for the graphics card and the CPU so no swapping was necessary. They were both little-endian.
The _LE versions are because the PixFmts refer to the bitmap data being in big endian format in memory, for which the normal version would need to do endianness conversion before applying the shifts/masks. on this platform it is in _LE in memory also so we don't need the conversion hence using the _LE version of the call). would use _LE (if it's really little endian 16 bit mode).
What is the bare minimum needed to implement a framebuffer based gfx driver, with our software handling the rest?
Have tried with just a gfx class that only expose new/dispose/newbitmap - and having an onscreenbitmap used only for the framebuffer itself (with all other bitmaps being chunkybm, and the framebuffer's superclass also being chunkybm), but that alone isn't enough it seems?
You can use workbench/hidds/sm502/ as your example - it is as simple as I could make it.
So, AROS creates the framebuffer bitmap (verified this) -> so surely it should be capable of then rendeing into it? I don't actually create the framebuffer "bitmap object" myself - only as a result of being asked to. The code I currently have on SVN seems to create the framebuffers bitmap object fine, but then crashes in intuitions DisplayDriver callback. In particular it crashes performing the getattr on the system default pointer. don't expose MEMF_CHIP in an allocatable form so AllocSpriteData was failing (and other code later doesn't check if the values are valid == illegal memory accesses)
So far have -:
vc_init: queries the gpus memory, and sets up a fake memory handler for it, then adds the bootmode driver and returns saying all is well
vc_gfxhidd:New: sets up some fake syncmodes to test with and creates the real gfx object.
vc_gfxhidd:NewBitmap: checks if its a framebuffer and uses the onbitmap class or uses the chunkybm class otherwise
vc_onbitmap:New; creates a chunkybm object and then pushes the real framebuffer address into it as the buffer,
vc4 had v8adds, v8subs, v8muld, v8min and v8max which operated on four 8bit uint values packed into a 32bit register. Multiplication was in the range 0.0 to 1.0 and addition/subtraction saturated. There were also a range unpacking/packing modes that allowed you to pack and unpack 8bit values into 32bit registers.
RasPi has to speak to the "operating system" which runs on the GPU itself and request/free memory - it cant directly manage it itself, and so the managed functions were used to wrap these calls.
The Arm and GPU share memory space. The framebuffer is shared. The Arm can write a pixel and it will appear on the screen (through GPU hardware) without flushing/copying being required.
The GPU can composite multiple FB's in real time - so you have a number of surfaces defined which are rotated etc and composited in real time to the output. Copying can map from the address space of the Arm to the flat space of the GPU which takes some code, but I don't think whole buffers are copied.
The DMA hardware can also access the whole memory space and can perform 2D fills and blits (no blending). This is documented in the peripheral spec posted. The DMA is just an Arm accessible peripheral and can be set up with low latency (e.g. microseconds).
must use a 0xc0000000-based bus address to access SDRAM, yet non-DMA access should go via a 0x0-based bus address.
For 2D dma, set TDMODE, and the spec says "interpret the TXFR_LEN register as YLENGTH number of transfers each of XLENGTH, and add the strides to the address after each transfer." so set STRIDE to pitch of the image, the width is XLENGTH and height is YLENGTH. You would fill by not setting the SRC_INC and point source to your fill data.
The DMA cannot see the ARM's L1 cache, so you would map the framebuffer with ioremap_nocache. Depending on where the source data comes from, it may need an L1 cache flush. The DMA can see the L2 cache. Use 0xC0000000 bus addresses when L2 is disabled and 0x40000000 bus addresses when L2 is enabled. (actually just call virt_to_bus and you'll get the right address out).
openGLES/openVG has high latency. Writing to framebuffer then reading it back is very inefficient (e.g. milliseconds). If you can drive it a unidirectional way, just streaming commands at then that is efficient. openVG is not implemented on top of openGLES - it uses the same hardware but as a first class interface
To improve the Gfx driver, we will need a DMA resource implemented so can use to perform DMA operations. The Gfx driver will need this to perform blits.
Actually MEMF_CHIP has to present, for historical reasons.
This has been never fully agreed upon, but in ports i wrote i exposed the whole memory as MEMF_CHIP. The idea behind this is that CHIP is originally the memory where graphics and sound data can be put. On non-Amiga platforms there are no restrictions on this, so the whole memory is CHIP.
Yes, many old software can misbehave with CHIP memory size larger than 2MB. But this actually applies only to m68k AROS which is going to run m68k binaries. In other cases it's quite logical to fix the program when porting.
As to original question: yes, it's enough to have a framebuffer bitmap (one with aoHidd_BitMap_FrameBuffer set to TRUE) and PutPixel routine. It framebuffer can be served by chunky bitmap class, then you can simply create chunky bitmap with your own buffer (see how VESA driver does this). Chunky PutPixel is already there.
struggling to determine what is the correct pixfmt to use for the 24/16/15 bit gfx modes on the RasPi. AFAIK it uses RGB565, for 16bit but im unsure what shifts etc should go with it? suffice to say Im getting the wrong colors so far lol.
<pre>
redmask: 0x0000F800
greenmask: 0x000007E0
bluemask: 0x0000001F
alphamask: 0
redshift: 16
greenshift: 21
blueshift: 27
alphashift: 0
</pre>
It should likely be vHidd_StdPixFmt_RGB16_LE
This stuff is a bit confusing. The "names" of the stdpixfmts are based on the layout in memory,
ignoring endianess. So for example:
ARGB32: will be 0xAA 0xRR 0xGG 0xBB in memory on both big endian and little endian machines.
The shifts and masks OTOH are based on pixel access (ULONG in this case), so differ depending
on whether you run on big endian machine or little endian machine (that's why there's stdpixfmt_le.h and
stdpixfmt_be.h in rom/hidds/graphics/).
With the 16 bit pixel format it's even more confusing, as for example it's impossible on little endian machine
to describe RGB16 with shifts/masks alone. That's why there's vHidd_PixFmt_SwapPixelBytes_Flag.
(RGB16 == RRRRRGGG GGGBBBBB in memory, and for pixel (WORD) access on little endian machine it needs to
be accessed as GGGBBBBBRRRRRGGGG).
The shifts btw indicate how much to shift the component to the left (!) so that it is moved to the highest bit (31).
The aHidd_PixFmt_StdPixFmt you specify will be ignored most of the time, because when the pixelfmt is registered,
the gfx hidd checks if there's an identical pixfmt (shifts/masks/etc., but ignoring pixfmt->stdpixfmt) already in the system,
and if so, it uses the already existing one and does not create a new one.
In theory it would be better if gfx drivers could simply/only specify a StdPixFmt without all the shifts/masks stuff when the
gfx driver uses pixfmt which matches one of the stdpixfmts exactly. Another possibility would be for gfx drivers to use
HIDD_Gfx_GetPIxFmt(stdpixfmt_gfx_driver_wants_to_use) and then peek shifts/masks from it and fill out a pixfmt
tag list based on that.
15bit very blue/green: Try to pass same shifts/masks/etc. as in 16 bit pixfmt (maybe you think it's using 15 bit R5G5B5
(or swapped) but it's actually still using 16 bit R5G6B5 (or swapped).
aHidd_PixFmt_StdPixFmt you pass is mostly ignored. It's the shift/masks/etc. that count.
But I would still pass the correct one (_LE) == whatever rom/hidds/graphics/stdpixfmts_??.h uses
in the entry where you have looked up shifts/masks/etc.
Use the shifts/masks/etc. from the entry in stdpixfmt_le.h (if you are running on little endian machine) or stdpixfmt_be.h (if you
are running on little endian machine) that matches the pixfmt that its meant to be.
0xAA,0xRR,0xGG,0xBB on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_BGRA32)
0xAA,0xRR,0xGG,0xBB on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_BGRA32)
it feels like AROS trashes the alpha component, otherwise it should be 8A8R8G8B.
read on the subject suggest its in 1x5r5g5b (x is ignored) to keep 16bit alignment .
Suggests to me that wrong shift/mask are being applied - however going by the 16bit versions it all looks correct to me so I am really confused as to what is happening.
The output image looks to have too much green/blue, and very weak red.
Kickstart
The idea is to minimize amount of archirecture-specific modules to make the user's life easier. So, the kickstart was split into 'base' (which does not contain anything machine-specific) and 'BSP' (Board Support Package) which contains all hardware-specific stuff. This way, for example, distribution makers can save up space on CD and make CDs with multiple platform support. Different configuration would load the same base with different BSP's.
Next there was some part which is entirely missing on hosted. These are filesystems. Hosted ports do not need them to boot up, so on hosted they are left out. At the other hand, they are also architecture-agnostic. So i put them into 'FS' package (standing for 'filesystem').
USB
Poseidon is one more big part. I made it into separate package in order to allow users to omit it if they don't need it (for example, to run on retro PCs without USB). Personally i have one. Again, Poseidon is hardware-agnostic (well, there are USB drivers but HCIs are pretty standard).
AFAIK its HCI 1.0 compliant but not familiar enough with poseidons drivers, nor USB, to just hack away at the existing code. Perhaps once i'm more familiar with the workings I can merge in the changes needed to get it operating but for now I will focus on getting it running. Also our drivers have known issues so perhaps a fresh set of eyes might shed some light on what is going wrong.
Another interesting question is whether Poseidon can operate on device side. Is it flexible enough? How similar is being a USB host and USB device? think it will need a bit of work on Poseidon's side. Until then I will force the driver into Host/Master mode in the init code, but leave open device etc to configure the chipset for either's use - and look at trying to add support for working in Device/Slave mode & switching modes once it's up and running.
Actually USBROMStartup is some kind of kludge. Can there be any alternative? Could device drivers be self-installing, like our HIDDs? This would get rid of need to list them in USBRomStartup.
* Model A and B limited to 150 mA per port.
* Model B+ and Pi 2 introduced configurable 600 mA to 1.2 A support over all ports - anything above that requires a powered USB hub.
Implementing the hardware driver that Poseidon uses to interact with the USB components.
Have code in place to (try) and initialise the USB chipset, and configure host/device mode operation (though AFAICT Poseidon doesn't support device mode). Started to get the "virtual" root hub written for the single USB port so that Poseidon should at least list it correctly in the GUI - and try to interact with it to find peripherals.
The BCM2835 uses a soft IP block from Synopsys’ DesignWare library (DWC), specifically the block is called dwc_usb_2_0_hs_otg_subsystem-ahb_se (“USB 2.0 Hi-Speed OTG Controller Subsystem w/AHB Interface SE”).
There is no public documentation for this, and pretty much zero chance of anyone getting hold of it even with NDA. However, there's a Linux driver written by Synopsys ([https://github.com/raspberrypi/linux dwc_usb]). Specifically directories [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_common_port] and [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_otg].
The Synopsys code is actually under a fairly permissive licence – it's not GPL, it's similar to BSD (’don't sue us if it breaks’ is pretty much the only clause). So this should not be a barrier to porting the code.
The code is really well written, with a nice partition between the work done by the driver (dwc_otg, which is fairly involved, given the host does more work than a conventional EHCI driver), and the interface to Linux (dwc_common_port).
Probably only need provision of relevant changes to dwc_common_port. Other things to consider....
* Provision of necessary headers to get it to compile
* Provision of necessary functions (main issues are wait queues, threads, work queues, tasklets, timers, spinlocks and mutexes (multithreading) )
* Interfacing between USB stack and the driver. dwc_otg/dwc_otg_hcd_linux.c looks like the place to start.
the Linux bits of the headers are only required for the dwc_common_port library. dwc_common_port includes a variety of crypto functions which are not used – it appears to also be used for ultrawideband (UWB) and wireless USB (WUSB) drivers where crypto will be an issue, but it isn't going to be for plain wired USB.
Every USB driver acts as an USB hub as well in order to let Poseidon control the state of USB ports. The code there was reading status of the only USB port in Raspberry's CPU but when changing the status it erroneously deleted some of the status bits, including the port enable one. It was so because those bits in the status register are of a type Read/WriteToClear. It means, if one does not want to change their value from 1 back to 0, one has to actually write the 0 value. Very practical thing e.g. in interrupt handlers, where one reads the interrupt status register to learn what was the interrupt reason, and writes it back to the same register in order to clear the interrupts.
After fixing that code it turned out that the communication was still unsuccessful. Apparently the USB device was not understanding the host for some reason. That should not happen since the request sent was one of the standard ones implemented by virtually anything with an USB connector, assumed that Poseidon clears the data caches before forwarding the work to the USB drivers but that's the responsibility of the driver itself.
The USB device responded and acknowledged the transmission! But why were all the request sent after address change failing with timeout? They should not. Once again, address set is supported just by anything. Tried to contact the device at address 0 once again and there it was, still responding properly. The enlightenment came. The bus address for DMA transmissions was, as it is in many bare metal USB implementations, just the pure memory address of the buffer as seen by the ARM cpu. Have "prefixed" it with the real location of uncached RAM and booted AROS once again.
Trident saw this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
and this:
Product : Vendor: Vdr=0424/PID=EC00
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 255
SubClass : 0
DevProto : 1
VendorID : 1060
ProductID : 60416
DevVers : 0200
and even this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
What are these things? The first one is USB hub built in the Raspberry. Thanks to this one the Pi machines (with exception of Pi0 and computing modules) have more than just one single USB port. The second one is the network chip in raspberry, the third one is my USB SD card reader which have just connected to see what happens. AROS tried, of course, to boot from it ;)
So, the first step towards working USB is done. The control transfers are working as you can see above. Next step is to implement bulk and interrupt transfers, having the basics in place. Finally some error handling will be added and USB for Pi will be as complete as the PC version.
[http://www.raspyfi.com/raspberry-pi-usb-audio-fix/ Issue with USB Audio]
Audio
The Pi 4B is the only Pi that can output HD Audio as an HD Audio passthrough bitstream, and it does it over HDMI. It's possible to use the two HDMI output for separate HDMI video and HDMI audio outputs to allow UHD HDR video and HD Audio with non-UHD HDR compatible AVRs.
The Pi3B+ and earlier will decode to PCM 5.1/7.1 and output over HDMI. HDMI is the only interconnect that has a standard for carrying Dolby True HD, DTS HD MA etc. as a bitstream - you can't carry it as a bitstream on any other interface.
Pi3 and Pi4 audio jack output derived from 12bit pulse width modulation is relatively poor. For better, choose USB Audio or I2C versions.
[https://github.com/raspberrypi/linux/tree/rpi-patches/sound/arm audio] and its [https://github.com/raspberrypi/firmware/issues/2 very high speed message passing interface type of thing VCHI]
The Model B+ added an additional voltage regulator for the audio output and an additional output driver to drive low-resistance loads like headphones. However it is still using pulse-width modulation (PWM), which has a major impact on sound quality
the old Raspberry Pi used a linear voltage regulator to provide the 3.3V to many of the components on the board while the new one uses a switching regulator. Both can perform reasonably well. However switch mode power supplies often show higher noise figures
Analogue audio
Audio over HDMI rev 1.3 & 1.4
Ethernet
10/100 BaseT Ethernet RJ45 socket
GPIO
GPIO shouldn't be too bad but bear in mind it is already accessed in places so they would need to allocate pins etc through it (e.g. sdcard to flicker the activity light, serial debug to output data on the GPIO pins)
Probably a resource rather than a device...
Started an i2c driver that will need to allocate GPIO pins. Feel free to work on it if you are interested ;p
GPU graphics with 2D and 3D acceleration
Sadly none yet for 32bit but for 64bit...
Miscellanous
hdmi issues
Setting the hdmi_force_hotplug=1 makes sure the Pi believes the monitor/TV is really there.
You might also need to set config_hdmi_boost=4 or even higher (up to 9) if your display needs a stronger signal.
If the display is a computer monitor or newer tv, use hdmi_group=1 (auto HDMI use) and if it is an older TV, try hdmi_group=2 (for DMT formats, i.e. for PC monitors) then you HAVE to "set hdmi_drive = 2 to enable HDMI output as this forces HDMI mode rather than DVI mode
Do not set hdmi_safe=1 as that overrides many of the previous options.
Using a shorter or better quality HDMI cable might help. Make sure your Pi's power supply delivers 1 A and not 500 mA.
If you see a problem with the red colour - either absent, or interference - then try a boost
composite video
changing the RCA cable, then the composite port worked out of the box
Boot it as you are doing, without HDMI. If you now plug in the HDMI, do you get the image? In other words, does the Pi think HDMI is connected even when it isn't?
Rename all the files in the first partion of the card except bootcode.bin, start.elf and fixup.dat What's the result?
Put back config.txt What's the result?
for PAL mode sdtv_mode=2
dmi_ignore_hotplug Pretends HDMI hotplug signal is not asserted so it appears a HDMI display is not attached
hdmi_ignore_hotplug=1 Use composite mode even if HDMI monitor is detected
<pre>
# NOOBS Auto-generated Settings:
#hdmi_force_hotplug=1
#config_hdmi_boost=4
#overscan_left=24
#overscan_right=24
#overscan_top=16
#overscan_bottom=16
#disable_overscan=0
start_x=1
gpu_mem=128
</pre>
tvservice -c "PAL 4:3"
<pre>
/opt/vc/bin/tvservice -s or tvservice -s
state: HPD high|HDMI mode|HDCP off|composite off (0x12001a), 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m CEA
Group CEA has 1 modes:
(native) mode 16: 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m DMT
Group DMT has 0 modes:
</pre>
sudo amixer cset numid=3 1
forces the audio to the headphone jack, even with the HDMI video output plugged in
config.txt
the hdmi_ignore_edid_audio=1 option sems relevant as it should tell ALSA that the only available audio is analog, no matter what the display says
There are several different ways that these 4 pole (ring) composite analog cables can be wired up, so some work great in some applications and can be a waste of time in others.
What is needed for the Raspberry Pi B+ and above, which like many camcorders needs the ring contact next to the base contact to be the ground.
The wiring for the 4 pole are:
TIP (LEFT AUDIO CHANNEL)
RING 1 (RIGHT AUDIO CHANNEL)
RING 2 (GROUND/EARTH)
RING 3 BASE/SLEEVE (VIDEO) YELLOW
Most Apple based Players and the Microsoft Zune (TM) are wired this way.
Most analogue camcorders are wired this way as well, where the ground in on Ring 2 will work with the Pi although you may need to swap your Video plug with the Right Audio plug.
Nearly all other MP3 players are not wired this way, the ground is on another ring ie the wrong one.
External devices
* Camera Module Omnivision ov5647 Sunny 5MP (NoIR version) V1.3 - NoIR at 850 nm, peak at 880 nm and trails off at 940 nm wavelengths
* Camera V2 Sony IMX219 V2.1 8mpixel 8MP 8megapixel - 3280 x 2464 pixels - video at 1080p30, 720p60 and 640x480p90 - wider field of view, 62 vs 54 degrees horizontally -
* Branded WIFI usb BCM43143 dongle
N.B. dreaded error after changing cameras (stupidly without turning off the power first) and lasted through several power cycles. It can be a bad 15-pin FFC ribbon cable, when swapped, camera(s) and the Pi itself are working OK. It can be an instance of a cold solder joint on the CSI connector on the pi board. the camera can be detected (that's done via I2C) but may still not be able to receive image data (done via CSI-2) if something is broken. CSI-2 is uni-directional. Control is generally done via I2C.
The CSI-2 receiver always writes to memory, not direct to the ISP. That's the way the Broadcom architecture works as it allows multipass processing easily. GPU memory is accessible from the ARM. Processing using the QPU graphics processors may be possible. currently the only supported sensor is OV5647 and IMX219. The linux drivers are all in the firmware blob, else you'd be looking at at least a man-month of work in a fully fledged imaging lab to do a decent tuning of the camera modules' ISP parameters.
Static electricity maybe an issue for the camera module and slightly less for the pi board.
== References ==
===Good sites to visit===
*[https://github.com/raspberrypi/firmware/tree/master/ Raspberry Pi Firmware build]
*[https://www.raspberrypi.com/documentation/computers/software-sources.html Documentation]
*[https://rpilocator.com/ RPiLocator]
Linux only
*[https://github.com/raspberrypi/linux Raspberry Pi Linux Build]
*[https://dietpi.com/ DietPi]
*[http://www.tinycorelinux.net/ports.html piCore]
*[https://wiki.alpinelinux.org/wiki/Raspberry_Pi Alpine Linux]
*[https://github.com/armbian/build Armbian]
*[ FydeOS]
*[ TwisterOS based on ChromiumOS]
*[https://note.com/jamesmondo/n/nc76e31402be8?hl=en BSD]
*[https://www.raspberrypi.com/software/operating-systems/ PiOS Lite] and then [https://hstwb.firstrealize.com/ HST]
*[ PiMiga for pi4 and pi5]
*[ amibian for pi2 and pi3]
*[ retropie pi1 and 2]
Other alternative lighter smaller than Pi OS
*[https://aros.sourceforge.io/nightly1.html Aros 64bit ARMV8 single core]
*[https://www.riscosopen.org/wiki/documentation/show/Welcome%20to%20RISC%20OS%20Pi RiscOS on Pi3 and Pi4]
*[https://github.com/michalsc/Emu68 ARM based realtime JIT 68k for amiga computers]
*[https://github.com/JJDSNT/bellatrix/releases/ Alternative use of Emu68 on Pi3b]
*[https://github.com/stevereaver/uaos uaOS with Emu68k]
*[https://github.com/aros-development-team/AROS/commit/f80a268607dfae81b2db94755ab4e4d31ccb72d6 m68kemu library reference]
*[ HaikuOS]
*[https://github.com/raspberrypi/noobs NOOBS] os loader with successor [https://github.com/procount/pinn PINN]
*[https://github.com/maxnet/berryboot berryboot]
*[https://github.com/brianwiddas/pi-baremetal Bare Metal Access on Pi 32bit]
Testing procedure is put sd card in, connect board to board if necessary, plug in hdmi and then power nothing else is done especially CSI DSI etc
[https://www.raspberrypi.com/documentation/computers/compute-module.html CM5] has the same 55mm x 40mm 2x100pin connectors form factor as the CM4 but [https://www.epdtonthenet.net/article/214508/Key-Considerations-When-Migrating-from-Raspberry-Pi-CM4-to-CM5.aspx some pins and other small things] have changed. Will need the [https://raspipcb.com/tech-blog/raspberry-pi-cm4-vs-cm5-difference-in-booting-from-sd-card/ right IO board to suit]
*Green [ Raspberry Pi Compute Module 5 IO Board REV2 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1967]] - untested
*Green [ RPi Compute Module 5 IO board REV1 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1751]] - untested
*Black SupTronics Geekbord X1500 CM5 IO Carrier Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*[https://sipeed.com/nanocluster Sipeed NanoCluster] - untested up to 7 CM5
*Green BentoIO CMX0 - untested
*Box EDATec ED-CLAWBOX - untested
*Home Assistant Yellow - Kit with PoE with Raspberry Pi Compute Module 5 - untested
*Blue [https://www.waveshare.com/wiki/CM5_PoE_BASE_A Waveshare CM5-PoE-BASE-A] - untested
*Box Waveshare [ CM5-POE-BOX-A] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-B Waveshare CM5-IO-BASE-B] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-A Waveshare CM5-IO-BASE-A] - untested
*Blue Waveshare [https://www.waveshare.com/wiki/CM5-NANO-B CM5-NANO-B] - untested
*[https://carboncomputers.us/products/pi-flux piFlux]
*[https://carboncomputers.us/products/ Zitaotech Hackberry] CM5 lite only -
*Portable [https://www.waveshare.com/pocketterm35.htm Waveshare PocketTerm35] with Pi4B or Pi5 - untested
*Box [https://www.clockworkpi.com/uconsole ClockworkPi uConsole][https://www.youtube.com/watch?v=EtI_bAahbR8 CM4 into an adapter or CM3 into so-dimm - Cyberdeck] - untested
*Green RPi [https://datasheets.raspberrypi.com/cm4io/CM4IO-KiCAD.zip Compute Module 4] [https://datasheets.raspberrypi.com/cm4io/cm4io-datasheet.pdf IO board] V1.4 [https://datasheets.raspberrypi.com/cm4io/CM4IOUSB3-KiCAD.zip USB3] [https://datasheets.raspberrypi.com/cm4io/cm4iousb3-appnote.pdf CM4ISO] [https://datasheets.raspberrypi.com/cm4/cm4-datasheet.pdf Dual100pin] (2020) aka Development Platform Board - untested
*Purple Pi Hut Cytron CM4 Maker Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*[ KubeSail PiBox mini 2]
*Home Assistant Yellow with Raspberry Pi Compute Module 4 - untested
*[ Turing Pi V2] - untested CM4 with 260-pin SO-DIMM socket adapters and/or nvidia jetson nanos - untested
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-C Waveshare CM4-IO-BASE-C] - untested but binary blobs Rev01 Rev02
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-B Waveshare CM4-IO-BASE-B] - untested but binary blobs
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-A Waveshare CM4-IO-BASE-A] - untested but binary blobs
*Blue [https://www.waveshare.com/wiki/CM4-NANO-B Waveshare CM4-NANO] - untested but usb and audio turned off or rerouted
*Black [ Seeed Studio with BigTreeTech BTT pad 7] - bin blobs?
CM3 has a 200 pin sodimm ddr2 connector form factor but not electrically SC0028, SC0029
*Blue [https://wiki.geekworm.com/CM_IO_Board Geekworm RPi Compute Module IO Board] [https://github.com/geekworm-com/cm-io-board CSI DSI] with CM3 in ddr2 slot underside - '''works''' if SW1 on but CM3+ '''does not'''
*Green [https://cdn-shop.adafruit.com/product-files/3442/CMIO_schematic.pdf RPi V3 IO board CM3IO] and CM3 Lite - untested
*Green [https://turingpi.com/ turingpi v1 cluster] - untested up to 7 cm3 7xlan9514 12V discontinued, 3 x Pi4 homelab maybe better
*Blue [https://www.waveshare.com/wiki/Compute_Module_PoE_Board Waveshare Compute Module PoE Board] and CM3 lite (if not lite, write files to internal eMMC fat32) '''AVOID''' bin blobs
*Blue [https://www.waveshare.com/compute-module-io-board-plus.htm Waveshare Compute Module IO Board Plus] [https://www.waveshare.com/wiki/Compute_Module_IO_Board_Plus wiki] [https://forums.raspberrypi.com/viewtopic.php?t=235695 pin settings] with CM3+ Lite - '''AVOID''' binary blob
*[ Pi02w on Geekworm SupTronics X305 Raspberry Pi Zero IO Baseboard] - untested
*[ Spotpear Pi Zero 2w to Pi3b format-ish] - untested
*[ pi-top v4] box has 128x64 oled display, micro hdmi, 19Whr battery with pi4 and 15V PD 36W min needed
*[ pi-top v3] three green pieces, heatsink covers most of the base tray, pi-top hub mk1 lhs and Pi1B Pi2b Pi3b rhs secured from below, black rounded strip with pi-top above keyboard, 13.3" HD 1366 x 768 display, small touchpad,
*[ pi-top Model 2.0] pi-top on bottom bezel of 14-inch green laptop, large trackpad, keyboard slide down to reveal main system hub on slide rails moved to the right, Raspberry Pi3b screws down, hub slides in, 18V 2.5A 45W charger brick, battery 11.1V 3500mAh 38.85Wh and storage PiTopOS
*[ Pi-Top CEED Raspberry Pi Modular Educational Desktop with RPI3] monitor
*[https://www.indiegogo.com/en/projects/jesselozano/pi-top-a-raspberry-pi-laptop-you-build-yourself Pi-Top v1] wedge laptop with RPi2
<pre>
2008 Trustees collected for Foundation
2009 Pi Foundation charity status gained
2010
2011 First Raspberry prototypes
2012 First boards go on sale at CPC and RS. The Model A and B 700 MHz Arm11 - February 29th BCM 2835
2012 First million sold - more than the 10,000 original planned and anticipated
2013 First Alpha Experimental builds of AROS Native for the 32bit Pi
2013 Pi Trading launched making grants available, providing in house educational resources and Pi Academy for teacher training
2013 Over two million sold
2014 Over three million sold
2014 Pi 1 Model B+ introduced that moved composite video to audio jack and same half gig of memory
2014 Pi Model A+ v1.1 no ethernet and 1 usb - a little smaller -
2015 Over four million first gen pis sold
2015 Pi Zero 1.2 BCM2835 first production revision released with no camera port
2016 Pi0 1.3 released with camera csi connector
2017 Pi Zero W v1.1 1GHz Pi0W, single-core 32bit CPU BCM2835 released with Cypress CYW43438 wireless
2020 Raspberry Pi Pico SC0919 with RP2040 32-bit 2Core ARM Cortex-M0+ up to 133 MHz - 264KB of SRAM and 2MB of on-board QSPI Flash -
2024 Raspberry Pi Pico 2 with RP2350 2Core 32bit Arm Cortex-M33 and 2core open-hardware [https://github.com/wren6991/hazard3 Hazard3 RISC-V]
2015 Pi 2 Model B v1.1 BCM2836 900/600 MHz ARM Cortex-A7 Armv7 quad 32bit, 32bit VideoCore IV GPU - 1Gb RAM - 5V 2A micro usb - SMSC LAN9514 chip -
2015 Over a million pi2s sold
2015 Raspberry Pi 2 Model B version 1.2 Pi2bv1.2, aka Pi2B2 has armv8 BCM2837 underclocked to 900Mhz without wifi/bluetooth module
2016 Pi 3 Model B - Broadcom BCM2837 SOC four 64bit ARMv8 Cortex-A53 1.2GHz 32bit 1080p VideoCore IV GPU - 1Gb DDR2 - bluetooth 4.1, Cypress CYW43438 wireless 802.11n - 4 x USB2.0 ports - 5.1V 2.5A - SMSC LAN9514 chip
2016 PIs total over 10 million worldwide
2017 Compute Module 3 CM3 with BCM2837B0 armv8 Quad 64-bit - small 67.6mm x 31mm board which fits DDR2 SODIMM connector but not electrically compatible which plugs into needed IO board - beware of the I2C protocol issue
1Gb LPDDR2 RAM - Lite or 4Gb Emmc storage
2017 12 million pis sold in total
2018 Pi 3 Model B+ - 4c A53 BCM2837B0 1.4Ghz - 1Gb, wireless 802.11ac, gigabit ethernet (300Mbit/s) and bluetooth 4.2 - power over ethernet - 4 x USB2.0 ports - Microchip LAN7515 chip
2019 Over 15 million sold
2019 Pi 3 Model A+ with BCM2837b0 Cortex-A53 64-bit SoC @ 1.4 GHz with 512Mb LPDDR2, 1 usb2, 1 hdmi, 1 micro usb 5V 2A - no ethernet -
2019 Raspberry Pi Compute Module 3+ CM3+ - Broadcom BCM2837B0 1.2Ghz, Cortex-A53 (ARMv8) 64-bit SoC on DDR2 SODIMM mechanically compatible only factor - IO board required
1Gb DDR2 and 8GB, 16GB, 32GB or a Lite variant without eMMC
2021 Pi zero 2 (w or no W) RP3A0 quad 1GHz Cortex-A53 64bit BCM2710A1 512mB SDRam
2025 edaTEC CM0 ED-CM0NANA with additional dev board with quad 1Ghz A53 with 512Mb Raysan RAM, 2 USB2 and 10/100 ethernet - pico castellated edge
2019 Pi 4 Model B v1.1 RPI4B - BCM2711B0T quad 64bit A72 1.5GHz, 4K VideoCore VI, AC wifi, Bluetooth 5.0, GbE Broadcom BCM54213PE (PHY ID 0x600d84a2), 2 micro hdmi decode up to 4K, USB-C 5.1V 3A power, 2xVLI VL805 USB 3, 2xUSB 2.0, 2GB 9LDWW D9WHZ or 4GB 9FDWW D9WHV, 8GB 0AA47 D9ZCL ddr4 ram
2020 Silent Pi 4 v1.2 upgrade with more USB-c psu support
2020 PI400 BCM2711C0T 1.8GHz 4Gb DDR4 inside keyboard, 5.1V 5A 27W usb-c psu, 2 micro hdmi, external ide style 40pin gpio, no audio port -
2020 Raspberry Pi Compute Module 4 BCM2711B0T on new 55mm x 40mm 2x100 pin form factor with extra breakout IO board
CM4101000 1Gb RAM Lite SOM
CM4102000 2GB RAM Lite
CM4104000 4GB RAM Lite
CM4004008-4GB-RAM 8GB-EMMC SOM System on Modules
CM4104032 4GB RAM 32GB emmc
CM4108000 8GB RAM Lite
CM4008016 8GB RAM 16Gb eMMc
2021 Raspberry Pi SC0763 Compute Module 4S CM4S with ddr2 sodimm pinouts but not electrically the same with suitable IO board extra cost -
CM4S01000 1GB RAM Lite
CM4S01008 1GB RAM 8GB eMMC Flash
CM4S02000 2GB RAM Lite
CM4S04000 4GB RAM Lite
CM4S04016 4GB RAM 16Gb KLMAG1JETD-B041
CM4S08000 8GB RAM Lite
2021 Pi 4 v1.4 BCM2711B1 upgraded power regulator, to deal with 8gig of ram being more power hungry
2021-48 Raspberry Pi 4 model B v1.5 2GB
2023 Pi 5 v1.0 BCM2712 Quad A76 @2.4Ghz - VideoCore VII - no audio socket - dual 4k from mini hdmi - fan connector - 5.1V 5A psu
2024 Pi 5 2GB DDR4 version uses BCM2712D0
2024 Pi-500 with 8Gb LPDDR5 and membrane keyboard
2024 Pi 5 v1.1
2024 Raspberry Pi Compute Module 5 CM5 BCM2712 55mm x 40mm form factor with additional IO board
CM5004000 04GB RAM 0GB eMMC Lite
CM5008000 08GB RAM 0GB eMMC Lite
CM5016000 16GB RAM 0GB eMMC Lite
2025 Pi-500+ with 256GB NVMe storage, 16GB LPDDR4 RAM, and Gateron KS-33 Low Profile Blue mechanical keyboard switches
2025 Pi5 1GB DDR4 announced
2022 PiOS linux goes 64bit
2024 Pi Trading IPO stockmarket stock exchange listing
2026 April and May Aros 64bit fixed, added AHI audio, VC4 gfx started, usb functions added to rom
2026 June and July Aros 64bit usb2otg started, dma.resource, sdio.resource, bwfm.device wifi added
2026 Late July daily 64bit Pi3 LE little endian builds start
2026 August Pi 4, 400, 5 and 500 DTBs added, expanding existing support and wifi for Pi4 and Pi5
2026 August Pi5 HAT+ nvme and HDMI, AHI RPiI2S added, Pi4 HVS5 video scaler started,
2026
2027
2028 Pi 6
</pre>
The vcgencmd can be used to inspect and dump the current system configuration.
vcgencmd runs on top of VCHIQ as an RPC. The mailbox interface is an alternate but much simpler RPC.
VCHIQ is a bridge (queue) between the CPU and the GPU so they can communicate with the firmware.
Loads of [https://github.com/6by9/rpi3-gpiovirtbuf/blob/master/rpi3-gpiovirtbuf.c mailbox] which uses the GPIO control calls. [https://github.com/raspberrypi/firmware/wiki/Mailboxes may also be of interest]
A fair number of vcgencmd examples (search for vc_vchi_gencmd_init). [https://www.raspberrypi.org/forums/viewtopic.php?t=229203#p1406112 sends the relevant vcgencmd commands] to update the scaling kernel, but the [https://github.com/raspberrypi/userland/blob/master/host_applications/linux/apps/gencmd/gencmd.c command] is just a text string. Parsing and execution of the instructions is performed by the VideoCore firmware.
The Raspberry Pi runs two separate operating systems: Linux/Aros on the ARM, and a threedx RTOS called vcos running on the Videocore 4 VPU: vcos is commonly called "the firmware". Vcos is tasked with performing certain system services, for example running the display and audio outputs. The VCHI driver provides an interface to allow drivers to talk to vcos.
Doubtful, on any [https://www.web3d.org/ Web3d] [https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API WebGL] or [https://github.com/immersive-web/webxr WebXR] [https://developer.mozilla.org/en-US/docs/Web/API/WebXR_Device_API Device API] [https://developer.mozilla.org/en-US/docs/Web/API/XRInputSource XRInputSource] support. Hopefully, never/limited support features like location, peer-to-peer, invasive web apps, unwarranted storage, payments, proprietary video streaming etc
*spreadsheet [https://git.sheetjs.com/sheetjs/sheetjs sheetjs] [https://github.com/mleibman/SlickGrid SlickGrid] [https://github.com/6pac/SlickGrid SlickGrid] [https://github.com/jspreadsheet/ce jspreadsheet ce] [https://github.com/dream-num/Luckysheet Luckysheet] [https://github.com/ruilisi/fortune-sheet fortune-sheet] [https://github.com/dream-num/univer/ univer] probably without xlsx support
*presentations [https://github.com/impress/impress.js/ impress.js simplified] [https://github.com/bwlewis/slides slides] [https://zenomt.github.io/mdslides/ github markdown slides] [https://github.com/Patternslib/slides Patternslib slides markdown] probably without pptx support
*weather [https://github.com/kaushalsahu07/weather weather], [https://github.com/Himanshu3412/Weather-Forecast Weather Forecast],
==Future==
[https://github.com/ARMSX2/ARMSX2 Arm pi of pcsx2]
[https://tube.cadence.moe/ Cloudtube], [https://github.com/TeamPiped/documentation/blob/main/content/docs/public-instances/index.md TeamPiped], [], [], [],
[https://hyperpipe.codeberg.page/ hyperpipe], [https://ytify.pp.ua/ ytify], [], [],
[ ytdl], [https://github.com/golddominik893/liberatube liberatube]
[https://git.lolcat.ca/lolcat/4get 4get], [https://github.com/hnhx/librex librex], [], [],
{{BookCat}}
7igeidlgme4syt2ppo7e3iw0l7tjmck
4676518
4676517
2026-10-17T13:31:49Z
Jeff1138
301139
4676518
wikitext
text/x-wiki
{{ArosNav}}
[[#Native]]
[[#Hosted]]
[[#Build]]
[[#Hardware]]
[[#References]]
[[#Future]]
==Introduction==
[[File:Scalos00.png|thumb|Scalos on Aros Pi3b]]
Aros aims to cover Pi 3 to 5 512Mb+ RAM
Options to boot from using a good power source to prevent the yellow lightning symbol.
*With Pi3b+ the max you can get is 5.1V 2.5A with micro usb.
*With Pi4 5.1V 3A with usb-c
*With Pi5 5.1V 5A, the amps went ever upwards, even to 5.1V 9A with usb-c
* Pi500+ keyboard wedge - working but not much tested esp [https://github.com/aros-development-team/AROS/commit/48e9c8edcca4b5c1e1fe0b1123f2129f624af67b power button]
* Pi500 wedge with up to date bootloader via PiOS - working but not much testing esp [https://github.com/aros-development-team/AROS/commit/48e9c8edcca4b5c1e1fe0b1123f2129f624af67b power button]
* Pi 5 - Quad A76 64bit ARMv8 and RP1 "southbridge" with VideoCore 7 D0 (rev1.1) - untested
* Pi 5 - Quad A76 64bit ARMv8 and RP1 "southbridge" with VideoCore 7 Pre-D0 C1 (Rev1.0) - untested
* Pi400 RPI-400 keyboard wedge - resolution changing and audio from micro hdmi0 (near 40pin) and micro hdmi1 (near usb-c psu) - Fn F10 0x5e power on and off works or held down for over 7 seconds auto shutdown - keyboard ok - wifi and lan ethernet testing -
* Pi 4 - Quad A72 64bit ARMv8 with VideoCore 6
* Pi 3 - Quad A53 [https://www.raspberrypi.com/documentation/computers/processors.html 64 bit] ARMv8 with VideoCore 4 with '''fan''' to prevent overheating cpu 82C+ throttling
* Pi02W - Quad A53 64bit - boots but [https://forums.raspberrypi.com/viewtopic.php?p=2387984#p2387984 usb not working but did in the past],
* Pi 2 - Quad 32bit ARMv6 with VideoCore 4 - mostly not 64bit compatible
* Pi Model B+ 32bit ARMv6 with VideoCore 4 - not 64bit compatible
* Pi Model A and B 32bit ARMv6 with VideoCore 4 - not 64bit compatible
===Native===
* 2013-03 Kalamatee starts work
* 2015-04 Work continues with mschulz on the kernel and Kalamatee (NicJA) on gpio and usb
* 2018 [https://www.patreon.com/posts/i-owe-you-some-20956961 mschulz resume adding BE big endian support], [https://www.patreon.com/michal_schulz/posts Big endian on Pi]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bsek latest commits for pi 3b, 4 and 5 64bit]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=metaneutrons latest commits for Pi5]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bitplane latest commits for ARM]
====64bit====
'''Download''' A [https://archive.org/details/piAROS Pi Distribution (Distro) has started] and the contents copied to fat32 8GB+ microSD card (there will be drawers/folders - boot c Classes Demos Developer Devs Extras etc only showing). The SD can be plugged in to the Pi. And power on. [https://pi.amiga.icu/ Repository]
'''Not recommended''' but [https://aros.sourceforge.io/nightly1.html RaspberryPi 3, 3+, 4 and 5 64bit ArmV8 nightly builds] [https://sourceforge.net/projects/aros/files/ and alternative site and nightly2] which is a test version of '''very few''' apps with both raspi-aarch64-system and raspi-aarch64-contrib can be unbz2'd to a SD or SSD as appropriate.
64bit build works well on a single core LE little endian. Multicore [https://github.com/aros-development-team/AROS/commit/1df0747c2bda3523a43029725a709b1f377d84ec may follow]. Any issues booting could be down to the SD card so please use another SD to see if it is resolved. Remember Aros Arm uses FAT32 and Aros can detect issues with this format very acutely (once fault found, FAT 0x0FFFFFF7 bad cluster so no files written after that, no repair). Please report your experiences in the [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2138&pid=15057#post_15057 Aros forum thread], [https://forums.raspberrypi.com/viewforum.php?f=179 Raspberry Pi Aros Dev and User forums], [https://forums.raspberrypi.com/viewtopic.php?p=2387984#p2387984 previous Raspberry Pi forum thread]. Any bugs or issues can be [https://github.com/aros-development-team/AROS/issues described here to fix]
*Pi500+ untested usb3 booting or nvme ssd
*Pi500 untested usb3 booting
*Pi5 untested usb3 booting
*Pi400 boots with '''USB3''' port based sata3 ssd
*Pi4 untested (may need eeprom update from PiOS or Pi SD Imager)
*Pi 3 B+ is pre-configured for USB sata3 boot - untested
*Pi 3 B may need [https://www.youtube.com/watch?v=ubnwvxF3Klc PiOS to set OTP to boot from usb - do so at your own risk] - if OTP set to usb, boot works but slower than SD card
Speed write wise (top faster)
<pre>
*NVME Pi5 untested >1000MB/sec or faster if matched correctly
*Sata3 ssd 500MB/sec
*SD V90 90MB/sec 4K maybe 8K
*SD V60 60MB/sec 1080p
*SD U3 V30 30MB/sec 720p
*SD C10 U1 V10 A1 A2 10MB/sec minimum should be used now
*SD C06 6MB/sec
*SD C04 4MB/sec
</pre>
As a homage to the past, Aros shows a reduced number of icons but this can be changed by left mouse click in the window and then right click down to Window -> View -> All files
Windows can be manipulated by the top (moving) and the bottom right corner (resizing) only.
Zune like MUI gui interface, has a unique quirk in that after changing a setting in a text box, you may sometimes need to press Enter/Return before clicking OK, Save, etc
Double left mouse click on most picture (Developer/Debug/Tests/Datatypes), audio and video files are supported, via datatypes, by the multiview application.
Esc escape key usually closes open windows even the desktop
In Prefs/Appearance some decorative theming elements need work. There is a few Mason icons in /Prefs/Presets/Icons/Mason/ and the ever present default Gorilla - Icon exchange in works
For more intensive graphics applications, you may need to edit config.txt in the root folder and change 128M to 256M to adjust more memory to graphics usage
If your cursor should '''appear''' to vanish, fear not it is still there. Please head to the top of the screen i.e. the title bar, hold down the left click mouse and drag the screen down a little and the cursor will appear again. Then you can drag the screen up again.
Like most amiga like OSs the audio and networking need to be setup manually
Audio AHI prefs - Mode settings tab - needs both Music unit and Unit 0 set to RPiHDMI:16 bit stereo++ or RPiPWM:16 bit stereo++ at 44100Hz. Press '''Save or Use''' button after each choice
For wireless, please use the Wifi prefs and already selected device bwfm.device. Press Scan and double right click on the router and enter password. You may need to setup after every power off
*if asking for password again - press cancel and go to Network Prefs, Wireless Networks tab and highlight the router line and hit the remove button and press the cancel button. Retry with Wifi prefs again
*...waiting for an address - Disconnect and try Connect
Until, Connected to <router> - 192.168.x.x
For lan ethernet port, please use Network prefs and the following hardware is
*lan9514 Pi3b Pi2 not supported at the moment
*lan7515 Pi3b+ type into Device usblan78xx.device as net0: remove other device(s)
*bcmgenet Pi4 Pi400 choose for Device bcmgenet.device
*cdnsgem Pi5 Pi500 Pi500+ RP1 i/o for cadencegem
(network prefs may forget random information when rebooted)
Summary
<pre>
*3b ethernet not supported, usb ethernet not working but wifi prefs setup works
*3b+ wifi working and ethernet works
*4 untested
*400 wifi and ethernet untested
*5 wifi and ethernet untested
*500 wifi and ethernet untested
*500+ wifi works
</pre>
Type in 'aarch64' in the [https://archives.arosworld.org/index.php?function=search&tool=simple search box] and you will see available software packages / apps. apkg can be used to inspect and install applications.
[http://archives.arosworld.org/index.php?function=browse&cat=network/browser amelinium web browser (JS 1.6 ES9 ECMASCript 2018)] is available with an [https://eab.abime.net/showthread.php?t=122494&page=80 eab thread] reminiscent of [https://github.com/zapek/Voyager Voyager] and to a lesser extent [https://github.com/amigazen/aweb3/ Aweb JavaScript 1.5 (ECMAScript 3)] as css and javascript websites can be slow to load or resolve (no JIT) and nothing from facebook, reddit etc.
Press Cancel at screenmode selector or -wb argument to get windowed version. You could use the Shift + Del shortcut or mouse wheel should work to delete all text at once. Html5test gives 189 (1.29), 300 (1.31), 301 (1.39) out of 555, some bigger Amiga like browsers are around 370+ but it does less better.
You may have to delete the cache (Menu -> Page -> Delete cache) to fully retest big Amelinium updates or free up space.
Be aware [https://pianetaamiga.it/en/reportage-pianeta-amiga-2026/ some site pages] can use up hundreds of MBs of cache very quickly
DNS lookup failed... close browser and reboot and setup wifi again - repeat until it works again
youtube video and audio - js button for javascript must be on/shaded - Settings -> Soundoutput - AHI
Any restriction to lower resolutions is due to [https://docs.invidious.io/faq/#q-where-are-the-360p480p1080p-quality-options bandwidth]. Either CPU/GPU, internet speed and/or video quality. Pi3 can expect 480p (wifi) to 720p (ethernet). Pi4 expect (wifi) (ethernet).
Telegram https://t.me/s/channel_name for public messages from vamped_amiga chatamigagames demoscenecracktros
*art local js apps like dpaint.js
There is normally no Bluetooth support for most amiga like OSs but Aros has one [https://github.com/aros-development-team/AROS/commit/6942cbfbf66426d21963a7fcd8aba6aff611a9e0 work in progress] [https://github.com/RPi-Distro/bluez-firmware/tree/pios/trixie/debian/firmware/broadcom firmware]
*Bluetooth 4.1 BCM43430A1.hcd Pi3B, Pi3A, Zero 2W
*Bluetooth 4.2 BCM4345C0.hcd Pi3B+, Pi4
*Bluetooth 5.0 BCM4345C5.hcd Pi4B rev, CM4 and maybe Pi5 and CM5
<pre>
*bthid keyboard mouse support
*btserial serial
*btpan short range wireless connecting devices
</pre>
Only the Pi5 has a RTC real time clock, the other Pis will need to use ntp services [https://github.com/aros-development-team/AROS/commit/29cd4116330dc7f692d90757eacc59fb3f31ae70 sntp] with time.cloudflare.com pool.ntp.org or Cloudflare 162.159.200.1, 162.159.200.123, 2606:4700:f1::1, 2606:4700:f1::123 or [https://github.com/bohunamiga/PiNTP PiNTP -s goodtime.ijs.si or ntp1.ptb.de] to get the date and time from the internet. Can use date in a shell e.g. date 24-Dec-2026 23:59:59 but this will need to be done again after every reset/power off. Maybe [https://github.com/aros-development-team/AROS/commit/28674a157bc56175aa668e7b62dca6fa740578dc ds3231 rtc with dtoverlay=i2c-rtc,ds3231 in config.txt]
It helps to have all usb devices already plugged in before power on to detect at the moment. Even then some usb devices will freeze the mouse cursor and the only resolution is to remove the offending usb device and reinsert. Sometimes, the reinsert leads to the mouse cursor vanishing, it is still there and responds to left mouse clicks, top of the screen and pull down the screen.
USB classes support from Prefs/Trident is still work in process
*usbaudio working on usb3 port (blue) on pi4, 400 but not working (no rt isochronous) on usb2otg (white or black) for pi3b, zero 2w
*[https://aminet.net/package/mus/midi/camd camdusbmidi] detects midi devices without a preferences file (Prefs/Env-Archive/sys/midi.prefs) as [https://www.youtube.com/watch?v=RBxHkwy4Nrw auto setup now] possibly with [https://github.com/metaneutrons/mt32-pi metaneutrons mt32-pi] [https://github.com/rtzor/mt32-pi mt32-pi fork] [https://github.com/ahmadexp/mt32-pi fork] [https://github.com/gmcn42/mt32-pi-control control of] [https://github.com/dwhinham/mt32-pi mt32-pi pi3+]. Alternative of [https://homspace.nl/samplerbox/ SamplerBox].
Will need developer clang gcc tools to look at 64bit ports of [https://archives.arosworld.org/?function=showfile&file=driver/audio/usbmidi.i386-aros.lha usbmidi], [https://aminet.net/package/mus/midi/CAMD_Toolkit CAMD_Toolkit], [https://aminet.net/package/mus/midi/camdtools camdtools], [https://github.com/cnvogelg/amiditools amiditools], [https://github.com/timoinutilis/midi-sequencer-amigaos horny src], [https://aminet.net/package/mus/midi/horny-base horny-base], [http://bnp.hansfaust.de/index.html BnP], [https://arosarchives.os4depot.net/?function=showfile&file=audio/misc/timidity.lha timidity],
Regarding 680x0 emulation, there are several options (not implemented yet) that could be considered
*[https://github.com/aros-development-team/AROS/blob/6722a0ae9e03fe5d26e32703360bd2059e0864cc/rom/m68kemu/README.md?plain=1#L424 m68kemu.library] for some Amiga productivity where the cpu is emulated and the system calls are redirected to Aros ones
*[https://github.com/BlitterStudio/amiberry amiberry] (winuae) for everything else like games
*[https://github.com/jonx/AROS/tree/aarch64-darwin-graft/arch/all-darwin/libs/emu68k emu68k]
*[https://scriptedamigaemulator.net/ Scripted Amiga] with [https://github.com/naTmeg/ScriptedAmigaEmulator ScriptedAmigaEmulator] or older [https://github.com/gbraad-amiga/ScriptedAmigaEmulator2 ScriptedAmigaEmulator2]
Hopefully getting Pi3 up to 25Mhz 68040 (non JIT) and 50Mhz 68040 (JIT)
Pi4 maybe getting up to 50Mhz 68040 (no JIT) and 100Mhz 68040 (JIT)
[https://pinout.xyz/ GPIO 40 pins] [https://learn.sparkfun.com/tutorials/raspberry-gpio/gpio-pinout pinout]
Some exceptions:
*Physical pins 27, 28 (GPIO0, 1) are an internal I2C bus and should not be used
*The other I2C on pins 3, 5 (GPIO 2, 3) can be used generally, but be aware they have permanent pull-up resistors to 3.3V
*For MIDI use USB but there are dedicated UART pins 8, 10 (GPIO 14, 15).
With a HAT it's more awkward -- you need to know which pins are used by the HAT and avoid them. Hopefully this will be documented.
Remember all GPIOs are 3.3V (not 5V tolerant), floating/noisy inputs can cause odd behavior, and that shorting the power supplies can cause instant death of the Pi.
In the shell (Cntrl + C to end)
GPIO PIN/A/N,SET/N,GET/S,MODE/K,PULL/K
Controls and queries hardware GPIO pins via gpio.resource which is stored in the rom or Devs/ '''please test'''
*PIN -- (Required) Target GPIO pin number (e.g. 12).
*SET -- Set pin output value to 0 (LOW) or 1 (HIGH).
*GET -- Read and print current digital input level (0 or 1).
*MODE -- Configure pin mode: IN (Input), OUT (Output), ALT (Alternate).
*PULL -- Configure pull resistor: NONE, UP, DOWN.
EXAMPLES
<pre>
GPIO 12 MODE OUT
GPIO 12 SET 1
GPIO 12 GET
GPIO 13 PULL UP
</pre>
[https://gpiozero.readthedocs.io/en/stable/installing.html Current] [https://gpiozero.readthedocs.io/en/v1.2.0/api_boards.html old support for gpiozero is unknown at present] [https://energenie4u.co.uk/res/pdfs/ENER314%20UM.pdf and associated 433MHz equipment] [ USA X10 security and lights via USB] [ OpenHab with Shelly Smart Plug connected over Wi-Fi, controlled by MQTT or HTTP]
Printing only with Postscript but [https://github.com/bohunamiga/MintPRINT one] of [https://github.com/boingball/MintPRINT two] [https://github.com/Andiweli/AmiAirPrint/tree/main AirPrint] IPP has been attempted with [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2061&pid=13954#post_13954 discussion]
Youtube
[], [], [https://www.youtube.com/watch?v=X4fmWAIv7FE Aros native on Pi3b],
[], [], [https://www.youtube.com/watch?v=TSxlYb1eQWU Installed on Pi3b+],
[], [], [https://www.youtube.com/watch?v=NFF1H3jCoz8 testing Aros native on Pi400],
[], [], [https://www.youtube.com/watch?v=nIVx7mh1E1Q&pp=ygUHYXJvcyBwadIHCQkTDAGHKiGM7w%3D%3D Aros on Thumb 2 based 32bit-ish ARM STM32H743 board],
[https://www.youtube.com/watch?v=zQM4CD64xDE&t=612s&pp=ugUEEgJlbg%3D%3D Performance under Linux] but on Aros...
{| class="wikitable sortable" width="90%"
! width="10%" |Pi
! width="10%" |Single Core 2D
! width="10%" |Single Core 3D
! width="10%" |Single Core 3D
! width="10%" |SMP 2D
! width="10%" |SMP 3D
! width="10%" |SMP 3D
! width="35%" |Comments
|-
| <!--Pi-->Pi3
| <!--Single Core 2D-->
| <!--Single Core 3D-->
| <!--Single Core 3D-->
| <!--SMP 2D-->
| <!--SMP 3D-->
| <!--SMP 3D-->
| <!--Comments-->
|-
|}
==== 32bit ====
For the Pi1 Pi2 Pi2B the status of AROS native ARMv6 for 32bit RasPi was OK. System booting, USB working (although with some issues but plans to fix them). 32bit native [http://www.aros.org/nightly1.html ARMv6 32bit nightlys] raspi-armhf-system raspi-armhf-contrib unbz2'd to fat32 microSD
===Hosted===
AArch64 CPU backend for AROS, a Cocoa/Metal display, clipboard / host-volume / CoreAudio / BSD-sockets bridges, GPU 2D via gpufx.library, a 68k→AArch64 JIT (run68k), and a full Rust std port. On [https://www.jkn.me/blog/macaros-aros-on-apple-silicon/ latest Apple Silicon] [https://github.com/jonx/Macaros early buggy alpha version of hosted Aros .dmg on MacOS12+]. Please use [https://github.com/jonx/Macaros/issues MACAros github] for issues, features etc and possibly [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2030&pid=13910#post_13910 here]
[http://www.aros.org/snapshots1.html old linux and android hosted 32bit]
==== Hosted ====
=====64bit=====
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80&pid=13667#post_13667 Ubuntu Linux PC hosted Pi compiler build]
[https://github.com/BlitterStudio/aros-compiler-docker Docker based cross compiler for various Aros systems],
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80 From the Aros Raspberry pi 3 64bit thread]
Instructions on building 64-bit Raspberry Pi AROS and cross-compiler from sources.
You will need:
- Ubuntu 24.04 or 26.04
- qemu-system-aarch64 installed
- Internet connection
- rpi-scripts.tar.gz downloaded (https://axrt.org/download/aros/rpi/rpi-scripts.tar.gz)
1) Install prerequisites:
sudo apt install git gcc g++ make gawk bison flex bzip2 netpbm autoconf automake libc6-dev liblzo2-dev libpng-dev gcc-multilib byacc python3-mako cmake yasm curl nasm
2) Clone sources
cd <project-directory>
git clone https://github.com/aros-development-team/AROS.git --recurse-submodules
3) Extract rpi-scripts.tar.gz. Copy all files into your project directory so that you have:
AROS (the directory with cloned sources)
fix-dotdot.py
rebuild.sh
recreate-sdcard.sh
run-qemu.sh
update-sdcard.sh
4) Run ./rebuild.sh. Select option 1) toolchain-core-aarch64
This will execute process of building a cross-compiler. During this process packages will be downloaded from Internet. This process can take up to 2 hours. If there are some missing dependencies, install them with 'sudo apt install' and restart this step.
5) Run ./rebuild.sh again. Select option 2) core-raspi-aarch64
This will build system files for 64-bit Raspberry Pi AROS. This process can take around an hour.
6) Run ./recreate-sdcard.sh
This will create an sdcard.img file with contents of previous step.
7) Run ./run-qemu.sh
This will start QEMU with SD card image and ROM images. It will boot into AROS.
=====32bit=====
Ubuntu VM approach to compiling [http://lallafa.de/blog/2013/06/building-aros-hosted-for-raspbian/ Linux hosted AROS June 04, 2013]
../AROS/configure --target=linux-armhf --enable-includes=/usr/arm-linux-gnueabihf/include --x-includes=/usr/arm-linux-gnueabihf/include --x-libraries=/usr/arm-linux-gnueabihf/lib
arm-elf- is symbol-linked to arm-linux-gnueabi- (arm-linux-gnueabi- is more correct in this case, because it's going to be compiling the ARM AROSBootstrap for ARM Linux)
*armel - many of the "android" machines require since the entire OS is made for soft float VFP.
*armfp - Efika MX target, Raspberry PI, EfikaMX, Pandora and virtually everything (VFP)
Keep in mind it's possible to start hardfp AROS hosted on softfp system, though, as long as no calls between AROS and host require floating point parameters. NOTE: hardfloat objects *cannot* be linked with softfloat objects - they have a different ABI.
Just keep in mind the arm nightly build machine is quite complex beast. It needs the x86_64 host compiler to compile AROS tools. The arm version is built every night using gcc-4.6.2 crosscompiler (built together with AROS) and successfully builds armel and armhf linux hosted targets.
*needs an AROS code compiler for ARM target
*as well as unix compiler for ARM linux host (would be best to have both softfp and armhf, we have softfp only now) with full set of libraries and includes.
with—disable-crosstools $AROS_CC is always a wrapper around $KERNEL_CC ? If so, this is wrong for some ports. This can break Darwin, Windows and Android port.
Yes, Android port will build. And even work. But it's not good because the port will not be ABI-compatible with other ARM ports. Android's ABI is different from GNUEABI. For example:
<pre>
enum test {foo, bar};
enum test testvar;
</pre>
sizeof(testvar) will be equal to sizeof(int) in GNUEABI (Linux and AROS) and sizeof(short) on Android. This affects linking objects from static linklibs, for example.
Previously everything worked because $AROS_CC was a wrapper on top of $HOST_CC. And a real crosscompiler was used on non-ELF hosts.
Android is the same. $KERNEL_CC is incompatible with AROS.
compiler=kernel is appropriate _ONLY FOR CODE WHICH RUNS ON HOST OS_ (or barebone hardware, if we talk about native). This includes bootstraps, their linklibs, and host-side dynamic libraries (Windows makes extensive use of them because of architectural considerations.
No single AROS object should be compiled with this setting. $KERNEL_CC is really compatible with AROS *ONLY IN LINUX-HOSTED* and no more. On other systems (Darwin, Windows, Android) this is not true any more, and compiler=kernel is never going to work.
If you want to compile your AROS module against host OS includes, append the following to USER_INCLUDES (or USER_CFLAGS, this is effectively the same):
-isystem $(GENINCDIR) $(KERNEL_INCLUDES)
$(KERNEL_INCLUDES) expands to:
-isystem <your_os_includes> -isystem <host_OS_gcc_private_includes>
-nostdinc
This makes AROS compiler adhering to host OS APIs.
If you want some preprocessor symbols based on what your host OS actually is, add something like -DHOST_OS_$(AROS_HOST_ARCH).
Why is there $(GENINCDIR) at all? Because host OS has its own libc includes, which would conflict with AROS ones. And the host OS libc is not binary-compatible with AROS one.
Why doesn't Windows-hosted port use $(KERNEL_INCLUDES) ? Because WinAPI includes conflict with AROS ones in fundamental typedefs, like WORD, BYTE and BOOL. It's almost impossible to deal with this in any other way than rewriting WinAPI definitions using AROS types.
Building under centos 6.3 (i386) currently, and AROS creates the toolchain itself. haven't yet committed the necessary changes but "./configure --target=raspi-armhf" is enough to start, then "make arosboot-raspi" will generate arosraspi.img (containing the bootstrap, kernel.resource, and exec.library) as well as arosraspi.rom (containing all the other essentials components such as dos, graphics etc). It will also copy over a config.txt file to make the raspi bootstrap code load the correct kernel, and a cmdline.txt that enables exec debug output.
*armel = typically Debian 6, Ubuntu Maverick, Android,
*armhf = typically Debian 7, Debian 8, Ubuntu Precise,
Cross-compiling Ubuntu ARM softfp
<pre>
sudo sh
echo 'foreign-architecture armel' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armel] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armel.list
apt-get update
apt-get install gcc-arm-linux-gnueabi libx11-dev:armel libsdl-dev:armel
</pre>
<pre>
./configure --target=linux-arm --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabi/include
</pre>
Cross-compiling Ubuntu ARM hard-float
<pre>
sudo sh
echo 'foreign-architecture armhf' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armhf] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armhf.list
apt-get update
apt-get install gcc-arm-linux-gnueabihf libx11-dev:armhf libsdl-dev:armhf
</pre>
<pre>
./configure --target=linux-armhf --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabihf/include
</pre>
Now, the AROS build is configured properly and all you need to do is:
make
==Build==
===64bit===
[https://github.com/aros-development-team/AROS/blob/7016ce28bfdb754182edb16011c98faaf5413c29/arch/aarch64-raspi/boot/mmakefile.src#L180 boot makefile]
===32bit===
# download/checkout the source someplace, e.g. /build/AROS-Src/
# make a directory to store external sources AROS downloads, e.g. /build/Ports
# make a build directory, e.g. /build/aros-raspi-armhf
# cd into the build dir, configure, and then run make -:
<pre>
>cd /build/aros-raspi-armhf
>/build/AROS-Src/configure --target=raspberrypi-armhf --with-serial-debug --enable-ccache --with-portssources=/build/Ports
>make
>make arosboot-raspi
</pre>
then copy the files from /build/aros-raspi-armhf/bin/raspi-armhf/AROS/ onto an sdcard, and download/copy the Raspi firmware files onto it.
You should then be able to boot the sdcard on your RasPi.
The current W.I.P tree to svn. it can be built as follows ..
<pre>
./configure --target=raspi-armhf
make arosboot-raspi
</pre>
That will generate arosraspi.img, arosraspi.rom and config.txt in bin/raspi-arm/AROS - so either copy just those files to a fat formatted SD card (with the firmware files on), or copy the whole contents of the AROS folder.
NB - if you have a Linux/other install, backup the existing config.txt first
arosraspi.img contains the bootstrap (which has very basic mailbox code, framebuffer/gpio init, and console "emulation" via code pinched from our libbootconsole), kernel.resource, and exec.library
arosraspi.rom contains all the other components needed to boot AROS.
The config.txt file will tell the RasPI bootstrap to load the arosraspi kernel and ramdisk (rom).
the bootstrap has minimal mailbox code, planning on adding either a resource or library that driver/app code will use to access it (likewise for GPIO)
Help building AROS hosted on Linux ARM
Was looking a way to use more my Handheld ARM based called Pyra (Dragonbox Pyra) an ARM (Omap5 cpu with 4GB ram) linux based machine (Debian Buster v10 with kernel 5.6.19 adapted) and have a try to compile the latest Aros sources by Deadwood directly on this device.
Compilation stops after build libpopupmenu.a and trying to build libatomic have this error:
<pre>
Configuring build in bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
configure: WARNING: unrecognized options: --disable-nls, --without-x
checking for --enable-version-specific-runtime-libs... no
checking for --enable-generated-files-in-srcdir... no
checking build system type... arm-unknown-linux-gnu
checking host system type... arm-unknown-aros
checking target system type... arm-unknown-aros
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for arm-aros-strip... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-strip
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for arm-aros-gcc... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-gcc
checking whether the C compiler works... no
configure: error: in /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic':
configure: error: C compiler cannot create executables
See config.log' for more details
make[2]: *** [mmakefile:4489: /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic/.configured] Error 77
[MMAKE] make --no-print-directory TOP=/media/farox/pyra2/arosbuilds/toolchain-core-armhf-build SRCDIR=/media/farox/pyra2/arosbuilds/AROS CURDIR=tools/crosstools/gnu TARGET=tools-crosstools-gcc-libatomic-configure -s --file=mmakefile tools-crosstools-gcc-libatomic-configure failed: 512
[MMAKE] Error: Error while running make in tools/crosstools/gnu: No such file or directory
make[1]: *** [Makefile:361: linklibs-libatomic] Error 10
make: *** [Makefile:183: crosstools] Error 2
</pre>
looking at config.log on arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
found that arosbuilds/toolchain-core-armhf/arm-aros-ld: cannot find -laeabi
so do make linklibs-aeabi-arm-quick
and the missing lib was built.
now the next stop is at
fatal error: bits/libc-header-start.h: No such file or directory
and
fatal error: sys/cdefs.h: No such file or directory
in many places so after checking that have this missing include files i have noted that my include path is a bit different, standard searching path is /usr/arm-linux-gnueabihf but in my system is /usr/include/arm-linux-gnueabihf
so if i add my path to some mmakefiles compilation goes on....but is a better way to add this path to avoid every mmakefiles to be changed?
fixed with adding
-I/usr/include/arm-linux-gnueabihf
to where is missing on mmakefiles like
USER_INCLUDES := -isystem $(GENINCDIR) -I/usr/include/arm-linux-gnueabihf $(KERNEL_INCLUDES)
P.s. I have changed many mmakefiles and have at least compiled (after many hours) the toolchain doing make every time in arosbuilds/toolchain-core-armhf-build (also have to disable making tests under cplusplus but don't remember the directory ...) but ask an help to have an automated way to correctly build without modify mmakefiles.
Last time built armhf target was around 2 years ago. At that point built is via cross-compilation from linux (ubuntu 22.04) using linux armhf crosscompiler (this can explain the path differences you are experiencing) as well as using AROS gcc cross-compiler in version 6.5.0 (build with option 21) in rebuild.sh). Since then AROS GCC has been updated to 10.5.0 and don't believe anyone tried to build the armhf target again.
My suggestion would be to downgrade GCC to 6.5.0 (via editing AROS/config/gcc_def file) and try to first build using cross-compilation from x86_64 linux. Once that works, you will have a "template" to compare to native compilation under arm linux.
Thanks for your suggestion...but think the toolchain with GCC 10.5.0 is compilable if i found a way to pass the path of my system to the script that build (option 21 on rebuild).
The other only changes are (but don't know where to modify...) is to add the build of libaeabi and disable the building of some tests under cplusplus that use exceptions and is not supported under ARM. try to crosscompile with my Linux amd64 PC.
For paths look into core-linux-armhf/bin/linux-armhf/gen/config/target.cfg. A number of build-wide variable is set there containing paths to local build system. These variables and the target.cfg file are generated by AROS ./configure script.
Thanks compilation now go forward...changed target.cfg under "toolchain-core-armhf-build/bin/linux-arm/gen/config" and do make on "toolchain-core-armhf-build" dir.
Need to find where to enable build libaeabi.a so can build the entire toolchain with option 21 of rebuild.sh
Found something that looks like libeabi in AROS/arm-all/arm-aeabi/mmakefile.src. Try adding a third line there:
#MM- linklibs-armhd : libklibs-aeabi-arm
Don't remember needing this library. Possibly the 6.5.0 GCC somehow does this while 10.5.0 is missing this.
Try adding this line (and the variant "linklibs-armhf" instead of hd) but it did not solve the automatic building of the missing lib. I must do "linklibs-aeabi-arm-quick".
Anyway after have build the aeabi lib i succefully built the toolchain (after many hours...). Smile
To test I restarted from selecting option 21 (on rebuild.sh) but after many hours i get the same error of the kernel includes not found...maybe i need to modify the configure script for my case.
With the toolchain built i try to build the core-linux-armhf (DEBUG) (option 22) but after a while it stopped with
"cannot find -laeabi " so i made it built manually...and now i can continue compiling...i'll let you know if all goes ok.
== Hardware ==
===64bit===
====BCM2712====
With the Pi5
Broadcom VideoCore 7 vc7 is an integrated GPU with 12 cores and up to 800 MHz clock. VideoCore VII is capable of OpenGL ES 3.1 and Vulkan 1.2. The driver support for the Raspberry Pi continues to build upon the [https://lore.kernel.org/dri-devel/20230928114532.167854-1-itoral@igalia.com/ open-source V3D driver] stack within [https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25450 Mesa] hopefully be merged for Mesa 23.3. x265 HEVC accelerated untested, x264/h.264 and VP9 cpu only.
*Raspberry Pi M.2 HAT+ Expansion Board
*Geekworm X1001 PCIe to M.2 Key-M NVMe
*Geekworm X1003 PCIe to M.2 HAT NVMe SSD PIP Board for Raspberry Pi 5
*Pineboards Pi Hut HatDrive! M.2 HAT 2024/V4
*Hat+ Gen2 Gen3 Nvme
*GeeekPi 52Pi N04 for Raspberry Pi 5 NVME M.2
*
*2024 RPI AI HAT - Hailo 20TOPs no LLMs
*2026 RPI AI HAT+ 2 - Hailo 40TOPs slightly better?
[https://www.raspberrypi.com/documentation/accessories/camera.html Cameras for Pi]
*Raspberry Pi camera module, the V3 with Sony IMX708 back-illuminated CMOS 12 Megapixel sensor
*Raspberry Pi Camera Module V2 – 8MP Sony IMX219 Sensor
*Raspberry Pi camera Rev 1.3, 5MP 1080P OV5647 image/video module, 2592 x 1944 pixels
====BCM2711====
With the Pi4 an ARM a72 cpu is about x3 times the size of an a53 in the Pi3
the 2711b line used more power when idle, compared to the 2711c
*2018 Raspberry Pi PoE HAT Power Over Ethernet Hat - design issues
*2020 Raspberry Pi PoE+ HAT Power Over Ethernet Hat Pi3b+ Pi4 only - better design
*Waveshare PoE HAT (B) with cooling fan for Raspberry Pi 3B+/4B 802.3af PoE
*[https://github.com/axizo-pi/V3DLib vc6 V3D 4.2] is derived from [https://docs.broadcom.com/doc/12358545 vc4], but it is [https://docs.mesa3d.org/drivers/v3d.html significantly different]
The QPU pipeline stays mostly the same, you still have an add ALU and a multiply ALU and it can issue two ALU OPs per cycle. There is still 4 SIMD lanes, interleaved over 4 cycles.
The instruction encoding for the QPUs is different, but the core instructions are the same.
Instructions for packed 8 bit int math has been dropped, along with most of the pack modes.
Instructions for packed 16bit float math has been added (2 floats at in a single operation)
With vc5/vc6, you write two packed 16f value to the tilebuffer (or four writes of 32f, if you are using the rgba32f framebuffer). And there is a handy vfpack operation which allows you to pack two f32s into a single 32bit value in a single instruction. You can vfpack directly into the tile buffer register.
the multiply ALU can now fadd, so you can issue two fadds per instruction. the add ALU has gained a bunch of new instructions
the A and B register files have been merged. You still only get an A read and a B read per instruction, but they read from one big register file (which means the underlying memory block has gone from two sets of "one read port, one write port" to one "two read ports, one write port" block)
The theoretical max FLOPs per QPU remains the same at two per cycle, other than the bump from 400mhz to 500mhx but it looks like a lot of effort has been put putting those theoretical FLOPs to better use.
*vc4 could run one or two threads per QPU. When you ran in two thread mode, the available register file halfed to 32 registers.
*vc5 added a four thread per QPU mode, with 16 registers per thread.
*vc6 doubled the size of the register file. You could now use all 64 threads in two thread mode and 32 registers in for thread mode. Single thread mode was removed, you always have at least two threads.
With the threading improvements, the QPUs should spent much less time idle waiting NOPs for memory requests. Most of the design changes have gone to improving the fixed function hardware around the QPUs. A fixed function blend unit has been added, which should reduce load on the QPUs when doing alpha blending. hope software blending is still possible
The tile buffer can now store upto 4 render targets (up to 128bits per pixel, so if you are using 4 32bit render targets, you can't have a depth buffer)
A MMU, allowing a much simpler/faster kernel driver.
Many more texture formats, framebuffer formats.
h264/x264 as Pi3
All the features needed for opengl es 3.0
H.265 / HEVC decoder is a HEVCv2 Main 4:4:4 10 design supporting bitstreams up to profile 5.1
HEVC hardware decode supports 4kp60, 10-bit. Audio output is pretty much unchanged, but the HDMI audio channels now support 8x192kHz bitrates
Each ALU typically have 2 floating point operators, and as you pointed out in a earlier post videocore 6 is no exception, with both a multiply and additive floating point operator. Thus theoretical GFLOPs are calculated with both operators in mind. That is what the 2 in my formula represents, and is common across any modern programmable shader, whether you calculate Nvidia, AMD, Intel, Boardcom or any other company's GPUs. Total ALUs * 2 * GHz clock = GFLOPs, In the case of Raspberry Pi 3, it's 24 ALUs * 2 operators * 0.4GHz = 19.2GFLOPs
If the Videocore 6 does indeed only have 16 ALUs (16 * 2 * 0.5GHz), you'd have only 16GFLOPs but they are better utilised
Possible maximum performance
<pre>
VideoCore IV @ 250MHz: 250 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 24 Gflop/s
VideoCore IV @ 300MHz: 300 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 28.8 Gflop/s
VideoCore VI @ 500MHz: 500 [MHz] x 2 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 32 Gflop/s
</pre>
Faster LPDDR4 memory.
====BCM2837====
With the Pi3
* Broadcom BCM43438 chip provides 2.4 GHz 802.11n wireless LAN, Bluetooth Low Energy, and Bluetooth 4.1 Classic radio support, 3B+ [https://github.com/aros-development-team/AROS/commit/afa5bc0bb17d5dd06bcfdbac00853a3799ca8d76 LAN7515]
The overclock ability has diminished with each chip version as the energy usage has increased. BCM2837 is one of the warmest yet and benefits from active fan cooling if all four cpu cores are in use for a short while. Video playback maybe affected due to the lack of custom support in the GPU with Aros. 5 V / 2.4 or 2.5 amp power supply recommended if all four cpu cores are running, else throttling (cpu slowdown) might occur.
[https://github.com/hermanhermitage/videocoreiv/wiki/VideoCore-IV-Programmers-Manual Dual VDP] and scalable QPU in [https://docs.mesa3d.org/drivers/vc4.html VC4] and x.264/h.264 accelerated untested only and VP9 on cpu or neon help
ARMv8-A has [https://developer.arm.com/documentation/102412/0100/Privilege-and-Exception-levels privilege levels] where userspace typically runs at ‘EL0’, the kernel at ‘EL1’ or ‘EL2’ and the firmware at the highest level ‘EL3’.
===32bit===
=== Core Kernel ===
====BCM2708(family)====
which includes the [http://elinux.org/RPi_Hardware BCM2835] (ARM1176JZF-S 700 MHz CPU + VideoCore IV GPU + up to 1GB RAM)
*Framebuffer (fb) using mailbox
*IRQ scheduler, etc
*Arasan based SD Card controller
*Synopsis DesignWare USB 2.0 OTG controller [http://networkdirection.net/index.php?option=com_content&view=article&id=106:rasperry-pi-usb-controller&catid=45:raspberry-pi&Itemid=54 Unofficial DOCS pdf], [dwc_otg.c FreeBSD], [], [https://www.riscosopen.org/viewer/view/mixed/RiscOS/Sources/HWSupport/USB/Controllers/DWCDriver/ RiscOS USB Driver], [https://www.riscosopen.org/forum/forums/5/topics/878 RiscOS USB Discussion], [https://www.riscosopen.org/forum/forums/11/topics/1893 Other USB RiscOS], [http://plan9.bell-labs.com/plan9/index.html Plan9 Miller's usb] http://plan9.bell-labs.com/sources/contrib/miller/, [https://github.com/Chadderz121/csud CSUD driver],
*[http://www.smsc.com/media/Downloads_Public/Data_Sheets/9512.pdf SMSC 9512] USB LAN/Hub chip
*CMOS RAM
*VCHIQ port which sends messages to the GPU e.g. for mouse, keyboard, audio on HDMI, etc
*Audio Driver
*Serial Peripheral Interface Bus (SPI)
*[http://www.susa.net/wordpress/2012/06/raspberry-pi-pcf8563-real-time-clock-rtc/ I2C registers]
*I2S
*Universal Asynchronous Receiver Transmitter (UART)
*[http://elinux.org/RPi_BCM2835_GPIOs GPIOs] and [http://www.adafruit.com/blog/2012/08/17/broadcom-bcm2835-peripheral-memory-map-and-gpio-alternate-use-chart-piday-raspberrypi-raspberry_pi/ Alternative view of GPIO]
BCM2836
* For Pi B+, PI 2 and Pi 3 SMSC LAN9514 chip adding 10/100 Ethernet connectivity and four USB channels to the board
*[http://www.andrewscheller.co.uk/rpi_pcb_modules.html PCB], [http://elinux.org/RPi_Low-level_peripherals Low level features],
Implemented so far...
# Modify the configure system so that it correctly builds for the arm hardware float raspi target.
# Implemented the bootstrap to load the aros modules and prepare the arm to jump into them. Reworked the x86 console support so that parts can be stolen for raspi to use since t has no basic functionality to output to the display.
# Implemented a kernel.resource to prepare the raspi for running aros and provide the low level api calls to expose available resources and allow exec, etc function.
# Implemented serial debug support
# Implemented the exec (and kernel) functionality required to make multitasking work (and interrupts, exceptions, syscalls, etc)
# Implemented a timer.device to utilise the hardware timers.
# Implemented a very basic gfx driver to expose the hardware's framebuffer.
# Implemented an SD-Card driver for AROS which presently only supports the raspi's chipset but can easily be modified to support all sd-card hardware and media.
# Fixed the fat filesystem support in AROS so that it can boot on RasPi's normal SD-Card setup. The "rom" image files needed use a different filename than the default linux, etc images so can be easily installed without harming the existing files - you only need to change the loaded images in the config file to get aros to boot.
# Updated the build scripts to automatically download the necessary raspi firmware files and wrap it all up so that you can simply extract the archive to a fat formatted sdcard and boot it on the raspi without having to get anything else.
# fix everything in contrib and ports to build for raspi (needs proper testing/fixes but allows every component to actually compile at least, including owb) + numerous other fixes to get things working on arm/raspi ..
Improvements...
# Implement a USB chipset driver "OR" finish the existing one [https://github.com/aros-development-team/AROS/commit/c07d13c724f944674be5db54fc6a71ee72a01809 usb otg] - the current code is mostly a skeleton that should initialise the chipset and then needs relevant code to support the different transfer types. It also has the "virtual" hub code in place to represent the raspi's USB port (from poseidons p.o.v)
# Implement a driver for the USB NIC (a few weeks - depends on USB above)
# Write an [https://github.com/aros-development-team/AROS/commit/d55d0f74d20b769bbb8c8d386e5c1d7a9154f05a audio driver] (a few weeks - independent of USB) and [https://github.com/aros-development-team/AROS/commit/e93a4c245f27a87c9c4c1d39206694b39059998a HDMI]
# fix syscall bug in the current raspi kernel code
# Graphics depend on having a decent "bcmdma.resource" implemented as to use the cpu's dma engine. The sd card driver needs to use it for transfers to/from the controller - and the gfx system needs to use it for "blitting".
# [https://github.com/aros-development-team/AROS/commit/4019d84e4975d4dad987a12d57fe108f5ac048e6 Improve the gfx driver], [ vc4gfx HIDD] add [http://dri.freedesktop.org/wiki/VC4/ Gallium3D support]
# [https://github.com/aros-development-team/AROS/commit/b13905b3e8e45b089f520b44692c81affddd066f Improve] the [https://github.com/aros-development-team/AROS/commit/3a876755c070f5c73c4f53c7f4d35b4f923088b9 sdcard] device driver - which is also pretty basic but should work with most cards, rework it to also support pci, etc. sd card interfaces on x86
# The current code using very rudimentary access to the gpio interface - so that should be implemented as some resource for other components to access, as-well as the i2c interface exposed over the gpio interface. that should have a hidd class implemented which uses the gpio resource to communicate.
Boot up typical for most other OSs before the open sourcing of many binary blobs from 2017 onwards
On power-up, the rpi [http://www.open.com.au/mikem/bcm2835/ BCM 2835] [https://github.com/hermanhermitage/videocoreiv VideoCore4] GPU, not the ARM CPU, is in control, and the SD card slot is the only peripheral device with power. The firmware burned into the BCM2835's VideoCoreIV GPU PROM requires a DOS-style partition table; a FAT-formatted first partition; and the freely redistributable but closed sourced Broadcom files “bootcode.bin” and “start.elf” in that partition.
The boot sequence carries out several pre-boot tasks
*On powering of the rpi, the GPU reads and executes bootcode.bin, which then loads start.elf
*The GPU loads the “start.elf” file, eventually, into the L2 cache and then executes it
*configures the memory split for the CPU and GPU
*reads and parses “config.txt” from the same partition on the SD card and applies the settings (like a PC’s BIOS settings)
*loads the “kernel.img” file, again from the same partition
*activates the CPU to begin executing the loaded kernel image
The CPU/GPU memory split is hard-coded into start.elf, so Broadcom provides three start.elf images, to give 32M, 64M, or 128M to the GPU for multimedia performance, and the remainder to the CPU.
RPi uses [https://github.com/raspberrypi/firmware some closed source loaders] and at some point it loads a binary blob named "kernel.img" at 0x8000, at that point there would be a rudimentary Aros alive. If one wants to use the SD-card then there would have to be a driver for the interface and a fat filesystem handler (SD-card has to be formatted to fat filesystem)
Boot code and kernel are now linked together and made into that binary blob, just for starters. Raspberry Pi uses [http://kernelnomicon.org/?p=133 u-boot] and [http://kernelnomicon.org/?p=138 UBoot] as bootloader, there's already some code in the Efika MX port for that. UBoot is a native bootloader and not just for the raspberry pi, it loads after start.elf.
You can find Efika MX port from arch implementations, some hacking is needed for the mmakefile.src'es as iit dates back to before the Aros crosstool era or else you get some weird errors while building. You also need to code the bootstrap and serial handling.
At the moment it seems that a fastest route for the native build would be to make one binary blob without using the package system. Raspberry's memory layout is pretty simple and if the implemented u-boot doesn't support loading other modules
<pre>
? - alias for 'help'
mtest - simple RAM test
autoscr - run script from memory
base - print or set address offset
bbm - BBM sub-system
bdinfo - print Board Info structure
boot - boot default, i.e., run 'bootcmd'
bootd - boot default, i.e., run 'bootcmd'
bootm - boot application image from memory
bootp - boot image via network using BootP/TFTP protocol
cmp - memory compare
coninfo - print console devices and information
cp - memory copy
crc32 - checksum calculation
echo - echo args to console
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls - list files in a directory (default /)
go - start application at address 'addr'
help - print online help
iminfo - print header information for application image
itest - return true/false on integer compare
jade -
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loady - load binary file over serial line (ymodem mode)
loop - infinite loop on address range
md - memory display
mm - memory modify (auto-incrementing)
mtest - simple RAM test
mw - memory write (fill)
nfs - boot image via network using NFS protocol
nm - memory modify (constant address)
pci - list and access PCI Configuration Space
ping - send ICMP ECHO_REQUEST to network host
printenv - print environment variables
rarpboot - boot image via network using RARP/TFTP protocol
reset - Perform RESET of the CPU
run - run commands in an environment variable
saveenv - save environment variables to persistent storage
saves - save S-Record file over serial line
setenv - set environment variables
sleep - delay execution for some time
tftpboot - boot image via network using TFTP protocol
USB - USB sub-system
usbboot - boot from USB device
version - print monitor version
</pre>
And there is one more thing about modular ports. In order to actually implement this, your bootstrapping environment should provide the ability to load several files. On PC this is provided by GRUB2. on CHRP you can read filesystem via OpenFirmware, and Sam's Parthenope relies on modified u-boot. If your bootstrap allows to load only a single file, then you stuck with monolithic kickstart. By the way... u-boot allows not only to boot up a single uImage or zImage, it also allows to write client programs AFAIK. With this approach, you actually can write modular bootstrap for ARM AROS using unmodified u-boot.
Most used [http://www.compulab.co.il/workspace/mediawiki/index.php5/U-Boot_quick_reference uboot options] are fatls usb 0:1,
the reason behind INTB_KERNEL is to allow use of the standard Exec function AddIntServer() to add interrupt handlers for
hardware drivers etc. AmigaOS never used it for abstract hardware drivers. AmigaOS routed only raw hardware IRQs there. Their assignment was hardcoded. As well as number of them. Actually on AmigaOS every bus has its own interrupt subsystem. For example PCI bus. PCI interrupts on Amiga are routed to a single exec interrupt. 1:1 relationship between CPU and hardware interrupts is present only on PC.
IMHO we miss things like AddInterrupt/RemInterrupt methods on our PCI subsystem's device class. PCI bus class should map these methods to whatever is appropriate. This is how it is done on AmigaOS and friends. When these are implemented, raw kernel.resource API will be needed only for several PC-specific drivers with hardwired resources. Exec IRQs are real IRQs only on Amiga hardware. On other machines they can be emulated where appropriate (VBlank is a good example). kernel.resource is meant to be different, its IRQs are hardware-agnostic, they are plain "Hardware IRQ number X, whatever this means". They are low-level actually, and meaningful only in the context of a particular system.
Was that not the transition from irq.hidd to kernel.resource? No. A long time ago there was another hacky bit named INTB_TIMERTICK. It was "abstract timer interrupt", used by timer.device. It was the same as VBlank, but with larger frequency. I removed it, because kernel.resource API was a cleaner way to access this interrupt. Furthermore, there can be more than one timer in the system. Thinking about bringing back timer HIDD definitions again. hpet.resource is a bad idea.
Can someone please enlighten me a little on how the scheduler is meant to work?
Poseidon.library creates its "Poseidon Event Task" during RTF_COLDSTART -> then calls Wait(), and ends up in limbo because wait disables interrupts (used for the scheduler heartbeat), and basically waits forever because the sigbit is never set, since krnSwitch doesn't switch the task unless TF_SWITCH is set, and no codepath run during this seems to set it?? TF_SWITCH does not disable/enable switching. This flag just enables to run user-supplied hook when the task is being switched away. It is completely safe to call Wait() in Disable()d state. Doing this actually temporarily breaks this state. IDNestCnt gets remembered in struct Task, then next task is selected, and its IDNestCnt is restored in sysbase (see kernel_scheduler.c). If there are no other tasks, then your cpu_Dispatch() should enable interrupts on the CPU and enter idle mode. See x86 implementation for good example.
You miss what happens next...
1. KrnSwitch() saves context of your task, saves IDNestCnt (core_Switch() and cpu_Switch()), then drops into cpu_Dispatch().
2. cpu_Dispatch() calls core_Dispatch. Then two cases are possible:
2a. There is a READY task. It is picked up, its IDNestCnt is restored in SysBase, then cpu_Dispatch() needs to restore registers and exit. The next task is run.
2b. There are no READY tasks. core_Dispatch() returns NULL. In this case your cpu_Dispatch() should enter idle loop. It should just enable interrupts on the CPU and put it on halt. This allows it to process hardware interrupts. Eventually some of your interrupt handlers wakes up your task and puts it into READY list.
My heartbeat interrupt has been slowed atm to help debugging - but it never actually gets a chance to fire because of the Wait() disabling interrupts. Perhaps you have forgotten to enable interrupts in your idle loop.
There is a change in the format of AROS executables. Until now we were using Elf RELocable files which are usually used as intermediate object files. We had them for various reasons, one of them was how AROS files were built in the past. That days we had no real aros cross compiler and the option to embed relocation data in unix executables (or in executable files in general) was rather new and not every linux/unix system had it. Therefore we have decided to use intermediate files. Although it was somehow working (and it is still working :-)), it has some drawbacks. Therefore decided to introduce real Elf EXEC types, in first turn implemented on ARM target with option to expand in future to all other AROS architectures.
The first patch was pretty easy and appeared to work somehow. It generated nice executables with embedded relocation info. Not only that, it also removed all global symbols adjusting relocation data to be relative to the beginning of the sections. That move reduced number of symbols in each executable significantly (depending on the file between 20 and 80% of all symbols could be removed). The only symbols that stayed in the file are local ones - due to the nature of the patch wasn't able to remove them since we have not seen them in the symbol hash table.
The patch didn't worked though. The files were relocated, AROS kernel loaded, but it crashed very early. What happened? Well, the nature of ARM relocations happened :)
Most of the relocation data on all machines is rather simple. Relocation can be absolute or pc-relative, sometimes the offset has to be bit shifted. On ARM v7 there is another one. There, when one wants to load an address of function/variable into register a combination of two instructions can be used: movw and movt. The first one loads immediate into lower 16 bits of a register while clearing upper 16 bits. The second one loads immediate into upper 16 bits without touching lower halfword. Loading of a pointer into a register looks like this:
movw r0, #:lower16:label
movt r0, #:upper16:label
In this case there are two relocations - one for lower halfword and another for upper. If an overflow of lower 16 bits occurs during relocation process, the upper one should be updated as well. Unfortunately with current patch and with typical ARM executables there is not enough information to perform the calculations.
There are two options - the first one would be to give up and go back to "fake" executables, another one would be to change from REL to RELA relocation info. The latter contains an addend, extra data which can be used to perform all the relocation calculations I need.
Decided for the second option. The patch is already in the works. There is another function for the binutils' bfd backend to perform the final relocation. There can decide what to do with every reloc info, modify data and eventually strip some symbols. An advantage is - at this stage of the linking process have also full access to all local symbols so can change all relocations section relative and eventually strip all symbols from the files.
GPU
VCore developed by Alphamosaic Ltd and now owned by Broadcom. Most of start.elf runs on the GPU. Placing ALL the userland GPU code in the videocore.hidd isn't going to be a terribly big problem because the code they published is nothing more than a shim that sends data straight to the GPU to execute.
The good news about this is that we only need to write our HIDD using the OpenVG API. The shim is relatively small codewise and lives in the ARM memory (the actual OpenVG code itself lives in the GPU RAM area and its loaded from start.elf). That's also the bad news. Our driver has to translate AROS video calls to OpenVG calls, for most tasks it should be easy, for some, not so much. It's still probably less difficult and less work, than controlling the GPU directly.
The other good news is that anything done through OpenVG happens on the GPU, its truly accelerated. It also has some nice font functions, meaning we can lead into an accelerated text mode later.
Basically, AROS resets or locks up when it tries to use AROS_ATOMIC_INC or DEC. If I comment out the byte/word operations in the header files and use non-atomic operations, the code works as expected.
have read that the L1 cache needs to be enabled to use LDREX and co (which I also read is only meant to be used on multi processor systems with shared memory) - however I am certain this is correctly enabled.
If you are using LREX or STREX, you should have L1 cache enabled, at least on the ARM CPU I work with at work.
L1 cache is enabled by enabling the MMU *AND* setting the C and I bits in the CPU - the C bit is ignored, and the I bit only covers the 16 byte instruction pipeline if the MMU is not enabled.
Can you verify that your assembly is generating LDREX/STREX? From the behavior, it almost sounds like its generating the default Semaphore locked atomics.
Impossible. There are no semaphore-locked atomics. There are Disable()/Enable()-based ones instead. And there's a special #define AROS_NO_ATOMIC_OPERATIONS in this case, which tweaks Disable()/Enable() implementations not to recurse forever.
I have tested this on ARMv5 which does not have ldrex/strex, it works fine. On those ARMs there's no way to have real atomics. On other OSes (like Linux) this is done by introducing things like atomic_t, which appears to be a complex structure, holding the value together with accompanying spinlock (implemented using swp).
#warning "TODO: lookup optimal mmu table settings for raspi memory"
/* Set up an identity-mapping for all 4GB */
for(x = 0; x < 4096; x ++)
{
pagetable[x] = x<<20 | (0x40002|0x80000|0x010000|0x00C00|0x04);
}
Shouldn't there be a second loop that sets the 'C' bit in the descriptor for the RAM pages?
Currently, you have TEX=0, C=0, B=1 for all pages (Shared Device).
You should have TEX=0, C=1, B=0 for RAM (Write-Through, Cached)
So ..
pagetable[x] = x<<20 | 2;
should be enough?
No, for RAM you need to change the '| 0x40' to '| 0x80'
tell dosboot the correct defaults to use
Please don't do this. This bootconfig.c is a deprecated legacy thing. I wanted it to go away completely with time. Instead, display drivers should auto-install themselves during own initialization phase. I. e. detect hardware=>instantiate itself. This should make things way simpler. With this approach you only need to add the driver into KS image to get the device autobooted. No hardcoded stuff.
Currently VESA and VGA drivers do this, look there for examples. never rewrote ATI driver because i don't have any test system for it.
they defined a smaller AROSCPUContext than the ExceptionContext - yet reference it as ExceptionContext in other places, and since it hasn't allocated enough storage for ExceptionContext, are corrupting memory/the structure (since the elements that are there don't map 1 to 1 with the exception context).
AFAIK, AROS has been moving in a different direction to this in recent years. It is the job of graphics HIDDs to allocate bitmaps etc. so that they have the most suitable characteristics, including allocating them from GPU RAM where possible. The concept of chip RAM is only for legacy code, and most if not all non-68k platforms should have all system RAM
marked as chip.
BTW, is the video processing code you mention CPU code or GPU code?
Also, IIRC we have support for "external memory allocators". Perhaps that's what we need for the allocation of GPU RAM through the mailbox.
All hosted and x86 native ports should use proper context formats.
trying to clarify if the vblank handler has to have run by this point to prevent this deadlock. Actually, no. Unless you have installed VBlank handler which should wake up at some point. Without VBlank there will be no quantum count. Consequently, there will be no forced preemption. But the rest will work, and multitasking will be cooperative (switch happens only when current task voluntarily gives up the CPU). Does it depend on the vblank having run before this point? and if yes what does that mean on systems where it might be able to run enough code (e.g. get to this point) before the vblank interrupt has triggered? What is it waiting for? It could wait for timer, in this case you need timer.device working. VBlank is currently needed for exec's quantum counter. In current native ports we have only a single timer, which is served by timer.device. VBlank is simulated by timer.device also. If your machine has two timers, then you can use one of them for VBlank, and another for timer.device, this will simplify things down. VBlank needs to be 50 Hz for historical reasons, many programs use it as cheap timer. I am periodically thinking about making some abstract mechanism to be able to change quantum source (and untie it from 50 Hz), but have no time to come up with something good. Additionally i started disliking timer.device hardcoded design when PC has got many timers (old 8253, APIC, HPET).
Currently i think there should be some low-level entity representing tick source. timer.device should just select the most appropriate source for its units.
The BCM2835 has 4 GPU based timer sources - 2 are used by the GPU, so im using Timer3 for our heartbeat and the remaining one will be free to the system. There is also the less capable ARM timer but that is dependent on the CPU frequency. Very good. You won't need any emulation. Set the heartbeat to 50 Hz and drive VBlank from it. Use other timer for MicroHZ.
Can you use the 'econsole.hook' I make for debugging the Sam460 via the serial port?
It provides a before-anything-else shell prompt on the serial port. You can then do 'NewCLI' to test your graphics, or use any DOS command in shellcommands.resource.
You should just be able to add econsole.hook to your module list, and use 'econsole' in your bootargs.
So long as you have a working Exec/RawMayGetChar and Exec/RawPutChar, it should work.
Also make sure to add shell.resource and shellcommands.resource for this.
That should have done it.
If you set "#define DEBUG 1" in arch/all-native/econsole/econsole.c, do you get any additional serial output?
have added it to the build and added econsole to the command line - and can see the bootloader picks up on the emergency bootconsole tag, but I still only get the insert bootable media display?
Im assuming it exposes a fake filesystem that tricks aros into booting?
The contents of which are: ECON:AROS.boot
Way to handle the scheduling code? The implementations I had been following were causing problems, due to cascading interrupts which I cant handle properly in the asm stubs just now (when they break disable etc.) - since it means detecting the interrupted codes cpu mode and getting the correct sp/lr for it, and that's just too tedious for arm.
To work around this ive added a system idle task which does nothing - and when the scheduling code has no task to run switches this in and lets it run, thereby allowing the interrupts etc to resume until something does need to happen.
Also, by adding accounting code to cpu_Switch() and cpu_Dispatch(), it should allow the system to log idle time correctly (as well as running tasks).
have thought of also adding an additional task that never runs, solely to record time spent in IRQ handlers, but I digress..
was under the impression that kernel.resource should *never* be used outside of exec.library. This is a wrong impression.
Michal started designing it because portable nature of AROS does not fit well into exec's API with all its assumptions. So, he started the new, hardware-agnostic kernel API from scratch. Yes, exec sits on top of it in places. But kernel always meant to be open thing. Otherwise it would not exist.
it wasn't meant to be just used willy nilly by user code - but by lower system components (e.g. exec) so that they could be implemented in a more generic fashion, and the kernel resource itself hide the systems quirks.
Adding new things there perfectly keeps up with our decision to minimize AROS-specific intervention into APIs which can clash with MorphOS or Amiga OS4 extensions. We want at least source-level compatibility there. Binary compatibility on PPC would be extremely cool, but at the other hand we have no maintainer for this, as well as their ABIs splintering.
It depends on what exactly is being implemented - there's no reason we should have everything crammed into kernel.resource if it doesn't need to be (i.e. if its better suited as a separate component/subsystem in its own right)
The _LE versions are for when you have endian swapping taking place. If the graphics are the same endian as the CPU, no swapping should occur. I ran into a similar terminology problem in SDL with a friend insisting that his Radeon 7000 on his PC was big-endian. It is not, it just uses the same endianness for the graphics card and the CPU so no swapping was necessary. They were both little-endian.
The _LE versions are because the PixFmts refer to the bitmap data being in big endian format in memory, for which the normal version would need to do endianness conversion before applying the shifts/masks. on this platform it is in _LE in memory also so we don't need the conversion hence using the _LE version of the call). would use _LE (if it's really little endian 16 bit mode).
What is the bare minimum needed to implement a framebuffer based gfx driver, with our software handling the rest?
Have tried with just a gfx class that only expose new/dispose/newbitmap - and having an onscreenbitmap used only for the framebuffer itself (with all other bitmaps being chunkybm, and the framebuffer's superclass also being chunkybm), but that alone isn't enough it seems?
You can use workbench/hidds/sm502/ as your example - it is as simple as I could make it.
So, AROS creates the framebuffer bitmap (verified this) -> so surely it should be capable of then rendeing into it? I don't actually create the framebuffer "bitmap object" myself - only as a result of being asked to. The code I currently have on SVN seems to create the framebuffers bitmap object fine, but then crashes in intuitions DisplayDriver callback. In particular it crashes performing the getattr on the system default pointer. don't expose MEMF_CHIP in an allocatable form so AllocSpriteData was failing (and other code later doesn't check if the values are valid == illegal memory accesses)
So far have -:
vc_init: queries the gpus memory, and sets up a fake memory handler for it, then adds the bootmode driver and returns saying all is well
vc_gfxhidd:New: sets up some fake syncmodes to test with and creates the real gfx object.
vc_gfxhidd:NewBitmap: checks if its a framebuffer and uses the onbitmap class or uses the chunkybm class otherwise
vc_onbitmap:New; creates a chunkybm object and then pushes the real framebuffer address into it as the buffer,
vc4 had v8adds, v8subs, v8muld, v8min and v8max which operated on four 8bit uint values packed into a 32bit register. Multiplication was in the range 0.0 to 1.0 and addition/subtraction saturated. There were also a range unpacking/packing modes that allowed you to pack and unpack 8bit values into 32bit registers.
RasPi has to speak to the "operating system" which runs on the GPU itself and request/free memory - it cant directly manage it itself, and so the managed functions were used to wrap these calls.
The Arm and GPU share memory space. The framebuffer is shared. The Arm can write a pixel and it will appear on the screen (through GPU hardware) without flushing/copying being required.
The GPU can composite multiple FB's in real time - so you have a number of surfaces defined which are rotated etc and composited in real time to the output. Copying can map from the address space of the Arm to the flat space of the GPU which takes some code, but I don't think whole buffers are copied.
The DMA hardware can also access the whole memory space and can perform 2D fills and blits (no blending). This is documented in the peripheral spec posted. The DMA is just an Arm accessible peripheral and can be set up with low latency (e.g. microseconds).
must use a 0xc0000000-based bus address to access SDRAM, yet non-DMA access should go via a 0x0-based bus address.
For 2D dma, set TDMODE, and the spec says "interpret the TXFR_LEN register as YLENGTH number of transfers each of XLENGTH, and add the strides to the address after each transfer." so set STRIDE to pitch of the image, the width is XLENGTH and height is YLENGTH. You would fill by not setting the SRC_INC and point source to your fill data.
The DMA cannot see the ARM's L1 cache, so you would map the framebuffer with ioremap_nocache. Depending on where the source data comes from, it may need an L1 cache flush. The DMA can see the L2 cache. Use 0xC0000000 bus addresses when L2 is disabled and 0x40000000 bus addresses when L2 is enabled. (actually just call virt_to_bus and you'll get the right address out).
openGLES/openVG has high latency. Writing to framebuffer then reading it back is very inefficient (e.g. milliseconds). If you can drive it a unidirectional way, just streaming commands at then that is efficient. openVG is not implemented on top of openGLES - it uses the same hardware but as a first class interface
To improve the Gfx driver, we will need a DMA resource implemented so can use to perform DMA operations. The Gfx driver will need this to perform blits.
Actually MEMF_CHIP has to present, for historical reasons.
This has been never fully agreed upon, but in ports i wrote i exposed the whole memory as MEMF_CHIP. The idea behind this is that CHIP is originally the memory where graphics and sound data can be put. On non-Amiga platforms there are no restrictions on this, so the whole memory is CHIP.
Yes, many old software can misbehave with CHIP memory size larger than 2MB. But this actually applies only to m68k AROS which is going to run m68k binaries. In other cases it's quite logical to fix the program when porting.
As to original question: yes, it's enough to have a framebuffer bitmap (one with aoHidd_BitMap_FrameBuffer set to TRUE) and PutPixel routine. It framebuffer can be served by chunky bitmap class, then you can simply create chunky bitmap with your own buffer (see how VESA driver does this). Chunky PutPixel is already there.
struggling to determine what is the correct pixfmt to use for the 24/16/15 bit gfx modes on the RasPi. AFAIK it uses RGB565, for 16bit but im unsure what shifts etc should go with it? suffice to say Im getting the wrong colors so far lol.
<pre>
redmask: 0x0000F800
greenmask: 0x000007E0
bluemask: 0x0000001F
alphamask: 0
redshift: 16
greenshift: 21
blueshift: 27
alphashift: 0
</pre>
It should likely be vHidd_StdPixFmt_RGB16_LE
This stuff is a bit confusing. The "names" of the stdpixfmts are based on the layout in memory,
ignoring endianess. So for example:
ARGB32: will be 0xAA 0xRR 0xGG 0xBB in memory on both big endian and little endian machines.
The shifts and masks OTOH are based on pixel access (ULONG in this case), so differ depending
on whether you run on big endian machine or little endian machine (that's why there's stdpixfmt_le.h and
stdpixfmt_be.h in rom/hidds/graphics/).
With the 16 bit pixel format it's even more confusing, as for example it's impossible on little endian machine
to describe RGB16 with shifts/masks alone. That's why there's vHidd_PixFmt_SwapPixelBytes_Flag.
(RGB16 == RRRRRGGG GGGBBBBB in memory, and for pixel (WORD) access on little endian machine it needs to
be accessed as GGGBBBBBRRRRRGGGG).
The shifts btw indicate how much to shift the component to the left (!) so that it is moved to the highest bit (31).
The aHidd_PixFmt_StdPixFmt you specify will be ignored most of the time, because when the pixelfmt is registered,
the gfx hidd checks if there's an identical pixfmt (shifts/masks/etc., but ignoring pixfmt->stdpixfmt) already in the system,
and if so, it uses the already existing one and does not create a new one.
In theory it would be better if gfx drivers could simply/only specify a StdPixFmt without all the shifts/masks stuff when the
gfx driver uses pixfmt which matches one of the stdpixfmts exactly. Another possibility would be for gfx drivers to use
HIDD_Gfx_GetPIxFmt(stdpixfmt_gfx_driver_wants_to_use) and then peek shifts/masks from it and fill out a pixfmt
tag list based on that.
15bit very blue/green: Try to pass same shifts/masks/etc. as in 16 bit pixfmt (maybe you think it's using 15 bit R5G5B5
(or swapped) but it's actually still using 16 bit R5G6B5 (or swapped).
aHidd_PixFmt_StdPixFmt you pass is mostly ignored. It's the shift/masks/etc. that count.
But I would still pass the correct one (_LE) == whatever rom/hidds/graphics/stdpixfmts_??.h uses
in the entry where you have looked up shifts/masks/etc.
Use the shifts/masks/etc. from the entry in stdpixfmt_le.h (if you are running on little endian machine) or stdpixfmt_be.h (if you
are running on little endian machine) that matches the pixfmt that its meant to be.
0xAA,0xRR,0xGG,0xBB on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_BGRA32)
0xAA,0xRR,0xGG,0xBB on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_BGRA32)
it feels like AROS trashes the alpha component, otherwise it should be 8A8R8G8B.
read on the subject suggest its in 1x5r5g5b (x is ignored) to keep 16bit alignment .
Suggests to me that wrong shift/mask are being applied - however going by the 16bit versions it all looks correct to me so I am really confused as to what is happening.
The output image looks to have too much green/blue, and very weak red.
Kickstart
The idea is to minimize amount of archirecture-specific modules to make the user's life easier. So, the kickstart was split into 'base' (which does not contain anything machine-specific) and 'BSP' (Board Support Package) which contains all hardware-specific stuff. This way, for example, distribution makers can save up space on CD and make CDs with multiple platform support. Different configuration would load the same base with different BSP's.
Next there was some part which is entirely missing on hosted. These are filesystems. Hosted ports do not need them to boot up, so on hosted they are left out. At the other hand, they are also architecture-agnostic. So i put them into 'FS' package (standing for 'filesystem').
USB
Poseidon is one more big part. I made it into separate package in order to allow users to omit it if they don't need it (for example, to run on retro PCs without USB). Personally i have one. Again, Poseidon is hardware-agnostic (well, there are USB drivers but HCIs are pretty standard).
AFAIK its HCI 1.0 compliant but not familiar enough with poseidons drivers, nor USB, to just hack away at the existing code. Perhaps once i'm more familiar with the workings I can merge in the changes needed to get it operating but for now I will focus on getting it running. Also our drivers have known issues so perhaps a fresh set of eyes might shed some light on what is going wrong.
Another interesting question is whether Poseidon can operate on device side. Is it flexible enough? How similar is being a USB host and USB device? think it will need a bit of work on Poseidon's side. Until then I will force the driver into Host/Master mode in the init code, but leave open device etc to configure the chipset for either's use - and look at trying to add support for working in Device/Slave mode & switching modes once it's up and running.
Actually USBROMStartup is some kind of kludge. Can there be any alternative? Could device drivers be self-installing, like our HIDDs? This would get rid of need to list them in USBRomStartup.
* Model A and B limited to 150 mA per port.
* Model B+ and Pi 2 introduced configurable 600 mA to 1.2 A support over all ports - anything above that requires a powered USB hub.
Implementing the hardware driver that Poseidon uses to interact with the USB components.
Have code in place to (try) and initialise the USB chipset, and configure host/device mode operation (though AFAICT Poseidon doesn't support device mode). Started to get the "virtual" root hub written for the single USB port so that Poseidon should at least list it correctly in the GUI - and try to interact with it to find peripherals.
The BCM2835 uses a soft IP block from Synopsys’ DesignWare library (DWC), specifically the block is called dwc_usb_2_0_hs_otg_subsystem-ahb_se (“USB 2.0 Hi-Speed OTG Controller Subsystem w/AHB Interface SE”).
There is no public documentation for this, and pretty much zero chance of anyone getting hold of it even with NDA. However, there's a Linux driver written by Synopsys ([https://github.com/raspberrypi/linux dwc_usb]). Specifically directories [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_common_port] and [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_otg].
The Synopsys code is actually under a fairly permissive licence – it's not GPL, it's similar to BSD (’don't sue us if it breaks’ is pretty much the only clause). So this should not be a barrier to porting the code.
The code is really well written, with a nice partition between the work done by the driver (dwc_otg, which is fairly involved, given the host does more work than a conventional EHCI driver), and the interface to Linux (dwc_common_port).
Probably only need provision of relevant changes to dwc_common_port. Other things to consider....
* Provision of necessary headers to get it to compile
* Provision of necessary functions (main issues are wait queues, threads, work queues, tasklets, timers, spinlocks and mutexes (multithreading) )
* Interfacing between USB stack and the driver. dwc_otg/dwc_otg_hcd_linux.c looks like the place to start.
the Linux bits of the headers are only required for the dwc_common_port library. dwc_common_port includes a variety of crypto functions which are not used – it appears to also be used for ultrawideband (UWB) and wireless USB (WUSB) drivers where crypto will be an issue, but it isn't going to be for plain wired USB.
Every USB driver acts as an USB hub as well in order to let Poseidon control the state of USB ports. The code there was reading status of the only USB port in Raspberry's CPU but when changing the status it erroneously deleted some of the status bits, including the port enable one. It was so because those bits in the status register are of a type Read/WriteToClear. It means, if one does not want to change their value from 1 back to 0, one has to actually write the 0 value. Very practical thing e.g. in interrupt handlers, where one reads the interrupt status register to learn what was the interrupt reason, and writes it back to the same register in order to clear the interrupts.
After fixing that code it turned out that the communication was still unsuccessful. Apparently the USB device was not understanding the host for some reason. That should not happen since the request sent was one of the standard ones implemented by virtually anything with an USB connector, assumed that Poseidon clears the data caches before forwarding the work to the USB drivers but that's the responsibility of the driver itself.
The USB device responded and acknowledged the transmission! But why were all the request sent after address change failing with timeout? They should not. Once again, address set is supported just by anything. Tried to contact the device at address 0 once again and there it was, still responding properly. The enlightenment came. The bus address for DMA transmissions was, as it is in many bare metal USB implementations, just the pure memory address of the buffer as seen by the ARM cpu. Have "prefixed" it with the real location of uncached RAM and booted AROS once again.
Trident saw this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
and this:
Product : Vendor: Vdr=0424/PID=EC00
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 255
SubClass : 0
DevProto : 1
VendorID : 1060
ProductID : 60416
DevVers : 0200
and even this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
What are these things? The first one is USB hub built in the Raspberry. Thanks to this one the Pi machines (with exception of Pi0 and computing modules) have more than just one single USB port. The second one is the network chip in raspberry, the third one is my USB SD card reader which have just connected to see what happens. AROS tried, of course, to boot from it ;)
So, the first step towards working USB is done. The control transfers are working as you can see above. Next step is to implement bulk and interrupt transfers, having the basics in place. Finally some error handling will be added and USB for Pi will be as complete as the PC version.
[http://www.raspyfi.com/raspberry-pi-usb-audio-fix/ Issue with USB Audio]
Audio
The Pi 4B is the only Pi that can output HD Audio as an HD Audio passthrough bitstream, and it does it over HDMI. It's possible to use the two HDMI output for separate HDMI video and HDMI audio outputs to allow UHD HDR video and HD Audio with non-UHD HDR compatible AVRs.
The Pi3B+ and earlier will decode to PCM 5.1/7.1 and output over HDMI. HDMI is the only interconnect that has a standard for carrying Dolby True HD, DTS HD MA etc. as a bitstream - you can't carry it as a bitstream on any other interface.
Pi3 and Pi4 audio jack output derived from 12bit pulse width modulation is relatively poor. For better, choose USB Audio or I2C versions.
[https://github.com/raspberrypi/linux/tree/rpi-patches/sound/arm audio] and its [https://github.com/raspberrypi/firmware/issues/2 very high speed message passing interface type of thing VCHI]
The Model B+ added an additional voltage regulator for the audio output and an additional output driver to drive low-resistance loads like headphones. However it is still using pulse-width modulation (PWM), which has a major impact on sound quality
the old Raspberry Pi used a linear voltage regulator to provide the 3.3V to many of the components on the board while the new one uses a switching regulator. Both can perform reasonably well. However switch mode power supplies often show higher noise figures
Analogue audio
Audio over HDMI rev 1.3 & 1.4
Ethernet
10/100 BaseT Ethernet RJ45 socket
GPIO
GPIO shouldn't be too bad but bear in mind it is already accessed in places so they would need to allocate pins etc through it (e.g. sdcard to flicker the activity light, serial debug to output data on the GPIO pins)
Probably a resource rather than a device...
Started an i2c driver that will need to allocate GPIO pins. Feel free to work on it if you are interested ;p
GPU graphics with 2D and 3D acceleration
Sadly none yet for 32bit but for 64bit...
Miscellanous
hdmi issues
Setting the hdmi_force_hotplug=1 makes sure the Pi believes the monitor/TV is really there.
You might also need to set config_hdmi_boost=4 or even higher (up to 9) if your display needs a stronger signal.
If the display is a computer monitor or newer tv, use hdmi_group=1 (auto HDMI use) and if it is an older TV, try hdmi_group=2 (for DMT formats, i.e. for PC monitors) then you HAVE to "set hdmi_drive = 2 to enable HDMI output as this forces HDMI mode rather than DVI mode
Do not set hdmi_safe=1 as that overrides many of the previous options.
Using a shorter or better quality HDMI cable might help. Make sure your Pi's power supply delivers 1 A and not 500 mA.
If you see a problem with the red colour - either absent, or interference - then try a boost
composite video
changing the RCA cable, then the composite port worked out of the box
Boot it as you are doing, without HDMI. If you now plug in the HDMI, do you get the image? In other words, does the Pi think HDMI is connected even when it isn't?
Rename all the files in the first partion of the card except bootcode.bin, start.elf and fixup.dat What's the result?
Put back config.txt What's the result?
for PAL mode sdtv_mode=2
dmi_ignore_hotplug Pretends HDMI hotplug signal is not asserted so it appears a HDMI display is not attached
hdmi_ignore_hotplug=1 Use composite mode even if HDMI monitor is detected
<pre>
# NOOBS Auto-generated Settings:
#hdmi_force_hotplug=1
#config_hdmi_boost=4
#overscan_left=24
#overscan_right=24
#overscan_top=16
#overscan_bottom=16
#disable_overscan=0
start_x=1
gpu_mem=128
</pre>
tvservice -c "PAL 4:3"
<pre>
/opt/vc/bin/tvservice -s or tvservice -s
state: HPD high|HDMI mode|HDCP off|composite off (0x12001a), 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m CEA
Group CEA has 1 modes:
(native) mode 16: 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m DMT
Group DMT has 0 modes:
</pre>
sudo amixer cset numid=3 1
forces the audio to the headphone jack, even with the HDMI video output plugged in
config.txt
the hdmi_ignore_edid_audio=1 option sems relevant as it should tell ALSA that the only available audio is analog, no matter what the display says
There are several different ways that these 4 pole (ring) composite analog cables can be wired up, so some work great in some applications and can be a waste of time in others.
What is needed for the Raspberry Pi B+ and above, which like many camcorders needs the ring contact next to the base contact to be the ground.
The wiring for the 4 pole are:
TIP (LEFT AUDIO CHANNEL)
RING 1 (RIGHT AUDIO CHANNEL)
RING 2 (GROUND/EARTH)
RING 3 BASE/SLEEVE (VIDEO) YELLOW
Most Apple based Players and the Microsoft Zune (TM) are wired this way.
Most analogue camcorders are wired this way as well, where the ground in on Ring 2 will work with the Pi although you may need to swap your Video plug with the Right Audio plug.
Nearly all other MP3 players are not wired this way, the ground is on another ring ie the wrong one.
External devices
* Camera Module Omnivision ov5647 Sunny 5MP (NoIR version) V1.3 - NoIR at 850 nm, peak at 880 nm and trails off at 940 nm wavelengths
* Camera V2 Sony IMX219 V2.1 8mpixel 8MP 8megapixel - 3280 x 2464 pixels - video at 1080p30, 720p60 and 640x480p90 - wider field of view, 62 vs 54 degrees horizontally -
* Branded WIFI usb BCM43143 dongle
N.B. dreaded error after changing cameras (stupidly without turning off the power first) and lasted through several power cycles. It can be a bad 15-pin FFC ribbon cable, when swapped, camera(s) and the Pi itself are working OK. It can be an instance of a cold solder joint on the CSI connector on the pi board. the camera can be detected (that's done via I2C) but may still not be able to receive image data (done via CSI-2) if something is broken. CSI-2 is uni-directional. Control is generally done via I2C.
The CSI-2 receiver always writes to memory, not direct to the ISP. That's the way the Broadcom architecture works as it allows multipass processing easily. GPU memory is accessible from the ARM. Processing using the QPU graphics processors may be possible. currently the only supported sensor is OV5647 and IMX219. The linux drivers are all in the firmware blob, else you'd be looking at at least a man-month of work in a fully fledged imaging lab to do a decent tuning of the camera modules' ISP parameters.
Static electricity maybe an issue for the camera module and slightly less for the pi board.
== References ==
===Good sites to visit===
*[https://github.com/raspberrypi/firmware/tree/master/ Raspberry Pi Firmware build]
*[https://www.raspberrypi.com/documentation/computers/software-sources.html Documentation]
*[https://rpilocator.com/ RPiLocator]
Linux only
*[https://github.com/raspberrypi/linux Raspberry Pi Linux Build]
*[https://dietpi.com/ DietPi]
*[http://www.tinycorelinux.net/ports.html piCore]
*[https://wiki.alpinelinux.org/wiki/Raspberry_Pi Alpine Linux]
*[https://github.com/armbian/build Armbian]
*[ FydeOS]
*[ TwisterOS based on ChromiumOS]
*[https://note.com/jamesmondo/n/nc76e31402be8?hl=en BSD]
*[https://www.raspberrypi.com/software/operating-systems/ PiOS Lite] and then [https://hstwb.firstrealize.com/ HST]
*[ PiMiga for pi4 and pi5]
*[ amibian for pi2 and pi3]
*[ retropie pi1 and 2]
Other alternative lighter smaller than Pi OS
*[https://aros.sourceforge.io/nightly1.html Aros 64bit ARMV8 single core]
*[https://www.riscosopen.org/wiki/documentation/show/Welcome%20to%20RISC%20OS%20Pi RiscOS on Pi3 and Pi4]
*[https://github.com/michalsc/Emu68 ARM based realtime JIT 68k for amiga computers]
*[https://github.com/JJDSNT/bellatrix/releases/ Alternative use of Emu68 on Pi3b]
*[https://github.com/stevereaver/uaos uaOS with Emu68k]
*[https://github.com/aros-development-team/AROS/commit/f80a268607dfae81b2db94755ab4e4d31ccb72d6 m68kemu library reference]
*[ HaikuOS]
*[https://github.com/raspberrypi/noobs NOOBS] os loader with successor [https://github.com/procount/pinn PINN]
*[https://github.com/maxnet/berryboot berryboot]
*[https://github.com/brianwiddas/pi-baremetal Bare Metal Access on Pi 32bit]
Testing procedure is put sd card in, connect board to board if necessary, plug in hdmi and then power nothing else is done especially CSI DSI etc
[https://www.raspberrypi.com/documentation/computers/compute-module.html CM5] has the same 55mm x 40mm 2x100pin connectors form factor as the CM4 but [https://www.epdtonthenet.net/article/214508/Key-Considerations-When-Migrating-from-Raspberry-Pi-CM4-to-CM5.aspx some pins and other small things] have changed. Will need the [https://raspipcb.com/tech-blog/raspberry-pi-cm4-vs-cm5-difference-in-booting-from-sd-card/ right IO board to suit]
*Green [ Raspberry Pi Compute Module 5 IO Board REV2 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1967]] - untested
*Green [ RPi Compute Module 5 IO board REV1 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1751]] - untested
*Black SupTronics Geekbord X1500 CM5 IO Carrier Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*[https://sipeed.com/nanocluster Sipeed NanoCluster] - untested up to 7 CM5
*Green BentoIO CMX0 - untested
*Box EDATec ED-CLAWBOX - untested
*Home Assistant Yellow - Kit with PoE with Raspberry Pi Compute Module 5 - untested
*Blue [https://www.waveshare.com/wiki/CM5_PoE_BASE_A Waveshare CM5-PoE-BASE-A] - untested
*Box Waveshare [ CM5-POE-BOX-A] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-B Waveshare CM5-IO-BASE-B] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-A Waveshare CM5-IO-BASE-A] - untested
*Blue Waveshare [https://www.waveshare.com/wiki/CM5-NANO-B CM5-NANO-B] - untested
*[https://carboncomputers.us/products/pi-flux piFlux]
*[https://carboncomputers.us/products/ Zitaotech Hackberry] CM5 lite only -
*Portable [https://www.waveshare.com/pocketterm35.htm Waveshare PocketTerm35] with Pi4B or Pi5 - untested
*Box [https://www.clockworkpi.com/uconsole ClockworkPi uConsole][https://www.youtube.com/watch?v=EtI_bAahbR8 CM4 into an adapter or CM3 into so-dimm - Cyberdeck] - untested
*Green RPi [https://datasheets.raspberrypi.com/cm4io/CM4IO-KiCAD.zip Compute Module 4] [https://datasheets.raspberrypi.com/cm4io/cm4io-datasheet.pdf IO board] V1.4 [https://datasheets.raspberrypi.com/cm4io/CM4IOUSB3-KiCAD.zip USB3] [https://datasheets.raspberrypi.com/cm4io/cm4iousb3-appnote.pdf CM4ISO] [https://datasheets.raspberrypi.com/cm4/cm4-datasheet.pdf Dual100pin] (2020) aka Development Platform Board - untested
*Purple Pi Hut Cytron CM4 Maker Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*[ KubeSail PiBox mini 2]
*Home Assistant Yellow with Raspberry Pi Compute Module 4 - untested
*[ Turing Pi V2] - untested CM4 with 260-pin SO-DIMM socket adapters and/or nvidia jetson nanos - untested
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-C Waveshare CM4-IO-BASE-C] - untested but binary blobs Rev01 Rev02
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-B Waveshare CM4-IO-BASE-B] - untested but binary blobs
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-A Waveshare CM4-IO-BASE-A] - untested but binary blobs
*Blue [https://www.waveshare.com/wiki/CM4-NANO-B Waveshare CM4-NANO] - untested but usb and audio turned off or rerouted
*Black [ Seeed Studio with BigTreeTech BTT pad 7] - bin blobs?
CM3 has a 200 pin sodimm ddr2 connector form factor but not electrically SC0028, SC0029
*Blue [https://wiki.geekworm.com/CM_IO_Board Geekworm RPi Compute Module IO Board] [https://github.com/geekworm-com/cm-io-board CSI DSI] with CM3 in ddr2 slot underside - '''works''' if SW1 on but CM3+ '''does not'''
*Green [https://cdn-shop.adafruit.com/product-files/3442/CMIO_schematic.pdf RPi V3 IO board CM3IO] and CM3 Lite - untested
*Green [https://turingpi.com/ turingpi v1 cluster] - untested up to 7 cm3 7xlan9514 12V discontinued, 3 x Pi4 homelab maybe better
*Blue [https://www.waveshare.com/wiki/Compute_Module_PoE_Board Waveshare Compute Module PoE Board] and CM3 lite (if not lite, write files to internal eMMC fat32) '''AVOID''' bin blobs
*Blue [https://www.waveshare.com/compute-module-io-board-plus.htm Waveshare Compute Module IO Board Plus] [https://www.waveshare.com/wiki/Compute_Module_IO_Board_Plus wiki] [https://forums.raspberrypi.com/viewtopic.php?t=235695 pin settings] with CM3+ Lite - '''AVOID''' binary blob
*[ Pi02w on Geekworm SupTronics X305 Raspberry Pi Zero IO Baseboard] - untested
*[ Spotpear Pi Zero 2w to Pi3b format-ish] - untested
*[ pi-top v4] box has 128x64 oled display, micro hdmi, 19Whr battery with pi4 and 15V PD 36W min needed
*[ pi-top v3] three green pieces, heatsink covers most of the base tray, pi-top hub mk1 lhs and Pi1B Pi2b Pi3b rhs secured from below, black rounded strip with pi-top above keyboard, 13.3" HD 1366 x 768 display, small touchpad,
*[ pi-top Model 2.0] pi-top on bottom bezel of 14-inch green laptop, large trackpad, keyboard slide down to reveal main system hub on slide rails moved to the right, Raspberry Pi3b screws down, hub slides in, 18V 2.5A 45W charger brick, battery 11.1V 3500mAh 38.85Wh and storage PiTopOS
*[ Pi-Top CEED Raspberry Pi Modular Educational Desktop with RPI3] monitor
*[https://www.indiegogo.com/en/projects/jesselozano/pi-top-a-raspberry-pi-laptop-you-build-yourself Pi-Top v1] wedge laptop with RPi2
<pre>
2008 Trustees collected for Foundation
2009 Pi Foundation charity status gained
2010
2011 First Raspberry prototypes
2012 First boards go on sale at CPC and RS. The Model A and B 700 MHz Arm11 - February 29th BCM 2835
2012 First million sold - more than the 10,000 original planned and anticipated
2013 First Alpha Experimental builds of AROS Native for the 32bit Pi
2013 Pi Trading launched making grants available, providing in house educational resources and Pi Academy for teacher training
2013 Over two million sold
2014 Over three million sold
2014 Pi 1 Model B+ introduced that moved composite video to audio jack and same half gig of memory
2014 Pi Model A+ v1.1 no ethernet and 1 usb - a little smaller -
2015 Over four million first gen pis sold
2015 Pi Zero 1.2 BCM2835 first production revision released with no camera port
2016 Pi0 1.3 released with camera csi connector
2017 Pi Zero W v1.1 1GHz Pi0W, single-core 32bit CPU BCM2835 released with Cypress CYW43438 wireless
2020 Raspberry Pi Pico SC0919 with RP2040 32-bit 2Core ARM Cortex-M0+ up to 133 MHz - 264KB of SRAM and 2MB of on-board QSPI Flash -
2024 Raspberry Pi Pico 2 with RP2350 2Core 32bit Arm Cortex-M33 and 2core open-hardware [https://github.com/wren6991/hazard3 Hazard3 RISC-V]
2015 Pi 2 Model B v1.1 BCM2836 900/600 MHz ARM Cortex-A7 Armv7 quad 32bit, 32bit VideoCore IV GPU - 1Gb RAM - 5V 2A micro usb - SMSC LAN9514 chip -
2015 Over a million pi2s sold
2015 Raspberry Pi 2 Model B version 1.2 Pi2bv1.2, aka Pi2B2 has armv8 BCM2837 underclocked to 900Mhz without wifi/bluetooth module
2016 Pi 3 Model B - Broadcom BCM2837 SOC four 64bit ARMv8 Cortex-A53 1.2GHz 32bit 1080p VideoCore IV GPU - 1Gb DDR2 - bluetooth 4.1, Cypress CYW43438 wireless 802.11n - 4 x USB2.0 ports - 5.1V 2.5A - SMSC LAN9514 chip
2016 PIs total over 10 million worldwide
2017 Compute Module 3 CM3 with BCM2837B0 armv8 Quad 64-bit - small 67.6mm x 31mm board which fits DDR2 SODIMM connector but not electrically compatible which plugs into needed IO board - beware of the I2C protocol issue
1Gb LPDDR2 RAM - Lite or 4Gb Emmc storage
2017 12 million pis sold in total
2018 Pi 3 Model B+ - 4c A53 BCM2837B0 1.4Ghz - 1Gb, wireless 802.11ac, gigabit ethernet (300Mbit/s) and bluetooth 4.2 - power over ethernet - 4 x USB2.0 ports - Microchip LAN7515 chip
2019 Over 15 million sold
2019 Pi 3 Model A+ with BCM2837b0 Cortex-A53 64-bit SoC @ 1.4 GHz with 512Mb LPDDR2, 1 usb2, 1 hdmi, 1 micro usb 5V 2A - no ethernet -
2019 Raspberry Pi Compute Module 3+ CM3+ - Broadcom BCM2837B0 1.2Ghz, Cortex-A53 (ARMv8) 64-bit SoC on DDR2 SODIMM mechanically compatible only factor - IO board required
1Gb DDR2 and 8GB, 16GB, 32GB or a Lite variant without eMMC
2021 Pi zero 2 (w or no W) RP3A0 quad 1GHz Cortex-A53 64bit BCM2710A1 512mB SDRam
2025 edaTEC CM0 ED-CM0NANA with additional dev board with quad 1Ghz A53 with 512Mb Raysan RAM, 2 USB2 and 10/100 ethernet - pico castellated edge
2019 Pi 4 Model B v1.1 RPI4B - BCM2711B0T quad 64bit A72 1.5GHz, 4K VideoCore VI, AC wifi, Bluetooth 5.0, GbE Broadcom BCM54213PE (PHY ID 0x600d84a2), 2 micro hdmi decode up to 4K, USB-C 5.1V 3A power, 2xVLI VL805 USB 3, 2xUSB 2.0, 2GB 9LDWW D9WHZ or 4GB 9FDWW D9WHV, 8GB 0AA47 D9ZCL ddr4 ram
2020 Silent Pi 4 v1.2 upgrade with more USB-c psu support
2020 PI400 BCM2711C0T 1.8GHz 4Gb DDR4 inside keyboard, 5.1V 5A 27W usb-c psu, 2 micro hdmi, external ide style 40pin gpio, no audio port -
2020 Raspberry Pi Compute Module 4 BCM2711B0T on new 55mm x 40mm 2x100 pin form factor with extra breakout IO board
CM4101000 1Gb RAM Lite SOM
CM4102000 2GB RAM Lite
CM4104000 4GB RAM Lite
CM4004008-4GB-RAM 8GB-EMMC SOM System on Modules
CM4104032 4GB RAM 32GB emmc
CM4108000 8GB RAM Lite
CM4008016 8GB RAM 16Gb eMMc
2021 Raspberry Pi SC0763 Compute Module 4S CM4S with ddr2 sodimm pinouts but not electrically the same with suitable IO board extra cost -
CM4S01000 1GB RAM Lite
CM4S01008 1GB RAM 8GB eMMC Flash
CM4S02000 2GB RAM Lite
CM4S04000 4GB RAM Lite
CM4S04016 4GB RAM 16Gb KLMAG1JETD-B041
CM4S08000 8GB RAM Lite
2021 Pi 4 v1.4 BCM2711B1 upgraded power regulator, to deal with 8gig of ram being more power hungry
2021-48 Raspberry Pi 4 model B v1.5 2GB
2023 Pi 5 v1.0 BCM2712 Quad A76 @2.4Ghz - VideoCore VII - no audio socket - dual 4k from mini hdmi - fan connector - 5.1V 5A psu
2024 Pi 5 2GB DDR4 version uses BCM2712D0
2024 Pi-500 with 8Gb LPDDR5 and membrane keyboard
2024 Pi 5 v1.1
2024 Raspberry Pi Compute Module 5 CM5 BCM2712 55mm x 40mm form factor with additional IO board
CM5004000 04GB RAM 0GB eMMC Lite
CM5008000 08GB RAM 0GB eMMC Lite
CM5016000 16GB RAM 0GB eMMC Lite
2025 Pi-500+ with 256GB NVMe storage, 16GB LPDDR4 RAM, and Gateron KS-33 Low Profile Blue mechanical keyboard switches
2025 Pi5 1GB DDR4 announced
2022 PiOS linux goes 64bit
2024 Pi Trading IPO stockmarket stock exchange listing
2026 April and May Aros 64bit fixed, added AHI audio, VC4 gfx started, usb functions added to rom
2026 June and July Aros 64bit usb2otg started, dma.resource, sdio.resource, bwfm.device wifi added
2026 Late July daily 64bit Pi3 LE little endian builds start
2026 August Pi 4, 400, 5 and 500 DTBs added, expanding existing support and wifi for Pi4 and Pi5
2026 August Pi5 HAT+ nvme and HDMI, AHI RPiI2S added, Pi4 HVS5 video scaler started,
2026
2027
2028 Pi 6
</pre>
The vcgencmd can be used to inspect and dump the current system configuration.
vcgencmd runs on top of VCHIQ as an RPC. The mailbox interface is an alternate but much simpler RPC.
VCHIQ is a bridge (queue) between the CPU and the GPU so they can communicate with the firmware.
Loads of [https://github.com/6by9/rpi3-gpiovirtbuf/blob/master/rpi3-gpiovirtbuf.c mailbox] which uses the GPIO control calls. [https://github.com/raspberrypi/firmware/wiki/Mailboxes may also be of interest]
A fair number of vcgencmd examples (search for vc_vchi_gencmd_init). [https://www.raspberrypi.org/forums/viewtopic.php?t=229203#p1406112 sends the relevant vcgencmd commands] to update the scaling kernel, but the [https://github.com/raspberrypi/userland/blob/master/host_applications/linux/apps/gencmd/gencmd.c command] is just a text string. Parsing and execution of the instructions is performed by the VideoCore firmware.
The Raspberry Pi runs two separate operating systems: Linux/Aros on the ARM, and a threedx RTOS called vcos running on the Videocore 4 VPU: vcos is commonly called "the firmware". Vcos is tasked with performing certain system services, for example running the display and audio outputs. The VCHI driver provides an interface to allow drivers to talk to vcos.
Doubtful, on any [https://www.web3d.org/ Web3d] [https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API WebGL] or [https://github.com/immersive-web/webxr WebXR] [https://developer.mozilla.org/en-US/docs/Web/API/WebXR_Device_API Device API] [https://developer.mozilla.org/en-US/docs/Web/API/XRInputSource XRInputSource] support. Hopefully, never/limited support features like location, peer-to-peer, invasive web apps, unwarranted storage, payments, proprietary video streaming etc
*spreadsheet [https://git.sheetjs.com/sheetjs/sheetjs sheetjs] [https://github.com/mleibman/SlickGrid SlickGrid] [https://github.com/6pac/SlickGrid SlickGrid] [https://github.com/jspreadsheet/ce jspreadsheet ce] [https://github.com/dream-num/Luckysheet Luckysheet] [https://github.com/ruilisi/fortune-sheet fortune-sheet] [https://github.com/dream-num/univer/ univer] probably without xlsx support
*presentations [https://github.com/impress/impress.js/ impress.js simplified] [https://github.com/bwlewis/slides slides] [https://zenomt.github.io/mdslides/ github markdown slides] [https://github.com/Patternslib/slides Patternslib slides markdown] probably without pptx support
*weather [https://github.com/kaushalsahu07/weather weather], [https://github.com/Himanshu3412/Weather-Forecast Weather Forecast],
==Future==
[https://github.com/ARMSX2/ARMSX2 Arm pi of pcsx2]
[https://tube.cadence.moe/ Cloudtube], [https://github.com/TeamPiped/documentation/blob/main/content/docs/public-instances/index.md TeamPiped], [], [], [],
[https://hyperpipe.codeberg.page/ hyperpipe], [https://ytify.pp.ua/ ytify], [], [],
[ ytdl], [https://github.com/golddominik893/liberatube liberatube]
[https://git.lolcat.ca/lolcat/4get 4get], [https://github.com/hnhx/librex librex], [], [],
{{BookCat}}
jrkb3xa0vkkdbksjd47u6p1p6g49g7s
4676520
4676518
2026-10-17T13:39:13Z
Jeff1138
301139
4676520
wikitext
text/x-wiki
{{ArosNav}}
[[#Native]]
[[#Hosted]]
[[#Build]]
[[#Hardware]]
[[#References]]
[[#Future]]
==Introduction==
[[File:Scalos00.png|thumb|Scalos on Aros Pi3b]]
Aros aims to cover Pi 3 to 5 512Mb+ RAM
Options to boot from using a good power source to prevent the yellow lightning symbol.
*With Pi3b+ the max you can get is 5.1V 2.5A with micro usb.
*With Pi4 5.1V 3A with usb-c
*With Pi5 5.1V 5A, the amps went ever upwards, even to 5.1V 9A with usb-c
* Pi500+ keyboard wedge - working but not much tested esp [https://github.com/aros-development-team/AROS/commit/48e9c8edcca4b5c1e1fe0b1123f2129f624af67b power button]
* Pi500 wedge with up to date bootloader via PiOS - working but not much testing esp [https://github.com/aros-development-team/AROS/commit/48e9c8edcca4b5c1e1fe0b1123f2129f624af67b power button]
* Pi 5 - Quad A76 64bit ARMv8 and RP1 "southbridge" with VideoCore 7 D0 (rev1.1) - untested
* Pi 5 - Quad A76 64bit ARMv8 and RP1 "southbridge" with VideoCore 7 Pre-D0 C1 (Rev1.0) - untested
* Pi400 RPI-400 keyboard wedge - resolution changing and audio from micro hdmi0 (near 40pin) and micro hdmi1 (near usb-c psu) - Fn F10 0x5e power on and off works or held down for over 7 seconds auto shutdown - keyboard ok - wifi and lan ethernet testing -
* Pi 4 - Quad A72 64bit ARMv8 with VideoCore 6
* Pi 3 - Quad A53 [https://www.raspberrypi.com/documentation/computers/processors.html 64 bit] ARMv8 with VideoCore 4 with '''fan''' to prevent overheating cpu 82C+ throttling
* Pi02W - Quad A53 64bit - boots but [https://forums.raspberrypi.com/viewtopic.php?p=2387984#p2387984 usb not working but did in the past],
* Pi 2 - Quad 32bit ARMv6 with VideoCore 4 - mostly not 64bit compatible
* Pi Model B+ 32bit ARMv6 with VideoCore 4 - not 64bit compatible
* Pi Model A and B 32bit ARMv6 with VideoCore 4 - not 64bit compatible
===Native===
* 2013-03 Kalamatee starts work
* 2015-04 Work continues with mschulz on the kernel and Kalamatee (NicJA) on gpio and usb
* 2018 [https://www.patreon.com/posts/i-owe-you-some-20956961 mschulz resume adding BE big endian support], [https://www.patreon.com/michal_schulz/posts Big endian on Pi]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bsek latest commits for pi 3b, 4 and 5 64bit]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=metaneutrons latest commits for Pi5]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bitplane latest commits for ARM]
====64bit====
'''Download''' A [https://archive.org/details/piAROS Pi Distribution (Distro) has started] and the contents copied to fat32 8GB+ microSD card (there will be drawers/folders - boot c Classes Demos Developer Devs Extras etc only showing). The SD can be plugged in to the Pi. And power on. [https://pi.amiga.icu/ Repository]
'''Not recommended''' but [https://aros.sourceforge.io/nightly1.html RaspberryPi 3, 3+, 4 and 5 64bit ArmV8 nightly builds] [https://sourceforge.net/projects/aros/files/ and alternative site and nightly2] which is a test version of '''very few''' apps with both raspi-aarch64-system and raspi-aarch64-contrib can be unbz2'd to a SD or SSD as appropriate.
64bit build works well on a single core LE little endian. Multicore [https://github.com/aros-development-team/AROS/commit/1df0747c2bda3523a43029725a709b1f377d84ec may follow]. Any issues booting could be down to the SD card so please use another SD to see if it is resolved. Remember Aros Arm uses FAT32 and Aros can detect issues with this format very acutely (once fault found, FAT 0x0FFFFFF7 bad cluster so no files written after that, no repair). Please report your experiences in the [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2138&pid=15057#post_15057 Aros forum thread], [https://forums.raspberrypi.com/viewforum.php?f=179 Raspberry Pi Aros Dev and User forums], [https://forums.raspberrypi.com/viewtopic.php?p=2387984#p2387984 previous Raspberry Pi forum thread]. Any bugs or issues can be [https://github.com/aros-development-team/AROS/issues described here to fix]
*Pi500+ untested usb3 booting or nvme ssd
*Pi500 untested usb3 booting
*Pi5 untested usb3 booting
*Pi400 boots with '''USB3''' port based sata3 ssd
*Pi4 untested (may need eeprom update from PiOS or Pi SD Imager)
*Pi 3 B+ is pre-configured for USB sata3 boot - untested
*Pi 3 B may need [https://www.youtube.com/watch?v=ubnwvxF3Klc PiOS to set OTP to boot from usb - do so at your own risk] - if OTP set to usb, boot works but slower than SD card
Speed write wise (top faster)
<pre>
*NVME Pi5 untested >1000MB/sec or faster if matched correctly
*Sata3 ssd 500MB/sec
*SD V90 90MB/sec 4K maybe 8K
*SD V60 60MB/sec 1080p
*SD U3 V30 30MB/sec 720p
*SD C10 U1 V10 A1 A2 10MB/sec minimum should be used now
*SD C06 6MB/sec
*SD C04 4MB/sec
</pre>
As a homage to the past, Aros shows a reduced number of icons but this can be changed by left mouse click in the window and then right click down to Window -> View -> All files
Windows can be manipulated by the top (moving) and the bottom right corner (resizing) only.
Zune like MUI gui interface, has a unique quirk in that after changing a setting in a text box, you may sometimes need to press Enter/Return before clicking OK, Save, etc
Double left mouse click on most picture (Developer/Debug/Tests/Datatypes), audio and video files are supported, via datatypes, by the multiview application.
Esc escape key usually closes open windows even the desktop
In Prefs/Appearance some decorative theming elements need work. There is a few Mason icons in /Prefs/Presets/Icons/Mason/ and the ever present default Gorilla - Icon exchange in works
For more intensive graphics applications, you may need to edit config.txt in the root folder and change 128M to 256M to adjust more memory to graphics usage
If your cursor should '''appear''' to vanish, fear not it is still there. Please head to the top of the screen i.e. the title bar, hold down the left click mouse and drag the screen down a little and the cursor will appear again. Then you can drag the screen up again.
Like most amiga like OSs the audio and networking need to be setup manually
Audio AHI prefs - Mode settings tab - needs both Music unit and Unit 0 set to RPiHDMI:16 bit stereo++ or RPiPWM:16 bit stereo++ at 44100Hz. Press '''Save or Use''' button after each choice
For wireless, please use the Wifi prefs and already selected device bwfm.device. Press Scan and double right click on the router and enter password. You may need to setup after every power off
*if asking for password again - press cancel and go to Network Prefs, Wireless Networks tab and highlight the router line and hit the remove button and press the cancel button. Retry with Wifi prefs again
*...waiting for an address - Disconnect and try Connect
Until, Connected to <router> - 192.168.x.x
For lan ethernet port, please use Network prefs and the following hardware is
*lan9514 Pi3b Pi2 not supported at the moment
*lan7515 Pi3b+ type into Device usblan78xx.device as net0: remove other device(s)
*bcmgenet Pi4 Pi400 choose for Device bcmgenet.device
*cdnsgem Pi5 Pi500 Pi500+ RP1 i/o for cadencegem
(network prefs may forget random information when rebooted)
Summary
<pre>
*3b ethernet not supported, usb ethernet not working but wifi prefs setup works
*3b+ wifi working and ethernet works
*4 untested
*400 wifi and ethernet untested
*5 wifi and ethernet untested
*500 wifi and ethernet untested
*500+ wifi works
</pre>
Type in 'aarch64' in the [https://archives.arosworld.org/index.php?function=search&tool=simple search box] and you will see available software packages / apps. apkg can be used to inspect and install applications.
[http://archives.arosworld.org/index.php?function=browse&cat=network/browser amelinium web browser (JS 1.6 ES9 ECMASCript 2018)] is available with an [https://eab.abime.net/showthread.php?t=122494&page=80 eab thread] reminiscent of [https://github.com/zapek/Voyager Voyager] and to a lesser extent [https://github.com/amigazen/aweb3/ Aweb JavaScript 1.5 (ECMAScript 3)] as css and javascript websites can be slow to load or resolve (no JIT) and nothing from facebook, reddit etc.
Press Cancel at screenmode selector or -wb argument to get windowed version. You could use the Shift + Del shortcut or mouse wheel should work to delete all text at once. Html5test gives 189 (1.29), 300 (1.31), 301 (1.39) out of 555, some bigger Amiga like browsers are around 370+ but it does less better.
You may have to delete the cache (Menu -> Page -> Delete cache) to fully retest big Amelinium updates or free up space.
Be aware [https://pianetaamiga.it/en/reportage-pianeta-amiga-2026/ some site pages] can use up hundreds of MBs of cache very quickly
DNS lookup failed... close browser and reboot and setup wifi again - repeat until it works again
youtube video and audio - js button for javascript must be on/shaded - Settings -> Soundoutput - AHI
Any restriction to lower resolutions is due to [https://docs.invidious.io/faq/#q-where-are-the-360p480p1080p-quality-options bandwidth]. Either CPU/GPU, internet speed and/or video quality. Pi3 can expect 480p (wifi) to 720p (ethernet). Pi4 expect (wifi) (ethernet).
Telegram https://t.me/s/channel_name for public messages from vamped_amiga chatamigagames demoscenecracktros
*art local js apps like dpaint.js
There is normally no Bluetooth support for most amiga like OSs but Aros has one [https://github.com/aros-development-team/AROS/commit/6942cbfbf66426d21963a7fcd8aba6aff611a9e0 work in progress] [https://github.com/RPi-Distro/bluez-firmware/tree/pios/trixie/debian/firmware/broadcom firmware]
*Bluetooth 4.1 BCM43430A1.hcd Pi3B, Pi3A, Zero 2W
*Bluetooth 4.2 BCM4345C0.hcd Pi3B+, Pi4
*Bluetooth 5.0 BCM4345C5.hcd Pi4B rev, CM4 and maybe Pi5 and CM5
<pre>
*bthid keyboard mouse support
*btserial serial
*btpan short range wireless connecting devices
</pre>
Only the Pi5 has a RTC real time clock, the other Pis will need to use ntp services [https://github.com/aros-development-team/AROS/commit/29cd4116330dc7f692d90757eacc59fb3f31ae70 sntp] with time.cloudflare.com pool.ntp.org or Cloudflare 162.159.200.1, 162.159.200.123, 2606:4700:f1::1, 2606:4700:f1::123 or [https://github.com/bohunamiga/PiNTP PiNTP -s goodtime.ijs.si or ntp1.ptb.de] to get the date and time from the internet. Can use date in a shell e.g. date 24-Dec-2026 23:59:59 but this will need to be done again after every reset/power off. Maybe [https://github.com/aros-development-team/AROS/commit/28674a157bc56175aa668e7b62dca6fa740578dc ds3231 rtc with dtoverlay=i2c-rtc,ds3231 in config.txt]
It helps to have all usb devices already plugged in before power on to detect at the moment. Even then some usb devices will freeze the mouse cursor and the only resolution is to remove the offending usb device and reinsert. Sometimes, the reinsert leads to the mouse cursor vanishing, it is still there and responds to left mouse clicks, top of the screen and pull down the screen.
USB classes support from Prefs/Trident is still work in process
*usbaudio working on usb3 port (blue) on pi4, 400 but not working (no rt isochronous) on usb2otg (white or black) for pi3b, zero 2w
*[https://aminet.net/package/mus/midi/camd camdusbmidi] detects midi devices without a preferences file (Prefs/Env-Archive/sys/midi.prefs) as [https://www.youtube.com/watch?v=RBxHkwy4Nrw auto setup now] possibly with [https://github.com/metaneutrons/mt32-pi metaneutrons mt32-pi] [https://github.com/rtzor/mt32-pi mt32-pi fork] [https://github.com/ahmadexp/mt32-pi fork] [https://github.com/gmcn42/mt32-pi-control control of] [https://github.com/dwhinham/mt32-pi mt32-pi pi3+]. Alternative of [https://homspace.nl/samplerbox/ SamplerBox].
Will need developer clang gcc tools to look at 64bit ports of [https://archives.arosworld.org/?function=showfile&file=driver/audio/usbmidi.i386-aros.lha usbmidi], [https://aminet.net/package/mus/midi/CAMD_Toolkit CAMD_Toolkit], [https://aminet.net/package/mus/midi/camdtools camdtools], [https://github.com/cnvogelg/amiditools amiditools], [https://github.com/timoinutilis/midi-sequencer-amigaos horny src], [https://aminet.net/package/mus/midi/horny-base horny-base], [http://bnp.hansfaust.de/index.html BnP], [https://arosarchives.os4depot.net/?function=showfile&file=audio/misc/timidity.lha timidity],
Regarding 680x0 emulation, there are several options (not implemented yet) that could be considered
*[https://github.com/aros-development-team/AROS/blob/6722a0ae9e03fe5d26e32703360bd2059e0864cc/rom/m68kemu/README.md?plain=1#L424 m68kemu.library] for some Amiga productivity where the cpu is emulated and the system calls are redirected to Aros ones
*[https://github.com/BlitterStudio/amiberry amiberry] (winuae) for everything else like games
*[https://github.com/jonx/AROS/tree/aarch64-darwin-graft/arch/all-darwin/libs/emu68k emu68k]
*[https://scriptedamigaemulator.net/ Scripted Amiga] with [https://github.com/naTmeg/ScriptedAmigaEmulator ScriptedAmigaEmulator] or older [https://github.com/gbraad-amiga/ScriptedAmigaEmulator2 ScriptedAmigaEmulator2]
Hopefully getting Pi3 up to 25Mhz 68040 (non JIT) and 50Mhz 68040 (JIT)
Pi4 maybe getting up to 50Mhz 68040 (no JIT) and 100Mhz 68040 (JIT)
[https://pinout.xyz/ GPIO 40 pins] [https://learn.sparkfun.com/tutorials/raspberry-gpio/gpio-pinout pinout]
Some exceptions:
*Physical pins 27, 28 (GPIO0, 1) are an internal I2C bus and should not be used
*The other I2C on pins 3, 5 (GPIO 2, 3) can be used generally, but be aware they have permanent pull-up resistors to 3.3V
*For MIDI use USB but there are dedicated UART pins 8, 10 (GPIO 14, 15).
With a HAT it's more awkward -- you need to know which pins are used by the HAT and avoid them. Hopefully this will be documented.
Remember all GPIOs are 3.3V (not 5V tolerant), floating/noisy inputs can cause odd behavior, and that shorting the power supplies can cause instant death of the Pi.
In the shell (Cntrl + C to end)
GPIO PIN/A/N,SET/N,GET/S,MODE/K,PULL/K
Controls and queries hardware GPIO pins via gpio.resource which is stored in the rom or Devs/ '''please test'''
*PIN -- (Required) Target GPIO pin number (e.g. 12).
*SET -- Set pin output value to 0 (LOW) or 1 (HIGH).
*GET -- Read and print current digital input level (0 or 1).
*MODE -- Configure pin mode: IN (Input), OUT (Output), ALT (Alternate).
*PULL -- Configure pull resistor: NONE, UP, DOWN.
EXAMPLES
<pre>
GPIO 12 MODE OUT
GPIO 12 SET 1
GPIO 12 GET
GPIO 13 PULL UP
</pre>
[https://gpiozero.readthedocs.io/en/stable/installing.html Current] [https://gpiozero.readthedocs.io/en/v1.2.0/api_boards.html old support for gpiozero is unknown at present] [https://energenie4u.co.uk/res/pdfs/ENER314%20UM.pdf and associated 433MHz equipment] [ USA X10 security and lights via USB] [ OpenHab with Shelly Smart Plug connected over Wi-Fi, controlled by MQTT or HTTP]
Printing only with Postscript but [https://github.com/bohunamiga/MintPRINT one] of [https://github.com/boingball/MintPRINT two] [https://github.com/Andiweli/AmiAirPrint/tree/main AirPrint] IPP has been attempted with [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2061&pid=13954#post_13954 discussion]
Youtube
[], [], [https://www.youtube.com/watch?v=X4fmWAIv7FE Aros native on Pi3b],
[], [], [https://www.youtube.com/watch?v=TSxlYb1eQWU Installed on Pi3b+],
[], [], [https://www.youtube.com/watch?v=NFF1H3jCoz8 testing Aros native on Pi400],
[], [], [https://www.youtube.com/watch?v=nIVx7mh1E1Q&pp=ygUHYXJvcyBwadIHCQkTDAGHKiGM7w%3D%3D Aros on Thumb 2 based 32bit-ish ARM STM32H743 board],
[https://www.youtube.com/watch?v=zQM4CD64xDE&t=612s&pp=ugUEEgJlbg%3D%3D Performance under Linux] but on Aros...
{| class="wikitable sortable" width="90%"
! width="10%" |Pi
! width="10%" |Single Core 2D
! width="10%" |Single Core 3D
! width="10%" |Single Core 3D
! width="10%" |SMP 2D
! width="10%" |SMP 3D
! width="10%" |SMP 3D
! width="35%" |Comments
|-
| <!--Pi-->Pi3
| <!--Single Core 2D-->
| <!--Single Core 3D-->
| <!--Single Core 3D-->
| <!--SMP 2D-->
| <!--SMP 3D-->
| <!--SMP 3D-->
| <!--Comments-->
|-
|}
==== 32bit ====
For the Pi1 Pi2 Pi2B the status of AROS native ARMv6 for 32bit RasPi was OK. System booting, USB working (although with some issues but plans to fix them). 32bit native [http://www.aros.org/nightly1.html ARMv6 32bit nightlys] raspi-armhf-system raspi-armhf-contrib unbz2'd to fat32 microSD
===Hosted===
AArch64 CPU backend for AROS, a Cocoa/Metal display, clipboard / host-volume / CoreAudio / BSD-sockets bridges, GPU 2D via gpufx.library, a 68k→AArch64 JIT (run68k), and a full Rust std port. On [https://www.jkn.me/blog/macaros-aros-on-apple-silicon/ latest Apple Silicon] [https://github.com/jonx/Macaros early buggy alpha version of hosted Aros .dmg on MacOS12+]. Please use [https://github.com/jonx/Macaros/issues MACAros github] for issues, features etc and possibly [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2030&pid=13910#post_13910 here]
[http://www.aros.org/snapshots1.html old linux and android hosted 32bit]
==== Hosted ====
=====64bit=====
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80&pid=13667#post_13667 Ubuntu Linux PC hosted Pi compiler build]
[https://github.com/BlitterStudio/aros-compiler-docker Docker based cross compiler for various Aros systems],
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80 From the Aros Raspberry pi 3 64bit thread]
Instructions on building 64-bit Raspberry Pi AROS and cross-compiler from sources.
You will need:
- Ubuntu 24.04 or 26.04
- qemu-system-aarch64 installed
- Internet connection
- rpi-scripts.tar.gz downloaded (https://axrt.org/download/aros/rpi/rpi-scripts.tar.gz)
1) Install prerequisites:
sudo apt install git gcc g++ make gawk bison flex bzip2 netpbm autoconf automake libc6-dev liblzo2-dev libpng-dev gcc-multilib byacc python3-mako cmake yasm curl nasm
2) Clone sources
cd <project-directory>
git clone https://github.com/aros-development-team/AROS.git --recurse-submodules
3) Extract rpi-scripts.tar.gz. Copy all files into your project directory so that you have:
AROS (the directory with cloned sources)
fix-dotdot.py
rebuild.sh
recreate-sdcard.sh
run-qemu.sh
update-sdcard.sh
4) Run ./rebuild.sh. Select option 1) toolchain-core-aarch64
This will execute process of building a cross-compiler. During this process packages will be downloaded from Internet. This process can take up to 2 hours. If there are some missing dependencies, install them with 'sudo apt install' and restart this step.
5) Run ./rebuild.sh again. Select option 2) core-raspi-aarch64
This will build system files for 64-bit Raspberry Pi AROS. This process can take around an hour.
6) Run ./recreate-sdcard.sh
This will create an sdcard.img file with contents of previous step.
7) Run ./run-qemu.sh
This will start QEMU with SD card image and ROM images. It will boot into AROS.
=====32bit=====
Ubuntu VM approach to compiling [http://lallafa.de/blog/2013/06/building-aros-hosted-for-raspbian/ Linux hosted AROS June 04, 2013]
../AROS/configure --target=linux-armhf --enable-includes=/usr/arm-linux-gnueabihf/include --x-includes=/usr/arm-linux-gnueabihf/include --x-libraries=/usr/arm-linux-gnueabihf/lib
arm-elf- is symbol-linked to arm-linux-gnueabi- (arm-linux-gnueabi- is more correct in this case, because it's going to be compiling the ARM AROSBootstrap for ARM Linux)
*armel - many of the "android" machines require since the entire OS is made for soft float VFP.
*armfp - Efika MX target, Raspberry PI, EfikaMX, Pandora and virtually everything (VFP)
Keep in mind it's possible to start hardfp AROS hosted on softfp system, though, as long as no calls between AROS and host require floating point parameters. NOTE: hardfloat objects *cannot* be linked with softfloat objects - they have a different ABI.
Just keep in mind the arm nightly build machine is quite complex beast. It needs the x86_64 host compiler to compile AROS tools. The arm version is built every night using gcc-4.6.2 crosscompiler (built together with AROS) and successfully builds armel and armhf linux hosted targets.
*needs an AROS code compiler for ARM target
*as well as unix compiler for ARM linux host (would be best to have both softfp and armhf, we have softfp only now) with full set of libraries and includes.
with—disable-crosstools $AROS_CC is always a wrapper around $KERNEL_CC ? If so, this is wrong for some ports. This can break Darwin, Windows and Android port.
Yes, Android port will build. And even work. But it's not good because the port will not be ABI-compatible with other ARM ports. Android's ABI is different from GNUEABI. For example:
<pre>
enum test {foo, bar};
enum test testvar;
</pre>
sizeof(testvar) will be equal to sizeof(int) in GNUEABI (Linux and AROS) and sizeof(short) on Android. This affects linking objects from static linklibs, for example.
Previously everything worked because $AROS_CC was a wrapper on top of $HOST_CC. And a real crosscompiler was used on non-ELF hosts.
Android is the same. $KERNEL_CC is incompatible with AROS.
compiler=kernel is appropriate _ONLY FOR CODE WHICH RUNS ON HOST OS_ (or barebone hardware, if we talk about native). This includes bootstraps, their linklibs, and host-side dynamic libraries (Windows makes extensive use of them because of architectural considerations.
No single AROS object should be compiled with this setting. $KERNEL_CC is really compatible with AROS *ONLY IN LINUX-HOSTED* and no more. On other systems (Darwin, Windows, Android) this is not true any more, and compiler=kernel is never going to work.
If you want to compile your AROS module against host OS includes, append the following to USER_INCLUDES (or USER_CFLAGS, this is effectively the same):
-isystem $(GENINCDIR) $(KERNEL_INCLUDES)
$(KERNEL_INCLUDES) expands to:
-isystem <your_os_includes> -isystem <host_OS_gcc_private_includes>
-nostdinc
This makes AROS compiler adhering to host OS APIs.
If you want some preprocessor symbols based on what your host OS actually is, add something like -DHOST_OS_$(AROS_HOST_ARCH).
Why is there $(GENINCDIR) at all? Because host OS has its own libc includes, which would conflict with AROS ones. And the host OS libc is not binary-compatible with AROS one.
Why doesn't Windows-hosted port use $(KERNEL_INCLUDES) ? Because WinAPI includes conflict with AROS ones in fundamental typedefs, like WORD, BYTE and BOOL. It's almost impossible to deal with this in any other way than rewriting WinAPI definitions using AROS types.
Building under centos 6.3 (i386) currently, and AROS creates the toolchain itself. haven't yet committed the necessary changes but "./configure --target=raspi-armhf" is enough to start, then "make arosboot-raspi" will generate arosraspi.img (containing the bootstrap, kernel.resource, and exec.library) as well as arosraspi.rom (containing all the other essentials components such as dos, graphics etc). It will also copy over a config.txt file to make the raspi bootstrap code load the correct kernel, and a cmdline.txt that enables exec debug output.
*armel = typically Debian 6, Ubuntu Maverick, Android,
*armhf = typically Debian 7, Debian 8, Ubuntu Precise,
Cross-compiling Ubuntu ARM softfp
<pre>
sudo sh
echo 'foreign-architecture armel' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armel] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armel.list
apt-get update
apt-get install gcc-arm-linux-gnueabi libx11-dev:armel libsdl-dev:armel
</pre>
<pre>
./configure --target=linux-arm --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabi/include
</pre>
Cross-compiling Ubuntu ARM hard-float
<pre>
sudo sh
echo 'foreign-architecture armhf' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armhf] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armhf.list
apt-get update
apt-get install gcc-arm-linux-gnueabihf libx11-dev:armhf libsdl-dev:armhf
</pre>
<pre>
./configure --target=linux-armhf --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabihf/include
</pre>
Now, the AROS build is configured properly and all you need to do is:
make
==Build==
===64bit===
[https://github.com/aros-development-team/AROS/blob/7016ce28bfdb754182edb16011c98faaf5413c29/arch/aarch64-raspi/boot/mmakefile.src#L180 boot makefile]
===32bit===
# download/checkout the source someplace, e.g. /build/AROS-Src/
# make a directory to store external sources AROS downloads, e.g. /build/Ports
# make a build directory, e.g. /build/aros-raspi-armhf
# cd into the build dir, configure, and then run make -:
<pre>
>cd /build/aros-raspi-armhf
>/build/AROS-Src/configure --target=raspberrypi-armhf --with-serial-debug --enable-ccache --with-portssources=/build/Ports
>make
>make arosboot-raspi
</pre>
then copy the files from /build/aros-raspi-armhf/bin/raspi-armhf/AROS/ onto an sdcard, and download/copy the Raspi firmware files onto it.
You should then be able to boot the sdcard on your RasPi.
The current W.I.P tree to svn. it can be built as follows ..
<pre>
./configure --target=raspi-armhf
make arosboot-raspi
</pre>
That will generate arosraspi.img, arosraspi.rom and config.txt in bin/raspi-arm/AROS - so either copy just those files to a fat formatted SD card (with the firmware files on), or copy the whole contents of the AROS folder.
NB - if you have a Linux/other install, backup the existing config.txt first
arosraspi.img contains the bootstrap (which has very basic mailbox code, framebuffer/gpio init, and console "emulation" via code pinched from our libbootconsole), kernel.resource, and exec.library
arosraspi.rom contains all the other components needed to boot AROS.
The config.txt file will tell the RasPI bootstrap to load the arosraspi kernel and ramdisk (rom).
the bootstrap has minimal mailbox code, planning on adding either a resource or library that driver/app code will use to access it (likewise for GPIO)
Help building AROS hosted on Linux ARM
Was looking a way to use more my Handheld ARM based called Pyra (Dragonbox Pyra) an ARM (Omap5 cpu with 4GB ram) linux based machine (Debian Buster v10 with kernel 5.6.19 adapted) and have a try to compile the latest Aros sources by Deadwood directly on this device.
Compilation stops after build libpopupmenu.a and trying to build libatomic have this error:
<pre>
Configuring build in bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
configure: WARNING: unrecognized options: --disable-nls, --without-x
checking for --enable-version-specific-runtime-libs... no
checking for --enable-generated-files-in-srcdir... no
checking build system type... arm-unknown-linux-gnu
checking host system type... arm-unknown-aros
checking target system type... arm-unknown-aros
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for arm-aros-strip... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-strip
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for arm-aros-gcc... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-gcc
checking whether the C compiler works... no
configure: error: in /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic':
configure: error: C compiler cannot create executables
See config.log' for more details
make[2]: *** [mmakefile:4489: /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic/.configured] Error 77
[MMAKE] make --no-print-directory TOP=/media/farox/pyra2/arosbuilds/toolchain-core-armhf-build SRCDIR=/media/farox/pyra2/arosbuilds/AROS CURDIR=tools/crosstools/gnu TARGET=tools-crosstools-gcc-libatomic-configure -s --file=mmakefile tools-crosstools-gcc-libatomic-configure failed: 512
[MMAKE] Error: Error while running make in tools/crosstools/gnu: No such file or directory
make[1]: *** [Makefile:361: linklibs-libatomic] Error 10
make: *** [Makefile:183: crosstools] Error 2
</pre>
looking at config.log on arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
found that arosbuilds/toolchain-core-armhf/arm-aros-ld: cannot find -laeabi
so do make linklibs-aeabi-arm-quick
and the missing lib was built.
now the next stop is at
fatal error: bits/libc-header-start.h: No such file or directory
and
fatal error: sys/cdefs.h: No such file or directory
in many places so after checking that have this missing include files i have noted that my include path is a bit different, standard searching path is /usr/arm-linux-gnueabihf but in my system is /usr/include/arm-linux-gnueabihf
so if i add my path to some mmakefiles compilation goes on....but is a better way to add this path to avoid every mmakefiles to be changed?
fixed with adding
-I/usr/include/arm-linux-gnueabihf
to where is missing on mmakefiles like
USER_INCLUDES := -isystem $(GENINCDIR) -I/usr/include/arm-linux-gnueabihf $(KERNEL_INCLUDES)
P.s. I have changed many mmakefiles and have at least compiled (after many hours) the toolchain doing make every time in arosbuilds/toolchain-core-armhf-build (also have to disable making tests under cplusplus but don't remember the directory ...) but ask an help to have an automated way to correctly build without modify mmakefiles.
Last time built armhf target was around 2 years ago. At that point built is via cross-compilation from linux (ubuntu 22.04) using linux armhf crosscompiler (this can explain the path differences you are experiencing) as well as using AROS gcc cross-compiler in version 6.5.0 (build with option 21) in rebuild.sh). Since then AROS GCC has been updated to 10.5.0 and don't believe anyone tried to build the armhf target again.
My suggestion would be to downgrade GCC to 6.5.0 (via editing AROS/config/gcc_def file) and try to first build using cross-compilation from x86_64 linux. Once that works, you will have a "template" to compare to native compilation under arm linux.
Thanks for your suggestion...but think the toolchain with GCC 10.5.0 is compilable if i found a way to pass the path of my system to the script that build (option 21 on rebuild).
The other only changes are (but don't know where to modify...) is to add the build of libaeabi and disable the building of some tests under cplusplus that use exceptions and is not supported under ARM. try to crosscompile with my Linux amd64 PC.
For paths look into core-linux-armhf/bin/linux-armhf/gen/config/target.cfg. A number of build-wide variable is set there containing paths to local build system. These variables and the target.cfg file are generated by AROS ./configure script.
Thanks compilation now go forward...changed target.cfg under "toolchain-core-armhf-build/bin/linux-arm/gen/config" and do make on "toolchain-core-armhf-build" dir.
Need to find where to enable build libaeabi.a so can build the entire toolchain with option 21 of rebuild.sh
Found something that looks like libeabi in AROS/arm-all/arm-aeabi/mmakefile.src. Try adding a third line there:
#MM- linklibs-armhd : libklibs-aeabi-arm
Don't remember needing this library. Possibly the 6.5.0 GCC somehow does this while 10.5.0 is missing this.
Try adding this line (and the variant "linklibs-armhf" instead of hd) but it did not solve the automatic building of the missing lib. I must do "linklibs-aeabi-arm-quick".
Anyway after have build the aeabi lib i succefully built the toolchain (after many hours...). Smile
To test I restarted from selecting option 21 (on rebuild.sh) but after many hours i get the same error of the kernel includes not found...maybe i need to modify the configure script for my case.
With the toolchain built i try to build the core-linux-armhf (DEBUG) (option 22) but after a while it stopped with
"cannot find -laeabi " so i made it built manually...and now i can continue compiling...i'll let you know if all goes ok.
== Hardware ==
===64bit===
====BCM2712====
With the Pi5
Broadcom VideoCore 7 vc7 is an integrated GPU with 12 cores and up to 800 MHz clock. VideoCore VII is capable of OpenGL ES 3.1 and Vulkan 1.2. The driver support for the Raspberry Pi continues to build upon the [https://lore.kernel.org/dri-devel/20230928114532.167854-1-itoral@igalia.com/ open-source V3D driver] stack within [https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25450 Mesa] hopefully be merged for Mesa 23.3. x265 HEVC accelerated untested, x264/h.264 and VP9 cpu only.
*Raspberry Pi M.2 HAT+ Expansion Board
*Geekworm X1001 PCIe to M.2 Key-M NVMe
*Geekworm X1003 PCIe to M.2 HAT NVMe SSD PIP Board for Raspberry Pi 5
*Pineboards Pi Hut HatDrive! M.2 HAT 2024/V4
*Hat+ Gen2 Gen3 Nvme
*GeeekPi 52Pi N04 for Raspberry Pi 5 NVME M.2
*
*2024 RPI AI HAT - Hailo 20TOPs no LLMs
*2026 RPI AI HAT+ 2 - Hailo 40TOPs slightly better?
[https://www.raspberrypi.com/documentation/accessories/camera.html Cameras for Pi]
*Raspberry Pi camera module, the V3 with Sony IMX708 back-illuminated CMOS 12 Megapixel sensor
*Raspberry Pi Camera Module V2 – 8MP Sony IMX219 Sensor
*Raspberry Pi camera Rev 1.3, 5MP 1080P OV5647 image/video module, 2592 x 1944 pixels
====BCM2711====
With the Pi4 an ARM a72 cpu is about x3 times the size of an a53 in the Pi3
the 2711b line used more power when idle, compared to the 2711c
*2018 Raspberry Pi PoE HAT Power Over Ethernet Hat - design issues
*2020 Raspberry Pi PoE+ HAT Power Over Ethernet Hat Pi3b+ Pi4 only - better design
*Waveshare PoE HAT (B) with cooling fan for Raspberry Pi 3B+/4B 802.3af PoE
*[https://github.com/axizo-pi/V3DLib vc6 V3D 4.2] is derived from [https://docs.broadcom.com/doc/12358545 vc4], but it is [https://docs.mesa3d.org/drivers/v3d.html significantly different]
The QPU pipeline stays mostly the same, you still have an add ALU and a multiply ALU and it can issue two ALU OPs per cycle. There is still 4 SIMD lanes, interleaved over 4 cycles.
The instruction encoding for the QPUs is different, but the core instructions are the same.
Instructions for packed 8 bit int math has been dropped, along with most of the pack modes.
Instructions for packed 16bit float math has been added (2 floats at in a single operation)
With vc5/vc6, you write two packed 16f value to the tilebuffer (or four writes of 32f, if you are using the rgba32f framebuffer). And there is a handy vfpack operation which allows you to pack two f32s into a single 32bit value in a single instruction. You can vfpack directly into the tile buffer register.
the multiply ALU can now fadd, so you can issue two fadds per instruction. the add ALU has gained a bunch of new instructions
the A and B register files have been merged. You still only get an A read and a B read per instruction, but they read from one big register file (which means the underlying memory block has gone from two sets of "one read port, one write port" to one "two read ports, one write port" block)
The theoretical max FLOPs per QPU remains the same at two per cycle, other than the bump from 400mhz to 500mhx but it looks like a lot of effort has been put putting those theoretical FLOPs to better use.
*vc4 could run one or two threads per QPU. When you ran in two thread mode, the available register file halfed to 32 registers.
*vc5 added a four thread per QPU mode, with 16 registers per thread.
*vc6 doubled the size of the register file. You could now use all 64 threads in two thread mode and 32 registers in for thread mode. Single thread mode was removed, you always have at least two threads.
With the threading improvements, the QPUs should spent much less time idle waiting NOPs for memory requests. Most of the design changes have gone to improving the fixed function hardware around the QPUs. A fixed function blend unit has been added, which should reduce load on the QPUs when doing alpha blending. hope software blending is still possible
The tile buffer can now store upto 4 render targets (up to 128bits per pixel, so if you are using 4 32bit render targets, you can't have a depth buffer)
A MMU, allowing a much simpler/faster kernel driver.
Many more texture formats, framebuffer formats.
h264/x264 as Pi3
All the features needed for opengl es 3.0
H.265 / HEVC decoder is a HEVCv2 Main 4:4:4 10 design supporting bitstreams up to profile 5.1
HEVC hardware decode supports 4kp60, 10-bit. Audio output is pretty much unchanged, but the HDMI audio channels now support 8x192kHz bitrates
Each ALU typically have 2 floating point operators, and as you pointed out in a earlier post videocore 6 is no exception, with both a multiply and additive floating point operator. Thus theoretical GFLOPs are calculated with both operators in mind. That is what the 2 in my formula represents, and is common across any modern programmable shader, whether you calculate Nvidia, AMD, Intel, Boardcom or any other company's GPUs. Total ALUs * 2 * GHz clock = GFLOPs, In the case of Raspberry Pi 3, it's 24 ALUs * 2 operators * 0.4GHz = 19.2GFLOPs
If the Videocore 6 does indeed only have 16 ALUs (16 * 2 * 0.5GHz), you'd have only 16GFLOPs but they are better utilised
Possible maximum performance
<pre>
VideoCore IV @ 250MHz: 250 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 24 Gflop/s
VideoCore IV @ 300MHz: 300 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 28.8 Gflop/s
VideoCore VI @ 500MHz: 500 [MHz] x 2 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 32 Gflop/s
</pre>
Faster LPDDR4 memory.
====BCM2837====
With the Pi3
* Broadcom BCM43438 chip provides 2.4 GHz 802.11n wireless LAN, Bluetooth Low Energy, and Bluetooth 4.1 Classic radio support, 3B+ [https://github.com/aros-development-team/AROS/commit/afa5bc0bb17d5dd06bcfdbac00853a3799ca8d76 LAN7515]
The overclock ability has diminished with each chip version as the energy usage has increased. BCM2837 is one of the warmest yet and benefits from active fan cooling if all four cpu cores are in use for a short while. Video playback maybe affected due to the lack of custom support in the GPU with Aros. 5 V / 2.4 or 2.5 amp power supply recommended if all four cpu cores are running, else throttling (cpu slowdown) might occur.
[https://github.com/hermanhermitage/videocoreiv/wiki/VideoCore-IV-Programmers-Manual Dual VDP] and scalable QPU in [https://docs.mesa3d.org/drivers/vc4.html VC4] and x.264/h.264 accelerated untested only and VP9 on cpu or neon help
ARMv8-A has [https://developer.arm.com/documentation/102412/0100/Privilege-and-Exception-levels privilege levels] where userspace typically runs at ‘EL0’, the kernel at ‘EL1’ or ‘EL2’ and the firmware at the highest level ‘EL3’.
===32bit===
=== Core Kernel ===
====BCM2708(family)====
which includes the [http://elinux.org/RPi_Hardware BCM2835] (ARM1176JZF-S 700 MHz CPU + VideoCore IV GPU + up to 1GB RAM)
*Framebuffer (fb) using mailbox
*IRQ scheduler, etc
*Arasan based SD Card controller
*Synopsis DesignWare USB 2.0 OTG controller [http://networkdirection.net/index.php?option=com_content&view=article&id=106:rasperry-pi-usb-controller&catid=45:raspberry-pi&Itemid=54 Unofficial DOCS pdf], [dwc_otg.c FreeBSD], [], [https://www.riscosopen.org/viewer/view/mixed/RiscOS/Sources/HWSupport/USB/Controllers/DWCDriver/ RiscOS USB Driver], [https://www.riscosopen.org/forum/forums/5/topics/878 RiscOS USB Discussion], [https://www.riscosopen.org/forum/forums/11/topics/1893 Other USB RiscOS], [http://plan9.bell-labs.com/plan9/index.html Plan9 Miller's usb] http://plan9.bell-labs.com/sources/contrib/miller/, [https://github.com/Chadderz121/csud CSUD driver],
*[http://www.smsc.com/media/Downloads_Public/Data_Sheets/9512.pdf SMSC 9512] USB LAN/Hub chip
*CMOS RAM
*VCHIQ port which sends messages to the GPU e.g. for mouse, keyboard, audio on HDMI, etc
*Audio Driver
*Serial Peripheral Interface Bus (SPI)
*[http://www.susa.net/wordpress/2012/06/raspberry-pi-pcf8563-real-time-clock-rtc/ I2C registers]
*I2S
*Universal Asynchronous Receiver Transmitter (UART)
*[http://elinux.org/RPi_BCM2835_GPIOs GPIOs] and [http://www.adafruit.com/blog/2012/08/17/broadcom-bcm2835-peripheral-memory-map-and-gpio-alternate-use-chart-piday-raspberrypi-raspberry_pi/ Alternative view of GPIO]
BCM2836
* For Pi B+, PI 2 and Pi 3 SMSC LAN9514 chip adding 10/100 Ethernet connectivity and four USB channels to the board
*[http://www.andrewscheller.co.uk/rpi_pcb_modules.html PCB], [http://elinux.org/RPi_Low-level_peripherals Low level features],
Implemented so far...
# Modify the configure system so that it correctly builds for the arm hardware float raspi target.
# Implemented the bootstrap to load the aros modules and prepare the arm to jump into them. Reworked the x86 console support so that parts can be stolen for raspi to use since t has no basic functionality to output to the display.
# Implemented a kernel.resource to prepare the raspi for running aros and provide the low level api calls to expose available resources and allow exec, etc function.
# Implemented serial debug support
# Implemented the exec (and kernel) functionality required to make multitasking work (and interrupts, exceptions, syscalls, etc)
# Implemented a timer.device to utilise the hardware timers.
# Implemented a very basic gfx driver to expose the hardware's framebuffer.
# Implemented an SD-Card driver for AROS which presently only supports the raspi's chipset but can easily be modified to support all sd-card hardware and media.
# Fixed the fat filesystem support in AROS so that it can boot on RasPi's normal SD-Card setup. The "rom" image files needed use a different filename than the default linux, etc images so can be easily installed without harming the existing files - you only need to change the loaded images in the config file to get aros to boot.
# Updated the build scripts to automatically download the necessary raspi firmware files and wrap it all up so that you can simply extract the archive to a fat formatted sdcard and boot it on the raspi without having to get anything else.
# fix everything in contrib and ports to build for raspi (needs proper testing/fixes but allows every component to actually compile at least, including owb) + numerous other fixes to get things working on arm/raspi ..
Improvements...
# Implement a USB chipset driver "OR" finish the existing one [https://github.com/aros-development-team/AROS/commit/c07d13c724f944674be5db54fc6a71ee72a01809 usb otg] - the current code is mostly a skeleton that should initialise the chipset and then needs relevant code to support the different transfer types. It also has the "virtual" hub code in place to represent the raspi's USB port (from poseidons p.o.v)
# Implement a driver for the USB NIC (a few weeks - depends on USB above)
# Write an [https://github.com/aros-development-team/AROS/commit/d55d0f74d20b769bbb8c8d386e5c1d7a9154f05a audio driver] (a few weeks - independent of USB) and [https://github.com/aros-development-team/AROS/commit/e93a4c245f27a87c9c4c1d39206694b39059998a HDMI]
# fix syscall bug in the current raspi kernel code
# Graphics depend on having a decent "bcmdma.resource" implemented as to use the cpu's dma engine. The sd card driver needs to use it for transfers to/from the controller - and the gfx system needs to use it for "blitting".
# [https://github.com/aros-development-team/AROS/commit/4019d84e4975d4dad987a12d57fe108f5ac048e6 Improve the gfx driver], [ vc4gfx HIDD] add [http://dri.freedesktop.org/wiki/VC4/ Gallium3D support]
# [https://github.com/aros-development-team/AROS/commit/b13905b3e8e45b089f520b44692c81affddd066f Improve] the [https://github.com/aros-development-team/AROS/commit/3a876755c070f5c73c4f53c7f4d35b4f923088b9 sdcard] device driver - which is also pretty basic but should work with most cards, rework it to also support pci, etc. sd card interfaces on x86
# The current code using very rudimentary access to the gpio interface - so that should be implemented as some resource for other components to access, as-well as the i2c interface exposed over the gpio interface. that should have a hidd class implemented which uses the gpio resource to communicate.
Boot up typical for most other OSs before the open sourcing of many binary blobs from 2017 onwards
On power-up, the rpi [http://www.open.com.au/mikem/bcm2835/ BCM 2835] [https://github.com/hermanhermitage/videocoreiv VideoCore4] GPU, not the ARM CPU, is in control, and the SD card slot is the only peripheral device with power. The firmware burned into the BCM2835's VideoCoreIV GPU PROM requires a DOS-style partition table; a FAT-formatted first partition; and the freely redistributable but closed sourced Broadcom files “bootcode.bin” and “start.elf” in that partition.
The boot sequence carries out several pre-boot tasks
*On powering of the rpi, the GPU reads and executes bootcode.bin, which then loads start.elf
*The GPU loads the “start.elf” file, eventually, into the L2 cache and then executes it
*configures the memory split for the CPU and GPU
*reads and parses “config.txt” from the same partition on the SD card and applies the settings (like a PC’s BIOS settings)
*loads the “kernel.img” file, again from the same partition
*activates the CPU to begin executing the loaded kernel image
The CPU/GPU memory split is hard-coded into start.elf, so Broadcom provides three start.elf images, to give 32M, 64M, or 128M to the GPU for multimedia performance, and the remainder to the CPU.
RPi uses [https://github.com/raspberrypi/firmware some closed source loaders] and at some point it loads a binary blob named "kernel.img" at 0x8000, at that point there would be a rudimentary Aros alive. If one wants to use the SD-card then there would have to be a driver for the interface and a fat filesystem handler (SD-card has to be formatted to fat filesystem)
Boot code and kernel are now linked together and made into that binary blob, just for starters. Raspberry Pi uses [http://kernelnomicon.org/?p=133 u-boot] and [http://kernelnomicon.org/?p=138 UBoot] as bootloader, there's already some code in the Efika MX port for that. UBoot is a native bootloader and not just for the raspberry pi, it loads after start.elf.
You can find Efika MX port from arch implementations, some hacking is needed for the mmakefile.src'es as iit dates back to before the Aros crosstool era or else you get some weird errors while building. You also need to code the bootstrap and serial handling.
At the moment it seems that a fastest route for the native build would be to make one binary blob without using the package system. Raspberry's memory layout is pretty simple and if the implemented u-boot doesn't support loading other modules
<pre>
? - alias for 'help'
mtest - simple RAM test
autoscr - run script from memory
base - print or set address offset
bbm - BBM sub-system
bdinfo - print Board Info structure
boot - boot default, i.e., run 'bootcmd'
bootd - boot default, i.e., run 'bootcmd'
bootm - boot application image from memory
bootp - boot image via network using BootP/TFTP protocol
cmp - memory compare
coninfo - print console devices and information
cp - memory copy
crc32 - checksum calculation
echo - echo args to console
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls - list files in a directory (default /)
go - start application at address 'addr'
help - print online help
iminfo - print header information for application image
itest - return true/false on integer compare
jade -
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loady - load binary file over serial line (ymodem mode)
loop - infinite loop on address range
md - memory display
mm - memory modify (auto-incrementing)
mtest - simple RAM test
mw - memory write (fill)
nfs - boot image via network using NFS protocol
nm - memory modify (constant address)
pci - list and access PCI Configuration Space
ping - send ICMP ECHO_REQUEST to network host
printenv - print environment variables
rarpboot - boot image via network using RARP/TFTP protocol
reset - Perform RESET of the CPU
run - run commands in an environment variable
saveenv - save environment variables to persistent storage
saves - save S-Record file over serial line
setenv - set environment variables
sleep - delay execution for some time
tftpboot - boot image via network using TFTP protocol
USB - USB sub-system
usbboot - boot from USB device
version - print monitor version
</pre>
And there is one more thing about modular ports. In order to actually implement this, your bootstrapping environment should provide the ability to load several files. On PC this is provided by GRUB2. on CHRP you can read filesystem via OpenFirmware, and Sam's Parthenope relies on modified u-boot. If your bootstrap allows to load only a single file, then you stuck with monolithic kickstart. By the way... u-boot allows not only to boot up a single uImage or zImage, it also allows to write client programs AFAIK. With this approach, you actually can write modular bootstrap for ARM AROS using unmodified u-boot.
Most used [http://www.compulab.co.il/workspace/mediawiki/index.php5/U-Boot_quick_reference uboot options] are fatls usb 0:1,
the reason behind INTB_KERNEL is to allow use of the standard Exec function AddIntServer() to add interrupt handlers for
hardware drivers etc. AmigaOS never used it for abstract hardware drivers. AmigaOS routed only raw hardware IRQs there. Their assignment was hardcoded. As well as number of them. Actually on AmigaOS every bus has its own interrupt subsystem. For example PCI bus. PCI interrupts on Amiga are routed to a single exec interrupt. 1:1 relationship between CPU and hardware interrupts is present only on PC.
IMHO we miss things like AddInterrupt/RemInterrupt methods on our PCI subsystem's device class. PCI bus class should map these methods to whatever is appropriate. This is how it is done on AmigaOS and friends. When these are implemented, raw kernel.resource API will be needed only for several PC-specific drivers with hardwired resources. Exec IRQs are real IRQs only on Amiga hardware. On other machines they can be emulated where appropriate (VBlank is a good example). kernel.resource is meant to be different, its IRQs are hardware-agnostic, they are plain "Hardware IRQ number X, whatever this means". They are low-level actually, and meaningful only in the context of a particular system.
Was that not the transition from irq.hidd to kernel.resource? No. A long time ago there was another hacky bit named INTB_TIMERTICK. It was "abstract timer interrupt", used by timer.device. It was the same as VBlank, but with larger frequency. I removed it, because kernel.resource API was a cleaner way to access this interrupt. Furthermore, there can be more than one timer in the system. Thinking about bringing back timer HIDD definitions again. hpet.resource is a bad idea.
Can someone please enlighten me a little on how the scheduler is meant to work?
Poseidon.library creates its "Poseidon Event Task" during RTF_COLDSTART -> then calls Wait(), and ends up in limbo because wait disables interrupts (used for the scheduler heartbeat), and basically waits forever because the sigbit is never set, since krnSwitch doesn't switch the task unless TF_SWITCH is set, and no codepath run during this seems to set it?? TF_SWITCH does not disable/enable switching. This flag just enables to run user-supplied hook when the task is being switched away. It is completely safe to call Wait() in Disable()d state. Doing this actually temporarily breaks this state. IDNestCnt gets remembered in struct Task, then next task is selected, and its IDNestCnt is restored in sysbase (see kernel_scheduler.c). If there are no other tasks, then your cpu_Dispatch() should enable interrupts on the CPU and enter idle mode. See x86 implementation for good example.
You miss what happens next...
1. KrnSwitch() saves context of your task, saves IDNestCnt (core_Switch() and cpu_Switch()), then drops into cpu_Dispatch().
2. cpu_Dispatch() calls core_Dispatch. Then two cases are possible:
2a. There is a READY task. It is picked up, its IDNestCnt is restored in SysBase, then cpu_Dispatch() needs to restore registers and exit. The next task is run.
2b. There are no READY tasks. core_Dispatch() returns NULL. In this case your cpu_Dispatch() should enter idle loop. It should just enable interrupts on the CPU and put it on halt. This allows it to process hardware interrupts. Eventually some of your interrupt handlers wakes up your task and puts it into READY list.
My heartbeat interrupt has been slowed atm to help debugging - but it never actually gets a chance to fire because of the Wait() disabling interrupts. Perhaps you have forgotten to enable interrupts in your idle loop.
There is a change in the format of AROS executables. Until now we were using Elf RELocable files which are usually used as intermediate object files. We had them for various reasons, one of them was how AROS files were built in the past. That days we had no real aros cross compiler and the option to embed relocation data in unix executables (or in executable files in general) was rather new and not every linux/unix system had it. Therefore we have decided to use intermediate files. Although it was somehow working (and it is still working :-)), it has some drawbacks. Therefore decided to introduce real Elf EXEC types, in first turn implemented on ARM target with option to expand in future to all other AROS architectures.
The first patch was pretty easy and appeared to work somehow. It generated nice executables with embedded relocation info. Not only that, it also removed all global symbols adjusting relocation data to be relative to the beginning of the sections. That move reduced number of symbols in each executable significantly (depending on the file between 20 and 80% of all symbols could be removed). The only symbols that stayed in the file are local ones - due to the nature of the patch wasn't able to remove them since we have not seen them in the symbol hash table.
The patch didn't worked though. The files were relocated, AROS kernel loaded, but it crashed very early. What happened? Well, the nature of ARM relocations happened :)
Most of the relocation data on all machines is rather simple. Relocation can be absolute or pc-relative, sometimes the offset has to be bit shifted. On ARM v7 there is another one. There, when one wants to load an address of function/variable into register a combination of two instructions can be used: movw and movt. The first one loads immediate into lower 16 bits of a register while clearing upper 16 bits. The second one loads immediate into upper 16 bits without touching lower halfword. Loading of a pointer into a register looks like this:
movw r0, #:lower16:label
movt r0, #:upper16:label
In this case there are two relocations - one for lower halfword and another for upper. If an overflow of lower 16 bits occurs during relocation process, the upper one should be updated as well. Unfortunately with current patch and with typical ARM executables there is not enough information to perform the calculations.
There are two options - the first one would be to give up and go back to "fake" executables, another one would be to change from REL to RELA relocation info. The latter contains an addend, extra data which can be used to perform all the relocation calculations I need.
Decided for the second option. The patch is already in the works. There is another function for the binutils' bfd backend to perform the final relocation. There can decide what to do with every reloc info, modify data and eventually strip some symbols. An advantage is - at this stage of the linking process have also full access to all local symbols so can change all relocations section relative and eventually strip all symbols from the files.
GPU
VCore developed by Alphamosaic Ltd and now owned by Broadcom. Most of start.elf runs on the GPU. Placing ALL the userland GPU code in the videocore.hidd isn't going to be a terribly big problem because the code they published is nothing more than a shim that sends data straight to the GPU to execute.
The good news about this is that we only need to write our HIDD using the OpenVG API. The shim is relatively small codewise and lives in the ARM memory (the actual OpenVG code itself lives in the GPU RAM area and its loaded from start.elf). That's also the bad news. Our driver has to translate AROS video calls to OpenVG calls, for most tasks it should be easy, for some, not so much. It's still probably less difficult and less work, than controlling the GPU directly.
The other good news is that anything done through OpenVG happens on the GPU, its truly accelerated. It also has some nice font functions, meaning we can lead into an accelerated text mode later.
Basically, AROS resets or locks up when it tries to use AROS_ATOMIC_INC or DEC. If I comment out the byte/word operations in the header files and use non-atomic operations, the code works as expected.
have read that the L1 cache needs to be enabled to use LDREX and co (which I also read is only meant to be used on multi processor systems with shared memory) - however I am certain this is correctly enabled.
If you are using LREX or STREX, you should have L1 cache enabled, at least on the ARM CPU I work with at work.
L1 cache is enabled by enabling the MMU *AND* setting the C and I bits in the CPU - the C bit is ignored, and the I bit only covers the 16 byte instruction pipeline if the MMU is not enabled.
Can you verify that your assembly is generating LDREX/STREX? From the behavior, it almost sounds like its generating the default Semaphore locked atomics.
Impossible. There are no semaphore-locked atomics. There are Disable()/Enable()-based ones instead. And there's a special #define AROS_NO_ATOMIC_OPERATIONS in this case, which tweaks Disable()/Enable() implementations not to recurse forever.
I have tested this on ARMv5 which does not have ldrex/strex, it works fine. On those ARMs there's no way to have real atomics. On other OSes (like Linux) this is done by introducing things like atomic_t, which appears to be a complex structure, holding the value together with accompanying spinlock (implemented using swp).
#warning "TODO: lookup optimal mmu table settings for raspi memory"
/* Set up an identity-mapping for all 4GB */
for(x = 0; x < 4096; x ++)
{
pagetable[x] = x<<20 | (0x40002|0x80000|0x010000|0x00C00|0x04);
}
Shouldn't there be a second loop that sets the 'C' bit in the descriptor for the RAM pages?
Currently, you have TEX=0, C=0, B=1 for all pages (Shared Device).
You should have TEX=0, C=1, B=0 for RAM (Write-Through, Cached)
So ..
pagetable[x] = x<<20 | 2;
should be enough?
No, for RAM you need to change the '| 0x40' to '| 0x80'
tell dosboot the correct defaults to use
Please don't do this. This bootconfig.c is a deprecated legacy thing. I wanted it to go away completely with time. Instead, display drivers should auto-install themselves during own initialization phase. I. e. detect hardware=>instantiate itself. This should make things way simpler. With this approach you only need to add the driver into KS image to get the device autobooted. No hardcoded stuff.
Currently VESA and VGA drivers do this, look there for examples. never rewrote ATI driver because i don't have any test system for it.
they defined a smaller AROSCPUContext than the ExceptionContext - yet reference it as ExceptionContext in other places, and since it hasn't allocated enough storage for ExceptionContext, are corrupting memory/the structure (since the elements that are there don't map 1 to 1 with the exception context).
AFAIK, AROS has been moving in a different direction to this in recent years. It is the job of graphics HIDDs to allocate bitmaps etc. so that they have the most suitable characteristics, including allocating them from GPU RAM where possible. The concept of chip RAM is only for legacy code, and most if not all non-68k platforms should have all system RAM
marked as chip.
BTW, is the video processing code you mention CPU code or GPU code?
Also, IIRC we have support for "external memory allocators". Perhaps that's what we need for the allocation of GPU RAM through the mailbox.
All hosted and x86 native ports should use proper context formats.
trying to clarify if the vblank handler has to have run by this point to prevent this deadlock. Actually, no. Unless you have installed VBlank handler which should wake up at some point. Without VBlank there will be no quantum count. Consequently, there will be no forced preemption. But the rest will work, and multitasking will be cooperative (switch happens only when current task voluntarily gives up the CPU). Does it depend on the vblank having run before this point? and if yes what does that mean on systems where it might be able to run enough code (e.g. get to this point) before the vblank interrupt has triggered? What is it waiting for? It could wait for timer, in this case you need timer.device working. VBlank is currently needed for exec's quantum counter. In current native ports we have only a single timer, which is served by timer.device. VBlank is simulated by timer.device also. If your machine has two timers, then you can use one of them for VBlank, and another for timer.device, this will simplify things down. VBlank needs to be 50 Hz for historical reasons, many programs use it as cheap timer. I am periodically thinking about making some abstract mechanism to be able to change quantum source (and untie it from 50 Hz), but have no time to come up with something good. Additionally i started disliking timer.device hardcoded design when PC has got many timers (old 8253, APIC, HPET).
Currently i think there should be some low-level entity representing tick source. timer.device should just select the most appropriate source for its units.
The BCM2835 has 4 GPU based timer sources - 2 are used by the GPU, so im using Timer3 for our heartbeat and the remaining one will be free to the system. There is also the less capable ARM timer but that is dependent on the CPU frequency. Very good. You won't need any emulation. Set the heartbeat to 50 Hz and drive VBlank from it. Use other timer for MicroHZ.
Can you use the 'econsole.hook' I make for debugging the Sam460 via the serial port?
It provides a before-anything-else shell prompt on the serial port. You can then do 'NewCLI' to test your graphics, or use any DOS command in shellcommands.resource.
You should just be able to add econsole.hook to your module list, and use 'econsole' in your bootargs.
So long as you have a working Exec/RawMayGetChar and Exec/RawPutChar, it should work.
Also make sure to add shell.resource and shellcommands.resource for this.
That should have done it.
If you set "#define DEBUG 1" in arch/all-native/econsole/econsole.c, do you get any additional serial output?
have added it to the build and added econsole to the command line - and can see the bootloader picks up on the emergency bootconsole tag, but I still only get the insert bootable media display?
Im assuming it exposes a fake filesystem that tricks aros into booting?
The contents of which are: ECON:AROS.boot
Way to handle the scheduling code? The implementations I had been following were causing problems, due to cascading interrupts which I cant handle properly in the asm stubs just now (when they break disable etc.) - since it means detecting the interrupted codes cpu mode and getting the correct sp/lr for it, and that's just too tedious for arm.
To work around this ive added a system idle task which does nothing - and when the scheduling code has no task to run switches this in and lets it run, thereby allowing the interrupts etc to resume until something does need to happen.
Also, by adding accounting code to cpu_Switch() and cpu_Dispatch(), it should allow the system to log idle time correctly (as well as running tasks).
have thought of also adding an additional task that never runs, solely to record time spent in IRQ handlers, but I digress..
was under the impression that kernel.resource should *never* be used outside of exec.library. This is a wrong impression.
Michal started designing it because portable nature of AROS does not fit well into exec's API with all its assumptions. So, he started the new, hardware-agnostic kernel API from scratch. Yes, exec sits on top of it in places. But kernel always meant to be open thing. Otherwise it would not exist.
it wasn't meant to be just used willy nilly by user code - but by lower system components (e.g. exec) so that they could be implemented in a more generic fashion, and the kernel resource itself hide the systems quirks.
Adding new things there perfectly keeps up with our decision to minimize AROS-specific intervention into APIs which can clash with MorphOS or Amiga OS4 extensions. We want at least source-level compatibility there. Binary compatibility on PPC would be extremely cool, but at the other hand we have no maintainer for this, as well as their ABIs splintering.
It depends on what exactly is being implemented - there's no reason we should have everything crammed into kernel.resource if it doesn't need to be (i.e. if its better suited as a separate component/subsystem in its own right)
The _LE versions are for when you have endian swapping taking place. If the graphics are the same endian as the CPU, no swapping should occur. I ran into a similar terminology problem in SDL with a friend insisting that his Radeon 7000 on his PC was big-endian. It is not, it just uses the same endianness for the graphics card and the CPU so no swapping was necessary. They were both little-endian.
The _LE versions are because the PixFmts refer to the bitmap data being in big endian format in memory, for which the normal version would need to do endianness conversion before applying the shifts/masks. on this platform it is in _LE in memory also so we don't need the conversion hence using the _LE version of the call). would use _LE (if it's really little endian 16 bit mode).
What is the bare minimum needed to implement a framebuffer based gfx driver, with our software handling the rest?
Have tried with just a gfx class that only expose new/dispose/newbitmap - and having an onscreenbitmap used only for the framebuffer itself (with all other bitmaps being chunkybm, and the framebuffer's superclass also being chunkybm), but that alone isn't enough it seems?
You can use workbench/hidds/sm502/ as your example - it is as simple as I could make it.
So, AROS creates the framebuffer bitmap (verified this) -> so surely it should be capable of then rendeing into it? I don't actually create the framebuffer "bitmap object" myself - only as a result of being asked to. The code I currently have on SVN seems to create the framebuffers bitmap object fine, but then crashes in intuitions DisplayDriver callback. In particular it crashes performing the getattr on the system default pointer. don't expose MEMF_CHIP in an allocatable form so AllocSpriteData was failing (and other code later doesn't check if the values are valid == illegal memory accesses)
So far have -:
vc_init: queries the gpus memory, and sets up a fake memory handler for it, then adds the bootmode driver and returns saying all is well
vc_gfxhidd:New: sets up some fake syncmodes to test with and creates the real gfx object.
vc_gfxhidd:NewBitmap: checks if its a framebuffer and uses the onbitmap class or uses the chunkybm class otherwise
vc_onbitmap:New; creates a chunkybm object and then pushes the real framebuffer address into it as the buffer,
vc4 had v8adds, v8subs, v8muld, v8min and v8max which operated on four 8bit uint values packed into a 32bit register. Multiplication was in the range 0.0 to 1.0 and addition/subtraction saturated. There were also a range unpacking/packing modes that allowed you to pack and unpack 8bit values into 32bit registers.
RasPi has to speak to the "operating system" which runs on the GPU itself and request/free memory - it cant directly manage it itself, and so the managed functions were used to wrap these calls.
The Arm and GPU share memory space. The framebuffer is shared. The Arm can write a pixel and it will appear on the screen (through GPU hardware) without flushing/copying being required.
The GPU can composite multiple FB's in real time - so you have a number of surfaces defined which are rotated etc and composited in real time to the output. Copying can map from the address space of the Arm to the flat space of the GPU which takes some code, but I don't think whole buffers are copied.
The DMA hardware can also access the whole memory space and can perform 2D fills and blits (no blending). This is documented in the peripheral spec posted. The DMA is just an Arm accessible peripheral and can be set up with low latency (e.g. microseconds).
must use a 0xc0000000-based bus address to access SDRAM, yet non-DMA access should go via a 0x0-based bus address.
For 2D dma, set TDMODE, and the spec says "interpret the TXFR_LEN register as YLENGTH number of transfers each of XLENGTH, and add the strides to the address after each transfer." so set STRIDE to pitch of the image, the width is XLENGTH and height is YLENGTH. You would fill by not setting the SRC_INC and point source to your fill data.
The DMA cannot see the ARM's L1 cache, so you would map the framebuffer with ioremap_nocache. Depending on where the source data comes from, it may need an L1 cache flush. The DMA can see the L2 cache. Use 0xC0000000 bus addresses when L2 is disabled and 0x40000000 bus addresses when L2 is enabled. (actually just call virt_to_bus and you'll get the right address out).
openGLES/openVG has high latency. Writing to framebuffer then reading it back is very inefficient (e.g. milliseconds). If you can drive it a unidirectional way, just streaming commands at then that is efficient. openVG is not implemented on top of openGLES - it uses the same hardware but as a first class interface
To improve the Gfx driver, we will need a DMA resource implemented so can use to perform DMA operations. The Gfx driver will need this to perform blits.
Actually MEMF_CHIP has to present, for historical reasons.
This has been never fully agreed upon, but in ports i wrote i exposed the whole memory as MEMF_CHIP. The idea behind this is that CHIP is originally the memory where graphics and sound data can be put. On non-Amiga platforms there are no restrictions on this, so the whole memory is CHIP.
Yes, many old software can misbehave with CHIP memory size larger than 2MB. But this actually applies only to m68k AROS which is going to run m68k binaries. In other cases it's quite logical to fix the program when porting.
As to original question: yes, it's enough to have a framebuffer bitmap (one with aoHidd_BitMap_FrameBuffer set to TRUE) and PutPixel routine. It framebuffer can be served by chunky bitmap class, then you can simply create chunky bitmap with your own buffer (see how VESA driver does this). Chunky PutPixel is already there.
struggling to determine what is the correct pixfmt to use for the 24/16/15 bit gfx modes on the RasPi. AFAIK it uses RGB565, for 16bit but im unsure what shifts etc should go with it? suffice to say Im getting the wrong colors so far lol.
<pre>
redmask: 0x0000F800
greenmask: 0x000007E0
bluemask: 0x0000001F
alphamask: 0
redshift: 16
greenshift: 21
blueshift: 27
alphashift: 0
</pre>
It should likely be vHidd_StdPixFmt_RGB16_LE
This stuff is a bit confusing. The "names" of the stdpixfmts are based on the layout in memory,
ignoring endianess. So for example:
ARGB32: will be 0xAA 0xRR 0xGG 0xBB in memory on both big endian and little endian machines.
The shifts and masks OTOH are based on pixel access (ULONG in this case), so differ depending
on whether you run on big endian machine or little endian machine (that's why there's stdpixfmt_le.h and
stdpixfmt_be.h in rom/hidds/graphics/).
With the 16 bit pixel format it's even more confusing, as for example it's impossible on little endian machine
to describe RGB16 with shifts/masks alone. That's why there's vHidd_PixFmt_SwapPixelBytes_Flag.
(RGB16 == RRRRRGGG GGGBBBBB in memory, and for pixel (WORD) access on little endian machine it needs to
be accessed as GGGBBBBBRRRRRGGGG).
The shifts btw indicate how much to shift the component to the left (!) so that it is moved to the highest bit (31).
The aHidd_PixFmt_StdPixFmt you specify will be ignored most of the time, because when the pixelfmt is registered,
the gfx hidd checks if there's an identical pixfmt (shifts/masks/etc., but ignoring pixfmt->stdpixfmt) already in the system,
and if so, it uses the already existing one and does not create a new one.
In theory it would be better if gfx drivers could simply/only specify a StdPixFmt without all the shifts/masks stuff when the
gfx driver uses pixfmt which matches one of the stdpixfmts exactly. Another possibility would be for gfx drivers to use
HIDD_Gfx_GetPIxFmt(stdpixfmt_gfx_driver_wants_to_use) and then peek shifts/masks from it and fill out a pixfmt
tag list based on that.
15bit very blue/green: Try to pass same shifts/masks/etc. as in 16 bit pixfmt (maybe you think it's using 15 bit R5G5B5
(or swapped) but it's actually still using 16 bit R5G6B5 (or swapped).
aHidd_PixFmt_StdPixFmt you pass is mostly ignored. It's the shift/masks/etc. that count.
But I would still pass the correct one (_LE) == whatever rom/hidds/graphics/stdpixfmts_??.h uses
in the entry where you have looked up shifts/masks/etc.
Use the shifts/masks/etc. from the entry in stdpixfmt_le.h (if you are running on little endian machine) or stdpixfmt_be.h (if you
are running on little endian machine) that matches the pixfmt that its meant to be.
0xAA,0xRR,0xGG,0xBB on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_BGRA32)
0xAA,0xRR,0xGG,0xBB on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_BGRA32)
it feels like AROS trashes the alpha component, otherwise it should be 8A8R8G8B.
read on the subject suggest its in 1x5r5g5b (x is ignored) to keep 16bit alignment .
Suggests to me that wrong shift/mask are being applied - however going by the 16bit versions it all looks correct to me so I am really confused as to what is happening.
The output image looks to have too much green/blue, and very weak red.
Kickstart
The idea is to minimize amount of archirecture-specific modules to make the user's life easier. So, the kickstart was split into 'base' (which does not contain anything machine-specific) and 'BSP' (Board Support Package) which contains all hardware-specific stuff. This way, for example, distribution makers can save up space on CD and make CDs with multiple platform support. Different configuration would load the same base with different BSP's.
Next there was some part which is entirely missing on hosted. These are filesystems. Hosted ports do not need them to boot up, so on hosted they are left out. At the other hand, they are also architecture-agnostic. So i put them into 'FS' package (standing for 'filesystem').
USB
Poseidon is one more big part. I made it into separate package in order to allow users to omit it if they don't need it (for example, to run on retro PCs without USB). Personally i have one. Again, Poseidon is hardware-agnostic (well, there are USB drivers but HCIs are pretty standard).
AFAIK its HCI 1.0 compliant but not familiar enough with poseidons drivers, nor USB, to just hack away at the existing code. Perhaps once i'm more familiar with the workings I can merge in the changes needed to get it operating but for now I will focus on getting it running. Also our drivers have known issues so perhaps a fresh set of eyes might shed some light on what is going wrong.
Another interesting question is whether Poseidon can operate on device side. Is it flexible enough? How similar is being a USB host and USB device? think it will need a bit of work on Poseidon's side. Until then I will force the driver into Host/Master mode in the init code, but leave open device etc to configure the chipset for either's use - and look at trying to add support for working in Device/Slave mode & switching modes once it's up and running.
Actually USBROMStartup is some kind of kludge. Can there be any alternative? Could device drivers be self-installing, like our HIDDs? This would get rid of need to list them in USBRomStartup.
* Model A and B limited to 150 mA per port.
* Model B+ and Pi 2 introduced configurable 600 mA to 1.2 A support over all ports - anything above that requires a powered USB hub.
Implementing the hardware driver that Poseidon uses to interact with the USB components.
Have code in place to (try) and initialise the USB chipset, and configure host/device mode operation (though AFAICT Poseidon doesn't support device mode). Started to get the "virtual" root hub written for the single USB port so that Poseidon should at least list it correctly in the GUI - and try to interact with it to find peripherals.
The BCM2835 uses a soft IP block from Synopsys’ DesignWare library (DWC), specifically the block is called dwc_usb_2_0_hs_otg_subsystem-ahb_se (“USB 2.0 Hi-Speed OTG Controller Subsystem w/AHB Interface SE”).
There is no public documentation for this, and pretty much zero chance of anyone getting hold of it even with NDA. However, there's a Linux driver written by Synopsys ([https://github.com/raspberrypi/linux dwc_usb]). Specifically directories [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_common_port] and [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_otg].
The Synopsys code is actually under a fairly permissive licence – it's not GPL, it's similar to BSD (’don't sue us if it breaks’ is pretty much the only clause). So this should not be a barrier to porting the code.
The code is really well written, with a nice partition between the work done by the driver (dwc_otg, which is fairly involved, given the host does more work than a conventional EHCI driver), and the interface to Linux (dwc_common_port).
Probably only need provision of relevant changes to dwc_common_port. Other things to consider....
* Provision of necessary headers to get it to compile
* Provision of necessary functions (main issues are wait queues, threads, work queues, tasklets, timers, spinlocks and mutexes (multithreading) )
* Interfacing between USB stack and the driver. dwc_otg/dwc_otg_hcd_linux.c looks like the place to start.
the Linux bits of the headers are only required for the dwc_common_port library. dwc_common_port includes a variety of crypto functions which are not used – it appears to also be used for ultrawideband (UWB) and wireless USB (WUSB) drivers where crypto will be an issue, but it isn't going to be for plain wired USB.
Every USB driver acts as an USB hub as well in order to let Poseidon control the state of USB ports. The code there was reading status of the only USB port in Raspberry's CPU but when changing the status it erroneously deleted some of the status bits, including the port enable one. It was so because those bits in the status register are of a type Read/WriteToClear. It means, if one does not want to change their value from 1 back to 0, one has to actually write the 0 value. Very practical thing e.g. in interrupt handlers, where one reads the interrupt status register to learn what was the interrupt reason, and writes it back to the same register in order to clear the interrupts.
After fixing that code it turned out that the communication was still unsuccessful. Apparently the USB device was not understanding the host for some reason. That should not happen since the request sent was one of the standard ones implemented by virtually anything with an USB connector, assumed that Poseidon clears the data caches before forwarding the work to the USB drivers but that's the responsibility of the driver itself.
The USB device responded and acknowledged the transmission! But why were all the request sent after address change failing with timeout? They should not. Once again, address set is supported just by anything. Tried to contact the device at address 0 once again and there it was, still responding properly. The enlightenment came. The bus address for DMA transmissions was, as it is in many bare metal USB implementations, just the pure memory address of the buffer as seen by the ARM cpu. Have "prefixed" it with the real location of uncached RAM and booted AROS once again.
Trident saw this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
and this:
Product : Vendor: Vdr=0424/PID=EC00
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 255
SubClass : 0
DevProto : 1
VendorID : 1060
ProductID : 60416
DevVers : 0200
and even this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
What are these things? The first one is USB hub built in the Raspberry. Thanks to this one the Pi machines (with exception of Pi0 and computing modules) have more than just one single USB port. The second one is the network chip in raspberry, the third one is my USB SD card reader which have just connected to see what happens. AROS tried, of course, to boot from it ;)
So, the first step towards working USB is done. The control transfers are working as you can see above. Next step is to implement bulk and interrupt transfers, having the basics in place. Finally some error handling will be added and USB for Pi will be as complete as the PC version.
[http://www.raspyfi.com/raspberry-pi-usb-audio-fix/ Issue with USB Audio]
Audio
The Pi 4B is the only Pi that can output HD Audio as an HD Audio passthrough bitstream, and it does it over HDMI. It's possible to use the two HDMI output for separate HDMI video and HDMI audio outputs to allow UHD HDR video and HD Audio with non-UHD HDR compatible AVRs.
The Pi3B+ and earlier will decode to PCM 5.1/7.1 and output over HDMI. HDMI is the only interconnect that has a standard for carrying Dolby True HD, DTS HD MA etc. as a bitstream - you can't carry it as a bitstream on any other interface.
Pi3 and Pi4 audio jack output derived from 12bit pulse width modulation is relatively poor. For better, choose USB Audio or I2C versions.
[https://github.com/raspberrypi/linux/tree/rpi-patches/sound/arm audio] and its [https://github.com/raspberrypi/firmware/issues/2 very high speed message passing interface type of thing VCHI]
The Model B+ added an additional voltage regulator for the audio output and an additional output driver to drive low-resistance loads like headphones. However it is still using pulse-width modulation (PWM), which has a major impact on sound quality
the old Raspberry Pi used a linear voltage regulator to provide the 3.3V to many of the components on the board while the new one uses a switching regulator. Both can perform reasonably well. However switch mode power supplies often show higher noise figures
Analogue audio
Audio over HDMI rev 1.3 & 1.4
Ethernet
10/100 BaseT Ethernet RJ45 socket
GPIO
GPIO shouldn't be too bad but bear in mind it is already accessed in places so they would need to allocate pins etc through it (e.g. sdcard to flicker the activity light, serial debug to output data on the GPIO pins)
Probably a resource rather than a device...
Started an i2c driver that will need to allocate GPIO pins. Feel free to work on it if you are interested ;p
GPU graphics with 2D and 3D acceleration
Sadly none yet for 32bit but for 64bit...
Miscellanous
hdmi issues
Setting the hdmi_force_hotplug=1 makes sure the Pi believes the monitor/TV is really there.
You might also need to set config_hdmi_boost=4 or even higher (up to 9) if your display needs a stronger signal.
If the display is a computer monitor or newer tv, use hdmi_group=1 (auto HDMI use) and if it is an older TV, try hdmi_group=2 (for DMT formats, i.e. for PC monitors) then you HAVE to "set hdmi_drive = 2 to enable HDMI output as this forces HDMI mode rather than DVI mode
Do not set hdmi_safe=1 as that overrides many of the previous options.
Using a shorter or better quality HDMI cable might help. Make sure your Pi's power supply delivers 1 A and not 500 mA.
If you see a problem with the red colour - either absent, or interference - then try a boost
composite video
changing the RCA cable, then the composite port worked out of the box
Boot it as you are doing, without HDMI. If you now plug in the HDMI, do you get the image? In other words, does the Pi think HDMI is connected even when it isn't?
Rename all the files in the first partion of the card except bootcode.bin, start.elf and fixup.dat What's the result?
Put back config.txt What's the result?
for PAL mode sdtv_mode=2
dmi_ignore_hotplug Pretends HDMI hotplug signal is not asserted so it appears a HDMI display is not attached
hdmi_ignore_hotplug=1 Use composite mode even if HDMI monitor is detected
<pre>
# NOOBS Auto-generated Settings:
#hdmi_force_hotplug=1
#config_hdmi_boost=4
#overscan_left=24
#overscan_right=24
#overscan_top=16
#overscan_bottom=16
#disable_overscan=0
start_x=1
gpu_mem=128
</pre>
tvservice -c "PAL 4:3"
<pre>
/opt/vc/bin/tvservice -s or tvservice -s
state: HPD high|HDMI mode|HDCP off|composite off (0x12001a), 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m CEA
Group CEA has 1 modes:
(native) mode 16: 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m DMT
Group DMT has 0 modes:
</pre>
sudo amixer cset numid=3 1
forces the audio to the headphone jack, even with the HDMI video output plugged in
config.txt
the hdmi_ignore_edid_audio=1 option sems relevant as it should tell ALSA that the only available audio is analog, no matter what the display says
There are several different ways that these 4 pole (ring) composite analog cables can be wired up, so some work great in some applications and can be a waste of time in others.
What is needed for the Raspberry Pi B+ and above, which like many camcorders needs the ring contact next to the base contact to be the ground.
The wiring for the 4 pole are:
TIP (LEFT AUDIO CHANNEL)
RING 1 (RIGHT AUDIO CHANNEL)
RING 2 (GROUND/EARTH)
RING 3 BASE/SLEEVE (VIDEO) YELLOW
Most Apple based Players and the Microsoft Zune (TM) are wired this way.
Most analogue camcorders are wired this way as well, where the ground in on Ring 2 will work with the Pi although you may need to swap your Video plug with the Right Audio plug.
Nearly all other MP3 players are not wired this way, the ground is on another ring ie the wrong one.
External devices
* Camera Module Omnivision ov5647 Sunny 5MP (NoIR version) V1.3 - NoIR at 850 nm, peak at 880 nm and trails off at 940 nm wavelengths
* Camera V2 Sony IMX219 V2.1 8mpixel 8MP 8megapixel - 3280 x 2464 pixels - video at 1080p30, 720p60 and 640x480p90 - wider field of view, 62 vs 54 degrees horizontally -
* Branded WIFI usb BCM43143 dongle
N.B. dreaded error after changing cameras (stupidly without turning off the power first) and lasted through several power cycles. It can be a bad 15-pin FFC ribbon cable, when swapped, camera(s) and the Pi itself are working OK. It can be an instance of a cold solder joint on the CSI connector on the pi board. the camera can be detected (that's done via I2C) but may still not be able to receive image data (done via CSI-2) if something is broken. CSI-2 is uni-directional. Control is generally done via I2C.
The CSI-2 receiver always writes to memory, not direct to the ISP. That's the way the Broadcom architecture works as it allows multipass processing easily. GPU memory is accessible from the ARM. Processing using the QPU graphics processors may be possible. currently the only supported sensor is OV5647 and IMX219. The linux drivers are all in the firmware blob, else you'd be looking at at least a man-month of work in a fully fledged imaging lab to do a decent tuning of the camera modules' ISP parameters.
Static electricity maybe an issue for the camera module and slightly less for the pi board.
== References ==
===Good sites to visit===
*[https://github.com/raspberrypi/firmware/tree/master/ Raspberry Pi Firmware build]
*[https://www.raspberrypi.com/documentation/computers/software-sources.html Documentation]
*[https://rpilocator.com/ RPiLocator]
Linux only
*[https://github.com/raspberrypi/linux Raspberry Pi Linux Build]
*[https://dietpi.com/ DietPi]
*[http://www.tinycorelinux.net/ports.html piCore]
*[https://wiki.alpinelinux.org/wiki/Raspberry_Pi Alpine Linux]
*[https://github.com/armbian/build Armbian]
*[ FydeOS]
*[ TwisterOS based on ChromiumOS]
*[https://note.com/jamesmondo/n/nc76e31402be8?hl=en BSD]
*[https://www.raspberrypi.com/software/operating-systems/ PiOS Lite] and then [https://hstwb.firstrealize.com/ HST]
*[ PiMiga for pi4 and pi5]
*[ amibian for pi2 and pi3]
*[ retropie pi1 and 2]
Other alternative lighter smaller than Pi OS
*[https://aros.sourceforge.io/nightly1.html Aros 64bit ARMV8 single core]
*[https://www.riscosopen.org/wiki/documentation/show/Welcome%20to%20RISC%20OS%20Pi RiscOS on Pi3 and Pi4]
*[https://github.com/michalsc/Emu68 ARM based realtime JIT 68k for amiga computers]
*[https://github.com/JJDSNT/bellatrix/releases/ Alternative use of Emu68 on Pi3b]
*[https://github.com/stevereaver/uaos uaOS with Emu68k]
*[https://github.com/aros-development-team/AROS/commit/f80a268607dfae81b2db94755ab4e4d31ccb72d6 m68kemu library reference]
*[ HaikuOS]
*[https://github.com/raspberrypi/noobs NOOBS] os loader with successor [https://github.com/procount/pinn PINN]
*[https://github.com/maxnet/berryboot berryboot]
*[https://github.com/brianwiddas/pi-baremetal Bare Metal Access on Pi 32bit]
Testing procedure is put sd card in, connect board to board if necessary, plug in hdmi and then power nothing else is done especially CSI DSI etc
[https://www.raspberrypi.com/documentation/computers/compute-module.html CM5] has the same 55mm x 40mm 2x100pin connectors form factor as the CM4 but [https://www.epdtonthenet.net/article/214508/Key-Considerations-When-Migrating-from-Raspberry-Pi-CM4-to-CM5.aspx some pins and other small things] have changed. Will need the [https://raspipcb.com/tech-blog/raspberry-pi-cm4-vs-cm5-difference-in-booting-from-sd-card/ right IO board to suit]
*Green [ Raspberry Pi Compute Module 5 IO Board REV2 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1967]] - untested
*Green [ RPi Compute Module 5 IO board REV1 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1751]] - untested
*Black SupTronics Geekbord X1500 CM5 IO Carrier Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*[https://sipeed.com/nanocluster Sipeed NanoCluster] - untested up to 7 CM5
*Green BentoIO CMX0 - untested
*Box EDATec ED-CLAWBOX - untested
*Home Assistant Yellow - Kit with PoE with Raspberry Pi Compute Module 5 - untested
*Blue [https://www.waveshare.com/wiki/CM5_PoE_BASE_A Waveshare CM5-PoE-BASE-A] - untested
*Box Waveshare [ CM5-POE-BOX-A] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-B Waveshare CM5-IO-BASE-B] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-A Waveshare CM5-IO-BASE-A] - untested
*Blue Waveshare [https://www.waveshare.com/wiki/CM5-NANO-B CM5-NANO-B] - untested
*[https://carboncomputers.us/products/pi-flux piFlux]
*[https://carboncomputers.us/products/ Zitaotech Hackberry] CM5 lite only -
*Portable [https://www.waveshare.com/pocketterm35.htm Waveshare PocketTerm35] with Pi4B or Pi5 - untested
*Box [https://www.clockworkpi.com/uconsole ClockworkPi uConsole][https://www.youtube.com/watch?v=EtI_bAahbR8 CM4 into an adapter or CM3 into so-dimm - Cyberdeck] - untested
*Green RPi [https://datasheets.raspberrypi.com/cm4io/CM4IO-KiCAD.zip Compute Module 4] [https://datasheets.raspberrypi.com/cm4io/cm4io-datasheet.pdf IO board] V1.4 [https://datasheets.raspberrypi.com/cm4io/CM4IOUSB3-KiCAD.zip USB3] [https://datasheets.raspberrypi.com/cm4io/cm4iousb3-appnote.pdf CM4ISO] [https://datasheets.raspberrypi.com/cm4/cm4-datasheet.pdf Dual100pin] (2020) aka Development Platform Board - untested
*Purple Pi Hut Cytron CM4 Maker Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*[ KubeSail PiBox mini 2]
*Home Assistant Yellow with Raspberry Pi Compute Module 4 - untested
*[ Turing Pi V2] - untested CM4 with 260-pin SO-DIMM socket adapters and/or nvidia jetson nanos - untested
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-C Waveshare CM4-IO-BASE-C] - untested but binary blobs Rev01 Rev02
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-B Waveshare CM4-IO-BASE-B] - untested but binary blobs
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-A Waveshare CM4-IO-BASE-A] - untested but binary blobs
*Blue [https://www.waveshare.com/wiki/CM4-NANO-B Waveshare CM4-NANO] - untested but usb and audio turned off or rerouted
*Black [ Seeed Studio with BigTreeTech BTT pad 7] - bin blobs?
CM3 has a 200 pin sodimm ddr2 connector form factor but not electrically SC0028, SC0029
*Blue [https://wiki.geekworm.com/CM_IO_Board Geekworm RPi Compute Module IO Board] [https://github.com/geekworm-com/cm-io-board CSI DSI] with CM3 in ddr2 slot underside - '''works''' if SW1 on but CM3+ '''does not'''
*Green [https://cdn-shop.adafruit.com/product-files/3442/CMIO_schematic.pdf RPi V3 IO board CM3IO] and CM3 Lite - untested
*Green [https://turingpi.com/ turingpi v1 cluster] - untested up to 7 cm3 7xlan9514 12V discontinued, 3 x Pi4 homelab maybe better
*Blue [https://www.waveshare.com/wiki/Compute_Module_PoE_Board Waveshare Compute Module PoE Board] and CM3 lite (if not lite, write files to internal eMMC fat32) '''AVOID''' bin blobs
*Blue [https://www.waveshare.com/compute-module-io-board-plus.htm Waveshare Compute Module IO Board Plus] [https://www.waveshare.com/wiki/Compute_Module_IO_Board_Plus wiki] [https://forums.raspberrypi.com/viewtopic.php?t=235695 pin settings] with CM3+ Lite - '''AVOID''' binary blob
*[ Pi02w on Geekworm SupTronics X305 Raspberry Pi Zero IO Baseboard] - untested
*[ Spotpear Pi Zero 2w to Pi3b format-ish] - untested
*[ pi-top v4] box has 128x64 oled display, micro hdmi, 19Whr battery with pi4 and 15V PD 36W min needed
*[ pi-top v3] three green pieces, heatsink covers most of the base tray, pi-top hub mk1 lhs and Pi1B Pi2b Pi3b rhs secured from below, black rounded strip with pi-top above keyboard, 13.3" HD 1366 x 768 display, small touchpad,
*[ pi-top Model 2.0] pi-top on bottom bezel of 14-inch green laptop, large trackpad, keyboard slide down to reveal main system hub on slide rails moved to the right, Raspberry Pi3b screws down, hub slides in, 18V 2.5A 45W charger brick, battery 11.1V 3500mAh 38.85Wh and storage PiTopOS
*[ Pi-Top CEED Raspberry Pi Modular Educational Desktop with RPI3] monitor
*[https://www.indiegogo.com/en/projects/jesselozano/pi-top-a-raspberry-pi-laptop-you-build-yourself Pi-Top v1] wedge laptop with RPi2
<pre>
2008 Trustees collected for Foundation
2009 Pi Foundation charity status gained
2010
2011 First Raspberry prototypes
2012 First boards go on sale at CPC and RS. The Model A and B 700 MHz Arm11 - February 29th BCM 2835
2012 First million sold - more than the 10,000 original planned and anticipated
2013 First Alpha Experimental builds of AROS Native for the 32bit Pi
2013 Pi Trading launched making grants available, providing in house educational resources and Pi Academy for teacher training
2013 Over two million sold
2014 Over three million sold
2014 Pi 1 Model B+ introduced that moved composite video to audio jack and same half gig of memory
2014 Pi Model A+ v1.1 no ethernet and 1 usb - a little smaller -
2015 Over four million first gen pis sold
2015 Pi Zero 1.2 BCM2835 first production revision released with no camera port
2016 Pi0 1.3 released with camera csi connector
2017 Pi Zero W v1.1 1GHz Pi0W, single-core 32bit CPU BCM2835 released with Cypress CYW43438 wireless
2020 Raspberry Pi Pico SC0919 with RP2040 32-bit 2Core ARM Cortex-M0+ up to 133 MHz - 264KB of SRAM and 2MB of on-board QSPI Flash -
2024 Raspberry Pi Pico 2 with RP2350 2Core 32bit Arm Cortex-M33 and 2core open-hardware [https://github.com/wren6991/hazard3 Hazard3 RISC-V]
2015 Pi 2 Model B v1.1 BCM2836 900/600 MHz ARM Cortex-A7 Armv7 quad 32bit, 32bit VideoCore IV GPU - 1Gb RAM - 5V 2A micro usb - SMSC LAN9514 chip -
2015 Over a million pi2s sold
2015 Raspberry Pi 2 Model B version 1.2 Pi2bv1.2, aka Pi2B2 has armv8 BCM2837 underclocked to 900Mhz without wifi/bluetooth module
2016 Pi 3 Model B - Broadcom BCM2837 SOC four 64bit ARMv8 Cortex-A53 1.2GHz 32bit 1080p VideoCore IV GPU - 1Gb DDR2 - bluetooth 4.1, Cypress CYW43438 wireless 802.11n - 4 x USB2.0 ports - 5.1V 2.5A - SMSC LAN9514 chip
2016 PIs total over 10 million worldwide
2017 Compute Module 3 CM3 with BCM2837B0 armv8 Quad 64-bit - small 67.6mm x 31mm board which fits DDR2 SODIMM connector but not electrically compatible which plugs into needed IO board - beware of the I2C protocol issue
1Gb LPDDR2 RAM - Lite or 4Gb Emmc storage
2017 12 million pis sold in total
2018 Pi 3 Model B+ - 4c A53 BCM2837B0 1.4Ghz - 1Gb, wireless 802.11ac, gigabit ethernet (300Mbit/s) and bluetooth 4.2 - power over ethernet - 4 x USB2.0 ports - Microchip LAN7515 chip
2019 Over 15 million sold
2019 Pi 3 Model A+ with BCM2837b0 Cortex-A53 64-bit SoC @ 1.4 GHz with 512Mb LPDDR2, 1 usb2, 1 hdmi, 1 micro usb 5V 2A - no ethernet -
2019 Raspberry Pi Compute Module 3+ CM3+ - Broadcom BCM2837B0 1.2Ghz, Cortex-A53 (ARMv8) 64-bit SoC on DDR2 SODIMM mechanically compatible only factor - IO board required
1Gb DDR2 and 8GB, 16GB, 32GB or a Lite variant without eMMC
2021 Pi zero 2 (w or no W) RP3A0 quad 1GHz Cortex-A53 64bit BCM2710A1 512mB SDRam
2025 edaTEC CM0 ED-CM0NANA with additional dev board with quad 1Ghz A53 with 512Mb Raysan RAM, 2 USB2 and 10/100 ethernet - pico castellated edge
2019 Pi 4 Model B v1.1 RPI4B - BCM2711B0T quad 64bit A72 1.5GHz, 4K VideoCore VI, AC wifi, Bluetooth 5.0, GbE Broadcom BCM54213PE (PHY ID 0x600d84a2), 2 micro hdmi decode up to 4K, USB-C 5.1V 3A power, 2xVLI VL805 USB 3, 2xUSB 2.0, 2GB 9LDWW D9WHZ or 4GB 9FDWW D9WHV, 8GB 0AA47 D9ZCL ddr4 ram
2020 Silent Pi 4 v1.2 upgrade with more USB-c psu support
2020 PI400 BCM2711C0T 1.8GHz 4Gb DDR4 inside keyboard, 5.1V 5A 27W usb-c psu, 2 micro hdmi, external ide style 40pin gpio, no audio port -
2020 Raspberry Pi Compute Module 4 BCM2711B0T on new 55mm x 40mm 2x100 pin form factor with extra breakout IO board
CM4101000 1Gb RAM Lite SOM
CM4102000 2GB RAM Lite
CM4104000 4GB RAM Lite
CM4004008-4GB-RAM 8GB-EMMC SOM System on Modules
CM4104032 4GB RAM 32GB emmc
CM4108000 8GB RAM Lite
CM4008016 8GB RAM 16Gb eMMc
2021 Raspberry Pi SC0763 Compute Module 4S CM4S with ddr2 sodimm pinouts but not electrically the same with suitable IO board extra cost -
CM4S01000 1GB RAM Lite
CM4S01008 1GB RAM 8GB eMMC Flash
CM4S02000 2GB RAM Lite
CM4S04000 4GB RAM Lite
CM4S04016 4GB RAM 16Gb KLMAG1JETD-B041
CM4S08000 8GB RAM Lite
2021 Pi 4 v1.4 BCM2711B1 upgraded power regulator, to deal with 8gig of ram being more power hungry
2021-48 Raspberry Pi 4 model B v1.5 2GB
2023 Pi 5 v1.0 BCM2712 Quad A76 @2.4Ghz - VideoCore VII - no audio socket - dual 4k from mini hdmi - fan connector - 5.1V 5A psu
2024 Pi 5 2GB DDR4 version uses BCM2712D0
2024 Pi-500 with 8Gb LPDDR5 and membrane keyboard
2024 Pi 5 v1.1
2024 Raspberry Pi Compute Module 5 CM5 BCM2712 55mm x 40mm form factor with additional IO board
CM5004000 04GB RAM 0GB eMMC Lite
CM5008000 08GB RAM 0GB eMMC Lite
CM5016000 16GB RAM 0GB eMMC Lite
2025 Pi-500+ with 256GB NVMe storage, 16GB LPDDR4 RAM, and Gateron KS-33 Low Profile Blue mechanical keyboard switches
2025 Pi5 1GB DDR4 announced
2022 PiOS linux goes 64bit
2024 Pi Trading IPO stockmarket stock exchange listing
2026 April and May Aros 64bit fixed, added AHI audio, VC4 gfx started, usb functions added to rom
2026 June and July Aros 64bit usb2otg started, dma.resource, sdio.resource, bwfm.device wifi added
2026 Late July daily 64bit Pi3 LE little endian builds start
2026 August Pi 4, 400, 5 and 500 DTBs added, expanding existing support and wifi for Pi4 and Pi5
2026 August Pi5 HAT+ nvme and HDMI, AHI RPiI2S added, Pi4 HVS5 video scaler started,
2026
2027
2028 Pi 6
</pre>
The vcgencmd can be used to inspect and dump the current system configuration.
vcgencmd runs on top of VCHIQ as an RPC. The mailbox interface is an alternate but much simpler RPC.
VCHIQ is a bridge (queue) between the CPU and the GPU so they can communicate with the firmware.
Loads of [https://github.com/6by9/rpi3-gpiovirtbuf/blob/master/rpi3-gpiovirtbuf.c mailbox] which uses the GPIO control calls. [https://github.com/raspberrypi/firmware/wiki/Mailboxes may also be of interest]
A fair number of vcgencmd examples (search for vc_vchi_gencmd_init). [https://www.raspberrypi.org/forums/viewtopic.php?t=229203#p1406112 sends the relevant vcgencmd commands] to update the scaling kernel, but the [https://github.com/raspberrypi/userland/blob/master/host_applications/linux/apps/gencmd/gencmd.c command] is just a text string. Parsing and execution of the instructions is performed by the VideoCore firmware.
The Raspberry Pi runs two separate operating systems: Linux/Aros on the ARM, and a threedx RTOS called vcos running on the Videocore 4 VPU: vcos is commonly called "the firmware". Vcos is tasked with performing certain system services, for example running the display and audio outputs. The VCHI driver provides an interface to allow drivers to talk to vcos.
Doubtful, on any [https://www.web3d.org/ Web3d] [https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API WebGL] or [https://github.com/immersive-web/webxr WebXR] [https://developer.mozilla.org/en-US/docs/Web/API/WebXR_Device_API Device API] [https://developer.mozilla.org/en-US/docs/Web/API/XRInputSource XRInputSource] support. Hopefully, never/limited support features like location, peer-to-peer, invasive web apps, unwarranted storage, payments, proprietary video streaming etc
*spreadsheet [https://git.sheetjs.com/sheetjs/sheetjs sheetjs] [https://github.com/mleibman/SlickGrid SlickGrid] [https://github.com/6pac/SlickGrid SlickGrid] [https://github.com/jspreadsheet/ce jspreadsheet ce] [https://github.com/dream-num/Luckysheet Luckysheet] [https://github.com/ruilisi/fortune-sheet fortune-sheet] [https://github.com/dream-num/univer/ univer] probably without xlsx support
*presentations [https://github.com/impress/impress.js/ impress.js simplified] [https://github.com/bwlewis/slides slides] [https://zenomt.github.io/mdslides/ github markdown slides] [https://github.com/Patternslib/slides Patternslib slides markdown] probably without pptx support
*weather [https://github.com/Himanshu3412/Weather-Forecast Weather Forecast], [https://github.com/kaushalsahu07/weather weather needs API key],
==Future==
[https://github.com/ARMSX2/ARMSX2 Arm pi of pcsx2]
[https://tube.cadence.moe/ Cloudtube], [https://github.com/TeamPiped/documentation/blob/main/content/docs/public-instances/index.md TeamPiped], [], [], [],
[https://hyperpipe.codeberg.page/ hyperpipe], [https://ytify.pp.ua/ ytify], [], [],
[ ytdl], [https://github.com/golddominik893/liberatube liberatube]
[https://git.lolcat.ca/lolcat/4get 4get], [https://github.com/hnhx/librex librex], [], [],
{{BookCat}}
9acvq1hbhwjzi6rpuy2tcz7h8oyh6id
4676529
4676520
2026-10-17T14:19:52Z
Jeff1138
301139
4676529
wikitext
text/x-wiki
{{ArosNav}}
[[#Native]]
[[#Hosted]]
[[#Build]]
[[#Hardware]]
[[#References]]
[[#Future]]
==Introduction==
[[File:Scalos00.png|thumb|Scalos on Aros Pi3b]]
Aros aims to cover Pi 3 to 5 512Mb+ RAM
Options to boot from using a good power source to prevent the yellow lightning symbol.
*With Pi3b+ the max you can get is 5.1V 2.5A with micro usb.
*With Pi4 5.1V 3A with usb-c
*With Pi5 5.1V 5A, the amps went ever upwards, even to 5.1V 9A with usb-c
* Pi500+ keyboard wedge - working but not much tested esp [https://github.com/aros-development-team/AROS/commit/48e9c8edcca4b5c1e1fe0b1123f2129f624af67b power button]
* Pi500 wedge with up to date bootloader via PiOS - working but not much testing esp [https://github.com/aros-development-team/AROS/commit/48e9c8edcca4b5c1e1fe0b1123f2129f624af67b power button]
* Pi 5 - Quad A76 64bit ARMv8 and RP1 "southbridge" with VideoCore 7 D0 (rev1.1) - untested
* Pi 5 - Quad A76 64bit ARMv8 and RP1 "southbridge" with VideoCore 7 Pre-D0 C1 (Rev1.0) - untested
* Pi400 RPI-400 keyboard wedge - resolution changing and audio from micro hdmi0 (near 40pin) and micro hdmi1 (near usb-c psu) - Fn F10 0x5e power on and off works or held down for over 7 seconds auto shutdown - keyboard ok - wifi and lan ethernet testing -
* Pi 4 - Quad A72 64bit ARMv8 with VideoCore 6
* Pi 3 - Quad A53 [https://www.raspberrypi.com/documentation/computers/processors.html 64 bit] ARMv8 with VideoCore 4 with '''fan''' to prevent overheating cpu 82C+ throttling
* Pi02W - Quad A53 64bit - boots but [https://forums.raspberrypi.com/viewtopic.php?p=2387984#p2387984 usb not working but did in the past],
* Pi 2 - Quad 32bit ARMv6 with VideoCore 4 - mostly not 64bit compatible
* Pi Model B+ 32bit ARMv6 with VideoCore 4 - not 64bit compatible
* Pi Model A and B 32bit ARMv6 with VideoCore 4 - not 64bit compatible
===Native===
* 2013-03 Kalamatee starts work
* 2015-04 Work continues with mschulz on the kernel and Kalamatee (NicJA) on gpio and usb
* 2018 [https://www.patreon.com/posts/i-owe-you-some-20956961 mschulz resume adding BE big endian support], [https://www.patreon.com/michal_schulz/posts Big endian on Pi]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bsek latest commits for pi 3b, 4 and 5 64bit]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=metaneutrons latest commits for Pi5]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bitplane latest commits for ARM]
====64bit====
'''Download''' A [https://archive.org/details/piAROS Pi Distribution (Distro) has started] and the contents copied to fat32 8GB+ microSD card (there will be drawers/folders - boot c Classes Demos Developer Devs Extras etc only showing). The SD can be plugged in to the Pi. And power on. [https://pi.amiga.icu/ Repository]
'''Not recommended''' but [https://aros.sourceforge.io/nightly1.html RaspberryPi 3, 3+, 4 and 5 64bit ArmV8 nightly builds] [https://sourceforge.net/projects/aros/files/ and alternative site and nightly2] which is a test version of '''very few''' apps with both raspi-aarch64-system and raspi-aarch64-contrib can be unbz2'd to a SD or SSD as appropriate.
64bit build works well on a single core LE little endian. Multicore [https://github.com/aros-development-team/AROS/commit/1df0747c2bda3523a43029725a709b1f377d84ec may follow]. Any issues booting could be down to the SD card so please use another SD to see if it is resolved. Remember Aros Arm uses FAT32 and Aros can detect issues with this format very acutely (once fault found, FAT 0x0FFFFFF7 bad cluster so no files written after that, no repair). Please report your experiences in the [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2138&pid=15057#post_15057 Aros forum thread], [https://forums.raspberrypi.com/viewforum.php?f=179 Raspberry Pi Aros Dev and User forums], [https://forums.raspberrypi.com/viewtopic.php?p=2387984#p2387984 previous Raspberry Pi forum thread]. Any bugs or issues can be [https://github.com/aros-development-team/AROS/issues described here to fix]
*Pi500+ untested usb3 booting or nvme ssd
*Pi500 untested usb3 booting
*Pi5 untested usb3 booting
*Pi400 boots with '''USB3''' port based sata3 ssd
*Pi4 untested (may need eeprom update from PiOS or Pi SD Imager)
*Pi 3 B+ is pre-configured for USB sata3 boot - untested
*Pi 3 B may need [https://www.youtube.com/watch?v=ubnwvxF3Klc PiOS to set OTP to boot from usb - do so at your own risk] - if OTP set to usb, boot works but slower than SD card
Speed write wise (top faster)
<pre>
*NVME Pi5 untested >1000MB/sec or faster if matched correctly
*Sata3 ssd 500MB/sec
*SD V90 90MB/sec 4K maybe 8K
*SD V60 60MB/sec 1080p
*SD U3 V30 30MB/sec 720p
*SD C10 U1 V10 A1 A2 10MB/sec minimum should be used now
*SD C06 6MB/sec
*SD C04 4MB/sec
</pre>
As a homage to the past, Aros shows a reduced number of icons but this can be changed by left mouse click in the window and then right click down to Window -> View -> All files
Windows can be manipulated by the top (moving) and the bottom right corner (resizing) only.
Zune like MUI gui interface, has a unique quirk in that after changing a setting in a text box, you may sometimes need to press Enter/Return before clicking OK, Save, etc
Double left mouse click on most picture (Developer/Debug/Tests/Datatypes), audio and video files are supported, via datatypes, by the multiview application.
Esc escape key usually closes open windows even the desktop
In Prefs/Appearance some decorative theming elements need work. There is a few Mason icons in /Prefs/Presets/Icons/Mason/ and the ever present default Gorilla - Icon exchange in works
For more intensive graphics applications, you may need to edit config.txt in the root folder and change 128M to 256M to adjust more memory to graphics usage
If your cursor should '''appear''' to vanish, fear not it is still there. Please head to the top of the screen i.e. the title bar, hold down the left click mouse and drag the screen down a little and the cursor will appear again. Then you can drag the screen up again.
Like most amiga like OSs the audio and networking need to be setup manually
Audio AHI prefs - Mode settings tab - needs both Music unit and Unit 0 set to RPiHDMI:16 bit stereo++ or RPiPWM:16 bit stereo++ at 44100Hz. Press '''Save or Use''' button after each choice
For wireless, please use the Wifi prefs and already selected device bwfm.device. Press Scan and double right click on the router and enter password. You may need to setup after every power off
*if asking for password again - press cancel and go to Network Prefs, Wireless Networks tab and highlight the router line and hit the remove button and press the cancel button. Retry with Wifi prefs again
*...waiting for an address - Disconnect and try Connect
Until, Connected to <router> - 192.168.x.x
For lan ethernet port, please use Network prefs and the following hardware is
*lan9514 Pi3b Pi2 not supported at the moment
*lan7515 Pi3b+ type into Device usblan78xx.device as net0: remove other device(s)
*bcmgenet Pi4 Pi400 choose for Device bcmgenet.device
*cdnsgem Pi5 Pi500 Pi500+ RP1 i/o for cadencegem
(network prefs may forget random information when rebooted)
Summary
<pre>
*3b ethernet not supported, usb ethernet not working but wifi prefs setup works
*3b+ wifi working and ethernet works
*4 untested
*400 wifi and ethernet untested
*5 wifi and ethernet untested
*500 wifi and ethernet untested
*500+ wifi works
</pre>
Type in 'aarch64' in the [https://archives.arosworld.org/index.php?function=search&tool=simple search box] and you will see available software packages / apps. apkg can be used to inspect and install applications.
[http://archives.arosworld.org/index.php?function=browse&cat=network/browser amelinium web browser (JS 1.6 ES9 ECMASCript 2018)] is available with an [https://eab.abime.net/showthread.php?t=122494&page=80 eab thread] reminiscent of [https://github.com/zapek/Voyager Voyager] and to a lesser extent [https://github.com/amigazen/aweb3/ Aweb JavaScript 1.5 (ECMAScript 3)] as css and javascript websites can be slow to load or resolve (no JIT) and nothing from facebook, reddit etc.
Press Cancel at screenmode selector or -wb argument to get windowed version. You could use the Shift + Del shortcut or mouse wheel should work to delete all text at once. Html5test gives 189 (1.29), 300 (1.31), 301 (1.39) out of 555, some bigger Amiga like browsers are around 370+ but it does less better.
You may have to delete the cache (Menu -> Page -> Delete cache) to fully retest big Amelinium updates or free up space.
Be aware [https://pianetaamiga.it/en/reportage-pianeta-amiga-2026/ some site pages] can use up hundreds of MBs of cache very quickly
DNS lookup failed... close browser and reboot and setup wifi again - repeat until it works again
youtube video and audio - js button for javascript must be on/shaded - Settings -> Soundoutput - AHI
Any restriction to lower resolutions is due to [https://docs.invidious.io/faq/#q-where-are-the-360p480p1080p-quality-options bandwidth]. Either CPU/GPU, internet speed and/or video quality. Pi3 can expect 480p (wifi) to 720p (ethernet). Pi4 expect (wifi) (ethernet).
Telegram https://t.me/s/channel_name for public messages from vamped_amiga chatamigagames demoscenecracktros
*art local js apps like dpaint.js
There is normally no Bluetooth support for most amiga like OSs but Aros has one [https://github.com/aros-development-team/AROS/commit/6942cbfbf66426d21963a7fcd8aba6aff611a9e0 work in progress] [https://github.com/RPi-Distro/bluez-firmware/tree/pios/trixie/debian/firmware/broadcom firmware]
*Bluetooth 4.1 BCM43430A1.hcd Pi3B, Pi3A, Zero 2W
*Bluetooth 4.2 BCM4345C0.hcd Pi3B+, Pi4
*Bluetooth 5.0 BCM4345C5.hcd Pi4B rev, CM4 and maybe Pi5 and CM5
<pre>
*bthid keyboard mouse support
*btserial serial
*btpan short range wireless connecting devices
</pre>
Only the Pi5 has a RTC real time clock, the other Pis will need to use ntp services [https://github.com/aros-development-team/AROS/commit/29cd4116330dc7f692d90757eacc59fb3f31ae70 sntp] with time.cloudflare.com pool.ntp.org or Cloudflare 162.159.200.1, 162.159.200.123, 2606:4700:f1::1, 2606:4700:f1::123 or [https://github.com/bohunamiga/PiNTP PiNTP -s goodtime.ijs.si or ntp1.ptb.de] to get the date and time from the internet. Can use date in a shell e.g. date 24-Dec-2026 23:59:59 but this will need to be done again after every reset/power off. Maybe [https://github.com/aros-development-team/AROS/commit/28674a157bc56175aa668e7b62dca6fa740578dc ds3231 rtc with dtoverlay=i2c-rtc,ds3231 in config.txt]
It helps to have all usb devices already plugged in before power on to detect at the moment. Even then some usb devices will freeze the mouse cursor and the only resolution is to remove the offending usb device and reinsert. Sometimes, the reinsert leads to the mouse cursor vanishing, it is still there and responds to left mouse clicks, top of the screen and pull down the screen.
USB classes support from Prefs/Trident is still work in process
*usbaudio working on usb3 port (blue) on pi4, 400 but not working (no rt isochronous) on usb2otg (white or black) for pi3b, zero 2w
*[https://aminet.net/package/mus/midi/camd camdusbmidi] detects midi devices without a preferences file (Prefs/Env-Archive/sys/midi.prefs) as [https://www.youtube.com/watch?v=RBxHkwy4Nrw auto setup now] possibly with [https://github.com/metaneutrons/mt32-pi metaneutrons mt32-pi] [https://github.com/rtzor/mt32-pi mt32-pi fork] [https://github.com/ahmadexp/mt32-pi fork] [https://github.com/gmcn42/mt32-pi-control control of] [https://github.com/dwhinham/mt32-pi mt32-pi pi3+]. Alternative of [https://homspace.nl/samplerbox/ SamplerBox].
Will need developer clang gcc tools to look at 64bit ports of [https://archives.arosworld.org/?function=showfile&file=driver/audio/usbmidi.i386-aros.lha usbmidi], [https://aminet.net/package/mus/midi/CAMD_Toolkit CAMD_Toolkit], [https://aminet.net/package/mus/midi/camdtools camdtools], [https://github.com/cnvogelg/amiditools amiditools], [https://github.com/timoinutilis/midi-sequencer-amigaos horny src], [https://aminet.net/package/mus/midi/horny-base horny-base], [http://bnp.hansfaust.de/index.html BnP], [https://arosarchives.os4depot.net/?function=showfile&file=audio/misc/timidity.lha timidity],
Regarding 680x0 emulation, there are several options (not implemented yet) that could be considered
*[https://github.com/aros-development-team/AROS/blob/6722a0ae9e03fe5d26e32703360bd2059e0864cc/rom/m68kemu/README.md?plain=1#L424 m68kemu.library] for some Amiga productivity where the cpu is emulated and the system calls are redirected to Aros ones
*[https://github.com/BlitterStudio/amiberry amiberry] (winuae) for everything else like games
*[https://github.com/jonx/AROS/tree/aarch64-darwin-graft/arch/all-darwin/libs/emu68k emu68k]
*[https://scriptedamigaemulator.net/ Scripted Amiga] with [https://github.com/naTmeg/ScriptedAmigaEmulator ScriptedAmigaEmulator] or older [https://github.com/gbraad-amiga/ScriptedAmigaEmulator2 ScriptedAmigaEmulator2]
Hopefully getting Pi3 up to 25Mhz 68040 (non JIT) and 50Mhz 68040 (JIT)
Pi4 maybe getting up to 50Mhz 68040 (no JIT) and 100Mhz 68040 (JIT)
[https://pinout.xyz/ GPIO 40 pins] [https://learn.sparkfun.com/tutorials/raspberry-gpio/gpio-pinout pinout]
Some exceptions:
*Physical pins 27, 28 (GPIO0, 1) are an internal I2C bus and should not be used
*The other I2C on pins 3, 5 (GPIO 2, 3) can be used generally, but be aware they have permanent pull-up resistors to 3.3V
*For MIDI use USB but there are dedicated UART pins 8, 10 (GPIO 14, 15).
With a HAT it's more awkward -- you need to know which pins are used by the HAT and avoid them. Hopefully this will be documented.
Remember all GPIOs are 3.3V (not 5V tolerant), floating/noisy inputs can cause odd behavior, and that shorting the power supplies can cause instant death of the Pi.
In the shell (Cntrl + C to end)
GPIO PIN/A/N,SET/N,GET/S,MODE/K,PULL/K
Controls and queries hardware GPIO pins via gpio.resource which is stored in the rom or Devs/ '''please test'''
*PIN -- (Required) Target GPIO pin number (e.g. 12).
*SET -- Set pin output value to 0 (LOW) or 1 (HIGH).
*GET -- Read and print current digital input level (0 or 1).
*MODE -- Configure pin mode: IN (Input), OUT (Output), ALT (Alternate).
*PULL -- Configure pull resistor: NONE, UP, DOWN.
EXAMPLES
<pre>
GPIO 12 MODE OUT
GPIO 12 SET 1
GPIO 12 GET
GPIO 13 PULL UP
</pre>
[https://gpiozero.readthedocs.io/en/stable/installing.html Current] [https://gpiozero.readthedocs.io/en/v1.2.0/api_boards.html old support for gpiozero is unknown at present] [https://energenie4u.co.uk/res/pdfs/ENER314%20UM.pdf and associated 433MHz equipment] [ USA X10 security and lights via USB] [ OpenHab with Shelly Smart Plug connected over Wi-Fi, controlled by MQTT or HTTP]
Printing only with Postscript but [https://github.com/bohunamiga/MintPRINT one] of [https://github.com/boingball/MintPRINT two] [https://github.com/Andiweli/AmiAirPrint/tree/main AirPrint] IPP has been attempted with [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2061&pid=13954#post_13954 discussion]
Youtube
[], [], [https://www.youtube.com/watch?v=X4fmWAIv7FE Aros native on Pi3b],
[], [], [https://www.youtube.com/watch?v=TSxlYb1eQWU Installed on Pi3b+],
[], [], [https://www.youtube.com/watch?v=NFF1H3jCoz8 testing Aros native on Pi400],
[], [], [https://www.youtube.com/watch?v=nIVx7mh1E1Q&pp=ygUHYXJvcyBwadIHCQkTDAGHKiGM7w%3D%3D Aros on Thumb 2 based 32bit-ish ARM STM32H743 board],
[https://www.youtube.com/watch?v=zQM4CD64xDE&t=612s&pp=ugUEEgJlbg%3D%3D Performance under Linux] but on Aros...
{| class="wikitable sortable" width="90%"
! width="10%" |Pi
! width="10%" |Single Core 2D
! width="10%" |Single Core 3D
! width="10%" |Single Core 3D
! width="10%" |SMP 2D
! width="10%" |SMP 3D
! width="10%" |SMP 3D
! width="35%" |Comments
|-
| <!--Pi-->Pi3
| <!--Single Core 2D-->
| <!--Single Core 3D-->
| <!--Single Core 3D-->
| <!--SMP 2D-->
| <!--SMP 3D-->
| <!--SMP 3D-->
| <!--Comments-->
|-
|}
==== 32bit ====
For the Pi1 Pi2 Pi2B the status of AROS native ARMv6 for 32bit RasPi was OK. System booting, USB working (although with some issues but plans to fix them). 32bit native [http://www.aros.org/nightly1.html ARMv6 32bit nightlys] raspi-armhf-system raspi-armhf-contrib unbz2'd to fat32 microSD
===Hosted===
AArch64 CPU backend for AROS, a Cocoa/Metal display, clipboard / host-volume / CoreAudio / BSD-sockets bridges, GPU 2D via gpufx.library, a 68k→AArch64 JIT (run68k), and a full Rust std port. On [https://www.jkn.me/blog/macaros-aros-on-apple-silicon/ latest Apple Silicon] [https://github.com/jonx/Macaros early buggy alpha version of hosted Aros .dmg on MacOS12+]. Please use [https://github.com/jonx/Macaros/issues MACAros github] for issues, features etc and possibly [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2030&pid=13910#post_13910 here]
[http://www.aros.org/snapshots1.html old linux and android hosted 32bit]
==== Hosted ====
=====64bit=====
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80&pid=13667#post_13667 Ubuntu Linux PC hosted Pi compiler build]
[https://github.com/BlitterStudio/aros-compiler-docker Docker based cross compiler for various Aros systems],
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80 From the Aros Raspberry pi 3 64bit thread]
Instructions on building 64-bit Raspberry Pi AROS and cross-compiler from sources.
You will need:
- Ubuntu 24.04 or 26.04
- qemu-system-aarch64 installed
- Internet connection
- rpi-scripts.tar.gz downloaded (https://axrt.org/download/aros/rpi/rpi-scripts.tar.gz)
1) Install prerequisites:
sudo apt install git gcc g++ make gawk bison flex bzip2 netpbm autoconf automake libc6-dev liblzo2-dev libpng-dev gcc-multilib byacc python3-mako cmake yasm curl nasm
2) Clone sources
cd <project-directory>
git clone https://github.com/aros-development-team/AROS.git --recurse-submodules
3) Extract rpi-scripts.tar.gz. Copy all files into your project directory so that you have:
AROS (the directory with cloned sources)
fix-dotdot.py
rebuild.sh
recreate-sdcard.sh
run-qemu.sh
update-sdcard.sh
4) Run ./rebuild.sh. Select option 1) toolchain-core-aarch64
This will execute process of building a cross-compiler. During this process packages will be downloaded from Internet. This process can take up to 2 hours. If there are some missing dependencies, install them with 'sudo apt install' and restart this step.
5) Run ./rebuild.sh again. Select option 2) core-raspi-aarch64
This will build system files for 64-bit Raspberry Pi AROS. This process can take around an hour.
6) Run ./recreate-sdcard.sh
This will create an sdcard.img file with contents of previous step.
7) Run ./run-qemu.sh
This will start QEMU with SD card image and ROM images. It will boot into AROS.
=====32bit=====
Ubuntu VM approach to compiling [http://lallafa.de/blog/2013/06/building-aros-hosted-for-raspbian/ Linux hosted AROS June 04, 2013]
../AROS/configure --target=linux-armhf --enable-includes=/usr/arm-linux-gnueabihf/include --x-includes=/usr/arm-linux-gnueabihf/include --x-libraries=/usr/arm-linux-gnueabihf/lib
arm-elf- is symbol-linked to arm-linux-gnueabi- (arm-linux-gnueabi- is more correct in this case, because it's going to be compiling the ARM AROSBootstrap for ARM Linux)
*armel - many of the "android" machines require since the entire OS is made for soft float VFP.
*armfp - Efika MX target, Raspberry PI, EfikaMX, Pandora and virtually everything (VFP)
Keep in mind it's possible to start hardfp AROS hosted on softfp system, though, as long as no calls between AROS and host require floating point parameters. NOTE: hardfloat objects *cannot* be linked with softfloat objects - they have a different ABI.
Just keep in mind the arm nightly build machine is quite complex beast. It needs the x86_64 host compiler to compile AROS tools. The arm version is built every night using gcc-4.6.2 crosscompiler (built together with AROS) and successfully builds armel and armhf linux hosted targets.
*needs an AROS code compiler for ARM target
*as well as unix compiler for ARM linux host (would be best to have both softfp and armhf, we have softfp only now) with full set of libraries and includes.
with—disable-crosstools $AROS_CC is always a wrapper around $KERNEL_CC ? If so, this is wrong for some ports. This can break Darwin, Windows and Android port.
Yes, Android port will build. And even work. But it's not good because the port will not be ABI-compatible with other ARM ports. Android's ABI is different from GNUEABI. For example:
<pre>
enum test {foo, bar};
enum test testvar;
</pre>
sizeof(testvar) will be equal to sizeof(int) in GNUEABI (Linux and AROS) and sizeof(short) on Android. This affects linking objects from static linklibs, for example.
Previously everything worked because $AROS_CC was a wrapper on top of $HOST_CC. And a real crosscompiler was used on non-ELF hosts.
Android is the same. $KERNEL_CC is incompatible with AROS.
compiler=kernel is appropriate _ONLY FOR CODE WHICH RUNS ON HOST OS_ (or barebone hardware, if we talk about native). This includes bootstraps, their linklibs, and host-side dynamic libraries (Windows makes extensive use of them because of architectural considerations.
No single AROS object should be compiled with this setting. $KERNEL_CC is really compatible with AROS *ONLY IN LINUX-HOSTED* and no more. On other systems (Darwin, Windows, Android) this is not true any more, and compiler=kernel is never going to work.
If you want to compile your AROS module against host OS includes, append the following to USER_INCLUDES (or USER_CFLAGS, this is effectively the same):
-isystem $(GENINCDIR) $(KERNEL_INCLUDES)
$(KERNEL_INCLUDES) expands to:
-isystem <your_os_includes> -isystem <host_OS_gcc_private_includes>
-nostdinc
This makes AROS compiler adhering to host OS APIs.
If you want some preprocessor symbols based on what your host OS actually is, add something like -DHOST_OS_$(AROS_HOST_ARCH).
Why is there $(GENINCDIR) at all? Because host OS has its own libc includes, which would conflict with AROS ones. And the host OS libc is not binary-compatible with AROS one.
Why doesn't Windows-hosted port use $(KERNEL_INCLUDES) ? Because WinAPI includes conflict with AROS ones in fundamental typedefs, like WORD, BYTE and BOOL. It's almost impossible to deal with this in any other way than rewriting WinAPI definitions using AROS types.
Building under centos 6.3 (i386) currently, and AROS creates the toolchain itself. haven't yet committed the necessary changes but "./configure --target=raspi-armhf" is enough to start, then "make arosboot-raspi" will generate arosraspi.img (containing the bootstrap, kernel.resource, and exec.library) as well as arosraspi.rom (containing all the other essentials components such as dos, graphics etc). It will also copy over a config.txt file to make the raspi bootstrap code load the correct kernel, and a cmdline.txt that enables exec debug output.
*armel = typically Debian 6, Ubuntu Maverick, Android,
*armhf = typically Debian 7, Debian 8, Ubuntu Precise,
Cross-compiling Ubuntu ARM softfp
<pre>
sudo sh
echo 'foreign-architecture armel' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armel] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armel.list
apt-get update
apt-get install gcc-arm-linux-gnueabi libx11-dev:armel libsdl-dev:armel
</pre>
<pre>
./configure --target=linux-arm --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabi/include
</pre>
Cross-compiling Ubuntu ARM hard-float
<pre>
sudo sh
echo 'foreign-architecture armhf' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armhf] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armhf.list
apt-get update
apt-get install gcc-arm-linux-gnueabihf libx11-dev:armhf libsdl-dev:armhf
</pre>
<pre>
./configure --target=linux-armhf --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabihf/include
</pre>
Now, the AROS build is configured properly and all you need to do is:
make
==Build==
===64bit===
[https://github.com/aros-development-team/AROS/blob/7016ce28bfdb754182edb16011c98faaf5413c29/arch/aarch64-raspi/boot/mmakefile.src#L180 boot makefile]
===32bit===
# download/checkout the source someplace, e.g. /build/AROS-Src/
# make a directory to store external sources AROS downloads, e.g. /build/Ports
# make a build directory, e.g. /build/aros-raspi-armhf
# cd into the build dir, configure, and then run make -:
<pre>
>cd /build/aros-raspi-armhf
>/build/AROS-Src/configure --target=raspberrypi-armhf --with-serial-debug --enable-ccache --with-portssources=/build/Ports
>make
>make arosboot-raspi
</pre>
then copy the files from /build/aros-raspi-armhf/bin/raspi-armhf/AROS/ onto an sdcard, and download/copy the Raspi firmware files onto it.
You should then be able to boot the sdcard on your RasPi.
The current W.I.P tree to svn. it can be built as follows ..
<pre>
./configure --target=raspi-armhf
make arosboot-raspi
</pre>
That will generate arosraspi.img, arosraspi.rom and config.txt in bin/raspi-arm/AROS - so either copy just those files to a fat formatted SD card (with the firmware files on), or copy the whole contents of the AROS folder.
NB - if you have a Linux/other install, backup the existing config.txt first
arosraspi.img contains the bootstrap (which has very basic mailbox code, framebuffer/gpio init, and console "emulation" via code pinched from our libbootconsole), kernel.resource, and exec.library
arosraspi.rom contains all the other components needed to boot AROS.
The config.txt file will tell the RasPI bootstrap to load the arosraspi kernel and ramdisk (rom).
the bootstrap has minimal mailbox code, planning on adding either a resource or library that driver/app code will use to access it (likewise for GPIO)
Help building AROS hosted on Linux ARM
Was looking a way to use more my Handheld ARM based called Pyra (Dragonbox Pyra) an ARM (Omap5 cpu with 4GB ram) linux based machine (Debian Buster v10 with kernel 5.6.19 adapted) and have a try to compile the latest Aros sources by Deadwood directly on this device.
Compilation stops after build libpopupmenu.a and trying to build libatomic have this error:
<pre>
Configuring build in bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
configure: WARNING: unrecognized options: --disable-nls, --without-x
checking for --enable-version-specific-runtime-libs... no
checking for --enable-generated-files-in-srcdir... no
checking build system type... arm-unknown-linux-gnu
checking host system type... arm-unknown-aros
checking target system type... arm-unknown-aros
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for arm-aros-strip... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-strip
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for arm-aros-gcc... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-gcc
checking whether the C compiler works... no
configure: error: in /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic':
configure: error: C compiler cannot create executables
See config.log' for more details
make[2]: *** [mmakefile:4489: /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic/.configured] Error 77
[MMAKE] make --no-print-directory TOP=/media/farox/pyra2/arosbuilds/toolchain-core-armhf-build SRCDIR=/media/farox/pyra2/arosbuilds/AROS CURDIR=tools/crosstools/gnu TARGET=tools-crosstools-gcc-libatomic-configure -s --file=mmakefile tools-crosstools-gcc-libatomic-configure failed: 512
[MMAKE] Error: Error while running make in tools/crosstools/gnu: No such file or directory
make[1]: *** [Makefile:361: linklibs-libatomic] Error 10
make: *** [Makefile:183: crosstools] Error 2
</pre>
looking at config.log on arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
found that arosbuilds/toolchain-core-armhf/arm-aros-ld: cannot find -laeabi
so do make linklibs-aeabi-arm-quick
and the missing lib was built.
now the next stop is at
fatal error: bits/libc-header-start.h: No such file or directory
and
fatal error: sys/cdefs.h: No such file or directory
in many places so after checking that have this missing include files i have noted that my include path is a bit different, standard searching path is /usr/arm-linux-gnueabihf but in my system is /usr/include/arm-linux-gnueabihf
so if i add my path to some mmakefiles compilation goes on....but is a better way to add this path to avoid every mmakefiles to be changed?
fixed with adding
-I/usr/include/arm-linux-gnueabihf
to where is missing on mmakefiles like
USER_INCLUDES := -isystem $(GENINCDIR) -I/usr/include/arm-linux-gnueabihf $(KERNEL_INCLUDES)
P.s. I have changed many mmakefiles and have at least compiled (after many hours) the toolchain doing make every time in arosbuilds/toolchain-core-armhf-build (also have to disable making tests under cplusplus but don't remember the directory ...) but ask an help to have an automated way to correctly build without modify mmakefiles.
Last time built armhf target was around 2 years ago. At that point built is via cross-compilation from linux (ubuntu 22.04) using linux armhf crosscompiler (this can explain the path differences you are experiencing) as well as using AROS gcc cross-compiler in version 6.5.0 (build with option 21) in rebuild.sh). Since then AROS GCC has been updated to 10.5.0 and don't believe anyone tried to build the armhf target again.
My suggestion would be to downgrade GCC to 6.5.0 (via editing AROS/config/gcc_def file) and try to first build using cross-compilation from x86_64 linux. Once that works, you will have a "template" to compare to native compilation under arm linux.
Thanks for your suggestion...but think the toolchain with GCC 10.5.0 is compilable if i found a way to pass the path of my system to the script that build (option 21 on rebuild).
The other only changes are (but don't know where to modify...) is to add the build of libaeabi and disable the building of some tests under cplusplus that use exceptions and is not supported under ARM. try to crosscompile with my Linux amd64 PC.
For paths look into core-linux-armhf/bin/linux-armhf/gen/config/target.cfg. A number of build-wide variable is set there containing paths to local build system. These variables and the target.cfg file are generated by AROS ./configure script.
Thanks compilation now go forward...changed target.cfg under "toolchain-core-armhf-build/bin/linux-arm/gen/config" and do make on "toolchain-core-armhf-build" dir.
Need to find where to enable build libaeabi.a so can build the entire toolchain with option 21 of rebuild.sh
Found something that looks like libeabi in AROS/arm-all/arm-aeabi/mmakefile.src. Try adding a third line there:
#MM- linklibs-armhd : libklibs-aeabi-arm
Don't remember needing this library. Possibly the 6.5.0 GCC somehow does this while 10.5.0 is missing this.
Try adding this line (and the variant "linklibs-armhf" instead of hd) but it did not solve the automatic building of the missing lib. I must do "linklibs-aeabi-arm-quick".
Anyway after have build the aeabi lib i succefully built the toolchain (after many hours...). Smile
To test I restarted from selecting option 21 (on rebuild.sh) but after many hours i get the same error of the kernel includes not found...maybe i need to modify the configure script for my case.
With the toolchain built i try to build the core-linux-armhf (DEBUG) (option 22) but after a while it stopped with
"cannot find -laeabi " so i made it built manually...and now i can continue compiling...i'll let you know if all goes ok.
== Hardware ==
===64bit===
====BCM2712====
With the Pi5
Broadcom VideoCore 7 vc7 is an integrated GPU with 12 cores and up to 800 MHz clock. VideoCore VII is capable of OpenGL ES 3.1 and Vulkan 1.2. The driver support for the Raspberry Pi continues to build upon the [https://lore.kernel.org/dri-devel/20230928114532.167854-1-itoral@igalia.com/ open-source V3D driver] stack within [https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25450 Mesa] hopefully be merged for Mesa 23.3. x265 HEVC accelerated untested, x264/h.264 and VP9 cpu only.
*Raspberry Pi M.2 HAT+ Expansion Board
*Geekworm X1001 PCIe to M.2 Key-M NVMe
*Geekworm X1003 PCIe to M.2 HAT NVMe SSD PIP Board for Raspberry Pi 5
*Pineboards Pi Hut HatDrive! M.2 HAT 2024/V4
*Hat+ Gen2 Gen3 Nvme
*GeeekPi 52Pi N04 for Raspberry Pi 5 NVME M.2
*
*2024 RPI AI HAT - Hailo 20TOPs no LLMs
*2026 RPI AI HAT+ 2 - Hailo 40TOPs slightly better?
[https://www.raspberrypi.com/documentation/accessories/camera.html Cameras for Pi]
*Raspberry Pi camera module, the V3 with Sony IMX708 back-illuminated CMOS 12 Megapixel sensor
*Raspberry Pi Camera Module V2 – 8MP Sony IMX219 Sensor
*Raspberry Pi camera Rev 1.3, 5MP 1080P OV5647 image/video module, 2592 x 1944 pixels
====BCM2711====
With the Pi4 an ARM a72 cpu is about x3 times the size of an a53 in the Pi3
the 2711b line used more power when idle, compared to the 2711c
*2018 Raspberry Pi PoE HAT Power Over Ethernet Hat - design issues
*2020 Raspberry Pi PoE+ HAT Power Over Ethernet Hat Pi3b+ Pi4 only - better design
*Waveshare PoE HAT (B) with cooling fan for Raspberry Pi 3B+/4B 802.3af PoE
*[https://github.com/axizo-pi/V3DLib vc6 V3D 4.2] is derived from [https://docs.broadcom.com/doc/12358545 vc4], but it is [https://docs.mesa3d.org/drivers/v3d.html significantly different]
The QPU pipeline stays mostly the same, you still have an add ALU and a multiply ALU and it can issue two ALU OPs per cycle. There is still 4 SIMD lanes, interleaved over 4 cycles.
The instruction encoding for the QPUs is different, but the core instructions are the same.
Instructions for packed 8 bit int math has been dropped, along with most of the pack modes.
Instructions for packed 16bit float math has been added (2 floats at in a single operation)
With vc5/vc6, you write two packed 16f value to the tilebuffer (or four writes of 32f, if you are using the rgba32f framebuffer). And there is a handy vfpack operation which allows you to pack two f32s into a single 32bit value in a single instruction. You can vfpack directly into the tile buffer register.
the multiply ALU can now fadd, so you can issue two fadds per instruction. the add ALU has gained a bunch of new instructions
the A and B register files have been merged. You still only get an A read and a B read per instruction, but they read from one big register file (which means the underlying memory block has gone from two sets of "one read port, one write port" to one "two read ports, one write port" block)
The theoretical max FLOPs per QPU remains the same at two per cycle, other than the bump from 400mhz to 500mhx but it looks like a lot of effort has been put putting those theoretical FLOPs to better use.
*vc4 could run one or two threads per QPU. When you ran in two thread mode, the available register file halfed to 32 registers.
*vc5 added a four thread per QPU mode, with 16 registers per thread.
*vc6 doubled the size of the register file. You could now use all 64 threads in two thread mode and 32 registers in for thread mode. Single thread mode was removed, you always have at least two threads.
With the threading improvements, the QPUs should spent much less time idle waiting NOPs for memory requests. Most of the design changes have gone to improving the fixed function hardware around the QPUs. A fixed function blend unit has been added, which should reduce load on the QPUs when doing alpha blending. hope software blending is still possible
The tile buffer can now store upto 4 render targets (up to 128bits per pixel, so if you are using 4 32bit render targets, you can't have a depth buffer)
A MMU, allowing a much simpler/faster kernel driver.
Many more texture formats, framebuffer formats.
h264/x264 as Pi3
All the features needed for opengl es 3.0
H.265 / HEVC decoder is a HEVCv2 Main 4:4:4 10 design supporting bitstreams up to profile 5.1
HEVC hardware decode supports 4kp60, 10-bit. Audio output is pretty much unchanged, but the HDMI audio channels now support 8x192kHz bitrates
Each ALU typically have 2 floating point operators, and as you pointed out in a earlier post videocore 6 is no exception, with both a multiply and additive floating point operator. Thus theoretical GFLOPs are calculated with both operators in mind. That is what the 2 in my formula represents, and is common across any modern programmable shader, whether you calculate Nvidia, AMD, Intel, Boardcom or any other company's GPUs. Total ALUs * 2 * GHz clock = GFLOPs, In the case of Raspberry Pi 3, it's 24 ALUs * 2 operators * 0.4GHz = 19.2GFLOPs
If the Videocore 6 does indeed only have 16 ALUs (16 * 2 * 0.5GHz), you'd have only 16GFLOPs but they are better utilised
Possible maximum performance
<pre>
VideoCore IV @ 250MHz: 250 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 24 Gflop/s
VideoCore IV @ 300MHz: 300 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 28.8 Gflop/s
VideoCore VI @ 500MHz: 500 [MHz] x 2 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 32 Gflop/s
</pre>
Faster LPDDR4 memory.
====BCM2837====
With the Pi3
* Broadcom BCM43438 chip provides 2.4 GHz 802.11n wireless LAN, Bluetooth Low Energy, and Bluetooth 4.1 Classic radio support, 3B+ [https://github.com/aros-development-team/AROS/commit/afa5bc0bb17d5dd06bcfdbac00853a3799ca8d76 LAN7515]
The overclock ability has diminished with each chip version as the energy usage has increased. BCM2837 is one of the warmest yet and benefits from active fan cooling if all four cpu cores are in use for a short while. Video playback maybe affected due to the lack of custom support in the GPU with Aros. 5 V / 2.4 or 2.5 amp power supply recommended if all four cpu cores are running, else throttling (cpu slowdown) might occur.
[https://github.com/hermanhermitage/videocoreiv/wiki/VideoCore-IV-Programmers-Manual Dual VDP] and scalable QPU in [https://docs.mesa3d.org/drivers/vc4.html VC4] and x.264/h.264 accelerated untested only and VP9 on cpu or neon help
ARMv8-A has [https://developer.arm.com/documentation/102412/0100/Privilege-and-Exception-levels privilege levels] where userspace typically runs at ‘EL0’, the kernel at ‘EL1’ or ‘EL2’ and the firmware at the highest level ‘EL3’.
===32bit===
=== Core Kernel ===
====BCM2708(family)====
which includes the [http://elinux.org/RPi_Hardware BCM2835] (ARM1176JZF-S 700 MHz CPU + VideoCore IV GPU + up to 1GB RAM)
*Framebuffer (fb) using mailbox
*IRQ scheduler, etc
*Arasan based SD Card controller
*Synopsis DesignWare USB 2.0 OTG controller [http://networkdirection.net/index.php?option=com_content&view=article&id=106:rasperry-pi-usb-controller&catid=45:raspberry-pi&Itemid=54 Unofficial DOCS pdf], [dwc_otg.c FreeBSD], [], [https://www.riscosopen.org/viewer/view/mixed/RiscOS/Sources/HWSupport/USB/Controllers/DWCDriver/ RiscOS USB Driver], [https://www.riscosopen.org/forum/forums/5/topics/878 RiscOS USB Discussion], [https://www.riscosopen.org/forum/forums/11/topics/1893 Other USB RiscOS], [http://plan9.bell-labs.com/plan9/index.html Plan9 Miller's usb] http://plan9.bell-labs.com/sources/contrib/miller/, [https://github.com/Chadderz121/csud CSUD driver],
*[http://www.smsc.com/media/Downloads_Public/Data_Sheets/9512.pdf SMSC 9512] USB LAN/Hub chip
*CMOS RAM
*VCHIQ port which sends messages to the GPU e.g. for mouse, keyboard, audio on HDMI, etc
*Audio Driver
*Serial Peripheral Interface Bus (SPI)
*[http://www.susa.net/wordpress/2012/06/raspberry-pi-pcf8563-real-time-clock-rtc/ I2C registers]
*I2S
*Universal Asynchronous Receiver Transmitter (UART)
*[http://elinux.org/RPi_BCM2835_GPIOs GPIOs] and [http://www.adafruit.com/blog/2012/08/17/broadcom-bcm2835-peripheral-memory-map-and-gpio-alternate-use-chart-piday-raspberrypi-raspberry_pi/ Alternative view of GPIO]
BCM2836
* For Pi B+, PI 2 and Pi 3 SMSC LAN9514 chip adding 10/100 Ethernet connectivity and four USB channels to the board
*[http://www.andrewscheller.co.uk/rpi_pcb_modules.html PCB], [http://elinux.org/RPi_Low-level_peripherals Low level features],
Implemented so far...
# Modify the configure system so that it correctly builds for the arm hardware float raspi target.
# Implemented the bootstrap to load the aros modules and prepare the arm to jump into them. Reworked the x86 console support so that parts can be stolen for raspi to use since t has no basic functionality to output to the display.
# Implemented a kernel.resource to prepare the raspi for running aros and provide the low level api calls to expose available resources and allow exec, etc function.
# Implemented serial debug support
# Implemented the exec (and kernel) functionality required to make multitasking work (and interrupts, exceptions, syscalls, etc)
# Implemented a timer.device to utilise the hardware timers.
# Implemented a very basic gfx driver to expose the hardware's framebuffer.
# Implemented an SD-Card driver for AROS which presently only supports the raspi's chipset but can easily be modified to support all sd-card hardware and media.
# Fixed the fat filesystem support in AROS so that it can boot on RasPi's normal SD-Card setup. The "rom" image files needed use a different filename than the default linux, etc images so can be easily installed without harming the existing files - you only need to change the loaded images in the config file to get aros to boot.
# Updated the build scripts to automatically download the necessary raspi firmware files and wrap it all up so that you can simply extract the archive to a fat formatted sdcard and boot it on the raspi without having to get anything else.
# fix everything in contrib and ports to build for raspi (needs proper testing/fixes but allows every component to actually compile at least, including owb) + numerous other fixes to get things working on arm/raspi ..
Improvements...
# Implement a USB chipset driver "OR" finish the existing one [https://github.com/aros-development-team/AROS/commit/c07d13c724f944674be5db54fc6a71ee72a01809 usb otg] - the current code is mostly a skeleton that should initialise the chipset and then needs relevant code to support the different transfer types. It also has the "virtual" hub code in place to represent the raspi's USB port (from poseidons p.o.v)
# Implement a driver for the USB NIC (a few weeks - depends on USB above)
# Write an [https://github.com/aros-development-team/AROS/commit/d55d0f74d20b769bbb8c8d386e5c1d7a9154f05a audio driver] (a few weeks - independent of USB) and [https://github.com/aros-development-team/AROS/commit/e93a4c245f27a87c9c4c1d39206694b39059998a HDMI]
# fix syscall bug in the current raspi kernel code
# Graphics depend on having a decent "bcmdma.resource" implemented as to use the cpu's dma engine. The sd card driver needs to use it for transfers to/from the controller - and the gfx system needs to use it for "blitting".
# [https://github.com/aros-development-team/AROS/commit/4019d84e4975d4dad987a12d57fe108f5ac048e6 Improve the gfx driver], [ vc4gfx HIDD] add [http://dri.freedesktop.org/wiki/VC4/ Gallium3D support]
# [https://github.com/aros-development-team/AROS/commit/b13905b3e8e45b089f520b44692c81affddd066f Improve] the [https://github.com/aros-development-team/AROS/commit/3a876755c070f5c73c4f53c7f4d35b4f923088b9 sdcard] device driver - which is also pretty basic but should work with most cards, rework it to also support pci, etc. sd card interfaces on x86
# The current code using very rudimentary access to the gpio interface - so that should be implemented as some resource for other components to access, as-well as the i2c interface exposed over the gpio interface. that should have a hidd class implemented which uses the gpio resource to communicate.
Boot up typical for most other OSs before the open sourcing of many binary blobs from 2017 onwards
On power-up, the rpi [http://www.open.com.au/mikem/bcm2835/ BCM 2835] [https://github.com/hermanhermitage/videocoreiv VideoCore4] GPU, not the ARM CPU, is in control, and the SD card slot is the only peripheral device with power. The firmware burned into the BCM2835's VideoCoreIV GPU PROM requires a DOS-style partition table; a FAT-formatted first partition; and the freely redistributable but closed sourced Broadcom files “bootcode.bin” and “start.elf” in that partition.
The boot sequence carries out several pre-boot tasks
*On powering of the rpi, the GPU reads and executes bootcode.bin, which then loads start.elf
*The GPU loads the “start.elf” file, eventually, into the L2 cache and then executes it
*configures the memory split for the CPU and GPU
*reads and parses “config.txt” from the same partition on the SD card and applies the settings (like a PC’s BIOS settings)
*loads the “kernel.img” file, again from the same partition
*activates the CPU to begin executing the loaded kernel image
The CPU/GPU memory split is hard-coded into start.elf, so Broadcom provides three start.elf images, to give 32M, 64M, or 128M to the GPU for multimedia performance, and the remainder to the CPU.
RPi uses [https://github.com/raspberrypi/firmware some closed source loaders] and at some point it loads a binary blob named "kernel.img" at 0x8000, at that point there would be a rudimentary Aros alive. If one wants to use the SD-card then there would have to be a driver for the interface and a fat filesystem handler (SD-card has to be formatted to fat filesystem)
Boot code and kernel are now linked together and made into that binary blob, just for starters. Raspberry Pi uses [http://kernelnomicon.org/?p=133 u-boot] and [http://kernelnomicon.org/?p=138 UBoot] as bootloader, there's already some code in the Efika MX port for that. UBoot is a native bootloader and not just for the raspberry pi, it loads after start.elf.
You can find Efika MX port from arch implementations, some hacking is needed for the mmakefile.src'es as iit dates back to before the Aros crosstool era or else you get some weird errors while building. You also need to code the bootstrap and serial handling.
At the moment it seems that a fastest route for the native build would be to make one binary blob without using the package system. Raspberry's memory layout is pretty simple and if the implemented u-boot doesn't support loading other modules
<pre>
? - alias for 'help'
mtest - simple RAM test
autoscr - run script from memory
base - print or set address offset
bbm - BBM sub-system
bdinfo - print Board Info structure
boot - boot default, i.e., run 'bootcmd'
bootd - boot default, i.e., run 'bootcmd'
bootm - boot application image from memory
bootp - boot image via network using BootP/TFTP protocol
cmp - memory compare
coninfo - print console devices and information
cp - memory copy
crc32 - checksum calculation
echo - echo args to console
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls - list files in a directory (default /)
go - start application at address 'addr'
help - print online help
iminfo - print header information for application image
itest - return true/false on integer compare
jade -
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loady - load binary file over serial line (ymodem mode)
loop - infinite loop on address range
md - memory display
mm - memory modify (auto-incrementing)
mtest - simple RAM test
mw - memory write (fill)
nfs - boot image via network using NFS protocol
nm - memory modify (constant address)
pci - list and access PCI Configuration Space
ping - send ICMP ECHO_REQUEST to network host
printenv - print environment variables
rarpboot - boot image via network using RARP/TFTP protocol
reset - Perform RESET of the CPU
run - run commands in an environment variable
saveenv - save environment variables to persistent storage
saves - save S-Record file over serial line
setenv - set environment variables
sleep - delay execution for some time
tftpboot - boot image via network using TFTP protocol
USB - USB sub-system
usbboot - boot from USB device
version - print monitor version
</pre>
And there is one more thing about modular ports. In order to actually implement this, your bootstrapping environment should provide the ability to load several files. On PC this is provided by GRUB2. on CHRP you can read filesystem via OpenFirmware, and Sam's Parthenope relies on modified u-boot. If your bootstrap allows to load only a single file, then you stuck with monolithic kickstart. By the way... u-boot allows not only to boot up a single uImage or zImage, it also allows to write client programs AFAIK. With this approach, you actually can write modular bootstrap for ARM AROS using unmodified u-boot.
Most used [http://www.compulab.co.il/workspace/mediawiki/index.php5/U-Boot_quick_reference uboot options] are fatls usb 0:1,
the reason behind INTB_KERNEL is to allow use of the standard Exec function AddIntServer() to add interrupt handlers for
hardware drivers etc. AmigaOS never used it for abstract hardware drivers. AmigaOS routed only raw hardware IRQs there. Their assignment was hardcoded. As well as number of them. Actually on AmigaOS every bus has its own interrupt subsystem. For example PCI bus. PCI interrupts on Amiga are routed to a single exec interrupt. 1:1 relationship between CPU and hardware interrupts is present only on PC.
IMHO we miss things like AddInterrupt/RemInterrupt methods on our PCI subsystem's device class. PCI bus class should map these methods to whatever is appropriate. This is how it is done on AmigaOS and friends. When these are implemented, raw kernel.resource API will be needed only for several PC-specific drivers with hardwired resources. Exec IRQs are real IRQs only on Amiga hardware. On other machines they can be emulated where appropriate (VBlank is a good example). kernel.resource is meant to be different, its IRQs are hardware-agnostic, they are plain "Hardware IRQ number X, whatever this means". They are low-level actually, and meaningful only in the context of a particular system.
Was that not the transition from irq.hidd to kernel.resource? No. A long time ago there was another hacky bit named INTB_TIMERTICK. It was "abstract timer interrupt", used by timer.device. It was the same as VBlank, but with larger frequency. I removed it, because kernel.resource API was a cleaner way to access this interrupt. Furthermore, there can be more than one timer in the system. Thinking about bringing back timer HIDD definitions again. hpet.resource is a bad idea.
Can someone please enlighten me a little on how the scheduler is meant to work?
Poseidon.library creates its "Poseidon Event Task" during RTF_COLDSTART -> then calls Wait(), and ends up in limbo because wait disables interrupts (used for the scheduler heartbeat), and basically waits forever because the sigbit is never set, since krnSwitch doesn't switch the task unless TF_SWITCH is set, and no codepath run during this seems to set it?? TF_SWITCH does not disable/enable switching. This flag just enables to run user-supplied hook when the task is being switched away. It is completely safe to call Wait() in Disable()d state. Doing this actually temporarily breaks this state. IDNestCnt gets remembered in struct Task, then next task is selected, and its IDNestCnt is restored in sysbase (see kernel_scheduler.c). If there are no other tasks, then your cpu_Dispatch() should enable interrupts on the CPU and enter idle mode. See x86 implementation for good example.
You miss what happens next...
1. KrnSwitch() saves context of your task, saves IDNestCnt (core_Switch() and cpu_Switch()), then drops into cpu_Dispatch().
2. cpu_Dispatch() calls core_Dispatch. Then two cases are possible:
2a. There is a READY task. It is picked up, its IDNestCnt is restored in SysBase, then cpu_Dispatch() needs to restore registers and exit. The next task is run.
2b. There are no READY tasks. core_Dispatch() returns NULL. In this case your cpu_Dispatch() should enter idle loop. It should just enable interrupts on the CPU and put it on halt. This allows it to process hardware interrupts. Eventually some of your interrupt handlers wakes up your task and puts it into READY list.
My heartbeat interrupt has been slowed atm to help debugging - but it never actually gets a chance to fire because of the Wait() disabling interrupts. Perhaps you have forgotten to enable interrupts in your idle loop.
There is a change in the format of AROS executables. Until now we were using Elf RELocable files which are usually used as intermediate object files. We had them for various reasons, one of them was how AROS files were built in the past. That days we had no real aros cross compiler and the option to embed relocation data in unix executables (or in executable files in general) was rather new and not every linux/unix system had it. Therefore we have decided to use intermediate files. Although it was somehow working (and it is still working :-)), it has some drawbacks. Therefore decided to introduce real Elf EXEC types, in first turn implemented on ARM target with option to expand in future to all other AROS architectures.
The first patch was pretty easy and appeared to work somehow. It generated nice executables with embedded relocation info. Not only that, it also removed all global symbols adjusting relocation data to be relative to the beginning of the sections. That move reduced number of symbols in each executable significantly (depending on the file between 20 and 80% of all symbols could be removed). The only symbols that stayed in the file are local ones - due to the nature of the patch wasn't able to remove them since we have not seen them in the symbol hash table.
The patch didn't worked though. The files were relocated, AROS kernel loaded, but it crashed very early. What happened? Well, the nature of ARM relocations happened :)
Most of the relocation data on all machines is rather simple. Relocation can be absolute or pc-relative, sometimes the offset has to be bit shifted. On ARM v7 there is another one. There, when one wants to load an address of function/variable into register a combination of two instructions can be used: movw and movt. The first one loads immediate into lower 16 bits of a register while clearing upper 16 bits. The second one loads immediate into upper 16 bits without touching lower halfword. Loading of a pointer into a register looks like this:
movw r0, #:lower16:label
movt r0, #:upper16:label
In this case there are two relocations - one for lower halfword and another for upper. If an overflow of lower 16 bits occurs during relocation process, the upper one should be updated as well. Unfortunately with current patch and with typical ARM executables there is not enough information to perform the calculations.
There are two options - the first one would be to give up and go back to "fake" executables, another one would be to change from REL to RELA relocation info. The latter contains an addend, extra data which can be used to perform all the relocation calculations I need.
Decided for the second option. The patch is already in the works. There is another function for the binutils' bfd backend to perform the final relocation. There can decide what to do with every reloc info, modify data and eventually strip some symbols. An advantage is - at this stage of the linking process have also full access to all local symbols so can change all relocations section relative and eventually strip all symbols from the files.
GPU
VCore developed by Alphamosaic Ltd and now owned by Broadcom. Most of start.elf runs on the GPU. Placing ALL the userland GPU code in the videocore.hidd isn't going to be a terribly big problem because the code they published is nothing more than a shim that sends data straight to the GPU to execute.
The good news about this is that we only need to write our HIDD using the OpenVG API. The shim is relatively small codewise and lives in the ARM memory (the actual OpenVG code itself lives in the GPU RAM area and its loaded from start.elf). That's also the bad news. Our driver has to translate AROS video calls to OpenVG calls, for most tasks it should be easy, for some, not so much. It's still probably less difficult and less work, than controlling the GPU directly.
The other good news is that anything done through OpenVG happens on the GPU, its truly accelerated. It also has some nice font functions, meaning we can lead into an accelerated text mode later.
Basically, AROS resets or locks up when it tries to use AROS_ATOMIC_INC or DEC. If I comment out the byte/word operations in the header files and use non-atomic operations, the code works as expected.
have read that the L1 cache needs to be enabled to use LDREX and co (which I also read is only meant to be used on multi processor systems with shared memory) - however I am certain this is correctly enabled.
If you are using LREX or STREX, you should have L1 cache enabled, at least on the ARM CPU I work with at work.
L1 cache is enabled by enabling the MMU *AND* setting the C and I bits in the CPU - the C bit is ignored, and the I bit only covers the 16 byte instruction pipeline if the MMU is not enabled.
Can you verify that your assembly is generating LDREX/STREX? From the behavior, it almost sounds like its generating the default Semaphore locked atomics.
Impossible. There are no semaphore-locked atomics. There are Disable()/Enable()-based ones instead. And there's a special #define AROS_NO_ATOMIC_OPERATIONS in this case, which tweaks Disable()/Enable() implementations not to recurse forever.
I have tested this on ARMv5 which does not have ldrex/strex, it works fine. On those ARMs there's no way to have real atomics. On other OSes (like Linux) this is done by introducing things like atomic_t, which appears to be a complex structure, holding the value together with accompanying spinlock (implemented using swp).
#warning "TODO: lookup optimal mmu table settings for raspi memory"
/* Set up an identity-mapping for all 4GB */
for(x = 0; x < 4096; x ++)
{
pagetable[x] = x<<20 | (0x40002|0x80000|0x010000|0x00C00|0x04);
}
Shouldn't there be a second loop that sets the 'C' bit in the descriptor for the RAM pages?
Currently, you have TEX=0, C=0, B=1 for all pages (Shared Device).
You should have TEX=0, C=1, B=0 for RAM (Write-Through, Cached)
So ..
pagetable[x] = x<<20 | 2;
should be enough?
No, for RAM you need to change the '| 0x40' to '| 0x80'
tell dosboot the correct defaults to use
Please don't do this. This bootconfig.c is a deprecated legacy thing. I wanted it to go away completely with time. Instead, display drivers should auto-install themselves during own initialization phase. I. e. detect hardware=>instantiate itself. This should make things way simpler. With this approach you only need to add the driver into KS image to get the device autobooted. No hardcoded stuff.
Currently VESA and VGA drivers do this, look there for examples. never rewrote ATI driver because i don't have any test system for it.
they defined a smaller AROSCPUContext than the ExceptionContext - yet reference it as ExceptionContext in other places, and since it hasn't allocated enough storage for ExceptionContext, are corrupting memory/the structure (since the elements that are there don't map 1 to 1 with the exception context).
AFAIK, AROS has been moving in a different direction to this in recent years. It is the job of graphics HIDDs to allocate bitmaps etc. so that they have the most suitable characteristics, including allocating them from GPU RAM where possible. The concept of chip RAM is only for legacy code, and most if not all non-68k platforms should have all system RAM
marked as chip.
BTW, is the video processing code you mention CPU code or GPU code?
Also, IIRC we have support for "external memory allocators". Perhaps that's what we need for the allocation of GPU RAM through the mailbox.
All hosted and x86 native ports should use proper context formats.
trying to clarify if the vblank handler has to have run by this point to prevent this deadlock. Actually, no. Unless you have installed VBlank handler which should wake up at some point. Without VBlank there will be no quantum count. Consequently, there will be no forced preemption. But the rest will work, and multitasking will be cooperative (switch happens only when current task voluntarily gives up the CPU). Does it depend on the vblank having run before this point? and if yes what does that mean on systems where it might be able to run enough code (e.g. get to this point) before the vblank interrupt has triggered? What is it waiting for? It could wait for timer, in this case you need timer.device working. VBlank is currently needed for exec's quantum counter. In current native ports we have only a single timer, which is served by timer.device. VBlank is simulated by timer.device also. If your machine has two timers, then you can use one of them for VBlank, and another for timer.device, this will simplify things down. VBlank needs to be 50 Hz for historical reasons, many programs use it as cheap timer. I am periodically thinking about making some abstract mechanism to be able to change quantum source (and untie it from 50 Hz), but have no time to come up with something good. Additionally i started disliking timer.device hardcoded design when PC has got many timers (old 8253, APIC, HPET).
Currently i think there should be some low-level entity representing tick source. timer.device should just select the most appropriate source for its units.
The BCM2835 has 4 GPU based timer sources - 2 are used by the GPU, so im using Timer3 for our heartbeat and the remaining one will be free to the system. There is also the less capable ARM timer but that is dependent on the CPU frequency. Very good. You won't need any emulation. Set the heartbeat to 50 Hz and drive VBlank from it. Use other timer for MicroHZ.
Can you use the 'econsole.hook' I make for debugging the Sam460 via the serial port?
It provides a before-anything-else shell prompt on the serial port. You can then do 'NewCLI' to test your graphics, or use any DOS command in shellcommands.resource.
You should just be able to add econsole.hook to your module list, and use 'econsole' in your bootargs.
So long as you have a working Exec/RawMayGetChar and Exec/RawPutChar, it should work.
Also make sure to add shell.resource and shellcommands.resource for this.
That should have done it.
If you set "#define DEBUG 1" in arch/all-native/econsole/econsole.c, do you get any additional serial output?
have added it to the build and added econsole to the command line - and can see the bootloader picks up on the emergency bootconsole tag, but I still only get the insert bootable media display?
Im assuming it exposes a fake filesystem that tricks aros into booting?
The contents of which are: ECON:AROS.boot
Way to handle the scheduling code? The implementations I had been following were causing problems, due to cascading interrupts which I cant handle properly in the asm stubs just now (when they break disable etc.) - since it means detecting the interrupted codes cpu mode and getting the correct sp/lr for it, and that's just too tedious for arm.
To work around this ive added a system idle task which does nothing - and when the scheduling code has no task to run switches this in and lets it run, thereby allowing the interrupts etc to resume until something does need to happen.
Also, by adding accounting code to cpu_Switch() and cpu_Dispatch(), it should allow the system to log idle time correctly (as well as running tasks).
have thought of also adding an additional task that never runs, solely to record time spent in IRQ handlers, but I digress..
was under the impression that kernel.resource should *never* be used outside of exec.library. This is a wrong impression.
Michal started designing it because portable nature of AROS does not fit well into exec's API with all its assumptions. So, he started the new, hardware-agnostic kernel API from scratch. Yes, exec sits on top of it in places. But kernel always meant to be open thing. Otherwise it would not exist.
it wasn't meant to be just used willy nilly by user code - but by lower system components (e.g. exec) so that they could be implemented in a more generic fashion, and the kernel resource itself hide the systems quirks.
Adding new things there perfectly keeps up with our decision to minimize AROS-specific intervention into APIs which can clash with MorphOS or Amiga OS4 extensions. We want at least source-level compatibility there. Binary compatibility on PPC would be extremely cool, but at the other hand we have no maintainer for this, as well as their ABIs splintering.
It depends on what exactly is being implemented - there's no reason we should have everything crammed into kernel.resource if it doesn't need to be (i.e. if its better suited as a separate component/subsystem in its own right)
The _LE versions are for when you have endian swapping taking place. If the graphics are the same endian as the CPU, no swapping should occur. I ran into a similar terminology problem in SDL with a friend insisting that his Radeon 7000 on his PC was big-endian. It is not, it just uses the same endianness for the graphics card and the CPU so no swapping was necessary. They were both little-endian.
The _LE versions are because the PixFmts refer to the bitmap data being in big endian format in memory, for which the normal version would need to do endianness conversion before applying the shifts/masks. on this platform it is in _LE in memory also so we don't need the conversion hence using the _LE version of the call). would use _LE (if it's really little endian 16 bit mode).
What is the bare minimum needed to implement a framebuffer based gfx driver, with our software handling the rest?
Have tried with just a gfx class that only expose new/dispose/newbitmap - and having an onscreenbitmap used only for the framebuffer itself (with all other bitmaps being chunkybm, and the framebuffer's superclass also being chunkybm), but that alone isn't enough it seems?
You can use workbench/hidds/sm502/ as your example - it is as simple as I could make it.
So, AROS creates the framebuffer bitmap (verified this) -> so surely it should be capable of then rendeing into it? I don't actually create the framebuffer "bitmap object" myself - only as a result of being asked to. The code I currently have on SVN seems to create the framebuffers bitmap object fine, but then crashes in intuitions DisplayDriver callback. In particular it crashes performing the getattr on the system default pointer. don't expose MEMF_CHIP in an allocatable form so AllocSpriteData was failing (and other code later doesn't check if the values are valid == illegal memory accesses)
So far have -:
vc_init: queries the gpus memory, and sets up a fake memory handler for it, then adds the bootmode driver and returns saying all is well
vc_gfxhidd:New: sets up some fake syncmodes to test with and creates the real gfx object.
vc_gfxhidd:NewBitmap: checks if its a framebuffer and uses the onbitmap class or uses the chunkybm class otherwise
vc_onbitmap:New; creates a chunkybm object and then pushes the real framebuffer address into it as the buffer,
vc4 had v8adds, v8subs, v8muld, v8min and v8max which operated on four 8bit uint values packed into a 32bit register. Multiplication was in the range 0.0 to 1.0 and addition/subtraction saturated. There were also a range unpacking/packing modes that allowed you to pack and unpack 8bit values into 32bit registers.
RasPi has to speak to the "operating system" which runs on the GPU itself and request/free memory - it cant directly manage it itself, and so the managed functions were used to wrap these calls.
The Arm and GPU share memory space. The framebuffer is shared. The Arm can write a pixel and it will appear on the screen (through GPU hardware) without flushing/copying being required.
The GPU can composite multiple FB's in real time - so you have a number of surfaces defined which are rotated etc and composited in real time to the output. Copying can map from the address space of the Arm to the flat space of the GPU which takes some code, but I don't think whole buffers are copied.
The DMA hardware can also access the whole memory space and can perform 2D fills and blits (no blending). This is documented in the peripheral spec posted. The DMA is just an Arm accessible peripheral and can be set up with low latency (e.g. microseconds).
must use a 0xc0000000-based bus address to access SDRAM, yet non-DMA access should go via a 0x0-based bus address.
For 2D dma, set TDMODE, and the spec says "interpret the TXFR_LEN register as YLENGTH number of transfers each of XLENGTH, and add the strides to the address after each transfer." so set STRIDE to pitch of the image, the width is XLENGTH and height is YLENGTH. You would fill by not setting the SRC_INC and point source to your fill data.
The DMA cannot see the ARM's L1 cache, so you would map the framebuffer with ioremap_nocache. Depending on where the source data comes from, it may need an L1 cache flush. The DMA can see the L2 cache. Use 0xC0000000 bus addresses when L2 is disabled and 0x40000000 bus addresses when L2 is enabled. (actually just call virt_to_bus and you'll get the right address out).
openGLES/openVG has high latency. Writing to framebuffer then reading it back is very inefficient (e.g. milliseconds). If you can drive it a unidirectional way, just streaming commands at then that is efficient. openVG is not implemented on top of openGLES - it uses the same hardware but as a first class interface
To improve the Gfx driver, we will need a DMA resource implemented so can use to perform DMA operations. The Gfx driver will need this to perform blits.
Actually MEMF_CHIP has to present, for historical reasons.
This has been never fully agreed upon, but in ports i wrote i exposed the whole memory as MEMF_CHIP. The idea behind this is that CHIP is originally the memory where graphics and sound data can be put. On non-Amiga platforms there are no restrictions on this, so the whole memory is CHIP.
Yes, many old software can misbehave with CHIP memory size larger than 2MB. But this actually applies only to m68k AROS which is going to run m68k binaries. In other cases it's quite logical to fix the program when porting.
As to original question: yes, it's enough to have a framebuffer bitmap (one with aoHidd_BitMap_FrameBuffer set to TRUE) and PutPixel routine. It framebuffer can be served by chunky bitmap class, then you can simply create chunky bitmap with your own buffer (see how VESA driver does this). Chunky PutPixel is already there.
struggling to determine what is the correct pixfmt to use for the 24/16/15 bit gfx modes on the RasPi. AFAIK it uses RGB565, for 16bit but im unsure what shifts etc should go with it? suffice to say Im getting the wrong colors so far lol.
<pre>
redmask: 0x0000F800
greenmask: 0x000007E0
bluemask: 0x0000001F
alphamask: 0
redshift: 16
greenshift: 21
blueshift: 27
alphashift: 0
</pre>
It should likely be vHidd_StdPixFmt_RGB16_LE
This stuff is a bit confusing. The "names" of the stdpixfmts are based on the layout in memory,
ignoring endianess. So for example:
ARGB32: will be 0xAA 0xRR 0xGG 0xBB in memory on both big endian and little endian machines.
The shifts and masks OTOH are based on pixel access (ULONG in this case), so differ depending
on whether you run on big endian machine or little endian machine (that's why there's stdpixfmt_le.h and
stdpixfmt_be.h in rom/hidds/graphics/).
With the 16 bit pixel format it's even more confusing, as for example it's impossible on little endian machine
to describe RGB16 with shifts/masks alone. That's why there's vHidd_PixFmt_SwapPixelBytes_Flag.
(RGB16 == RRRRRGGG GGGBBBBB in memory, and for pixel (WORD) access on little endian machine it needs to
be accessed as GGGBBBBBRRRRRGGGG).
The shifts btw indicate how much to shift the component to the left (!) so that it is moved to the highest bit (31).
The aHidd_PixFmt_StdPixFmt you specify will be ignored most of the time, because when the pixelfmt is registered,
the gfx hidd checks if there's an identical pixfmt (shifts/masks/etc., but ignoring pixfmt->stdpixfmt) already in the system,
and if so, it uses the already existing one and does not create a new one.
In theory it would be better if gfx drivers could simply/only specify a StdPixFmt without all the shifts/masks stuff when the
gfx driver uses pixfmt which matches one of the stdpixfmts exactly. Another possibility would be for gfx drivers to use
HIDD_Gfx_GetPIxFmt(stdpixfmt_gfx_driver_wants_to_use) and then peek shifts/masks from it and fill out a pixfmt
tag list based on that.
15bit very blue/green: Try to pass same shifts/masks/etc. as in 16 bit pixfmt (maybe you think it's using 15 bit R5G5B5
(or swapped) but it's actually still using 16 bit R5G6B5 (or swapped).
aHidd_PixFmt_StdPixFmt you pass is mostly ignored. It's the shift/masks/etc. that count.
But I would still pass the correct one (_LE) == whatever rom/hidds/graphics/stdpixfmts_??.h uses
in the entry where you have looked up shifts/masks/etc.
Use the shifts/masks/etc. from the entry in stdpixfmt_le.h (if you are running on little endian machine) or stdpixfmt_be.h (if you
are running on little endian machine) that matches the pixfmt that its meant to be.
0xAA,0xRR,0xGG,0xBB on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_BGRA32)
0xAA,0xRR,0xGG,0xBB on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_BGRA32)
it feels like AROS trashes the alpha component, otherwise it should be 8A8R8G8B.
read on the subject suggest its in 1x5r5g5b (x is ignored) to keep 16bit alignment .
Suggests to me that wrong shift/mask are being applied - however going by the 16bit versions it all looks correct to me so I am really confused as to what is happening.
The output image looks to have too much green/blue, and very weak red.
Kickstart
The idea is to minimize amount of archirecture-specific modules to make the user's life easier. So, the kickstart was split into 'base' (which does not contain anything machine-specific) and 'BSP' (Board Support Package) which contains all hardware-specific stuff. This way, for example, distribution makers can save up space on CD and make CDs with multiple platform support. Different configuration would load the same base with different BSP's.
Next there was some part which is entirely missing on hosted. These are filesystems. Hosted ports do not need them to boot up, so on hosted they are left out. At the other hand, they are also architecture-agnostic. So i put them into 'FS' package (standing for 'filesystem').
USB
Poseidon is one more big part. I made it into separate package in order to allow users to omit it if they don't need it (for example, to run on retro PCs without USB). Personally i have one. Again, Poseidon is hardware-agnostic (well, there are USB drivers but HCIs are pretty standard).
AFAIK its HCI 1.0 compliant but not familiar enough with poseidons drivers, nor USB, to just hack away at the existing code. Perhaps once i'm more familiar with the workings I can merge in the changes needed to get it operating but for now I will focus on getting it running. Also our drivers have known issues so perhaps a fresh set of eyes might shed some light on what is going wrong.
Another interesting question is whether Poseidon can operate on device side. Is it flexible enough? How similar is being a USB host and USB device? think it will need a bit of work on Poseidon's side. Until then I will force the driver into Host/Master mode in the init code, but leave open device etc to configure the chipset for either's use - and look at trying to add support for working in Device/Slave mode & switching modes once it's up and running.
Actually USBROMStartup is some kind of kludge. Can there be any alternative? Could device drivers be self-installing, like our HIDDs? This would get rid of need to list them in USBRomStartup.
* Model A and B limited to 150 mA per port.
* Model B+ and Pi 2 introduced configurable 600 mA to 1.2 A support over all ports - anything above that requires a powered USB hub.
Implementing the hardware driver that Poseidon uses to interact with the USB components.
Have code in place to (try) and initialise the USB chipset, and configure host/device mode operation (though AFAICT Poseidon doesn't support device mode). Started to get the "virtual" root hub written for the single USB port so that Poseidon should at least list it correctly in the GUI - and try to interact with it to find peripherals.
The BCM2835 uses a soft IP block from Synopsys’ DesignWare library (DWC), specifically the block is called dwc_usb_2_0_hs_otg_subsystem-ahb_se (“USB 2.0 Hi-Speed OTG Controller Subsystem w/AHB Interface SE”).
There is no public documentation for this, and pretty much zero chance of anyone getting hold of it even with NDA. However, there's a Linux driver written by Synopsys ([https://github.com/raspberrypi/linux dwc_usb]). Specifically directories [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_common_port] and [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_otg].
The Synopsys code is actually under a fairly permissive licence – it's not GPL, it's similar to BSD (’don't sue us if it breaks’ is pretty much the only clause). So this should not be a barrier to porting the code.
The code is really well written, with a nice partition between the work done by the driver (dwc_otg, which is fairly involved, given the host does more work than a conventional EHCI driver), and the interface to Linux (dwc_common_port).
Probably only need provision of relevant changes to dwc_common_port. Other things to consider....
* Provision of necessary headers to get it to compile
* Provision of necessary functions (main issues are wait queues, threads, work queues, tasklets, timers, spinlocks and mutexes (multithreading) )
* Interfacing between USB stack and the driver. dwc_otg/dwc_otg_hcd_linux.c looks like the place to start.
the Linux bits of the headers are only required for the dwc_common_port library. dwc_common_port includes a variety of crypto functions which are not used – it appears to also be used for ultrawideband (UWB) and wireless USB (WUSB) drivers where crypto will be an issue, but it isn't going to be for plain wired USB.
Every USB driver acts as an USB hub as well in order to let Poseidon control the state of USB ports. The code there was reading status of the only USB port in Raspberry's CPU but when changing the status it erroneously deleted some of the status bits, including the port enable one. It was so because those bits in the status register are of a type Read/WriteToClear. It means, if one does not want to change their value from 1 back to 0, one has to actually write the 0 value. Very practical thing e.g. in interrupt handlers, where one reads the interrupt status register to learn what was the interrupt reason, and writes it back to the same register in order to clear the interrupts.
After fixing that code it turned out that the communication was still unsuccessful. Apparently the USB device was not understanding the host for some reason. That should not happen since the request sent was one of the standard ones implemented by virtually anything with an USB connector, assumed that Poseidon clears the data caches before forwarding the work to the USB drivers but that's the responsibility of the driver itself.
The USB device responded and acknowledged the transmission! But why were all the request sent after address change failing with timeout? They should not. Once again, address set is supported just by anything. Tried to contact the device at address 0 once again and there it was, still responding properly. The enlightenment came. The bus address for DMA transmissions was, as it is in many bare metal USB implementations, just the pure memory address of the buffer as seen by the ARM cpu. Have "prefixed" it with the real location of uncached RAM and booted AROS once again.
Trident saw this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
and this:
Product : Vendor: Vdr=0424/PID=EC00
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 255
SubClass : 0
DevProto : 1
VendorID : 1060
ProductID : 60416
DevVers : 0200
and even this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
What are these things? The first one is USB hub built in the Raspberry. Thanks to this one the Pi machines (with exception of Pi0 and computing modules) have more than just one single USB port. The second one is the network chip in raspberry, the third one is my USB SD card reader which have just connected to see what happens. AROS tried, of course, to boot from it ;)
So, the first step towards working USB is done. The control transfers are working as you can see above. Next step is to implement bulk and interrupt transfers, having the basics in place. Finally some error handling will be added and USB for Pi will be as complete as the PC version.
[http://www.raspyfi.com/raspberry-pi-usb-audio-fix/ Issue with USB Audio]
Audio
The Pi 4B is the only Pi that can output HD Audio as an HD Audio passthrough bitstream, and it does it over HDMI. It's possible to use the two HDMI output for separate HDMI video and HDMI audio outputs to allow UHD HDR video and HD Audio with non-UHD HDR compatible AVRs.
The Pi3B+ and earlier will decode to PCM 5.1/7.1 and output over HDMI. HDMI is the only interconnect that has a standard for carrying Dolby True HD, DTS HD MA etc. as a bitstream - you can't carry it as a bitstream on any other interface.
Pi3 and Pi4 audio jack output derived from 12bit pulse width modulation is relatively poor. For better, choose USB Audio or I2C versions.
[https://github.com/raspberrypi/linux/tree/rpi-patches/sound/arm audio] and its [https://github.com/raspberrypi/firmware/issues/2 very high speed message passing interface type of thing VCHI]
The Model B+ added an additional voltage regulator for the audio output and an additional output driver to drive low-resistance loads like headphones. However it is still using pulse-width modulation (PWM), which has a major impact on sound quality
the old Raspberry Pi used a linear voltage regulator to provide the 3.3V to many of the components on the board while the new one uses a switching regulator. Both can perform reasonably well. However switch mode power supplies often show higher noise figures
Analogue audio
Audio over HDMI rev 1.3 & 1.4
Ethernet
10/100 BaseT Ethernet RJ45 socket
GPIO
GPIO shouldn't be too bad but bear in mind it is already accessed in places so they would need to allocate pins etc through it (e.g. sdcard to flicker the activity light, serial debug to output data on the GPIO pins)
Probably a resource rather than a device...
Started an i2c driver that will need to allocate GPIO pins. Feel free to work on it if you are interested ;p
GPU graphics with 2D and 3D acceleration
Sadly none yet for 32bit but for 64bit...
Miscellanous
hdmi issues
Setting the hdmi_force_hotplug=1 makes sure the Pi believes the monitor/TV is really there.
You might also need to set config_hdmi_boost=4 or even higher (up to 9) if your display needs a stronger signal.
If the display is a computer monitor or newer tv, use hdmi_group=1 (auto HDMI use) and if it is an older TV, try hdmi_group=2 (for DMT formats, i.e. for PC monitors) then you HAVE to "set hdmi_drive = 2 to enable HDMI output as this forces HDMI mode rather than DVI mode
Do not set hdmi_safe=1 as that overrides many of the previous options.
Using a shorter or better quality HDMI cable might help. Make sure your Pi's power supply delivers 1 A and not 500 mA.
If you see a problem with the red colour - either absent, or interference - then try a boost
composite video
changing the RCA cable, then the composite port worked out of the box
Boot it as you are doing, without HDMI. If you now plug in the HDMI, do you get the image? In other words, does the Pi think HDMI is connected even when it isn't?
Rename all the files in the first partion of the card except bootcode.bin, start.elf and fixup.dat What's the result?
Put back config.txt What's the result?
for PAL mode sdtv_mode=2
dmi_ignore_hotplug Pretends HDMI hotplug signal is not asserted so it appears a HDMI display is not attached
hdmi_ignore_hotplug=1 Use composite mode even if HDMI monitor is detected
<pre>
# NOOBS Auto-generated Settings:
#hdmi_force_hotplug=1
#config_hdmi_boost=4
#overscan_left=24
#overscan_right=24
#overscan_top=16
#overscan_bottom=16
#disable_overscan=0
start_x=1
gpu_mem=128
</pre>
tvservice -c "PAL 4:3"
<pre>
/opt/vc/bin/tvservice -s or tvservice -s
state: HPD high|HDMI mode|HDCP off|composite off (0x12001a), 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m CEA
Group CEA has 1 modes:
(native) mode 16: 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m DMT
Group DMT has 0 modes:
</pre>
sudo amixer cset numid=3 1
forces the audio to the headphone jack, even with the HDMI video output plugged in
config.txt
the hdmi_ignore_edid_audio=1 option sems relevant as it should tell ALSA that the only available audio is analog, no matter what the display says
There are several different ways that these 4 pole (ring) composite analog cables can be wired up, so some work great in some applications and can be a waste of time in others.
What is needed for the Raspberry Pi B+ and above, which like many camcorders needs the ring contact next to the base contact to be the ground.
The wiring for the 4 pole are:
TIP (LEFT AUDIO CHANNEL)
RING 1 (RIGHT AUDIO CHANNEL)
RING 2 (GROUND/EARTH)
RING 3 BASE/SLEEVE (VIDEO) YELLOW
Most Apple based Players and the Microsoft Zune (TM) are wired this way.
Most analogue camcorders are wired this way as well, where the ground in on Ring 2 will work with the Pi although you may need to swap your Video plug with the Right Audio plug.
Nearly all other MP3 players are not wired this way, the ground is on another ring ie the wrong one.
External devices
* Camera Module Omnivision ov5647 Sunny 5MP (NoIR version) V1.3 - NoIR at 850 nm, peak at 880 nm and trails off at 940 nm wavelengths
* Camera V2 Sony IMX219 V2.1 8mpixel 8MP 8megapixel - 3280 x 2464 pixels - video at 1080p30, 720p60 and 640x480p90 - wider field of view, 62 vs 54 degrees horizontally -
* Branded WIFI usb BCM43143 dongle
N.B. dreaded error after changing cameras (stupidly without turning off the power first) and lasted through several power cycles. It can be a bad 15-pin FFC ribbon cable, when swapped, camera(s) and the Pi itself are working OK. It can be an instance of a cold solder joint on the CSI connector on the pi board. the camera can be detected (that's done via I2C) but may still not be able to receive image data (done via CSI-2) if something is broken. CSI-2 is uni-directional. Control is generally done via I2C.
The CSI-2 receiver always writes to memory, not direct to the ISP. That's the way the Broadcom architecture works as it allows multipass processing easily. GPU memory is accessible from the ARM. Processing using the QPU graphics processors may be possible. currently the only supported sensor is OV5647 and IMX219. The linux drivers are all in the firmware blob, else you'd be looking at at least a man-month of work in a fully fledged imaging lab to do a decent tuning of the camera modules' ISP parameters.
Static electricity maybe an issue for the camera module and slightly less for the pi board.
== References ==
===Good sites to visit===
*[https://github.com/raspberrypi/firmware/tree/master/ Raspberry Pi Firmware build]
*[https://www.raspberrypi.com/documentation/computers/software-sources.html Documentation]
*[https://rpilocator.com/ RPiLocator]
Linux only
*[https://github.com/raspberrypi/linux Raspberry Pi Linux Build]
*[https://dietpi.com/ DietPi]
*[http://www.tinycorelinux.net/ports.html piCore]
*[https://wiki.alpinelinux.org/wiki/Raspberry_Pi Alpine Linux]
*[https://github.com/armbian/build Armbian]
*[ FydeOS]
*[ TwisterOS based on ChromiumOS]
*[https://note.com/jamesmondo/n/nc76e31402be8?hl=en BSD]
*[https://www.raspberrypi.com/software/operating-systems/ PiOS Lite] and then [https://hstwb.firstrealize.com/ HST]
*[ PiMiga for pi4 and pi5]
*[ amibian for pi2 and pi3]
*[ retropie pi1 and 2]
Other alternative lighter smaller than Pi OS
*[https://aros.sourceforge.io/nightly1.html Aros 64bit ARMV8 single core]
*[https://www.riscosopen.org/wiki/documentation/show/Welcome%20to%20RISC%20OS%20Pi RiscOS on Pi3 and Pi4]
*[https://github.com/michalsc/Emu68 ARM based realtime JIT 68k for amiga computers]
*[https://github.com/JJDSNT/bellatrix/releases/ Alternative use of Emu68 on Pi3b]
*[https://github.com/stevereaver/uaos uaOS with Emu68k]
*[https://github.com/aros-development-team/AROS/commit/f80a268607dfae81b2db94755ab4e4d31ccb72d6 m68kemu library reference]
*[ HaikuOS]
*[https://github.com/raspberrypi/noobs NOOBS] os loader with successor [https://github.com/procount/pinn PINN]
*[https://github.com/maxnet/berryboot berryboot]
*[https://github.com/brianwiddas/pi-baremetal Bare Metal Access on Pi 32bit]
Testing procedure is put sd card in, connect board to board if necessary, plug in hdmi and then power nothing else is done especially CSI DSI etc
[https://www.raspberrypi.com/documentation/computers/compute-module.html CM5] has the same 55mm x 40mm 2x100pin connectors form factor as the CM4 but [https://www.epdtonthenet.net/article/214508/Key-Considerations-When-Migrating-from-Raspberry-Pi-CM4-to-CM5.aspx some pins and other small things] have changed. Will need the [https://raspipcb.com/tech-blog/raspberry-pi-cm4-vs-cm5-difference-in-booting-from-sd-card/ right IO board to suit]
*Green [ Raspberry Pi Compute Module 5 IO Board REV2 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1967]] - untested
*Green [ RPi Compute Module 5 IO board REV1 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1751]] - untested
*Black SupTronics Geekbord X1500 CM5 IO Carrier Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*[https://sipeed.com/nanocluster Sipeed NanoCluster] - untested up to 7 CM5
*Green BentoIO CMX0 - untested
*Box EDATec ED-CLAWBOX - untested
*Home Assistant Yellow - Kit with PoE with Raspberry Pi Compute Module 5 - untested
*Blue [https://www.waveshare.com/wiki/CM5_PoE_BASE_A Waveshare CM5-PoE-BASE-A] - untested
*Box Waveshare [ CM5-POE-BOX-A] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-B Waveshare CM5-IO-BASE-B] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-A Waveshare CM5-IO-BASE-A] - untested
*Blue Waveshare [https://www.waveshare.com/wiki/CM5-NANO-B CM5-NANO-B] - untested
*[https://carboncomputers.us/products/pi-flux piFlux]
*[https://carboncomputers.us/products/ Zitaotech Hackberry] CM5 lite only -
*Portable [https://www.waveshare.com/pocketterm35.htm Waveshare PocketTerm35] with Pi4B or Pi5 - untested
*Box [https://www.clockworkpi.com/uconsole ClockworkPi uConsole][https://www.youtube.com/watch?v=EtI_bAahbR8 CM4 into an adapter or CM3 into so-dimm - Cyberdeck] - untested
*Green RPi [https://datasheets.raspberrypi.com/cm4io/CM4IO-KiCAD.zip Compute Module 4] [https://datasheets.raspberrypi.com/cm4io/cm4io-datasheet.pdf IO board] V1.4 [https://datasheets.raspberrypi.com/cm4io/CM4IOUSB3-KiCAD.zip USB3] [https://datasheets.raspberrypi.com/cm4io/cm4iousb3-appnote.pdf CM4ISO] [https://datasheets.raspberrypi.com/cm4/cm4-datasheet.pdf Dual100pin] (2020) aka Development Platform Board - untested
*Purple Pi Hut Cytron CM4 Maker Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*[ KubeSail PiBox mini 2]
*Home Assistant Yellow with Raspberry Pi Compute Module 4 - untested
*[ Turing Pi V2] - untested CM4 with 260-pin SO-DIMM socket adapters and/or nvidia jetson nanos - untested
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-C Waveshare CM4-IO-BASE-C] - untested but binary blobs Rev01 Rev02
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-B Waveshare CM4-IO-BASE-B] - untested but binary blobs
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-A Waveshare CM4-IO-BASE-A] - untested but binary blobs
*Blue [https://www.waveshare.com/wiki/CM4-NANO-B Waveshare CM4-NANO] - untested but usb and audio turned off or rerouted
*Black [ Seeed Studio with BigTreeTech BTT pad 7] - bin blobs?
CM3 has a 200 pin sodimm ddr2 connector form factor but not electrically SC0028, SC0029
*Blue [https://wiki.geekworm.com/CM_IO_Board Geekworm RPi Compute Module IO Board] [https://github.com/geekworm-com/cm-io-board CSI DSI] with CM3 in ddr2 slot underside - '''works''' if SW1 on but CM3+ '''does not'''
*Green [https://cdn-shop.adafruit.com/product-files/3442/CMIO_schematic.pdf RPi V3 IO board CM3IO] and CM3 Lite - untested
*Green [https://turingpi.com/ turingpi v1 cluster] - untested up to 7 cm3 7xlan9514 12V discontinued, 3 x Pi4 homelab maybe better
*Blue [https://www.waveshare.com/wiki/Compute_Module_PoE_Board Waveshare Compute Module PoE Board] and CM3 lite (if not lite, write files to internal eMMC fat32) '''AVOID''' bin blobs
*Blue [https://www.waveshare.com/compute-module-io-board-plus.htm Waveshare Compute Module IO Board Plus] [https://www.waveshare.com/wiki/Compute_Module_IO_Board_Plus wiki] [https://forums.raspberrypi.com/viewtopic.php?t=235695 pin settings] with CM3+ Lite - '''AVOID''' binary blob
*[ Pi02w on Geekworm SupTronics X305 Raspberry Pi Zero IO Baseboard] - untested
*[ Spotpear Pi Zero 2w to Pi3b format-ish] - untested
*[ pi-top v4] box has 128x64 oled display, micro hdmi, 19Whr battery with pi4 and 15V PD 36W min needed
*[ pi-top v3] three green pieces, heatsink covers most of the base tray, pi-top hub mk1 lhs and Pi1B Pi2b Pi3b rhs secured from below, black rounded strip with pi-top above keyboard, 13.3" HD 1366 x 768 display, small touchpad,
*[ pi-top Model 2.0] pi-top on bottom bezel of 14-inch green laptop, large trackpad, keyboard slide down to reveal main system hub on slide rails moved to the right, Raspberry Pi3b screws down, hub slides in, 18V 2.5A 45W charger brick, battery 11.1V 3500mAh 38.85Wh and storage PiTopOS
*[ Pi-Top CEED Raspberry Pi Modular Educational Desktop with RPI3] monitor
*[https://www.indiegogo.com/en/projects/jesselozano/pi-top-a-raspberry-pi-laptop-you-build-yourself Pi-Top v1] wedge laptop with RPi2
<pre>
2008 Trustees collected for Foundation
2009 Pi Foundation charity status gained
2010
2011 First Raspberry prototypes
2012 First boards go on sale at CPC and RS. The Model A and B 700 MHz Arm11 - February 29th BCM 2835
2012 First million sold - more than the 10,000 original planned and anticipated
2013 First Alpha Experimental builds of AROS Native for the 32bit Pi
2013 Pi Trading launched making grants available, providing in house educational resources and Pi Academy for teacher training
2013 Over two million sold
2014 Over three million sold
2014 Pi 1 Model B+ introduced that moved composite video to audio jack and same half gig of memory
2014 Pi Model A+ v1.1 no ethernet and 1 usb - a little smaller -
2015 Over four million first gen pis sold
2015 Pi Zero 1.2 BCM2835 first production revision released with no camera port
2016 Pi0 1.3 released with camera csi connector
2017 Pi Zero W v1.1 1GHz Pi0W, single-core 32bit CPU BCM2835 released with Cypress CYW43438 wireless
2020 Raspberry Pi Pico SC0919 with RP2040 32-bit 2Core ARM Cortex-M0+ up to 133 MHz - 264KB of SRAM and 2MB of on-board QSPI Flash -
2024 Raspberry Pi Pico 2 with RP2350 2Core 32bit Arm Cortex-M33 and 2core open-hardware [https://github.com/wren6991/hazard3 Hazard3 RISC-V]
2015 Pi 2 Model B v1.1 BCM2836 900/600 MHz ARM Cortex-A7 Armv7 quad 32bit, 32bit VideoCore IV GPU - 1Gb RAM - 5V 2A micro usb - SMSC LAN9514 chip -
2015 Over a million pi2s sold
2015 Raspberry Pi 2 Model B version 1.2 Pi2bv1.2, aka Pi2B2 has armv8 BCM2837 underclocked to 900Mhz without wifi/bluetooth module
2016 Pi 3 Model B - Broadcom BCM2837 SOC four 64bit ARMv8 Cortex-A53 1.2GHz 32bit 1080p VideoCore IV GPU - 1Gb DDR2 - bluetooth 4.1, Cypress CYW43438 wireless 802.11n - 4 x USB2.0 ports - 5.1V 2.5A - SMSC LAN9514 chip
2016 PIs total over 10 million worldwide
2017 Compute Module 3 CM3 with BCM2837B0 armv8 Quad 64-bit - small 67.6mm x 31mm board which fits DDR2 SODIMM connector but not electrically compatible which plugs into needed IO board - beware of the I2C protocol issue
1Gb LPDDR2 RAM - Lite or 4Gb Emmc storage
2017 12 million pis sold in total
2018 Pi 3 Model B+ - 4c A53 BCM2837B0 1.4Ghz - 1Gb, wireless 802.11ac, gigabit ethernet (300Mbit/s) and bluetooth 4.2 - power over ethernet - 4 x USB2.0 ports - Microchip LAN7515 chip
2019 Over 15 million sold
2019 Pi 3 Model A+ with BCM2837b0 Cortex-A53 64-bit SoC @ 1.4 GHz with 512Mb LPDDR2, 1 usb2, 1 hdmi, 1 micro usb 5V 2A - no ethernet -
2019 Raspberry Pi Compute Module 3+ CM3+ - Broadcom BCM2837B0 1.2Ghz, Cortex-A53 (ARMv8) 64-bit SoC on DDR2 SODIMM mechanically compatible only factor - IO board required
1Gb DDR2 and 8GB, 16GB, 32GB or a Lite variant without eMMC
2021 Pi zero 2 (w or no W) RP3A0 quad 1GHz Cortex-A53 64bit BCM2710A1 512mB SDRam
2025 edaTEC CM0 ED-CM0NANA with additional dev board with quad 1Ghz A53 with 512Mb Raysan RAM, 2 USB2 and 10/100 ethernet - pico castellated edge
2019 Pi 4 Model B v1.1 RPI4B - BCM2711B0T quad 64bit A72 1.5GHz, 4K VideoCore VI, AC wifi, Bluetooth 5.0, GbE Broadcom BCM54213PE (PHY ID 0x600d84a2), 2 micro hdmi decode up to 4K, USB-C 5.1V 3A power, 2xVLI VL805 USB 3, 2xUSB 2.0, 2GB 9LDWW D9WHZ or 4GB 9FDWW D9WHV, 8GB 0AA47 D9ZCL ddr4 ram
2020 Silent Pi 4 v1.2 upgrade with more USB-c psu support
2020 PI400 BCM2711C0T 1.8GHz 4Gb DDR4 inside keyboard, 5.1V 5A 27W usb-c psu, 2 micro hdmi, external ide style 40pin gpio, no audio port -
2020 Raspberry Pi Compute Module 4 BCM2711B0T on new 55mm x 40mm 2x100 pin form factor with extra breakout IO board
CM4101000 1Gb RAM Lite SOM
CM4102000 2GB RAM Lite
CM4104000 4GB RAM Lite
CM4004008-4GB-RAM 8GB-EMMC SOM System on Modules
CM4104032 4GB RAM 32GB emmc
CM4108000 8GB RAM Lite
CM4008016 8GB RAM 16Gb eMMc
2021 Raspberry Pi SC0763 Compute Module 4S CM4S with ddr2 sodimm pinouts but not electrically the same with suitable IO board extra cost -
CM4S01000 1GB RAM Lite
CM4S01008 1GB RAM 8GB eMMC Flash
CM4S02000 2GB RAM Lite
CM4S04000 4GB RAM Lite
CM4S04016 4GB RAM 16Gb KLMAG1JETD-B041
CM4S08000 8GB RAM Lite
2021 Pi 4 v1.4 BCM2711B1 upgraded power regulator, to deal with 8gig of ram being more power hungry
2021-48 Raspberry Pi 4 model B v1.5 2GB
2023 Pi 5 v1.0 BCM2712 Quad A76 @2.4Ghz - VideoCore VII - no audio socket - dual 4k from mini hdmi - fan connector - 5.1V 5A psu
2024 Pi 5 2GB DDR4 version uses BCM2712D0
2024 Pi-500 with 8Gb LPDDR5 and membrane keyboard
2024 Pi 5 v1.1
2024 Raspberry Pi Compute Module 5 CM5 BCM2712 55mm x 40mm form factor with additional IO board
CM5004000 04GB RAM 0GB eMMC Lite
CM5008000 08GB RAM 0GB eMMC Lite
CM5016000 16GB RAM 0GB eMMC Lite
2025 Pi-500+ with 256GB NVMe storage, 16GB LPDDR4 RAM, and Gateron KS-33 Low Profile Blue mechanical keyboard switches
2025 Pi5 1GB DDR4 announced
2022 PiOS linux goes 64bit
2024 Pi Trading IPO stockmarket stock exchange listing
2026 April and May Aros 64bit fixed, added AHI audio, VC4 gfx started, usb functions added to rom
2026 June and July Aros 64bit usb2otg started, dma.resource, sdio.resource, bwfm.device wifi added
2026 Late July daily 64bit Pi3 LE little endian builds start
2026 August Pi 4, 400, 5 and 500 DTBs added, expanding existing support and wifi for Pi4 and Pi5
2026 August Pi5 HAT+ nvme and HDMI, AHI RPiI2S added, Pi4 HVS5 video scaler started,
2026
2027
2028 Pi 6
</pre>
The vcgencmd can be used to inspect and dump the current system configuration.
vcgencmd runs on top of VCHIQ as an RPC. The mailbox interface is an alternate but much simpler RPC.
VCHIQ is a bridge (queue) between the CPU and the GPU so they can communicate with the firmware.
Loads of [https://github.com/6by9/rpi3-gpiovirtbuf/blob/master/rpi3-gpiovirtbuf.c mailbox] which uses the GPIO control calls. [https://github.com/raspberrypi/firmware/wiki/Mailboxes may also be of interest]
A fair number of vcgencmd examples (search for vc_vchi_gencmd_init). [https://www.raspberrypi.org/forums/viewtopic.php?t=229203#p1406112 sends the relevant vcgencmd commands] to update the scaling kernel, but the [https://github.com/raspberrypi/userland/blob/master/host_applications/linux/apps/gencmd/gencmd.c command] is just a text string. Parsing and execution of the instructions is performed by the VideoCore firmware.
The Raspberry Pi runs two separate operating systems: Linux/Aros on the ARM, and a threedx RTOS called vcos running on the Videocore 4 VPU: vcos is commonly called "the firmware". Vcos is tasked with performing certain system services, for example running the display and audio outputs. The VCHI driver provides an interface to allow drivers to talk to vcos.
Doubtful, on any [https://www.web3d.org/ Web3d] [https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API WebGL] or [https://github.com/immersive-web/webxr WebXR] [https://developer.mozilla.org/en-US/docs/Web/API/WebXR_Device_API Device API] [https://developer.mozilla.org/en-US/docs/Web/API/XRInputSource XRInputSource] support. Hopefully, never/limited support features like location, peer-to-peer, invasive web apps, unwarranted storage, payments, proprietary video streaming etc
*spreadsheet [https://git.sheetjs.com/sheetjs/sheetjs sheetjs] [https://github.com/mleibman/SlickGrid SlickGrid] [https://github.com/6pac/SlickGrid SlickGrid] [https://github.com/jspreadsheet/ce jspreadsheet ce] [https://github.com/dream-num/Luckysheet Luckysheet] [https://github.com/ruilisi/fortune-sheet fortune-sheet] probably without xlsx support
*presentations [https://github.com/impress/impress.js/ impress.js simplified] [https://github.com/bwlewis/slides slides] [https://zenomt.github.io/mdslides/ github markdown slides] [https://github.com/Patternslib/slides Patternslib slides markdown] probably without pptx support
*ai office [https://github.com/dream-num/univer/ univer],
*weather [https://github.com/Himanshu3412/Weather-Forecast Weather Forecast], [https://github.com/kaushalsahu07/weather weather needs API key],
==Future==
[https://github.com/ARMSX2/ARMSX2 Arm pi of pcsx2]
[https://tube.cadence.moe/ Cloudtube], [https://github.com/TeamPiped/documentation/blob/main/content/docs/public-instances/index.md TeamPiped], [], [], [],
[https://hyperpipe.codeberg.page/ hyperpipe], [https://ytify.pp.ua/ ytify], [], [],
[ ytdl], [https://github.com/golddominik893/liberatube liberatube]
[https://git.lolcat.ca/lolcat/4get 4get], [https://github.com/hnhx/librex librex], [], [],
{{BookCat}}
dsj76bann5p0pkjm4lpw37z5gr6svjd
4676534
4676529
2026-10-17T14:33:19Z
Jeff1138
301139
4676534
wikitext
text/x-wiki
{{ArosNav}}
[[#Native]]
[[#Hosted]]
[[#Build]]
[[#Hardware]]
[[#References]]
[[#Future]]
==Introduction==
[[File:Scalos00.png|thumb|Scalos on Aros Pi3b]]
Aros aims to cover Pi 3 to 5 512Mb+ RAM
Options to boot from using a good power source to prevent the yellow lightning symbol.
*With Pi3b+ the max you can get is 5.1V 2.5A with micro usb.
*With Pi4 5.1V 3A with usb-c
*With Pi5 5.1V 5A, the amps went ever upwards, even to 5.1V 9A with usb-c
* Pi500+ keyboard wedge - working but not much tested esp [https://github.com/aros-development-team/AROS/commit/48e9c8edcca4b5c1e1fe0b1123f2129f624af67b power button]
* Pi500 wedge with up to date bootloader via PiOS - working but not much testing esp [https://github.com/aros-development-team/AROS/commit/48e9c8edcca4b5c1e1fe0b1123f2129f624af67b power button]
* Pi 5 - Quad A76 64bit ARMv8 and RP1 "southbridge" with VideoCore 7 D0 (rev1.1) - untested
* Pi 5 - Quad A76 64bit ARMv8 and RP1 "southbridge" with VideoCore 7 Pre-D0 C1 (Rev1.0) - untested
* Pi400 RPI-400 keyboard wedge - resolution changing and audio from micro hdmi0 (near 40pin) and micro hdmi1 (near usb-c psu) - Fn F10 0x5e power on and off works or held down for over 7 seconds auto shutdown - keyboard ok - wifi and lan ethernet testing -
* Pi 4 - Quad A72 64bit ARMv8 with VideoCore 6
* Pi 3 - Quad A53 [https://www.raspberrypi.com/documentation/computers/processors.html 64 bit] ARMv8 with VideoCore 4 with '''fan''' to prevent overheating cpu 82C+ throttling
* Pi02W - Quad A53 64bit - boots but [https://forums.raspberrypi.com/viewtopic.php?p=2387984#p2387984 usb not working but did in the past],
* Pi 2 - Quad 32bit ARMv6 with VideoCore 4 - mostly not 64bit compatible
* Pi Model B+ 32bit ARMv6 with VideoCore 4 - not 64bit compatible
* Pi Model A and B 32bit ARMv6 with VideoCore 4 - not 64bit compatible
===Native===
* 2013-03 Kalamatee starts work
* 2015-04 Work continues with mschulz on the kernel and Kalamatee (NicJA) on gpio and usb
* 2018 [https://www.patreon.com/posts/i-owe-you-some-20956961 mschulz resume adding BE big endian support], [https://www.patreon.com/michal_schulz/posts Big endian on Pi]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bsek latest commits for pi 3b, 4 and 5 64bit]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=metaneutrons latest commits for Pi5]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bitplane latest commits for ARM]
====64bit====
'''Download''' A [https://archive.org/details/piAROS Pi Distribution (Distro) has started] and the contents copied to fat32 8GB+ microSD card (there will be drawers/folders - boot c Classes Demos Developer Devs Extras etc only showing). The SD can be plugged in to the Pi. And power on. [https://pi.amiga.icu/ Repository]
'''Not recommended''' but [https://aros.sourceforge.io/nightly1.html RaspberryPi 3, 3+, 4 and 5 64bit ArmV8 nightly builds] [https://sourceforge.net/projects/aros/files/ and alternative site and nightly2] which is a test version of '''very few''' apps with both raspi-aarch64-system and raspi-aarch64-contrib can be unbz2'd to a SD or SSD as appropriate.
64bit build works well on a single core LE little endian. Multicore [https://github.com/aros-development-team/AROS/commit/1df0747c2bda3523a43029725a709b1f377d84ec may follow]. Any issues booting could be down to the SD card so please use another SD to see if it is resolved. Remember Aros Arm uses FAT32 and Aros can detect issues with this format very acutely (once fault found, FAT 0x0FFFFFF7 bad cluster so no files written after that, no repair). Please report your experiences in the [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2138&pid=15057#post_15057 Aros forum thread], [https://forums.raspberrypi.com/viewforum.php?f=179 Raspberry Pi Aros Dev and User forums], [https://forums.raspberrypi.com/viewtopic.php?p=2387984#p2387984 previous Raspberry Pi forum thread]. Any bugs or issues can be [https://github.com/aros-development-team/AROS/issues described here to fix]
*Pi500+ untested usb3 booting or nvme ssd
*Pi500 untested usb3 booting
*Pi5 untested usb3 booting
*Pi400 boots with '''USB3''' port based sata3 ssd
*Pi4 untested (may need eeprom update from PiOS or Pi SD Imager)
*Pi 3 B+ is pre-configured for USB sata3 boot - untested
*Pi 3 B may need [https://www.youtube.com/watch?v=ubnwvxF3Klc PiOS to set OTP to boot from usb - do so at your own risk] - if OTP set to usb, boot works but slower than SD card
Speed write wise (top faster)
<pre>
*NVME Pi5 untested >1000MB/sec or faster if matched correctly
*Sata3 ssd 500MB/sec
*SD V90 90MB/sec 4K maybe 8K
*SD V60 60MB/sec 1080p
*SD U3 V30 30MB/sec 720p
*SD C10 U1 V10 A1 A2 10MB/sec minimum should be used now
*SD C06 6MB/sec
*SD C04 4MB/sec
</pre>
As a homage to the past, Aros shows a reduced number of icons but this can be changed by left mouse click in the window and then right click down to Window -> View -> All files
Windows can be manipulated by the top (moving) and the bottom right corner (resizing) only.
Zune like MUI gui interface, has a unique quirk in that after changing a setting in a text box, you may sometimes need to press Enter/Return before clicking OK, Save, etc
Double left mouse click on most picture (Developer/Debug/Tests/Datatypes), audio and video files are supported, via datatypes, by the multiview application.
Esc escape key usually closes open windows even the desktop
In Prefs/Appearance some decorative theming elements need work. There is a few Mason icons in /Prefs/Presets/Icons/Mason/ and the ever present default Gorilla - Icon exchange in works
For more intensive graphics applications, you may need to edit config.txt in the root folder and change 128M to 256M to adjust more memory to graphics usage
If your cursor should '''appear''' to vanish, fear not it is still there. Please head to the top of the screen i.e. the title bar, hold down the left click mouse and drag the screen down a little and the cursor will appear again. Then you can drag the screen up again.
Like most amiga like OSs the audio and networking need to be setup manually
Audio AHI prefs - Mode settings tab - needs both Music unit and Unit 0 set to RPiHDMI:16 bit stereo++ or RPiPWM:16 bit stereo++ at 44100Hz. Press '''Save or Use''' button after each choice
For wireless, please use the Wifi prefs and already selected device bwfm.device. Press Scan and double right click on the router and enter password. You may need to setup after every power off
*if asking for password again - press cancel and go to Network Prefs, Wireless Networks tab and highlight the router line and hit the remove button and press the cancel button. Retry with Wifi prefs again
*...waiting for an address - Disconnect and try Connect
Until, Connected to <router> - 192.168.x.x
For lan ethernet port, please use Network prefs and the following hardware is
*lan9514 Pi3b Pi2 not supported at the moment
*lan7515 Pi3b+ type into Device usblan78xx.device as net0: remove other device(s)
*bcmgenet Pi4 Pi400 choose for Device bcmgenet.device
*cdnsgem Pi5 Pi500 Pi500+ RP1 i/o for cadencegem
(network prefs may forget random information when rebooted)
Summary
<pre>
*3b ethernet not supported, usb ethernet not working but wifi prefs setup works
*3b+ wifi working and ethernet works
*4 untested
*400 wifi and ethernet untested
*5 wifi and ethernet untested
*500 wifi and ethernet untested
*500+ wifi works
</pre>
Type in 'aarch64' in the [https://archives.arosworld.org/index.php?function=search&tool=simple search box] and you will see available software packages / apps. apkg can be used to inspect and install applications.
[http://archives.arosworld.org/index.php?function=browse&cat=network/browser amelinium web browser (JS 1.6 ES9 ECMASCript 2018)] is available with an [https://eab.abime.net/showthread.php?t=122494&page=80 eab thread] reminiscent of [https://github.com/zapek/Voyager Voyager] and to a lesser extent [https://github.com/amigazen/aweb3/ Aweb JavaScript 1.5 (ECMAScript 3)] as css and javascript websites can be slow to load or resolve (no JIT) and nothing from facebook, reddit etc.
Press Cancel at screenmode selector or -wb argument to get windowed version. You could use the Shift + Del shortcut or mouse wheel should work to delete all text at once. Html5test gives 189 (1.29), 300 (1.31), 301 (1.39) out of 555, some bigger Amiga like browsers are around 370+ but it does less better.
You may have to delete the cache (Menu -> Page -> Delete cache) to fully retest big Amelinium updates or free up space.
Be aware [https://pianetaamiga.it/en/reportage-pianeta-amiga-2026/ some site pages] can use up hundreds of MBs of cache very quickly
DNS lookup failed... close browser and reboot and setup wifi again - repeat until it works again
youtube video and audio - js button for javascript must be on/shaded - Settings -> Soundoutput - AHI
Any restriction to lower resolutions is due to [https://docs.invidious.io/faq/#q-where-are-the-360p480p1080p-quality-options bandwidth]. Either CPU/GPU, internet speed and/or video quality. Pi3 can expect 480p (wifi) to 720p (ethernet). Pi4 expect (wifi) (ethernet).
Telegram https://t.me/s/channel_name for public messages from vamped_amiga chatamigagames demoscenecracktros
*art local js apps like dpaint.js
There is normally no Bluetooth support for most amiga like OSs but Aros has one [https://github.com/aros-development-team/AROS/commit/6942cbfbf66426d21963a7fcd8aba6aff611a9e0 work in progress] [https://github.com/RPi-Distro/bluez-firmware/tree/pios/trixie/debian/firmware/broadcom firmware]
*Bluetooth 4.1 BCM43430A1.hcd Pi3B, Pi3A, Zero 2W
*Bluetooth 4.2 BCM4345C0.hcd Pi3B+, Pi4
*Bluetooth 5.0 BCM4345C5.hcd Pi4B rev, CM4 and maybe Pi5 and CM5
<pre>
*bthid keyboard mouse support
*btserial serial
*btpan short range wireless connecting devices
</pre>
Only the Pi5 has a RTC real time clock, the other Pis will need to use ntp services [https://github.com/aros-development-team/AROS/commit/29cd4116330dc7f692d90757eacc59fb3f31ae70 sntp] with time.cloudflare.com pool.ntp.org or Cloudflare 162.159.200.1, 162.159.200.123, 2606:4700:f1::1, 2606:4700:f1::123 or [https://github.com/bohunamiga/PiNTP PiNTP -s goodtime.ijs.si or ntp1.ptb.de] to get the date and time from the internet. Can use date in a shell e.g. date 24-Dec-2026 23:59:59 but this will need to be done again after every reset/power off. Maybe [https://github.com/aros-development-team/AROS/commit/28674a157bc56175aa668e7b62dca6fa740578dc ds3231 rtc with dtoverlay=i2c-rtc,ds3231 in config.txt]
It helps to have all usb devices already plugged in before power on to detect at the moment. Even then some usb devices will freeze the mouse cursor and the only resolution is to remove the offending usb device and reinsert. Sometimes, the reinsert leads to the mouse cursor vanishing, it is still there and responds to left mouse clicks, top of the screen and pull down the screen.
USB classes support from Prefs/Trident is still work in process
*usbaudio working on usb3 port (blue) on pi4, 400 but not working (no rt isochronous) on usb2otg (white or black) for pi3b, zero 2w
*[https://aminet.net/package/mus/midi/camd camdusbmidi] detects midi devices without a preferences file (Prefs/Env-Archive/sys/midi.prefs) as [https://www.youtube.com/watch?v=RBxHkwy4Nrw auto setup now] possibly with [https://github.com/metaneutrons/mt32-pi metaneutrons mt32-pi] [https://github.com/rtzor/mt32-pi mt32-pi fork] [https://github.com/ahmadexp/mt32-pi fork] [https://github.com/gmcn42/mt32-pi-control control of] [https://github.com/dwhinham/mt32-pi mt32-pi pi3+]. Alternative of [https://homspace.nl/samplerbox/ SamplerBox].
Will need developer clang gcc tools to look at 64bit ports of [https://archives.arosworld.org/?function=showfile&file=driver/audio/usbmidi.i386-aros.lha usbmidi], [https://aminet.net/package/mus/midi/CAMD_Toolkit CAMD_Toolkit], [https://aminet.net/package/mus/midi/camdtools camdtools], [https://github.com/cnvogelg/amiditools amiditools], [https://github.com/timoinutilis/midi-sequencer-amigaos horny src], [https://aminet.net/package/mus/midi/horny-base horny-base], [http://bnp.hansfaust.de/index.html BnP], [https://arosarchives.os4depot.net/?function=showfile&file=audio/misc/timidity.lha timidity],
Regarding 680x0 emulation, there are several options (not implemented yet) that could be considered
*[https://github.com/aros-development-team/AROS/blob/6722a0ae9e03fe5d26e32703360bd2059e0864cc/rom/m68kemu/README.md?plain=1#L424 m68kemu.library] for some Amiga productivity where the cpu is emulated and the system calls are redirected to Aros ones
*[https://github.com/BlitterStudio/amiberry amiberry] (winuae) for everything else like games
*[https://github.com/jonx/AROS/tree/aarch64-darwin-graft/arch/all-darwin/libs/emu68k emu68k]
*[https://scriptedamigaemulator.net/ Scripted Amiga] with [https://github.com/naTmeg/ScriptedAmigaEmulator ScriptedAmigaEmulator] or older [https://github.com/gbraad-amiga/ScriptedAmigaEmulator2 ScriptedAmigaEmulator2]
Hopefully getting Pi3 up to 25Mhz 68040 (non JIT) and 50Mhz 68040 (JIT)
Pi4 maybe getting up to 50Mhz 68040 (no JIT) and 100Mhz 68040 (JIT)
[https://pinout.xyz/ GPIO 40 pins] [https://learn.sparkfun.com/tutorials/raspberry-gpio/gpio-pinout pinout]
Some exceptions:
*Physical pins 27, 28 (GPIO0, 1) are an internal I2C bus and should not be used
*The other I2C on pins 3, 5 (GPIO 2, 3) can be used generally, but be aware they have permanent pull-up resistors to 3.3V
*For MIDI use USB but there are dedicated UART pins 8, 10 (GPIO 14, 15).
With a HAT it's more awkward -- you need to know which pins are used by the HAT and avoid them. Hopefully this will be documented.
Remember all GPIOs are 3.3V (not 5V tolerant), floating/noisy inputs can cause odd behavior, and that shorting the power supplies can cause instant death of the Pi.
In the shell (Cntrl + C to end)
GPIO PIN/A/N,SET/N,GET/S,MODE/K,PULL/K
Controls and queries hardware GPIO pins via gpio.resource which is stored in the rom or Devs/ '''please test'''
*PIN -- (Required) Target GPIO pin number (e.g. 12).
*SET -- Set pin output value to 0 (LOW) or 1 (HIGH).
*GET -- Read and print current digital input level (0 or 1).
*MODE -- Configure pin mode: IN (Input), OUT (Output), ALT (Alternate).
*PULL -- Configure pull resistor: NONE, UP, DOWN.
EXAMPLES
<pre>
GPIO 12 MODE OUT
GPIO 12 SET 1
GPIO 12 GET
GPIO 13 PULL UP
</pre>
[https://gpiozero.readthedocs.io/en/stable/installing.html Current] [https://gpiozero.readthedocs.io/en/v1.2.0/api_boards.html old support for gpiozero is unknown at present] [https://energenie4u.co.uk/res/pdfs/ENER314%20UM.pdf and associated 433MHz equipment] [ USA X10 security and lights via USB] [ OpenHab with Shelly Smart Plug connected over Wi-Fi, controlled by MQTT or HTTP]
Printing only with Postscript but [https://github.com/bohunamiga/MintPRINT one] of [https://github.com/boingball/MintPRINT two] [https://github.com/Andiweli/AmiAirPrint/tree/main AirPrint] IPP has been attempted with [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2061&pid=13954#post_13954 discussion]
Youtube
[], [], [https://www.youtube.com/watch?v=X4fmWAIv7FE Aros native on Pi3b],
[], [], [https://www.youtube.com/watch?v=TSxlYb1eQWU Installed on Pi3b+],
[], [], [https://www.youtube.com/watch?v=NFF1H3jCoz8 testing Aros native on Pi400],
[], [], [https://www.youtube.com/watch?v=nIVx7mh1E1Q&pp=ygUHYXJvcyBwadIHCQkTDAGHKiGM7w%3D%3D Aros on Thumb 2 based 32bit-ish ARM STM32H743 board],
[https://www.youtube.com/watch?v=zQM4CD64xDE&t=612s&pp=ugUEEgJlbg%3D%3D Performance under Linux] but on Aros...
{| class="wikitable sortable" width="90%"
! width="10%" |Pi
! width="10%" |Single Core 2D
! width="10%" |Single Core 3D
! width="10%" |Single Core 3D
! width="10%" |SMP 2D
! width="10%" |SMP 3D
! width="10%" |SMP 3D
! width="35%" |Comments
|-
| <!--Pi-->Pi3
| <!--Single Core 2D-->
| <!--Single Core 3D-->
| <!--Single Core 3D-->
| <!--SMP 2D-->
| <!--SMP 3D-->
| <!--SMP 3D-->
| <!--Comments-->
|-
|}
==== 32bit ====
For the Pi1 Pi2 Pi2B the status of AROS native ARMv6 for 32bit RasPi was OK. System booting, USB working (although with some issues but plans to fix them). 32bit native [http://www.aros.org/nightly1.html ARMv6 32bit nightlys] raspi-armhf-system raspi-armhf-contrib unbz2'd to fat32 microSD
===Hosted===
AArch64 CPU backend for AROS, a Cocoa/Metal display, clipboard / host-volume / CoreAudio / BSD-sockets bridges, GPU 2D via gpufx.library, a 68k→AArch64 JIT (run68k), and a full Rust std port. On [https://www.jkn.me/blog/macaros-aros-on-apple-silicon/ latest Apple Silicon] [https://github.com/jonx/Macaros early buggy alpha version of hosted Aros .dmg on MacOS12+]. Please use [https://github.com/jonx/Macaros/issues MACAros github] for issues, features etc and possibly [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2030&pid=13910#post_13910 here]
[http://www.aros.org/snapshots1.html old linux and android hosted 32bit]
==== Hosted ====
=====64bit=====
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80&pid=13667#post_13667 Ubuntu Linux PC hosted Pi compiler build]
[https://github.com/BlitterStudio/aros-compiler-docker Docker based cross compiler for various Aros systems],
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80 From the Aros Raspberry pi 3 64bit thread]
Instructions on building 64-bit Raspberry Pi AROS and cross-compiler from sources.
You will need:
- Ubuntu 24.04 or 26.04
- qemu-system-aarch64 installed
- Internet connection
- rpi-scripts.tar.gz downloaded (https://axrt.org/download/aros/rpi/rpi-scripts.tar.gz)
1) Install prerequisites:
sudo apt install git gcc g++ make gawk bison flex bzip2 netpbm autoconf automake libc6-dev liblzo2-dev libpng-dev gcc-multilib byacc python3-mako cmake yasm curl nasm
2) Clone sources
cd <project-directory>
git clone https://github.com/aros-development-team/AROS.git --recurse-submodules
3) Extract rpi-scripts.tar.gz. Copy all files into your project directory so that you have:
AROS (the directory with cloned sources)
fix-dotdot.py
rebuild.sh
recreate-sdcard.sh
run-qemu.sh
update-sdcard.sh
4) Run ./rebuild.sh. Select option 1) toolchain-core-aarch64
This will execute process of building a cross-compiler. During this process packages will be downloaded from Internet. This process can take up to 2 hours. If there are some missing dependencies, install them with 'sudo apt install' and restart this step.
5) Run ./rebuild.sh again. Select option 2) core-raspi-aarch64
This will build system files for 64-bit Raspberry Pi AROS. This process can take around an hour.
6) Run ./recreate-sdcard.sh
This will create an sdcard.img file with contents of previous step.
7) Run ./run-qemu.sh
This will start QEMU with SD card image and ROM images. It will boot into AROS.
=====32bit=====
Ubuntu VM approach to compiling [http://lallafa.de/blog/2013/06/building-aros-hosted-for-raspbian/ Linux hosted AROS June 04, 2013]
../AROS/configure --target=linux-armhf --enable-includes=/usr/arm-linux-gnueabihf/include --x-includes=/usr/arm-linux-gnueabihf/include --x-libraries=/usr/arm-linux-gnueabihf/lib
arm-elf- is symbol-linked to arm-linux-gnueabi- (arm-linux-gnueabi- is more correct in this case, because it's going to be compiling the ARM AROSBootstrap for ARM Linux)
*armel - many of the "android" machines require since the entire OS is made for soft float VFP.
*armfp - Efika MX target, Raspberry PI, EfikaMX, Pandora and virtually everything (VFP)
Keep in mind it's possible to start hardfp AROS hosted on softfp system, though, as long as no calls between AROS and host require floating point parameters. NOTE: hardfloat objects *cannot* be linked with softfloat objects - they have a different ABI.
Just keep in mind the arm nightly build machine is quite complex beast. It needs the x86_64 host compiler to compile AROS tools. The arm version is built every night using gcc-4.6.2 crosscompiler (built together with AROS) and successfully builds armel and armhf linux hosted targets.
*needs an AROS code compiler for ARM target
*as well as unix compiler for ARM linux host (would be best to have both softfp and armhf, we have softfp only now) with full set of libraries and includes.
with—disable-crosstools $AROS_CC is always a wrapper around $KERNEL_CC ? If so, this is wrong for some ports. This can break Darwin, Windows and Android port.
Yes, Android port will build. And even work. But it's not good because the port will not be ABI-compatible with other ARM ports. Android's ABI is different from GNUEABI. For example:
<pre>
enum test {foo, bar};
enum test testvar;
</pre>
sizeof(testvar) will be equal to sizeof(int) in GNUEABI (Linux and AROS) and sizeof(short) on Android. This affects linking objects from static linklibs, for example.
Previously everything worked because $AROS_CC was a wrapper on top of $HOST_CC. And a real crosscompiler was used on non-ELF hosts.
Android is the same. $KERNEL_CC is incompatible with AROS.
compiler=kernel is appropriate _ONLY FOR CODE WHICH RUNS ON HOST OS_ (or barebone hardware, if we talk about native). This includes bootstraps, their linklibs, and host-side dynamic libraries (Windows makes extensive use of them because of architectural considerations.
No single AROS object should be compiled with this setting. $KERNEL_CC is really compatible with AROS *ONLY IN LINUX-HOSTED* and no more. On other systems (Darwin, Windows, Android) this is not true any more, and compiler=kernel is never going to work.
If you want to compile your AROS module against host OS includes, append the following to USER_INCLUDES (or USER_CFLAGS, this is effectively the same):
-isystem $(GENINCDIR) $(KERNEL_INCLUDES)
$(KERNEL_INCLUDES) expands to:
-isystem <your_os_includes> -isystem <host_OS_gcc_private_includes>
-nostdinc
This makes AROS compiler adhering to host OS APIs.
If you want some preprocessor symbols based on what your host OS actually is, add something like -DHOST_OS_$(AROS_HOST_ARCH).
Why is there $(GENINCDIR) at all? Because host OS has its own libc includes, which would conflict with AROS ones. And the host OS libc is not binary-compatible with AROS one.
Why doesn't Windows-hosted port use $(KERNEL_INCLUDES) ? Because WinAPI includes conflict with AROS ones in fundamental typedefs, like WORD, BYTE and BOOL. It's almost impossible to deal with this in any other way than rewriting WinAPI definitions using AROS types.
Building under centos 6.3 (i386) currently, and AROS creates the toolchain itself. haven't yet committed the necessary changes but "./configure --target=raspi-armhf" is enough to start, then "make arosboot-raspi" will generate arosraspi.img (containing the bootstrap, kernel.resource, and exec.library) as well as arosraspi.rom (containing all the other essentials components such as dos, graphics etc). It will also copy over a config.txt file to make the raspi bootstrap code load the correct kernel, and a cmdline.txt that enables exec debug output.
*armel = typically Debian 6, Ubuntu Maverick, Android,
*armhf = typically Debian 7, Debian 8, Ubuntu Precise,
Cross-compiling Ubuntu ARM softfp
<pre>
sudo sh
echo 'foreign-architecture armel' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armel] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armel.list
apt-get update
apt-get install gcc-arm-linux-gnueabi libx11-dev:armel libsdl-dev:armel
</pre>
<pre>
./configure --target=linux-arm --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabi/include
</pre>
Cross-compiling Ubuntu ARM hard-float
<pre>
sudo sh
echo 'foreign-architecture armhf' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armhf] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armhf.list
apt-get update
apt-get install gcc-arm-linux-gnueabihf libx11-dev:armhf libsdl-dev:armhf
</pre>
<pre>
./configure --target=linux-armhf --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabihf/include
</pre>
Now, the AROS build is configured properly and all you need to do is:
make
==Build==
===64bit===
[https://github.com/aros-development-team/AROS/blob/7016ce28bfdb754182edb16011c98faaf5413c29/arch/aarch64-raspi/boot/mmakefile.src#L180 boot makefile]
===32bit===
# download/checkout the source someplace, e.g. /build/AROS-Src/
# make a directory to store external sources AROS downloads, e.g. /build/Ports
# make a build directory, e.g. /build/aros-raspi-armhf
# cd into the build dir, configure, and then run make -:
<pre>
>cd /build/aros-raspi-armhf
>/build/AROS-Src/configure --target=raspberrypi-armhf --with-serial-debug --enable-ccache --with-portssources=/build/Ports
>make
>make arosboot-raspi
</pre>
then copy the files from /build/aros-raspi-armhf/bin/raspi-armhf/AROS/ onto an sdcard, and download/copy the Raspi firmware files onto it.
You should then be able to boot the sdcard on your RasPi.
The current W.I.P tree to svn. it can be built as follows ..
<pre>
./configure --target=raspi-armhf
make arosboot-raspi
</pre>
That will generate arosraspi.img, arosraspi.rom and config.txt in bin/raspi-arm/AROS - so either copy just those files to a fat formatted SD card (with the firmware files on), or copy the whole contents of the AROS folder.
NB - if you have a Linux/other install, backup the existing config.txt first
arosraspi.img contains the bootstrap (which has very basic mailbox code, framebuffer/gpio init, and console "emulation" via code pinched from our libbootconsole), kernel.resource, and exec.library
arosraspi.rom contains all the other components needed to boot AROS.
The config.txt file will tell the RasPI bootstrap to load the arosraspi kernel and ramdisk (rom).
the bootstrap has minimal mailbox code, planning on adding either a resource or library that driver/app code will use to access it (likewise for GPIO)
Help building AROS hosted on Linux ARM
Was looking a way to use more my Handheld ARM based called Pyra (Dragonbox Pyra) an ARM (Omap5 cpu with 4GB ram) linux based machine (Debian Buster v10 with kernel 5.6.19 adapted) and have a try to compile the latest Aros sources by Deadwood directly on this device.
Compilation stops after build libpopupmenu.a and trying to build libatomic have this error:
<pre>
Configuring build in bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
configure: WARNING: unrecognized options: --disable-nls, --without-x
checking for --enable-version-specific-runtime-libs... no
checking for --enable-generated-files-in-srcdir... no
checking build system type... arm-unknown-linux-gnu
checking host system type... arm-unknown-aros
checking target system type... arm-unknown-aros
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for arm-aros-strip... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-strip
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for arm-aros-gcc... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-gcc
checking whether the C compiler works... no
configure: error: in /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic':
configure: error: C compiler cannot create executables
See config.log' for more details
make[2]: *** [mmakefile:4489: /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic/.configured] Error 77
[MMAKE] make --no-print-directory TOP=/media/farox/pyra2/arosbuilds/toolchain-core-armhf-build SRCDIR=/media/farox/pyra2/arosbuilds/AROS CURDIR=tools/crosstools/gnu TARGET=tools-crosstools-gcc-libatomic-configure -s --file=mmakefile tools-crosstools-gcc-libatomic-configure failed: 512
[MMAKE] Error: Error while running make in tools/crosstools/gnu: No such file or directory
make[1]: *** [Makefile:361: linklibs-libatomic] Error 10
make: *** [Makefile:183: crosstools] Error 2
</pre>
looking at config.log on arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
found that arosbuilds/toolchain-core-armhf/arm-aros-ld: cannot find -laeabi
so do make linklibs-aeabi-arm-quick
and the missing lib was built.
now the next stop is at
fatal error: bits/libc-header-start.h: No such file or directory
and
fatal error: sys/cdefs.h: No such file or directory
in many places so after checking that have this missing include files i have noted that my include path is a bit different, standard searching path is /usr/arm-linux-gnueabihf but in my system is /usr/include/arm-linux-gnueabihf
so if i add my path to some mmakefiles compilation goes on....but is a better way to add this path to avoid every mmakefiles to be changed?
fixed with adding
-I/usr/include/arm-linux-gnueabihf
to where is missing on mmakefiles like
USER_INCLUDES := -isystem $(GENINCDIR) -I/usr/include/arm-linux-gnueabihf $(KERNEL_INCLUDES)
P.s. I have changed many mmakefiles and have at least compiled (after many hours) the toolchain doing make every time in arosbuilds/toolchain-core-armhf-build (also have to disable making tests under cplusplus but don't remember the directory ...) but ask an help to have an automated way to correctly build without modify mmakefiles.
Last time built armhf target was around 2 years ago. At that point built is via cross-compilation from linux (ubuntu 22.04) using linux armhf crosscompiler (this can explain the path differences you are experiencing) as well as using AROS gcc cross-compiler in version 6.5.0 (build with option 21) in rebuild.sh). Since then AROS GCC has been updated to 10.5.0 and don't believe anyone tried to build the armhf target again.
My suggestion would be to downgrade GCC to 6.5.0 (via editing AROS/config/gcc_def file) and try to first build using cross-compilation from x86_64 linux. Once that works, you will have a "template" to compare to native compilation under arm linux.
Thanks for your suggestion...but think the toolchain with GCC 10.5.0 is compilable if i found a way to pass the path of my system to the script that build (option 21 on rebuild).
The other only changes are (but don't know where to modify...) is to add the build of libaeabi and disable the building of some tests under cplusplus that use exceptions and is not supported under ARM. try to crosscompile with my Linux amd64 PC.
For paths look into core-linux-armhf/bin/linux-armhf/gen/config/target.cfg. A number of build-wide variable is set there containing paths to local build system. These variables and the target.cfg file are generated by AROS ./configure script.
Thanks compilation now go forward...changed target.cfg under "toolchain-core-armhf-build/bin/linux-arm/gen/config" and do make on "toolchain-core-armhf-build" dir.
Need to find where to enable build libaeabi.a so can build the entire toolchain with option 21 of rebuild.sh
Found something that looks like libeabi in AROS/arm-all/arm-aeabi/mmakefile.src. Try adding a third line there:
#MM- linklibs-armhd : libklibs-aeabi-arm
Don't remember needing this library. Possibly the 6.5.0 GCC somehow does this while 10.5.0 is missing this.
Try adding this line (and the variant "linklibs-armhf" instead of hd) but it did not solve the automatic building of the missing lib. I must do "linklibs-aeabi-arm-quick".
Anyway after have build the aeabi lib i succefully built the toolchain (after many hours...). Smile
To test I restarted from selecting option 21 (on rebuild.sh) but after many hours i get the same error of the kernel includes not found...maybe i need to modify the configure script for my case.
With the toolchain built i try to build the core-linux-armhf (DEBUG) (option 22) but after a while it stopped with
"cannot find -laeabi " so i made it built manually...and now i can continue compiling...i'll let you know if all goes ok.
== Hardware ==
===64bit===
====BCM2712====
With the Pi5
Broadcom VideoCore 7 vc7 is an integrated GPU with 12 cores and up to 800 MHz clock. VideoCore VII is capable of OpenGL ES 3.1 and Vulkan 1.2. The driver support for the Raspberry Pi continues to build upon the [https://lore.kernel.org/dri-devel/20230928114532.167854-1-itoral@igalia.com/ open-source V3D driver] stack within [https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25450 Mesa] hopefully be merged for Mesa 23.3. x265 HEVC accelerated untested, x264/h.264 and VP9 cpu only.
*Raspberry Pi M.2 HAT+ Expansion Board
*Geekworm X1001 PCIe to M.2 Key-M NVMe
*Geekworm X1003 PCIe to M.2 HAT NVMe SSD PIP Board for Raspberry Pi 5
*Pineboards Pi Hut HatDrive! M.2 HAT 2024/V4
*Hat+ Gen2 Gen3 Nvme
*GeeekPi 52Pi N04 for Raspberry Pi 5 NVME M.2
*
*2024 RPI AI HAT - Hailo 20TOPs no LLMs
*2026 RPI AI HAT+ 2 - Hailo 40TOPs slightly better?
[https://www.raspberrypi.com/documentation/accessories/camera.html Cameras for Pi]
*Raspberry Pi camera module, the V3 with Sony IMX708 back-illuminated CMOS 12 Megapixel sensor
*Raspberry Pi Camera Module V2 – 8MP Sony IMX219 Sensor
*Raspberry Pi camera Rev 1.3, 5MP 1080P OV5647 image/video module, 2592 x 1944 pixels
====BCM2711====
With the Pi4 an ARM a72 cpu is about x3 times the size of an a53 in the Pi3
the 2711b line used more power when idle, compared to the 2711c
*2018 Raspberry Pi PoE HAT Power Over Ethernet Hat - design issues
*2020 Raspberry Pi PoE+ HAT Power Over Ethernet Hat Pi3b+ Pi4 only - better design
*Waveshare PoE HAT (B) with cooling fan for Raspberry Pi 3B+/4B 802.3af PoE
*[https://github.com/axizo-pi/V3DLib vc6 V3D 4.2] is derived from [https://docs.broadcom.com/doc/12358545 vc4], but it is [https://docs.mesa3d.org/drivers/v3d.html significantly different]
The QPU pipeline stays mostly the same, you still have an add ALU and a multiply ALU and it can issue two ALU OPs per cycle. There is still 4 SIMD lanes, interleaved over 4 cycles.
The instruction encoding for the QPUs is different, but the core instructions are the same.
Instructions for packed 8 bit int math has been dropped, along with most of the pack modes.
Instructions for packed 16bit float math has been added (2 floats at in a single operation)
With vc5/vc6, you write two packed 16f value to the tilebuffer (or four writes of 32f, if you are using the rgba32f framebuffer). And there is a handy vfpack operation which allows you to pack two f32s into a single 32bit value in a single instruction. You can vfpack directly into the tile buffer register.
the multiply ALU can now fadd, so you can issue two fadds per instruction. the add ALU has gained a bunch of new instructions
the A and B register files have been merged. You still only get an A read and a B read per instruction, but they read from one big register file (which means the underlying memory block has gone from two sets of "one read port, one write port" to one "two read ports, one write port" block)
The theoretical max FLOPs per QPU remains the same at two per cycle, other than the bump from 400mhz to 500mhx but it looks like a lot of effort has been put putting those theoretical FLOPs to better use.
*vc4 could run one or two threads per QPU. When you ran in two thread mode, the available register file halfed to 32 registers.
*vc5 added a four thread per QPU mode, with 16 registers per thread.
*vc6 doubled the size of the register file. You could now use all 64 threads in two thread mode and 32 registers in for thread mode. Single thread mode was removed, you always have at least two threads.
With the threading improvements, the QPUs should spent much less time idle waiting NOPs for memory requests. Most of the design changes have gone to improving the fixed function hardware around the QPUs. A fixed function blend unit has been added, which should reduce load on the QPUs when doing alpha blending. hope software blending is still possible
The tile buffer can now store upto 4 render targets (up to 128bits per pixel, so if you are using 4 32bit render targets, you can't have a depth buffer)
A MMU, allowing a much simpler/faster kernel driver.
Many more texture formats, framebuffer formats.
h264/x264 as Pi3
All the features needed for opengl es 3.0
H.265 / HEVC decoder is a HEVCv2 Main 4:4:4 10 design supporting bitstreams up to profile 5.1
HEVC hardware decode supports 4kp60, 10-bit. Audio output is pretty much unchanged, but the HDMI audio channels now support 8x192kHz bitrates
Each ALU typically have 2 floating point operators, and as you pointed out in a earlier post videocore 6 is no exception, with both a multiply and additive floating point operator. Thus theoretical GFLOPs are calculated with both operators in mind. That is what the 2 in my formula represents, and is common across any modern programmable shader, whether you calculate Nvidia, AMD, Intel, Boardcom or any other company's GPUs. Total ALUs * 2 * GHz clock = GFLOPs, In the case of Raspberry Pi 3, it's 24 ALUs * 2 operators * 0.4GHz = 19.2GFLOPs
If the Videocore 6 does indeed only have 16 ALUs (16 * 2 * 0.5GHz), you'd have only 16GFLOPs but they are better utilised
Possible maximum performance
<pre>
VideoCore IV @ 250MHz: 250 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 24 Gflop/s
VideoCore IV @ 300MHz: 300 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 28.8 Gflop/s
VideoCore VI @ 500MHz: 500 [MHz] x 2 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 32 Gflop/s
</pre>
Faster LPDDR4 memory.
====BCM2837====
With the Pi3
* Broadcom BCM43438 chip provides 2.4 GHz 802.11n wireless LAN, Bluetooth Low Energy, and Bluetooth 4.1 Classic radio support, 3B+ [https://github.com/aros-development-team/AROS/commit/afa5bc0bb17d5dd06bcfdbac00853a3799ca8d76 LAN7515]
The overclock ability has diminished with each chip version as the energy usage has increased. BCM2837 is one of the warmest yet and benefits from active fan cooling if all four cpu cores are in use for a short while. Video playback maybe affected due to the lack of custom support in the GPU with Aros. 5 V / 2.4 or 2.5 amp power supply recommended if all four cpu cores are running, else throttling (cpu slowdown) might occur.
[https://github.com/hermanhermitage/videocoreiv/wiki/VideoCore-IV-Programmers-Manual Dual VDP] and scalable QPU in [https://docs.mesa3d.org/drivers/vc4.html VC4] and x.264/h.264 accelerated untested only and VP9 on cpu or neon help
ARMv8-A has [https://developer.arm.com/documentation/102412/0100/Privilege-and-Exception-levels privilege levels] where userspace typically runs at ‘EL0’, the kernel at ‘EL1’ or ‘EL2’ and the firmware at the highest level ‘EL3’.
===32bit===
=== Core Kernel ===
====BCM2708(family)====
which includes the [http://elinux.org/RPi_Hardware BCM2835] (ARM1176JZF-S 700 MHz CPU + VideoCore IV GPU + up to 1GB RAM)
*Framebuffer (fb) using mailbox
*IRQ scheduler, etc
*Arasan based SD Card controller
*Synopsis DesignWare USB 2.0 OTG controller [http://networkdirection.net/index.php?option=com_content&view=article&id=106:rasperry-pi-usb-controller&catid=45:raspberry-pi&Itemid=54 Unofficial DOCS pdf], [dwc_otg.c FreeBSD], [], [https://www.riscosopen.org/viewer/view/mixed/RiscOS/Sources/HWSupport/USB/Controllers/DWCDriver/ RiscOS USB Driver], [https://www.riscosopen.org/forum/forums/5/topics/878 RiscOS USB Discussion], [https://www.riscosopen.org/forum/forums/11/topics/1893 Other USB RiscOS], [http://plan9.bell-labs.com/plan9/index.html Plan9 Miller's usb] http://plan9.bell-labs.com/sources/contrib/miller/, [https://github.com/Chadderz121/csud CSUD driver],
*[http://www.smsc.com/media/Downloads_Public/Data_Sheets/9512.pdf SMSC 9512] USB LAN/Hub chip
*CMOS RAM
*VCHIQ port which sends messages to the GPU e.g. for mouse, keyboard, audio on HDMI, etc
*Audio Driver
*Serial Peripheral Interface Bus (SPI)
*[http://www.susa.net/wordpress/2012/06/raspberry-pi-pcf8563-real-time-clock-rtc/ I2C registers]
*I2S
*Universal Asynchronous Receiver Transmitter (UART)
*[http://elinux.org/RPi_BCM2835_GPIOs GPIOs] and [http://www.adafruit.com/blog/2012/08/17/broadcom-bcm2835-peripheral-memory-map-and-gpio-alternate-use-chart-piday-raspberrypi-raspberry_pi/ Alternative view of GPIO]
BCM2836
* For Pi B+, PI 2 and Pi 3 SMSC LAN9514 chip adding 10/100 Ethernet connectivity and four USB channels to the board
*[http://www.andrewscheller.co.uk/rpi_pcb_modules.html PCB], [http://elinux.org/RPi_Low-level_peripherals Low level features],
Implemented so far...
# Modify the configure system so that it correctly builds for the arm hardware float raspi target.
# Implemented the bootstrap to load the aros modules and prepare the arm to jump into them. Reworked the x86 console support so that parts can be stolen for raspi to use since t has no basic functionality to output to the display.
# Implemented a kernel.resource to prepare the raspi for running aros and provide the low level api calls to expose available resources and allow exec, etc function.
# Implemented serial debug support
# Implemented the exec (and kernel) functionality required to make multitasking work (and interrupts, exceptions, syscalls, etc)
# Implemented a timer.device to utilise the hardware timers.
# Implemented a very basic gfx driver to expose the hardware's framebuffer.
# Implemented an SD-Card driver for AROS which presently only supports the raspi's chipset but can easily be modified to support all sd-card hardware and media.
# Fixed the fat filesystem support in AROS so that it can boot on RasPi's normal SD-Card setup. The "rom" image files needed use a different filename than the default linux, etc images so can be easily installed without harming the existing files - you only need to change the loaded images in the config file to get aros to boot.
# Updated the build scripts to automatically download the necessary raspi firmware files and wrap it all up so that you can simply extract the archive to a fat formatted sdcard and boot it on the raspi without having to get anything else.
# fix everything in contrib and ports to build for raspi (needs proper testing/fixes but allows every component to actually compile at least, including owb) + numerous other fixes to get things working on arm/raspi ..
Improvements...
# Implement a USB chipset driver "OR" finish the existing one [https://github.com/aros-development-team/AROS/commit/c07d13c724f944674be5db54fc6a71ee72a01809 usb otg] - the current code is mostly a skeleton that should initialise the chipset and then needs relevant code to support the different transfer types. It also has the "virtual" hub code in place to represent the raspi's USB port (from poseidons p.o.v)
# Implement a driver for the USB NIC (a few weeks - depends on USB above)
# Write an [https://github.com/aros-development-team/AROS/commit/d55d0f74d20b769bbb8c8d386e5c1d7a9154f05a audio driver] (a few weeks - independent of USB) and [https://github.com/aros-development-team/AROS/commit/e93a4c245f27a87c9c4c1d39206694b39059998a HDMI]
# fix syscall bug in the current raspi kernel code
# Graphics depend on having a decent "bcmdma.resource" implemented as to use the cpu's dma engine. The sd card driver needs to use it for transfers to/from the controller - and the gfx system needs to use it for "blitting".
# [https://github.com/aros-development-team/AROS/commit/4019d84e4975d4dad987a12d57fe108f5ac048e6 Improve the gfx driver], [ vc4gfx HIDD] add [http://dri.freedesktop.org/wiki/VC4/ Gallium3D support]
# [https://github.com/aros-development-team/AROS/commit/b13905b3e8e45b089f520b44692c81affddd066f Improve] the [https://github.com/aros-development-team/AROS/commit/3a876755c070f5c73c4f53c7f4d35b4f923088b9 sdcard] device driver - which is also pretty basic but should work with most cards, rework it to also support pci, etc. sd card interfaces on x86
# The current code using very rudimentary access to the gpio interface - so that should be implemented as some resource for other components to access, as-well as the i2c interface exposed over the gpio interface. that should have a hidd class implemented which uses the gpio resource to communicate.
Boot up typical for most other OSs before the open sourcing of many binary blobs from 2017 onwards
On power-up, the rpi [http://www.open.com.au/mikem/bcm2835/ BCM 2835] [https://github.com/hermanhermitage/videocoreiv VideoCore4] GPU, not the ARM CPU, is in control, and the SD card slot is the only peripheral device with power. The firmware burned into the BCM2835's VideoCoreIV GPU PROM requires a DOS-style partition table; a FAT-formatted first partition; and the freely redistributable but closed sourced Broadcom files “bootcode.bin” and “start.elf” in that partition.
The boot sequence carries out several pre-boot tasks
*On powering of the rpi, the GPU reads and executes bootcode.bin, which then loads start.elf
*The GPU loads the “start.elf” file, eventually, into the L2 cache and then executes it
*configures the memory split for the CPU and GPU
*reads and parses “config.txt” from the same partition on the SD card and applies the settings (like a PC’s BIOS settings)
*loads the “kernel.img” file, again from the same partition
*activates the CPU to begin executing the loaded kernel image
The CPU/GPU memory split is hard-coded into start.elf, so Broadcom provides three start.elf images, to give 32M, 64M, or 128M to the GPU for multimedia performance, and the remainder to the CPU.
RPi uses [https://github.com/raspberrypi/firmware some closed source loaders] and at some point it loads a binary blob named "kernel.img" at 0x8000, at that point there would be a rudimentary Aros alive. If one wants to use the SD-card then there would have to be a driver for the interface and a fat filesystem handler (SD-card has to be formatted to fat filesystem)
Boot code and kernel are now linked together and made into that binary blob, just for starters. Raspberry Pi uses [http://kernelnomicon.org/?p=133 u-boot] and [http://kernelnomicon.org/?p=138 UBoot] as bootloader, there's already some code in the Efika MX port for that. UBoot is a native bootloader and not just for the raspberry pi, it loads after start.elf.
You can find Efika MX port from arch implementations, some hacking is needed for the mmakefile.src'es as iit dates back to before the Aros crosstool era or else you get some weird errors while building. You also need to code the bootstrap and serial handling.
At the moment it seems that a fastest route for the native build would be to make one binary blob without using the package system. Raspberry's memory layout is pretty simple and if the implemented u-boot doesn't support loading other modules
<pre>
? - alias for 'help'
mtest - simple RAM test
autoscr - run script from memory
base - print or set address offset
bbm - BBM sub-system
bdinfo - print Board Info structure
boot - boot default, i.e., run 'bootcmd'
bootd - boot default, i.e., run 'bootcmd'
bootm - boot application image from memory
bootp - boot image via network using BootP/TFTP protocol
cmp - memory compare
coninfo - print console devices and information
cp - memory copy
crc32 - checksum calculation
echo - echo args to console
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls - list files in a directory (default /)
go - start application at address 'addr'
help - print online help
iminfo - print header information for application image
itest - return true/false on integer compare
jade -
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loady - load binary file over serial line (ymodem mode)
loop - infinite loop on address range
md - memory display
mm - memory modify (auto-incrementing)
mtest - simple RAM test
mw - memory write (fill)
nfs - boot image via network using NFS protocol
nm - memory modify (constant address)
pci - list and access PCI Configuration Space
ping - send ICMP ECHO_REQUEST to network host
printenv - print environment variables
rarpboot - boot image via network using RARP/TFTP protocol
reset - Perform RESET of the CPU
run - run commands in an environment variable
saveenv - save environment variables to persistent storage
saves - save S-Record file over serial line
setenv - set environment variables
sleep - delay execution for some time
tftpboot - boot image via network using TFTP protocol
USB - USB sub-system
usbboot - boot from USB device
version - print monitor version
</pre>
And there is one more thing about modular ports. In order to actually implement this, your bootstrapping environment should provide the ability to load several files. On PC this is provided by GRUB2. on CHRP you can read filesystem via OpenFirmware, and Sam's Parthenope relies on modified u-boot. If your bootstrap allows to load only a single file, then you stuck with monolithic kickstart. By the way... u-boot allows not only to boot up a single uImage or zImage, it also allows to write client programs AFAIK. With this approach, you actually can write modular bootstrap for ARM AROS using unmodified u-boot.
Most used [http://www.compulab.co.il/workspace/mediawiki/index.php5/U-Boot_quick_reference uboot options] are fatls usb 0:1,
the reason behind INTB_KERNEL is to allow use of the standard Exec function AddIntServer() to add interrupt handlers for
hardware drivers etc. AmigaOS never used it for abstract hardware drivers. AmigaOS routed only raw hardware IRQs there. Their assignment was hardcoded. As well as number of them. Actually on AmigaOS every bus has its own interrupt subsystem. For example PCI bus. PCI interrupts on Amiga are routed to a single exec interrupt. 1:1 relationship between CPU and hardware interrupts is present only on PC.
IMHO we miss things like AddInterrupt/RemInterrupt methods on our PCI subsystem's device class. PCI bus class should map these methods to whatever is appropriate. This is how it is done on AmigaOS and friends. When these are implemented, raw kernel.resource API will be needed only for several PC-specific drivers with hardwired resources. Exec IRQs are real IRQs only on Amiga hardware. On other machines they can be emulated where appropriate (VBlank is a good example). kernel.resource is meant to be different, its IRQs are hardware-agnostic, they are plain "Hardware IRQ number X, whatever this means". They are low-level actually, and meaningful only in the context of a particular system.
Was that not the transition from irq.hidd to kernel.resource? No. A long time ago there was another hacky bit named INTB_TIMERTICK. It was "abstract timer interrupt", used by timer.device. It was the same as VBlank, but with larger frequency. I removed it, because kernel.resource API was a cleaner way to access this interrupt. Furthermore, there can be more than one timer in the system. Thinking about bringing back timer HIDD definitions again. hpet.resource is a bad idea.
Can someone please enlighten me a little on how the scheduler is meant to work?
Poseidon.library creates its "Poseidon Event Task" during RTF_COLDSTART -> then calls Wait(), and ends up in limbo because wait disables interrupts (used for the scheduler heartbeat), and basically waits forever because the sigbit is never set, since krnSwitch doesn't switch the task unless TF_SWITCH is set, and no codepath run during this seems to set it?? TF_SWITCH does not disable/enable switching. This flag just enables to run user-supplied hook when the task is being switched away. It is completely safe to call Wait() in Disable()d state. Doing this actually temporarily breaks this state. IDNestCnt gets remembered in struct Task, then next task is selected, and its IDNestCnt is restored in sysbase (see kernel_scheduler.c). If there are no other tasks, then your cpu_Dispatch() should enable interrupts on the CPU and enter idle mode. See x86 implementation for good example.
You miss what happens next...
1. KrnSwitch() saves context of your task, saves IDNestCnt (core_Switch() and cpu_Switch()), then drops into cpu_Dispatch().
2. cpu_Dispatch() calls core_Dispatch. Then two cases are possible:
2a. There is a READY task. It is picked up, its IDNestCnt is restored in SysBase, then cpu_Dispatch() needs to restore registers and exit. The next task is run.
2b. There are no READY tasks. core_Dispatch() returns NULL. In this case your cpu_Dispatch() should enter idle loop. It should just enable interrupts on the CPU and put it on halt. This allows it to process hardware interrupts. Eventually some of your interrupt handlers wakes up your task and puts it into READY list.
My heartbeat interrupt has been slowed atm to help debugging - but it never actually gets a chance to fire because of the Wait() disabling interrupts. Perhaps you have forgotten to enable interrupts in your idle loop.
There is a change in the format of AROS executables. Until now we were using Elf RELocable files which are usually used as intermediate object files. We had them for various reasons, one of them was how AROS files were built in the past. That days we had no real aros cross compiler and the option to embed relocation data in unix executables (or in executable files in general) was rather new and not every linux/unix system had it. Therefore we have decided to use intermediate files. Although it was somehow working (and it is still working :-)), it has some drawbacks. Therefore decided to introduce real Elf EXEC types, in first turn implemented on ARM target with option to expand in future to all other AROS architectures.
The first patch was pretty easy and appeared to work somehow. It generated nice executables with embedded relocation info. Not only that, it also removed all global symbols adjusting relocation data to be relative to the beginning of the sections. That move reduced number of symbols in each executable significantly (depending on the file between 20 and 80% of all symbols could be removed). The only symbols that stayed in the file are local ones - due to the nature of the patch wasn't able to remove them since we have not seen them in the symbol hash table.
The patch didn't worked though. The files were relocated, AROS kernel loaded, but it crashed very early. What happened? Well, the nature of ARM relocations happened :)
Most of the relocation data on all machines is rather simple. Relocation can be absolute or pc-relative, sometimes the offset has to be bit shifted. On ARM v7 there is another one. There, when one wants to load an address of function/variable into register a combination of two instructions can be used: movw and movt. The first one loads immediate into lower 16 bits of a register while clearing upper 16 bits. The second one loads immediate into upper 16 bits without touching lower halfword. Loading of a pointer into a register looks like this:
movw r0, #:lower16:label
movt r0, #:upper16:label
In this case there are two relocations - one for lower halfword and another for upper. If an overflow of lower 16 bits occurs during relocation process, the upper one should be updated as well. Unfortunately with current patch and with typical ARM executables there is not enough information to perform the calculations.
There are two options - the first one would be to give up and go back to "fake" executables, another one would be to change from REL to RELA relocation info. The latter contains an addend, extra data which can be used to perform all the relocation calculations I need.
Decided for the second option. The patch is already in the works. There is another function for the binutils' bfd backend to perform the final relocation. There can decide what to do with every reloc info, modify data and eventually strip some symbols. An advantage is - at this stage of the linking process have also full access to all local symbols so can change all relocations section relative and eventually strip all symbols from the files.
GPU
VCore developed by Alphamosaic Ltd and now owned by Broadcom. Most of start.elf runs on the GPU. Placing ALL the userland GPU code in the videocore.hidd isn't going to be a terribly big problem because the code they published is nothing more than a shim that sends data straight to the GPU to execute.
The good news about this is that we only need to write our HIDD using the OpenVG API. The shim is relatively small codewise and lives in the ARM memory (the actual OpenVG code itself lives in the GPU RAM area and its loaded from start.elf). That's also the bad news. Our driver has to translate AROS video calls to OpenVG calls, for most tasks it should be easy, for some, not so much. It's still probably less difficult and less work, than controlling the GPU directly.
The other good news is that anything done through OpenVG happens on the GPU, its truly accelerated. It also has some nice font functions, meaning we can lead into an accelerated text mode later.
Basically, AROS resets or locks up when it tries to use AROS_ATOMIC_INC or DEC. If I comment out the byte/word operations in the header files and use non-atomic operations, the code works as expected.
have read that the L1 cache needs to be enabled to use LDREX and co (which I also read is only meant to be used on multi processor systems with shared memory) - however I am certain this is correctly enabled.
If you are using LREX or STREX, you should have L1 cache enabled, at least on the ARM CPU I work with at work.
L1 cache is enabled by enabling the MMU *AND* setting the C and I bits in the CPU - the C bit is ignored, and the I bit only covers the 16 byte instruction pipeline if the MMU is not enabled.
Can you verify that your assembly is generating LDREX/STREX? From the behavior, it almost sounds like its generating the default Semaphore locked atomics.
Impossible. There are no semaphore-locked atomics. There are Disable()/Enable()-based ones instead. And there's a special #define AROS_NO_ATOMIC_OPERATIONS in this case, which tweaks Disable()/Enable() implementations not to recurse forever.
I have tested this on ARMv5 which does not have ldrex/strex, it works fine. On those ARMs there's no way to have real atomics. On other OSes (like Linux) this is done by introducing things like atomic_t, which appears to be a complex structure, holding the value together with accompanying spinlock (implemented using swp).
#warning "TODO: lookup optimal mmu table settings for raspi memory"
/* Set up an identity-mapping for all 4GB */
for(x = 0; x < 4096; x ++)
{
pagetable[x] = x<<20 | (0x40002|0x80000|0x010000|0x00C00|0x04);
}
Shouldn't there be a second loop that sets the 'C' bit in the descriptor for the RAM pages?
Currently, you have TEX=0, C=0, B=1 for all pages (Shared Device).
You should have TEX=0, C=1, B=0 for RAM (Write-Through, Cached)
So ..
pagetable[x] = x<<20 | 2;
should be enough?
No, for RAM you need to change the '| 0x40' to '| 0x80'
tell dosboot the correct defaults to use
Please don't do this. This bootconfig.c is a deprecated legacy thing. I wanted it to go away completely with time. Instead, display drivers should auto-install themselves during own initialization phase. I. e. detect hardware=>instantiate itself. This should make things way simpler. With this approach you only need to add the driver into KS image to get the device autobooted. No hardcoded stuff.
Currently VESA and VGA drivers do this, look there for examples. never rewrote ATI driver because i don't have any test system for it.
they defined a smaller AROSCPUContext than the ExceptionContext - yet reference it as ExceptionContext in other places, and since it hasn't allocated enough storage for ExceptionContext, are corrupting memory/the structure (since the elements that are there don't map 1 to 1 with the exception context).
AFAIK, AROS has been moving in a different direction to this in recent years. It is the job of graphics HIDDs to allocate bitmaps etc. so that they have the most suitable characteristics, including allocating them from GPU RAM where possible. The concept of chip RAM is only for legacy code, and most if not all non-68k platforms should have all system RAM
marked as chip.
BTW, is the video processing code you mention CPU code or GPU code?
Also, IIRC we have support for "external memory allocators". Perhaps that's what we need for the allocation of GPU RAM through the mailbox.
All hosted and x86 native ports should use proper context formats.
trying to clarify if the vblank handler has to have run by this point to prevent this deadlock. Actually, no. Unless you have installed VBlank handler which should wake up at some point. Without VBlank there will be no quantum count. Consequently, there will be no forced preemption. But the rest will work, and multitasking will be cooperative (switch happens only when current task voluntarily gives up the CPU). Does it depend on the vblank having run before this point? and if yes what does that mean on systems where it might be able to run enough code (e.g. get to this point) before the vblank interrupt has triggered? What is it waiting for? It could wait for timer, in this case you need timer.device working. VBlank is currently needed for exec's quantum counter. In current native ports we have only a single timer, which is served by timer.device. VBlank is simulated by timer.device also. If your machine has two timers, then you can use one of them for VBlank, and another for timer.device, this will simplify things down. VBlank needs to be 50 Hz for historical reasons, many programs use it as cheap timer. I am periodically thinking about making some abstract mechanism to be able to change quantum source (and untie it from 50 Hz), but have no time to come up with something good. Additionally i started disliking timer.device hardcoded design when PC has got many timers (old 8253, APIC, HPET).
Currently i think there should be some low-level entity representing tick source. timer.device should just select the most appropriate source for its units.
The BCM2835 has 4 GPU based timer sources - 2 are used by the GPU, so im using Timer3 for our heartbeat and the remaining one will be free to the system. There is also the less capable ARM timer but that is dependent on the CPU frequency. Very good. You won't need any emulation. Set the heartbeat to 50 Hz and drive VBlank from it. Use other timer for MicroHZ.
Can you use the 'econsole.hook' I make for debugging the Sam460 via the serial port?
It provides a before-anything-else shell prompt on the serial port. You can then do 'NewCLI' to test your graphics, or use any DOS command in shellcommands.resource.
You should just be able to add econsole.hook to your module list, and use 'econsole' in your bootargs.
So long as you have a working Exec/RawMayGetChar and Exec/RawPutChar, it should work.
Also make sure to add shell.resource and shellcommands.resource for this.
That should have done it.
If you set "#define DEBUG 1" in arch/all-native/econsole/econsole.c, do you get any additional serial output?
have added it to the build and added econsole to the command line - and can see the bootloader picks up on the emergency bootconsole tag, but I still only get the insert bootable media display?
Im assuming it exposes a fake filesystem that tricks aros into booting?
The contents of which are: ECON:AROS.boot
Way to handle the scheduling code? The implementations I had been following were causing problems, due to cascading interrupts which I cant handle properly in the asm stubs just now (when they break disable etc.) - since it means detecting the interrupted codes cpu mode and getting the correct sp/lr for it, and that's just too tedious for arm.
To work around this ive added a system idle task which does nothing - and when the scheduling code has no task to run switches this in and lets it run, thereby allowing the interrupts etc to resume until something does need to happen.
Also, by adding accounting code to cpu_Switch() and cpu_Dispatch(), it should allow the system to log idle time correctly (as well as running tasks).
have thought of also adding an additional task that never runs, solely to record time spent in IRQ handlers, but I digress..
was under the impression that kernel.resource should *never* be used outside of exec.library. This is a wrong impression.
Michal started designing it because portable nature of AROS does not fit well into exec's API with all its assumptions. So, he started the new, hardware-agnostic kernel API from scratch. Yes, exec sits on top of it in places. But kernel always meant to be open thing. Otherwise it would not exist.
it wasn't meant to be just used willy nilly by user code - but by lower system components (e.g. exec) so that they could be implemented in a more generic fashion, and the kernel resource itself hide the systems quirks.
Adding new things there perfectly keeps up with our decision to minimize AROS-specific intervention into APIs which can clash with MorphOS or Amiga OS4 extensions. We want at least source-level compatibility there. Binary compatibility on PPC would be extremely cool, but at the other hand we have no maintainer for this, as well as their ABIs splintering.
It depends on what exactly is being implemented - there's no reason we should have everything crammed into kernel.resource if it doesn't need to be (i.e. if its better suited as a separate component/subsystem in its own right)
The _LE versions are for when you have endian swapping taking place. If the graphics are the same endian as the CPU, no swapping should occur. I ran into a similar terminology problem in SDL with a friend insisting that his Radeon 7000 on his PC was big-endian. It is not, it just uses the same endianness for the graphics card and the CPU so no swapping was necessary. They were both little-endian.
The _LE versions are because the PixFmts refer to the bitmap data being in big endian format in memory, for which the normal version would need to do endianness conversion before applying the shifts/masks. on this platform it is in _LE in memory also so we don't need the conversion hence using the _LE version of the call). would use _LE (if it's really little endian 16 bit mode).
What is the bare minimum needed to implement a framebuffer based gfx driver, with our software handling the rest?
Have tried with just a gfx class that only expose new/dispose/newbitmap - and having an onscreenbitmap used only for the framebuffer itself (with all other bitmaps being chunkybm, and the framebuffer's superclass also being chunkybm), but that alone isn't enough it seems?
You can use workbench/hidds/sm502/ as your example - it is as simple as I could make it.
So, AROS creates the framebuffer bitmap (verified this) -> so surely it should be capable of then rendeing into it? I don't actually create the framebuffer "bitmap object" myself - only as a result of being asked to. The code I currently have on SVN seems to create the framebuffers bitmap object fine, but then crashes in intuitions DisplayDriver callback. In particular it crashes performing the getattr on the system default pointer. don't expose MEMF_CHIP in an allocatable form so AllocSpriteData was failing (and other code later doesn't check if the values are valid == illegal memory accesses)
So far have -:
vc_init: queries the gpus memory, and sets up a fake memory handler for it, then adds the bootmode driver and returns saying all is well
vc_gfxhidd:New: sets up some fake syncmodes to test with and creates the real gfx object.
vc_gfxhidd:NewBitmap: checks if its a framebuffer and uses the onbitmap class or uses the chunkybm class otherwise
vc_onbitmap:New; creates a chunkybm object and then pushes the real framebuffer address into it as the buffer,
vc4 had v8adds, v8subs, v8muld, v8min and v8max which operated on four 8bit uint values packed into a 32bit register. Multiplication was in the range 0.0 to 1.0 and addition/subtraction saturated. There were also a range unpacking/packing modes that allowed you to pack and unpack 8bit values into 32bit registers.
RasPi has to speak to the "operating system" which runs on the GPU itself and request/free memory - it cant directly manage it itself, and so the managed functions were used to wrap these calls.
The Arm and GPU share memory space. The framebuffer is shared. The Arm can write a pixel and it will appear on the screen (through GPU hardware) without flushing/copying being required.
The GPU can composite multiple FB's in real time - so you have a number of surfaces defined which are rotated etc and composited in real time to the output. Copying can map from the address space of the Arm to the flat space of the GPU which takes some code, but I don't think whole buffers are copied.
The DMA hardware can also access the whole memory space and can perform 2D fills and blits (no blending). This is documented in the peripheral spec posted. The DMA is just an Arm accessible peripheral and can be set up with low latency (e.g. microseconds).
must use a 0xc0000000-based bus address to access SDRAM, yet non-DMA access should go via a 0x0-based bus address.
For 2D dma, set TDMODE, and the spec says "interpret the TXFR_LEN register as YLENGTH number of transfers each of XLENGTH, and add the strides to the address after each transfer." so set STRIDE to pitch of the image, the width is XLENGTH and height is YLENGTH. You would fill by not setting the SRC_INC and point source to your fill data.
The DMA cannot see the ARM's L1 cache, so you would map the framebuffer with ioremap_nocache. Depending on where the source data comes from, it may need an L1 cache flush. The DMA can see the L2 cache. Use 0xC0000000 bus addresses when L2 is disabled and 0x40000000 bus addresses when L2 is enabled. (actually just call virt_to_bus and you'll get the right address out).
openGLES/openVG has high latency. Writing to framebuffer then reading it back is very inefficient (e.g. milliseconds). If you can drive it a unidirectional way, just streaming commands at then that is efficient. openVG is not implemented on top of openGLES - it uses the same hardware but as a first class interface
To improve the Gfx driver, we will need a DMA resource implemented so can use to perform DMA operations. The Gfx driver will need this to perform blits.
Actually MEMF_CHIP has to present, for historical reasons.
This has been never fully agreed upon, but in ports i wrote i exposed the whole memory as MEMF_CHIP. The idea behind this is that CHIP is originally the memory where graphics and sound data can be put. On non-Amiga platforms there are no restrictions on this, so the whole memory is CHIP.
Yes, many old software can misbehave with CHIP memory size larger than 2MB. But this actually applies only to m68k AROS which is going to run m68k binaries. In other cases it's quite logical to fix the program when porting.
As to original question: yes, it's enough to have a framebuffer bitmap (one with aoHidd_BitMap_FrameBuffer set to TRUE) and PutPixel routine. It framebuffer can be served by chunky bitmap class, then you can simply create chunky bitmap with your own buffer (see how VESA driver does this). Chunky PutPixel is already there.
struggling to determine what is the correct pixfmt to use for the 24/16/15 bit gfx modes on the RasPi. AFAIK it uses RGB565, for 16bit but im unsure what shifts etc should go with it? suffice to say Im getting the wrong colors so far lol.
<pre>
redmask: 0x0000F800
greenmask: 0x000007E0
bluemask: 0x0000001F
alphamask: 0
redshift: 16
greenshift: 21
blueshift: 27
alphashift: 0
</pre>
It should likely be vHidd_StdPixFmt_RGB16_LE
This stuff is a bit confusing. The "names" of the stdpixfmts are based on the layout in memory,
ignoring endianess. So for example:
ARGB32: will be 0xAA 0xRR 0xGG 0xBB in memory on both big endian and little endian machines.
The shifts and masks OTOH are based on pixel access (ULONG in this case), so differ depending
on whether you run on big endian machine or little endian machine (that's why there's stdpixfmt_le.h and
stdpixfmt_be.h in rom/hidds/graphics/).
With the 16 bit pixel format it's even more confusing, as for example it's impossible on little endian machine
to describe RGB16 with shifts/masks alone. That's why there's vHidd_PixFmt_SwapPixelBytes_Flag.
(RGB16 == RRRRRGGG GGGBBBBB in memory, and for pixel (WORD) access on little endian machine it needs to
be accessed as GGGBBBBBRRRRRGGGG).
The shifts btw indicate how much to shift the component to the left (!) so that it is moved to the highest bit (31).
The aHidd_PixFmt_StdPixFmt you specify will be ignored most of the time, because when the pixelfmt is registered,
the gfx hidd checks if there's an identical pixfmt (shifts/masks/etc., but ignoring pixfmt->stdpixfmt) already in the system,
and if so, it uses the already existing one and does not create a new one.
In theory it would be better if gfx drivers could simply/only specify a StdPixFmt without all the shifts/masks stuff when the
gfx driver uses pixfmt which matches one of the stdpixfmts exactly. Another possibility would be for gfx drivers to use
HIDD_Gfx_GetPIxFmt(stdpixfmt_gfx_driver_wants_to_use) and then peek shifts/masks from it and fill out a pixfmt
tag list based on that.
15bit very blue/green: Try to pass same shifts/masks/etc. as in 16 bit pixfmt (maybe you think it's using 15 bit R5G5B5
(or swapped) but it's actually still using 16 bit R5G6B5 (or swapped).
aHidd_PixFmt_StdPixFmt you pass is mostly ignored. It's the shift/masks/etc. that count.
But I would still pass the correct one (_LE) == whatever rom/hidds/graphics/stdpixfmts_??.h uses
in the entry where you have looked up shifts/masks/etc.
Use the shifts/masks/etc. from the entry in stdpixfmt_le.h (if you are running on little endian machine) or stdpixfmt_be.h (if you
are running on little endian machine) that matches the pixfmt that its meant to be.
0xAA,0xRR,0xGG,0xBB on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_BGRA32)
0xAA,0xRR,0xGG,0xBB on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_BGRA32)
it feels like AROS trashes the alpha component, otherwise it should be 8A8R8G8B.
read on the subject suggest its in 1x5r5g5b (x is ignored) to keep 16bit alignment .
Suggests to me that wrong shift/mask are being applied - however going by the 16bit versions it all looks correct to me so I am really confused as to what is happening.
The output image looks to have too much green/blue, and very weak red.
Kickstart
The idea is to minimize amount of archirecture-specific modules to make the user's life easier. So, the kickstart was split into 'base' (which does not contain anything machine-specific) and 'BSP' (Board Support Package) which contains all hardware-specific stuff. This way, for example, distribution makers can save up space on CD and make CDs with multiple platform support. Different configuration would load the same base with different BSP's.
Next there was some part which is entirely missing on hosted. These are filesystems. Hosted ports do not need them to boot up, so on hosted they are left out. At the other hand, they are also architecture-agnostic. So i put them into 'FS' package (standing for 'filesystem').
USB
Poseidon is one more big part. I made it into separate package in order to allow users to omit it if they don't need it (for example, to run on retro PCs without USB). Personally i have one. Again, Poseidon is hardware-agnostic (well, there are USB drivers but HCIs are pretty standard).
AFAIK its HCI 1.0 compliant but not familiar enough with poseidons drivers, nor USB, to just hack away at the existing code. Perhaps once i'm more familiar with the workings I can merge in the changes needed to get it operating but for now I will focus on getting it running. Also our drivers have known issues so perhaps a fresh set of eyes might shed some light on what is going wrong.
Another interesting question is whether Poseidon can operate on device side. Is it flexible enough? How similar is being a USB host and USB device? think it will need a bit of work on Poseidon's side. Until then I will force the driver into Host/Master mode in the init code, but leave open device etc to configure the chipset for either's use - and look at trying to add support for working in Device/Slave mode & switching modes once it's up and running.
Actually USBROMStartup is some kind of kludge. Can there be any alternative? Could device drivers be self-installing, like our HIDDs? This would get rid of need to list them in USBRomStartup.
* Model A and B limited to 150 mA per port.
* Model B+ and Pi 2 introduced configurable 600 mA to 1.2 A support over all ports - anything above that requires a powered USB hub.
Implementing the hardware driver that Poseidon uses to interact with the USB components.
Have code in place to (try) and initialise the USB chipset, and configure host/device mode operation (though AFAICT Poseidon doesn't support device mode). Started to get the "virtual" root hub written for the single USB port so that Poseidon should at least list it correctly in the GUI - and try to interact with it to find peripherals.
The BCM2835 uses a soft IP block from Synopsys’ DesignWare library (DWC), specifically the block is called dwc_usb_2_0_hs_otg_subsystem-ahb_se (“USB 2.0 Hi-Speed OTG Controller Subsystem w/AHB Interface SE”).
There is no public documentation for this, and pretty much zero chance of anyone getting hold of it even with NDA. However, there's a Linux driver written by Synopsys ([https://github.com/raspberrypi/linux dwc_usb]). Specifically directories [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_common_port] and [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_otg].
The Synopsys code is actually under a fairly permissive licence – it's not GPL, it's similar to BSD (’don't sue us if it breaks’ is pretty much the only clause). So this should not be a barrier to porting the code.
The code is really well written, with a nice partition between the work done by the driver (dwc_otg, which is fairly involved, given the host does more work than a conventional EHCI driver), and the interface to Linux (dwc_common_port).
Probably only need provision of relevant changes to dwc_common_port. Other things to consider....
* Provision of necessary headers to get it to compile
* Provision of necessary functions (main issues are wait queues, threads, work queues, tasklets, timers, spinlocks and mutexes (multithreading) )
* Interfacing between USB stack and the driver. dwc_otg/dwc_otg_hcd_linux.c looks like the place to start.
the Linux bits of the headers are only required for the dwc_common_port library. dwc_common_port includes a variety of crypto functions which are not used – it appears to also be used for ultrawideband (UWB) and wireless USB (WUSB) drivers where crypto will be an issue, but it isn't going to be for plain wired USB.
Every USB driver acts as an USB hub as well in order to let Poseidon control the state of USB ports. The code there was reading status of the only USB port in Raspberry's CPU but when changing the status it erroneously deleted some of the status bits, including the port enable one. It was so because those bits in the status register are of a type Read/WriteToClear. It means, if one does not want to change their value from 1 back to 0, one has to actually write the 0 value. Very practical thing e.g. in interrupt handlers, where one reads the interrupt status register to learn what was the interrupt reason, and writes it back to the same register in order to clear the interrupts.
After fixing that code it turned out that the communication was still unsuccessful. Apparently the USB device was not understanding the host for some reason. That should not happen since the request sent was one of the standard ones implemented by virtually anything with an USB connector, assumed that Poseidon clears the data caches before forwarding the work to the USB drivers but that's the responsibility of the driver itself.
The USB device responded and acknowledged the transmission! But why were all the request sent after address change failing with timeout? They should not. Once again, address set is supported just by anything. Tried to contact the device at address 0 once again and there it was, still responding properly. The enlightenment came. The bus address for DMA transmissions was, as it is in many bare metal USB implementations, just the pure memory address of the buffer as seen by the ARM cpu. Have "prefixed" it with the real location of uncached RAM and booted AROS once again.
Trident saw this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
and this:
Product : Vendor: Vdr=0424/PID=EC00
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 255
SubClass : 0
DevProto : 1
VendorID : 1060
ProductID : 60416
DevVers : 0200
and even this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
What are these things? The first one is USB hub built in the Raspberry. Thanks to this one the Pi machines (with exception of Pi0 and computing modules) have more than just one single USB port. The second one is the network chip in raspberry, the third one is my USB SD card reader which have just connected to see what happens. AROS tried, of course, to boot from it ;)
So, the first step towards working USB is done. The control transfers are working as you can see above. Next step is to implement bulk and interrupt transfers, having the basics in place. Finally some error handling will be added and USB for Pi will be as complete as the PC version.
[http://www.raspyfi.com/raspberry-pi-usb-audio-fix/ Issue with USB Audio]
Audio
The Pi 4B is the only Pi that can output HD Audio as an HD Audio passthrough bitstream, and it does it over HDMI. It's possible to use the two HDMI output for separate HDMI video and HDMI audio outputs to allow UHD HDR video and HD Audio with non-UHD HDR compatible AVRs.
The Pi3B+ and earlier will decode to PCM 5.1/7.1 and output over HDMI. HDMI is the only interconnect that has a standard for carrying Dolby True HD, DTS HD MA etc. as a bitstream - you can't carry it as a bitstream on any other interface.
Pi3 and Pi4 audio jack output derived from 12bit pulse width modulation is relatively poor. For better, choose USB Audio or I2C versions.
[https://github.com/raspberrypi/linux/tree/rpi-patches/sound/arm audio] and its [https://github.com/raspberrypi/firmware/issues/2 very high speed message passing interface type of thing VCHI]
The Model B+ added an additional voltage regulator for the audio output and an additional output driver to drive low-resistance loads like headphones. However it is still using pulse-width modulation (PWM), which has a major impact on sound quality
the old Raspberry Pi used a linear voltage regulator to provide the 3.3V to many of the components on the board while the new one uses a switching regulator. Both can perform reasonably well. However switch mode power supplies often show higher noise figures
Analogue audio
Audio over HDMI rev 1.3 & 1.4
Ethernet
10/100 BaseT Ethernet RJ45 socket
GPIO
GPIO shouldn't be too bad but bear in mind it is already accessed in places so they would need to allocate pins etc through it (e.g. sdcard to flicker the activity light, serial debug to output data on the GPIO pins)
Probably a resource rather than a device...
Started an i2c driver that will need to allocate GPIO pins. Feel free to work on it if you are interested ;p
GPU graphics with 2D and 3D acceleration
Sadly none yet for 32bit but for 64bit...
Miscellanous
hdmi issues
Setting the hdmi_force_hotplug=1 makes sure the Pi believes the monitor/TV is really there.
You might also need to set config_hdmi_boost=4 or even higher (up to 9) if your display needs a stronger signal.
If the display is a computer monitor or newer tv, use hdmi_group=1 (auto HDMI use) and if it is an older TV, try hdmi_group=2 (for DMT formats, i.e. for PC monitors) then you HAVE to "set hdmi_drive = 2 to enable HDMI output as this forces HDMI mode rather than DVI mode
Do not set hdmi_safe=1 as that overrides many of the previous options.
Using a shorter or better quality HDMI cable might help. Make sure your Pi's power supply delivers 1 A and not 500 mA.
If you see a problem with the red colour - either absent, or interference - then try a boost
composite video
changing the RCA cable, then the composite port worked out of the box
Boot it as you are doing, without HDMI. If you now plug in the HDMI, do you get the image? In other words, does the Pi think HDMI is connected even when it isn't?
Rename all the files in the first partion of the card except bootcode.bin, start.elf and fixup.dat What's the result?
Put back config.txt What's the result?
for PAL mode sdtv_mode=2
dmi_ignore_hotplug Pretends HDMI hotplug signal is not asserted so it appears a HDMI display is not attached
hdmi_ignore_hotplug=1 Use composite mode even if HDMI monitor is detected
<pre>
# NOOBS Auto-generated Settings:
#hdmi_force_hotplug=1
#config_hdmi_boost=4
#overscan_left=24
#overscan_right=24
#overscan_top=16
#overscan_bottom=16
#disable_overscan=0
start_x=1
gpu_mem=128
</pre>
tvservice -c "PAL 4:3"
<pre>
/opt/vc/bin/tvservice -s or tvservice -s
state: HPD high|HDMI mode|HDCP off|composite off (0x12001a), 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m CEA
Group CEA has 1 modes:
(native) mode 16: 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m DMT
Group DMT has 0 modes:
</pre>
sudo amixer cset numid=3 1
forces the audio to the headphone jack, even with the HDMI video output plugged in
config.txt
the hdmi_ignore_edid_audio=1 option sems relevant as it should tell ALSA that the only available audio is analog, no matter what the display says
There are several different ways that these 4 pole (ring) composite analog cables can be wired up, so some work great in some applications and can be a waste of time in others.
What is needed for the Raspberry Pi B+ and above, which like many camcorders needs the ring contact next to the base contact to be the ground.
The wiring for the 4 pole are:
TIP (LEFT AUDIO CHANNEL)
RING 1 (RIGHT AUDIO CHANNEL)
RING 2 (GROUND/EARTH)
RING 3 BASE/SLEEVE (VIDEO) YELLOW
Most Apple based Players and the Microsoft Zune (TM) are wired this way.
Most analogue camcorders are wired this way as well, where the ground in on Ring 2 will work with the Pi although you may need to swap your Video plug with the Right Audio plug.
Nearly all other MP3 players are not wired this way, the ground is on another ring ie the wrong one.
External devices
* Camera Module Omnivision ov5647 Sunny 5MP (NoIR version) V1.3 - NoIR at 850 nm, peak at 880 nm and trails off at 940 nm wavelengths
* Camera V2 Sony IMX219 V2.1 8mpixel 8MP 8megapixel - 3280 x 2464 pixels - video at 1080p30, 720p60 and 640x480p90 - wider field of view, 62 vs 54 degrees horizontally -
* Branded WIFI usb BCM43143 dongle
N.B. dreaded error after changing cameras (stupidly without turning off the power first) and lasted through several power cycles. It can be a bad 15-pin FFC ribbon cable, when swapped, camera(s) and the Pi itself are working OK. It can be an instance of a cold solder joint on the CSI connector on the pi board. the camera can be detected (that's done via I2C) but may still not be able to receive image data (done via CSI-2) if something is broken. CSI-2 is uni-directional. Control is generally done via I2C.
The CSI-2 receiver always writes to memory, not direct to the ISP. That's the way the Broadcom architecture works as it allows multipass processing easily. GPU memory is accessible from the ARM. Processing using the QPU graphics processors may be possible. currently the only supported sensor is OV5647 and IMX219. The linux drivers are all in the firmware blob, else you'd be looking at at least a man-month of work in a fully fledged imaging lab to do a decent tuning of the camera modules' ISP parameters.
Static electricity maybe an issue for the camera module and slightly less for the pi board.
== References ==
===Good sites to visit===
*[https://github.com/raspberrypi/firmware/tree/master/ Raspberry Pi Firmware build]
*[https://www.raspberrypi.com/documentation/computers/software-sources.html Documentation]
*[https://rpilocator.com/ RPiLocator]
Linux only
*[https://github.com/raspberrypi/linux Raspberry Pi Linux Build]
*[https://dietpi.com/ DietPi]
*[http://www.tinycorelinux.net/ports.html piCore]
*[https://wiki.alpinelinux.org/wiki/Raspberry_Pi Alpine Linux]
*[https://github.com/armbian/build Armbian]
*[ FydeOS]
*[ TwisterOS based on ChromiumOS]
*[https://note.com/jamesmondo/n/nc76e31402be8?hl=en BSD]
*[https://www.raspberrypi.com/software/operating-systems/ PiOS Lite] and then [https://hstwb.firstrealize.com/ HST]
*[ PiMiga for pi4 and pi5]
*[ amibian for pi2 and pi3]
*[ retropie pi1 and 2]
Other alternative lighter smaller than Pi OS
*[https://aros.sourceforge.io/nightly1.html Aros 64bit ARMV8 single core]
*[https://www.riscosopen.org/wiki/documentation/show/Welcome%20to%20RISC%20OS%20Pi RiscOS on Pi3 and Pi4]
*[https://github.com/michalsc/Emu68 ARM based realtime JIT 68k for amiga computers]
*[https://github.com/JJDSNT/bellatrix/releases/ Alternative use of Emu68 on Pi3b]
*[https://github.com/stevereaver/uaos uaOS with Emu68k]
*[https://github.com/aros-development-team/AROS/commit/f80a268607dfae81b2db94755ab4e4d31ccb72d6 m68kemu library reference]
*[ HaikuOS]
*[https://github.com/raspberrypi/noobs NOOBS] os loader with successor [https://github.com/procount/pinn PINN]
*[https://github.com/maxnet/berryboot berryboot]
*[https://github.com/brianwiddas/pi-baremetal Bare Metal Access on Pi 32bit]
Testing procedure is put sd card in, connect board to board if necessary, plug in hdmi and then power nothing else is done especially CSI DSI etc
[https://www.raspberrypi.com/documentation/computers/compute-module.html CM5] has the same 55mm x 40mm 2x100pin connectors form factor as the CM4 but [https://www.epdtonthenet.net/article/214508/Key-Considerations-When-Migrating-from-Raspberry-Pi-CM4-to-CM5.aspx some pins and other small things] have changed. Will need the [https://raspipcb.com/tech-blog/raspberry-pi-cm4-vs-cm5-difference-in-booting-from-sd-card/ right IO board to suit]
*Green [ Raspberry Pi Compute Module 5 IO Board REV2 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1967]] - untested
*Green [ RPi Compute Module 5 IO board REV1 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1751]] - untested
*Black SupTronics Geekbord X1500 CM5 IO Carrier Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*[https://sipeed.com/nanocluster Sipeed NanoCluster] - untested up to 7 CM5
*Green BentoIO CMX0 - untested
*Box EDATec ED-CLAWBOX - untested
*Home Assistant Yellow - Kit with PoE with Raspberry Pi Compute Module 5 - untested
*Blue [https://www.waveshare.com/wiki/CM5_PoE_BASE_A Waveshare CM5-PoE-BASE-A] - untested
*Box Waveshare [ CM5-POE-BOX-A] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-B Waveshare CM5-IO-BASE-B] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-A Waveshare CM5-IO-BASE-A] - untested
*Blue Waveshare [https://www.waveshare.com/wiki/CM5-NANO-B CM5-NANO-B] - untested
*[https://carboncomputers.us/products/pi-flux piFlux]
*[https://carboncomputers.us/products/ Zitaotech Hackberry] CM5 lite only -
*Portable [https://www.waveshare.com/pocketterm35.htm Waveshare PocketTerm35] with Pi4B or Pi5 - untested
*Box [https://www.clockworkpi.com/uconsole ClockworkPi uConsole][https://www.youtube.com/watch?v=EtI_bAahbR8 CM4 into an adapter or CM3 into so-dimm - Cyberdeck] - untested
*Green RPi [https://datasheets.raspberrypi.com/cm4io/CM4IO-KiCAD.zip Compute Module 4] [https://datasheets.raspberrypi.com/cm4io/cm4io-datasheet.pdf IO board] V1.4 [https://datasheets.raspberrypi.com/cm4io/CM4IOUSB3-KiCAD.zip USB3] [https://datasheets.raspberrypi.com/cm4io/cm4iousb3-appnote.pdf CM4ISO] [https://datasheets.raspberrypi.com/cm4/cm4-datasheet.pdf Dual100pin] (2020) aka Development Platform Board - untested
*Purple Pi Hut Cytron CM4 Maker Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*[ KubeSail PiBox mini 2]
*Home Assistant Yellow with Raspberry Pi Compute Module 4 - untested
*[ Turing Pi V2] - untested CM4 with 260-pin SO-DIMM socket adapters and/or nvidia jetson nanos - untested
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-C Waveshare CM4-IO-BASE-C] - untested but binary blobs Rev01 Rev02
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-B Waveshare CM4-IO-BASE-B] - untested but binary blobs
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-A Waveshare CM4-IO-BASE-A] - untested but binary blobs
*Blue [https://www.waveshare.com/wiki/CM4-NANO-B Waveshare CM4-NANO] - untested but usb and audio turned off or rerouted
*Black [ Seeed Studio with BigTreeTech BTT pad 7] - bin blobs?
CM3 has a 200 pin sodimm ddr2 connector form factor but not electrically SC0028, SC0029
*Blue [https://wiki.geekworm.com/CM_IO_Board Geekworm RPi Compute Module IO Board] [https://github.com/geekworm-com/cm-io-board CSI DSI] with CM3 in ddr2 slot underside - '''works''' if SW1 on but CM3+ '''does not'''
*Green [https://cdn-shop.adafruit.com/product-files/3442/CMIO_schematic.pdf RPi V3 IO board CM3IO] and CM3 Lite - untested
*Green [https://turingpi.com/ turingpi v1 cluster] - untested up to 7 cm3 7xlan9514 12V discontinued, 3 x Pi4 homelab maybe better
*Blue [https://www.waveshare.com/wiki/Compute_Module_PoE_Board Waveshare Compute Module PoE Board] and CM3 lite (if not lite, write files to internal eMMC fat32) '''AVOID''' bin blobs
*Blue [https://www.waveshare.com/compute-module-io-board-plus.htm Waveshare Compute Module IO Board Plus] [https://www.waveshare.com/wiki/Compute_Module_IO_Board_Plus wiki] [https://forums.raspberrypi.com/viewtopic.php?t=235695 pin settings] with CM3+ Lite - '''AVOID''' binary blob
*[ Pi02w on Geekworm SupTronics X305 Raspberry Pi Zero IO Baseboard] - untested
*[ Spotpear Pi Zero 2w to Pi3b format-ish] - untested
*[ pi-top v4] box has 128x64 oled display, micro hdmi, 19Whr battery with pi4 and 15V PD 36W min needed
*[ pi-top v3] three green pieces, heatsink covers most of the base tray, pi-top hub mk1 lhs and Pi1B Pi2b Pi3b rhs secured from below, black rounded strip with pi-top above keyboard, 13.3" HD 1366 x 768 display, small touchpad,
*[ pi-top Model 2.0] pi-top on bottom bezel of 14-inch green laptop, large trackpad, keyboard slide down to reveal main system hub on slide rails moved to the right, Raspberry Pi3b screws down, hub slides in, 18V 2.5A 45W charger brick, battery 11.1V 3500mAh 38.85Wh and storage PiTopOS
*[ Pi-Top CEED Raspberry Pi Modular Educational Desktop with RPI3] monitor
*[https://www.indiegogo.com/en/projects/jesselozano/pi-top-a-raspberry-pi-laptop-you-build-yourself Pi-Top v1] wedge laptop with RPi2
<pre>
2008 Trustees collected for Foundation
2009 Pi Foundation charity status gained
2010
2011 First Raspberry prototypes
2012 First boards go on sale at CPC and RS. The Model A and B 700 MHz Arm11 - February 29th BCM 2835
2012 First million sold - more than the 10,000 original planned and anticipated
2013 First Alpha Experimental builds of AROS Native for the 32bit Pi
2013 Pi Trading launched making grants available, providing in house educational resources and Pi Academy for teacher training
2013 Over two million sold
2014 Over three million sold
2014 Pi 1 Model B+ introduced that moved composite video to audio jack and same half gig of memory
2014 Pi Model A+ v1.1 no ethernet and 1 usb - a little smaller -
2015 Over four million first gen pis sold
2015 Pi Zero 1.2 BCM2835 first production revision released with no camera port
2016 Pi0 1.3 released with camera csi connector
2017 Pi Zero W v1.1 1GHz Pi0W, single-core 32bit CPU BCM2835 released with Cypress CYW43438 wireless
2020 Raspberry Pi Pico SC0919 with RP2040 32-bit 2Core ARM Cortex-M0+ up to 133 MHz - 264KB of SRAM and 2MB of on-board QSPI Flash -
2024 Raspberry Pi Pico 2 with RP2350 2Core 32bit Arm Cortex-M33 and 2core open-hardware [https://github.com/wren6991/hazard3 Hazard3 RISC-V]
2015 Pi 2 Model B v1.1 BCM2836 900/600 MHz ARM Cortex-A7 Armv7 quad 32bit, 32bit VideoCore IV GPU - 1Gb RAM - 5V 2A micro usb - SMSC LAN9514 chip -
2015 Over a million pi2s sold
2015 Raspberry Pi 2 Model B version 1.2 Pi2bv1.2, aka Pi2B2 has armv8 BCM2837 underclocked to 900Mhz without wifi/bluetooth module
2016 Pi 3 Model B - Broadcom BCM2837 SOC four 64bit ARMv8 Cortex-A53 1.2GHz 32bit 1080p VideoCore IV GPU - 1Gb DDR2 - bluetooth 4.1, Cypress CYW43438 wireless 802.11n - 4 x USB2.0 ports - 5.1V 2.5A - SMSC LAN9514 chip
2016 PIs total over 10 million worldwide
2017 Compute Module 3 CM3 with BCM2837B0 armv8 Quad 64-bit - small 67.6mm x 31mm board which fits DDR2 SODIMM connector but not electrically compatible which plugs into needed IO board - beware of the I2C protocol issue
1Gb LPDDR2 RAM - Lite or 4Gb Emmc storage
2017 12 million pis sold in total
2018 Pi 3 Model B+ - 4c A53 BCM2837B0 1.4Ghz - 1Gb, wireless 802.11ac, gigabit ethernet (300Mbit/s) and bluetooth 4.2 - power over ethernet - 4 x USB2.0 ports - Microchip LAN7515 chip
2019 Over 15 million sold
2019 Pi 3 Model A+ with BCM2837b0 Cortex-A53 64-bit SoC @ 1.4 GHz with 512Mb LPDDR2, 1 usb2, 1 hdmi, 1 micro usb 5V 2A - no ethernet -
2019 Raspberry Pi Compute Module 3+ CM3+ - Broadcom BCM2837B0 1.2Ghz, Cortex-A53 (ARMv8) 64-bit SoC on DDR2 SODIMM mechanically compatible only factor - IO board required
1Gb DDR2 and 8GB, 16GB, 32GB or a Lite variant without eMMC
2021 Pi zero 2 (w or no W) RP3A0 quad 1GHz Cortex-A53 64bit BCM2710A1 512mB SDRam
2025 edaTEC CM0 ED-CM0NANA with additional dev board with quad 1Ghz A53 with 512Mb Raysan RAM, 2 USB2 and 10/100 ethernet - pico castellated edge
2019 Pi 4 Model B v1.1 RPI4B - BCM2711B0T quad 64bit A72 1.5GHz, 4K VideoCore VI, AC wifi, Bluetooth 5.0, GbE Broadcom BCM54213PE (PHY ID 0x600d84a2), 2 micro hdmi decode up to 4K, USB-C 5.1V 3A power, 2xVLI VL805 USB 3, 2xUSB 2.0, 2GB 9LDWW D9WHZ or 4GB 9FDWW D9WHV, 8GB 0AA47 D9ZCL ddr4 ram
2020 Silent Pi 4 v1.2 upgrade with more USB-c psu support
2020 PI400 BCM2711C0T 1.8GHz 4Gb DDR4 inside keyboard, 5.1V 5A 27W usb-c psu, 2 micro hdmi, external ide style 40pin gpio, no audio port -
2020 Raspberry Pi Compute Module 4 BCM2711B0T on new 55mm x 40mm 2x100 pin form factor with extra breakout IO board
CM4101000 1Gb RAM Lite SOM
CM4102000 2GB RAM Lite
CM4104000 4GB RAM Lite
CM4004008-4GB-RAM 8GB-EMMC SOM System on Modules
CM4104032 4GB RAM 32GB emmc
CM4108000 8GB RAM Lite
CM4008016 8GB RAM 16Gb eMMc
2021 Raspberry Pi SC0763 Compute Module 4S CM4S with ddr2 sodimm pinouts but not electrically the same with suitable IO board extra cost -
CM4S01000 1GB RAM Lite
CM4S01008 1GB RAM 8GB eMMC Flash
CM4S02000 2GB RAM Lite
CM4S04000 4GB RAM Lite
CM4S04016 4GB RAM 16Gb KLMAG1JETD-B041
CM4S08000 8GB RAM Lite
2021 Pi 4 v1.4 BCM2711B1 upgraded power regulator, to deal with 8gig of ram being more power hungry
2021-48 Raspberry Pi 4 model B v1.5 2GB
2023 Pi 5 v1.0 BCM2712 Quad A76 @2.4Ghz - VideoCore VII - no audio socket - dual 4k from mini hdmi - fan connector - 5.1V 5A psu
2024 Pi 5 2GB DDR4 version uses BCM2712D0
2024 Pi-500 with 8Gb LPDDR5 and membrane keyboard
2024 Pi 5 v1.1
2024 Raspberry Pi Compute Module 5 CM5 BCM2712 55mm x 40mm form factor with additional IO board
CM5004000 04GB RAM 0GB eMMC Lite
CM5008000 08GB RAM 0GB eMMC Lite
CM5016000 16GB RAM 0GB eMMC Lite
2025 Pi-500+ with 256GB NVMe storage, 16GB LPDDR4 RAM, and Gateron KS-33 Low Profile Blue mechanical keyboard switches
2025 Pi5 1GB DDR4 announced
2022 PiOS linux goes 64bit
2024 Pi Trading IPO stockmarket stock exchange listing
2026 April and May Aros 64bit fixed, added AHI audio, VC4 gfx started, usb functions added to rom
2026 June and July Aros 64bit usb2otg started, dma.resource, sdio.resource, bwfm.device wifi added
2026 Late July daily 64bit Pi3 LE little endian builds start
2026 August Pi 4, 400, 5 and 500 DTBs added, expanding existing support and wifi for Pi4 and Pi5
2026 August Pi5 HAT+ nvme and HDMI, AHI RPiI2S added, Pi4 HVS5 video scaler started,
2026
2027
2028 Pi 6
</pre>
The vcgencmd can be used to inspect and dump the current system configuration.
vcgencmd runs on top of VCHIQ as an RPC. The mailbox interface is an alternate but much simpler RPC.
VCHIQ is a bridge (queue) between the CPU and the GPU so they can communicate with the firmware.
Loads of [https://github.com/6by9/rpi3-gpiovirtbuf/blob/master/rpi3-gpiovirtbuf.c mailbox] which uses the GPIO control calls. [https://github.com/raspberrypi/firmware/wiki/Mailboxes may also be of interest]
A fair number of vcgencmd examples (search for vc_vchi_gencmd_init). [https://www.raspberrypi.org/forums/viewtopic.php?t=229203#p1406112 sends the relevant vcgencmd commands] to update the scaling kernel, but the [https://github.com/raspberrypi/userland/blob/master/host_applications/linux/apps/gencmd/gencmd.c command] is just a text string. Parsing and execution of the instructions is performed by the VideoCore firmware.
The Raspberry Pi runs two separate operating systems: Linux/Aros on the ARM, and a threedx RTOS called vcos running on the Videocore 4 VPU: vcos is commonly called "the firmware". Vcos is tasked with performing certain system services, for example running the display and audio outputs. The VCHI driver provides an interface to allow drivers to talk to vcos.
Doubtful, on any [https://www.web3d.org/ Web3d] [https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API WebGL] or [https://github.com/immersive-web/webxr WebXR] [https://developer.mozilla.org/en-US/docs/Web/API/WebXR_Device_API Device API] [https://developer.mozilla.org/en-US/docs/Web/API/XRInputSource XRInputSource] support. Hopefully, never/limited support features like location, peer-to-peer, invasive web apps, unwarranted storage, payments, proprietary video streaming etc
*spreadsheet [https://git.sheetjs.com/sheetjs/sheetjs sheetjs] [https://github.com/mleibman/SlickGrid SlickGrid] [https://github.com/6pac/SlickGrid SlickGrid] [https://github.com/jspreadsheet/ce jspreadsheet ce] probably without xlsx support
*presentations [https://github.com/impress/impress.js/ impress.js simplified] [https://github.com/bwlewis/slides slides] [https://zenomt.github.io/mdslides/ github markdown slides] [https://github.com/Patternslib/slides Patternslib slides markdown] probably without pptx support
*ai office [https://github.com/dream-num/univer/ univer], [https://github.com/dream-num/Luckysheet Luckysheet] [https://github.com/ruilisi/fortune-sheet fortune-sheet]
*weather [https://github.com/Himanshu3412/Weather-Forecast Weather Forecast], [https://github.com/kaushalsahu07/weather weather needs API key],
==Future==
[https://github.com/ARMSX2/ARMSX2 Arm pi of pcsx2]
[https://tube.cadence.moe/ Cloudtube], [https://github.com/TeamPiped/documentation/blob/main/content/docs/public-instances/index.md TeamPiped], [], [], [],
[https://hyperpipe.codeberg.page/ hyperpipe], [https://ytify.pp.ua/ ytify], [], [],
[ ytdl], [https://github.com/golddominik893/liberatube liberatube]
[https://git.lolcat.ca/lolcat/4get 4get], [https://github.com/hnhx/librex librex], [], [],
{{BookCat}}
9px4g6wrk3uiy5ys4xxnt78zwxu3gj3
4676557
4676534
2026-10-17T15:33:28Z
Jeff1138
301139
4676557
wikitext
text/x-wiki
{{ArosNav}}
[[#Native]]
[[#Hosted]]
[[#Build]]
[[#Hardware]]
[[#References]]
[[#Future]]
==Introduction==
[[File:Scalos00.png|thumb|Scalos on Aros Pi3b]]
Aros aims to cover Pi 3 to 5 512Mb+ RAM
Options to boot from using a good power source to prevent the yellow lightning symbol.
*With Pi3b+ the max you can get is 5.1V 2.5A with micro usb.
*With Pi4 5.1V 3A with usb-c
*With Pi5 5.1V 5A, the amps went ever upwards, even to 5.1V 9A with usb-c
* Pi500+ keyboard wedge - working but not much tested esp [https://github.com/aros-development-team/AROS/commit/48e9c8edcca4b5c1e1fe0b1123f2129f624af67b power button]
* Pi500 wedge with up to date bootloader via PiOS - working but not much testing esp [https://github.com/aros-development-team/AROS/commit/48e9c8edcca4b5c1e1fe0b1123f2129f624af67b power button]
* Pi 5 - Quad A76 64bit ARMv8 and RP1 "southbridge" with VideoCore 7 D0 (rev1.1) - untested
* Pi 5 - Quad A76 64bit ARMv8 and RP1 "southbridge" with VideoCore 7 Pre-D0 C1 (Rev1.0) - untested
* Pi400 RPI-400 keyboard wedge - resolution changing and audio from micro hdmi0 (near 40pin) and micro hdmi1 (near usb-c psu) - Fn F10 0x5e power on and off works or held down for over 7 seconds auto shutdown - keyboard ok - wifi and lan ethernet testing -
* Pi 4 - Quad A72 64bit ARMv8 with VideoCore 6
* Pi 3 - Quad A53 [https://www.raspberrypi.com/documentation/computers/processors.html 64 bit] ARMv8 with VideoCore 4 with '''fan''' to prevent overheating cpu 82C+ throttling
* Pi02W - Quad A53 64bit - boots but [https://forums.raspberrypi.com/viewtopic.php?p=2387984#p2387984 usb not working but did in the past],
* Pi 2 - Quad 32bit ARMv6 with VideoCore 4 - mostly not 64bit compatible
* Pi Model B+ 32bit ARMv6 with VideoCore 4 - not 64bit compatible
* Pi Model A and B 32bit ARMv6 with VideoCore 4 - not 64bit compatible
===Native===
* 2013-03 Kalamatee starts work
* 2015-04 Work continues with mschulz on the kernel and Kalamatee (NicJA) on gpio and usb
* 2018 [https://www.patreon.com/posts/i-owe-you-some-20956961 mschulz resume adding BE big endian support], [https://www.patreon.com/michal_schulz/posts Big endian on Pi]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bsek latest commits for pi 3b, 4 and 5 64bit]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=metaneutrons latest commits for Pi5]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bitplane latest commits for ARM]
====64bit====
'''Download''' A [https://archive.org/details/piAROS Pi Distribution (Distro) has started] and the contents copied to fat32 8GB+ microSD card (there will be drawers/folders - boot c Classes Demos Developer Devs Extras etc only showing). The SD can be plugged in to the Pi. And power on. [https://pi.amiga.icu/ Repository]
'''Not recommended''' but [https://aros.sourceforge.io/nightly1.html RaspberryPi 3, 3+, 4 and 5 64bit ArmV8 nightly builds] [https://sourceforge.net/projects/aros/files/ and alternative site and nightly2] which is a test version of '''very few''' apps with both raspi-aarch64-system and raspi-aarch64-contrib can be unbz2'd to a SD or SSD as appropriate.
64bit build works well on a single core LE little endian. Multicore [https://github.com/aros-development-team/AROS/commit/1df0747c2bda3523a43029725a709b1f377d84ec may follow]. Any issues booting could be down to the SD card so please use another SD to see if it is resolved. Remember Aros Arm uses FAT32 and Aros can detect issues with this format very acutely (once fault found, FAT 0x0FFFFFF7 bad cluster so no files written after that, no repair). Please report your experiences in the [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2138&pid=15057#post_15057 Aros forum thread], [https://forums.raspberrypi.com/viewforum.php?f=179 Raspberry Pi Aros Dev and User forums], [https://forums.raspberrypi.com/viewtopic.php?p=2387984#p2387984 previous Raspberry Pi forum thread]. Any bugs or issues can be [https://github.com/aros-development-team/AROS/issues described here to fix]
*Pi500+ untested usb3 booting or nvme ssd
*Pi500 untested usb3 booting
*Pi5 untested usb3 booting
*Pi400 boots with '''USB3''' port based sata3 ssd
*Pi4 untested (may need eeprom update from PiOS or Pi SD Imager)
*Pi 3 B+ is pre-configured for USB sata3 boot - untested
*Pi 3 B may need [https://www.youtube.com/watch?v=ubnwvxF3Klc PiOS to set OTP to boot from usb - do so at your own risk] - if OTP set to usb, boot works but slower than SD card
Speed write wise (top faster)
<pre>
*NVME Pi5 untested >1000MB/sec or faster if matched correctly
*Sata3 ssd 500MB/sec
*SD V90 90MB/sec 4K maybe 8K
*SD V60 60MB/sec 1080p
*SD U3 V30 30MB/sec 720p
*SD C10 U1 V10 A1 A2 10MB/sec minimum should be used now
*SD C06 6MB/sec
*SD C04 4MB/sec
</pre>
As a homage to the past, Aros shows a reduced number of icons but this can be changed by left mouse click in the window and then right click down to Window -> View -> All files
Windows can be manipulated by the top (moving) and the bottom right corner (resizing) only.
Zune like MUI gui interface, has a unique quirk in that after changing a setting in a text box, you may sometimes need to press Enter/Return before clicking OK, Save, etc
Double left mouse click on most picture (Developer/Debug/Tests/Datatypes), audio and video files are supported, via datatypes, by the multiview application.
Esc escape key usually closes open windows even the desktop
In Prefs/Appearance some decorative theming elements need work. There is a few Mason icons in /Prefs/Presets/Icons/Mason/ and the ever present default Gorilla - Icon exchange in works
For more intensive graphics applications, you may need to edit config.txt in the root folder and change 128M to 256M to adjust more memory to graphics usage
If your cursor should '''appear''' to vanish, fear not it is still there. Please head to the top of the screen i.e. the title bar, hold down the left click mouse and drag the screen down a little and the cursor will appear again. Then you can drag the screen up again.
Like most amiga like OSs the audio and networking need to be setup manually
Audio AHI prefs - Mode settings tab - needs both Music unit and Unit 0 set to RPiHDMI:16 bit stereo++ or RPiPWM:16 bit stereo++ at 44100Hz. Press '''Save or Use''' button after each choice
For wireless, please use the Wifi prefs and already selected device bwfm.device. Press Scan and double right click on the router and enter password. You may need to setup after every power off
*if asking for password again - press cancel and go to Network Prefs, Wireless Networks tab and highlight the router line and hit the remove button and press the cancel button. Retry with Wifi prefs again
*...waiting for an address - Disconnect and try Connect
Until, Connected to <router> - 192.168.x.x
For lan ethernet port, please use Network prefs and the following hardware is
*lan9514 Pi3b Pi2 not supported at the moment
*lan7515 Pi3b+ type into Device usblan78xx.device as net0: remove other device(s)
*bcmgenet Pi4 Pi400 choose for Device bcmgenet.device
*cdnsgem Pi5 Pi500 Pi500+ RP1 i/o for cadencegem
(network prefs may forget random information when rebooted)
Summary
<pre>
*3b ethernet not supported, usb ethernet not working but wifi prefs setup works
*3b+ wifi working and ethernet works
*4 untested
*400 wifi and ethernet untested
*5 wifi and ethernet untested
*500 wifi and ethernet untested
*500+ wifi works
</pre>
Type in 'aarch64' in the [https://archives.arosworld.org/index.php?function=search&tool=simple search box] and you will see available software packages / apps. apkg can be used to inspect and install applications.
[http://archives.arosworld.org/index.php?function=browse&cat=network/browser amelinium web browser (JS 1.6 ES9 ECMASCript 2018)] is available with an [https://eab.abime.net/showthread.php?t=122494&page=80 eab thread] reminiscent of [https://github.com/zapek/Voyager Voyager] and to a lesser extent [https://github.com/amigazen/aweb3/ Aweb JavaScript 1.5 (ECMAScript 3)] as css and javascript websites can be slow to load or resolve (no JIT) and nothing from facebook, reddit etc.
Press Cancel at screenmode selector or -wb argument to get windowed version. You could use the Shift + Del shortcut or mouse wheel should work to delete all text at once. Html5test gives 189 (1.29), 300 (1.31), 301 (1.39) out of 555, some bigger Amiga like browsers are around 370+ but it does less better.
You may have to delete the cache (Menu -> Page -> Delete cache) to fully retest big Amelinium updates or free up space.
Be aware [https://pianetaamiga.it/en/reportage-pianeta-amiga-2026/ some site pages] can use up hundreds of MBs of cache very quickly
DNS lookup failed... close browser and reboot and setup wifi again - repeat until it works again
youtube video and audio - js button for javascript must be on/shaded - Settings -> Soundoutput - AHI
Any restriction to lower resolutions is due to [https://docs.invidious.io/faq/#q-where-are-the-360p480p1080p-quality-options bandwidth]. Either CPU/GPU, internet speed and/or video quality. Pi3 can expect 480p (wifi) to 720p (ethernet). Pi4 expect (wifi) (ethernet).
Telegram https://t.me/s/channel_name for public messages from vamped_amiga chatamigagames demoscenecracktros
*art local js apps like dpaint.js
There is normally no Bluetooth support for most amiga like OSs but Aros has one [https://github.com/aros-development-team/AROS/commit/6942cbfbf66426d21963a7fcd8aba6aff611a9e0 work in progress] [https://github.com/RPi-Distro/bluez-firmware/tree/pios/trixie/debian/firmware/broadcom firmware]
*Bluetooth 4.1 BCM43430A1.hcd Pi3B, Pi3A, Zero 2W
*Bluetooth 4.2 BCM4345C0.hcd Pi3B+, Pi4
*Bluetooth 5.0 BCM4345C5.hcd Pi4B rev, CM4 and maybe Pi5 and CM5
<pre>
*bthid keyboard mouse support
*btserial serial
*btpan short range wireless connecting devices
</pre>
Only the Pi5 has a RTC real time clock, the other Pis will need to use ntp services [https://github.com/aros-development-team/AROS/commit/29cd4116330dc7f692d90757eacc59fb3f31ae70 sntp] with time.cloudflare.com pool.ntp.org or Cloudflare 162.159.200.1, 162.159.200.123, 2606:4700:f1::1, 2606:4700:f1::123 or [https://github.com/bohunamiga/PiNTP PiNTP -s goodtime.ijs.si or ntp1.ptb.de] to get the date and time from the internet. Can use date in a shell e.g. date 24-Dec-2026 23:59:59 but this will need to be done again after every reset/power off. Maybe [https://github.com/aros-development-team/AROS/commit/28674a157bc56175aa668e7b62dca6fa740578dc ds3231 rtc with dtoverlay=i2c-rtc,ds3231 in config.txt]
It helps to have all usb devices already plugged in before power on to detect at the moment. Even then some usb devices will freeze the mouse cursor and the only resolution is to remove the offending usb device and reinsert. Sometimes, the reinsert leads to the mouse cursor vanishing, it is still there and responds to left mouse clicks, top of the screen and pull down the screen.
USB classes support from Prefs/Trident is still work in process
*usbaudio working on usb3 port (blue) on pi4, 400 but not working (no rt isochronous) on usb2otg (white or black) for pi3b, zero 2w
*[https://aminet.net/package/mus/midi/camd camdusbmidi] detects midi devices without a preferences file (Prefs/Env-Archive/sys/midi.prefs) as [https://www.youtube.com/watch?v=RBxHkwy4Nrw auto setup now] possibly with [https://github.com/metaneutrons/mt32-pi metaneutrons mt32-pi] [https://github.com/rtzor/mt32-pi mt32-pi fork] [https://github.com/ahmadexp/mt32-pi fork] [https://github.com/gmcn42/mt32-pi-control control of] [https://github.com/dwhinham/mt32-pi mt32-pi pi3+]. Alternative of [https://homspace.nl/samplerbox/ SamplerBox].
Will need developer clang gcc tools to look at 64bit ports of [https://archives.arosworld.org/?function=showfile&file=driver/audio/usbmidi.i386-aros.lha usbmidi], [https://aminet.net/package/mus/midi/CAMD_Toolkit CAMD_Toolkit], [https://aminet.net/package/mus/midi/camdtools camdtools], [https://github.com/cnvogelg/amiditools amiditools], [https://github.com/timoinutilis/midi-sequencer-amigaos horny src], [https://aminet.net/package/mus/midi/horny-base horny-base], [http://bnp.hansfaust.de/index.html BnP], [https://arosarchives.os4depot.net/?function=showfile&file=audio/misc/timidity.lha timidity],
Regarding 680x0 emulation, there are several options (not implemented yet) that could be considered
*[https://github.com/aros-development-team/AROS/blob/6722a0ae9e03fe5d26e32703360bd2059e0864cc/rom/m68kemu/README.md?plain=1#L424 m68kemu.library] for some Amiga productivity where the cpu is emulated and the system calls are redirected to Aros ones
*[https://github.com/BlitterStudio/amiberry amiberry] (winuae) for everything else like games
*[https://github.com/jonx/AROS/tree/aarch64-darwin-graft/arch/all-darwin/libs/emu68k emu68k]
*[https://scriptedamigaemulator.net/ Scripted Amiga] with [https://github.com/naTmeg/ScriptedAmigaEmulator ScriptedAmigaEmulator] or older [https://github.com/gbraad-amiga/ScriptedAmigaEmulator2 ScriptedAmigaEmulator2]
Hopefully getting Pi3 up to 25Mhz 68040 (non JIT) and 50Mhz 68040 (JIT)
Pi4 maybe getting up to 50Mhz 68040 (no JIT) and 100Mhz 68040 (JIT)
[https://pinout.xyz/ GPIO 40 pins] [https://learn.sparkfun.com/tutorials/raspberry-gpio/gpio-pinout pinout]
Some exceptions:
*Physical pins 27, 28 (GPIO0, 1) are an internal I2C bus and should not be used
*The other I2C on pins 3, 5 (GPIO 2, 3) can be used generally, but be aware they have permanent pull-up resistors to 3.3V
*For MIDI use USB but there are dedicated UART pins 8, 10 (GPIO 14, 15).
With a HAT it's more awkward -- you need to know which pins are used by the HAT and avoid them. Hopefully this will be documented.
Remember all GPIOs are 3.3V (not 5V tolerant), floating/noisy inputs can cause odd behavior, and that shorting the power supplies can cause instant death of the Pi.
In the shell (Cntrl + C to end)
GPIO PIN/A/N,SET/N,GET/S,MODE/K,PULL/K
Controls and queries hardware GPIO pins via gpio.resource which is stored in the rom or Devs/ '''please test'''
*PIN -- (Required) Target GPIO pin number (e.g. 12).
*SET -- Set pin output value to 0 (LOW) or 1 (HIGH).
*GET -- Read and print current digital input level (0 or 1).
*MODE -- Configure pin mode: IN (Input), OUT (Output), ALT (Alternate).
*PULL -- Configure pull resistor: NONE, UP, DOWN.
EXAMPLES
<pre>
GPIO 12 MODE OUT
GPIO 12 SET 1
GPIO 12 GET
GPIO 13 PULL UP
</pre>
[https://gpiozero.readthedocs.io/en/stable/installing.html Current] [https://gpiozero.readthedocs.io/en/v1.2.0/api_boards.html old support for gpiozero is unknown at present] [https://energenie4u.co.uk/res/pdfs/ENER314%20UM.pdf and associated 433MHz equipment] [ USA X10 security and lights via USB] [ OpenHab with Shelly Smart Plug connected over Wi-Fi, controlled by MQTT or HTTP]
Printing only with Postscript but [https://github.com/bohunamiga/MintPRINT one] of [https://github.com/boingball/MintPRINT two] [https://github.com/Andiweli/AmiAirPrint/tree/main AirPrint] IPP has been attempted with [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2061&pid=13954#post_13954 discussion]
Youtube
[], [], [https://www.youtube.com/watch?v=X4fmWAIv7FE Aros native on Pi3b],
[], [], [https://www.youtube.com/watch?v=TSxlYb1eQWU Installed on Pi3b+],
[], [], [https://www.youtube.com/watch?v=NFF1H3jCoz8 testing Aros native on Pi400],
[], [], [https://www.youtube.com/watch?v=nIVx7mh1E1Q&pp=ygUHYXJvcyBwadIHCQkTDAGHKiGM7w%3D%3D Aros on Thumb 2 based 32bit-ish ARM STM32H743 board],
[https://www.youtube.com/watch?v=zQM4CD64xDE&t=612s&pp=ugUEEgJlbg%3D%3D Performance under Linux] but on Aros...
{| class="wikitable sortable" width="90%"
! width="10%" |Pi
! width="10%" |Single Core 2D
! width="10%" |Single Core 3D
! width="10%" |Single Core 3D
! width="10%" |SMP 2D
! width="10%" |SMP 3D
! width="10%" |SMP 3D
! width="35%" |Comments
|-
| <!--Pi-->Pi3
| <!--Single Core 2D-->
| <!--Single Core 3D-->
| <!--Single Core 3D-->
| <!--SMP 2D-->
| <!--SMP 3D-->
| <!--SMP 3D-->
| <!--Comments-->
|-
|}
==== 32bit ====
For the Pi1 Pi2 Pi2B the status of AROS native ARMv6 for 32bit RasPi was OK. System booting, USB working (although with some issues but plans to fix them). 32bit native [http://www.aros.org/nightly1.html ARMv6 32bit nightlys] raspi-armhf-system raspi-armhf-contrib unbz2'd to fat32 microSD
===Hosted===
AArch64 CPU backend for AROS, a Cocoa/Metal display, clipboard / host-volume / CoreAudio / BSD-sockets bridges, GPU 2D via gpufx.library, a 68k→AArch64 JIT (run68k), and a full Rust std port. On [https://www.jkn.me/blog/macaros-aros-on-apple-silicon/ latest Apple Silicon] [https://github.com/jonx/Macaros early buggy alpha version of hosted Aros .dmg on MacOS12+]. Please use [https://github.com/jonx/Macaros/issues MACAros github] for issues, features etc and possibly [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2030&pid=13910#post_13910 here]
[http://www.aros.org/snapshots1.html old linux and android hosted 32bit]
==== Hosted ====
=====64bit=====
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80&pid=13667#post_13667 Ubuntu Linux PC hosted Pi compiler build]
[https://github.com/BlitterStudio/aros-compiler-docker Docker based cross compiler for various Aros systems],
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80 From the Aros Raspberry pi 3 64bit thread]
Instructions on building 64-bit Raspberry Pi AROS and cross-compiler from sources.
You will need:
- Ubuntu 24.04 or 26.04
- qemu-system-aarch64 installed
- Internet connection
- rpi-scripts.tar.gz downloaded (https://axrt.org/download/aros/rpi/rpi-scripts.tar.gz)
1) Install prerequisites:
sudo apt install git gcc g++ make gawk bison flex bzip2 netpbm autoconf automake libc6-dev liblzo2-dev libpng-dev gcc-multilib byacc python3-mako cmake yasm curl nasm
2) Clone sources
cd <project-directory>
git clone https://github.com/aros-development-team/AROS.git --recurse-submodules
3) Extract rpi-scripts.tar.gz. Copy all files into your project directory so that you have:
AROS (the directory with cloned sources)
fix-dotdot.py
rebuild.sh
recreate-sdcard.sh
run-qemu.sh
update-sdcard.sh
4) Run ./rebuild.sh. Select option 1) toolchain-core-aarch64
This will execute process of building a cross-compiler. During this process packages will be downloaded from Internet. This process can take up to 2 hours. If there are some missing dependencies, install them with 'sudo apt install' and restart this step.
5) Run ./rebuild.sh again. Select option 2) core-raspi-aarch64
This will build system files for 64-bit Raspberry Pi AROS. This process can take around an hour.
6) Run ./recreate-sdcard.sh
This will create an sdcard.img file with contents of previous step.
7) Run ./run-qemu.sh
This will start QEMU with SD card image and ROM images. It will boot into AROS.
=====32bit=====
Ubuntu VM approach to compiling [http://lallafa.de/blog/2013/06/building-aros-hosted-for-raspbian/ Linux hosted AROS June 04, 2013]
../AROS/configure --target=linux-armhf --enable-includes=/usr/arm-linux-gnueabihf/include --x-includes=/usr/arm-linux-gnueabihf/include --x-libraries=/usr/arm-linux-gnueabihf/lib
arm-elf- is symbol-linked to arm-linux-gnueabi- (arm-linux-gnueabi- is more correct in this case, because it's going to be compiling the ARM AROSBootstrap for ARM Linux)
*armel - many of the "android" machines require since the entire OS is made for soft float VFP.
*armfp - Efika MX target, Raspberry PI, EfikaMX, Pandora and virtually everything (VFP)
Keep in mind it's possible to start hardfp AROS hosted on softfp system, though, as long as no calls between AROS and host require floating point parameters. NOTE: hardfloat objects *cannot* be linked with softfloat objects - they have a different ABI.
Just keep in mind the arm nightly build machine is quite complex beast. It needs the x86_64 host compiler to compile AROS tools. The arm version is built every night using gcc-4.6.2 crosscompiler (built together with AROS) and successfully builds armel and armhf linux hosted targets.
*needs an AROS code compiler for ARM target
*as well as unix compiler for ARM linux host (would be best to have both softfp and armhf, we have softfp only now) with full set of libraries and includes.
with—disable-crosstools $AROS_CC is always a wrapper around $KERNEL_CC ? If so, this is wrong for some ports. This can break Darwin, Windows and Android port.
Yes, Android port will build. And even work. But it's not good because the port will not be ABI-compatible with other ARM ports. Android's ABI is different from GNUEABI. For example:
<pre>
enum test {foo, bar};
enum test testvar;
</pre>
sizeof(testvar) will be equal to sizeof(int) in GNUEABI (Linux and AROS) and sizeof(short) on Android. This affects linking objects from static linklibs, for example.
Previously everything worked because $AROS_CC was a wrapper on top of $HOST_CC. And a real crosscompiler was used on non-ELF hosts.
Android is the same. $KERNEL_CC is incompatible with AROS.
compiler=kernel is appropriate _ONLY FOR CODE WHICH RUNS ON HOST OS_ (or barebone hardware, if we talk about native). This includes bootstraps, their linklibs, and host-side dynamic libraries (Windows makes extensive use of them because of architectural considerations.
No single AROS object should be compiled with this setting. $KERNEL_CC is really compatible with AROS *ONLY IN LINUX-HOSTED* and no more. On other systems (Darwin, Windows, Android) this is not true any more, and compiler=kernel is never going to work.
If you want to compile your AROS module against host OS includes, append the following to USER_INCLUDES (or USER_CFLAGS, this is effectively the same):
-isystem $(GENINCDIR) $(KERNEL_INCLUDES)
$(KERNEL_INCLUDES) expands to:
-isystem <your_os_includes> -isystem <host_OS_gcc_private_includes>
-nostdinc
This makes AROS compiler adhering to host OS APIs.
If you want some preprocessor symbols based on what your host OS actually is, add something like -DHOST_OS_$(AROS_HOST_ARCH).
Why is there $(GENINCDIR) at all? Because host OS has its own libc includes, which would conflict with AROS ones. And the host OS libc is not binary-compatible with AROS one.
Why doesn't Windows-hosted port use $(KERNEL_INCLUDES) ? Because WinAPI includes conflict with AROS ones in fundamental typedefs, like WORD, BYTE and BOOL. It's almost impossible to deal with this in any other way than rewriting WinAPI definitions using AROS types.
Building under centos 6.3 (i386) currently, and AROS creates the toolchain itself. haven't yet committed the necessary changes but "./configure --target=raspi-armhf" is enough to start, then "make arosboot-raspi" will generate arosraspi.img (containing the bootstrap, kernel.resource, and exec.library) as well as arosraspi.rom (containing all the other essentials components such as dos, graphics etc). It will also copy over a config.txt file to make the raspi bootstrap code load the correct kernel, and a cmdline.txt that enables exec debug output.
*armel = typically Debian 6, Ubuntu Maverick, Android,
*armhf = typically Debian 7, Debian 8, Ubuntu Precise,
Cross-compiling Ubuntu ARM softfp
<pre>
sudo sh
echo 'foreign-architecture armel' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armel] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armel.list
apt-get update
apt-get install gcc-arm-linux-gnueabi libx11-dev:armel libsdl-dev:armel
</pre>
<pre>
./configure --target=linux-arm --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabi/include
</pre>
Cross-compiling Ubuntu ARM hard-float
<pre>
sudo sh
echo 'foreign-architecture armhf' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armhf] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armhf.list
apt-get update
apt-get install gcc-arm-linux-gnueabihf libx11-dev:armhf libsdl-dev:armhf
</pre>
<pre>
./configure --target=linux-armhf --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabihf/include
</pre>
Now, the AROS build is configured properly and all you need to do is:
make
==Build==
===64bit===
[https://github.com/aros-development-team/AROS/blob/7016ce28bfdb754182edb16011c98faaf5413c29/arch/aarch64-raspi/boot/mmakefile.src#L180 boot makefile]
===32bit===
# download/checkout the source someplace, e.g. /build/AROS-Src/
# make a directory to store external sources AROS downloads, e.g. /build/Ports
# make a build directory, e.g. /build/aros-raspi-armhf
# cd into the build dir, configure, and then run make -:
<pre>
>cd /build/aros-raspi-armhf
>/build/AROS-Src/configure --target=raspberrypi-armhf --with-serial-debug --enable-ccache --with-portssources=/build/Ports
>make
>make arosboot-raspi
</pre>
then copy the files from /build/aros-raspi-armhf/bin/raspi-armhf/AROS/ onto an sdcard, and download/copy the Raspi firmware files onto it.
You should then be able to boot the sdcard on your RasPi.
The current W.I.P tree to svn. it can be built as follows ..
<pre>
./configure --target=raspi-armhf
make arosboot-raspi
</pre>
That will generate arosraspi.img, arosraspi.rom and config.txt in bin/raspi-arm/AROS - so either copy just those files to a fat formatted SD card (with the firmware files on), or copy the whole contents of the AROS folder.
NB - if you have a Linux/other install, backup the existing config.txt first
arosraspi.img contains the bootstrap (which has very basic mailbox code, framebuffer/gpio init, and console "emulation" via code pinched from our libbootconsole), kernel.resource, and exec.library
arosraspi.rom contains all the other components needed to boot AROS.
The config.txt file will tell the RasPI bootstrap to load the arosraspi kernel and ramdisk (rom).
the bootstrap has minimal mailbox code, planning on adding either a resource or library that driver/app code will use to access it (likewise for GPIO)
Help building AROS hosted on Linux ARM
Was looking a way to use more my Handheld ARM based called Pyra (Dragonbox Pyra) an ARM (Omap5 cpu with 4GB ram) linux based machine (Debian Buster v10 with kernel 5.6.19 adapted) and have a try to compile the latest Aros sources by Deadwood directly on this device.
Compilation stops after build libpopupmenu.a and trying to build libatomic have this error:
<pre>
Configuring build in bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
configure: WARNING: unrecognized options: --disable-nls, --without-x
checking for --enable-version-specific-runtime-libs... no
checking for --enable-generated-files-in-srcdir... no
checking build system type... arm-unknown-linux-gnu
checking host system type... arm-unknown-aros
checking target system type... arm-unknown-aros
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for arm-aros-strip... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-strip
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for arm-aros-gcc... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-gcc
checking whether the C compiler works... no
configure: error: in /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic':
configure: error: C compiler cannot create executables
See config.log' for more details
make[2]: *** [mmakefile:4489: /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic/.configured] Error 77
[MMAKE] make --no-print-directory TOP=/media/farox/pyra2/arosbuilds/toolchain-core-armhf-build SRCDIR=/media/farox/pyra2/arosbuilds/AROS CURDIR=tools/crosstools/gnu TARGET=tools-crosstools-gcc-libatomic-configure -s --file=mmakefile tools-crosstools-gcc-libatomic-configure failed: 512
[MMAKE] Error: Error while running make in tools/crosstools/gnu: No such file or directory
make[1]: *** [Makefile:361: linklibs-libatomic] Error 10
make: *** [Makefile:183: crosstools] Error 2
</pre>
looking at config.log on arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
found that arosbuilds/toolchain-core-armhf/arm-aros-ld: cannot find -laeabi
so do make linklibs-aeabi-arm-quick
and the missing lib was built.
now the next stop is at
fatal error: bits/libc-header-start.h: No such file or directory
and
fatal error: sys/cdefs.h: No such file or directory
in many places so after checking that have this missing include files i have noted that my include path is a bit different, standard searching path is /usr/arm-linux-gnueabihf but in my system is /usr/include/arm-linux-gnueabihf
so if i add my path to some mmakefiles compilation goes on....but is a better way to add this path to avoid every mmakefiles to be changed?
fixed with adding
-I/usr/include/arm-linux-gnueabihf
to where is missing on mmakefiles like
USER_INCLUDES := -isystem $(GENINCDIR) -I/usr/include/arm-linux-gnueabihf $(KERNEL_INCLUDES)
P.s. I have changed many mmakefiles and have at least compiled (after many hours) the toolchain doing make every time in arosbuilds/toolchain-core-armhf-build (also have to disable making tests under cplusplus but don't remember the directory ...) but ask an help to have an automated way to correctly build without modify mmakefiles.
Last time built armhf target was around 2 years ago. At that point built is via cross-compilation from linux (ubuntu 22.04) using linux armhf crosscompiler (this can explain the path differences you are experiencing) as well as using AROS gcc cross-compiler in version 6.5.0 (build with option 21) in rebuild.sh). Since then AROS GCC has been updated to 10.5.0 and don't believe anyone tried to build the armhf target again.
My suggestion would be to downgrade GCC to 6.5.0 (via editing AROS/config/gcc_def file) and try to first build using cross-compilation from x86_64 linux. Once that works, you will have a "template" to compare to native compilation under arm linux.
Thanks for your suggestion...but think the toolchain with GCC 10.5.0 is compilable if i found a way to pass the path of my system to the script that build (option 21 on rebuild).
The other only changes are (but don't know where to modify...) is to add the build of libaeabi and disable the building of some tests under cplusplus that use exceptions and is not supported under ARM. try to crosscompile with my Linux amd64 PC.
For paths look into core-linux-armhf/bin/linux-armhf/gen/config/target.cfg. A number of build-wide variable is set there containing paths to local build system. These variables and the target.cfg file are generated by AROS ./configure script.
Thanks compilation now go forward...changed target.cfg under "toolchain-core-armhf-build/bin/linux-arm/gen/config" and do make on "toolchain-core-armhf-build" dir.
Need to find where to enable build libaeabi.a so can build the entire toolchain with option 21 of rebuild.sh
Found something that looks like libeabi in AROS/arm-all/arm-aeabi/mmakefile.src. Try adding a third line there:
#MM- linklibs-armhd : libklibs-aeabi-arm
Don't remember needing this library. Possibly the 6.5.0 GCC somehow does this while 10.5.0 is missing this.
Try adding this line (and the variant "linklibs-armhf" instead of hd) but it did not solve the automatic building of the missing lib. I must do "linklibs-aeabi-arm-quick".
Anyway after have build the aeabi lib i succefully built the toolchain (after many hours...). Smile
To test I restarted from selecting option 21 (on rebuild.sh) but after many hours i get the same error of the kernel includes not found...maybe i need to modify the configure script for my case.
With the toolchain built i try to build the core-linux-armhf (DEBUG) (option 22) but after a while it stopped with
"cannot find -laeabi " so i made it built manually...and now i can continue compiling...i'll let you know if all goes ok.
== Hardware ==
===64bit===
====BCM2712====
With the Pi5
Broadcom VideoCore 7 vc7 is an integrated GPU with 12 cores and up to 800 MHz clock. VideoCore VII is capable of OpenGL ES 3.1 and Vulkan 1.2. The driver support for the Raspberry Pi continues to build upon the [https://lore.kernel.org/dri-devel/20230928114532.167854-1-itoral@igalia.com/ open-source V3D driver] stack within [https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25450 Mesa] hopefully be merged for Mesa 23.3. x265 HEVC accelerated untested, x264/h.264 and VP9 cpu only.
*Raspberry Pi M.2 HAT+ Expansion Board
*Geekworm X1001 PCIe to M.2 Key-M NVMe
*Geekworm X1003 PCIe to M.2 HAT NVMe SSD PIP Board for Raspberry Pi 5
*Pineboards Pi Hut HatDrive! M.2 HAT 2024/V4
*Hat+ Gen2 Gen3 Nvme
*GeeekPi 52Pi N04 for Raspberry Pi 5 NVME M.2
*
*2024 RPI AI HAT - Hailo 20TOPs no LLMs
*2026 RPI AI HAT+ 2 - Hailo 40TOPs slightly better?
[https://www.raspberrypi.com/documentation/accessories/camera.html Cameras for Pi]
*Raspberry Pi camera module, the V3 with Sony IMX708 back-illuminated CMOS 12 Megapixel sensor
*Raspberry Pi Camera Module V2 – 8MP Sony IMX219 Sensor
*Raspberry Pi camera Rev 1.3, 5MP 1080P OV5647 image/video module, 2592 x 1944 pixels
====BCM2711====
With the Pi4 an ARM a72 cpu is about x3 times the size of an a53 in the Pi3
the 2711b line used more power when idle, compared to the 2711c
*2018 Raspberry Pi PoE HAT Power Over Ethernet Hat - design issues
*2020 Raspberry Pi PoE+ HAT Power Over Ethernet Hat Pi3b+ Pi4 only - better design
*Waveshare PoE HAT (B) with cooling fan for Raspberry Pi 3B+/4B 802.3af PoE
*[https://github.com/axizo-pi/V3DLib vc6 V3D 4.2] is derived from [https://docs.broadcom.com/doc/12358545 vc4], but it is [https://docs.mesa3d.org/drivers/v3d.html significantly different]
The QPU pipeline stays mostly the same, you still have an add ALU and a multiply ALU and it can issue two ALU OPs per cycle. There is still 4 SIMD lanes, interleaved over 4 cycles.
The instruction encoding for the QPUs is different, but the core instructions are the same.
Instructions for packed 8 bit int math has been dropped, along with most of the pack modes.
Instructions for packed 16bit float math has been added (2 floats at in a single operation)
With vc5/vc6, you write two packed 16f value to the tilebuffer (or four writes of 32f, if you are using the rgba32f framebuffer). And there is a handy vfpack operation which allows you to pack two f32s into a single 32bit value in a single instruction. You can vfpack directly into the tile buffer register.
the multiply ALU can now fadd, so you can issue two fadds per instruction. the add ALU has gained a bunch of new instructions
the A and B register files have been merged. You still only get an A read and a B read per instruction, but they read from one big register file (which means the underlying memory block has gone from two sets of "one read port, one write port" to one "two read ports, one write port" block)
The theoretical max FLOPs per QPU remains the same at two per cycle, other than the bump from 400mhz to 500mhx but it looks like a lot of effort has been put putting those theoretical FLOPs to better use.
*vc4 could run one or two threads per QPU. When you ran in two thread mode, the available register file halfed to 32 registers.
*vc5 added a four thread per QPU mode, with 16 registers per thread.
*vc6 doubled the size of the register file. You could now use all 64 threads in two thread mode and 32 registers in for thread mode. Single thread mode was removed, you always have at least two threads.
With the threading improvements, the QPUs should spent much less time idle waiting NOPs for memory requests. Most of the design changes have gone to improving the fixed function hardware around the QPUs. A fixed function blend unit has been added, which should reduce load on the QPUs when doing alpha blending. hope software blending is still possible
The tile buffer can now store upto 4 render targets (up to 128bits per pixel, so if you are using 4 32bit render targets, you can't have a depth buffer)
A MMU, allowing a much simpler/faster kernel driver.
Many more texture formats, framebuffer formats.
h264/x264 as Pi3
All the features needed for opengl es 3.0
H.265 / HEVC decoder is a HEVCv2 Main 4:4:4 10 design supporting bitstreams up to profile 5.1
HEVC hardware decode supports 4kp60, 10-bit. Audio output is pretty much unchanged, but the HDMI audio channels now support 8x192kHz bitrates
Each ALU typically have 2 floating point operators, and as you pointed out in a earlier post videocore 6 is no exception, with both a multiply and additive floating point operator. Thus theoretical GFLOPs are calculated with both operators in mind. That is what the 2 in my formula represents, and is common across any modern programmable shader, whether you calculate Nvidia, AMD, Intel, Boardcom or any other company's GPUs. Total ALUs * 2 * GHz clock = GFLOPs, In the case of Raspberry Pi 3, it's 24 ALUs * 2 operators * 0.4GHz = 19.2GFLOPs
If the Videocore 6 does indeed only have 16 ALUs (16 * 2 * 0.5GHz), you'd have only 16GFLOPs but they are better utilised
Possible maximum performance
<pre>
VideoCore IV @ 250MHz: 250 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 24 Gflop/s
VideoCore IV @ 300MHz: 300 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 28.8 Gflop/s
VideoCore VI @ 500MHz: 500 [MHz] x 2 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 32 Gflop/s
</pre>
Faster LPDDR4 memory.
====BCM2837====
With the Pi3
* Broadcom BCM43438 chip provides 2.4 GHz 802.11n wireless LAN, Bluetooth Low Energy, and Bluetooth 4.1 Classic radio support, 3B+ [https://github.com/aros-development-team/AROS/commit/afa5bc0bb17d5dd06bcfdbac00853a3799ca8d76 LAN7515]
The overclock ability has diminished with each chip version as the energy usage has increased. BCM2837 is one of the warmest yet and benefits from active fan cooling if all four cpu cores are in use for a short while. Video playback maybe affected due to the lack of custom support in the GPU with Aros. 5 V / 2.4 or 2.5 amp power supply recommended if all four cpu cores are running, else throttling (cpu slowdown) might occur.
[https://github.com/hermanhermitage/videocoreiv/wiki/VideoCore-IV-Programmers-Manual Dual VDP] and scalable QPU in [https://docs.mesa3d.org/drivers/vc4.html VC4] and x.264/h.264 accelerated untested only and VP9 on cpu or neon help
ARMv8-A has [https://developer.arm.com/documentation/102412/0100/Privilege-and-Exception-levels privilege levels] where userspace typically runs at ‘EL0’, the kernel at ‘EL1’ or ‘EL2’ and the firmware at the highest level ‘EL3’.
===32bit===
=== Core Kernel ===
====BCM2708(family)====
which includes the [http://elinux.org/RPi_Hardware BCM2835] (ARM1176JZF-S 700 MHz CPU + VideoCore IV GPU + up to 1GB RAM)
*Framebuffer (fb) using mailbox
*IRQ scheduler, etc
*Arasan based SD Card controller
*Synopsis DesignWare USB 2.0 OTG controller [http://networkdirection.net/index.php?option=com_content&view=article&id=106:rasperry-pi-usb-controller&catid=45:raspberry-pi&Itemid=54 Unofficial DOCS pdf], [dwc_otg.c FreeBSD], [], [https://www.riscosopen.org/viewer/view/mixed/RiscOS/Sources/HWSupport/USB/Controllers/DWCDriver/ RiscOS USB Driver], [https://www.riscosopen.org/forum/forums/5/topics/878 RiscOS USB Discussion], [https://www.riscosopen.org/forum/forums/11/topics/1893 Other USB RiscOS], [http://plan9.bell-labs.com/plan9/index.html Plan9 Miller's usb] http://plan9.bell-labs.com/sources/contrib/miller/, [https://github.com/Chadderz121/csud CSUD driver],
*[http://www.smsc.com/media/Downloads_Public/Data_Sheets/9512.pdf SMSC 9512] USB LAN/Hub chip
*CMOS RAM
*VCHIQ port which sends messages to the GPU e.g. for mouse, keyboard, audio on HDMI, etc
*Audio Driver
*Serial Peripheral Interface Bus (SPI)
*[http://www.susa.net/wordpress/2012/06/raspberry-pi-pcf8563-real-time-clock-rtc/ I2C registers]
*I2S
*Universal Asynchronous Receiver Transmitter (UART)
*[http://elinux.org/RPi_BCM2835_GPIOs GPIOs] and [http://www.adafruit.com/blog/2012/08/17/broadcom-bcm2835-peripheral-memory-map-and-gpio-alternate-use-chart-piday-raspberrypi-raspberry_pi/ Alternative view of GPIO]
BCM2836
* For Pi B+, PI 2 and Pi 3 SMSC LAN9514 chip adding 10/100 Ethernet connectivity and four USB channels to the board
*[http://www.andrewscheller.co.uk/rpi_pcb_modules.html PCB], [http://elinux.org/RPi_Low-level_peripherals Low level features],
Implemented so far...
# Modify the configure system so that it correctly builds for the arm hardware float raspi target.
# Implemented the bootstrap to load the aros modules and prepare the arm to jump into them. Reworked the x86 console support so that parts can be stolen for raspi to use since t has no basic functionality to output to the display.
# Implemented a kernel.resource to prepare the raspi for running aros and provide the low level api calls to expose available resources and allow exec, etc function.
# Implemented serial debug support
# Implemented the exec (and kernel) functionality required to make multitasking work (and interrupts, exceptions, syscalls, etc)
# Implemented a timer.device to utilise the hardware timers.
# Implemented a very basic gfx driver to expose the hardware's framebuffer.
# Implemented an SD-Card driver for AROS which presently only supports the raspi's chipset but can easily be modified to support all sd-card hardware and media.
# Fixed the fat filesystem support in AROS so that it can boot on RasPi's normal SD-Card setup. The "rom" image files needed use a different filename than the default linux, etc images so can be easily installed without harming the existing files - you only need to change the loaded images in the config file to get aros to boot.
# Updated the build scripts to automatically download the necessary raspi firmware files and wrap it all up so that you can simply extract the archive to a fat formatted sdcard and boot it on the raspi without having to get anything else.
# fix everything in contrib and ports to build for raspi (needs proper testing/fixes but allows every component to actually compile at least, including owb) + numerous other fixes to get things working on arm/raspi ..
Improvements...
# Implement a USB chipset driver "OR" finish the existing one [https://github.com/aros-development-team/AROS/commit/c07d13c724f944674be5db54fc6a71ee72a01809 usb otg] - the current code is mostly a skeleton that should initialise the chipset and then needs relevant code to support the different transfer types. It also has the "virtual" hub code in place to represent the raspi's USB port (from poseidons p.o.v)
# Implement a driver for the USB NIC (a few weeks - depends on USB above)
# Write an [https://github.com/aros-development-team/AROS/commit/d55d0f74d20b769bbb8c8d386e5c1d7a9154f05a audio driver] (a few weeks - independent of USB) and [https://github.com/aros-development-team/AROS/commit/e93a4c245f27a87c9c4c1d39206694b39059998a HDMI]
# fix syscall bug in the current raspi kernel code
# Graphics depend on having a decent "bcmdma.resource" implemented as to use the cpu's dma engine. The sd card driver needs to use it for transfers to/from the controller - and the gfx system needs to use it for "blitting".
# [https://github.com/aros-development-team/AROS/commit/4019d84e4975d4dad987a12d57fe108f5ac048e6 Improve the gfx driver], [ vc4gfx HIDD] add [http://dri.freedesktop.org/wiki/VC4/ Gallium3D support]
# [https://github.com/aros-development-team/AROS/commit/b13905b3e8e45b089f520b44692c81affddd066f Improve] the [https://github.com/aros-development-team/AROS/commit/3a876755c070f5c73c4f53c7f4d35b4f923088b9 sdcard] device driver - which is also pretty basic but should work with most cards, rework it to also support pci, etc. sd card interfaces on x86
# The current code using very rudimentary access to the gpio interface - so that should be implemented as some resource for other components to access, as-well as the i2c interface exposed over the gpio interface. that should have a hidd class implemented which uses the gpio resource to communicate.
Boot up typical for most other OSs before the open sourcing of many binary blobs from 2017 onwards
On power-up, the rpi [http://www.open.com.au/mikem/bcm2835/ BCM 2835] [https://github.com/hermanhermitage/videocoreiv VideoCore4] GPU, not the ARM CPU, is in control, and the SD card slot is the only peripheral device with power. The firmware burned into the BCM2835's VideoCoreIV GPU PROM requires a DOS-style partition table; a FAT-formatted first partition; and the freely redistributable but closed sourced Broadcom files “bootcode.bin” and “start.elf” in that partition.
The boot sequence carries out several pre-boot tasks
*On powering of the rpi, the GPU reads and executes bootcode.bin, which then loads start.elf
*The GPU loads the “start.elf” file, eventually, into the L2 cache and then executes it
*configures the memory split for the CPU and GPU
*reads and parses “config.txt” from the same partition on the SD card and applies the settings (like a PC’s BIOS settings)
*loads the “kernel.img” file, again from the same partition
*activates the CPU to begin executing the loaded kernel image
The CPU/GPU memory split is hard-coded into start.elf, so Broadcom provides three start.elf images, to give 32M, 64M, or 128M to the GPU for multimedia performance, and the remainder to the CPU.
RPi uses [https://github.com/raspberrypi/firmware some closed source loaders] and at some point it loads a binary blob named "kernel.img" at 0x8000, at that point there would be a rudimentary Aros alive. If one wants to use the SD-card then there would have to be a driver for the interface and a fat filesystem handler (SD-card has to be formatted to fat filesystem)
Boot code and kernel are now linked together and made into that binary blob, just for starters. Raspberry Pi uses [http://kernelnomicon.org/?p=133 u-boot] and [http://kernelnomicon.org/?p=138 UBoot] as bootloader, there's already some code in the Efika MX port for that. UBoot is a native bootloader and not just for the raspberry pi, it loads after start.elf.
You can find Efika MX port from arch implementations, some hacking is needed for the mmakefile.src'es as iit dates back to before the Aros crosstool era or else you get some weird errors while building. You also need to code the bootstrap and serial handling.
At the moment it seems that a fastest route for the native build would be to make one binary blob without using the package system. Raspberry's memory layout is pretty simple and if the implemented u-boot doesn't support loading other modules
<pre>
? - alias for 'help'
mtest - simple RAM test
autoscr - run script from memory
base - print or set address offset
bbm - BBM sub-system
bdinfo - print Board Info structure
boot - boot default, i.e., run 'bootcmd'
bootd - boot default, i.e., run 'bootcmd'
bootm - boot application image from memory
bootp - boot image via network using BootP/TFTP protocol
cmp - memory compare
coninfo - print console devices and information
cp - memory copy
crc32 - checksum calculation
echo - echo args to console
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls - list files in a directory (default /)
go - start application at address 'addr'
help - print online help
iminfo - print header information for application image
itest - return true/false on integer compare
jade -
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loady - load binary file over serial line (ymodem mode)
loop - infinite loop on address range
md - memory display
mm - memory modify (auto-incrementing)
mtest - simple RAM test
mw - memory write (fill)
nfs - boot image via network using NFS protocol
nm - memory modify (constant address)
pci - list and access PCI Configuration Space
ping - send ICMP ECHO_REQUEST to network host
printenv - print environment variables
rarpboot - boot image via network using RARP/TFTP protocol
reset - Perform RESET of the CPU
run - run commands in an environment variable
saveenv - save environment variables to persistent storage
saves - save S-Record file over serial line
setenv - set environment variables
sleep - delay execution for some time
tftpboot - boot image via network using TFTP protocol
USB - USB sub-system
usbboot - boot from USB device
version - print monitor version
</pre>
And there is one more thing about modular ports. In order to actually implement this, your bootstrapping environment should provide the ability to load several files. On PC this is provided by GRUB2. on CHRP you can read filesystem via OpenFirmware, and Sam's Parthenope relies on modified u-boot. If your bootstrap allows to load only a single file, then you stuck with monolithic kickstart. By the way... u-boot allows not only to boot up a single uImage or zImage, it also allows to write client programs AFAIK. With this approach, you actually can write modular bootstrap for ARM AROS using unmodified u-boot.
Most used [http://www.compulab.co.il/workspace/mediawiki/index.php5/U-Boot_quick_reference uboot options] are fatls usb 0:1,
the reason behind INTB_KERNEL is to allow use of the standard Exec function AddIntServer() to add interrupt handlers for
hardware drivers etc. AmigaOS never used it for abstract hardware drivers. AmigaOS routed only raw hardware IRQs there. Their assignment was hardcoded. As well as number of them. Actually on AmigaOS every bus has its own interrupt subsystem. For example PCI bus. PCI interrupts on Amiga are routed to a single exec interrupt. 1:1 relationship between CPU and hardware interrupts is present only on PC.
IMHO we miss things like AddInterrupt/RemInterrupt methods on our PCI subsystem's device class. PCI bus class should map these methods to whatever is appropriate. This is how it is done on AmigaOS and friends. When these are implemented, raw kernel.resource API will be needed only for several PC-specific drivers with hardwired resources. Exec IRQs are real IRQs only on Amiga hardware. On other machines they can be emulated where appropriate (VBlank is a good example). kernel.resource is meant to be different, its IRQs are hardware-agnostic, they are plain "Hardware IRQ number X, whatever this means". They are low-level actually, and meaningful only in the context of a particular system.
Was that not the transition from irq.hidd to kernel.resource? No. A long time ago there was another hacky bit named INTB_TIMERTICK. It was "abstract timer interrupt", used by timer.device. It was the same as VBlank, but with larger frequency. I removed it, because kernel.resource API was a cleaner way to access this interrupt. Furthermore, there can be more than one timer in the system. Thinking about bringing back timer HIDD definitions again. hpet.resource is a bad idea.
Can someone please enlighten me a little on how the scheduler is meant to work?
Poseidon.library creates its "Poseidon Event Task" during RTF_COLDSTART -> then calls Wait(), and ends up in limbo because wait disables interrupts (used for the scheduler heartbeat), and basically waits forever because the sigbit is never set, since krnSwitch doesn't switch the task unless TF_SWITCH is set, and no codepath run during this seems to set it?? TF_SWITCH does not disable/enable switching. This flag just enables to run user-supplied hook when the task is being switched away. It is completely safe to call Wait() in Disable()d state. Doing this actually temporarily breaks this state. IDNestCnt gets remembered in struct Task, then next task is selected, and its IDNestCnt is restored in sysbase (see kernel_scheduler.c). If there are no other tasks, then your cpu_Dispatch() should enable interrupts on the CPU and enter idle mode. See x86 implementation for good example.
You miss what happens next...
1. KrnSwitch() saves context of your task, saves IDNestCnt (core_Switch() and cpu_Switch()), then drops into cpu_Dispatch().
2. cpu_Dispatch() calls core_Dispatch. Then two cases are possible:
2a. There is a READY task. It is picked up, its IDNestCnt is restored in SysBase, then cpu_Dispatch() needs to restore registers and exit. The next task is run.
2b. There are no READY tasks. core_Dispatch() returns NULL. In this case your cpu_Dispatch() should enter idle loop. It should just enable interrupts on the CPU and put it on halt. This allows it to process hardware interrupts. Eventually some of your interrupt handlers wakes up your task and puts it into READY list.
My heartbeat interrupt has been slowed atm to help debugging - but it never actually gets a chance to fire because of the Wait() disabling interrupts. Perhaps you have forgotten to enable interrupts in your idle loop.
There is a change in the format of AROS executables. Until now we were using Elf RELocable files which are usually used as intermediate object files. We had them for various reasons, one of them was how AROS files were built in the past. That days we had no real aros cross compiler and the option to embed relocation data in unix executables (or in executable files in general) was rather new and not every linux/unix system had it. Therefore we have decided to use intermediate files. Although it was somehow working (and it is still working :-)), it has some drawbacks. Therefore decided to introduce real Elf EXEC types, in first turn implemented on ARM target with option to expand in future to all other AROS architectures.
The first patch was pretty easy and appeared to work somehow. It generated nice executables with embedded relocation info. Not only that, it also removed all global symbols adjusting relocation data to be relative to the beginning of the sections. That move reduced number of symbols in each executable significantly (depending on the file between 20 and 80% of all symbols could be removed). The only symbols that stayed in the file are local ones - due to the nature of the patch wasn't able to remove them since we have not seen them in the symbol hash table.
The patch didn't worked though. The files were relocated, AROS kernel loaded, but it crashed very early. What happened? Well, the nature of ARM relocations happened :)
Most of the relocation data on all machines is rather simple. Relocation can be absolute or pc-relative, sometimes the offset has to be bit shifted. On ARM v7 there is another one. There, when one wants to load an address of function/variable into register a combination of two instructions can be used: movw and movt. The first one loads immediate into lower 16 bits of a register while clearing upper 16 bits. The second one loads immediate into upper 16 bits without touching lower halfword. Loading of a pointer into a register looks like this:
movw r0, #:lower16:label
movt r0, #:upper16:label
In this case there are two relocations - one for lower halfword and another for upper. If an overflow of lower 16 bits occurs during relocation process, the upper one should be updated as well. Unfortunately with current patch and with typical ARM executables there is not enough information to perform the calculations.
There are two options - the first one would be to give up and go back to "fake" executables, another one would be to change from REL to RELA relocation info. The latter contains an addend, extra data which can be used to perform all the relocation calculations I need.
Decided for the second option. The patch is already in the works. There is another function for the binutils' bfd backend to perform the final relocation. There can decide what to do with every reloc info, modify data and eventually strip some symbols. An advantage is - at this stage of the linking process have also full access to all local symbols so can change all relocations section relative and eventually strip all symbols from the files.
GPU
VCore developed by Alphamosaic Ltd and now owned by Broadcom. Most of start.elf runs on the GPU. Placing ALL the userland GPU code in the videocore.hidd isn't going to be a terribly big problem because the code they published is nothing more than a shim that sends data straight to the GPU to execute.
The good news about this is that we only need to write our HIDD using the OpenVG API. The shim is relatively small codewise and lives in the ARM memory (the actual OpenVG code itself lives in the GPU RAM area and its loaded from start.elf). That's also the bad news. Our driver has to translate AROS video calls to OpenVG calls, for most tasks it should be easy, for some, not so much. It's still probably less difficult and less work, than controlling the GPU directly.
The other good news is that anything done through OpenVG happens on the GPU, its truly accelerated. It also has some nice font functions, meaning we can lead into an accelerated text mode later.
Basically, AROS resets or locks up when it tries to use AROS_ATOMIC_INC or DEC. If I comment out the byte/word operations in the header files and use non-atomic operations, the code works as expected.
have read that the L1 cache needs to be enabled to use LDREX and co (which I also read is only meant to be used on multi processor systems with shared memory) - however I am certain this is correctly enabled.
If you are using LREX or STREX, you should have L1 cache enabled, at least on the ARM CPU I work with at work.
L1 cache is enabled by enabling the MMU *AND* setting the C and I bits in the CPU - the C bit is ignored, and the I bit only covers the 16 byte instruction pipeline if the MMU is not enabled.
Can you verify that your assembly is generating LDREX/STREX? From the behavior, it almost sounds like its generating the default Semaphore locked atomics.
Impossible. There are no semaphore-locked atomics. There are Disable()/Enable()-based ones instead. And there's a special #define AROS_NO_ATOMIC_OPERATIONS in this case, which tweaks Disable()/Enable() implementations not to recurse forever.
I have tested this on ARMv5 which does not have ldrex/strex, it works fine. On those ARMs there's no way to have real atomics. On other OSes (like Linux) this is done by introducing things like atomic_t, which appears to be a complex structure, holding the value together with accompanying spinlock (implemented using swp).
#warning "TODO: lookup optimal mmu table settings for raspi memory"
/* Set up an identity-mapping for all 4GB */
for(x = 0; x < 4096; x ++)
{
pagetable[x] = x<<20 | (0x40002|0x80000|0x010000|0x00C00|0x04);
}
Shouldn't there be a second loop that sets the 'C' bit in the descriptor for the RAM pages?
Currently, you have TEX=0, C=0, B=1 for all pages (Shared Device).
You should have TEX=0, C=1, B=0 for RAM (Write-Through, Cached)
So ..
pagetable[x] = x<<20 | 2;
should be enough?
No, for RAM you need to change the '| 0x40' to '| 0x80'
tell dosboot the correct defaults to use
Please don't do this. This bootconfig.c is a deprecated legacy thing. I wanted it to go away completely with time. Instead, display drivers should auto-install themselves during own initialization phase. I. e. detect hardware=>instantiate itself. This should make things way simpler. With this approach you only need to add the driver into KS image to get the device autobooted. No hardcoded stuff.
Currently VESA and VGA drivers do this, look there for examples. never rewrote ATI driver because i don't have any test system for it.
they defined a smaller AROSCPUContext than the ExceptionContext - yet reference it as ExceptionContext in other places, and since it hasn't allocated enough storage for ExceptionContext, are corrupting memory/the structure (since the elements that are there don't map 1 to 1 with the exception context).
AFAIK, AROS has been moving in a different direction to this in recent years. It is the job of graphics HIDDs to allocate bitmaps etc. so that they have the most suitable characteristics, including allocating them from GPU RAM where possible. The concept of chip RAM is only for legacy code, and most if not all non-68k platforms should have all system RAM
marked as chip.
BTW, is the video processing code you mention CPU code or GPU code?
Also, IIRC we have support for "external memory allocators". Perhaps that's what we need for the allocation of GPU RAM through the mailbox.
All hosted and x86 native ports should use proper context formats.
trying to clarify if the vblank handler has to have run by this point to prevent this deadlock. Actually, no. Unless you have installed VBlank handler which should wake up at some point. Without VBlank there will be no quantum count. Consequently, there will be no forced preemption. But the rest will work, and multitasking will be cooperative (switch happens only when current task voluntarily gives up the CPU). Does it depend on the vblank having run before this point? and if yes what does that mean on systems where it might be able to run enough code (e.g. get to this point) before the vblank interrupt has triggered? What is it waiting for? It could wait for timer, in this case you need timer.device working. VBlank is currently needed for exec's quantum counter. In current native ports we have only a single timer, which is served by timer.device. VBlank is simulated by timer.device also. If your machine has two timers, then you can use one of them for VBlank, and another for timer.device, this will simplify things down. VBlank needs to be 50 Hz for historical reasons, many programs use it as cheap timer. I am periodically thinking about making some abstract mechanism to be able to change quantum source (and untie it from 50 Hz), but have no time to come up with something good. Additionally i started disliking timer.device hardcoded design when PC has got many timers (old 8253, APIC, HPET).
Currently i think there should be some low-level entity representing tick source. timer.device should just select the most appropriate source for its units.
The BCM2835 has 4 GPU based timer sources - 2 are used by the GPU, so im using Timer3 for our heartbeat and the remaining one will be free to the system. There is also the less capable ARM timer but that is dependent on the CPU frequency. Very good. You won't need any emulation. Set the heartbeat to 50 Hz and drive VBlank from it. Use other timer for MicroHZ.
Can you use the 'econsole.hook' I make for debugging the Sam460 via the serial port?
It provides a before-anything-else shell prompt on the serial port. You can then do 'NewCLI' to test your graphics, or use any DOS command in shellcommands.resource.
You should just be able to add econsole.hook to your module list, and use 'econsole' in your bootargs.
So long as you have a working Exec/RawMayGetChar and Exec/RawPutChar, it should work.
Also make sure to add shell.resource and shellcommands.resource for this.
That should have done it.
If you set "#define DEBUG 1" in arch/all-native/econsole/econsole.c, do you get any additional serial output?
have added it to the build and added econsole to the command line - and can see the bootloader picks up on the emergency bootconsole tag, but I still only get the insert bootable media display?
Im assuming it exposes a fake filesystem that tricks aros into booting?
The contents of which are: ECON:AROS.boot
Way to handle the scheduling code? The implementations I had been following were causing problems, due to cascading interrupts which I cant handle properly in the asm stubs just now (when they break disable etc.) - since it means detecting the interrupted codes cpu mode and getting the correct sp/lr for it, and that's just too tedious for arm.
To work around this ive added a system idle task which does nothing - and when the scheduling code has no task to run switches this in and lets it run, thereby allowing the interrupts etc to resume until something does need to happen.
Also, by adding accounting code to cpu_Switch() and cpu_Dispatch(), it should allow the system to log idle time correctly (as well as running tasks).
have thought of also adding an additional task that never runs, solely to record time spent in IRQ handlers, but I digress..
was under the impression that kernel.resource should *never* be used outside of exec.library. This is a wrong impression.
Michal started designing it because portable nature of AROS does not fit well into exec's API with all its assumptions. So, he started the new, hardware-agnostic kernel API from scratch. Yes, exec sits on top of it in places. But kernel always meant to be open thing. Otherwise it would not exist.
it wasn't meant to be just used willy nilly by user code - but by lower system components (e.g. exec) so that they could be implemented in a more generic fashion, and the kernel resource itself hide the systems quirks.
Adding new things there perfectly keeps up with our decision to minimize AROS-specific intervention into APIs which can clash with MorphOS or Amiga OS4 extensions. We want at least source-level compatibility there. Binary compatibility on PPC would be extremely cool, but at the other hand we have no maintainer for this, as well as their ABIs splintering.
It depends on what exactly is being implemented - there's no reason we should have everything crammed into kernel.resource if it doesn't need to be (i.e. if its better suited as a separate component/subsystem in its own right)
The _LE versions are for when you have endian swapping taking place. If the graphics are the same endian as the CPU, no swapping should occur. I ran into a similar terminology problem in SDL with a friend insisting that his Radeon 7000 on his PC was big-endian. It is not, it just uses the same endianness for the graphics card and the CPU so no swapping was necessary. They were both little-endian.
The _LE versions are because the PixFmts refer to the bitmap data being in big endian format in memory, for which the normal version would need to do endianness conversion before applying the shifts/masks. on this platform it is in _LE in memory also so we don't need the conversion hence using the _LE version of the call). would use _LE (if it's really little endian 16 bit mode).
What is the bare minimum needed to implement a framebuffer based gfx driver, with our software handling the rest?
Have tried with just a gfx class that only expose new/dispose/newbitmap - and having an onscreenbitmap used only for the framebuffer itself (with all other bitmaps being chunkybm, and the framebuffer's superclass also being chunkybm), but that alone isn't enough it seems?
You can use workbench/hidds/sm502/ as your example - it is as simple as I could make it.
So, AROS creates the framebuffer bitmap (verified this) -> so surely it should be capable of then rendeing into it? I don't actually create the framebuffer "bitmap object" myself - only as a result of being asked to. The code I currently have on SVN seems to create the framebuffers bitmap object fine, but then crashes in intuitions DisplayDriver callback. In particular it crashes performing the getattr on the system default pointer. don't expose MEMF_CHIP in an allocatable form so AllocSpriteData was failing (and other code later doesn't check if the values are valid == illegal memory accesses)
So far have -:
vc_init: queries the gpus memory, and sets up a fake memory handler for it, then adds the bootmode driver and returns saying all is well
vc_gfxhidd:New: sets up some fake syncmodes to test with and creates the real gfx object.
vc_gfxhidd:NewBitmap: checks if its a framebuffer and uses the onbitmap class or uses the chunkybm class otherwise
vc_onbitmap:New; creates a chunkybm object and then pushes the real framebuffer address into it as the buffer,
vc4 had v8adds, v8subs, v8muld, v8min and v8max which operated on four 8bit uint values packed into a 32bit register. Multiplication was in the range 0.0 to 1.0 and addition/subtraction saturated. There were also a range unpacking/packing modes that allowed you to pack and unpack 8bit values into 32bit registers.
RasPi has to speak to the "operating system" which runs on the GPU itself and request/free memory - it cant directly manage it itself, and so the managed functions were used to wrap these calls.
The Arm and GPU share memory space. The framebuffer is shared. The Arm can write a pixel and it will appear on the screen (through GPU hardware) without flushing/copying being required.
The GPU can composite multiple FB's in real time - so you have a number of surfaces defined which are rotated etc and composited in real time to the output. Copying can map from the address space of the Arm to the flat space of the GPU which takes some code, but I don't think whole buffers are copied.
The DMA hardware can also access the whole memory space and can perform 2D fills and blits (no blending). This is documented in the peripheral spec posted. The DMA is just an Arm accessible peripheral and can be set up with low latency (e.g. microseconds).
must use a 0xc0000000-based bus address to access SDRAM, yet non-DMA access should go via a 0x0-based bus address.
For 2D dma, set TDMODE, and the spec says "interpret the TXFR_LEN register as YLENGTH number of transfers each of XLENGTH, and add the strides to the address after each transfer." so set STRIDE to pitch of the image, the width is XLENGTH and height is YLENGTH. You would fill by not setting the SRC_INC and point source to your fill data.
The DMA cannot see the ARM's L1 cache, so you would map the framebuffer with ioremap_nocache. Depending on where the source data comes from, it may need an L1 cache flush. The DMA can see the L2 cache. Use 0xC0000000 bus addresses when L2 is disabled and 0x40000000 bus addresses when L2 is enabled. (actually just call virt_to_bus and you'll get the right address out).
openGLES/openVG has high latency. Writing to framebuffer then reading it back is very inefficient (e.g. milliseconds). If you can drive it a unidirectional way, just streaming commands at then that is efficient. openVG is not implemented on top of openGLES - it uses the same hardware but as a first class interface
To improve the Gfx driver, we will need a DMA resource implemented so can use to perform DMA operations. The Gfx driver will need this to perform blits.
Actually MEMF_CHIP has to present, for historical reasons.
This has been never fully agreed upon, but in ports i wrote i exposed the whole memory as MEMF_CHIP. The idea behind this is that CHIP is originally the memory where graphics and sound data can be put. On non-Amiga platforms there are no restrictions on this, so the whole memory is CHIP.
Yes, many old software can misbehave with CHIP memory size larger than 2MB. But this actually applies only to m68k AROS which is going to run m68k binaries. In other cases it's quite logical to fix the program when porting.
As to original question: yes, it's enough to have a framebuffer bitmap (one with aoHidd_BitMap_FrameBuffer set to TRUE) and PutPixel routine. It framebuffer can be served by chunky bitmap class, then you can simply create chunky bitmap with your own buffer (see how VESA driver does this). Chunky PutPixel is already there.
struggling to determine what is the correct pixfmt to use for the 24/16/15 bit gfx modes on the RasPi. AFAIK it uses RGB565, for 16bit but im unsure what shifts etc should go with it? suffice to say Im getting the wrong colors so far lol.
<pre>
redmask: 0x0000F800
greenmask: 0x000007E0
bluemask: 0x0000001F
alphamask: 0
redshift: 16
greenshift: 21
blueshift: 27
alphashift: 0
</pre>
It should likely be vHidd_StdPixFmt_RGB16_LE
This stuff is a bit confusing. The "names" of the stdpixfmts are based on the layout in memory,
ignoring endianess. So for example:
ARGB32: will be 0xAA 0xRR 0xGG 0xBB in memory on both big endian and little endian machines.
The shifts and masks OTOH are based on pixel access (ULONG in this case), so differ depending
on whether you run on big endian machine or little endian machine (that's why there's stdpixfmt_le.h and
stdpixfmt_be.h in rom/hidds/graphics/).
With the 16 bit pixel format it's even more confusing, as for example it's impossible on little endian machine
to describe RGB16 with shifts/masks alone. That's why there's vHidd_PixFmt_SwapPixelBytes_Flag.
(RGB16 == RRRRRGGG GGGBBBBB in memory, and for pixel (WORD) access on little endian machine it needs to
be accessed as GGGBBBBBRRRRRGGGG).
The shifts btw indicate how much to shift the component to the left (!) so that it is moved to the highest bit (31).
The aHidd_PixFmt_StdPixFmt you specify will be ignored most of the time, because when the pixelfmt is registered,
the gfx hidd checks if there's an identical pixfmt (shifts/masks/etc., but ignoring pixfmt->stdpixfmt) already in the system,
and if so, it uses the already existing one and does not create a new one.
In theory it would be better if gfx drivers could simply/only specify a StdPixFmt without all the shifts/masks stuff when the
gfx driver uses pixfmt which matches one of the stdpixfmts exactly. Another possibility would be for gfx drivers to use
HIDD_Gfx_GetPIxFmt(stdpixfmt_gfx_driver_wants_to_use) and then peek shifts/masks from it and fill out a pixfmt
tag list based on that.
15bit very blue/green: Try to pass same shifts/masks/etc. as in 16 bit pixfmt (maybe you think it's using 15 bit R5G5B5
(or swapped) but it's actually still using 16 bit R5G6B5 (or swapped).
aHidd_PixFmt_StdPixFmt you pass is mostly ignored. It's the shift/masks/etc. that count.
But I would still pass the correct one (_LE) == whatever rom/hidds/graphics/stdpixfmts_??.h uses
in the entry where you have looked up shifts/masks/etc.
Use the shifts/masks/etc. from the entry in stdpixfmt_le.h (if you are running on little endian machine) or stdpixfmt_be.h (if you
are running on little endian machine) that matches the pixfmt that its meant to be.
0xAA,0xRR,0xGG,0xBB on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_BGRA32)
0xAA,0xRR,0xGG,0xBB on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_BGRA32)
it feels like AROS trashes the alpha component, otherwise it should be 8A8R8G8B.
read on the subject suggest its in 1x5r5g5b (x is ignored) to keep 16bit alignment .
Suggests to me that wrong shift/mask are being applied - however going by the 16bit versions it all looks correct to me so I am really confused as to what is happening.
The output image looks to have too much green/blue, and very weak red.
Kickstart
The idea is to minimize amount of archirecture-specific modules to make the user's life easier. So, the kickstart was split into 'base' (which does not contain anything machine-specific) and 'BSP' (Board Support Package) which contains all hardware-specific stuff. This way, for example, distribution makers can save up space on CD and make CDs with multiple platform support. Different configuration would load the same base with different BSP's.
Next there was some part which is entirely missing on hosted. These are filesystems. Hosted ports do not need them to boot up, so on hosted they are left out. At the other hand, they are also architecture-agnostic. So i put them into 'FS' package (standing for 'filesystem').
USB
Poseidon is one more big part. I made it into separate package in order to allow users to omit it if they don't need it (for example, to run on retro PCs without USB). Personally i have one. Again, Poseidon is hardware-agnostic (well, there are USB drivers but HCIs are pretty standard).
AFAIK its HCI 1.0 compliant but not familiar enough with poseidons drivers, nor USB, to just hack away at the existing code. Perhaps once i'm more familiar with the workings I can merge in the changes needed to get it operating but for now I will focus on getting it running. Also our drivers have known issues so perhaps a fresh set of eyes might shed some light on what is going wrong.
Another interesting question is whether Poseidon can operate on device side. Is it flexible enough? How similar is being a USB host and USB device? think it will need a bit of work on Poseidon's side. Until then I will force the driver into Host/Master mode in the init code, but leave open device etc to configure the chipset for either's use - and look at trying to add support for working in Device/Slave mode & switching modes once it's up and running.
Actually USBROMStartup is some kind of kludge. Can there be any alternative? Could device drivers be self-installing, like our HIDDs? This would get rid of need to list them in USBRomStartup.
* Model A and B limited to 150 mA per port.
* Model B+ and Pi 2 introduced configurable 600 mA to 1.2 A support over all ports - anything above that requires a powered USB hub.
Implementing the hardware driver that Poseidon uses to interact with the USB components.
Have code in place to (try) and initialise the USB chipset, and configure host/device mode operation (though AFAICT Poseidon doesn't support device mode). Started to get the "virtual" root hub written for the single USB port so that Poseidon should at least list it correctly in the GUI - and try to interact with it to find peripherals.
The BCM2835 uses a soft IP block from Synopsys’ DesignWare library (DWC), specifically the block is called dwc_usb_2_0_hs_otg_subsystem-ahb_se (“USB 2.0 Hi-Speed OTG Controller Subsystem w/AHB Interface SE”).
There is no public documentation for this, and pretty much zero chance of anyone getting hold of it even with NDA. However, there's a Linux driver written by Synopsys ([https://github.com/raspberrypi/linux dwc_usb]). Specifically directories [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_common_port] and [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_otg].
The Synopsys code is actually under a fairly permissive licence – it's not GPL, it's similar to BSD (’don't sue us if it breaks’ is pretty much the only clause). So this should not be a barrier to porting the code.
The code is really well written, with a nice partition between the work done by the driver (dwc_otg, which is fairly involved, given the host does more work than a conventional EHCI driver), and the interface to Linux (dwc_common_port).
Probably only need provision of relevant changes to dwc_common_port. Other things to consider....
* Provision of necessary headers to get it to compile
* Provision of necessary functions (main issues are wait queues, threads, work queues, tasklets, timers, spinlocks and mutexes (multithreading) )
* Interfacing between USB stack and the driver. dwc_otg/dwc_otg_hcd_linux.c looks like the place to start.
the Linux bits of the headers are only required for the dwc_common_port library. dwc_common_port includes a variety of crypto functions which are not used – it appears to also be used for ultrawideband (UWB) and wireless USB (WUSB) drivers where crypto will be an issue, but it isn't going to be for plain wired USB.
Every USB driver acts as an USB hub as well in order to let Poseidon control the state of USB ports. The code there was reading status of the only USB port in Raspberry's CPU but when changing the status it erroneously deleted some of the status bits, including the port enable one. It was so because those bits in the status register are of a type Read/WriteToClear. It means, if one does not want to change their value from 1 back to 0, one has to actually write the 0 value. Very practical thing e.g. in interrupt handlers, where one reads the interrupt status register to learn what was the interrupt reason, and writes it back to the same register in order to clear the interrupts.
After fixing that code it turned out that the communication was still unsuccessful. Apparently the USB device was not understanding the host for some reason. That should not happen since the request sent was one of the standard ones implemented by virtually anything with an USB connector, assumed that Poseidon clears the data caches before forwarding the work to the USB drivers but that's the responsibility of the driver itself.
The USB device responded and acknowledged the transmission! But why were all the request sent after address change failing with timeout? They should not. Once again, address set is supported just by anything. Tried to contact the device at address 0 once again and there it was, still responding properly. The enlightenment came. The bus address for DMA transmissions was, as it is in many bare metal USB implementations, just the pure memory address of the buffer as seen by the ARM cpu. Have "prefixed" it with the real location of uncached RAM and booted AROS once again.
Trident saw this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
and this:
Product : Vendor: Vdr=0424/PID=EC00
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 255
SubClass : 0
DevProto : 1
VendorID : 1060
ProductID : 60416
DevVers : 0200
and even this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
What are these things? The first one is USB hub built in the Raspberry. Thanks to this one the Pi machines (with exception of Pi0 and computing modules) have more than just one single USB port. The second one is the network chip in raspberry, the third one is my USB SD card reader which have just connected to see what happens. AROS tried, of course, to boot from it ;)
So, the first step towards working USB is done. The control transfers are working as you can see above. Next step is to implement bulk and interrupt transfers, having the basics in place. Finally some error handling will be added and USB for Pi will be as complete as the PC version.
[http://www.raspyfi.com/raspberry-pi-usb-audio-fix/ Issue with USB Audio]
Audio
The Pi 4B is the only Pi that can output HD Audio as an HD Audio passthrough bitstream, and it does it over HDMI. It's possible to use the two HDMI output for separate HDMI video and HDMI audio outputs to allow UHD HDR video and HD Audio with non-UHD HDR compatible AVRs.
The Pi3B+ and earlier will decode to PCM 5.1/7.1 and output over HDMI. HDMI is the only interconnect that has a standard for carrying Dolby True HD, DTS HD MA etc. as a bitstream - you can't carry it as a bitstream on any other interface.
Pi3 and Pi4 audio jack output derived from 12bit pulse width modulation is relatively poor. For better, choose USB Audio or I2C versions.
[https://github.com/raspberrypi/linux/tree/rpi-patches/sound/arm audio] and its [https://github.com/raspberrypi/firmware/issues/2 very high speed message passing interface type of thing VCHI]
The Model B+ added an additional voltage regulator for the audio output and an additional output driver to drive low-resistance loads like headphones. However it is still using pulse-width modulation (PWM), which has a major impact on sound quality
the old Raspberry Pi used a linear voltage regulator to provide the 3.3V to many of the components on the board while the new one uses a switching regulator. Both can perform reasonably well. However switch mode power supplies often show higher noise figures
Analogue audio
Audio over HDMI rev 1.3 & 1.4
Ethernet
10/100 BaseT Ethernet RJ45 socket
GPIO
GPIO shouldn't be too bad but bear in mind it is already accessed in places so they would need to allocate pins etc through it (e.g. sdcard to flicker the activity light, serial debug to output data on the GPIO pins)
Probably a resource rather than a device...
Started an i2c driver that will need to allocate GPIO pins. Feel free to work on it if you are interested ;p
GPU graphics with 2D and 3D acceleration
Sadly none yet for 32bit but for 64bit...
Miscellanous
hdmi issues
Setting the hdmi_force_hotplug=1 makes sure the Pi believes the monitor/TV is really there.
You might also need to set config_hdmi_boost=4 or even higher (up to 9) if your display needs a stronger signal.
If the display is a computer monitor or newer tv, use hdmi_group=1 (auto HDMI use) and if it is an older TV, try hdmi_group=2 (for DMT formats, i.e. for PC monitors) then you HAVE to "set hdmi_drive = 2 to enable HDMI output as this forces HDMI mode rather than DVI mode
Do not set hdmi_safe=1 as that overrides many of the previous options.
Using a shorter or better quality HDMI cable might help. Make sure your Pi's power supply delivers 1 A and not 500 mA.
If you see a problem with the red colour - either absent, or interference - then try a boost
composite video
changing the RCA cable, then the composite port worked out of the box
Boot it as you are doing, without HDMI. If you now plug in the HDMI, do you get the image? In other words, does the Pi think HDMI is connected even when it isn't?
Rename all the files in the first partion of the card except bootcode.bin, start.elf and fixup.dat What's the result?
Put back config.txt What's the result?
for PAL mode sdtv_mode=2
dmi_ignore_hotplug Pretends HDMI hotplug signal is not asserted so it appears a HDMI display is not attached
hdmi_ignore_hotplug=1 Use composite mode even if HDMI monitor is detected
<pre>
# NOOBS Auto-generated Settings:
#hdmi_force_hotplug=1
#config_hdmi_boost=4
#overscan_left=24
#overscan_right=24
#overscan_top=16
#overscan_bottom=16
#disable_overscan=0
start_x=1
gpu_mem=128
</pre>
tvservice -c "PAL 4:3"
<pre>
/opt/vc/bin/tvservice -s or tvservice -s
state: HPD high|HDMI mode|HDCP off|composite off (0x12001a), 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m CEA
Group CEA has 1 modes:
(native) mode 16: 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m DMT
Group DMT has 0 modes:
</pre>
sudo amixer cset numid=3 1
forces the audio to the headphone jack, even with the HDMI video output plugged in
config.txt
the hdmi_ignore_edid_audio=1 option sems relevant as it should tell ALSA that the only available audio is analog, no matter what the display says
There are several different ways that these 4 pole (ring) composite analog cables can be wired up, so some work great in some applications and can be a waste of time in others.
What is needed for the Raspberry Pi B+ and above, which like many camcorders needs the ring contact next to the base contact to be the ground.
The wiring for the 4 pole are:
TIP (LEFT AUDIO CHANNEL)
RING 1 (RIGHT AUDIO CHANNEL)
RING 2 (GROUND/EARTH)
RING 3 BASE/SLEEVE (VIDEO) YELLOW
Most Apple based Players and the Microsoft Zune (TM) are wired this way.
Most analogue camcorders are wired this way as well, where the ground in on Ring 2 will work with the Pi although you may need to swap your Video plug with the Right Audio plug.
Nearly all other MP3 players are not wired this way, the ground is on another ring ie the wrong one.
External devices
* Camera Module Omnivision ov5647 Sunny 5MP (NoIR version) V1.3 - NoIR at 850 nm, peak at 880 nm and trails off at 940 nm wavelengths
* Camera V2 Sony IMX219 V2.1 8mpixel 8MP 8megapixel - 3280 x 2464 pixels - video at 1080p30, 720p60 and 640x480p90 - wider field of view, 62 vs 54 degrees horizontally -
* Branded WIFI usb BCM43143 dongle
N.B. dreaded error after changing cameras (stupidly without turning off the power first) and lasted through several power cycles. It can be a bad 15-pin FFC ribbon cable, when swapped, camera(s) and the Pi itself are working OK. It can be an instance of a cold solder joint on the CSI connector on the pi board. the camera can be detected (that's done via I2C) but may still not be able to receive image data (done via CSI-2) if something is broken. CSI-2 is uni-directional. Control is generally done via I2C.
The CSI-2 receiver always writes to memory, not direct to the ISP. That's the way the Broadcom architecture works as it allows multipass processing easily. GPU memory is accessible from the ARM. Processing using the QPU graphics processors may be possible. currently the only supported sensor is OV5647 and IMX219. The linux drivers are all in the firmware blob, else you'd be looking at at least a man-month of work in a fully fledged imaging lab to do a decent tuning of the camera modules' ISP parameters.
Static electricity maybe an issue for the camera module and slightly less for the pi board.
== References ==
===Good sites to visit===
*[https://github.com/raspberrypi/firmware/tree/master/ Raspberry Pi Firmware build]
*[https://www.raspberrypi.com/documentation/computers/software-sources.html Documentation]
*[https://rpilocator.com/ RPiLocator]
Linux only
*[https://github.com/raspberrypi/linux Raspberry Pi Linux Build]
*[https://dietpi.com/ DietPi]
*[http://www.tinycorelinux.net/ports.html piCore]
*[https://wiki.alpinelinux.org/wiki/Raspberry_Pi Alpine Linux]
*[https://github.com/armbian/build Armbian]
*[ FydeOS]
*[ TwisterOS based on ChromiumOS]
*[https://note.com/jamesmondo/n/nc76e31402be8?hl=en BSD]
*[https://www.raspberrypi.com/software/operating-systems/ PiOS Lite] and then [https://hstwb.firstrealize.com/ HST]
*[ PiMiga for pi4 and pi5]
*[ amibian for pi2 and pi3]
*[ retropie pi1 and 2]
Other alternative lighter smaller than Pi OS
*[https://aros.sourceforge.io/nightly1.html Aros 64bit ARMV8 single core]
*[https://www.riscosopen.org/wiki/documentation/show/Welcome%20to%20RISC%20OS%20Pi RiscOS on Pi3 and Pi4]
*[https://github.com/michalsc/Emu68 ARM based realtime JIT 68k for amiga computers]
*[https://github.com/JJDSNT/bellatrix/releases/ Alternative use of Emu68 on Pi3b]
*[https://github.com/stevereaver/uaos uaOS with Emu68k]
*[https://github.com/aros-development-team/AROS/commit/f80a268607dfae81b2db94755ab4e4d31ccb72d6 m68kemu library reference]
*[ HaikuOS]
*[https://github.com/raspberrypi/noobs NOOBS] os loader with successor [https://github.com/procount/pinn PINN]
*[https://github.com/maxnet/berryboot berryboot]
*[https://github.com/brianwiddas/pi-baremetal Bare Metal Access on Pi 32bit]
Testing procedure is put sd card in, connect board to board if necessary, plug in hdmi and then power nothing else is done especially CSI DSI etc
[https://www.raspberrypi.com/documentation/computers/compute-module.html CM5] has the same 55mm x 40mm 2x100pin connectors form factor as the CM4 but [https://www.epdtonthenet.net/article/214508/Key-Considerations-When-Migrating-from-Raspberry-Pi-CM4-to-CM5.aspx some pins and other small things] have changed. Will need the [https://raspipcb.com/tech-blog/raspberry-pi-cm4-vs-cm5-difference-in-booting-from-sd-card/ right IO board to suit]
*Green [ Raspberry Pi Compute Module 5 IO Board REV2 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1967]] - untested
*Green [ RPi Compute Module 5 IO board REV1 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1751]] - untested
*Black SupTronics Geekbord X1500 CM5 IO Carrier Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*[https://sipeed.com/nanocluster Sipeed NanoCluster] - untested up to 7 CM5
*Green BentoIO CMX0 - untested
*Box EDATec ED-CLAWBOX - untested
*Home Assistant Yellow - Kit with PoE with Raspberry Pi Compute Module 5 - untested
*Blue [https://www.waveshare.com/wiki/CM5_PoE_BASE_A Waveshare CM5-PoE-BASE-A] - untested
*Box Waveshare [ CM5-POE-BOX-A] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-B Waveshare CM5-IO-BASE-B] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-A Waveshare CM5-IO-BASE-A] - untested
*Blue Waveshare [https://www.waveshare.com/wiki/CM5-NANO-B CM5-NANO-B] - untested
*[https://carboncomputers.us/products/pi-flux piFlux]
*[https://carboncomputers.us/products/ Zitaotech Hackberry] CM5 lite only -
*Portable [https://www.waveshare.com/pocketterm35.htm Waveshare PocketTerm35] with Pi4B or Pi5 - untested
*Box [https://www.clockworkpi.com/uconsole ClockworkPi uConsole][https://www.youtube.com/watch?v=EtI_bAahbR8 CM4 into an adapter or CM3 into so-dimm - Cyberdeck] - untested
*Green RPi [https://datasheets.raspberrypi.com/cm4io/CM4IO-KiCAD.zip Compute Module 4] [https://datasheets.raspberrypi.com/cm4io/cm4io-datasheet.pdf IO board] V1.4 [https://datasheets.raspberrypi.com/cm4io/CM4IOUSB3-KiCAD.zip USB3] [https://datasheets.raspberrypi.com/cm4io/cm4iousb3-appnote.pdf CM4ISO] [https://datasheets.raspberrypi.com/cm4/cm4-datasheet.pdf Dual100pin] (2020) aka Development Platform Board - untested
*Purple Pi Hut Cytron CM4 Maker Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*[ KubeSail PiBox mini 2]
*Home Assistant Yellow with Raspberry Pi Compute Module 4 - untested
*[ Turing Pi V2] - untested CM4 with 260-pin SO-DIMM socket adapters and/or nvidia jetson nanos - untested
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-C Waveshare CM4-IO-BASE-C] - untested but binary blobs Rev01 Rev02
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-B Waveshare CM4-IO-BASE-B] - untested but binary blobs
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-A Waveshare CM4-IO-BASE-A] - untested but binary blobs
*Blue [https://www.waveshare.com/wiki/CM4-NANO-B Waveshare CM4-NANO] - untested but usb and audio turned off or rerouted
*Black [ Seeed Studio with BigTreeTech BTT pad 7] - bin blobs?
CM3 has a 200 pin sodimm ddr2 connector form factor but not electrically SC0028, SC0029
*Blue [https://wiki.geekworm.com/CM_IO_Board Geekworm RPi Compute Module IO Board] [https://github.com/geekworm-com/cm-io-board CSI DSI] with CM3 in ddr2 slot underside - '''works''' if SW1 on but CM3+ '''does not'''
*Green [https://cdn-shop.adafruit.com/product-files/3442/CMIO_schematic.pdf RPi V3 IO board CM3IO] and CM3 Lite - untested
*Green [https://turingpi.com/ turingpi v1 cluster] - untested up to 7 cm3 7xlan9514 12V discontinued, 3 x Pi4 homelab maybe better
*Blue [https://www.waveshare.com/wiki/Compute_Module_PoE_Board Waveshare Compute Module PoE Board] and CM3 lite (if not lite, write files to internal eMMC fat32) '''AVOID''' bin blobs
*Blue [https://www.waveshare.com/compute-module-io-board-plus.htm Waveshare Compute Module IO Board Plus] [https://www.waveshare.com/wiki/Compute_Module_IO_Board_Plus wiki] [https://forums.raspberrypi.com/viewtopic.php?t=235695 pin settings] with CM3+ Lite - '''AVOID''' binary blob
*[ Pi02w on Geekworm SupTronics X305 Raspberry Pi Zero IO Baseboard] - untested
*[ Spotpear Pi Zero 2w to Pi3b format-ish] - untested
*[ pi-top v4] box has 128x64 oled display, micro hdmi, 19Whr battery with pi4 and 15V PD 36W min needed
*[ pi-top v3] three green pieces, heatsink covers most of the base tray, pi-top hub mk1 lhs and Pi1B Pi2b Pi3b rhs secured from below, black rounded strip with pi-top above keyboard, 13.3" HD 1366 x 768 display, small touchpad,
*[ pi-top Model 2.0] pi-top on bottom bezel of 14-inch green laptop, large trackpad, keyboard slide down to reveal main system hub on slide rails moved to the right, Raspberry Pi3b screws down, hub slides in, 18V 2.5A 45W charger brick, battery 11.1V 3500mAh 38.85Wh and storage PiTopOS
*[ Pi-Top CEED Raspberry Pi Modular Educational Desktop with RPI3] monitor
*[https://www.indiegogo.com/en/projects/jesselozano/pi-top-a-raspberry-pi-laptop-you-build-yourself Pi-Top v1] wedge laptop with RPi2
<pre>
2008 Trustees collected for Foundation
2009 Pi Foundation charity status gained
2010
2011 First Raspberry prototypes
2012 First boards go on sale at CPC and RS. The Model A and B 700 MHz Arm11 - February 29th BCM 2835
2012 First million sold - more than the 10,000 original planned and anticipated
2013 First Alpha Experimental builds of AROS Native for the 32bit Pi
2013 Pi Trading launched making grants available, providing in house educational resources and Pi Academy for teacher training
2013 Over two million sold
2014 Over three million sold
2014 Pi 1 Model B+ introduced that moved composite video to audio jack and same half gig of memory
2014 Pi Model A+ v1.1 no ethernet and 1 usb - a little smaller -
2015 Over four million first gen pis sold
2015 Pi Zero 1.2 BCM2835 first production revision released with no camera port
2016 Pi0 1.3 released with camera csi connector
2017 Pi Zero W v1.1 1GHz Pi0W, single-core 32bit CPU BCM2835 released with Cypress CYW43438 wireless
2020 Raspberry Pi Pico SC0919 with RP2040 32-bit 2Core ARM Cortex-M0+ up to 133 MHz - 264KB of SRAM and 2MB of on-board QSPI Flash -
2024 Raspberry Pi Pico 2 with RP2350 2Core 32bit Arm Cortex-M33 and 2core open-hardware [https://github.com/wren6991/hazard3 Hazard3 RISC-V]
2015 Pi 2 Model B v1.1 BCM2836 900/600 MHz ARM Cortex-A7 Armv7 quad 32bit, 32bit VideoCore IV GPU - 1Gb RAM - 5V 2A micro usb - SMSC LAN9514 chip -
2015 Over a million pi2s sold
2015 Raspberry Pi 2 Model B version 1.2 Pi2bv1.2, aka Pi2B2 has armv8 BCM2837 underclocked to 900Mhz without wifi/bluetooth module
2016 Pi 3 Model B - Broadcom BCM2837 SOC four 64bit ARMv8 Cortex-A53 1.2GHz 32bit 1080p VideoCore IV GPU - 1Gb DDR2 - bluetooth 4.1, Cypress CYW43438 wireless 802.11n - 4 x USB2.0 ports - 5.1V 2.5A - SMSC LAN9514 chip
2016 PIs total over 10 million worldwide
2017 Compute Module 3 CM3 with BCM2837B0 armv8 Quad 64-bit - small 67.6mm x 31mm board which fits DDR2 SODIMM connector but not electrically compatible which plugs into needed IO board - beware of the I2C protocol issue
1Gb LPDDR2 RAM - Lite or 4Gb Emmc storage
2017 12 million pis sold in total
2018 Pi 3 Model B+ - 4c A53 BCM2837B0 1.4Ghz - 1Gb, wireless 802.11ac, gigabit ethernet (300Mbit/s) and bluetooth 4.2 - power over ethernet - 4 x USB2.0 ports - Microchip LAN7515 chip
2019 Over 15 million sold
2019 Pi 3 Model A+ with BCM2837b0 Cortex-A53 64-bit SoC @ 1.4 GHz with 512Mb LPDDR2, 1 usb2, 1 hdmi, 1 micro usb 5V 2A - no ethernet -
2019 Raspberry Pi Compute Module 3+ CM3+ - Broadcom BCM2837B0 1.2Ghz, Cortex-A53 (ARMv8) 64-bit SoC on DDR2 SODIMM mechanically compatible only factor - IO board required
1Gb DDR2 and 8GB, 16GB, 32GB or a Lite variant without eMMC
2021 Pi zero 2 (w or no W) RP3A0 quad 1GHz Cortex-A53 64bit BCM2710A1 512mB SDRam
2025 edaTEC CM0 ED-CM0NANA with additional dev board with quad 1Ghz A53 with 512Mb Raysan RAM, 2 USB2 and 10/100 ethernet - pico castellated edge
2019 Pi 4 Model B v1.1 RPI4B - BCM2711B0T quad 64bit A72 1.5GHz, 4K VideoCore VI, AC wifi, Bluetooth 5.0, GbE Broadcom BCM54213PE (PHY ID 0x600d84a2), 2 micro hdmi decode up to 4K, USB-C 5.1V 3A power, 2xVLI VL805 USB 3, 2xUSB 2.0, 2GB 9LDWW D9WHZ or 4GB 9FDWW D9WHV, 8GB 0AA47 D9ZCL ddr4 ram
2020 Silent Pi 4 v1.2 upgrade with more USB-c psu support
2020 PI400 BCM2711C0T 1.8GHz 4Gb DDR4 inside keyboard, 5.1V 5A 27W usb-c psu, 2 micro hdmi, external ide style 40pin gpio, no audio port -
2020 Raspberry Pi Compute Module 4 BCM2711B0T on new 55mm x 40mm 2x100 pin form factor with extra breakout IO board
CM4101000 1Gb RAM Lite SOM
CM4102000 2GB RAM Lite
CM4104000 4GB RAM Lite
CM4004008-4GB-RAM 8GB-EMMC SOM System on Modules
CM4104032 4GB RAM 32GB emmc
CM4108000 8GB RAM Lite
CM4008016 8GB RAM 16Gb eMMc
2021 Raspberry Pi SC0763 Compute Module 4S CM4S with ddr2 sodimm pinouts but not electrically the same with suitable IO board extra cost -
CM4S01000 1GB RAM Lite
CM4S01008 1GB RAM 8GB eMMC Flash
CM4S02000 2GB RAM Lite
CM4S04000 4GB RAM Lite
CM4S04016 4GB RAM 16Gb KLMAG1JETD-B041
CM4S08000 8GB RAM Lite
2021 Pi 4 v1.4 BCM2711B1 upgraded power regulator, to deal with 8gig of ram being more power hungry
2021-48 Raspberry Pi 4 model B v1.5 2GB
2023 Pi 5 v1.0 BCM2712 Quad A76 @2.4Ghz - VideoCore VII - no audio socket - dual 4k from mini hdmi - fan connector - 5.1V 5A psu
2024 Pi 5 2GB DDR4 version uses BCM2712D0
2024 Pi-500 with 8Gb LPDDR5 and membrane keyboard
2024 Pi 5 v1.1
2024 Raspberry Pi Compute Module 5 CM5 BCM2712 55mm x 40mm form factor with additional IO board
CM5004000 04GB RAM 0GB eMMC Lite
CM5008000 08GB RAM 0GB eMMC Lite
CM5016000 16GB RAM 0GB eMMC Lite
2025 Pi-500+ with 256GB NVMe storage, 16GB LPDDR4 RAM, and Gateron KS-33 Low Profile Blue mechanical keyboard switches
2025 Pi5 1GB DDR4 announced
2022 PiOS linux goes 64bit
2024 Pi Trading IPO stockmarket stock exchange listing
2026 April and May Aros 64bit fixed, added AHI audio, VC4 gfx started, usb functions added to rom
2026 June and July Aros 64bit usb2otg started, dma.resource, sdio.resource, bwfm.device wifi added
2026 Late July daily 64bit Pi3 LE little endian builds start
2026 August Pi 4, 400, 5 and 500 DTBs added, expanding existing support and wifi for Pi4 and Pi5
2026 August Pi5 HAT+ nvme and HDMI, AHI RPiI2S added, Pi4 HVS5 video scaler started,
2026
2027
2028 Pi 6
</pre>
The vcgencmd can be used to inspect and dump the current system configuration.
vcgencmd runs on top of VCHIQ as an RPC. The mailbox interface is an alternate but much simpler RPC.
VCHIQ is a bridge (queue) between the CPU and the GPU so they can communicate with the firmware.
Loads of [https://github.com/6by9/rpi3-gpiovirtbuf/blob/master/rpi3-gpiovirtbuf.c mailbox] which uses the GPIO control calls. [https://github.com/raspberrypi/firmware/wiki/Mailboxes may also be of interest]
A fair number of vcgencmd examples (search for vc_vchi_gencmd_init). [https://www.raspberrypi.org/forums/viewtopic.php?t=229203#p1406112 sends the relevant vcgencmd commands] to update the scaling kernel, but the [https://github.com/raspberrypi/userland/blob/master/host_applications/linux/apps/gencmd/gencmd.c command] is just a text string. Parsing and execution of the instructions is performed by the VideoCore firmware.
The Raspberry Pi runs two separate operating systems: Linux/Aros on the ARM, and a threedx RTOS called vcos running on the Videocore 4 VPU: vcos is commonly called "the firmware". Vcos is tasked with performing certain system services, for example running the display and audio outputs. The VCHI driver provides an interface to allow drivers to talk to vcos.
Doubtful, on any [https://www.web3d.org/ Web3d] [https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API WebGL] or [https://github.com/immersive-web/webxr WebXR] [https://developer.mozilla.org/en-US/docs/Web/API/WebXR_Device_API Device API] [https://developer.mozilla.org/en-US/docs/Web/API/XRInputSource XRInputSource] support. Hopefully, never/limited support features like location, peer-to-peer, invasive web apps, unwarranted storage, payments, proprietary video streaming etc
*spreadsheet [https://git.sheetjs.com/sheetjs/sheetjs sheetjs] [https://github.com/mleibman/SlickGrid SlickGrid javascript] [https://github.com/6pac/SlickGrid SlickGrid typescript] [https://github.com/jspreadsheet/ce jspreadsheet ce] probably without xlsx support
*presentations [https://github.com/impress/impress.js/ impress.js simplified] [https://github.com/bwlewis/slides slides] [https://zenomt.github.io/mdslides/ github markdown slides] [https://github.com/Patternslib/slides Patternslib slides markdown] probably without pptx support
*ai office [https://github.com/dream-num/univer/ univer], [https://github.com/dream-num/Luckysheet Luckysheet] [https://github.com/ruilisi/fortune-sheet fortune-sheet]
*weather [https://github.com/Himanshu3412/Weather-Forecast Weather Forecast], [https://github.com/kaushalsahu07/weather weather needs API key],
==Future==
[https://github.com/ARMSX2/ARMSX2 Arm pi of pcsx2]
[https://tube.cadence.moe/ Cloudtube], [https://github.com/TeamPiped/documentation/blob/main/content/docs/public-instances/index.md TeamPiped], [], [], [],
[https://hyperpipe.codeberg.page/ hyperpipe], [https://ytify.pp.ua/ ytify], [], [],
[ ytdl], [https://github.com/golddominik893/liberatube liberatube]
[https://git.lolcat.ca/lolcat/4get 4get], [https://github.com/hnhx/librex librex], [], [],
{{BookCat}}
1kon26txpe12gejpr7c8b564049wmlh
4676729
4676557
2026-10-18T10:38:49Z
Jeff1138
301139
4676729
wikitext
text/x-wiki
{{ArosNav}}
[[#Native]]
[[#Hosted]]
[[#Build]]
[[#Hardware]]
[[#References]]
[[#Future]]
==Introduction==
[[File:Scalos00.png|thumb|Scalos on Aros Pi3b]]
Aros aims to cover Pi 3 to 5 512Mb+ RAM
Options to boot from using a good power source to prevent the yellow lightning symbol.
*With Pi3b+ the max you can get is 5.1V 2.5A with micro usb.
*With Pi4 5.1V 3A with usb-c
*With Pi5 5.1V 5A, the amps went ever upwards, even to 5.1V 9A with usb-c
* Pi500+ keyboard wedge - working but not much tested esp [https://github.com/aros-development-team/AROS/commit/48e9c8edcca4b5c1e1fe0b1123f2129f624af67b power button]
* Pi500 wedge with up to date bootloader via PiOS - working but not much testing esp [https://github.com/aros-development-team/AROS/commit/48e9c8edcca4b5c1e1fe0b1123f2129f624af67b power button]
* Pi 5 - Quad A76 64bit ARMv8 and RP1 "southbridge" with VideoCore 7 D0 (rev1.1) - untested
* Pi 5 - Quad A76 64bit ARMv8 and RP1 "southbridge" with VideoCore 7 Pre-D0 C1 (Rev1.0) - untested
* Pi400 RPI-400 keyboard wedge - resolution changing and audio from micro hdmi0 (near 40pin) and micro hdmi1 (near usb-c psu) - Fn F10 0x5e power on and off works or held down for over 7 seconds auto shutdown - keyboard ok - wifi and lan ethernet testing -
* Pi 4 - Quad A72 64bit ARMv8 with VideoCore 6
* Pi 3 - Quad A53 [https://www.raspberrypi.com/documentation/computers/processors.html 64 bit] ARMv8 with VideoCore 4 with '''fan''' to prevent overheating cpu 82C+ throttling
* Pi02W - Quad A53 64bit - boots but [https://forums.raspberrypi.com/viewtopic.php?p=2387984#p2387984 usb not working but did in the past],
* Pi 2 - Quad 32bit ARMv6 with VideoCore 4 - mostly not 64bit compatible
* Pi Model B+ 32bit ARMv6 with VideoCore 4 - not 64bit compatible
* Pi Model A and B 32bit ARMv6 with VideoCore 4 - not 64bit compatible
===Native===
* 2013-03 Kalamatee starts work
* 2015-04 Work continues with mschulz on the kernel and Kalamatee (NicJA) on gpio and usb
* 2018 [https://www.patreon.com/posts/i-owe-you-some-20956961 mschulz resume adding BE big endian support], [https://www.patreon.com/michal_schulz/posts Big endian on Pi]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bsek latest commits for pi 3b, 4 and 5 64bit]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=metaneutrons latest commits for Pi5]
* 2026 [https://github.com/aros-development-team/AROS/commits?author=bitplane latest commits for ARM]
====64bit====
'''Download''' A [https://archive.org/details/piAROS Pi Distribution (Distro) has started] and the contents copied to fat32 8GB+ microSD card (there will be drawers/folders - boot c Classes Demos Developer Devs Extras etc only showing). The SD can be plugged in to the Pi. And power on. [https://pi.amiga.icu/ Repository]
'''Not recommended''' but [https://aros.sourceforge.io/nightly1.html RaspberryPi 3, 3+, 4 and 5 64bit ArmV8 nightly builds] [https://sourceforge.net/projects/aros/files/ and alternative site and nightly2] which is a test version of '''very few''' apps with both raspi-aarch64-system and raspi-aarch64-contrib can be unbz2'd to a SD or SSD as appropriate.
64bit build works well on a single core LE little endian. Multicore [https://github.com/aros-development-team/AROS/commit/1df0747c2bda3523a43029725a709b1f377d84ec may follow]. Any issues booting could be down to the SD card so please use another SD to see if it is resolved. Remember Aros Arm uses FAT32 and Aros can detect issues with this format very acutely (once fault found, FAT 0x0FFFFFF7 bad cluster so no files written after that, no repair). Please report your experiences in the [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2138&pid=15057#post_15057 Aros forum thread], [https://forums.raspberrypi.com/viewforum.php?f=179 Raspberry Pi Aros Dev and User forums], [https://forums.raspberrypi.com/viewtopic.php?p=2387984#p2387984 previous Raspberry Pi forum thread]. Any bugs or issues can be [https://github.com/aros-development-team/AROS/issues described here to fix]
*Pi500+ untested usb3 booting or nvme ssd
*Pi500 untested usb3 booting
*Pi5 untested usb3 booting
*Pi400 boots with '''USB3''' port based sata3 ssd
*Pi4 untested (may need eeprom update from PiOS or Pi SD Imager)
*Pi 3 B+ is pre-configured for USB sata3 boot - untested
*Pi 3 B may need [https://www.youtube.com/watch?v=ubnwvxF3Klc PiOS to set OTP to boot from usb - do so at your own risk] - if OTP set to usb, boot works but slower than SD card
Speed write wise (top faster)
<pre>
*NVME Pi5 untested >1000MB/sec or faster if matched correctly
*Sata3 ssd 500MB/sec
*SD V90 90MB/sec 4K maybe 8K
*SD V60 60MB/sec 1080p
*SD U3 V30 30MB/sec 720p
*SD C10 U1 V10 A1 A2 10MB/sec minimum should be used now
*SD C06 6MB/sec
*SD C04 4MB/sec
</pre>
As a homage to the past, Aros shows a reduced number of icons but this can be changed by left mouse click in the window and then right click down to Window -> View -> All files
Windows can be manipulated by the top (moving) and the bottom right corner (resizing) only.
Zune like MUI gui interface, has a unique quirk in that after changing a setting in a text box, you may sometimes need to press Enter/Return before clicking OK, Save, etc
Double left mouse click on most picture (Developer/Debug/Tests/Datatypes), audio and video files are supported, via datatypes, by the multiview application.
Esc escape key usually closes open windows even the desktop
In Prefs/Appearance some decorative theming elements need work. There is a few Mason icons in /Prefs/Presets/Icons/Mason/ and the ever present default Gorilla - Icon exchange in works
For more intensive graphics applications, you may need to edit config.txt in the root folder and change 128M to 256M to adjust more memory to graphics usage
If your cursor should '''appear''' to vanish, fear not it is still there. Please head to the top of the screen i.e. the title bar, hold down the left click mouse and drag the screen down a little and the cursor will appear again. Then you can drag the screen up again.
Like most amiga like OSs the audio and networking need to be setup manually
Audio AHI prefs - Mode settings tab - needs both Music unit and Unit 0 set to RPiHDMI:16 bit stereo++ or RPiPWM:16 bit stereo++ at 44100Hz. Press '''Save or Use''' button after each choice
For wireless, please use the Wifi prefs and already selected device bwfm.device. Press Scan and double right click on the router and enter password. You may need to setup after every power off
*if asking for password again - press cancel and go to Network Prefs, Wireless Networks tab and highlight the router line and hit the remove button and press the cancel button. Retry with Wifi prefs again
*...waiting for an address - Disconnect and try Connect
Until, Connected to <router> - 192.168.x.x
For lan ethernet port, please use Network prefs and the following hardware is
*lan9514 Pi3b Pi2 not supported at the moment
*lan7515 Pi3b+ type into Device usblan78xx.device as net0: remove other device(s)
*bcmgenet Pi4 Pi400 choose for Device bcmgenet.device
*cdnsgem Pi5 Pi500 Pi500+ RP1 i/o for cadencegem
(network prefs may forget random information when rebooted)
Summary
<pre>
*3b ethernet not supported, usb ethernet not working but wifi prefs setup works
*3b+ wifi working and ethernet works
*4 untested
*400 wifi and ethernet untested
*5 wifi and ethernet untested
*500 wifi and ethernet untested
*500+ wifi works
</pre>
Type in 'aarch64' in the [https://archives.arosworld.org/index.php?function=search&tool=simple search box] and you will see available software packages / apps. apkg can be used to inspect and install applications.
[http://archives.arosworld.org/index.php?function=browse&cat=network/browser amelinium web browser (JS 1.6 ES9 ECMASCript 2018)] is available with an [https://eab.abime.net/showthread.php?t=122494&page=80 eab thread] reminiscent of [https://github.com/zapek/Voyager Voyager] and to a lesser extent [https://github.com/amigazen/aweb3/ Aweb JavaScript 1.5 (ECMAScript 3)] as css and javascript websites can be slow to load or resolve (no JIT) and nothing from facebook, reddit etc.
Press Cancel at screenmode selector or -wb argument to get windowed version. You could use the Shift + Del shortcut or mouse wheel should work to delete all text at once. Html5test gives 189 (1.29), 300 (1.31), 301 (1.39) out of 555, some bigger Amiga like browsers are around 370+ but it does less better.
You may have to delete the cache (Menu -> Page -> Delete cache) to fully retest big Amelinium updates or free up space.
Be aware [https://pianetaamiga.it/en/reportage-pianeta-amiga-2026/ some site pages] can use up hundreds of MBs of cache very quickly
DNS lookup failed... close browser and reboot and setup wifi again - repeat until it works again
youtube video and audio - js button for javascript must be on/shaded - Settings -> Soundoutput - AHI
Any restriction to lower resolutions is due to [https://docs.invidious.io/faq/#q-where-are-the-360p480p1080p-quality-options bandwidth]. Either CPU/GPU, internet speed and/or video quality. Pi3 can expect up to 480p (wifi) and up to 720p (ethernet). Pi4 expect (wifi) (ethernet).
Telegram https://t.me/s/channel_name for public messages from vamped_amiga chatamigagames demoscenecracktros
*art local js apps like dpaint.js
There is normally no Bluetooth support for most amiga like OSs but Aros has one [https://github.com/aros-development-team/AROS/commit/6942cbfbf66426d21963a7fcd8aba6aff611a9e0 work in progress] [https://github.com/RPi-Distro/bluez-firmware/tree/pios/trixie/debian/firmware/broadcom firmware]
*Bluetooth 4.1 BCM43430A1.hcd Pi3B, Pi3A, Zero 2W
*Bluetooth 4.2 BCM4345C0.hcd Pi3B+, Pi4
*Bluetooth 5.0 BCM4345C5.hcd Pi4B rev, CM4 and maybe Pi5 and CM5
<pre>
*bthid keyboard mouse support
*btserial serial
*btpan short range wireless connecting devices
</pre>
Only the Pi5 has a RTC real time clock, the other Pis will need to use ntp services [https://github.com/aros-development-team/AROS/commit/29cd4116330dc7f692d90757eacc59fb3f31ae70 sntp] with time.cloudflare.com pool.ntp.org or Cloudflare 162.159.200.1, 162.159.200.123, 2606:4700:f1::1, 2606:4700:f1::123 or [https://github.com/bohunamiga/PiNTP PiNTP -s goodtime.ijs.si or ntp1.ptb.de] to get the date and time from the internet. Can use date in a shell e.g. date 24-Dec-2026 23:59:59 but this will need to be done again after every reset/power off. Maybe [https://github.com/aros-development-team/AROS/commit/28674a157bc56175aa668e7b62dca6fa740578dc ds3231 rtc with dtoverlay=i2c-rtc,ds3231 in config.txt]
It helps to have all usb devices already plugged in before power on to detect at the moment. Even then some usb devices will freeze the mouse cursor and the only resolution is to remove the offending usb device and reinsert. Sometimes, the reinsert leads to the mouse cursor vanishing, it is still there and responds to left mouse clicks, top of the screen and pull down the screen.
USB classes support from Prefs/Trident is still work in process
*usbaudio working on usb3 port (blue) on pi4, 400 but not working (no rt isochronous) on usb2otg (white or black) for pi3b, zero 2w
*[https://aminet.net/package/mus/midi/camd camdusbmidi] detects midi devices without a preferences file (Prefs/Env-Archive/sys/midi.prefs) as [https://www.youtube.com/watch?v=RBxHkwy4Nrw auto setup now] possibly with [https://github.com/metaneutrons/mt32-pi metaneutrons mt32-pi] [https://github.com/rtzor/mt32-pi mt32-pi fork] [https://github.com/ahmadexp/mt32-pi fork] [https://github.com/gmcn42/mt32-pi-control control of] [https://github.com/dwhinham/mt32-pi mt32-pi pi3+]. Alternative of [https://homspace.nl/samplerbox/ SamplerBox].
Will need developer clang gcc tools to look at 64bit ports of [https://archives.arosworld.org/?function=showfile&file=driver/audio/usbmidi.i386-aros.lha usbmidi], [https://aminet.net/package/mus/midi/CAMD_Toolkit CAMD_Toolkit], [https://aminet.net/package/mus/midi/camdtools camdtools], [https://github.com/cnvogelg/amiditools amiditools], [https://github.com/timoinutilis/midi-sequencer-amigaos horny src], [https://aminet.net/package/mus/midi/horny-base horny-base], [http://bnp.hansfaust.de/index.html BnP], [https://arosarchives.os4depot.net/?function=showfile&file=audio/misc/timidity.lha timidity],
Regarding 680x0 emulation, there are several options (not implemented yet) that could be considered
*[https://github.com/aros-development-team/AROS/blob/6722a0ae9e03fe5d26e32703360bd2059e0864cc/rom/m68kemu/README.md?plain=1#L424 m68kemu.library] for some Amiga productivity where the cpu is emulated and the system calls are redirected to Aros ones
*[https://github.com/BlitterStudio/amiberry amiberry] (winuae) for everything else like games
*[https://github.com/jonx/AROS/tree/aarch64-darwin-graft/arch/all-darwin/libs/emu68k emu68k]
*[https://scriptedamigaemulator.net/ Scripted Amiga] with [https://github.com/naTmeg/ScriptedAmigaEmulator ScriptedAmigaEmulator] or older [https://github.com/gbraad-amiga/ScriptedAmigaEmulator2 ScriptedAmigaEmulator2]
Hopefully getting Pi3 up to 25Mhz 68040 (non JIT) and 50Mhz 68040 (JIT)
Pi4 maybe getting up to 50Mhz 68040 (no JIT) and 100Mhz 68040 (JIT)
[https://pinout.xyz/ GPIO 40 pins] [https://learn.sparkfun.com/tutorials/raspberry-gpio/gpio-pinout pinout]
Some exceptions:
*Physical pins 27, 28 (GPIO0, 1) are an internal I2C bus and should not be used
*The other I2C on pins 3, 5 (GPIO 2, 3) can be used generally, but be aware they have permanent pull-up resistors to 3.3V
*For MIDI use USB but there are dedicated UART pins 8, 10 (GPIO 14, 15).
With a HAT it's more awkward -- you need to know which pins are used by the HAT and avoid them. Hopefully this will be documented.
Remember all GPIOs are 3.3V (not 5V tolerant), floating/noisy inputs can cause odd behavior, and that shorting the power supplies can cause instant death of the Pi.
In the shell (Cntrl + C to end)
GPIO PIN/A/N,SET/N,GET/S,MODE/K,PULL/K
Controls and queries hardware GPIO pins via gpio.resource which is stored in the rom or Devs/ '''please test'''
*PIN -- (Required) Target GPIO pin number (e.g. 12).
*SET -- Set pin output value to 0 (LOW) or 1 (HIGH).
*GET -- Read and print current digital input level (0 or 1).
*MODE -- Configure pin mode: IN (Input), OUT (Output), ALT (Alternate).
*PULL -- Configure pull resistor: NONE, UP, DOWN.
EXAMPLES
<pre>
GPIO 12 MODE OUT
GPIO 12 SET 1
GPIO 12 GET
GPIO 13 PULL UP
</pre>
[https://gpiozero.readthedocs.io/en/stable/installing.html Current] [https://gpiozero.readthedocs.io/en/v1.2.0/api_boards.html old support for gpiozero is unknown at present] [https://energenie4u.co.uk/res/pdfs/ENER314%20UM.pdf and associated 433MHz equipment] [ USA X10 security and lights via USB] [ OpenHab with Shelly Smart Plug connected over Wi-Fi, controlled by MQTT or HTTP]
Printing only with Postscript but [https://github.com/bohunamiga/MintPRINT one] of [https://github.com/boingball/MintPRINT two] [https://github.com/Andiweli/AmiAirPrint/tree/main AirPrint] IPP has been attempted with [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2061&pid=13954#post_13954 discussion]
Youtube
[], [], [https://www.youtube.com/watch?v=X4fmWAIv7FE Aros native on Pi3b],
[], [], [https://www.youtube.com/watch?v=TSxlYb1eQWU Installed on Pi3b+],
[], [], [https://www.youtube.com/watch?v=NFF1H3jCoz8 testing Aros native on Pi400],
[], [], [https://www.youtube.com/watch?v=nIVx7mh1E1Q&pp=ygUHYXJvcyBwadIHCQkTDAGHKiGM7w%3D%3D Aros on Thumb 2 based 32bit-ish ARM STM32H743 board],
[https://www.youtube.com/watch?v=zQM4CD64xDE&t=612s&pp=ugUEEgJlbg%3D%3D Performance under Linux] but on Aros...
{| class="wikitable sortable" width="90%"
! width="10%" |Pi
! width="10%" |Single Core 2D
! width="10%" |Single Core 3D
! width="10%" |Single Core 3D
! width="10%" |SMP 2D
! width="10%" |SMP 3D
! width="10%" |SMP 3D
! width="35%" |Comments
|-
| <!--Pi-->Pi3
| <!--Single Core 2D-->
| <!--Single Core 3D-->
| <!--Single Core 3D-->
| <!--SMP 2D-->
| <!--SMP 3D-->
| <!--SMP 3D-->
| <!--Comments-->
|-
|}
==== 32bit ====
For the Pi1 Pi2 Pi2B the status of AROS native ARMv6 for 32bit RasPi was OK. System booting, USB working (although with some issues but plans to fix them). 32bit native [http://www.aros.org/nightly1.html ARMv6 32bit nightlys] raspi-armhf-system raspi-armhf-contrib unbz2'd to fat32 microSD
===Hosted===
AArch64 CPU backend for AROS, a Cocoa/Metal display, clipboard / host-volume / CoreAudio / BSD-sockets bridges, GPU 2D via gpufx.library, a 68k→AArch64 JIT (run68k), and a full Rust std port. On [https://www.jkn.me/blog/macaros-aros-on-apple-silicon/ latest Apple Silicon] [https://github.com/jonx/Macaros early buggy alpha version of hosted Aros .dmg on MacOS12+]. Please use [https://github.com/jonx/Macaros/issues MACAros github] for issues, features etc and possibly [https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2030&pid=13910#post_13910 here]
[http://www.aros.org/snapshots1.html old linux and android hosted 32bit]
==== Hosted ====
=====64bit=====
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80&pid=13667#post_13667 Ubuntu Linux PC hosted Pi compiler build]
[https://github.com/BlitterStudio/aros-compiler-docker Docker based cross compiler for various Aros systems],
[https://www.arosworld.org/infusions/forum/viewthread.php?thread_id=2019&rowstart=80 From the Aros Raspberry pi 3 64bit thread]
Instructions on building 64-bit Raspberry Pi AROS and cross-compiler from sources.
You will need:
- Ubuntu 24.04 or 26.04
- qemu-system-aarch64 installed
- Internet connection
- rpi-scripts.tar.gz downloaded (https://axrt.org/download/aros/rpi/rpi-scripts.tar.gz)
1) Install prerequisites:
sudo apt install git gcc g++ make gawk bison flex bzip2 netpbm autoconf automake libc6-dev liblzo2-dev libpng-dev gcc-multilib byacc python3-mako cmake yasm curl nasm
2) Clone sources
cd <project-directory>
git clone https://github.com/aros-development-team/AROS.git --recurse-submodules
3) Extract rpi-scripts.tar.gz. Copy all files into your project directory so that you have:
AROS (the directory with cloned sources)
fix-dotdot.py
rebuild.sh
recreate-sdcard.sh
run-qemu.sh
update-sdcard.sh
4) Run ./rebuild.sh. Select option 1) toolchain-core-aarch64
This will execute process of building a cross-compiler. During this process packages will be downloaded from Internet. This process can take up to 2 hours. If there are some missing dependencies, install them with 'sudo apt install' and restart this step.
5) Run ./rebuild.sh again. Select option 2) core-raspi-aarch64
This will build system files for 64-bit Raspberry Pi AROS. This process can take around an hour.
6) Run ./recreate-sdcard.sh
This will create an sdcard.img file with contents of previous step.
7) Run ./run-qemu.sh
This will start QEMU with SD card image and ROM images. It will boot into AROS.
=====32bit=====
Ubuntu VM approach to compiling [http://lallafa.de/blog/2013/06/building-aros-hosted-for-raspbian/ Linux hosted AROS June 04, 2013]
../AROS/configure --target=linux-armhf --enable-includes=/usr/arm-linux-gnueabihf/include --x-includes=/usr/arm-linux-gnueabihf/include --x-libraries=/usr/arm-linux-gnueabihf/lib
arm-elf- is symbol-linked to arm-linux-gnueabi- (arm-linux-gnueabi- is more correct in this case, because it's going to be compiling the ARM AROSBootstrap for ARM Linux)
*armel - many of the "android" machines require since the entire OS is made for soft float VFP.
*armfp - Efika MX target, Raspberry PI, EfikaMX, Pandora and virtually everything (VFP)
Keep in mind it's possible to start hardfp AROS hosted on softfp system, though, as long as no calls between AROS and host require floating point parameters. NOTE: hardfloat objects *cannot* be linked with softfloat objects - they have a different ABI.
Just keep in mind the arm nightly build machine is quite complex beast. It needs the x86_64 host compiler to compile AROS tools. The arm version is built every night using gcc-4.6.2 crosscompiler (built together with AROS) and successfully builds armel and armhf linux hosted targets.
*needs an AROS code compiler for ARM target
*as well as unix compiler for ARM linux host (would be best to have both softfp and armhf, we have softfp only now) with full set of libraries and includes.
with—disable-crosstools $AROS_CC is always a wrapper around $KERNEL_CC ? If so, this is wrong for some ports. This can break Darwin, Windows and Android port.
Yes, Android port will build. And even work. But it's not good because the port will not be ABI-compatible with other ARM ports. Android's ABI is different from GNUEABI. For example:
<pre>
enum test {foo, bar};
enum test testvar;
</pre>
sizeof(testvar) will be equal to sizeof(int) in GNUEABI (Linux and AROS) and sizeof(short) on Android. This affects linking objects from static linklibs, for example.
Previously everything worked because $AROS_CC was a wrapper on top of $HOST_CC. And a real crosscompiler was used on non-ELF hosts.
Android is the same. $KERNEL_CC is incompatible with AROS.
compiler=kernel is appropriate _ONLY FOR CODE WHICH RUNS ON HOST OS_ (or barebone hardware, if we talk about native). This includes bootstraps, their linklibs, and host-side dynamic libraries (Windows makes extensive use of them because of architectural considerations.
No single AROS object should be compiled with this setting. $KERNEL_CC is really compatible with AROS *ONLY IN LINUX-HOSTED* and no more. On other systems (Darwin, Windows, Android) this is not true any more, and compiler=kernel is never going to work.
If you want to compile your AROS module against host OS includes, append the following to USER_INCLUDES (or USER_CFLAGS, this is effectively the same):
-isystem $(GENINCDIR) $(KERNEL_INCLUDES)
$(KERNEL_INCLUDES) expands to:
-isystem <your_os_includes> -isystem <host_OS_gcc_private_includes>
-nostdinc
This makes AROS compiler adhering to host OS APIs.
If you want some preprocessor symbols based on what your host OS actually is, add something like -DHOST_OS_$(AROS_HOST_ARCH).
Why is there $(GENINCDIR) at all? Because host OS has its own libc includes, which would conflict with AROS ones. And the host OS libc is not binary-compatible with AROS one.
Why doesn't Windows-hosted port use $(KERNEL_INCLUDES) ? Because WinAPI includes conflict with AROS ones in fundamental typedefs, like WORD, BYTE and BOOL. It's almost impossible to deal with this in any other way than rewriting WinAPI definitions using AROS types.
Building under centos 6.3 (i386) currently, and AROS creates the toolchain itself. haven't yet committed the necessary changes but "./configure --target=raspi-armhf" is enough to start, then "make arosboot-raspi" will generate arosraspi.img (containing the bootstrap, kernel.resource, and exec.library) as well as arosraspi.rom (containing all the other essentials components such as dos, graphics etc). It will also copy over a config.txt file to make the raspi bootstrap code load the correct kernel, and a cmdline.txt that enables exec debug output.
*armel = typically Debian 6, Ubuntu Maverick, Android,
*armhf = typically Debian 7, Debian 8, Ubuntu Precise,
Cross-compiling Ubuntu ARM softfp
<pre>
sudo sh
echo 'foreign-architecture armel' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armel] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armel.list
apt-get update
apt-get install gcc-arm-linux-gnueabi libx11-dev:armel libsdl-dev:armel
</pre>
<pre>
./configure --target=linux-arm --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabi/include
</pre>
Cross-compiling Ubuntu ARM hard-float
<pre>
sudo sh
echo 'foreign-architecture armhf' >>/etc/dpkg/dpkg.cfg.d/multiarch
echo 'deb [arch=armhf] http://ports.ubuntu.com/ precise main universe' >/etc/apt/sources.list.d/armhf.list
apt-get update
apt-get install gcc-arm-linux-gnueabihf libx11-dev:armhf libsdl-dev:armhf
</pre>
<pre>
./configure --target=linux-armhf --x-includes=/usr/include \
--enable-includes=/usr/arm-linux-gnueabihf/include
</pre>
Now, the AROS build is configured properly and all you need to do is:
make
==Build==
===64bit===
[https://github.com/aros-development-team/AROS/blob/7016ce28bfdb754182edb16011c98faaf5413c29/arch/aarch64-raspi/boot/mmakefile.src#L180 boot makefile]
===32bit===
# download/checkout the source someplace, e.g. /build/AROS-Src/
# make a directory to store external sources AROS downloads, e.g. /build/Ports
# make a build directory, e.g. /build/aros-raspi-armhf
# cd into the build dir, configure, and then run make -:
<pre>
>cd /build/aros-raspi-armhf
>/build/AROS-Src/configure --target=raspberrypi-armhf --with-serial-debug --enable-ccache --with-portssources=/build/Ports
>make
>make arosboot-raspi
</pre>
then copy the files from /build/aros-raspi-armhf/bin/raspi-armhf/AROS/ onto an sdcard, and download/copy the Raspi firmware files onto it.
You should then be able to boot the sdcard on your RasPi.
The current W.I.P tree to svn. it can be built as follows ..
<pre>
./configure --target=raspi-armhf
make arosboot-raspi
</pre>
That will generate arosraspi.img, arosraspi.rom and config.txt in bin/raspi-arm/AROS - so either copy just those files to a fat formatted SD card (with the firmware files on), or copy the whole contents of the AROS folder.
NB - if you have a Linux/other install, backup the existing config.txt first
arosraspi.img contains the bootstrap (which has very basic mailbox code, framebuffer/gpio init, and console "emulation" via code pinched from our libbootconsole), kernel.resource, and exec.library
arosraspi.rom contains all the other components needed to boot AROS.
The config.txt file will tell the RasPI bootstrap to load the arosraspi kernel and ramdisk (rom).
the bootstrap has minimal mailbox code, planning on adding either a resource or library that driver/app code will use to access it (likewise for GPIO)
Help building AROS hosted on Linux ARM
Was looking a way to use more my Handheld ARM based called Pyra (Dragonbox Pyra) an ARM (Omap5 cpu with 4GB ram) linux based machine (Debian Buster v10 with kernel 5.6.19 adapted) and have a try to compile the latest Aros sources by Deadwood directly on this device.
Compilation stops after build libpopupmenu.a and trying to build libatomic have this error:
<pre>
Configuring build in bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
configure: WARNING: unrecognized options: --disable-nls, --without-x
checking for --enable-version-specific-runtime-libs... no
checking for --enable-generated-files-in-srcdir... no
checking build system type... arm-unknown-linux-gnu
checking host system type... arm-unknown-aros
checking target system type... arm-unknown-aros
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for arm-aros-strip... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-strip
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for arm-aros-gcc... /media/farox/pyra2/arosbuilds/toolchain-core-armhf/arm-aros-gcc
checking whether the C compiler works... no
configure: error: in /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic':
configure: error: C compiler cannot create executables
See config.log' for more details
make[2]: *** [mmakefile:4489: /media/farox/pyra2/arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic/.configured] Error 77
[MMAKE] make --no-print-directory TOP=/media/farox/pyra2/arosbuilds/toolchain-core-armhf-build SRCDIR=/media/farox/pyra2/arosbuilds/AROS CURDIR=tools/crosstools/gnu TARGET=tools-crosstools-gcc-libatomic-configure -s --file=mmakefile tools-crosstools-gcc-libatomic-configure failed: 512
[MMAKE] Error: Error while running make in tools/crosstools/gnu: No such file or directory
make[1]: *** [Makefile:361: linklibs-libatomic] Error 10
make: *** [Makefile:183: crosstools] Error 2
</pre>
looking at config.log on arosbuilds/toolchain-core-armhf-build/bin/linux-arm/gen/host/tools/crosstools/gnu/gcc/arm-aros/libatomic
found that arosbuilds/toolchain-core-armhf/arm-aros-ld: cannot find -laeabi
so do make linklibs-aeabi-arm-quick
and the missing lib was built.
now the next stop is at
fatal error: bits/libc-header-start.h: No such file or directory
and
fatal error: sys/cdefs.h: No such file or directory
in many places so after checking that have this missing include files i have noted that my include path is a bit different, standard searching path is /usr/arm-linux-gnueabihf but in my system is /usr/include/arm-linux-gnueabihf
so if i add my path to some mmakefiles compilation goes on....but is a better way to add this path to avoid every mmakefiles to be changed?
fixed with adding
-I/usr/include/arm-linux-gnueabihf
to where is missing on mmakefiles like
USER_INCLUDES := -isystem $(GENINCDIR) -I/usr/include/arm-linux-gnueabihf $(KERNEL_INCLUDES)
P.s. I have changed many mmakefiles and have at least compiled (after many hours) the toolchain doing make every time in arosbuilds/toolchain-core-armhf-build (also have to disable making tests under cplusplus but don't remember the directory ...) but ask an help to have an automated way to correctly build without modify mmakefiles.
Last time built armhf target was around 2 years ago. At that point built is via cross-compilation from linux (ubuntu 22.04) using linux armhf crosscompiler (this can explain the path differences you are experiencing) as well as using AROS gcc cross-compiler in version 6.5.0 (build with option 21) in rebuild.sh). Since then AROS GCC has been updated to 10.5.0 and don't believe anyone tried to build the armhf target again.
My suggestion would be to downgrade GCC to 6.5.0 (via editing AROS/config/gcc_def file) and try to first build using cross-compilation from x86_64 linux. Once that works, you will have a "template" to compare to native compilation under arm linux.
Thanks for your suggestion...but think the toolchain with GCC 10.5.0 is compilable if i found a way to pass the path of my system to the script that build (option 21 on rebuild).
The other only changes are (but don't know where to modify...) is to add the build of libaeabi and disable the building of some tests under cplusplus that use exceptions and is not supported under ARM. try to crosscompile with my Linux amd64 PC.
For paths look into core-linux-armhf/bin/linux-armhf/gen/config/target.cfg. A number of build-wide variable is set there containing paths to local build system. These variables and the target.cfg file are generated by AROS ./configure script.
Thanks compilation now go forward...changed target.cfg under "toolchain-core-armhf-build/bin/linux-arm/gen/config" and do make on "toolchain-core-armhf-build" dir.
Need to find where to enable build libaeabi.a so can build the entire toolchain with option 21 of rebuild.sh
Found something that looks like libeabi in AROS/arm-all/arm-aeabi/mmakefile.src. Try adding a third line there:
#MM- linklibs-armhd : libklibs-aeabi-arm
Don't remember needing this library. Possibly the 6.5.0 GCC somehow does this while 10.5.0 is missing this.
Try adding this line (and the variant "linklibs-armhf" instead of hd) but it did not solve the automatic building of the missing lib. I must do "linklibs-aeabi-arm-quick".
Anyway after have build the aeabi lib i succefully built the toolchain (after many hours...). Smile
To test I restarted from selecting option 21 (on rebuild.sh) but after many hours i get the same error of the kernel includes not found...maybe i need to modify the configure script for my case.
With the toolchain built i try to build the core-linux-armhf (DEBUG) (option 22) but after a while it stopped with
"cannot find -laeabi " so i made it built manually...and now i can continue compiling...i'll let you know if all goes ok.
== Hardware ==
===64bit===
====BCM2712====
With the Pi5
Broadcom VideoCore 7 vc7 is an integrated GPU with 12 cores and up to 800 MHz clock. VideoCore VII is capable of OpenGL ES 3.1 and Vulkan 1.2. The driver support for the Raspberry Pi continues to build upon the [https://lore.kernel.org/dri-devel/20230928114532.167854-1-itoral@igalia.com/ open-source V3D driver] stack within [https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25450 Mesa] hopefully be merged for Mesa 23.3. x265 HEVC accelerated untested, x264/h.264 and VP9 cpu only.
*Raspberry Pi M.2 HAT+ Expansion Board
*Geekworm X1001 PCIe to M.2 Key-M NVMe
*Geekworm X1003 PCIe to M.2 HAT NVMe SSD PIP Board for Raspberry Pi 5
*Pineboards Pi Hut HatDrive! M.2 HAT 2024/V4
*Hat+ Gen2 Gen3 Nvme
*GeeekPi 52Pi N04 for Raspberry Pi 5 NVME M.2
*
*2024 RPI AI HAT - Hailo 20TOPs no LLMs
*2026 RPI AI HAT+ 2 - Hailo 40TOPs slightly better?
[https://www.raspberrypi.com/documentation/accessories/camera.html Cameras for Pi]
*Raspberry Pi camera module, the V3 with Sony IMX708 back-illuminated CMOS 12 Megapixel sensor
*Raspberry Pi Camera Module V2 – 8MP Sony IMX219 Sensor
*Raspberry Pi camera Rev 1.3, 5MP 1080P OV5647 image/video module, 2592 x 1944 pixels
====BCM2711====
With the Pi4 an ARM a72 cpu is about x3 times the size of an a53 in the Pi3
the 2711b line used more power when idle, compared to the 2711c
*2018 Raspberry Pi PoE HAT Power Over Ethernet Hat - design issues
*2020 Raspberry Pi PoE+ HAT Power Over Ethernet Hat Pi3b+ Pi4 only - better design
*Waveshare PoE HAT (B) with cooling fan for Raspberry Pi 3B+/4B 802.3af PoE
*[https://github.com/axizo-pi/V3DLib vc6 V3D 4.2] is derived from [https://docs.broadcom.com/doc/12358545 vc4], but it is [https://docs.mesa3d.org/drivers/v3d.html significantly different]
The QPU pipeline stays mostly the same, you still have an add ALU and a multiply ALU and it can issue two ALU OPs per cycle. There is still 4 SIMD lanes, interleaved over 4 cycles.
The instruction encoding for the QPUs is different, but the core instructions are the same.
Instructions for packed 8 bit int math has been dropped, along with most of the pack modes.
Instructions for packed 16bit float math has been added (2 floats at in a single operation)
With vc5/vc6, you write two packed 16f value to the tilebuffer (or four writes of 32f, if you are using the rgba32f framebuffer). And there is a handy vfpack operation which allows you to pack two f32s into a single 32bit value in a single instruction. You can vfpack directly into the tile buffer register.
the multiply ALU can now fadd, so you can issue two fadds per instruction. the add ALU has gained a bunch of new instructions
the A and B register files have been merged. You still only get an A read and a B read per instruction, but they read from one big register file (which means the underlying memory block has gone from two sets of "one read port, one write port" to one "two read ports, one write port" block)
The theoretical max FLOPs per QPU remains the same at two per cycle, other than the bump from 400mhz to 500mhx but it looks like a lot of effort has been put putting those theoretical FLOPs to better use.
*vc4 could run one or two threads per QPU. When you ran in two thread mode, the available register file halfed to 32 registers.
*vc5 added a four thread per QPU mode, with 16 registers per thread.
*vc6 doubled the size of the register file. You could now use all 64 threads in two thread mode and 32 registers in for thread mode. Single thread mode was removed, you always have at least two threads.
With the threading improvements, the QPUs should spent much less time idle waiting NOPs for memory requests. Most of the design changes have gone to improving the fixed function hardware around the QPUs. A fixed function blend unit has been added, which should reduce load on the QPUs when doing alpha blending. hope software blending is still possible
The tile buffer can now store upto 4 render targets (up to 128bits per pixel, so if you are using 4 32bit render targets, you can't have a depth buffer)
A MMU, allowing a much simpler/faster kernel driver.
Many more texture formats, framebuffer formats.
h264/x264 as Pi3
All the features needed for opengl es 3.0
H.265 / HEVC decoder is a HEVCv2 Main 4:4:4 10 design supporting bitstreams up to profile 5.1
HEVC hardware decode supports 4kp60, 10-bit. Audio output is pretty much unchanged, but the HDMI audio channels now support 8x192kHz bitrates
Each ALU typically have 2 floating point operators, and as you pointed out in a earlier post videocore 6 is no exception, with both a multiply and additive floating point operator. Thus theoretical GFLOPs are calculated with both operators in mind. That is what the 2 in my formula represents, and is common across any modern programmable shader, whether you calculate Nvidia, AMD, Intel, Boardcom or any other company's GPUs. Total ALUs * 2 * GHz clock = GFLOPs, In the case of Raspberry Pi 3, it's 24 ALUs * 2 operators * 0.4GHz = 19.2GFLOPs
If the Videocore 6 does indeed only have 16 ALUs (16 * 2 * 0.5GHz), you'd have only 16GFLOPs but they are better utilised
Possible maximum performance
<pre>
VideoCore IV @ 250MHz: 250 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 24 Gflop/s
VideoCore IV @ 300MHz: 300 [MHz] x 3 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 28.8 Gflop/s
VideoCore VI @ 500MHz: 500 [MHz] x 2 [slice] x 4 [qpu/slice] x 4 [processor] x 2 [op/clock] = 32 Gflop/s
</pre>
Faster LPDDR4 memory.
====BCM2837====
With the Pi3
* Broadcom BCM43438 chip provides 2.4 GHz 802.11n wireless LAN, Bluetooth Low Energy, and Bluetooth 4.1 Classic radio support, 3B+ [https://github.com/aros-development-team/AROS/commit/afa5bc0bb17d5dd06bcfdbac00853a3799ca8d76 LAN7515]
The overclock ability has diminished with each chip version as the energy usage has increased. BCM2837 is one of the warmest yet and benefits from active fan cooling if all four cpu cores are in use for a short while. Video playback maybe affected due to the lack of custom support in the GPU with Aros. 5 V / 2.4 or 2.5 amp power supply recommended if all four cpu cores are running, else throttling (cpu slowdown) might occur.
[https://github.com/hermanhermitage/videocoreiv/wiki/VideoCore-IV-Programmers-Manual Dual VDP] and scalable QPU in [https://docs.mesa3d.org/drivers/vc4.html VC4] and x.264/h.264 accelerated untested only and VP9 on cpu or neon help
ARMv8-A has [https://developer.arm.com/documentation/102412/0100/Privilege-and-Exception-levels privilege levels] where userspace typically runs at ‘EL0’, the kernel at ‘EL1’ or ‘EL2’ and the firmware at the highest level ‘EL3’.
===32bit===
=== Core Kernel ===
====BCM2708(family)====
which includes the [http://elinux.org/RPi_Hardware BCM2835] (ARM1176JZF-S 700 MHz CPU + VideoCore IV GPU + up to 1GB RAM)
*Framebuffer (fb) using mailbox
*IRQ scheduler, etc
*Arasan based SD Card controller
*Synopsis DesignWare USB 2.0 OTG controller [http://networkdirection.net/index.php?option=com_content&view=article&id=106:rasperry-pi-usb-controller&catid=45:raspberry-pi&Itemid=54 Unofficial DOCS pdf], [dwc_otg.c FreeBSD], [], [https://www.riscosopen.org/viewer/view/mixed/RiscOS/Sources/HWSupport/USB/Controllers/DWCDriver/ RiscOS USB Driver], [https://www.riscosopen.org/forum/forums/5/topics/878 RiscOS USB Discussion], [https://www.riscosopen.org/forum/forums/11/topics/1893 Other USB RiscOS], [http://plan9.bell-labs.com/plan9/index.html Plan9 Miller's usb] http://plan9.bell-labs.com/sources/contrib/miller/, [https://github.com/Chadderz121/csud CSUD driver],
*[http://www.smsc.com/media/Downloads_Public/Data_Sheets/9512.pdf SMSC 9512] USB LAN/Hub chip
*CMOS RAM
*VCHIQ port which sends messages to the GPU e.g. for mouse, keyboard, audio on HDMI, etc
*Audio Driver
*Serial Peripheral Interface Bus (SPI)
*[http://www.susa.net/wordpress/2012/06/raspberry-pi-pcf8563-real-time-clock-rtc/ I2C registers]
*I2S
*Universal Asynchronous Receiver Transmitter (UART)
*[http://elinux.org/RPi_BCM2835_GPIOs GPIOs] and [http://www.adafruit.com/blog/2012/08/17/broadcom-bcm2835-peripheral-memory-map-and-gpio-alternate-use-chart-piday-raspberrypi-raspberry_pi/ Alternative view of GPIO]
BCM2836
* For Pi B+, PI 2 and Pi 3 SMSC LAN9514 chip adding 10/100 Ethernet connectivity and four USB channels to the board
*[http://www.andrewscheller.co.uk/rpi_pcb_modules.html PCB], [http://elinux.org/RPi_Low-level_peripherals Low level features],
Implemented so far...
# Modify the configure system so that it correctly builds for the arm hardware float raspi target.
# Implemented the bootstrap to load the aros modules and prepare the arm to jump into them. Reworked the x86 console support so that parts can be stolen for raspi to use since t has no basic functionality to output to the display.
# Implemented a kernel.resource to prepare the raspi for running aros and provide the low level api calls to expose available resources and allow exec, etc function.
# Implemented serial debug support
# Implemented the exec (and kernel) functionality required to make multitasking work (and interrupts, exceptions, syscalls, etc)
# Implemented a timer.device to utilise the hardware timers.
# Implemented a very basic gfx driver to expose the hardware's framebuffer.
# Implemented an SD-Card driver for AROS which presently only supports the raspi's chipset but can easily be modified to support all sd-card hardware and media.
# Fixed the fat filesystem support in AROS so that it can boot on RasPi's normal SD-Card setup. The "rom" image files needed use a different filename than the default linux, etc images so can be easily installed without harming the existing files - you only need to change the loaded images in the config file to get aros to boot.
# Updated the build scripts to automatically download the necessary raspi firmware files and wrap it all up so that you can simply extract the archive to a fat formatted sdcard and boot it on the raspi without having to get anything else.
# fix everything in contrib and ports to build for raspi (needs proper testing/fixes but allows every component to actually compile at least, including owb) + numerous other fixes to get things working on arm/raspi ..
Improvements...
# Implement a USB chipset driver "OR" finish the existing one [https://github.com/aros-development-team/AROS/commit/c07d13c724f944674be5db54fc6a71ee72a01809 usb otg] - the current code is mostly a skeleton that should initialise the chipset and then needs relevant code to support the different transfer types. It also has the "virtual" hub code in place to represent the raspi's USB port (from poseidons p.o.v)
# Implement a driver for the USB NIC (a few weeks - depends on USB above)
# Write an [https://github.com/aros-development-team/AROS/commit/d55d0f74d20b769bbb8c8d386e5c1d7a9154f05a audio driver] (a few weeks - independent of USB) and [https://github.com/aros-development-team/AROS/commit/e93a4c245f27a87c9c4c1d39206694b39059998a HDMI]
# fix syscall bug in the current raspi kernel code
# Graphics depend on having a decent "bcmdma.resource" implemented as to use the cpu's dma engine. The sd card driver needs to use it for transfers to/from the controller - and the gfx system needs to use it for "blitting".
# [https://github.com/aros-development-team/AROS/commit/4019d84e4975d4dad987a12d57fe108f5ac048e6 Improve the gfx driver], [ vc4gfx HIDD] add [http://dri.freedesktop.org/wiki/VC4/ Gallium3D support]
# [https://github.com/aros-development-team/AROS/commit/b13905b3e8e45b089f520b44692c81affddd066f Improve] the [https://github.com/aros-development-team/AROS/commit/3a876755c070f5c73c4f53c7f4d35b4f923088b9 sdcard] device driver - which is also pretty basic but should work with most cards, rework it to also support pci, etc. sd card interfaces on x86
# The current code using very rudimentary access to the gpio interface - so that should be implemented as some resource for other components to access, as-well as the i2c interface exposed over the gpio interface. that should have a hidd class implemented which uses the gpio resource to communicate.
Boot up typical for most other OSs before the open sourcing of many binary blobs from 2017 onwards
On power-up, the rpi [http://www.open.com.au/mikem/bcm2835/ BCM 2835] [https://github.com/hermanhermitage/videocoreiv VideoCore4] GPU, not the ARM CPU, is in control, and the SD card slot is the only peripheral device with power. The firmware burned into the BCM2835's VideoCoreIV GPU PROM requires a DOS-style partition table; a FAT-formatted first partition; and the freely redistributable but closed sourced Broadcom files “bootcode.bin” and “start.elf” in that partition.
The boot sequence carries out several pre-boot tasks
*On powering of the rpi, the GPU reads and executes bootcode.bin, which then loads start.elf
*The GPU loads the “start.elf” file, eventually, into the L2 cache and then executes it
*configures the memory split for the CPU and GPU
*reads and parses “config.txt” from the same partition on the SD card and applies the settings (like a PC’s BIOS settings)
*loads the “kernel.img” file, again from the same partition
*activates the CPU to begin executing the loaded kernel image
The CPU/GPU memory split is hard-coded into start.elf, so Broadcom provides three start.elf images, to give 32M, 64M, or 128M to the GPU for multimedia performance, and the remainder to the CPU.
RPi uses [https://github.com/raspberrypi/firmware some closed source loaders] and at some point it loads a binary blob named "kernel.img" at 0x8000, at that point there would be a rudimentary Aros alive. If one wants to use the SD-card then there would have to be a driver for the interface and a fat filesystem handler (SD-card has to be formatted to fat filesystem)
Boot code and kernel are now linked together and made into that binary blob, just for starters. Raspberry Pi uses [http://kernelnomicon.org/?p=133 u-boot] and [http://kernelnomicon.org/?p=138 UBoot] as bootloader, there's already some code in the Efika MX port for that. UBoot is a native bootloader and not just for the raspberry pi, it loads after start.elf.
You can find Efika MX port from arch implementations, some hacking is needed for the mmakefile.src'es as iit dates back to before the Aros crosstool era or else you get some weird errors while building. You also need to code the bootstrap and serial handling.
At the moment it seems that a fastest route for the native build would be to make one binary blob without using the package system. Raspberry's memory layout is pretty simple and if the implemented u-boot doesn't support loading other modules
<pre>
? - alias for 'help'
mtest - simple RAM test
autoscr - run script from memory
base - print or set address offset
bbm - BBM sub-system
bdinfo - print Board Info structure
boot - boot default, i.e., run 'bootcmd'
bootd - boot default, i.e., run 'bootcmd'
bootm - boot application image from memory
bootp - boot image via network using BootP/TFTP protocol
cmp - memory compare
coninfo - print console devices and information
cp - memory copy
crc32 - checksum calculation
echo - echo args to console
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls - list files in a directory (default /)
go - start application at address 'addr'
help - print online help
iminfo - print header information for application image
itest - return true/false on integer compare
jade -
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loady - load binary file over serial line (ymodem mode)
loop - infinite loop on address range
md - memory display
mm - memory modify (auto-incrementing)
mtest - simple RAM test
mw - memory write (fill)
nfs - boot image via network using NFS protocol
nm - memory modify (constant address)
pci - list and access PCI Configuration Space
ping - send ICMP ECHO_REQUEST to network host
printenv - print environment variables
rarpboot - boot image via network using RARP/TFTP protocol
reset - Perform RESET of the CPU
run - run commands in an environment variable
saveenv - save environment variables to persistent storage
saves - save S-Record file over serial line
setenv - set environment variables
sleep - delay execution for some time
tftpboot - boot image via network using TFTP protocol
USB - USB sub-system
usbboot - boot from USB device
version - print monitor version
</pre>
And there is one more thing about modular ports. In order to actually implement this, your bootstrapping environment should provide the ability to load several files. On PC this is provided by GRUB2. on CHRP you can read filesystem via OpenFirmware, and Sam's Parthenope relies on modified u-boot. If your bootstrap allows to load only a single file, then you stuck with monolithic kickstart. By the way... u-boot allows not only to boot up a single uImage or zImage, it also allows to write client programs AFAIK. With this approach, you actually can write modular bootstrap for ARM AROS using unmodified u-boot.
Most used [http://www.compulab.co.il/workspace/mediawiki/index.php5/U-Boot_quick_reference uboot options] are fatls usb 0:1,
the reason behind INTB_KERNEL is to allow use of the standard Exec function AddIntServer() to add interrupt handlers for
hardware drivers etc. AmigaOS never used it for abstract hardware drivers. AmigaOS routed only raw hardware IRQs there. Their assignment was hardcoded. As well as number of them. Actually on AmigaOS every bus has its own interrupt subsystem. For example PCI bus. PCI interrupts on Amiga are routed to a single exec interrupt. 1:1 relationship between CPU and hardware interrupts is present only on PC.
IMHO we miss things like AddInterrupt/RemInterrupt methods on our PCI subsystem's device class. PCI bus class should map these methods to whatever is appropriate. This is how it is done on AmigaOS and friends. When these are implemented, raw kernel.resource API will be needed only for several PC-specific drivers with hardwired resources. Exec IRQs are real IRQs only on Amiga hardware. On other machines they can be emulated where appropriate (VBlank is a good example). kernel.resource is meant to be different, its IRQs are hardware-agnostic, they are plain "Hardware IRQ number X, whatever this means". They are low-level actually, and meaningful only in the context of a particular system.
Was that not the transition from irq.hidd to kernel.resource? No. A long time ago there was another hacky bit named INTB_TIMERTICK. It was "abstract timer interrupt", used by timer.device. It was the same as VBlank, but with larger frequency. I removed it, because kernel.resource API was a cleaner way to access this interrupt. Furthermore, there can be more than one timer in the system. Thinking about bringing back timer HIDD definitions again. hpet.resource is a bad idea.
Can someone please enlighten me a little on how the scheduler is meant to work?
Poseidon.library creates its "Poseidon Event Task" during RTF_COLDSTART -> then calls Wait(), and ends up in limbo because wait disables interrupts (used for the scheduler heartbeat), and basically waits forever because the sigbit is never set, since krnSwitch doesn't switch the task unless TF_SWITCH is set, and no codepath run during this seems to set it?? TF_SWITCH does not disable/enable switching. This flag just enables to run user-supplied hook when the task is being switched away. It is completely safe to call Wait() in Disable()d state. Doing this actually temporarily breaks this state. IDNestCnt gets remembered in struct Task, then next task is selected, and its IDNestCnt is restored in sysbase (see kernel_scheduler.c). If there are no other tasks, then your cpu_Dispatch() should enable interrupts on the CPU and enter idle mode. See x86 implementation for good example.
You miss what happens next...
1. KrnSwitch() saves context of your task, saves IDNestCnt (core_Switch() and cpu_Switch()), then drops into cpu_Dispatch().
2. cpu_Dispatch() calls core_Dispatch. Then two cases are possible:
2a. There is a READY task. It is picked up, its IDNestCnt is restored in SysBase, then cpu_Dispatch() needs to restore registers and exit. The next task is run.
2b. There are no READY tasks. core_Dispatch() returns NULL. In this case your cpu_Dispatch() should enter idle loop. It should just enable interrupts on the CPU and put it on halt. This allows it to process hardware interrupts. Eventually some of your interrupt handlers wakes up your task and puts it into READY list.
My heartbeat interrupt has been slowed atm to help debugging - but it never actually gets a chance to fire because of the Wait() disabling interrupts. Perhaps you have forgotten to enable interrupts in your idle loop.
There is a change in the format of AROS executables. Until now we were using Elf RELocable files which are usually used as intermediate object files. We had them for various reasons, one of them was how AROS files were built in the past. That days we had no real aros cross compiler and the option to embed relocation data in unix executables (or in executable files in general) was rather new and not every linux/unix system had it. Therefore we have decided to use intermediate files. Although it was somehow working (and it is still working :-)), it has some drawbacks. Therefore decided to introduce real Elf EXEC types, in first turn implemented on ARM target with option to expand in future to all other AROS architectures.
The first patch was pretty easy and appeared to work somehow. It generated nice executables with embedded relocation info. Not only that, it also removed all global symbols adjusting relocation data to be relative to the beginning of the sections. That move reduced number of symbols in each executable significantly (depending on the file between 20 and 80% of all symbols could be removed). The only symbols that stayed in the file are local ones - due to the nature of the patch wasn't able to remove them since we have not seen them in the symbol hash table.
The patch didn't worked though. The files were relocated, AROS kernel loaded, but it crashed very early. What happened? Well, the nature of ARM relocations happened :)
Most of the relocation data on all machines is rather simple. Relocation can be absolute or pc-relative, sometimes the offset has to be bit shifted. On ARM v7 there is another one. There, when one wants to load an address of function/variable into register a combination of two instructions can be used: movw and movt. The first one loads immediate into lower 16 bits of a register while clearing upper 16 bits. The second one loads immediate into upper 16 bits without touching lower halfword. Loading of a pointer into a register looks like this:
movw r0, #:lower16:label
movt r0, #:upper16:label
In this case there are two relocations - one for lower halfword and another for upper. If an overflow of lower 16 bits occurs during relocation process, the upper one should be updated as well. Unfortunately with current patch and with typical ARM executables there is not enough information to perform the calculations.
There are two options - the first one would be to give up and go back to "fake" executables, another one would be to change from REL to RELA relocation info. The latter contains an addend, extra data which can be used to perform all the relocation calculations I need.
Decided for the second option. The patch is already in the works. There is another function for the binutils' bfd backend to perform the final relocation. There can decide what to do with every reloc info, modify data and eventually strip some symbols. An advantage is - at this stage of the linking process have also full access to all local symbols so can change all relocations section relative and eventually strip all symbols from the files.
GPU
VCore developed by Alphamosaic Ltd and now owned by Broadcom. Most of start.elf runs on the GPU. Placing ALL the userland GPU code in the videocore.hidd isn't going to be a terribly big problem because the code they published is nothing more than a shim that sends data straight to the GPU to execute.
The good news about this is that we only need to write our HIDD using the OpenVG API. The shim is relatively small codewise and lives in the ARM memory (the actual OpenVG code itself lives in the GPU RAM area and its loaded from start.elf). That's also the bad news. Our driver has to translate AROS video calls to OpenVG calls, for most tasks it should be easy, for some, not so much. It's still probably less difficult and less work, than controlling the GPU directly.
The other good news is that anything done through OpenVG happens on the GPU, its truly accelerated. It also has some nice font functions, meaning we can lead into an accelerated text mode later.
Basically, AROS resets or locks up when it tries to use AROS_ATOMIC_INC or DEC. If I comment out the byte/word operations in the header files and use non-atomic operations, the code works as expected.
have read that the L1 cache needs to be enabled to use LDREX and co (which I also read is only meant to be used on multi processor systems with shared memory) - however I am certain this is correctly enabled.
If you are using LREX or STREX, you should have L1 cache enabled, at least on the ARM CPU I work with at work.
L1 cache is enabled by enabling the MMU *AND* setting the C and I bits in the CPU - the C bit is ignored, and the I bit only covers the 16 byte instruction pipeline if the MMU is not enabled.
Can you verify that your assembly is generating LDREX/STREX? From the behavior, it almost sounds like its generating the default Semaphore locked atomics.
Impossible. There are no semaphore-locked atomics. There are Disable()/Enable()-based ones instead. And there's a special #define AROS_NO_ATOMIC_OPERATIONS in this case, which tweaks Disable()/Enable() implementations not to recurse forever.
I have tested this on ARMv5 which does not have ldrex/strex, it works fine. On those ARMs there's no way to have real atomics. On other OSes (like Linux) this is done by introducing things like atomic_t, which appears to be a complex structure, holding the value together with accompanying spinlock (implemented using swp).
#warning "TODO: lookup optimal mmu table settings for raspi memory"
/* Set up an identity-mapping for all 4GB */
for(x = 0; x < 4096; x ++)
{
pagetable[x] = x<<20 | (0x40002|0x80000|0x010000|0x00C00|0x04);
}
Shouldn't there be a second loop that sets the 'C' bit in the descriptor for the RAM pages?
Currently, you have TEX=0, C=0, B=1 for all pages (Shared Device).
You should have TEX=0, C=1, B=0 for RAM (Write-Through, Cached)
So ..
pagetable[x] = x<<20 | 2;
should be enough?
No, for RAM you need to change the '| 0x40' to '| 0x80'
tell dosboot the correct defaults to use
Please don't do this. This bootconfig.c is a deprecated legacy thing. I wanted it to go away completely with time. Instead, display drivers should auto-install themselves during own initialization phase. I. e. detect hardware=>instantiate itself. This should make things way simpler. With this approach you only need to add the driver into KS image to get the device autobooted. No hardcoded stuff.
Currently VESA and VGA drivers do this, look there for examples. never rewrote ATI driver because i don't have any test system for it.
they defined a smaller AROSCPUContext than the ExceptionContext - yet reference it as ExceptionContext in other places, and since it hasn't allocated enough storage for ExceptionContext, are corrupting memory/the structure (since the elements that are there don't map 1 to 1 with the exception context).
AFAIK, AROS has been moving in a different direction to this in recent years. It is the job of graphics HIDDs to allocate bitmaps etc. so that they have the most suitable characteristics, including allocating them from GPU RAM where possible. The concept of chip RAM is only for legacy code, and most if not all non-68k platforms should have all system RAM
marked as chip.
BTW, is the video processing code you mention CPU code or GPU code?
Also, IIRC we have support for "external memory allocators". Perhaps that's what we need for the allocation of GPU RAM through the mailbox.
All hosted and x86 native ports should use proper context formats.
trying to clarify if the vblank handler has to have run by this point to prevent this deadlock. Actually, no. Unless you have installed VBlank handler which should wake up at some point. Without VBlank there will be no quantum count. Consequently, there will be no forced preemption. But the rest will work, and multitasking will be cooperative (switch happens only when current task voluntarily gives up the CPU). Does it depend on the vblank having run before this point? and if yes what does that mean on systems where it might be able to run enough code (e.g. get to this point) before the vblank interrupt has triggered? What is it waiting for? It could wait for timer, in this case you need timer.device working. VBlank is currently needed for exec's quantum counter. In current native ports we have only a single timer, which is served by timer.device. VBlank is simulated by timer.device also. If your machine has two timers, then you can use one of them for VBlank, and another for timer.device, this will simplify things down. VBlank needs to be 50 Hz for historical reasons, many programs use it as cheap timer. I am periodically thinking about making some abstract mechanism to be able to change quantum source (and untie it from 50 Hz), but have no time to come up with something good. Additionally i started disliking timer.device hardcoded design when PC has got many timers (old 8253, APIC, HPET).
Currently i think there should be some low-level entity representing tick source. timer.device should just select the most appropriate source for its units.
The BCM2835 has 4 GPU based timer sources - 2 are used by the GPU, so im using Timer3 for our heartbeat and the remaining one will be free to the system. There is also the less capable ARM timer but that is dependent on the CPU frequency. Very good. You won't need any emulation. Set the heartbeat to 50 Hz and drive VBlank from it. Use other timer for MicroHZ.
Can you use the 'econsole.hook' I make for debugging the Sam460 via the serial port?
It provides a before-anything-else shell prompt on the serial port. You can then do 'NewCLI' to test your graphics, or use any DOS command in shellcommands.resource.
You should just be able to add econsole.hook to your module list, and use 'econsole' in your bootargs.
So long as you have a working Exec/RawMayGetChar and Exec/RawPutChar, it should work.
Also make sure to add shell.resource and shellcommands.resource for this.
That should have done it.
If you set "#define DEBUG 1" in arch/all-native/econsole/econsole.c, do you get any additional serial output?
have added it to the build and added econsole to the command line - and can see the bootloader picks up on the emergency bootconsole tag, but I still only get the insert bootable media display?
Im assuming it exposes a fake filesystem that tricks aros into booting?
The contents of which are: ECON:AROS.boot
Way to handle the scheduling code? The implementations I had been following were causing problems, due to cascading interrupts which I cant handle properly in the asm stubs just now (when they break disable etc.) - since it means detecting the interrupted codes cpu mode and getting the correct sp/lr for it, and that's just too tedious for arm.
To work around this ive added a system idle task which does nothing - and when the scheduling code has no task to run switches this in and lets it run, thereby allowing the interrupts etc to resume until something does need to happen.
Also, by adding accounting code to cpu_Switch() and cpu_Dispatch(), it should allow the system to log idle time correctly (as well as running tasks).
have thought of also adding an additional task that never runs, solely to record time spent in IRQ handlers, but I digress..
was under the impression that kernel.resource should *never* be used outside of exec.library. This is a wrong impression.
Michal started designing it because portable nature of AROS does not fit well into exec's API with all its assumptions. So, he started the new, hardware-agnostic kernel API from scratch. Yes, exec sits on top of it in places. But kernel always meant to be open thing. Otherwise it would not exist.
it wasn't meant to be just used willy nilly by user code - but by lower system components (e.g. exec) so that they could be implemented in a more generic fashion, and the kernel resource itself hide the systems quirks.
Adding new things there perfectly keeps up with our decision to minimize AROS-specific intervention into APIs which can clash with MorphOS or Amiga OS4 extensions. We want at least source-level compatibility there. Binary compatibility on PPC would be extremely cool, but at the other hand we have no maintainer for this, as well as their ABIs splintering.
It depends on what exactly is being implemented - there's no reason we should have everything crammed into kernel.resource if it doesn't need to be (i.e. if its better suited as a separate component/subsystem in its own right)
The _LE versions are for when you have endian swapping taking place. If the graphics are the same endian as the CPU, no swapping should occur. I ran into a similar terminology problem in SDL with a friend insisting that his Radeon 7000 on his PC was big-endian. It is not, it just uses the same endianness for the graphics card and the CPU so no swapping was necessary. They were both little-endian.
The _LE versions are because the PixFmts refer to the bitmap data being in big endian format in memory, for which the normal version would need to do endianness conversion before applying the shifts/masks. on this platform it is in _LE in memory also so we don't need the conversion hence using the _LE version of the call). would use _LE (if it's really little endian 16 bit mode).
What is the bare minimum needed to implement a framebuffer based gfx driver, with our software handling the rest?
Have tried with just a gfx class that only expose new/dispose/newbitmap - and having an onscreenbitmap used only for the framebuffer itself (with all other bitmaps being chunkybm, and the framebuffer's superclass also being chunkybm), but that alone isn't enough it seems?
You can use workbench/hidds/sm502/ as your example - it is as simple as I could make it.
So, AROS creates the framebuffer bitmap (verified this) -> so surely it should be capable of then rendeing into it? I don't actually create the framebuffer "bitmap object" myself - only as a result of being asked to. The code I currently have on SVN seems to create the framebuffers bitmap object fine, but then crashes in intuitions DisplayDriver callback. In particular it crashes performing the getattr on the system default pointer. don't expose MEMF_CHIP in an allocatable form so AllocSpriteData was failing (and other code later doesn't check if the values are valid == illegal memory accesses)
So far have -:
vc_init: queries the gpus memory, and sets up a fake memory handler for it, then adds the bootmode driver and returns saying all is well
vc_gfxhidd:New: sets up some fake syncmodes to test with and creates the real gfx object.
vc_gfxhidd:NewBitmap: checks if its a framebuffer and uses the onbitmap class or uses the chunkybm class otherwise
vc_onbitmap:New; creates a chunkybm object and then pushes the real framebuffer address into it as the buffer,
vc4 had v8adds, v8subs, v8muld, v8min and v8max which operated on four 8bit uint values packed into a 32bit register. Multiplication was in the range 0.0 to 1.0 and addition/subtraction saturated. There were also a range unpacking/packing modes that allowed you to pack and unpack 8bit values into 32bit registers.
RasPi has to speak to the "operating system" which runs on the GPU itself and request/free memory - it cant directly manage it itself, and so the managed functions were used to wrap these calls.
The Arm and GPU share memory space. The framebuffer is shared. The Arm can write a pixel and it will appear on the screen (through GPU hardware) without flushing/copying being required.
The GPU can composite multiple FB's in real time - so you have a number of surfaces defined which are rotated etc and composited in real time to the output. Copying can map from the address space of the Arm to the flat space of the GPU which takes some code, but I don't think whole buffers are copied.
The DMA hardware can also access the whole memory space and can perform 2D fills and blits (no blending). This is documented in the peripheral spec posted. The DMA is just an Arm accessible peripheral and can be set up with low latency (e.g. microseconds).
must use a 0xc0000000-based bus address to access SDRAM, yet non-DMA access should go via a 0x0-based bus address.
For 2D dma, set TDMODE, and the spec says "interpret the TXFR_LEN register as YLENGTH number of transfers each of XLENGTH, and add the strides to the address after each transfer." so set STRIDE to pitch of the image, the width is XLENGTH and height is YLENGTH. You would fill by not setting the SRC_INC and point source to your fill data.
The DMA cannot see the ARM's L1 cache, so you would map the framebuffer with ioremap_nocache. Depending on where the source data comes from, it may need an L1 cache flush. The DMA can see the L2 cache. Use 0xC0000000 bus addresses when L2 is disabled and 0x40000000 bus addresses when L2 is enabled. (actually just call virt_to_bus and you'll get the right address out).
openGLES/openVG has high latency. Writing to framebuffer then reading it back is very inefficient (e.g. milliseconds). If you can drive it a unidirectional way, just streaming commands at then that is efficient. openVG is not implemented on top of openGLES - it uses the same hardware but as a first class interface
To improve the Gfx driver, we will need a DMA resource implemented so can use to perform DMA operations. The Gfx driver will need this to perform blits.
Actually MEMF_CHIP has to present, for historical reasons.
This has been never fully agreed upon, but in ports i wrote i exposed the whole memory as MEMF_CHIP. The idea behind this is that CHIP is originally the memory where graphics and sound data can be put. On non-Amiga platforms there are no restrictions on this, so the whole memory is CHIP.
Yes, many old software can misbehave with CHIP memory size larger than 2MB. But this actually applies only to m68k AROS which is going to run m68k binaries. In other cases it's quite logical to fix the program when porting.
As to original question: yes, it's enough to have a framebuffer bitmap (one with aoHidd_BitMap_FrameBuffer set to TRUE) and PutPixel routine. It framebuffer can be served by chunky bitmap class, then you can simply create chunky bitmap with your own buffer (see how VESA driver does this). Chunky PutPixel is already there.
struggling to determine what is the correct pixfmt to use for the 24/16/15 bit gfx modes on the RasPi. AFAIK it uses RGB565, for 16bit but im unsure what shifts etc should go with it? suffice to say Im getting the wrong colors so far lol.
<pre>
redmask: 0x0000F800
greenmask: 0x000007E0
bluemask: 0x0000001F
alphamask: 0
redshift: 16
greenshift: 21
blueshift: 27
alphashift: 0
</pre>
It should likely be vHidd_StdPixFmt_RGB16_LE
This stuff is a bit confusing. The "names" of the stdpixfmts are based on the layout in memory,
ignoring endianess. So for example:
ARGB32: will be 0xAA 0xRR 0xGG 0xBB in memory on both big endian and little endian machines.
The shifts and masks OTOH are based on pixel access (ULONG in this case), so differ depending
on whether you run on big endian machine or little endian machine (that's why there's stdpixfmt_le.h and
stdpixfmt_be.h in rom/hidds/graphics/).
With the 16 bit pixel format it's even more confusing, as for example it's impossible on little endian machine
to describe RGB16 with shifts/masks alone. That's why there's vHidd_PixFmt_SwapPixelBytes_Flag.
(RGB16 == RRRRRGGG GGGBBBBB in memory, and for pixel (WORD) access on little endian machine it needs to
be accessed as GGGBBBBBRRRRRGGGG).
The shifts btw indicate how much to shift the component to the left (!) so that it is moved to the highest bit (31).
The aHidd_PixFmt_StdPixFmt you specify will be ignored most of the time, because when the pixelfmt is registered,
the gfx hidd checks if there's an identical pixfmt (shifts/masks/etc., but ignoring pixfmt->stdpixfmt) already in the system,
and if so, it uses the already existing one and does not create a new one.
In theory it would be better if gfx drivers could simply/only specify a StdPixFmt without all the shifts/masks stuff when the
gfx driver uses pixfmt which matches one of the stdpixfmts exactly. Another possibility would be for gfx drivers to use
HIDD_Gfx_GetPIxFmt(stdpixfmt_gfx_driver_wants_to_use) and then peek shifts/masks from it and fill out a pixfmt
tag list based on that.
15bit very blue/green: Try to pass same shifts/masks/etc. as in 16 bit pixfmt (maybe you think it's using 15 bit R5G5B5
(or swapped) but it's actually still using 16 bit R5G6B5 (or swapped).
aHidd_PixFmt_StdPixFmt you pass is mostly ignored. It's the shift/masks/etc. that count.
But I would still pass the correct one (_LE) == whatever rom/hidds/graphics/stdpixfmts_??.h uses
in the entry where you have looked up shifts/masks/etc.
Use the shifts/masks/etc. from the entry in stdpixfmt_le.h (if you are running on little endian machine) or stdpixfmt_be.h (if you
are running on little endian machine) that matches the pixfmt that its meant to be.
0xAA,0xRR,0xGG,0xBB on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on little endian (->entry in stdpixfmt_le.h which says vHidd_StdPixFmt_BGRA32)
0xAA,0xRR,0xGG,0xBB on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_ARGB32)
0xBB,0xGG,0xRR,0xAA on big endian (->entry in stdpixfmt_be.h which says vHidd_StdPixFmt_BGRA32)
it feels like AROS trashes the alpha component, otherwise it should be 8A8R8G8B.
read on the subject suggest its in 1x5r5g5b (x is ignored) to keep 16bit alignment .
Suggests to me that wrong shift/mask are being applied - however going by the 16bit versions it all looks correct to me so I am really confused as to what is happening.
The output image looks to have too much green/blue, and very weak red.
Kickstart
The idea is to minimize amount of archirecture-specific modules to make the user's life easier. So, the kickstart was split into 'base' (which does not contain anything machine-specific) and 'BSP' (Board Support Package) which contains all hardware-specific stuff. This way, for example, distribution makers can save up space on CD and make CDs with multiple platform support. Different configuration would load the same base with different BSP's.
Next there was some part which is entirely missing on hosted. These are filesystems. Hosted ports do not need them to boot up, so on hosted they are left out. At the other hand, they are also architecture-agnostic. So i put them into 'FS' package (standing for 'filesystem').
USB
Poseidon is one more big part. I made it into separate package in order to allow users to omit it if they don't need it (for example, to run on retro PCs without USB). Personally i have one. Again, Poseidon is hardware-agnostic (well, there are USB drivers but HCIs are pretty standard).
AFAIK its HCI 1.0 compliant but not familiar enough with poseidons drivers, nor USB, to just hack away at the existing code. Perhaps once i'm more familiar with the workings I can merge in the changes needed to get it operating but for now I will focus on getting it running. Also our drivers have known issues so perhaps a fresh set of eyes might shed some light on what is going wrong.
Another interesting question is whether Poseidon can operate on device side. Is it flexible enough? How similar is being a USB host and USB device? think it will need a bit of work on Poseidon's side. Until then I will force the driver into Host/Master mode in the init code, but leave open device etc to configure the chipset for either's use - and look at trying to add support for working in Device/Slave mode & switching modes once it's up and running.
Actually USBROMStartup is some kind of kludge. Can there be any alternative? Could device drivers be self-installing, like our HIDDs? This would get rid of need to list them in USBRomStartup.
* Model A and B limited to 150 mA per port.
* Model B+ and Pi 2 introduced configurable 600 mA to 1.2 A support over all ports - anything above that requires a powered USB hub.
Implementing the hardware driver that Poseidon uses to interact with the USB components.
Have code in place to (try) and initialise the USB chipset, and configure host/device mode operation (though AFAICT Poseidon doesn't support device mode). Started to get the "virtual" root hub written for the single USB port so that Poseidon should at least list it correctly in the GUI - and try to interact with it to find peripherals.
The BCM2835 uses a soft IP block from Synopsys’ DesignWare library (DWC), specifically the block is called dwc_usb_2_0_hs_otg_subsystem-ahb_se (“USB 2.0 Hi-Speed OTG Controller Subsystem w/AHB Interface SE”).
There is no public documentation for this, and pretty much zero chance of anyone getting hold of it even with NDA. However, there's a Linux driver written by Synopsys ([https://github.com/raspberrypi/linux dwc_usb]). Specifically directories [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_common_port] and [https://github.com/raspberrypi/linux/tree/rpi-patches/drivers/usb/host dwc_otg].
The Synopsys code is actually under a fairly permissive licence – it's not GPL, it's similar to BSD (’don't sue us if it breaks’ is pretty much the only clause). So this should not be a barrier to porting the code.
The code is really well written, with a nice partition between the work done by the driver (dwc_otg, which is fairly involved, given the host does more work than a conventional EHCI driver), and the interface to Linux (dwc_common_port).
Probably only need provision of relevant changes to dwc_common_port. Other things to consider....
* Provision of necessary headers to get it to compile
* Provision of necessary functions (main issues are wait queues, threads, work queues, tasklets, timers, spinlocks and mutexes (multithreading) )
* Interfacing between USB stack and the driver. dwc_otg/dwc_otg_hcd_linux.c looks like the place to start.
the Linux bits of the headers are only required for the dwc_common_port library. dwc_common_port includes a variety of crypto functions which are not used – it appears to also be used for ultrawideband (UWB) and wireless USB (WUSB) drivers where crypto will be an issue, but it isn't going to be for plain wired USB.
Every USB driver acts as an USB hub as well in order to let Poseidon control the state of USB ports. The code there was reading status of the only USB port in Raspberry's CPU but when changing the status it erroneously deleted some of the status bits, including the port enable one. It was so because those bits in the status register are of a type Read/WriteToClear. It means, if one does not want to change their value from 1 back to 0, one has to actually write the 0 value. Very practical thing e.g. in interrupt handlers, where one reads the interrupt status register to learn what was the interrupt reason, and writes it back to the same register in order to clear the interrupts.
After fixing that code it turned out that the communication was still unsuccessful. Apparently the USB device was not understanding the host for some reason. That should not happen since the request sent was one of the standard ones implemented by virtually anything with an USB connector, assumed that Poseidon clears the data caches before forwarding the work to the USB drivers but that's the responsibility of the driver itself.
The USB device responded and acknowledged the transmission! But why were all the request sent after address change failing with timeout? They should not. Once again, address set is supported just by anything. Tried to contact the device at address 0 once again and there it was, still responding properly. The enlightenment came. The bus address for DMA transmissions was, as it is in many bare metal USB implementations, just the pure memory address of the buffer as seen by the ARM cpu. Have "prefixed" it with the real location of uncached RAM and booted AROS once again.
Trident saw this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
and this:
Product : Vendor: Vdr=0424/PID=EC00
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 255
SubClass : 0
DevProto : 1
VendorID : 1060
ProductID : 60416
DevVers : 0200
and even this:
Product : Hub: Vdr=0424/PID=9514
Manufacturer: Standard Microsystems Corp.
SerialNumber: n/a
/Users/michal/git/AROS/rom/USB/poseidon/./poseidon.library.c:psd_20_psdEnumerateDevice/3092: USBVersion: 0200
Class : 9
SubClass : 0
DevProto : 2
VendorID : 1060
ProductID : 38164
DevVers : 0200
What are these things? The first one is USB hub built in the Raspberry. Thanks to this one the Pi machines (with exception of Pi0 and computing modules) have more than just one single USB port. The second one is the network chip in raspberry, the third one is my USB SD card reader which have just connected to see what happens. AROS tried, of course, to boot from it ;)
So, the first step towards working USB is done. The control transfers are working as you can see above. Next step is to implement bulk and interrupt transfers, having the basics in place. Finally some error handling will be added and USB for Pi will be as complete as the PC version.
[http://www.raspyfi.com/raspberry-pi-usb-audio-fix/ Issue with USB Audio]
Audio
The Pi 4B is the only Pi that can output HD Audio as an HD Audio passthrough bitstream, and it does it over HDMI. It's possible to use the two HDMI output for separate HDMI video and HDMI audio outputs to allow UHD HDR video and HD Audio with non-UHD HDR compatible AVRs.
The Pi3B+ and earlier will decode to PCM 5.1/7.1 and output over HDMI. HDMI is the only interconnect that has a standard for carrying Dolby True HD, DTS HD MA etc. as a bitstream - you can't carry it as a bitstream on any other interface.
Pi3 and Pi4 audio jack output derived from 12bit pulse width modulation is relatively poor. For better, choose USB Audio or I2C versions.
[https://github.com/raspberrypi/linux/tree/rpi-patches/sound/arm audio] and its [https://github.com/raspberrypi/firmware/issues/2 very high speed message passing interface type of thing VCHI]
The Model B+ added an additional voltage regulator for the audio output and an additional output driver to drive low-resistance loads like headphones. However it is still using pulse-width modulation (PWM), which has a major impact on sound quality
the old Raspberry Pi used a linear voltage regulator to provide the 3.3V to many of the components on the board while the new one uses a switching regulator. Both can perform reasonably well. However switch mode power supplies often show higher noise figures
Analogue audio
Audio over HDMI rev 1.3 & 1.4
Ethernet
10/100 BaseT Ethernet RJ45 socket
GPIO
GPIO shouldn't be too bad but bear in mind it is already accessed in places so they would need to allocate pins etc through it (e.g. sdcard to flicker the activity light, serial debug to output data on the GPIO pins)
Probably a resource rather than a device...
Started an i2c driver that will need to allocate GPIO pins. Feel free to work on it if you are interested ;p
GPU graphics with 2D and 3D acceleration
Sadly none yet for 32bit but for 64bit...
Miscellanous
hdmi issues
Setting the hdmi_force_hotplug=1 makes sure the Pi believes the monitor/TV is really there.
You might also need to set config_hdmi_boost=4 or even higher (up to 9) if your display needs a stronger signal.
If the display is a computer monitor or newer tv, use hdmi_group=1 (auto HDMI use) and if it is an older TV, try hdmi_group=2 (for DMT formats, i.e. for PC monitors) then you HAVE to "set hdmi_drive = 2 to enable HDMI output as this forces HDMI mode rather than DVI mode
Do not set hdmi_safe=1 as that overrides many of the previous options.
Using a shorter or better quality HDMI cable might help. Make sure your Pi's power supply delivers 1 A and not 500 mA.
If you see a problem with the red colour - either absent, or interference - then try a boost
composite video
changing the RCA cable, then the composite port worked out of the box
Boot it as you are doing, without HDMI. If you now plug in the HDMI, do you get the image? In other words, does the Pi think HDMI is connected even when it isn't?
Rename all the files in the first partion of the card except bootcode.bin, start.elf and fixup.dat What's the result?
Put back config.txt What's the result?
for PAL mode sdtv_mode=2
dmi_ignore_hotplug Pretends HDMI hotplug signal is not asserted so it appears a HDMI display is not attached
hdmi_ignore_hotplug=1 Use composite mode even if HDMI monitor is detected
<pre>
# NOOBS Auto-generated Settings:
#hdmi_force_hotplug=1
#config_hdmi_boost=4
#overscan_left=24
#overscan_right=24
#overscan_top=16
#overscan_bottom=16
#disable_overscan=0
start_x=1
gpu_mem=128
</pre>
tvservice -c "PAL 4:3"
<pre>
/opt/vc/bin/tvservice -s or tvservice -s
state: HPD high|HDMI mode|HDCP off|composite off (0x12001a), 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m CEA
Group CEA has 1 modes:
(native) mode 16: 1920x1080 @ 60 Hz, progressive
/opt/vc/bin/tvservice -m DMT
Group DMT has 0 modes:
</pre>
sudo amixer cset numid=3 1
forces the audio to the headphone jack, even with the HDMI video output plugged in
config.txt
the hdmi_ignore_edid_audio=1 option sems relevant as it should tell ALSA that the only available audio is analog, no matter what the display says
There are several different ways that these 4 pole (ring) composite analog cables can be wired up, so some work great in some applications and can be a waste of time in others.
What is needed for the Raspberry Pi B+ and above, which like many camcorders needs the ring contact next to the base contact to be the ground.
The wiring for the 4 pole are:
TIP (LEFT AUDIO CHANNEL)
RING 1 (RIGHT AUDIO CHANNEL)
RING 2 (GROUND/EARTH)
RING 3 BASE/SLEEVE (VIDEO) YELLOW
Most Apple based Players and the Microsoft Zune (TM) are wired this way.
Most analogue camcorders are wired this way as well, where the ground in on Ring 2 will work with the Pi although you may need to swap your Video plug with the Right Audio plug.
Nearly all other MP3 players are not wired this way, the ground is on another ring ie the wrong one.
External devices
* Camera Module Omnivision ov5647 Sunny 5MP (NoIR version) V1.3 - NoIR at 850 nm, peak at 880 nm and trails off at 940 nm wavelengths
* Camera V2 Sony IMX219 V2.1 8mpixel 8MP 8megapixel - 3280 x 2464 pixels - video at 1080p30, 720p60 and 640x480p90 - wider field of view, 62 vs 54 degrees horizontally -
* Branded WIFI usb BCM43143 dongle
N.B. dreaded error after changing cameras (stupidly without turning off the power first) and lasted through several power cycles. It can be a bad 15-pin FFC ribbon cable, when swapped, camera(s) and the Pi itself are working OK. It can be an instance of a cold solder joint on the CSI connector on the pi board. the camera can be detected (that's done via I2C) but may still not be able to receive image data (done via CSI-2) if something is broken. CSI-2 is uni-directional. Control is generally done via I2C.
The CSI-2 receiver always writes to memory, not direct to the ISP. That's the way the Broadcom architecture works as it allows multipass processing easily. GPU memory is accessible from the ARM. Processing using the QPU graphics processors may be possible. currently the only supported sensor is OV5647 and IMX219. The linux drivers are all in the firmware blob, else you'd be looking at at least a man-month of work in a fully fledged imaging lab to do a decent tuning of the camera modules' ISP parameters.
Static electricity maybe an issue for the camera module and slightly less for the pi board.
== References ==
===Good sites to visit===
*[https://github.com/raspberrypi/firmware/tree/master/ Raspberry Pi Firmware build]
*[https://www.raspberrypi.com/documentation/computers/software-sources.html Documentation]
*[https://rpilocator.com/ RPiLocator]
Linux only
*[https://github.com/raspberrypi/linux Raspberry Pi Linux Build]
*[https://dietpi.com/ DietPi]
*[http://www.tinycorelinux.net/ports.html piCore]
*[https://wiki.alpinelinux.org/wiki/Raspberry_Pi Alpine Linux]
*[https://github.com/armbian/build Armbian]
*[ FydeOS]
*[ TwisterOS based on ChromiumOS]
*[https://note.com/jamesmondo/n/nc76e31402be8?hl=en BSD]
*[https://www.raspberrypi.com/software/operating-systems/ PiOS Lite] and then [https://hstwb.firstrealize.com/ HST]
*[ PiMiga for pi4 and pi5]
*[ amibian for pi2 and pi3]
*[ retropie pi1 and 2]
Other alternative lighter smaller than Pi OS
*[https://aros.sourceforge.io/nightly1.html Aros 64bit ARMV8 single core]
*[https://www.riscosopen.org/wiki/documentation/show/Welcome%20to%20RISC%20OS%20Pi RiscOS on Pi3 and Pi4]
*[https://github.com/michalsc/Emu68 ARM based realtime JIT 68k for amiga computers]
*[https://github.com/JJDSNT/bellatrix/releases/ Alternative use of Emu68 on Pi3b]
*[https://github.com/stevereaver/uaos uaOS with Emu68k]
*[https://github.com/aros-development-team/AROS/commit/f80a268607dfae81b2db94755ab4e4d31ccb72d6 m68kemu library reference]
*[ HaikuOS]
*[https://github.com/raspberrypi/noobs NOOBS] os loader with successor [https://github.com/procount/pinn PINN]
*[https://github.com/maxnet/berryboot berryboot]
*[https://github.com/brianwiddas/pi-baremetal Bare Metal Access on Pi 32bit]
Testing procedure is put sd card in, connect board to board if necessary, plug in hdmi and then power nothing else is done especially CSI DSI etc
[https://www.raspberrypi.com/documentation/computers/compute-module.html CM5] has the same 55mm x 40mm 2x100pin connectors form factor as the CM4 but [https://www.epdtonthenet.net/article/214508/Key-Considerations-When-Migrating-from-Raspberry-Pi-CM4-to-CM5.aspx some pins and other small things] have changed. Will need the [https://raspipcb.com/tech-blog/raspberry-pi-cm4-vs-cm5-difference-in-booting-from-sd-card/ right IO board to suit]
*Green [ Raspberry Pi Compute Module 5 IO Board REV2 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1967]] - untested
*Green [ RPi Compute Module 5 IO board REV1 [https://pip.raspberrypi.com/categories/1097-raspberry-pi-compute-module-5-io-board SC1751]] - untested
*Black SupTronics Geekbord X1500 CM5 IO Carrier Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*[https://sipeed.com/nanocluster Sipeed NanoCluster] - untested up to 7 CM5
*Green BentoIO CMX0 - untested
*Box EDATec ED-CLAWBOX - untested
*Home Assistant Yellow - Kit with PoE with Raspberry Pi Compute Module 5 - untested
*Blue [https://www.waveshare.com/wiki/CM5_PoE_BASE_A Waveshare CM5-PoE-BASE-A] - untested
*Box Waveshare [ CM5-POE-BOX-A] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-B Waveshare CM5-IO-BASE-B] - untested
*Blue [https://www.waveshare.com/wiki/CM5-IO-BASE-A Waveshare CM5-IO-BASE-A] - untested
*Blue Waveshare [https://www.waveshare.com/wiki/CM5-NANO-B CM5-NANO-B] - untested
*[https://carboncomputers.us/products/pi-flux piFlux]
*[https://carboncomputers.us/products/ Zitaotech Hackberry] CM5 lite only -
*Portable [https://www.waveshare.com/pocketterm35.htm Waveshare PocketTerm35] with Pi4B or Pi5 - untested
*Box [https://www.clockworkpi.com/uconsole ClockworkPi uConsole][https://www.youtube.com/watch?v=EtI_bAahbR8 CM4 into an adapter or CM3 into so-dimm - Cyberdeck] - untested
*Green RPi [https://datasheets.raspberrypi.com/cm4io/CM4IO-KiCAD.zip Compute Module 4] [https://datasheets.raspberrypi.com/cm4io/cm4io-datasheet.pdf IO board] V1.4 [https://datasheets.raspberrypi.com/cm4io/CM4IOUSB3-KiCAD.zip USB3] [https://datasheets.raspberrypi.com/cm4io/cm4iousb3-appnote.pdf CM4ISO] [https://datasheets.raspberrypi.com/cm4/cm4-datasheet.pdf Dual100pin] (2020) aka Development Platform Board - untested
*Purple Pi Hut Cytron CM4 Maker Board - untested
*Black DeskPi Super6C Cluster Mini-ITX Board - untested
*[ KubeSail PiBox mini 2]
*Home Assistant Yellow with Raspberry Pi Compute Module 4 - untested
*[ Turing Pi V2] - untested CM4 with 260-pin SO-DIMM socket adapters and/or nvidia jetson nanos - untested
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-C Waveshare CM4-IO-BASE-C] - untested but binary blobs Rev01 Rev02
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-B Waveshare CM4-IO-BASE-B] - untested but binary blobs
*Blue [https://www.waveshare.com/wiki/CM4-IO-BASE-A Waveshare CM4-IO-BASE-A] - untested but binary blobs
*Blue [https://www.waveshare.com/wiki/CM4-NANO-B Waveshare CM4-NANO] - untested but usb and audio turned off or rerouted
*Black [ Seeed Studio with BigTreeTech BTT pad 7] - bin blobs?
CM3 has a 200 pin sodimm ddr2 connector form factor but not electrically SC0028, SC0029
*Blue [https://wiki.geekworm.com/CM_IO_Board Geekworm RPi Compute Module IO Board] [https://github.com/geekworm-com/cm-io-board CSI DSI] with CM3 in ddr2 slot underside - '''works''' if SW1 on but CM3+ '''does not'''
*Green [https://cdn-shop.adafruit.com/product-files/3442/CMIO_schematic.pdf RPi V3 IO board CM3IO] and CM3 Lite - untested
*Green [https://turingpi.com/ turingpi v1 cluster] - untested up to 7 cm3 7xlan9514 12V discontinued, 3 x Pi4 homelab maybe better
*Blue [https://www.waveshare.com/wiki/Compute_Module_PoE_Board Waveshare Compute Module PoE Board] and CM3 lite (if not lite, write files to internal eMMC fat32) '''AVOID''' bin blobs
*Blue [https://www.waveshare.com/compute-module-io-board-plus.htm Waveshare Compute Module IO Board Plus] [https://www.waveshare.com/wiki/Compute_Module_IO_Board_Plus wiki] [https://forums.raspberrypi.com/viewtopic.php?t=235695 pin settings] with CM3+ Lite - '''AVOID''' binary blob
*[ Pi02w on Geekworm SupTronics X305 Raspberry Pi Zero IO Baseboard] - untested
*[ Spotpear Pi Zero 2w to Pi3b format-ish] - untested
*[ pi-top v4] box has 128x64 oled display, micro hdmi, 19Whr battery with pi4 and 15V PD 36W min needed
*[ pi-top v3] three green pieces, heatsink covers most of the base tray, pi-top hub mk1 lhs and Pi1B Pi2b Pi3b rhs secured from below, black rounded strip with pi-top above keyboard, 13.3" HD 1366 x 768 display, small touchpad,
*[ pi-top Model 2.0] pi-top on bottom bezel of 14-inch green laptop, large trackpad, keyboard slide down to reveal main system hub on slide rails moved to the right, Raspberry Pi3b screws down, hub slides in, 18V 2.5A 45W charger brick, battery 11.1V 3500mAh 38.85Wh and storage PiTopOS
*[ Pi-Top CEED Raspberry Pi Modular Educational Desktop with RPI3] monitor
*[https://www.indiegogo.com/en/projects/jesselozano/pi-top-a-raspberry-pi-laptop-you-build-yourself Pi-Top v1] wedge laptop with RPi2
<pre>
2008 Trustees collected for Foundation
2009 Pi Foundation charity status gained
2010
2011 First Raspberry prototypes
2012 First boards go on sale at CPC and RS. The Model A and B 700 MHz Arm11 - February 29th BCM 2835
2012 First million sold - more than the 10,000 original planned and anticipated
2013 First Alpha Experimental builds of AROS Native for the 32bit Pi
2013 Pi Trading launched making grants available, providing in house educational resources and Pi Academy for teacher training
2013 Over two million sold
2014 Over three million sold
2014 Pi 1 Model B+ introduced that moved composite video to audio jack and same half gig of memory
2014 Pi Model A+ v1.1 no ethernet and 1 usb - a little smaller -
2015 Over four million first gen pis sold
2015 Pi Zero 1.2 BCM2835 first production revision released with no camera port
2016 Pi0 1.3 released with camera csi connector
2017 Pi Zero W v1.1 1GHz Pi0W, single-core 32bit CPU BCM2835 released with Cypress CYW43438 wireless
2020 Raspberry Pi Pico SC0919 with RP2040 32-bit 2Core ARM Cortex-M0+ up to 133 MHz - 264KB of SRAM and 2MB of on-board QSPI Flash -
2024 Raspberry Pi Pico 2 with RP2350 2Core 32bit Arm Cortex-M33 and 2core open-hardware [https://github.com/wren6991/hazard3 Hazard3 RISC-V]
2015 Pi 2 Model B v1.1 BCM2836 900/600 MHz ARM Cortex-A7 Armv7 quad 32bit, 32bit VideoCore IV GPU - 1Gb RAM - 5V 2A micro usb - SMSC LAN9514 chip -
2015 Over a million pi2s sold
2015 Raspberry Pi 2 Model B version 1.2 Pi2bv1.2, aka Pi2B2 has armv8 BCM2837 underclocked to 900Mhz without wifi/bluetooth module
2016 Pi 3 Model B - Broadcom BCM2837 SOC four 64bit ARMv8 Cortex-A53 1.2GHz 32bit 1080p VideoCore IV GPU - 1Gb DDR2 - bluetooth 4.1, Cypress CYW43438 wireless 802.11n - 4 x USB2.0 ports - 5.1V 2.5A - SMSC LAN9514 chip
2016 PIs total over 10 million worldwide
2017 Compute Module 3 CM3 with BCM2837B0 armv8 Quad 64-bit - small 67.6mm x 31mm board which fits DDR2 SODIMM connector but not electrically compatible which plugs into needed IO board - beware of the I2C protocol issue
1Gb LPDDR2 RAM - Lite or 4Gb Emmc storage
2017 12 million pis sold in total
2018 Pi 3 Model B+ - 4c A53 BCM2837B0 1.4Ghz - 1Gb, wireless 802.11ac, gigabit ethernet (300Mbit/s) and bluetooth 4.2 - power over ethernet - 4 x USB2.0 ports - Microchip LAN7515 chip
2019 Over 15 million sold
2019 Pi 3 Model A+ with BCM2837b0 Cortex-A53 64-bit SoC @ 1.4 GHz with 512Mb LPDDR2, 1 usb2, 1 hdmi, 1 micro usb 5V 2A - no ethernet -
2019 Raspberry Pi Compute Module 3+ CM3+ - Broadcom BCM2837B0 1.2Ghz, Cortex-A53 (ARMv8) 64-bit SoC on DDR2 SODIMM mechanically compatible only factor - IO board required
1Gb DDR2 and 8GB, 16GB, 32GB or a Lite variant without eMMC
2021 Pi zero 2 (w or no W) RP3A0 quad 1GHz Cortex-A53 64bit BCM2710A1 512mB SDRam
2025 edaTEC CM0 ED-CM0NANA with additional dev board with quad 1Ghz A53 with 512Mb Raysan RAM, 2 USB2 and 10/100 ethernet - pico castellated edge
2019 Pi 4 Model B v1.1 RPI4B - BCM2711B0T quad 64bit A72 1.5GHz, 4K VideoCore VI, AC wifi, Bluetooth 5.0, GbE Broadcom BCM54213PE (PHY ID 0x600d84a2), 2 micro hdmi decode up to 4K, USB-C 5.1V 3A power, 2xVLI VL805 USB 3, 2xUSB 2.0, 2GB 9LDWW D9WHZ or 4GB 9FDWW D9WHV, 8GB 0AA47 D9ZCL ddr4 ram
2020 Silent Pi 4 v1.2 upgrade with more USB-c psu support
2020 PI400 BCM2711C0T 1.8GHz 4Gb DDR4 inside keyboard, 5.1V 5A 27W usb-c psu, 2 micro hdmi, external ide style 40pin gpio, no audio port -
2020 Raspberry Pi Compute Module 4 BCM2711B0T on new 55mm x 40mm 2x100 pin form factor with extra breakout IO board
CM4101000 1Gb RAM Lite SOM
CM4102000 2GB RAM Lite
CM4104000 4GB RAM Lite
CM4004008-4GB-RAM 8GB-EMMC SOM System on Modules
CM4104032 4GB RAM 32GB emmc
CM4108000 8GB RAM Lite
CM4008016 8GB RAM 16Gb eMMc
2021 Raspberry Pi SC0763 Compute Module 4S CM4S with ddr2 sodimm pinouts but not electrically the same with suitable IO board extra cost -
CM4S01000 1GB RAM Lite
CM4S01008 1GB RAM 8GB eMMC Flash
CM4S02000 2GB RAM Lite
CM4S04000 4GB RAM Lite
CM4S04016 4GB RAM 16Gb KLMAG1JETD-B041
CM4S08000 8GB RAM Lite
2021 Pi 4 v1.4 BCM2711B1 upgraded power regulator, to deal with 8gig of ram being more power hungry
2021-48 Raspberry Pi 4 model B v1.5 2GB
2023 Pi 5 v1.0 BCM2712 Quad A76 @2.4Ghz - VideoCore VII - no audio socket - dual 4k from mini hdmi - fan connector - 5.1V 5A psu
2024 Pi 5 2GB DDR4 version uses BCM2712D0
2024 Pi-500 with 8Gb LPDDR5 and membrane keyboard
2024 Pi 5 v1.1
2024 Raspberry Pi Compute Module 5 CM5 BCM2712 55mm x 40mm form factor with additional IO board
CM5004000 04GB RAM 0GB eMMC Lite
CM5008000 08GB RAM 0GB eMMC Lite
CM5016000 16GB RAM 0GB eMMC Lite
2025 Pi-500+ with 256GB NVMe storage, 16GB LPDDR4 RAM, and Gateron KS-33 Low Profile Blue mechanical keyboard switches
2025 Pi5 1GB DDR4 announced
2022 PiOS linux goes 64bit
2024 Pi Trading IPO stockmarket stock exchange listing
2026 April and May Aros 64bit fixed, added AHI audio, VC4 gfx started, usb functions added to rom
2026 June and July Aros 64bit usb2otg started, dma.resource, sdio.resource, bwfm.device wifi added
2026 Late July daily 64bit Pi3 LE little endian builds start
2026 August Pi 4, 400, 5 and 500 DTBs added, expanding existing support and wifi for Pi4 and Pi5
2026 August Pi5 HAT+ nvme and HDMI, AHI RPiI2S added, Pi4 HVS5 video scaler started,
2026
2027
2028 Pi 6
</pre>
The vcgencmd can be used to inspect and dump the current system configuration.
vcgencmd runs on top of VCHIQ as an RPC. The mailbox interface is an alternate but much simpler RPC.
VCHIQ is a bridge (queue) between the CPU and the GPU so they can communicate with the firmware.
Loads of [https://github.com/6by9/rpi3-gpiovirtbuf/blob/master/rpi3-gpiovirtbuf.c mailbox] which uses the GPIO control calls. [https://github.com/raspberrypi/firmware/wiki/Mailboxes may also be of interest]
A fair number of vcgencmd examples (search for vc_vchi_gencmd_init). [https://www.raspberrypi.org/forums/viewtopic.php?t=229203#p1406112 sends the relevant vcgencmd commands] to update the scaling kernel, but the [https://github.com/raspberrypi/userland/blob/master/host_applications/linux/apps/gencmd/gencmd.c command] is just a text string. Parsing and execution of the instructions is performed by the VideoCore firmware.
The Raspberry Pi runs two separate operating systems: Linux/Aros on the ARM, and a threedx RTOS called vcos running on the Videocore 4 VPU: vcos is commonly called "the firmware". Vcos is tasked with performing certain system services, for example running the display and audio outputs. The VCHI driver provides an interface to allow drivers to talk to vcos.
Doubtful, on any [https://www.web3d.org/ Web3d] [https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API WebGL] or [https://github.com/immersive-web/webxr WebXR] [https://developer.mozilla.org/en-US/docs/Web/API/WebXR_Device_API Device API] [https://developer.mozilla.org/en-US/docs/Web/API/XRInputSource XRInputSource] support. Hopefully, never/limited support features like location, peer-to-peer, invasive web apps, unwarranted storage, payments, proprietary video streaming etc
*spreadsheet [https://git.sheetjs.com/sheetjs/sheetjs sheetjs] [https://github.com/mleibman/SlickGrid SlickGrid javascript] [https://github.com/6pac/SlickGrid SlickGrid typescript] [https://github.com/jspreadsheet/ce jspreadsheet ce] probably without xlsx support
*presentations [https://github.com/impress/impress.js/ impress.js simplified] [https://github.com/bwlewis/slides slides] [https://zenomt.github.io/mdslides/ github markdown slides] [https://github.com/Patternslib/slides Patternslib slides markdown] probably without pptx support
*ai office [https://github.com/dream-num/univer/ univer], [https://github.com/dream-num/Luckysheet Luckysheet] [https://github.com/ruilisi/fortune-sheet fortune-sheet]
*weather [https://github.com/Himanshu3412/Weather-Forecast Weather Forecast], [https://github.com/kaushalsahu07/weather weather needs API key],
==Future==
[https://github.com/ARMSX2/ARMSX2 Arm pi of pcsx2]
[https://tube.cadence.moe/ Cloudtube], [https://github.com/TeamPiped/documentation/blob/main/content/docs/public-instances/index.md TeamPiped], [], [], [],
[https://hyperpipe.codeberg.page/ hyperpipe], [https://ytify.pp.ua/ ytify], [], [],
[ ytdl], [https://github.com/golddominik893/liberatube liberatube]
[https://git.lolcat.ca/lolcat/4get 4get], [https://github.com/hnhx/librex librex], [], [],
{{BookCat}}
lbfe5op6lapohxn3x8vgtav7wk2n380
Seed Factories/Introduction
0
288346
4676730
4676492
2026-10-18T10:44:22Z
Danielravennest
13526
/* 5.0- Design Examples */ Update to end
4676730
wikitext
text/x-wiki
{{DISPLAYTITLE:<span style="display:block;text-align:left;font-size:100%;background:#d0f0f0;line-height:2.5em; font-family:'Georgia', serif;">Chapter 1.0 - Introduction</span>}}
<div class="nonumtoc">{{TOCright}}</div>
<div style="font-size:125%; font-family:'Georgia', serif;">
 In engineering, a '''[[w:System|System]]''' is a group of related elements that act by rules to form a whole. Systems are distinct entities with boundaries, surrounded by their environment. They are defined for purposes like understanding, analysis, design, and improvement. Systems can include people, and any other kinds of elements.
 Systems have characteristics of interest, such as quality of life, size, emissions, and output rate. Their change in a desired direction is considered an improvement. Self-improvement is when the change is produced by internal action of the system. It has occurred throughout history in many ways, such the as evolution of life, and the development of civilization.
 Through history, large-scale systems like cities have grown, and made major improvements to themselves. But intentional design for growth and self-improvement has been rare. Designing from the start to avoid side effects like environmental damage and pollution is even rarer. We think future changes to existing systems, and newly made ones, should include such design features. So these volumes are mostly future-oriented, describing types of projects that haven't been done before, and for which few people have experience with. This is in comparison to mature fields like '''[[w:Civil_engineering|Civil Engineering]]''', where there are many past examples of construction projects, and many people with skills and experience in developing them. However the new features are in addition to the knowledge and experience from more mature fields, not a replacement.
==<span style="font-size:x-large; font-family:'Georgia', serif;">1.0 - Volume Overview</span>==
 
 Note that both volumes in this set are incomplete works-in-progress. They present work we have done so far, but are far from finished. Longer chapters are divided into numbered pages, and pages divided into sections and subsections for easier cross-reference.
 In this volume we consider self-improvement generally, and a particular example called a '''Seed Factory'''. This is a system that includes a starter set of equipment intentionally designed to improve by a repeating process:
 Part of the factory's capacity is used to make more or better equipment for the factory itself. The remaining capacity is used to make useful products, like any other factory. The fraction used for self-improvement can vary over time, according to whatever goals the factory operators choose. The added equipment increases the ability to make the next round of equipment and further improve. Output capacity increases as you add more equipment. So if a significant fraction of output is devoted to improvement then total capacity can grow exponentially. This idea matters because civilization faces a number of large-scale problems which can only be addressed by large-scale solutions. Exponentially growing systems can provide the necessary scale.
 This Chapter (1.0) introduces some of the problems, how the systems engineering method can be used to develop solutions, and some examples of self-improving designs we will detail later.
 '''[https://en.wikibooks.org/wiki/Seed_Factories/History Chapter 2]''' discusses the history of self-improvement in nature and in human civilization, and how those led to the problems we face. We then look at self-improvement as an idea. It is closely related to other ideas like progress and economic development. More recently, ideas like self-replicating systems, and technologies like computers and automation, have led to the concept of a seed factory as an instance of self-improvement. It is still a fairly new approach, so Chapter 2 finishes with what we don't know about it yet, and areas for further research and development.
 If new systems are going to address current problems, and not create new ones as a result, they need to be carefully planned and designed before building and operating them. Engineering is already a well-developed field, so we will not cover all of what already exists. Instead, the next two chapters cover what is new in our approach from a technical engineering standpoint. Note that small and simple projects and systems with minimal side effects don't need much planning and design. There are existing tools, machines, supplies, plans, instructions, and people with experience to carry them out.
 '''[https://en.wikibooks.org/wiki/Seed_Factories/Basics Chapter 3]''' presents new design elements to include in the design process. This includes the current state of the seed factory idea, the pieces which make it up, and a reference architecture for system designs.
 '''[https://en.wikibooks.org/wiki/Seed_Factories/Design Chapter 4]''' discusses the design process itself. A constantly growing and improving system is complicated. So we apply the "systems engineering" approach which was developed to handle such complex projects. A complete system includes more than just factory equipment, but if it is intended to grow and self-improve it will use a number of production processes and equipment types. So we provide a reference list of many of the available options as inputs to the design process.
 '''Chapters 5 through 8''' are a series of design examples for use on Earth. The series is linked by the fact that one example can grow into or produce starter sets for later ones. The examples are intended to show how a design is developed, and also serve as a reference for building and operating them.
 The last chapter (9.0) of this volume is a set of notes that are too new or don't fit into the main discussion. It also serves as part of our project database.
 Space beyond Earth is of interest because of larger available resources and the potential to reduce or even reverse unwanted side effects on Earth. The environments and distances of regions in space are typically more extreme and larger compared to those on Earth. In addition, objects in space are all in fairly fast motion relative to Earth and each other compared to motions on Earth. So a second '''[https://en.wikibooks.org/wiki/Space_Transport_and_Engineering_Methods Volume II]''' addresses these differences. It begins with the relevant science and engineering methods that apply to space projects. We then continue the series of design examples for various space regions. For each region we summarize local conditions and available resources. These will affect how systems are designed for each.
 Space projects are presented in general order of distance from Earth and in difficulty from easier to harder. Since the first set of people and equipment must come from Earth, this is the approximate order projects in each region would get started. Also later and more difficult regions will be able get support both from Earth and previously developed regions.
==<span style="font-size:x-large; font-family:'Georgia', serif;">2.0 - Some Problems Facing Civilization</span>==
 
 These are engineering-oriented books. Engineering in general involves applying knowledge towards useful ends, such as satisfying people's needs, solving problems, or making life better. If seed factories are to be more than just an interesting idea, they should be developed with such useful purposes in mind. Here we identify some current and future problems facing civilization. This is by no means a complete list. Rather, they are problems we think worth solving, and could be addressed by technical solutions. The ideas and methods in these books can then be applied with these problems in mind.
:'''Insufficient Development'''
 Many places where people live have less of the artifacts and systems of civilization, and the benefits they bring, relative to intensely developed areas like large high-income cities. Even in the most developed areas it would be difficult to find people perfectly satisfied with their current situation. They can usually list a number of things they would like to improve, if only they had more time, money, or other resources. There is no shortage of desire for improvements. What is lacking are the means to make them happen. This is particularly true in difficult or hostile environments, where the extra work required has left them nearly or entirely undeveloped.
 In addition to uneven development, even the most developed areas have an uneven distribution of resources. Those who have the least lead a precarious existence, where any adverse event can seriously degrade their lives. So in addition to general development, we would like to enable backup systems, reserves, and other buffers against adversity.
:'''A Deteriorating Environment'''
 A healthy environment is necessary for us to live on Earth. But side effects of our current civilization have led to changes for the worse. Probably the most pressing environmental problem is excess carbon dioxide (CO<sub>2</sub>) leading to climate change. Others include deforestation, desertification, species extinction, and various kinds of pollution, like airborne particulates and micro-plastics. In the future we would like to minimize, eliminate, or reverse these side effects and the changes for the worse they have caused.
:'''Technological Unemployment'''
 Recent centuries have seen accelerating replacement of manual labor with powered equipment. This produced a shift from farming, which used to be people's main activity, to manufacturing and services. Continued improvements have reduced manufacturing labor, to where services are now the dominant activity in developed areas. Since about the mid-20th century, technologies like automation, robotics, software, and artificial intelligence have enabled "Smart Tools". These have an increasing ability to work on their own, replacing much of the remaining labor.
 Our modern economic system is based on people trading their specialized labor for money, then trading money for the other things they need and want. If most labor can be replaced by smarter tools, we get the problem of technological unemployment. The unemployed can no longer buy what they need, and the still-employed lose them as customers. The system of trading work for money and then money for other goods breaks down.
 This is not yet a severe problem. Through history, people displaced from one kind of work have found something else to do, and the changes were slow enough that young people could start in the new fields while older people aged out the old ones. But the recent advances in smart tools threaten to displace many jobs in fields like transportation, distribution, and retail in a short period of time. The displaced workers may not be able to find new jobs in other fields. It is worth thinking about how to deal with this potential problem ''before'' it becomes severe and we are faced with mass unemployment.
==<span style="font-size:x-large; font-family:'Georgia', serif;">3.0 - How to Tackle These Problems?</span>==
 
 Our civilization, and the parts that make it up, are very complex systems. A method called '''Systems Engineering''' was developed in the 20th century to deal with such systems. We propose to use it to address the problems noted above. The systems approach starts by defining the unmet needs which one or more systems are intended to satisfy. For existing systems this is in terms of what changes are needed. Identifying what is wanted comes before any consideration of designs or solutions. Having the answer in mind before stating the problem prematurely limits considering all the options. Goals should also not be limited by what is thought to be possible now. Partly meeting the goals, and identifying what research or improvements are needed for the rest is better than limiting our goals and going no further.
 We identified some problems in a general way above. For the systems approach we need to specify what we want more exactly. That way we can measure how well proposed designs or solutions meet the goals, which ones are better or worse, and in what direction to make improvements. We will start specifying wants here, and continue the systems process in later sections. Since civilization already exists, these statements are in terms of changes. The goal statements (in bold face) are followed by some explanations.
:'''(1) Bring less-developed parts of civilization up to [TBD] level of satisfaction with their situation, given sufficient information about their options. Increase satisfaction in more developed areas by [TBD] and provide means to deal with adverse events.''' - TBD means "to be determined". We haven't defined how to measure satisfaction levels yet. We know we want some kind of measure for it, so we use [TBD] as a marker for later work to fill in. Significant numbers of people lack education and information on what is possible, and therefore can't know what they would want if they had that knowledge. Supplying them with that knowledge so they can choose is part of the goal. Satisfaction with the current state of things is not enough if something bad happens, so we also want to be able to handle adversity.
:'''(2) Reverse human-caused environmental problems by [TBD] percent while minimizing side effects. To the extent possible, also minimize natural risks.''' - All human activities have side effects, so we can never entirely eliminate them. The goal is then to minimize them, and make them less harmful. The natural world also presents many hazards, like hurricanes and earthquakes. We can't eliminate these hazards either, but we can minimize the damage they cause.
:'''(3) Avoid or minimize future problems, such as technological unemployment.''' - Permanently displaced workers due to automation is one problem we already identified. There may be others we want to deal with ahead of time. Part of the goal is to identify them.
==<span style="font-size:x-large; font-family:'Georgia', serif;">4.0 - Systems and the Systems Engineering Method</span>==
 
 A "System" is any collection of elements which interact with each other and the outside world, and performs some identifiable function or transformation. For example, a computer system such as a desktop personal computer or smartphone allows you to read this document on Wikibooks. It contains elements like a power supply, semiconductor chips, and software that work together. It interacts with you as the reader, and the Internet to access this page. If you were editing this page, you would be transforming it from one version to the next.
 We define systems to help with understanding, analysis, design, and improvement, and to help meet intended goals. Every system has a boundary. This is a mental construct rather than a wall or a fence. It separates the system from what is outside the system. In general the parts of a system are related in some way, and perform an identifiable function. Sometimes system boundaries are natural and obvious, such as an airplane vs everything outside the airplane. Other times system boundaries and their contents are arbitrary and in multiple pieces and places. Defining them can still be helpful in working on a project.
 A wide variety of things can cross the system boundary, and thus enter or leave the system. For example, a factory system can take in raw materials and power as inputs, and deliver finished products and various kinds of wastes as outputs. The physical sciences tell us matter and energy can't spontaneously appear or disappear, only change form. So mathematically, the change in the contents of a system equals the flows entering the system minus the flows leaving.
 Systems can be any shape or size, and can contain other, smaller, systems. Smaller systems within a larger one are called '''Subsystems''', which can in turn contain even smaller subsystems, to any level of depth. The human mind can't comprehend the entirety of a large complex system. So a key method in systems engineering is to break up large systems into smaller subsystems and sub-sub-systems, until they are small enough and simple enough to understand, design, build, etc. The flows at every level must still equal the change in subsystem contents, so straightforward bookkeeping can ensure nothing has been forgotten or lost in the total system.
 Having identified problems and set goals, the next step is starting to identify potential solutions that can meet them. At the start, we don't know what the best approach will be. So typically multiple candidates will be proposed or formulated. Over time, most of these will be weeded out and optimized, until one or a few best options remain. Research and testing may be needed before the final choices are made. The details of the process are more fully covered in '''[https://en.wikibooks.org/wiki/Seed_Factories/Design Chapter 4.0 Design Process]'''.
 The premise of these two volumes is that seed factories and self-improving systems can be part of the solutions to the problems noted above. That needs to be proven, though, and not just assumed. The examples we present and analyze will help to do that, but they need to be put to actual use and shown to work as expected.
 Self-improvement is a design feature. It is not a complete solution by itself. System designs must also include and build on past experience in fields like '''[[w:Industrial_technology|Industrial Technology]]''', other '''[[w:Engineering|Engineering]]''' fields, and other parts of our accumulated human knowledge. Those other subjects will be referenced and included where appropriate.
==<span style="font-size:x-large; font-family:'Georgia', serif;">5.0- Design Examples</span>==
 
 Chapters 5 through 8 describe four types of self-improving production systems. Each is intended to help solve the problems and meet the goals noted above. How they do this is by using particular approaches and features in their design.
 The first problem is that of insufficient development in terms of modern artifacts and systems. In principle this can be resolved by producing and delivering the needed items. But that presents several secondary problems. People in low-income areas may lack funds to pay for such things. Even if they were donated, they may not have the skills and experience to operate and maintain them. A solution to both secondary problems is to bootstrap their own production from seed factory starter sets and their own labor. They will need less funds to build the factories if they self-build them, and they can then make the other finished products they want. The experience gained in building the factories and making the products will then enable them to operate and maintain them later.
 In more developed areas, there are still widespread shortages of time, money, or resources to make improvements and increase satisfaction. Our approach to this is self-improving systems with a high level of smart tools. Starter sets take less money, smart tools take less time to operate, and the production systems can produce their own energy and obtain material resources. Due to the higher level of complexity and skills needed, these systems would likely be developed as cooperative projects involving many people.
 The second problem is risk from environmental damage and natural events. A start towards solving it is education about these risks and what can be done to reduce them. New systems can be designed to incorporate renewable energy, avoid or recycle wastes, reduce pollution, and maintain natural habitats. These design features would be included in both finished products and the production systems that make them.
 The third gosl is addressing future problems before they become urgent. An early task is to identify what those problems might be, besides technological unemployment that we already identified. Then the systems approach would be used to identify solutions or preventive measures, and incorporate them into system designs. The unemployment problem could be addressed by production systems of the types in our examples. Their owner-builders receive a share of their output directly, regardless of how automated the systems are, or how much labor is needed for their operation. In other words, the production systems work for their owners, so the owners don't have to, or as much.
 The four examples in chapters 5 through 8 form a linked series of projects. One way to move through the series is by evolution. Enough improvements and growth can turn one example into the next. Another way is by setting up new seed factories for a later example. The various parts for new seed factories can be made by matured previous ones. A later example could also be started fresh by supplying equipment from elsewhere, or by some mixture of internal and outside sources. However they are started, the experience from earlier projects and their growth paths can be applied to later ones.
 The example systems are:
* '''[[Seed_Factories/Concept|Personal Production]] (Chapter 5)'''
 This example has the goal of making a range of basic products for a local community of owner/operators, such as food, building materials, and utilities. It is personal in the sense that products are made for their own use and for others in their community. It is not like a personal computer in having just one owner. It begins with a network of people interested in working together and conventional workshop tools. At first, production is at hobby and home-use scale. This keeps early costs within reach. To this they gradually add a starter set of seed machines. The combined collection is partly used to make more equipment, alongside the basic products.
 Later equipment is scaled in size to increase output, and more diverse to increase product range. The equipment eventually becomes too large for individuals to house, and too expensive for them to afford individually. The wider product range also becomes too complex for one person to have all the skills needed. The solution is building or acquiring larger and more dedicated production spaces, and have multiple owners with different skills who work together to make what is needed.
 There are two approaches to working together: distributed and centralized. In the distributed approach, each person owns one or a few pieces of equipment. A production request is then distributed as needed to the people and their equipment, who do their parts to make the product. In this approach, ways are needed to settle up the resources and costs in meeting each other's needs. In the centralized approach, the equipment is in one or a few larger places, with shared ownership. A mixed approach is also possible, part distributed and part centralized.
 As production grows beyond personal needs, the network can start to operate like a commercial workshop, building items for outside customers in addition to the local community. At the hobby and home-use scale, participation is mostly part-time, and the owners' main support is from conventional work. As production grows to commercial levels, some of the people can transition to full-time self-employment and have a large part of their physical needs supplied from within the network.
* '''[[Seed_Factories/WWF|The "Makernet"]] (Chapter 6)'''
 We define a '''Location''' as an area small enough that people can easily travel to work in person, and exchange products with each other. An example would be a US metropolitan area. In the Personal Production example, one location can then contain multiple home and dedicated sites where work is done. Since modern communications are worldwide, the network of people working together and exchanging items does not have to be restricted to a single location. So our second example extends the distributed approach to multiple locations in different parts of the world.
 Individual production sites are then network nodes that communicate by means such as personal contact and the Internet. We call it a "Makernet" because the network collectively makes things. Owner-operators and customers can communicate with each other by any available method, including electronically. Smart production machines can also communicate with each other directly, or be controlled by people and software remotely.
 Shipping physical items long distances involves significant cost, energy, and time. Therefore makernet production will tend to be concentrated on items with higher value to mass ratios. At the high end of value to mass, electronic design files for new machines and products have no mass, and can be sent anywhere at low cost. They are well suited for a worldwide network. At the low end, crushed stone for construction is heavy and cheap. Shipping will tend to be limited to a single location near the quarry rather than moving rocks long distances.
 In a well-developed makernet, a customer may submit a product order to the network through a website. Production requests are then routed to various network nodes, who supply the materials, fabricate parts, and do other necessary steps. As each step is completed, payment is routed to the node. Eventually the finished item is delivered to the customer. Production nodes can contain any number of machines and processes. Since new machines can collectively be made by already existing nodes, a single seed factory starter set can in theory extend the network everywhere over time.
 For node operators, modern communications allows people to work remotely from the actual equipment. This has potential advantages in commuting cost and flexibility of work hours and place. The Personal Production example is a local community at a single location. So much of the interaction can be in person or by voice. The Makernet approach emphasizes software and networking, with people doing things at times of their choosing, rather than on a work schedule in a conventional factory. New starter sets would tend to be optimized for size and mass, so they can be shipped farther at reasonable cost.
* '''[[Seed_Factories/Industrial|Industrial Production]] (Chapter 7)'''
 The goal of this example is large-scale production of more specialized products, much like conventional factories. It begins with smaller-scale commercial networks like the previous examples, or starter sets specifically designed to grow to industrial scale. In either case, growth by self-expansion should be a less expensive way to reach the desired production capacity. In one version, the starter sets are mobile, and are used like construction equipment. They are brought to a new industrial site and start making parts and equipment. Once the new factory reaches sufficient capacity, the seed factory components move on to the next project. In another version, a commercial-scale network grows in place to the larger industrial scale.
 Individual industrial sites grow towards scale and efficiency rather than diversity of outputs. This is partly because it gets harder to fit all the large equipment and operations in one place. Starter sets and small-scale production favor flexibility in what they can make, at the expense of being less efficient. At industrial scales, the individual machines can be optimized for their specific tasks. They are then easier to automate because they each do fewer different things.
 Industrial-scale sites can still operate as a network, and make things for each other as needed. However, the larger scale output goes well beyond the original owner's needs, or even the general needs of a given location They can then sell products directly to a wider market. They can also sell production shares to people who otherwise don't participate in site operations. Production shares entitle people to a share of the products made, either without further payment, or just to cover inputs like raw materials. An example of this would be a large-scale automated farm, whose shareholders then get a portion of the food produced. Industrial-scale sites can use conventional factory financing via capital markets if internal funding is not sufficient.
* '''[[Seed_Factories/Remote|Remote and Difficult Locations]] (Chapter 8)'''
 This book's last example is production in remote locations, or where environment conditions are difficult or extreme. In such locations, the benefit of self-expanding systems is not having to bring all the infrastructure with you. Instead, you bring a starter set and produce most of the rest locally. Examples of remote and difficult locations on Earth include deserts, polar regions, and the ocean surface. More extreme locations include high altitudes, ice caps, deep underground, or underwater. Current civilization mostly occupies a thin layer within 30 meters of about 13% of the Earth's surface. This is only 1.2 parts per million of the total Earth. Extending available locations horizontally to the remaining area, and vertically beyond the first few meters would vastly increase living and working space and resources. The key to this is affordability, which self-expanding systems can help provide.
 The more difficult and remote the location, the higher the cost of transporting equipment there, and the more incentive there is to use a small starter set and build locally. High levels of automation and productivity can make it possible to live and work in such locations by providing the infrastructure and resources needed. Remote controlled operation allows building up capacity without necessarily living there. For example, the Sahara Desert may be a great place to make solar panels, because of abundant sunlight and sand as inputs. But people may not want to live there full time. Working remotely can allow that choice. Conversely, if technology enables living in a remote location, it might be desirable for some people. Since other people don't live there, land would be cheap. It might be scenic or have other features people would prefer.
* '''Space (Volume II)'''
 The most remote and difficult places are regions in space beyond the Earth. Synchronous orbits, where many satellites operate, are twice as far as any two points on Earth can be, and the farthest known Solar System orbits extend ten million times farther than that. The space environment has a number of difficult or hostile conditions for people and other living things. This includes lack of breathable atmosphere and water, high radiation levels, and low gravity. On the other hand, space contains large amounts of untapped energy and material resources. If seed factories and self-expanding production can help make these resources accessible, the potential gain for civilization is enormous.
 Since the conditions are so different, and involve different engineering specialties and designs, we reserve discussion of their examples to a second volume on '''[https://en.wikibooks.org/wiki/Space_Transport_and_Engineering_Methods Space Systems Engineering]'''. The examples for space are linked to the previous ones for Earth in a couple of ways. First, industrial and in some cases remote and difficult locations are needed make and operate transportation to reach space. Second, the first seed factories to use in space must be designed and built down here, and some of their operation can be remotely controlled from Earth.
*'''[[Seed_Factories/Notes|Conceptual Design Notes]] (Chapter 9)'''
 The final part of this volume is a collection of material that is (a) too new or not organized enough for the main text, or (b) is too detailed and would interrupt the flow of the discussion. The ideas we present in these books are a work in progress, so the final part also serves as a kind of "engineer's notebook" to record that work. In the past, such notebooks were on bound paper or pages in file folders. Larger sketches and drawings were kept flat in drawers or rolled up. Only a few people could access them and collaborate. The modern approach is a shared electronic database where everyone has access to the full contents. Our work is open-source and we encourage collaboration. So the notes in Chapter 9 form part of our database. Material that is not suited to the Wikimedia format will be stored elsewhere and linked from that section, and from other parts of both volumes.
</div>
{{BookCat}}
lxy5yq67yzrlwdkafm63ux83vkde2qd
Seed Factories/History
0
288454
4676731
4207728
2026-10-18T10:51:52Z
Danielravennest
13526
4676731
wikitext
text/x-wiki
{{DISPLAYTITLE:<span style="display:block;text-align:left;font-size:100%;background:#d0f0f0;line-height:2.5em; font-family:'Georgia', serif;">Chapter 2.0 - History and Concept Development</span>}}
<div style="font-size:125%; font-family:'Georgia', serif;">
<div class="nonumtoc">{{TOCright}}</div>
 In Chapter 1.0 (Introduction) we identified three large-scale problems: insufficient development, a deteriorating environment, and technological unemployment. All three are unintentional side effects of how civilization evolved in the past, and may develop in the near future.
 The growth of modern civilization is still incomplete and unevenly distributed. This results in the first problem, of insufficient development. We've made poor choices in the past due to lack of knowledge and incentives built into the economic system. These are negatively affecting the environment, the second problem. A lack of foresight combined with how our economic system works may lead to the third problem, of large-scale unemployment.
 Before trying to find solutions, we should first understand the history and processes which brought us to where we are. So the first part of this chapter covers processes like expansion, growth, and self-improvement in nature, before people evolved. Then we look at how people have tried to satisfy their needs and make their lives better. More specifically, technology has a long history in human culture. We take a look at that history, leading up to modern technology. In addition to improving our lives, technology brought unsuspected and undesirable side effects, resulting in the current state of civilization.
 '''[[Seed_Factories/SelfImprovement|Chapter 2.1: Self-Improvement and Seed Factories]]''' explores self-improvement as an idea, and its relation to ideas like progress and economic development. The second half of the 20th century took the idea of machine self-replication from theory and philosophy to design and engineering. Technologies like computers and automation developed quickly in this period, making replication a real possibility. The original idea was a machine system copying itself without help, by making and assembling copies of all its own parts. Doing this with physical systems is still beyond our reach. Electronic information, on the other hand, is easily copied, and automated software can do this without people involved.
 We have updated the original idea of fully automated self-replication to an evolving system. It begins with a smaller and simpler seed factory that grows towards higher levels of automation and replication. The changes to the idea are fairly new and not yet completely worked out. '''[[Seed_Factories/Technology|Chapter 2.2: Further Research and Development]]''' considers open questions and what isn't yet known about it. An evolving factory system will also make use of other, more developed, areas of knowledge and experience. So we also look at their current state-of-the-art. Lastly, we look at related projects, and topics for future research and development needed to make use of the seed factory approach.
==<span style="font-size:x-large; font-family:'Georgia', serif;">1.0 - Natural Processes</span>==
 
 Expansion, growth, replication, and tool use are processes which predate civilization, and even modern humans as a species able to think about them. People have always exploited these processes in the past, knowingly or not, and continue to do so today. A short review of their history is in order for a couple of reasons. The first is to understand how modern civilization arrived at its current state. The other is to identify processes and methods we can use. We can combine them in new ways, adapt them to meet our needs, and use them to help solve our pressing problems.
 The natural world doesn't consider internal changes as "better" or "worse". Those are labels that people apply based on our needs, desires, and opinions. We need at least some physical space and objects like food and shelter to keep living. Beyond the bare necessities, most of us strongly desire additional or higher quality things to make our lives better.
 So we describe natural changes as improvements when they enable more of the necessities and desirable extras, or make them easier to get. An example would be the end of the last '''[[w:Ice_age#Glacials_and_interglacials|Glacial Period]]''' about 20,000 years ago, bringing warmer temperatures and freeing fertile land from ice cover. When nature does it without our help we call it self-improvement. The natural world has changed for the better, from our standpoint, based on what we know from '''[[w:Astronomy|Astronomy]]''' and '''[[w:Biology|Biology]]'''.
===<span style="font-size:large; font-family:'Georgia', serif;"><u>1.1 - Astronomy</u></span>===
 
 Expansion as a process appears to be as old as the Universe itself. Red-shifts in the spectra of galaxies, supernova brightness and light curves, and the '''[[w:Cosmic_microwave_background_radiation|Cosmic Microwave Background]]''' radiation imply that '''[[w:Metric_expansion_of_space|space itself is expanding]]'''. This seems to be the combined effect of strong repulsive forces from '''[[w:Inflation_(cosmology)|Cosmic Inflation]]''' during the '''[[w:Big_Bang|Big Bang]]''' ~13.8 billion years ago, and '''[[w:Dark_energy|Dark Energy]]''', which continues to accelerate the expansion. If the inflation theory of cosmology is correct, the growth of large scale structures, now hundreds of millions of light years in size, can be traced to microscopic quantum fluctuations during the inflationary era and acoustic waves that occurred somewhat later.
 Stars, planets, and galaxies grow by '''[[w:Accretion_(astrophysics)|Accretion]]''', the addition of more matter to what is already there. Since the force of gravity is proportional to mass, the ability to attract more matter grows as more mass is collected. This leads to '''[[w:Exponential_growth|Exponential Growth]]''', until all the nearby matter is consumed. Any growth process which is proportional to the current size leads to exponential increases over time. We will see many examples of this in the course of these volumes.
 Stars replicate in a limited sense. They are born with different masses, and their energy output increases much faster than mass. This is known as the '''[[w:Mass–luminosity_relation|Mass-Luminosity Relation]]'''. So the larger stars use up their fuel much more quickly, despite starting with more. As these stars reach the end of their life, they emit large amounts of gas or explode. The shock waves from these processes can create high density areas in molecular clouds. These denser areas can collapse to form a new generation of stars. Our own Sun is thought to be a third generation star whose formation was triggered by a supernova explosion of a nearby older star.
 The early Universe after the Big Bang consisted of hydrogen and helium, and nearly no other elements. '''[[w:Stellar_nucleosynthesis|Nucleosynthesis]]''', the process by which stars shine, also builds heavier elements. There are some additional processes which convert one element to another. We need heavier elements to make the kind planet we live on and the parts of our bodies. So the evolution of generations of stars producing such elements is considered an improvement.
 Planets grow by an exponential process from smaller bodies. A growing '''[[w:Protoplanet|Protoplanet]]''' has a stronger gravitational field, so it can attract nearby gas, dust, and other small bodies to itself. As it gets larger, it's gravity can also change the orbits of other bodies. This causes collisions, with the larger bodies tending to keep more of the combined mass. Debris from collisions continues to collect by attraction and more collisions. Eventually most of the available mass is (1) gathered into planets and moons, (2) thrown into the parent star, (3) ejected from the stellar system, or (4) not ejected, but thrown far enough outwards that further collisions are rare.
 Once formed, planets continue to affect each other's orbits by gravity, and the parent star supplies energy to keep them warm according to their distance. The star's output can vary with time, and it can emit other things besides light. Internally, a planet can generate heat by various means, and that heat can drive geological processes. So a planet's environment can get better or worse with time in quite complicated ways.
 '''[[w:Galaxy_formation_and_evolution|Galaxies]]''' formed and continue to evolve by a similar growth and evolution processes. Random processes produced regions in the early Universe that were denser than others. They tended to attract other nearby matter to form clouds. The clouds in turn attracted each other, forming larger and larger structures like galaxies and clusters of galaxies. Our own Milky Way galaxy is still consuming smaller ones, as evidenced by leftover streams of gas and stars. The Andromeda galaxy and ours are predicted '''[[w:Andromeda–Milky_Way_collision|to collide]]''' in about 4.5 billion years. The larger the distances, the longer these growth processes take, so they are incomplete in the Universe today.
 Galaxies evolve internally as gas and dust are turned into generations of stars and back again, central black holes grow, and the stars redistribute their positions gravitationally. By late 2022 we have discovered over 5000 '''[http://exoplanet.eu/ Exoplanets]''' - planets around other stars. So we now know the evolution of our Galaxy has resulted in many planets besides the ones around the Sun.
 We consider the evolution of the Universe from the Big Bang until now to be an improvement. It has provided the physical space, heavier elements, and the Earth and Sun that have allowed us to evolve and continue to live. We expect conditions on Earth to deteriorate as the Sun gets brighter and the Earth hotter. Left to itself, life as we know it on Earth will become impossible in 0.6-1.0 billion years.
 It is not yet clear how often and for how long conditions suitable for life happen elsewhere. We also don't know if planetary, stellar, and galactic processes could be artificially used to increase or extend such conditions. But in the mean time, in our current civilization, we can incorporate the ideas of expansion, replication, and exponential growth into our efforts.
[[File:DNA_replication_en.svg|thumb|right|691x336px|Figure 2.0-1 - Proteins, most of whose names end in -ase, separating DNA strands and assembling new complementary ones, which results in two complete copies.]]
===<span style="font-size:large; font-family:'Georgia', serif;"><u>1.2 - Biology</u></span>===
 
 '''[[w:Evolutionary_history_of_life|Living Things]]''' on Earth have grown and reproduced for 3-4 billion years (GY). As a percentage of the age of the planet, life started soon after the surface cooled enough and frequent large asteroid impacts ended about 3.8 GY ago. Life as we know it requires water and '''[[w:Organic_compound|Organic Compounds]]'''. These were either included in the planet's original formation, or delivered afterwards by impacts of comets and asteroids.
 Growth and reproduction are two of the defining features of '''[[w:Life#Biology|Life]]'''. Another defining feature of life is '''[[w:Metabolism|Metabolism]]''', the use of available energy to convert ingested materials into parts of the organism. Some of the new parts are for self-maintenance, and some are for growth. At some point in its life cycle the organism has grown enough to make copies by division at the cellular level. Small organisms like '''[[w:Bacteria|Bacteria]]''' and some '''[[w:Algae|Algae]]''' consist of a single cell which divides repeatedly. Large organisms like whales and trees consist of many cells. They individually divide, become specialized for different tasks, and are grouped into larger structures. Organisms can also incorporate non-living matter, like the mineral parts of bones and shells, or the bark of trees.
 The replication of a large organism involves partitioning one or a small number of cells into an '''[[w:Embryo|Embryo]]''' or '''[[w:Seed|Seed]]''', a smaller and simpler entity than the mature organism. This entity contains all the information to build the mature organism, mainly in the form of long double-chain polymer molecules known as '''[[w:DNA|DNA]]''' (Deoxyribonucleic Acid), often after mixing genetic data from two parents. The sequence of DNA units directs the construction of various '''[[w:Protein|Proteins]]''', which in turn perform a variety of functions necessary for life. One of these functions is separating the two strands of DNA molecules, and assembling complementary units to make a matching second strand for each (Figure 2.0-1). When a cell divides, each copy then contains a full set of instructions so it can continue to live.
 Biological seeds usually contain the plant embryo, which does the actual growing, a supply of nutrients to support the initial growth, and a protective coating. The nutrient supply supports the embryo until photosynthesis and uptake through roots can take over. Animal embryos develop within eggs - containers with a nutrient supply, or are carried internally and supplied by the mother until birth. The initial seed or embryo cells divide and specialize until they become a mature copy of the parent organism. Specialization during the life of one organism, and other short-term changes are affected by '''[[w:Epigenetics|Epigenetic]]''' processes. Humans, being large organisms, grow and replicate in this way, both at the cellular and whole organism level. The process of growth from an embryo or seed is at least 400 million years old.
 Self-reproducing organisms have DNA sequences 0.1 to 670,000 million units in length. Changes to the sequences happen for a variety of reasons. The the changes cause differences in how well the modified organisms live and die in their environment. Different survival and reproduction have produced all the various '''[[s:Species|Species]]''' that exist now, and have existed in the long history of our planet.
 There are several scales at which these changes can happen: at the individual '''[[w:Nucleotide|Nucleotide]]''' unit level, to longer segments of DNA, and by wholesale reshuffling in '''[[w:Sexual_reproduction|Sexual Reproduction]]'''. Until very recently, DNA changes were unplanned and undirected, so the evolution of species was random and slow. For example human DNA varies by 0.1% between individuals in the ~10,000 generations since our modern form evolved. We vary by 1.2% in the 7 million years since we diverged from our nearest living relatives. We can distinguish between long-term information such as coded in DNA, and shorter-term information such as '''[[w:Epigenetics|Epigenetics]]''' and individual memories, which are outside of DNA changes.
 Most of the energy for life ultimately comes from the Sun. Waste products and dead organisms are recycled by other organisms, or accumulate as sediments, which are converted to rock formations by geologic processes. Over very long periods of time, the rocks can again become available as raw materials for life. Communities of living things, together with the non-living surroundings they interact with, form linked '''[[w:Ecosystem|Ecosystems]]'''. These are dynamic entities through which energy and materials flow, often in cycles with feedback loops.
 All living things interact with their surroundings by ingesting food, rejecting wastes, and using local energy sources to sustain themselves. Many species also modify their surroundings by building non-living constructs outside their bodies, such as '''[[w:Nest|Nests]]''', '''[[w:Burrow|Burrows]]''', and '''[[w:Beaver_dam|Dams]]'''. Once built, these structures can perform functions like shelter from the environment or protection from predators. The non-living objects don't need constant biological activity to sustain them.
 People also interact with and modify our surroundings, build non-living objects, and participate in ecosystems with other living things. We depend on the self-expansion and replication abilities of other living things to supply food and other products we need and use.
 We can apply ideas from biology, such as specialization during growth, replication via a smaller and simpler starter entity (i.e. a seed), and replication of information into our designs. We can also incorporate the ideas of energy and material sources, recycling, and ecosystems of related elements. Since many features from biology can be included into artificial self-improving and replicating systems, we can consider them forms of '''[[w:Artificial_life|Artificial Life]]'''.
==<span style="font-size:x-large; font-family:'Georgia', serif;">2.0 - Technology and Culture</span>==
 
 The natural processes of expansion and replication started billions of years before the roughly 300,000 year history of '''[[w:Human|Modern Humans]]'''. As living beings we continue to participate in these processes, and they continue to operate in nature. What makes us distinct is our creation of technology and culture. In a broad sense, '''[[w:Technology|Technology]]''' includes the knowledge and skills needed to make things, but also putting that knowledge to practical use for all the tools, artifacts, and products we make. A tool like a hammer is a technical artifact, but knowing how to make and use hammers is a part of technical knowledge. Humans also produce '''[[w:Culture|Culture]]''' - entities that persist beyond the death of individual people. Both technology and culture involve growth and replication processes. We can better meet our needs by intentionally using these processes in the systems we build.
===<span style="font-size:large; font-family:'Georgia', serif;"><u>2.1 - Recent Evolution and Early Tools</u></span>===
 
 Some animals actively '''[[w:Tool_use_by_animals|Use Tools]]''', objects which are not permanent parts of their bodies. Tools let them perform tasks more effectively than their bodies can alone. Most animal tool-use is passed genetically or arises spontaneously. They lack a knowledge component, so we don't call them technology. Knowledge is learned, saved, and passed on to others. We don't know exactly when the first technologies arose that were passed on this way. Before that, tools were invented each time, then lost when that individual died.
 Many of our relatives among the '''[[w:Primate|Primates]]''' have been observed using simple tools such as sticks and leaves to gather food. Some groups of wild chimpanzees use tools to chop large fruit into smaller pieces so they can be eaten. Neighboring groups do not do this, suggesting knowledge is being learned or passed on within the group that does. So this would count as a very early technology.
 Our early human ancestors also made this kind of transition from spontaneous to learned tool-use at some point millions of years ago. This was likely among the '''[[w:Hominidae|Hominid]]''' (Great Apes) family of primates to which we belong, but an earlier species now extinct and distinctly different from us.
 It is hard to pin down exactly when and how the '''[[w:History_of_technology|History of Technology]]''' began. The oldest activities that might be classed as technology are foraging and nest building by hand. Other species of Great Apes do this, and likely our ancestors millions of years ago did too. However, the remains of meals and nests are biological, and perish over such long periods.
 Beyond using the body, we can speculate about using sticks and unmodified rocks to knock down fruit or kill prey. But wood decays, and while stones can last, they don't leave evidence of their use. The ones which were used as tools, like chimpanzees are observed doing today, are indistinguishable from all the other stones which were not.
 Stones modified by flaking or worn from chopping and cutting are the earliest surviving evidence of technology. We know the technology was being passed on, because of the persistence of particular techniques and their geographic spread over time. If they were spontaneous inventions, which were then lost when the inventor died, the timing and distribution would be more random.
 '''[[w:Recent_African_origin_of_modern_humans|People Today]]''' appear to be the last surviving species or subspecies of the genus '''[[w:Homo|Homo]]''', although DNA analysis indicates some interbreeding with extinct relatives. We emerged in anatomically modern form about 0.2-0.3 million years (MY) ago. This is long after the appearance of early technologies like stone tools (3.3 MY), controlled fire (0.5 - 1.5 MY), and using them for preparing and cooking food (0.5 to possibly 2 MY). So our evolution to modern form happened in parallel with early technology, and it may have contributed to that evolution.
 Compared to other tool-users, modern humans seem to be unique in several ways. These include (1) the number of different objects we make, and their complexity, (2) significant transfer of knowledge from person to person, and indirectly by way of lasting records, (3) extensive use of tools to make other tools, and (4) creating tools which can carry out tasks to some degree on their own. These features have combined to produce accelerating growth and an increasingly complex society.
===<span style="font-size:large; font-family:'Georgia', serif;"><u>2.2 - Technology Accumulation and Acceleration</u></span>===
 
 The key advantage technology has given us over genetic evolution is the speed at which it can accumulate and spread. It helped our ancestors evolve to modern form, out-compete our relatives, and build a civilization which dominates the planet. We are even at the point of artificially modifying biology, doing so much faster than natural changes happen.
 Tool marks on fossilized bones and shaped stone tools date back about 3-4 MY, which starts a period we call the '''[[w:Stone_Age|Stone Age]]'''. These signs show toolmaking was intentional. Their spread across Africa and Eurasia, similarity, persistence over time, and gradual improvement shows knowledge was being passed on. This makes them the first identifiable class of technology, if not the first to develop. Stone tools are harder and sharper than our body parts, and replaceable when broken, but limited by the muscle power we can supply.
 The next great advance was '''[[w:Control_of_fire_by_early_humans|Harnessing Fire]]'''. This increased usable energy, and allowed transforming materials in ways not possible using only stone tools. Fires occur naturally, so it is hard to identify when we first learned to use it and pass on the knowledge. Evidence from caves containing human fossils, hearths, and the remains of fires indicate the technology had been mastered no later than 0.5 MY ago, but possibly starting a million years earlier. Aside from the immediate uses for warmth and discouraging predators, fire led to cooking. Various cooking methods increase available calories, reduce toxicity and pathogens, and preserve some foods for later use. Stone tools, fire, and cooking gave us a survival advantage. It also allowed us to evolve to modern form, with larger brains that need more energy.
 Since reaching our current form, modern humans have developed technology and culture at an accelerating pace. This includes clothing, language, ceramics, domesticated species, and many others. There is a strong positive feedback loop that causes this acceleration. Improved tools gave early humans a survival advantage. Their numbers multiplied and they spread geographically. Assuming a constant rate of inventiveness at a given point in our evolution, more people means more inventions. New locations with a greater variety of living conditions encouraged new solutions to the problems they faced. For example, cold climates led to a need for clothing. New inventions, once made, could then spread elsewhere and be further modified, increasing our survival advantage.
 On top of this feedback loop was the gradual increase in the size and energy use of our brains. This increased our inventiveness over the last three million years, but it also allowed for larger social groups. Modern humans form groups of about 150 people, compared to about 40 for our distant ancestors. Larger groups allowed for specialization of skills and therefore becoming more expert in each, further increasing our survival and numbers. Specialized skills encouraged developing specialized tools for each task. For example, axes and the many varieties of chisels and saws all cut a material by concentrating forces at a narrow edge. But their sizes and shapes have evolved according to the specific materials and needs of the work. Specialized tools were an improvement over the previous generic ones. They also improved survival and increased population, adding to the feedback loop.
 '''[[w:Agriculture|Agriculture]]''' is the part of technology concerned with purposely growing other living things. It began in multiple places between 23,000 and 12,000 years ago, during and after the last Ice Age maximum.
 That living things can grow and make copies of themselves from seeds or by giving birth was probably always evident to people. Understanding the detailed mechanisms only started a few hundred years ago, including replication of DNA, division of cells, and all the supporting bioprocesses. But long before understanding the details, people knew seeds grew into full sized plants, which in turn produced more seeds, and animals gave birth to small copies of themselves which grew to full size. This is known as a '''[[w:Biological_life_cycle|Biological Life Cycle]]'''.
 Because each plant generally produces many seeds, their number can grow exponentially until they are limited by competition or available resources. So any natural landscape which can support them tends to be covered in plants. Total oceanic '''[[w:Primary_production|Primary Production]]''' approximately equals that on land, but is more thinly distributed because the water absorbs sunlight before it can be used. It also consists of more microscopic organisms on a relative basis due to lack of solid anchorage in deep waters.
 Once people learned to exploit the supply of nutrients, in particular plants and animals, and started raising them intentionally, the natural ability of living things to grow exponentially increased the human food supply dramatically. In turn, human population also grew exponentially. More people means more inventions, including better ways to pass on knowledge. So knowledge and culture have also grown at an accelerating rate.
===<span style="font-size:large; font-family:'Georgia', serif;"><u>2.3 - Knowledge Transfer</u></span>===
 
 DNA encodes genetic information, and is passed from generation to generation. But it doesn't change at all, or very little, in the life of an individual. It can slowly change through mutation, and by shuffling parts during replication. The organisms better adapted to their environment by such changes have a survival advantage, and become more common. But it may take many generations for an improvement to spread through a population. In contrast, learning is a process which allows variable information to accumulate within the life of a single organism.
 The ability to learn has evolved in many forms throughout the animal kingdom ('''[https://doi.org/10.1017/S1464793103006225 Moore, 2004]'''). That evolution was at the same slow pace of other genetics, but once learning is possible, information could accumulate faster. For most species, the learning is lost when the individual dies and must be done anew each generation. Knowledge transfer is more efficient since the organism doesn't have to repeat all the trial and error in accumulating knowledge. Instead it receives useful information previously learned by others, and has the opportunity to improve on it and pass the improvements to the next generation.
 Early knowledge transfer used methods like observation and imitation, with later additions like gestures and pantomime to focus attention. These transfer methods didn't require special tools. Language and memory techniques are technologies that allowed larger amounts of knowledge to be stored and transferred, over longer time periods. They need training, but still did not need external tools. Art and writing further increased the quantity, persistence, and accuracy of knowledge transfer, and began to store the knowledge separately from people. These techniques now required tools like pigments and chisels to put the information on durable media like stone. Our ability to store, transfer, and copy knowledge has only improved with time, with more and more advanced tools to do it with.
 Pictorial art, such as cave paintings and figurines, didn't require specialized knowledge to understand because they were similar to the originals they represented. Pictorial symbols were more abstract and required some learning to understand. Finally, abstract symbols like numbers and alphabets required the most learning to use, but could represent ideas and new things which didn't yet exist. Along with increasing abstraction, our storage media have evolved from marked stone to clay, papyrus, printed paper, and the rapidly changing electronic methods.
===<span style="font-size:large; font-family:'Georgia', serif;"><u>2.4 - Sequential Toolmaking and Specialization</u></span>===
 
 Parts of the body are the universal first tools, but they are grown rather than made, and their variety is fixed by genetics. For a given species, body parts have a fixed repertoire of actions they can perform. For example, human elbows are limited to less than 180 degrees in bending. Body parts are also limited in terms of strength, size, durability, and other features. You can use your fist as a hammer, but only for certain light tasks without injury. Many animals use natural objects, like rocks and twigs, as tools to pound or poke. Fewer will modify natural objects to suit a task. Humans, and our recent relatives, seem to be the only species who first make one tool, then use that to make another, which we call "sequential toolmaking".
  '''[[w:Hammerstone|Hammerstones]]''' are natural round stones used to shape other stones, or to crush, pound, or grind other materials. They are found, rather than made. The oldest identifiable made tools are split and flaked stones from Kenya that are 3.3 million years old. They were not used to make more tools. If they wore out or broke, you needed to start fresh with new rocks. The skills and knowledge, however, could be copied by observation and imitation, even if language did not exist yet. Later in our history, the original stone tools started to be used to make secondary tools.
 A '''[[w:Hand_axe|Hand axe]]''' may be shaped by a hammerstone. If the axe is then used to cut and shape a '''[[w:Digging_stick|Digging Stick]]''', which in turn is used to pry up edible roots, that is a sequence of two tools, both of which are made. Sequential toolmaking requires enough memory and planning to accomplish the whole series. The knowledge and production may be among several people, but they all have to exist within a given society. Hand axes and scrapers made from split rocks can be used to cut and peel branches, which can then be used as handles for axes. A tool with more than one part and made from different materials is a step up in complexity. Complex tools can be more efficient. In this case the handle increases leverage and allows more splitting force.
 The earliest cycle of tools to make more tools of the same kind may be using digging sticks and hammerstones to excavate and flake stones, which in turn can cut and sharpen more digging sticks. Over time, hand tools such as these were used to make better tools and artifacts, a process which still continues today. Modern humans have developed by far the most complex sequences of tools used to make other tools. This includes loops which lead back to earlier and simpler tools.
 '''Specialization''' - As our social groups got larger, their members developed specialized skills. One of these skills was making tools for others to use. Specialized groups of toolmakers, such as blacksmiths, were able to copy their own tools, plus make tools for other people. We can make a distinction between the toolmakers and nearly everyone else - who use tools made by others. Specialized toolmakers persist as a significant segment of industry, since modern civilization can't function without all the tools they make. This includes making better tools than the ones we already have, a process we expect to continue in the future. Modern society is filled with tools, from kitchen utensils to smartphones. But the vast selection tools and machines found throughout civilization can all trace their existence to the self-making toolmakers.
 Early blacksmiths could copy tools for themselves and others, but their work was not mechanized and certainly not automated. Animal, water, and wind power later augmented human muscles, and increased total production. More recently steam and electrical power further improved production rates. As the scale of production and the knowledge involved grew, toolmakers also became specialized. Specialties like mining, steel mills, foundries, and machinery builders still retain the collective ability to make more tools and machines of the type they themselves use. So as a group they are still able to copy their own tools, plus make tools and machines for others.
===<span style="font-size:large; font-family:'Georgia', serif;"><u>2.5 - Self-Operating Tools</u></span>===
 
 '''Energy''' - Tools require energy to perform their function. At first, all work was performed entirely by human muscle, which in turn gets its energy from food. The first outside energy source was probably fire, for tasks like cooking, firing pottery, and smelting copper. Once animals were domesticated we could add their muscles to ours.
 '''[[w:Mechanization|Mechanization]]''' refers to the replacement of muscle power with devices using other power sources. Boats using wind power and mills using water power are early examples. They have been used since ancient times in particular cultures and for particular tasks, but many tasks were still performed by muscles. Replacing muscle power only became widespread since the '''[[w:Industrial_Revolution|Industrial Revolution]]''', starting around 1760. Coal and sometimes wood were used to make steam, whose pressure could drive mechanical devices. More recent engines use combustion gases to directly produce motion. Electricity from a variety of energy sources has allowed distributing power to whatever devices need it. Motors can convert this power to motion at the point of use.
 '''Self-Operation''' - For three million years our tools were passive, not doing anything unless people used them. A fire can continue to burn for a time once started, but requires frequent attention for safety and additional fuel. '''[[w:Domestication|Domesticated]]''' species may be considered the first self-operating tools. They are improvements over acquiring food in the wild, and agriculture is an important technology, so they fit within a broad definition of tools. Since they are living things, hunting dogs can chase prey, livestock can forage, and cultivated plants can grow, all without constant human attention or work.
 Domestication of living things started about 15-30,000 years ago. It wasn't until about 7,500 years ago, with the development of sail power, that non-living tools could start to perform active functions to some degree on their own. Wind provided an external energy source to move the sail, and the boat it was attached to. As long as the wind is steady, the boat can continue to move without constant attention by people. This differs from rowing or paddling, which need constant action.
 Simple tools, like a hammer, need a person's constant attention and muscle power to operate. More complex ones, like an electric drill, replace some or all of the muscle power, but still need our full attention and guidance. A '''[[w:Mill_(grinding)|Mill]]''' powered by wind or water may not need constant attention to keep turning and grinding, though it still needs labor for other tasks. It is therefore partially self-operating.
 '''Smart Tools''' - Where mechanization replaces muscles, technologies like '''[[w:Automation|Automation]]''', '''[[w:Robotics|Robotics]]''', '''[[w:Software|Software]]''' and '''[[w:Artificial_intelligence|Artificial Intelligence]]''' (AI) can also replace the senses, and decision-making of people. We call devices which use such technologies '''Smart Tools'''. They make possible mechanical, electrical, electronic, and information systems which can function to a greater degree on their own. This reduces the need for constant human attention and intervention for work tasks. Therefore more can get done relative to the time people spend on it.
 By the mid-20th century, electronics had developed to the point they could be programmed and used as sensors. The field of '''[[w:Control_theory|Control Theory]]''' had developed enough to design self-operating systems that used these electronic devices. Automation, robotics, and software started to develop on a large scale from that time. AI took until the late 20th century to develop enough for practical applications, and is now being widely deployed.
 If our tools no longer need our strength, attention, guidance, or control, the need for our labor is reduced or eliminated. In theory, a set of sufficiently smart tools could be given instructions, then then proceed to build everything else we need and want with little effort on our part. This includes making copies of itself. In practice, we don't yet have tools that smart. The ones we do have, though, are increasingly able to work on their own and need less help from us. Smart tools are the latest in a long series of '''[[w:Productivity_improving_technologies|Productivity Improving Technologies]]'''. Like new sources of energy and mechanization, they will lead to a better quality of life, but in the process can disrupt economic systems based on trading labor for other goods and services.
===<span style="font-size:large; font-family:'Georgia', serif;"><u>2.6 - Cultural Elements</u></span>===
 
 Culture can be described as things that persist in society beyond the life of any given person. It includes both non-material elements and '''[[w:Material_culture|Material Culture]]'''. Non-material culture includes things like patterns and knowledge. For example, an early '''[[w:Hunter-gatherer|Hunter-Gatherer]]''' band could persist as a pattern for a much longer time than any member lived. Language and how to use it is knowledge that can be passed down through many generations orally, without ever being written down. Material culture, like tools and cities can, if maintained, also last well past the life of any individual. The life span of an artifact, however, does not determine if it is cultural. The important feature is whether it exists independent of human biology. For example, a fast food soft drink cup may only be used for a few minutes, or sit on a shelf for years, but our internal biology does not affect these lifetimes.
 All kinds of cultural elements can exhibit growth and replication. A hunter-gatherer band can grow to the point it divides into two bands. A language can grow by the addition of new words, and by new people adopting it. New languages can form when people live far enough from each other that they rarely communicate. Shifts in vocabulary and usage then lead to enough changes that there are two distinct languages instead of one.
 Widespread distribution of media like books and video have tended to stabilize language content, and worldwide communications means nobody is too far away any more to interact. Although the trend is now for small languages to disappear in favor of the more common ones, the remaining languages continue to grow by adding new words and speakers. Cities can grow horizontally in area and vertically above and below ground level. Historically they multiplied by intentionally setting up colonies, or grew around a local feature by attracting settlers. No two cities are the same, but they may share many similar components.
 The oldest elements of culture that showed growth and replication predate modern humans. They include '''[[w:Band_society|Band Society]]''', and early types of technology in the form of hunting, foraging, and tool-making skills. Species of the genus '''[[w:Homo|Homo]]''', to which we belong, expanded repeatedly across the world over the past few million years. Successful social groups therefore presumably divided when their population became larger than a given area could support.
 Skills could grow by accumulation of details and technique and by specialization. Each person has a limited memory and time to learn. So specialization allows more total skills to be passed on. Cultural replication included making new copies of tools from raw materials, but not generally using an existing tool to copy itself. Instead, a collection of tools was brought to bear on making copies of its members.
==<span style="font-size:x-large; font-family:'Georgia', serif;">3.0 - Industry and Economics</span>==
 
[[File:Five_Myr_Climate_Change.svg|thumb|right|640x233px|Figure 2.0-2 - Quaternary glaciation temperature variations.]]
 The last 2.8 million years are known as the '''[[w:Quaternary_glaciation|Quaternary Glaciation]]''', during which ice sheets have expanded over parts of the world's land areas. There was both a drop in the long-term average temperature, and increasingly large temperature cycles of 41,000 and then 100,000 years (Figure 2.0-2). The Antarctic ice sheet persisted even in the warm periods, and variable amounts of other ice sheets grew during the cold periods. Our ancestors evolved during the Quaternary, and our modern form developed during the last few thermal cycles, 200-300 thousand years ago.
 For reasons that are not entirely clear, after the most recent warming 18-12,000 years ago, there was a dramatic change in our technology, culture, and population. In a relatively short period we went from hunter/gatherer bands to space travel, developing agriculture, cities, and large accumulations of knowledge. Work has become very specialized, and trade using money as an intermediary is now world-wide. These changes also brought new kinds problems and side effects, including the ones identified in the Introduction (Chapter 1.0).
===<span style="font-size:large; font-family:'Georgia', serif;"><u>3.1 - Economics</u></span>===
 
 Before developing tools and technology, our ancestors survived the same way as other animals. They were part of biological ecosystems, and obtained their food mainly from other living things. Both primates and their food sources were self-reproducing, and self-expanding to the point of filling their ecological niches. Goods and services, and therefore trade, were limited in scope, consisting of highly local things like sharing food and grooming. Studies of living primates indicate they have a sense of fairness and reciprocity, so our ancestors likely did too. These behaviors enhanced group survival, but they also underlie modern trade.
 '''Early Trade''' - By the start of the '''[[w:Neolithic|Neolithic]]''', around 12,000 years ago, modern humans had developed a number of technologies and tool types. These included an assortment of stone tools, fire, cooking, clothing, the first domesticated species (dogs), and ceramics. Prior to the development of agriculture, societies were more mobile, because they had to follow or go to where the food was. This limited the amount of tools and other artifacts they could accumulate to the level of seasonal camps. Whatever they could not carry to the next location had to be left behind and made anew, or if durable enough, stored in caches for later return.
 People at that time were anatomically modern. Their social groups could range up to around 150 members, so could specialize in different tasks. Specialization involves trade in goods and services from other specialists. The mobility of hunter-gatherer cultures meant they also encountered other groups in the course of their seasonal movements. This encouraged trade in specialties between the groups, in their members, and in items and materials which came from more distant places.
 The '''[[w:Neolithic_Revolution|Neolithic Revolution]]''' marks the transition from hunter-gatherer to agriculture and fixed settlements as a way of life. This happened multiple times in separate locations around the world. Domestication of plants and livestock increased their quality as food sources. Intentional planting and care of herds greatly increased the food supply relative to the natural state. The increased quality and quantity of food allowed for large increases in population density.
 Raising plants and animals was an investment of labor with a delayed return. The need to protect that work led to less mobile populations. Fixed settlements enabled managing crops, storing food reserves, protecting people and their animals from the elements and natural and human predators. People continued replicating themselves and their food supply through biology, and copying their tools and artifacts through technology. Individual settlements gradually expanded, and their numbers increased by starting new settlements in in different places.
 '''Economic Evolution''' - The increased work that went into agriculture led to property rights as a way to secure that work. You owned what you put work into making or improving. Other people weren't allowed to take it because in effect it was taking the part of your life that went into it. Various ways to protect property developed over time, such as laws and customs, or walls and gates.
 Improved food production produced a surplus. This allowed more people to engage in other crafts and services. One of the new specialties was trading items made by others, i.e. merchants. The amount of goods a merchant can handle isn't limited in the same way a farmer is limited in the area of crops they can grow. The work involved in making a trade can be much less than the work to make the items being traded. Trades only happen when both parties see an advantage in it. So dedicated traders can accumulate large total gains. Ownership passes when goods are traded. So individual traders can accumulate ownership of many goods, more than they can handle themselves. They can then hire as many people as needed to do the physical work, trading a share of their gains for the work.
 One type of property is land, either in the natural state, or has had work put into it like a farm. As populations grew, new areas were occupied, initially by mobile bands. The food from that area was necessary to live, so as a group they protected it from incursion by others. By virtue of the protection work they considered it "their land", to be passed down to later generations. As property rights developed with agriculture, specific pieces of land were claimed by families and individuals and passed down.
 Large areas of land could be accumulated by peaceful methods like trade and inheritance. Another method is taking it using force and violence. The takers could then use slaves or tenants to work the land for them. They took a share of the products by threats or force (pillage), or by imposing rules and customs to make it habitual (taxation). As with merchants, hirelings like soldiers and tax collectors could multiply the gains in return for a share in them. Concentrated ownership, whether through peaceful or violent methods, made possible much larger inequalities than those based on individual abilities.
[[File:World_population_growth_(log-log_scale).png|thumb|right|800x480px|Figure 2.0-3 - World population over time.]]
 The development of property rights, increased division of labor, organized trade, accumulation of wealth, and taxation all came out of the Neolithic Revolution. They produced an economic system with recognizable elements that persist to this day. Agriculture also induced a huge increase in population (Figure 2.0-3). The graph shows population history on a logarithmic scale, to better show the dramatic changes in both speed and numbers. Each labeled division on the axes is a factor of ten in time before the year 2000 (horizontal) and total population in millions(vertical).
 Population before agriculture was a few million. By the time iron production became widespread, about 1000 BC, it had grown to about 50 million, and by the time of Classical Greece to 150 million. The much larger population led to more rapid improvements in technology, including in economic systems. The general trend of population growth and accelerated change has continued to the present day, with occasional setbacks.
===<span style="font-size:large; font-family:'Georgia', serif;"a><u>3.2 - Modern Economies</u></span>===
 
 The work people do in modern economies, and how they do it, is highly specialized. The US Bureau of Labor Statistics tracks over a thousand '''[https://www.bls.gov/oes/current/oes_nat.htm Detailed Occupations]''', each of which are further specialized. For example, farm workers in crops are listed as one occupation type, but vegetables, fruits, and field crops all use different skills and equipment. The US Census Bureau tracks over a thousand different industries in their '''[https://www.census.gov/naics/ Statistics System]''', all of which use different tools and skills to produce different goods and services. Specialization is efficient, but people and industries must then trade for all the things they don't make or do themselves.
 Modern economies are also based on a mixture of voluntary trade and action, and involuntary use of force, actual or implied. To the extent people find the functions of government useful, and are willing to pay for them, they are funded voluntarily. There are always people who would contribute less if not forced to, so that portion is involuntary. When the dominant mode of trade and action is voluntary, we call it a '''[[w:Market_(economics)|Market]]''' economy. When that economy also includes large proportions of capital accumulation, wage labor, and trade using money, we call it '''[[w:Capitalism|Capitalism]]'''.
 Modern economies typically include a capitalist sector, smaller-scale individual trade, plus a variable-sized government sector whose control varies from autocratic to extensive public choice and direction. Trade is now interconnected on a world-wide scale, so there are no truly isolated economies any more. There are many local variations in the relative sizes of government, capitalist, and individual sectors, in the extent of physical and social development, and in the local environments and resources which underlie the economic activity.
 In terms of total activity, the modern world economy is mostly based on large-scale capitalism. By large-scale, we mean large amounts of capital controlled by a smaller number of people and organizations. They employ larger numbers of people for their specialized labor, and pay them wages in return. For example, in the US, only about 10% of workers do so for themselves rather than others. The capitalists keep a share of the revenues as profits.
 The majority of people, both wage-earners and capital owners, then use the money they obtain as an intermediate good to trade for the other goods and services they need and want. The goods and services in turn are mainly produced by the capital owners and their organizations, forming a complete trading system. Governments operate in a similar way - employing people and paying them wages. The difference is their capital is publicly owned rather than private.
 A system where most people work for wages is a relatively recent historical development. For example, in the United States (US) the majority of workers were agricultural until 1880, and primarily worked for themselves (see Table 2 in '''[https://www.nber.org/chapters/c1567.pdf Output, Employment, & Productivity in the United States, Brady, NBER, 1966]''').
==<span style="font-size:x-large; font-family:'Georgia', serif;">4.0 - Economic Problems and Approaches</span>==
 
 There are several drivers in the current system which have produced rapid economic growth relative to earlier periods. These include innate desires, competition, and improved technology. While modern economies have brought many benefits, they have also created problems, some of which we consider in this section.
 Capitalist economies have an implicit goal of perpetual self-expansion. This is driven by the desires for a better quality of life and the accumulation of wealth and power. These desires are expressed in monetary form by increasing incomes and market values. But perpetual growth for some can be at the expense of others. Over-consumption of resources and discharge of wastes in the pursuit of growth can also damage health and the environment in which we all live.
 Competition in the current system has made it fairly efficient. Technical improvements have also increased the quality and quantity of goods and services over the last few centuries. But these have caused problems due to the pace of change, job insecurity, and economic inequality. In the future, smart tools may also cause wholesale work displacement. The current system and the problems it causes can also create social problems. However, here we will mainly focus on economic problems, their effects on people, and attempts to deal with them.
===<span style="font-size:large; font-family:'Georgia', serif;"><u>4.1 - Economic Problems</u></span>===
 
 As modern economies evolve, some of their problems can be traced to the effects of change. Other problems can be traced to inequalities of resources and distribution. We will group current economic problems under three headings: the pace of change, job insecurity, and economic inequality. To these we will add the potential future problem of work displacement.
 '''The Pace of Change''' - The Neolithic Revolution is only 1/300th of the time since the first recognizable tools. Agriculture caused a large population increase, which started an accelerating a feedback loop: Our biology, and therefore inventiveness, hasn't changed much in the last 12,000 years. So more people means more new technology and social innovations per year. These improvements allow more population growth, and faster spread of inventions and ideas. So further changes happen more quickly as time goes on.
 When changes were small during the working life of an individual they were not a major problem. A given person could continue their current craft, with their existing skills and tools, until they stopped working. They could gradually be replaced by a new generation of people following new methods. Until the last few centuries, most people worked for themselves in agriculture. They could adopt new tools and methods on their own, or stay with the older ways. The capital required for new items was small enough for individuals and the local community. For example, the horse collar, horseshoe, and heavy plows increased farm production by 50% and allowed working heavy soils that were previously unsuitable. Such tools were within reach for local farmers.
 The pace of change became much faster in recent centuries. Replacing hand weaving with machine looms, and draft animals with farm tractors took about 50 years each, within the life of one person. By the late 20th century, electronics were doubling in performance every few years. Old skills and entire job categories could become obsolete within a working lifetime. People often could not afford to enter new fields due to the time and expense of retraining. For some it was too late in their lives to learn new skills and get enough use of them afterwards. Such people were simply left behind.
 The capital needed for new technologies like blast furnaces and railroads grew far beyond local means. To remain economically competitive, people went to work for those who could supply the capital and machines, rather than for themselves. In many cases people had to take whatever work was available, rather than following their interests and abilities.
 '''Job Insecurity''' - Individual farming has many risks, but getting laid off when you work for yourself isn't one of them. Labor is a cost to any business, so owners and management have a constant incentive to reduce it, and thereby increase profits. They generally employ people only when the expected income from those workers exceed their added costs. Shifts in market demand, competition, and new technologies can all make previous jobs uneconomic. Businesses may then resort to layoffs if reductions from retirement or choice to work elsewhere isn't fast enough.
 The level of job insecurity from all causes combined is more than from technological change alone. It includes factors like making bad business decisions or losing market share to competitors. These can happen even if the total market size and the technologies used haven't changed. Changes which affect employment constantly happen, so a percentage of people are always at risk of losing their job. In the US, the actual rate of involuntary job separations is about 15% per year, with between 3.5 and 10% unemployed at any given time. Our economic system assumes most people trade their labor for money, so they can then trade the money for things they need and want. Unexpected lack of work is then a problem for meeting basic needs.
 '''Economic Inequality''' - Early humans had to work together and share to ensure survival. They had to move to where food could be found, which didn't allow accumulating many physical goods. So economic inequality was limited. Since the development of property rights and gaining from the work of others, the inequalities could grow. Thus ancient emperors and kings accumulated far more wealth and power than the slaves or peasants at the bottom of the social structure.
 We have a far higher average quality of life today, but these inequalities persist. Stored wealth provides a reserve to withstand setbacks like job loss or illness. Low income inhibits building such reserves, so setbacks can be catastrophic. Lack of resources can result in poor education, which can perpetuate low incomes in later generations. Poverty also can result in poor nutrition, health care, and living conditions. Relative poverty can persist even in developed economies, and even while the poor are working.
 '''Work Displacement''' - New technologies since the mid-20th Century are enabling "smart tools" which can replace part or all of the work people do in existing jobs. The tools may still need a person's attention part of the time, but significantly less than when the work is done without them. If fewer people are needed for a given amount of work, then without other changes, those people can become unemployed.
 The technologies of the '''[[w:Industrial_Revolution|Industrial Revolution]]''' replaced large amounts of manual labor in the past, but the pace of change was slower. People were able to transition to work in other fields, including new ones enabled by better technology. The problem with smart tools is they can be rapidly introduced via modern mass production and automation. They may do jobs so well that entire categories of work are greatly reduced.
 Demand for new types of goods and services can create replacement jobs, but some people are not suited for high-skill jobs like programming and designing robots. The number of new jobs may also be much smaller than the ones lost. Software and robots only need to be designed once, then copied many times. If new jobs are not created fast enough permanent unemployment may increase in coming years.
 Some examples of current and near-term work displacement include:
:* Self-checkout at supermarkets and card readers at gas station pumps. These have reduced the need for cashiers.
:* The mass introduction of warehouse robots by Amazon, which reduces how many workers are needed to fill orders.
:* The ongoing development of self-driving vehicles, which may affect all kinds of transportation and delivery jobs. Automated warehouses plus automated delivery puts all kinds of retail jobs at risk, by entirely bypassing retail distribution.
:* The development of AI agents like Alexa, Siri, Cortana, and Google Assistant, coupled with augmented/virtual reality devices. They are currently used for home automation and entertainment. But in the future, schools may face pressure to replace some of the teacher's work with interactive systems using these kinds of tools. What happens to teachers and school systems in that case?
 '''Systemic Effects''' - When competition and technical change eliminate current jobs or make skills obsolete, they break the cycle of work for money, then money for goods and services, by which the current system operates. Without earned income, the unemployed don't pay income and payroll taxes. They don't buy as many goods, so sales taxes also go down. Therefore governments will lose a share of the revenue they need to function. Lower government revenue means social programs and government employment also decrease, further lowering economic activity. The businesses the unemployed no longer buy from also lose income and employment, even if they use smart tools. The owners of such businesses lose a share of their income too.
 Lack of enough paid work is then a systemic problem for a capitalist economy which depends on it as an integral part. Such spirals of contracting economic activity are called recessions or depressions, and cause large-scale unhappiness and even civil unrest. These are undesirable results. If the existing system can't handle this problem, then what sort of system should replace it? If changes are required, how do we manage the transition?
 The wealthy, those with sufficient retirement income, and beneficiaries of social programs are not at immediate risk of becoming unemployed. Their needs are met in other ways. Also a significant number of people are dependents of workers, so in total only about half the US population is currently working or between jobs, and directly at risk of displacement. However, large-scale replacement of work has broader effects on the entire economic system, so it can eventually affect everyone.
 This problem isn't yet severe, but it is better to deal with it before it reaches that level. The other three problems already exist, and we would like to find solutions for them too. A number of ideas have already been proposed, which we look at below. It is unclear if these solutions can work on a large scale, singly or in combination. We would like other options, so Chapter 2.1 presents self-improving systems and seed factories as a new approach that can potentially scale to any size needed.
===<span style="font-size:large; font-family:'Georgia', serif;"><u>4.2 - Previous and Recent Approaches</u></span>===
 
 '''Social Systems''' - Modern humans are '''[[w:Social_animal|Social Animals]]'''. We constantly interact with other people and depend on them, rather than operate as lone individuals. Some things we can do for ourselves, such as cooking meals at home. But to make that possible we rely on other people to supply electricity and natural gas for cooking, make the appliances and utensils we use, and grow, transport, and sell the food to cook.
 There have always been members of society who are disadvantaged in some way, or can't fully contribute to the functions of society. Examples include the very young or old, and those who are injured or sick. Because we function as a society, we care for others and realize we may become disadvantaged ourselves at some point.
 Care for others is carried out at the level of family and friends, through voluntary contributions and organizations, and through involuntary programs funded by taxes and operated by governments. The care has one of two goals. The first is solve the person's disadvantages if that is possible. So we raise and educate children, and heal the sick and injured, so they can function as part of society. If the problems are unsolvable, as with very old people, our goal is to give them at least a decent quality of life.
 The economic problems noted in 4.1 above can affect those who are able to work, but disadvantaged by their circumstances. Their skills may be obsolete due to technological change, or their employer no longer finds their work useful enough to cover their wages. They are then left without income to buy the things they need. They may not have the capital, or access to it, to purchase improved equipment. They may also lack the time, funds, or ability to learn new skills. These disadvantages leave them unable to enter new fields and continue working. In the future, so much work may be displaced by smart tools that there simply isn't enough left for the people who want or need it.
 '''Previous Approaches''' - People have dealt with past economic problems the same ways we deal with other problems in society. They approach them as individuals, through family and friends, voluntary organizations, or involuntary programs. Previously used methods have had varying levels of success, and none have yet had to handle wholesale replacement of work. Proposals to meet the challenges of smart tools may be inadequate. To the extent they are not full solutions, or we are uncertain of their future capacity as such, there is a need for additional new approaches.
 Everyone is born unable to care for themselves, and without the knowledge and skills to function as part of society. The general approach to solving this is care and education of the young. This is supplied by their parents and some combination of other people. Childhood education supplies the basic skills for self-care, language, and other areas that are assumed to be needed by everyone in society. More advanced education and training then supplies specialized skills. These enable trading work for income. Some people follow their interests rather than using their skills for maximum income. This is only possible in societies with enough surplus to support optional activities beyond those needed to live.
 Generally childhood care and education is provided by parents first, then by government programs funded by taxes. The more advanced education is provided in a variety of ways: by government programs, by private sources and institutions who have sufficient funds, and by students borrowing against their future income. Some retraining programs exist for people in later life who choose or are forced to change fields. The education system generally works, although there are some problems with funding, personal cost, and access.
 For people who are disadvantaged in other ways besides being young, another general approach is wealth redistribution. This is mainly via taxes and social programs, with some voluntary contributions and organizations. Wealth normally flows upwards towards those who already have some. They gain from the work of those they employ or lend capital to, in addition to whatever work they do themselves. Unlike their own work, these gains are unlimited, so their wealth can rapidly accumulate. Redistribution can then have two purposes. One is to avoid extreme accumulation by the wealthy at the expense of everyone else. The other is to fund programs from those who are more able to pay, for the general protection and improvement of society as a whole, or directed to the less fortunate or able.
 Redistribution happens when the incidence of funding sources is different than the social distributions they provide. When a billionaire is taxed to fund a public school system, the net distribution is downwards. But this is not always true of taxes and government programs. For example, government contracts with companies that have highly paid workers and wealthy corporate owners may move funds higher on the wealth scale than the people taxed to pay for them.
 Social programs generally intend to help those who need it via redistribution. One program to deal with job insecurity is unemployment insurance. Employers pay a tax to fund this program, which then temporarily pays people who can't find work. Another set are old age and medical programs funded by employers and the workers themselves. People eventually grow too old to work, and need more medical care. They can also become disabled or die when younger. The programs then provide income and medical coverage for former workers and their dependents. The redistribution effect comes from benefits being capped while funding has higher limits, and from minimum benefits being supplied even if lower income doesn't cover them. A third set of programs are aimed at re-education and retraining for people affected by economic changes.
 In addition to voluntary and government programs, people are encouraged to save from their current wages. This is to cover adverse conditions like job loss or health problems, and for eventual retirement. They can also pursue self-training and education. People helping themselves is useful, but not always possible given their circumstances. If their income is low, there may not be enough surplus to save. Their work and family care may not leave enough time to gain new skills. Overall, the set of approaches used to deal with economic problems have worked well enough that people haven't yet demanded large changes to them.
 '''Recent Proposals''' - The rapid development of smart tools has the potential to cause large-scale displacement of work, without creating enough new work in other areas to replace it. The concern is for the social and economic disruption this can cause in a system based on trading work for money. The most commonly proposed approach involves increased government redistribution from those who have, to those who do not.
 One version is called '''[[w:Basic_income|Basic Income]]''', or sometimes '''[[w:Negative_income_tax|Negative Income Tax]]'''. It is intended partly to replace other existing social programs with a simpler method, and also to address permanent work displacement. The concept is to provide payments to every adult, or in some versions every individual, regardless of need or income level. It would provide a minimum floor to living standards. People and businesses with sufficient wages and income would be taxed to fund this system, much as they do existing programs. An alternate version is to increase government employment and funded work programs, such as a '''[https://www.jacobinmag.com/2017/02/federal-job-guarantee-universal-basic-income-investment-jobs-unemployment/ Federal Job Guarantee]''' This may be more acceptable than simply giving money to everyone, since the recipients are seen as working for what they get, and the work itself can be useful.
 The problem with these approaches is they can't be sustained in the face of large-scale replacement of work. As we noted in sectopm 4.1 above, the systemic secondary effects of work displacement reduce many of the other sources for taxation. There would not be enough tax revenue left to make the payments from. Very high tax rates on the remaining sources encourage people and businesses to move elsewhere to avoid them, or find ways to hide what is taxable. Unless the new taxes are applied everywhere and strictly enforce, the incentives to move or hide will be strong. We see this already with corporations and the wealthy moving funds "offshore" (to another country or jurisdiction) to avoid taxes and hide assets. The alternative of simply creating money to fund the payments would cause inflation, which has other undesirable side effects.
 These approaches don't seem sufficient in the face of large-scale work displacement. So in Chapter 2.1 we propose a new one based on known processes of expansion, replication, and self-improvement.
</div>
{{BookCat}}
02bbbeo0g3nz79klhyxgeemqku0iwma
4676732
4676731
2026-10-18T10:53:21Z
Danielravennest
13526
4676732
wikitext
text/x-wiki
{{DISPLAYTITLE:<span style="display:block;text-align:left;font-size:100%;background:#d0f0f0;line-height:2.5em; font-family:'Georgia', serif;">Chapter 2.0 - History and Concept Development</span>}}
<div style="font-size:125%; font-family:'Georgia', serif;">
<div class="nonumtoc">{{TOCright}}</div>
 In Chapter 1.0 (Introduction) we identified three large-scale problems: insufficient development, a deteriorating environment, and technological unemployment. All three are unintentional side effects of how civilization evolved in the past, and may develop in the near future.
 The growth of modern civilization is still incomplete and unevenly distributed. This results in the first problem, of insufficient development. We've made poor choices in the past due to lack of knowledge and incentives built into the economic system. These are negatively affecting the environment, the second problem. A lack of foresight combined with how our economic system works may lead to the third problem, of large-scale unemployment.
 Before trying to find solutions, we should first understand the history and processes which brought us to where we are. So the first part of this chapter covers processes like expansion, growth, and self-improvement in nature, before people evolved. Then we look at how people have tried to satisfy their needs and make their lives better. More specifically, technology has a long history in human culture. We take a look at that history, leading up to modern technology. In addition to improving our lives, technology brought unsuspected and undesirable side effects, resulting in the current state of civilization.
 '''[[Seed_Factories/SelfImprovement|Chapter 2.1: Self-Improvement and Seed Factories]]''' explores self-improvement as an idea, and its relation to ideas like progress and economic development. The second half of the 20th century took the idea of machine self-replication from theory and philosophy to design and engineering. Technologies like computers and automation developed quickly in this period, making replication a real possibility. The original idea was a machine system copying itself without help, by making and assembling copies of all its own parts. Doing this with physical systems is still beyond our reach. Electronic information, on the other hand, is easily copied, and automated software can do this without people involved.
 We have updated the original idea of fully automated self-replication to an evolving system. It begins with a smaller and simpler seed factory that grows towards higher levels of automation and replication. The changes to the idea are fairly new and not yet completely worked out. '''[[Seed_Factories/Technology|Chapter 2.2: Further Research and Development]]''' considers open questions and what isn't yet known about it. An evolving factory system will also make use of other, more developed, areas of knowledge and experience. So we also look at their current state-of-the-art. Lastly, we look at related projects, and topics for future research and development needed to make use of the seed factory approach.
==<span style="font-size:x-large; font-family:'Georgia', serif;">1.0 - Natural Processes</span>==
 
 Expansion, growth, replication, and tool use are processes which predate civilization, and even modern humans as a species able to think about them. People have always exploited these processes in the past, knowingly or not, and continue to do so today. A short review of their history is in order for a couple of reasons. The first is to understand how modern civilization arrived at its current state. The other is to identify processes and methods we can use. We can combine them in new ways, adapt them to meet our needs, and use them to help solve our pressing problems.
 The natural world doesn't consider internal changes as "better" or "worse". Those are labels that people apply based on our needs, desires, and opinions. We need at least some physical space and objects like food and shelter to keep living. Beyond the bare necessities, most of us strongly desire additional or higher quality things to make our lives better.
 So we describe natural changes as improvements when they enable more of the necessities and desirable extras, or make them easier to get. An example would be the end of the last '''[[w:Ice_age#Glacials_and_interglacials|Glacial Period]]''' about 20,000 years ago, bringing warmer temperatures and freeing fertile land from ice cover. When nature does it without our help we call it self-improvement. The natural world has changed for the better, from our standpoint, based on what we know from '''[[w:Astronomy|Astronomy]]''' and '''[[w:Biology|Biology]]'''.
===<span style="font-size:large; font-family:'Georgia', serif;"><u>1.1 - Astronomy</u></span>===
 
 Expansion as a process appears to be as old as the Universe itself. Red-shifts in the spectra of galaxies, supernova brightness and light curves, and the '''[[w:Cosmic_microwave_background_radiation|Cosmic Microwave Background]]''' radiation imply that '''[[w:Metric_expansion_of_space|space itself is expanding]]'''. This seems to be the combined effect of strong repulsive forces from '''[[w:Inflation_(cosmology)|Cosmic Inflation]]''' during the '''[[w:Big_Bang|Big Bang]]''' ~13.8 billion years ago, and '''[[w:Dark_energy|Dark Energy]]''', which continues to accelerate the expansion. If the inflation theory of cosmology is correct, the growth of large scale structures, now hundreds of millions of light years in size, can be traced to microscopic quantum fluctuations during the inflationary era and acoustic waves that occurred somewhat later.
 Stars, planets, and galaxies grow by '''[[w:Accretion_(astrophysics)|Accretion]]''', the addition of more matter to what is already there. Since the force of gravity is proportional to mass, the ability to attract more matter grows as more mass is collected. This leads to '''[[w:Exponential_growth|Exponential Growth]]''', until all the nearby matter is consumed. Any growth process which is proportional to the current size leads to exponential increases over time. We will see many examples of this in the course of these volumes.
 Stars replicate in a limited sense. They are born with different masses, and their energy output increases much faster than mass. This is known as the '''[[w:Mass–luminosity_relation|Mass-Luminosity Relation]]'''. So the larger stars use up their fuel much more quickly, despite starting with more. As these stars reach the end of their life, they emit large amounts of gas or explode. The shock waves from these processes can create high density areas in molecular clouds. These denser areas can collapse to form a new generation of stars. Our own Sun is thought to be a third generation star whose formation was triggered by a supernova explosion of a nearby older star.
 The early Universe after the Big Bang consisted of hydrogen and helium, and nearly no other elements. '''[[w:Stellar_nucleosynthesis|Nucleosynthesis]]''', the process by which stars shine, also builds heavier elements. There are some additional processes which convert one element to another. We need heavier elements to make the kind planet we live on and the parts of our bodies. So the evolution of generations of stars producing such elements is considered an improvement.
 Planets grow by an exponential process from smaller bodies. A growing '''[[w:Protoplanet|Protoplanet]]''' has a stronger gravitational field, so it can attract nearby gas, dust, and other small bodies to itself. As it gets larger, it's gravity can also change the orbits of other bodies. This causes collisions, with the larger bodies tending to keep more of the combined mass. Debris from collisions continues to collect by attraction and more collisions. Eventually most of the available mass is (1) gathered into planets and moons, (2) thrown into the parent star, (3) ejected from the stellar system, or (4) not ejected, but thrown far enough outwards that further collisions are rare.
 Once formed, planets continue to affect each other's orbits by gravity, and the parent star supplies energy to keep them warm according to their distance. The star's output can vary with time, and it can emit other things besides light. Internally, a planet can generate heat by various means, and that heat can drive geological processes. So a planet's environment can get better or worse with time in quite complicated ways.
 '''[[w:Galaxy_formation_and_evolution|Galaxies]]''' formed and continue to evolve by a similar growth and evolution processes. Random processes produced regions in the early Universe that were denser than others. They tended to attract other nearby matter to form clouds. The clouds in turn attracted each other, forming larger and larger structures like galaxies and clusters of galaxies. Our own Milky Way galaxy is still consuming smaller ones, as evidenced by leftover streams of gas and stars. The Andromeda galaxy and ours are predicted '''[[w:Andromeda–Milky_Way_collision|to collide]]''' in about 4.5 billion years. The larger the distances, the longer these growth processes take, so they are incomplete in the Universe today.
 Galaxies evolve internally as gas and dust are turned into generations of stars and back again, central black holes grow, and the stars redistribute their positions gravitationally. By late 2022 we have discovered over 5000 '''[http://exoplanet.eu/ Exoplanets]''' - planets around other stars. So we now know the evolution of our Galaxy has resulted in many planets besides the ones around the Sun.
 We consider the evolution of the Universe from the Big Bang until now to be an improvement. It has provided the physical space, heavier elements, and the Earth and Sun that have allowed us to evolve and continue to live. We expect conditions on Earth to deteriorate as the Sun gets brighter and the Earth hotter. Left to itself, life as we know it on Earth will become impossible in 0.6-1.0 billion years.
 It is not yet clear how often and for how long conditions suitable for life happen elsewhere. We also don't know if planetary, stellar, and galactic processes could be artificially used to increase or extend such conditions. But in the mean time, in our current civilization, we can incorporate the ideas of expansion, replication, and exponential growth into our efforts.
[[File:DNA_replication_en.svg|thumb|right|691x336px|Figure 2.0-1 - Proteins, most of whose names end in -ase, separating DNA strands and assembling new complementary ones, which results in two complete copies.]]
===<span style="font-size:large; font-family:'Georgia', serif;"><u>1.2 - Biology</u></span>===
 
 '''[[w:Evolutionary_history_of_life|Living Things]]''' on Earth have grown and reproduced for 3-4 billion years (GY). As a percentage of the age of the planet, life started soon after the surface cooled enough and frequent large asteroid impacts ended about 3.8 GY ago. Life as we know it requires water and '''[[w:Organic_compound|Organic Compounds]]'''. These were either included in the planet's original formation, or delivered afterwards by impacts of comets and asteroids.
 Growth and reproduction are two of the defining features of '''[[w:Life#Biology|Life]]'''. Another defining feature of life is '''[[w:Metabolism|Metabolism]]''', the use of available energy to convert ingested materials into parts of the organism. Some of the new parts are for self-maintenance, and some are for growth. At some point in its life cycle the organism has grown enough to make copies by division at the cellular level. Small organisms like '''[[w:Bacteria|Bacteria]]''' and some '''[[w:Algae|Algae]]''' consist of a single cell which divides repeatedly. Large organisms like whales and trees consist of many cells. They individually divide, become specialized for different tasks, and are grouped into larger structures. Organisms can also incorporate non-living matter, like the mineral parts of bones and shells, or the bark of trees.
 The replication of a large organism involves partitioning one or a small number of cells into an '''[[w:Embryo|Embryo]]''' or '''[[w:Seed|Seed]]''', a smaller and simpler entity than the mature organism. This entity contains all the information to build the mature organism, mainly in the form of long double-chain polymer molecules known as '''[[w:DNA|DNA]]''' (Deoxyribonucleic Acid), often after mixing genetic data from two parents. The sequence of DNA units directs the construction of various '''[[w:Protein|Proteins]]''', which in turn perform a variety of functions necessary for life. One of these functions is separating the two strands of DNA molecules, and assembling complementary units to make a matching second strand for each (Figure 2.0-1). When a cell divides, each copy then contains a full set of instructions so it can continue to live.
 Biological seeds usually contain the plant embryo, which does the actual growing, a supply of nutrients to support the initial growth, and a protective coating. The nutrient supply supports the embryo until photosynthesis and uptake through roots can take over. Animal embryos develop within eggs - containers with a nutrient supply, or are carried internally and supplied by the mother until birth. The initial seed or embryo cells divide and specialize until they become a mature copy of the parent organism. Specialization during the life of one organism, and other short-term changes are affected by '''[[w:Epigenetics|Epigenetic]]''' processes. Humans, being large organisms, grow and replicate in this way, both at the cellular and whole organism level. The process of growth from an embryo or seed is at least 400 million years old.
 Self-reproducing organisms have DNA sequences 0.1 to 670,000 million units in length. Changes to the sequences happen for a variety of reasons. The the changes cause differences in how well the modified organisms live and die in their environment. Different survival and reproduction have produced all the various '''[[s:Species|Species]]''' that exist now, and have existed in the long history of our planet.
 There are several scales at which these changes can happen: at the individual '''[[w:Nucleotide|Nucleotide]]''' unit level, to longer segments of DNA, and by wholesale reshuffling in '''[[w:Sexual_reproduction|Sexual Reproduction]]'''. Until very recently, DNA changes were unplanned and undirected, so the evolution of species was random and slow. For example human DNA varies by 0.1% between individuals in the ~10,000 generations since our modern form evolved. We vary by 1.2% in the 7 million years since we diverged from our nearest living relatives. We can distinguish between long-term information such as coded in DNA, and shorter-term information such as '''[[w:Epigenetics|Epigenetics]]''' and individual memories, which are outside of DNA changes.
 Most of the energy for life ultimately comes from the Sun. Waste products and dead organisms are recycled by other organisms, or accumulate as sediments, which are converted to rock formations by geologic processes. Over very long periods of time, the rocks can again become available as raw materials for life. Communities of living things, together with the non-living surroundings they interact with, form linked '''[[w:Ecosystem|Ecosystems]]'''. These are dynamic entities through which energy and materials flow, often in cycles with feedback loops.
 All living things interact with their surroundings by ingesting food, rejecting wastes, and using local energy sources to sustain themselves. Many species also modify their surroundings by building non-living constructs outside their bodies, such as '''[[w:Nest|Nests]]''', '''[[w:Burrow|Burrows]]''', and '''[[w:Beaver_dam|Dams]]'''. Once built, these structures can perform functions like shelter from the environment or protection from predators. The non-living objects don't need constant biological activity to sustain them.
 People also interact with and modify our surroundings, build non-living objects, and participate in ecosystems with other living things. We depend on the self-expansion and replication abilities of other living things to supply food and other products we need and use.
 We can apply ideas from biology, such as specialization during growth, replication via a smaller and simpler starter entity (i.e. a seed), and replication of information into our designs. We can also incorporate the ideas of energy and material sources, recycling, and ecosystems of related elements. Since many features from biology can be included into artificial self-improving and replicating systems, we can consider them forms of '''[[w:Artificial_life|Artificial Life]]'''.
==<span style="font-size:x-large; font-family:'Georgia', serif;">2.0 - Technology and Culture</span>==
 
 The natural processes of expansion and replication started billions of years before the roughly 300,000 year history of '''[[w:Human|Modern Humans]]'''. As living beings we continue to participate in these processes, and they continue to operate in nature. What makes us distinct is our creation of technology and culture. In a broad sense, '''[[w:Technology|Technology]]''' includes the knowledge and skills needed to make things, but also putting that knowledge to practical use for all the tools, artifacts, and products we make. A tool like a hammer is a technical artifact, but knowing how to make and use hammers is a part of technical knowledge. Humans also produce '''[[w:Culture|Culture]]''' - entities that persist beyond the death of individual people. Both technology and culture involve growth and replication processes. We can better meet our needs by intentionally using these processes in the systems we build.
===<span style="font-size:large; font-family:'Georgia', serif;"><u>2.1 - Recent Evolution and Early Tools</u></span>===
 
 Some animals actively '''[[w:Tool_use_by_animals|Use Tools]]''', objects which are not permanent parts of their bodies. Tools let them perform tasks more effectively than their bodies can alone. Most animal tool-use is passed genetically or arises spontaneously. They lack a knowledge component, so we don't call them technology. Knowledge is learned, saved, and passed on to others. We don't know exactly when the first technologies arose that were passed on this way. Before that, tools were invented each time, then lost when that individual died.
 Many of our relatives among the '''[[w:Primate|Primates]]''' have been observed using simple tools such as sticks and leaves to gather food. Some groups of wild chimpanzees use tools to chop large fruit into smaller pieces so they can be eaten. Neighboring groups do not do this, suggesting knowledge is being learned or passed on within the group that does. So this would count as a very early technology.
 Our early human ancestors also made this kind of transition from spontaneous to learned tool-use at some point millions of years ago. This was likely among the '''[[w:Hominidae|Hominid]]''' (Great Apes) family of primates to which we belong, but an earlier species now extinct and distinctly different from us.
 It is hard to pin down exactly when and how the '''[[w:History_of_technology|History of Technology]]''' began. The oldest activities that might be classed as technology are foraging and nest building by hand. Other species of Great Apes do this, and likely our ancestors millions of years ago did too. However, the remains of meals and nests are biological, and perish over such long periods.
 Beyond using the body, we can speculate about using sticks and unmodified rocks to knock down fruit or kill prey. But wood decays, and while stones can last, they don't leave evidence of their use. The ones which were used as tools, like chimpanzees are observed doing today, are indistinguishable from all the other stones which were not.
 Stones modified by flaking or worn from chopping and cutting are the earliest surviving evidence of technology. We know the technology was being passed on, because of the persistence of particular techniques and their geographic spread over time. If they were spontaneous inventions, which were then lost when the inventor died, the timing and distribution would be more random.
 '''[[w:Recent_African_origin_of_modern_humans|People Today]]''' appear to be the last surviving species or subspecies of the genus '''[[w:Homo|Homo]]''', although DNA analysis indicates some interbreeding with extinct relatives. We emerged in anatomically modern form about 0.2-0.3 million years (MY) ago. This is long after the appearance of early technologies like stone tools (3.3 MY), controlled fire (0.5 - 1.5 MY), and using them for preparing and cooking food (0.5 to possibly 2 MY). So our evolution to modern form happened in parallel with early technology, and it may have contributed to that evolution.
 Compared to other tool-users, modern humans seem to be unique in several ways. These include (1) the number of different objects we make, and their complexity, (2) significant transfer of knowledge from person to person, and indirectly by way of lasting records, (3) extensive use of tools to make other tools, and (4) creating tools which can carry out tasks to some degree on their own. These features have combined to produce accelerating growth and an increasingly complex society.
===<span style="font-size:large; font-family:'Georgia', serif;"><u>2.2 - Technology Accumulation and Acceleration</u></span>===
 
 The key advantage technology has given us over genetic evolution is the speed at which it can accumulate and spread. It helped our ancestors evolve to modern form, out-compete our relatives, and build a civilization which dominates the planet. We are even at the point of artificially modifying biology, doing so much faster than natural changes happen.
 Tool marks on fossilized bones and shaped stone tools date back about 3-4 MY, which starts a period we call the '''[[w:Stone_Age|Stone Age]]'''. These signs show toolmaking was intentional. Their spread across Africa and Eurasia, similarity, persistence over time, and gradual improvement shows knowledge was being passed on. This makes them the first identifiable class of technology, if not the first to develop. Stone tools are harder and sharper than our body parts, and replaceable when broken, but limited by the muscle power we can supply.
 The next great advance was '''[[w:Control_of_fire_by_early_humans|Harnessing Fire]]'''. This increased usable energy, and allowed transforming materials in ways not possible using only stone tools. Fires occur naturally, so it is hard to identify when we first learned to use it and pass on the knowledge. Evidence from caves containing human fossils, hearths, and the remains of fires indicate the technology had been mastered no later than 0.5 MY ago, but possibly starting a million years earlier. Aside from the immediate uses for warmth and discouraging predators, fire led to cooking. Various cooking methods increase available calories, reduce toxicity and pathogens, and preserve some foods for later use. Stone tools, fire, and cooking gave us a survival advantage. It also allowed us to evolve to modern form, with larger brains that need more energy.
 Since reaching our current form, modern humans have developed technology and culture at an accelerating pace. This includes clothing, language, ceramics, domesticated species, and many others. There is a strong positive feedback loop that causes this acceleration. Improved tools gave early humans a survival advantage. Their numbers multiplied and they spread geographically. Assuming a constant rate of inventiveness at a given point in our evolution, more people means more inventions. New locations with a greater variety of living conditions encouraged new solutions to the problems they faced. For example, cold climates led to a need for clothing. New inventions, once made, could then spread elsewhere and be further modified, increasing our survival advantage.
 On top of this feedback loop was the gradual increase in the size and energy use of our brains. This increased our inventiveness over the last three million years, but it also allowed for larger social groups. Modern humans form groups of about 150 people, compared to about 40 for our distant ancestors. Larger groups allowed for specialization of skills and therefore becoming more expert in each, further increasing our survival and numbers. Specialized skills encouraged developing specialized tools for each task. For example, axes and the many varieties of chisels and saws all cut a material by concentrating forces at a narrow edge. But their sizes and shapes have evolved according to the specific materials and needs of the work. Specialized tools were an improvement over the previous generic ones. They also improved survival and increased population, adding to the feedback loop.
 '''[[w:Agriculture|Agriculture]]''' is the part of technology concerned with purposely growing other living things. It began in multiple places between 23,000 and 12,000 years ago, during and after the last Ice Age maximum.
 That living things can grow and make copies of themselves from seeds or by giving birth was probably always evident to people. Understanding the detailed mechanisms only started a few hundred years ago, including replication of DNA, division of cells, and all the supporting bioprocesses. But long before understanding the details, people knew seeds grew into full sized plants, which in turn produced more seeds, and animals gave birth to small copies of themselves which grew to full size. This is known as a '''[[w:Biological_life_cycle|Biological Life Cycle]]'''.
 Because each plant generally produces many seeds, their number can grow exponentially until they are limited by competition or available resources. So any natural landscape which can support them tends to be covered in plants. Total oceanic '''[[w:Primary_production|Primary Production]]''' approximately equals that on land, but is more thinly distributed because the water absorbs sunlight before it can be used. It also consists of more microscopic organisms on a relative basis due to lack of solid anchorage in deep waters.
 Once people learned to exploit the supply of nutrients, in particular plants and animals, and started raising them intentionally, the natural ability of living things to grow exponentially increased the human food supply dramatically. In turn, human population also grew exponentially. More people means more inventions, including better ways to pass on knowledge. So knowledge and culture have also grown at an accelerating rate.
===<span style="font-size:large; font-family:'Georgia', serif;"><u>2.3 - Knowledge Transfer</u></span>===
 
 DNA encodes genetic information, and is passed from generation to generation. But it doesn't change at all, or very little, in the life of an individual. It can slowly change through mutation, and by shuffling parts during replication. The organisms better adapted to their environment by such changes have a survival advantage, and become more common. But it may take many generations for an improvement to spread through a population. In contrast, learning is a process which allows variable information to accumulate within the life of a single organism.
 The ability to learn has evolved in many forms throughout the animal kingdom ('''[https://doi.org/10.1017/S1464793103006225 Moore, 2004]'''). That evolution was at the same slow pace of other genetics, but once learning is possible, information could accumulate faster. For most species, the learning is lost when the individual dies and must be done anew each generation. Knowledge transfer is more efficient since the organism doesn't have to repeat all the trial and error in accumulating knowledge. Instead it receives useful information previously learned by others, and has the opportunity to improve on it and pass the improvements to the next generation.
 Early knowledge transfer used methods like observation and imitation, with later additions like gestures and pantomime to focus attention. These transfer methods didn't require special tools. Language and memory techniques are technologies that allowed larger amounts of knowledge to be stored and transferred, over longer time periods. They need training, but still did not need external tools. Art and writing further increased the quantity, persistence, and accuracy of knowledge transfer, and began to store the knowledge separately from people. These techniques now required tools like pigments and chisels to put the information on durable media like stone. Our ability to store, transfer, and copy knowledge has only improved with time, with more and more advanced tools to do it with.
 Pictorial art, such as cave paintings and figurines, didn't require specialized knowledge to understand because they were similar to the originals they represented. Pictorial symbols were more abstract and required some learning to understand. Finally, abstract symbols like numbers and alphabets required the most learning to use, but could represent ideas and new things which didn't yet exist. Along with increasing abstraction, our storage media have evolved from marked stone to clay, papyrus, printed paper, and the rapidly changing electronic methods.
===<span style="font-size:large; font-family:'Georgia', serif;"><u>2.4 - Sequential Toolmaking and Specialization</u></span>===
 
 Parts of the body are the universal first tools, but they are grown rather than made, and their variety is fixed by genetics. For a given species, body parts have a fixed repertoire of actions they can perform. For example, human elbows are limited to less than 180 degrees in bending. Body parts are also limited in terms of strength, size, durability, and other features. You can use your fist as a hammer, but only for certain light tasks without injury. Many animals use natural objects, like rocks and twigs, as tools to pound or poke. Fewer will modify natural objects to suit a task. Humans, and our recent relatives, seem to be the only species who first make one tool, then use that to make another, which we call "sequential toolmaking".
  '''[[w:Hammerstone|Hammerstones]]''' are natural round stones used to shape other stones, or to crush, pound, or grind other materials. They are found, rather than made. The oldest identifiable made tools are split and flaked stones from Kenya that are 3.3 million years old. They were not used to make more tools. If they wore out or broke, you needed to start fresh with new rocks. The skills and knowledge, however, could be copied by observation and imitation, even if language did not exist yet. Later in our history, the original stone tools started to be used to make secondary tools.
 A '''[[w:Hand_axe|Hand axe]]''' may be shaped by a hammerstone. If the axe is then used to cut and shape a '''[[w:Digging_stick|Digging Stick]]''', which in turn is used to pry up edible roots, that is a sequence of two tools, both of which are made. Sequential toolmaking requires enough memory and planning to accomplish the whole series. The knowledge and production may be among several people, but they all have to exist within a given society. Hand axes and scrapers made from split rocks can be used to cut and peel branches, which can then be used as handles for axes. A tool with more than one part and made from different materials is a step up in complexity. Complex tools can be more efficient. In this case the handle increases leverage and allows more splitting force.
 The earliest cycle of tools to make more tools of the same kind may be using digging sticks and hammerstones to excavate and flake stones, which in turn can cut and sharpen more digging sticks. Over time, hand tools such as these were used to make better tools and artifacts, a process which still continues today. Modern humans have developed by far the most complex sequences of tools used to make other tools. This includes loops which lead back to earlier and simpler tools.
 '''Specialization''' - As our social groups got larger, their members developed specialized skills. One of these skills was making tools for others to use. Specialized groups of toolmakers, such as blacksmiths, were able to copy their own tools, plus make tools for other people. We can make a distinction between the toolmakers and nearly everyone else - who use tools made by others. Specialized toolmakers persist as a significant segment of industry, since modern civilization can't function without all the tools they make. This includes making better tools than the ones we already have, a process we expect to continue in the future. Modern society is filled with tools, from kitchen utensils to smartphones. But the vast selection tools and machines found throughout civilization can all trace their existence to the self-making toolmakers.
 Early blacksmiths could copy tools for themselves and others, but their work was not mechanized and certainly not automated. Animal, water, and wind power later augmented human muscles, and increased total production. More recently steam and electrical power further improved production rates. As the scale of production and the knowledge involved grew, toolmakers also became specialized. Specialties like mining, steel mills, foundries, and machinery builders still retain the collective ability to make more tools and machines of the type they themselves use. So as a group they are still able to copy their own tools, plus make tools and machines for others.
===<span style="font-size:large; font-family:'Georgia', serif;"><u>2.5 - Self-Operating Tools</u></span>===
 
 '''Energy''' - Tools require energy to perform their function. At first, all work was performed entirely by human muscle, which in turn gets its energy from food. The first outside energy source was probably fire, for tasks like cooking, firing pottery, and smelting copper. Once animals were domesticated we could add their muscles to ours.
 '''[[w:Mechanization|Mechanization]]''' refers to the replacement of muscle power with devices using other power sources. Boats using wind power and mills using water power are early examples. They have been used since ancient times in particular cultures and for particular tasks, but many tasks were still performed by muscles. Replacing muscle power only became widespread since the '''[[w:Industrial_Revolution|Industrial Revolution]]''', starting around 1760. Coal and sometimes wood were used to make steam, whose pressure could drive mechanical devices. More recent engines use combustion gases to directly produce motion. Electricity from a variety of energy sources has allowed distributing power to whatever devices need it. Motors can convert this power to motion at the point of use.
 '''Self-Operation''' - For three million years our tools were passive, not doing anything unless people used them. A fire can continue to burn for a time once started, but requires frequent attention for safety and additional fuel. '''[[w:Domestication|Domesticated]]''' species may be considered the first self-operating tools. They are improvements over acquiring food in the wild, and agriculture is an important technology, so they fit within a broad definition of tools. Since they are living things, hunting dogs can chase prey, livestock can forage, and cultivated plants can grow, all without constant human attention or work.
 Domestication of living things started about 15-30,000 years ago. It wasn't until about 7,500 years ago, with the development of sail power, that non-living tools could start to perform active functions to some degree on their own. Wind provided an external energy source to move the sail, and the boat it was attached to. As long as the wind is steady, the boat can continue to move without constant attention by people. This differs from rowing or paddling, which need constant action.
 Simple tools, like a hammer, need a person's constant attention and muscle power to operate. More complex ones, like an electric drill, replace some or all of the muscle power, but still need our full attention and guidance. A '''[[w:Mill_(grinding)|Mill]]''' powered by wind or water may not need constant attention to keep turning and grinding, though it still needs labor for other tasks. It is therefore partially self-operating.
 '''Smart Tools''' - Where mechanization replaces muscles, technologies like '''[[w:Automation|Automation]]''', '''[[w:Robotics|Robotics]]''', '''[[w:Software|Software]]''' and '''[[w:Artificial_intelligence|Artificial Intelligence]]''' (AI) can also replace the senses, and decision-making of people. We call devices which use such technologies '''Smart Tools'''. They make possible mechanical, electrical, electronic, and information systems which can function to a greater degree on their own. This reduces the need for constant human attention and intervention for work tasks. Therefore more can get done relative to the time people spend on it.
 By the mid-20th century, electronics had developed to the point they could be programmed and used as sensors. The field of '''[[w:Control_theory|Control Theory]]''' had developed enough to design self-operating systems that used these electronic devices. Automation, robotics, and software started to develop on a large scale from that time. AI took until the late 20th century to develop enough for practical applications, and is now being widely deployed.
 If our tools no longer need our strength, attention, guidance, or control, the need for our labor is reduced or eliminated. In theory, a set of sufficiently smart tools could be given instructions, then then proceed to build everything else we need and want with little effort on our part. This includes making copies of itself. In practice, we don't yet have tools that smart. The ones we do have, though, are increasingly able to work on their own and need less help from us. Smart tools are the latest in a long series of '''[[w:Productivity_improving_technologies|Productivity Improving Technologies]]'''. Like new sources of energy and mechanization, they will lead to a better quality of life, but in the process can disrupt economic systems based on trading labor for other goods and services.
===<span style="font-size:large; font-family:'Georgia', serif;"><u>2.6 - Cultural Elements</u></span>===
 
 Culture can be described as things that persist in society beyond the life of any given person. It includes both non-material elements and '''[[w:Material_culture|Material Culture]]'''. Non-material culture includes things like patterns and knowledge. For example, an early '''[[w:Hunter-gatherer|Hunter-Gatherer]]''' band could persist as a pattern for a much longer time than any member lived. Language and how to use it is knowledge that can be passed down through many generations orally, without ever being written down. Material culture, like tools and cities can, if maintained, also last well past the life of any individual. The life span of an artifact, however, does not determine if it is cultural. The important feature is whether it exists independent of human biology. For example, a fast food soft drink cup may only be used for a few minutes, or sit on a shelf for years, but our internal biology does not affect these lifetimes.
 All kinds of cultural elements can exhibit growth and replication. A hunter-gatherer band can grow to the point it divides into two bands. A language can grow by the addition of new words, and by new people adopting it. New languages can form when people live far enough from each other that they rarely communicate. Shifts in vocabulary and usage then lead to enough changes that there are two distinct languages instead of one.
 Widespread distribution of media like books and video have tended to stabilize language content, and worldwide communications means nobody is too far away any more to interact. Although the trend is now for small languages to disappear in favor of the more common ones, the remaining languages continue to grow by adding new words and speakers. Cities can grow horizontally in area and vertically above and below ground level. Historically they multiplied by intentionally setting up colonies, or grew around a local feature by attracting settlers. No two cities are the same, but they may share many similar components.
 The oldest elements of culture that showed growth and replication predate modern humans. They include '''[[w:Band_society|Band Society]]''', and early types of technology in the form of hunting, foraging, and tool-making skills. Species of the genus '''[[w:Homo|Homo]]''', to which we belong, expanded repeatedly across the world over the past few million years. Successful social groups therefore presumably divided when their population became larger than a given area could support.
 Skills could grow by accumulation of details and technique and by specialization. Each person has a limited memory and time to learn. So specialization allows more total skills to be passed on. Cultural replication included making new copies of tools from raw materials, but not generally using an existing tool to copy itself. Instead, a collection of tools was brought to bear on making copies of its members.
==<span style="font-size:x-large; font-family:'Georgia', serif;">3.0 - Industry and Economics</span>==
 
[[File:Five_Myr_Climate_Change.svg|thumb|right|640x233px|Figure 2.0-2 - Quaternary glaciation temperature variations.]]
 The last 2.8 million years are known as the '''[[w:Quaternary_glaciation|Quaternary Glaciation]]''', during which ice sheets have expanded over parts of the world's land areas. There was both a drop in the long-term average temperature, and increasingly large temperature cycles of 41,000 and then 100,000 years (Figure 2.0-2). The Antarctic ice sheet persisted even in the warm periods, and variable amounts of other ice sheets grew during the cold periods. Our ancestors evolved during the Quaternary, and our modern form developed during the last few thermal cycles, 200-300 thousand years ago.
 For reasons that are not entirely clear, after the most recent warming 18-12,000 years ago, there was a dramatic change in our technology, culture, and population. In a relatively short period we went from hunter/gatherer bands to space travel, developing agriculture, cities, and large accumulations of knowledge. Work has become very specialized, and trade using money as an intermediary is now world-wide. These changes also brought new kinds problems and side effects, including the ones identified in the Introduction (Chapter 1.0).
===<span style="font-size:large; font-family:'Georgia', serif;"><u>3.1 - Economics</u></span>===
 
 Before developing tools and technology, our ancestors survived the same way as other animals. They were part of biological ecosystems, and obtained their food mainly from other living things. Both primates and their food sources were self-reproducing, and self-expanding to the point of filling their ecological niches. Goods and services, and therefore trade, were limited in scope, consisting of highly local things like sharing food and grooming. Studies of living primates indicate they have a sense of fairness and reciprocity, so our ancestors likely did too. These behaviors enhanced group survival, but they also underlie modern trade.
 '''Early Trade''' - By the start of the '''[[w:Neolithic|Neolithic]]''', around 12,000 years ago, modern humans had developed a number of technologies and tool types. These included an assortment of stone tools, fire, cooking, clothing, the first domesticated species (dogs), and ceramics. Prior to the development of agriculture, societies were more mobile, because they had to follow or go to where the food was. This limited the amount of tools and other artifacts they could accumulate to the level of seasonal camps. Whatever they could not carry to the next location had to be left behind and made anew, or if durable enough, stored in caches for later return.
 People at that time were anatomically modern. Their social groups could range up to around 150 members, so could specialize in different tasks. Specialization involves trade in goods and services from other specialists. The mobility of hunter-gatherer cultures meant they also encountered other groups in the course of their seasonal movements. This encouraged trade in specialties between the groups, in their members, and in items and materials which came from more distant places.
 The '''[[w:Neolithic_Revolution|Neolithic Revolution]]''' marks the transition from hunter-gatherer to agriculture and fixed settlements as a way of life. This happened multiple times in separate locations around the world. Domestication of plants and livestock increased their quality as food sources. Intentional planting and care of herds greatly increased the food supply relative to the natural state. The increased quality and quantity of food allowed for large increases in population density.
 Raising plants and animals was an investment of labor with a delayed return. The need to protect that work led to less mobile populations. Fixed settlements enabled managing crops, storing food reserves, protecting people and their animals from the elements and natural and human predators. People continued replicating themselves and their food supply through biology, and copying their tools and artifacts through technology. Individual settlements gradually expanded, and their numbers increased by starting new settlements in in different places.
 '''Economic Evolution''' - The increased work that went into agriculture led to property rights as a way to secure that work. You owned what you put work into making or improving. Other people weren't allowed to take it because in effect it was taking the part of your life that went into it. Various ways to protect property developed over time, such as laws and customs, or walls and gates.
 Improved food production produced a surplus. This allowed more people to engage in other crafts and services. One of the new specialties was trading items made by others, i.e. merchants. The amount of goods a merchant can handle isn't limited in the same way a farmer is limited in the area of crops they can grow. The work involved in making a trade can be much less than the work to make the items being traded. Trades only happen when both parties see an advantage in it. So dedicated traders can accumulate large total gains. Ownership passes when goods are traded. So individual traders can accumulate ownership of many goods, more than they can handle themselves. They can then hire as many people as needed to do the physical work, trading a share of their gains for the work.
 One type of property is land, either in the natural state, or has had work put into it like a farm. As populations grew, new areas were occupied, initially by mobile bands. The food from that area was necessary to live, so as a group they protected it from incursion by others. By virtue of the protection work they considered it "their land", to be passed down to later generations. As property rights developed with agriculture, specific pieces of land were claimed by families and individuals and passed down.
 Large areas of land could be accumulated by peaceful methods like trade and inheritance. Another method is taking it using force and violence. The takers could then use slaves or tenants to work the land for them. They took a share of the products by threats or force (pillage), or by imposing rules and customs to make it habitual (taxation). As with merchants, hirelings like soldiers and tax collectors could multiply the gains in return for a share in them. Concentrated ownership, whether through peaceful or violent methods, made possible much larger inequalities than those based on individual abilities.
[[File:World_population_growth_(log-log_scale).png|thumb|right|800x480px|Figure 2.0-3 - World population over time.]]
 The development of property rights, increased division of labor, organized trade, accumulation of wealth, and taxation all came out of the Neolithic Revolution. They produced an economic system with recognizable elements that persist to this day. Agriculture also induced a huge increase in population (Figure 2.0-3). The graph shows population history on a logarithmic scale, to better show the dramatic changes in both speed and numbers. Each labeled division on the axes is a factor of ten in time before the year 2000 (horizontal) and total population in millions(vertical).
 Population before agriculture was a few million. By the time iron production became widespread, about 1000 BC, it had grown to about 50 million, and by the time of Classical Greece to 150 million. The much larger population led to more rapid improvements in technology, including in economic systems. The general trend of population growth and accelerated change has continued to the present day, with occasional setbacks.
===<span style="font-size:large; font-family:'Georgia', serif;"a><u>3.2 - Modern Economies</u></span>===
 
 The work people do in modern economies, and how they do it, is highly specialized. The US Bureau of Labor Statistics tracks over a thousand '''[https://www.bls.gov/oes/current/oes_nat.htm Detailed Occupations]''', each of which are further specialized. For example, farm workers in crops are listed as one occupation type, but vegetables, fruits, and field crops all use different skills and equipment. The US Census Bureau tracks over a thousand different industries in their '''[https://www.census.gov/naics/ Statistics System]''', all of which use different tools and skills to produce different goods and services. Specialization is efficient, but people and industries must then trade for all the things they don't make or do themselves.
 Modern economies are also based on a mixture of voluntary trade and action, and involuntary use of force, actual or implied. To the extent people find the functions of government useful, and are willing to pay for them, they are funded voluntarily. There are always people who would contribute less if not forced to, so that portion is involuntary. When the dominant mode of trade and action is voluntary, we call it a '''[[w:Market_(economics)|Market]]''' economy. When that economy also includes large proportions of capital accumulation, wage labor, and trade using money, we call it '''[[w:Capitalism|Capitalism]]'''.
 Modern economies typically include a capitalist sector, smaller-scale individual trade, plus a variable-sized government sector whose control varies from autocratic to extensive public choice and direction. Trade is now interconnected on a world-wide scale, so there are no truly isolated economies any more. There are many local variations in the relative sizes of government, capitalist, and individual sectors, in the extent of physical and social development, and in the local environments and resources which underlie the economic activity.
 In terms of total activity, the modern world economy is mostly based on large-scale capitalism. By large-scale, we mean large amounts of capital controlled by a smaller number of people and organizations. They employ larger numbers of people for their specialized labor, and pay them wages in return. For example, in the US, only about 10% of workers do so for themselves rather than others. The capitalists keep a share of the revenues as profits.
 The majority of people, both wage-earners and capital owners, then use the money they obtain as an intermediate good to trade for the other goods and services they need and want. The goods and services in turn are mainly produced by the capital owners and their organizations, forming a complete trading system. Governments operate in a similar way - employing people and paying them wages. The difference is their capital is publicly owned rather than private.
 A system where most people work for wages is a relatively recent historical development. For example, in the United States (US) the majority of workers were agricultural until 1880, and primarily worked for themselves (see Table 2 in '''[https://www.nber.org/chapters/c1567.pdf Output, Employment, & Productivity in the United States, Brady, NBER, 1966]''').
==<span style="font-size:x-large; font-family:'Georgia', serif;">4.0 - Economic Problems and Approaches</span>==
 
 There are several drivers in the current system which have produced rapid economic growth relative to earlier periods. These include innate desires, competition, and improved technology. While modern economies have brought many benefits, they have also created problems, some of which we consider in this section.
 Capitalist economies have an implicit goal of perpetual self-expansion. This is driven by the desires for a better quality of life and the accumulation of wealth and power. These desires are expressed in monetary form by increasing incomes and market values. But perpetual growth for some can be at the expense of others. Over-consumption of resources and discharge of wastes in the pursuit of growth can also damage health and the environment in which we all live.
 Competition in the current system has made it fairly efficient. Technical improvements have also increased the quality and quantity of goods and services over the last few centuries. But these have caused problems due to the pace of change, job insecurity, and economic inequality. In the future, smart tools may also cause wholesale work displacement. The current system and the problems it causes can also create social problems. However, here we will mainly focus on economic problems, their effects on people, and attempts to deal with them.
===<span style="font-size:large; font-family:'Georgia', serif;"><u>4.1 - Economic Problems</u></span>===
 
 As modern economies evolve, some of their problems can be traced to the effects of change. Other problems can be traced to inequalities of resources and distribution. We will group current economic problems under three headings: the pace of change, job insecurity, and economic inequality. To these we will add the potential future problem of work displacement.
 '''The Pace of Change''' - The Neolithic Revolution is only 1/300th of the time since the first recognizable tools. Agriculture caused a large population increase, which started an accelerating a feedback loop: Our biology, and therefore inventiveness, hasn't changed much in the last 12,000 years. So more people means more new technology and social innovations per year. These improvements allow more population growth, and faster spread of inventions and ideas. So further changes happen more quickly as time goes on.
 When changes were small during the working life of an individual they were not a major problem. A given person could continue their current craft, with their existing skills and tools, until they stopped working. They could gradually be replaced by a new generation of people following new methods. Until the last few centuries, most people worked for themselves in agriculture. They could adopt new tools and methods on their own, or stay with the older ways. The capital required for new items was small enough for individuals and the local community. For example, the horse collar, horseshoe, and heavy plows increased farm production by 50% and allowed working heavy soils that were previously unsuitable. Such tools were within reach for local farmers.
 The pace of change became much faster in recent centuries. Replacing hand weaving with machine looms, and draft animals with farm tractors took about 50 years each, within the life of one person. By the late 20th century, electronics were doubling in performance every few years. Old skills and entire job categories could become obsolete within a working lifetime. People often could not afford to enter new fields due to the time and expense of retraining. For some it was too late in their lives to learn new skills and get enough use of them afterwards. Such people were simply left behind.
 The capital needed for new technologies like blast furnaces and railroads grew far beyond local means. To remain economically competitive, people went to work for those who could supply the capital and machines, rather than for themselves. In many cases people had to take whatever work was available, rather than following their interests and abilities.
 '''Job Insecurity''' - Individual farming has many risks, but getting laid off when you work for yourself isn't one of them. Labor is a cost to any business, so owners and management have a constant incentive to reduce it, and thereby increase profits. They generally employ people only when the expected income from those workers exceed their added costs. Shifts in market demand, competition, and new technologies can all make previous jobs uneconomic. Businesses may then resort to layoffs if reductions from retirement or choice to work elsewhere isn't fast enough.
 The level of job insecurity from all causes combined is more than from technological change alone. It includes factors like making bad business decisions or losing market share to competitors. These can happen even if the total market size and the technologies used haven't changed. Changes which affect employment constantly happen, so a percentage of people are always at risk of losing their job. In the US, the actual rate of involuntary job separations is about 15% per year, with between 3.5 and 10% unemployed at any given time. Our economic system assumes most people trade their labor for money, so they can then trade the money for things they need and want. Unexpected lack of work is then a problem for meeting basic needs.
 '''Economic Inequality''' - Early humans had to work together and share to ensure survival. They had to move to where food could be found, which didn't allow accumulating many physical goods. So economic inequality was limited. Since the development of property rights and gaining from the work of others, the inequalities could grow. Thus ancient emperors and kings accumulated far more wealth and power than the slaves or peasants at the bottom of the social structure.
 We have a far higher average quality of life today, but these inequalities persist. Stored wealth provides a reserve to withstand setbacks like job loss or illness. Low income inhibits building such reserves, so setbacks can be catastrophic. Lack of resources can result in poor education, which can perpetuate low incomes in later generations. Poverty also can result in poor nutrition, health care, and living conditions. Relative poverty can persist even in developed economies, and even while the poor are working.
 '''Work Displacement''' - New technologies since the mid-20th Century are enabling "smart tools" which can replace part or all of the work people do in existing jobs. The tools may still need a person's attention part of the time, but significantly less than when the work is done without them. If fewer people are needed for a given amount of work, then without other changes, those people can become unemployed.
 The technologies of the '''[[w:Industrial_Revolution|Industrial Revolution]]''' replaced large amounts of manual labor in the past, but the pace of change was slower. People were able to transition to work in other fields, including new ones enabled by better technology. The problem with smart tools is they can be rapidly introduced via modern mass production and automation. They may do jobs so well that entire categories of work are greatly reduced.
 Demand for new types of goods and services can create replacement jobs, but some people are not suited for high-skill jobs like programming and designing robots. The number of new jobs may also be much smaller than the ones lost. Software and robots only need to be designed once, then copied many times. If new jobs are not created fast enough permanent unemployment may increase in coming years.
 Some examples of current and near-term work displacement include:
:* Self-checkout at supermarkets and card readers at gas station pumps. These have reduced the need for cashiers.
:* The mass introduction of warehouse robots by Amazon, which reduces how many workers are needed to fill orders.
:* The ongoing development of self-driving vehicles, which may affect all kinds of transportation and delivery jobs. Automated warehouses plus automated delivery puts all kinds of retail jobs at risk, by entirely bypassing retail distribution.
:* The development of AI agents like Alexa, Siri, Cortana, and Google Assistant, coupled with augmented/virtual reality devices. They are currently used for home automation and entertainment. But in the future, schools may face pressure to replace some of the teacher's work with interactive systems using these kinds of tools. What happens to teachers and school systems in that case?
 '''Systemic Effects''' - When competition and technical change eliminate current jobs or make skills obsolete, they break the cycle of work for money, then money for goods and services, by which the current system operates. Without earned income, the unemployed don't pay income and payroll taxes. They don't buy as many goods, so sales taxes also go down. Therefore governments will lose a share of the revenue they need to function. Lower government revenue means social programs and government employment also decrease, further lowering economic activity. The businesses the unemployed no longer buy from also lose income and employment, even if they use smart tools. The owners of such businesses lose a share of their income too.
 Lack of enough paid work is then a systemic problem for a capitalist economy which depends on it as an integral part. Such spirals of contracting economic activity are called recessions or depressions, and cause large-scale unhappiness and even civil unrest. These are undesirable results. If the existing system can't handle this problem, then what sort of system should replace it? If changes are required, how do we manage the transition?
 The wealthy, those with sufficient retirement income, and beneficiaries of social programs are not at immediate risk of becoming unemployed. Their needs are met in other ways. Also a significant number of people are dependents of workers, so in total only about half the US population is currently working or between jobs, and directly at risk of displacement. However, large-scale replacement of work has broader effects on the entire economic system, so it can eventually affect everyone.
 This problem isn't yet severe, but it is better to deal with it before it reaches that level. The other three problems already exist, and we would like to find solutions for them too. A number of ideas have already been proposed, which we look at below. It is unclear if these solutions can work on a large scale, singly or in combination. We would like other options, so Chapter 2.1 presents self-improving systems and seed factories as a new approach that can potentially scale to any size needed.
===<span style="font-size:large; font-family:'Georgia', serif;"><u>4.2 - Previous and Recent Approaches</u></span>===
 
 '''Social Systems''' - Modern humans are '''[[w:Social_animal|Social Animals]]'''. We constantly interact with other people and depend on them, rather than operate as lone individuals. Some things we can do for ourselves, such as cooking meals at home. But to make that possible we rely on other people to supply electricity and natural gas for cooking, make the appliances and utensils we use, and grow, transport, and sell the food to cook.
 There have always been members of society who are disadvantaged in some way, or can't fully contribute to the functions of society. Examples include the very young or old, and those who are injured or sick. Because we function as a society, we care for others and realize we may become disadvantaged ourselves at some point.
 Care for others is carried out at the level of family and friends, through voluntary contributions and organizations, and through involuntary programs funded by taxes and operated by governments. The care has one of two goals. The first is solve the person's disadvantages if that is possible. So we raise and educate children, and heal the sick and injured, so they can function as part of society. If the problems are unsolvable, as with very old people, our goal is to give them at least a decent quality of life.
 The economic problems noted in 4.1 above can affect those who are able to work, but disadvantaged by their circumstances. Their skills may be obsolete due to technological change, or their employer no longer finds their work useful enough to cover their wages. They are then left without income to buy the things they need. They may not have the capital, or access to it, to purchase improved equipment. They may also lack the time, funds, or ability to learn new skills. These disadvantages leave them unable to enter new fields and continue working. In the future, so much work may be displaced by smart tools that there simply isn't enough left for the people who want or need it.
 '''Previous Approaches''' - People have dealt with past economic problems the same ways we deal with other problems in society. They approach them as individuals, through family and friends, voluntary organizations, or involuntary programs. Previously used methods have had varying levels of success, and none have yet had to handle wholesale replacement of work. Proposals to meet the challenges of smart tools may be inadequate. To the extent they are not full solutions, or we are uncertain of their future capacity as such, there is a need for additional new approaches.
 Everyone is born unable to care for themselves, and without the knowledge and skills to function as part of society. The general approach to solving this is care and education of the young. This is supplied by their parents and some combination of other people. Childhood education supplies the basic skills for self-care, language, and other areas that are assumed to be needed by everyone in society. More advanced education and training then supplies specialized skills. These enable trading work for income. Some people follow their interests rather than using their skills for maximum income. This is only possible in societies with enough surplus to support optional activities beyond those needed to live.
 Generally childhood care and education is provided by parents first, then by government programs funded by taxes. The more advanced education is provided in a variety of ways: by government programs, by private sources and institutions who have sufficient funds, and by students borrowing against their future income. Some retraining programs exist for people in later life who choose or are forced to change fields. The education system generally works, although there are some problems with funding, personal cost, and access.
 For people who are disadvantaged in other ways besides being young, another general approach is wealth redistribution. This is mainly via taxes and social programs, with some voluntary contributions and organizations. Wealth normally flows upwards towards those who already have some. They gain from the work of those they employ or lend capital to, in addition to whatever work they do themselves. Unlike their own work, these gains are unlimited, so their wealth can rapidly accumulate. Redistribution can then have two purposes. One is to avoid extreme accumulation by the wealthy at the expense of everyone else. The other is to fund programs from those who are more able to pay, for the general protection and improvement of society as a whole, or directed to the less fortunate or able.
 Redistribution happens when the incidence of funding sources is different than the social distributions they provide. When a billionaire is taxed to fund a public school system, the net distribution is downwards. But this is not always true of taxes and government programs. For example, government contracts with companies that have highly paid workers and wealthy corporate owners may move funds higher on the wealth scale than the people taxed to pay for them.
 Social programs generally intend to help those who need it via redistribution. One program to deal with job insecurity is unemployment insurance. Employers pay a tax to fund this program, which then temporarily pays people who can't find work. Another set are old age and medical programs funded by employers and the workers themselves. People eventually grow too old to work, and need more medical care. They can also become disabled or die when younger. The programs then provide income and medical coverage for former workers and their dependents. The redistribution effect comes from benefits being capped while funding has higher limits, and from minimum benefits being supplied even if lower income doesn't cover them. A third set of programs are aimed at re-education and retraining for people affected by economic changes.
 In addition to voluntary and government programs, people are encouraged to save from their current wages. This is to cover adverse conditions like job loss or health problems, and for eventual retirement. They can also pursue self-training and education. People helping themselves is useful, but not always possible given their circumstances. If their income is low, there may not be enough surplus to save. Their work and family care may not leave enough time to gain new skills. Overall, the set of approaches used to deal with economic problems have worked well enough that people haven't yet demanded large changes to them.
 '''Recent Proposals''' - The rapid development of smart tools has the potential to cause large-scale displacement of work, without creating enough new work in other areas to replace it. The concern is for the social and economic disruption this can cause in a system based on trading work for money. The most commonly proposed approach involves increased government redistribution from those who have, to those who do not.
 One version is called '''[[w:Basic_income|Basic Income]]''', or sometimes '''[[w:Negative_income_tax|Negative Income Tax]]'''. It is intended partly to replace other existing social programs with a simpler method, and also to address permanent work displacement. The concept is to provide payments to every adult, or in some versions every individual, regardless of need or income level. It would provide a minimum floor to living standards. People and businesses with sufficient wages and income would be taxed to fund this system, much as they do existing programs. An alternate version is to increase government employment and funded work programs, such as a '''[https://www.jacobinmag.com/2017/02/federal-job-guarantee-universal-basic-income-investment-jobs-unemployment/ Federal Job Guarantee]''' This may be more acceptable than simply giving money to everyone, since the recipients are seen as working for what they get, and the work itself can be useful.
 The problem with these approaches is they can't be sustained in the face of large-scale replacement of work. As we noted in sectopm 4.1 above, the systemic secondary effects of work displacement reduce many of the other sources for taxation. There would not be enough tax revenue left to make the payments from. Very high tax rates on the remaining sources encourage people and businesses to move elsewhere to avoid them, or find ways to hide what is taxable. Unless the new taxes are applied everywhere and strictly enforce, the incentives to move or hide will be strong. We see this already with corporations and the wealthy moving funds "offshore" (to another country or jurisdiction) to avoid taxes and hide assets. The alternative of simply creating money to fund the payments would cause inflation, which has other undesirable side effects.
 These approaches don't seem sufficient in the face of large-scale work displacement. So in Chapter 2.1 we propose a new one based on known processes of expansion, replication, and self-improvement.
</div>
{{BookCat}}
qv0izqqzs9eb6w45azc4c0n0yggyqsl
4676733
4676732
2026-10-18T11:04:15Z
Danielravennest
13526
Formatting & minor edit above section 1.0
4676733
wikitext
text/x-wiki
{{DISPLAYTITLE:<span style="display:block;text-align:left;font-size:100%;background:#d0f0f0;line-height:2.5em; font-family:'Georgia', serif;">Chapter 2.0 - History and Concept Development</span>}}
<div style="font-size:125%; font-family:'Georgia', serif;">
<div class="nonumtoc">{{TOCright}}</div>
 In Chapter 1.0 (Introduction) we identified three large-scale problems: insufficient development, a deteriorating environment, and technological unemployment. All three are unintentional side effects of how civilization evolved in the past, and may develop in the near future.
 The growth of modern civilization is still incomplete and unevenly distributed. This results in the first problem, of insufficient development. We've made poor choices in the past due to lack of knowledge and incentives built into the economic system. These are negatively affecting the environment, the second problem. A lack of foresight combined with how our economic system works may lead to the third problem, of large-scale unemployment.
 Before trying to find solutions, it would be useful to understand the history and processes which brought us to where we are. So the first part of this chapter covers processes like expansion, growth, and self-improvement in nature, before people evolved. Then we look at how people have tried to satisfy their needs and make their lives better. More specifically, technology has a long history in human culture. We take a look at that history, leading up to modern technology. In addition to improving our lives, technology brought unsuspected and undesirable side effects, resulting in the current state of civilization.
 '''[[Seed_Factories/SelfImprovement|Chapter 2.1: Self-Improvement and Seed Factories]]''' explores self-improvement as an idea, and its relation to ideas like progress and economic development. The second half of the 20th century took the idea of machine self-replication from theory and philosophy to design and engineering. Technologies like computers and automation developed quickly in this period, making replication a real possibility. The original idea was a machine system copying itself without help, by making and assembling copies of all its own parts. Doing this with physical systems is still beyond our reach. Electronic information, on the other hand, is easily copied, and automated software can do this without people involved.
 We have updated the original idea of fully automated self-replication to an evolving system. It begins with a smaller and simpler seed factory that grows towards higher levels of automation and replication. The changes to the idea are fairly new and not yet completely worked out. '''[[Seed_Factories/Technology|Chapter 2.2: Further Research and Development]]''' considers open questions and what isn't yet known about it. An evolving factory system will also make use of other, more developed, areas of knowledge and experience. So we also look at their current state-of-the-art. Lastly, we look at related projects, and topics for future research and development needed to make use of the seed factory approach.
==<span style="font-size:x-large; font-family:'Georgia', serif;">1.0 - Natural Processes</span>==
 
 Expansion, growth, replication, and tool use are processes which predate civilization, and even modern humans as a species able to think about them. People have always exploited these processes in the past, knowingly or not, and continue to do so today. A short review of their history is in order for a couple of reasons. The first is to understand how modern civilization arrived at its current state. The other is to identify processes and methods we can use. We can combine them in new ways, adapt them to meet our needs, and use them to help solve our pressing problems.
 The natural world doesn't consider internal changes as "better" or "worse". Those are labels that people apply based on our needs, desires, and opinions. We need at least some physical space and objects like food and shelter to keep living. Beyond the bare necessities, most of us strongly desire additional or higher quality things to make our lives better.
 So we describe natural changes as improvements when they enable more of the necessities and desirable extras, or make them easier to get. An example would be the end of the last '''[[w:Ice_age#Glacials_and_interglacials|Glacial Period]]''' about 20,000 years ago, bringing warmer temperatures and freeing fertile land from ice cover. When nature does it without our help we call it self-improvement. The natural world has changed for the better, from our standpoint, based on what we know from '''[[w:Astronomy|Astronomy]]''' and '''[[w:Biology|Biology]]'''.
===<span style="font-size:large; font-family:'Georgia', serif;"><u>1.1 - Astronomy</u></span>===
 
 Expansion as a process appears to be as old as the Universe itself. Red-shifts in the spectra of galaxies, supernova brightness and light curves, and the '''[[w:Cosmic_microwave_background_radiation|Cosmic Microwave Background]]''' radiation imply that '''[[w:Metric_expansion_of_space|space itself is expanding]]'''. This seems to be the combined effect of strong repulsive forces from '''[[w:Inflation_(cosmology)|Cosmic Inflation]]''' during the '''[[w:Big_Bang|Big Bang]]''' ~13.8 billion years ago, and '''[[w:Dark_energy|Dark Energy]]''', which continues to accelerate the expansion. If the inflation theory of cosmology is correct, the growth of large scale structures, now hundreds of millions of light years in size, can be traced to microscopic quantum fluctuations during the inflationary era and acoustic waves that occurred somewhat later.
 Stars, planets, and galaxies grow by '''[[w:Accretion_(astrophysics)|Accretion]]''', the addition of more matter to what is already there. Since the force of gravity is proportional to mass, the ability to attract more matter grows as more mass is collected. This leads to '''[[w:Exponential_growth|Exponential Growth]]''', until all the nearby matter is consumed. Any growth process which is proportional to the current size leads to exponential increases over time. We will see many examples of this in the course of these volumes.
 Stars replicate in a limited sense. They are born with different masses, and their energy output increases much faster than mass. This is known as the '''[[w:Mass–luminosity_relation|Mass-Luminosity Relation]]'''. So the larger stars use up their fuel much more quickly, despite starting with more. As these stars reach the end of their life, they emit large amounts of gas or explode. The shock waves from these processes can create high density areas in molecular clouds. These denser areas can collapse to form a new generation of stars. Our own Sun is thought to be a third generation star whose formation was triggered by a supernova explosion of a nearby older star.
 The early Universe after the Big Bang consisted of hydrogen and helium, and nearly no other elements. '''[[w:Stellar_nucleosynthesis|Nucleosynthesis]]''', the process by which stars shine, also builds heavier elements. There are some additional processes which convert one element to another. We need heavier elements to make the kind planet we live on and the parts of our bodies. So the evolution of generations of stars producing such elements is considered an improvement.
 Planets grow by an exponential process from smaller bodies. A growing '''[[w:Protoplanet|Protoplanet]]''' has a stronger gravitational field, so it can attract nearby gas, dust, and other small bodies to itself. As it gets larger, it's gravity can also change the orbits of other bodies. This causes collisions, with the larger bodies tending to keep more of the combined mass. Debris from collisions continues to collect by attraction and more collisions. Eventually most of the available mass is (1) gathered into planets and moons, (2) thrown into the parent star, (3) ejected from the stellar system, or (4) not ejected, but thrown far enough outwards that further collisions are rare.
 Once formed, planets continue to affect each other's orbits by gravity, and the parent star supplies energy to keep them warm according to their distance. The star's output can vary with time, and it can emit other things besides light. Internally, a planet can generate heat by various means, and that heat can drive geological processes. So a planet's environment can get better or worse with time in quite complicated ways.
 '''[[w:Galaxy_formation_and_evolution|Galaxies]]''' formed and continue to evolve by a similar growth and evolution processes. Random processes produced regions in the early Universe that were denser than others. They tended to attract other nearby matter to form clouds. The clouds in turn attracted each other, forming larger and larger structures like galaxies and clusters of galaxies. Our own Milky Way galaxy is still consuming smaller ones, as evidenced by leftover streams of gas and stars. The Andromeda galaxy and ours are predicted '''[[w:Andromeda–Milky_Way_collision|to collide]]''' in about 4.5 billion years. The larger the distances, the longer these growth processes take, so they are incomplete in the Universe today.
 Galaxies evolve internally as gas and dust are turned into generations of stars and back again, central black holes grow, and the stars redistribute their positions gravitationally. By late 2022 we have discovered over 5000 '''[http://exoplanet.eu/ Exoplanets]''' - planets around other stars. So we now know the evolution of our Galaxy has resulted in many planets besides the ones around the Sun.
 We consider the evolution of the Universe from the Big Bang until now to be an improvement. It has provided the physical space, heavier elements, and the Earth and Sun that have allowed us to evolve and continue to live. We expect conditions on Earth to deteriorate as the Sun gets brighter and the Earth hotter. Left to itself, life as we know it on Earth will become impossible in 0.6-1.0 billion years.
 It is not yet clear how often and for how long conditions suitable for life happen elsewhere. We also don't know if planetary, stellar, and galactic processes could be artificially used to increase or extend such conditions. But in the mean time, in our current civilization, we can incorporate the ideas of expansion, replication, and exponential growth into our efforts.
[[File:DNA_replication_en.svg|thumb|right|691x336px|Figure 2.0-1 - Proteins, most of whose names end in -ase, separating DNA strands and assembling new complementary ones, which results in two complete copies.]]
===<span style="font-size:large; font-family:'Georgia', serif;"><u>1.2 - Biology</u></span>===
 
 '''[[w:Evolutionary_history_of_life|Living Things]]''' on Earth have grown and reproduced for 3-4 billion years (GY). As a percentage of the age of the planet, life started soon after the surface cooled enough and frequent large asteroid impacts ended about 3.8 GY ago. Life as we know it requires water and '''[[w:Organic_compound|Organic Compounds]]'''. These were either included in the planet's original formation, or delivered afterwards by impacts of comets and asteroids.
 Growth and reproduction are two of the defining features of '''[[w:Life#Biology|Life]]'''. Another defining feature of life is '''[[w:Metabolism|Metabolism]]''', the use of available energy to convert ingested materials into parts of the organism. Some of the new parts are for self-maintenance, and some are for growth. At some point in its life cycle the organism has grown enough to make copies by division at the cellular level. Small organisms like '''[[w:Bacteria|Bacteria]]''' and some '''[[w:Algae|Algae]]''' consist of a single cell which divides repeatedly. Large organisms like whales and trees consist of many cells. They individually divide, become specialized for different tasks, and are grouped into larger structures. Organisms can also incorporate non-living matter, like the mineral parts of bones and shells, or the bark of trees.
 The replication of a large organism involves partitioning one or a small number of cells into an '''[[w:Embryo|Embryo]]''' or '''[[w:Seed|Seed]]''', a smaller and simpler entity than the mature organism. This entity contains all the information to build the mature organism, mainly in the form of long double-chain polymer molecules known as '''[[w:DNA|DNA]]''' (Deoxyribonucleic Acid), often after mixing genetic data from two parents. The sequence of DNA units directs the construction of various '''[[w:Protein|Proteins]]''', which in turn perform a variety of functions necessary for life. One of these functions is separating the two strands of DNA molecules, and assembling complementary units to make a matching second strand for each (Figure 2.0-1). When a cell divides, each copy then contains a full set of instructions so it can continue to live.
 Biological seeds usually contain the plant embryo, which does the actual growing, a supply of nutrients to support the initial growth, and a protective coating. The nutrient supply supports the embryo until photosynthesis and uptake through roots can take over. Animal embryos develop within eggs - containers with a nutrient supply, or are carried internally and supplied by the mother until birth. The initial seed or embryo cells divide and specialize until they become a mature copy of the parent organism. Specialization during the life of one organism, and other short-term changes are affected by '''[[w:Epigenetics|Epigenetic]]''' processes. Humans, being large organisms, grow and replicate in this way, both at the cellular and whole organism level. The process of growth from an embryo or seed is at least 400 million years old.
 Self-reproducing organisms have DNA sequences 0.1 to 670,000 million units in length. Changes to the sequences happen for a variety of reasons. The the changes cause differences in how well the modified organisms live and die in their environment. Different survival and reproduction have produced all the various '''[[s:Species|Species]]''' that exist now, and have existed in the long history of our planet.
 There are several scales at which these changes can happen: at the individual '''[[w:Nucleotide|Nucleotide]]''' unit level, to longer segments of DNA, and by wholesale reshuffling in '''[[w:Sexual_reproduction|Sexual Reproduction]]'''. Until very recently, DNA changes were unplanned and undirected, so the evolution of species was random and slow. For example human DNA varies by 0.1% between individuals in the ~10,000 generations since our modern form evolved. We vary by 1.2% in the 7 million years since we diverged from our nearest living relatives. We can distinguish between long-term information such as coded in DNA, and shorter-term information such as '''[[w:Epigenetics|Epigenetics]]''' and individual memories, which are outside of DNA changes.
 Most of the energy for life ultimately comes from the Sun. Waste products and dead organisms are recycled by other organisms, or accumulate as sediments, which are converted to rock formations by geologic processes. Over very long periods of time, the rocks can again become available as raw materials for life. Communities of living things, together with the non-living surroundings they interact with, form linked '''[[w:Ecosystem|Ecosystems]]'''. These are dynamic entities through which energy and materials flow, often in cycles with feedback loops.
 All living things interact with their surroundings by ingesting food, rejecting wastes, and using local energy sources to sustain themselves. Many species also modify their surroundings by building non-living constructs outside their bodies, such as '''[[w:Nest|Nests]]''', '''[[w:Burrow|Burrows]]''', and '''[[w:Beaver_dam|Dams]]'''. Once built, these structures can perform functions like shelter from the environment or protection from predators. The non-living objects don't need constant biological activity to sustain them.
 People also interact with and modify our surroundings, build non-living objects, and participate in ecosystems with other living things. We depend on the self-expansion and replication abilities of other living things to supply food and other products we need and use.
 We can apply ideas from biology, such as specialization during growth, replication via a smaller and simpler starter entity (i.e. a seed), and replication of information into our designs. We can also incorporate the ideas of energy and material sources, recycling, and ecosystems of related elements. Since many features from biology can be included into artificial self-improving and replicating systems, we can consider them forms of '''[[w:Artificial_life|Artificial Life]]'''.
==<span style="font-size:x-large; font-family:'Georgia', serif;">2.0 - Technology and Culture</span>==
 
 The natural processes of expansion and replication started billions of years before the roughly 300,000 year history of '''[[w:Human|Modern Humans]]'''. As living beings we continue to participate in these processes, and they continue to operate in nature. What makes us distinct is our creation of technology and culture. In a broad sense, '''[[w:Technology|Technology]]''' includes the knowledge and skills needed to make things, but also putting that knowledge to practical use for all the tools, artifacts, and products we make. A tool like a hammer is a technical artifact, but knowing how to make and use hammers is a part of technical knowledge. Humans also produce '''[[w:Culture|Culture]]''' - entities that persist beyond the death of individual people. Both technology and culture involve growth and replication processes. We can better meet our needs by intentionally using these processes in the systems we build.
===<span style="font-size:large; font-family:'Georgia', serif;"><u>2.1 - Recent Evolution and Early Tools</u></span>===
 
 Some animals actively '''[[w:Tool_use_by_animals|Use Tools]]''', objects which are not permanent parts of their bodies. Tools let them perform tasks more effectively than their bodies can alone. Most animal tool-use is passed genetically or arises spontaneously. They lack a knowledge component, so we don't call them technology. Knowledge is learned, saved, and passed on to others. We don't know exactly when the first technologies arose that were passed on this way. Before that, tools were invented each time, then lost when that individual died.
 Many of our relatives among the '''[[w:Primate|Primates]]''' have been observed using simple tools such as sticks and leaves to gather food. Some groups of wild chimpanzees use tools to chop large fruit into smaller pieces so they can be eaten. Neighboring groups do not do this, suggesting knowledge is being learned or passed on within the group that does. So this would count as a very early technology.
 Our early human ancestors also made this kind of transition from spontaneous to learned tool-use at some point millions of years ago. This was likely among the '''[[w:Hominidae|Hominid]]''' (Great Apes) family of primates to which we belong, but an earlier species now extinct and distinctly different from us.
 It is hard to pin down exactly when and how the '''[[w:History_of_technology|History of Technology]]''' began. The oldest activities that might be classed as technology are foraging and nest building by hand. Other species of Great Apes do this, and likely our ancestors millions of years ago did too. However, the remains of meals and nests are biological, and perish over such long periods.
 Beyond using the body, we can speculate about using sticks and unmodified rocks to knock down fruit or kill prey. But wood decays, and while stones can last, they don't leave evidence of their use. The ones which were used as tools, like chimpanzees are observed doing today, are indistinguishable from all the other stones which were not.
 Stones modified by flaking or worn from chopping and cutting are the earliest surviving evidence of technology. We know the technology was being passed on, because of the persistence of particular techniques and their geographic spread over time. If they were spontaneous inventions, which were then lost when the inventor died, the timing and distribution would be more random.
 '''[[w:Recent_African_origin_of_modern_humans|People Today]]''' appear to be the last surviving species or subspecies of the genus '''[[w:Homo|Homo]]''', although DNA analysis indicates some interbreeding with extinct relatives. We emerged in anatomically modern form about 0.2-0.3 million years (MY) ago. This is long after the appearance of early technologies like stone tools (3.3 MY), controlled fire (0.5 - 1.5 MY), and using them for preparing and cooking food (0.5 to possibly 2 MY). So our evolution to modern form happened in parallel with early technology, and it may have contributed to that evolution.
 Compared to other tool-users, modern humans seem to be unique in several ways. These include (1) the number of different objects we make, and their complexity, (2) significant transfer of knowledge from person to person, and indirectly by way of lasting records, (3) extensive use of tools to make other tools, and (4) creating tools which can carry out tasks to some degree on their own. These features have combined to produce accelerating growth and an increasingly complex society.
===<span style="font-size:large; font-family:'Georgia', serif;"><u>2.2 - Technology Accumulation and Acceleration</u></span>===
 
 The key advantage technology has given us over genetic evolution is the speed at which it can accumulate and spread. It helped our ancestors evolve to modern form, out-compete our relatives, and build a civilization which dominates the planet. We are even at the point of artificially modifying biology, doing so much faster than natural changes happen.
 Tool marks on fossilized bones and shaped stone tools date back about 3-4 MY, which starts a period we call the '''[[w:Stone_Age|Stone Age]]'''. These signs show toolmaking was intentional. Their spread across Africa and Eurasia, similarity, persistence over time, and gradual improvement shows knowledge was being passed on. This makes them the first identifiable class of technology, if not the first to develop. Stone tools are harder and sharper than our body parts, and replaceable when broken, but limited by the muscle power we can supply.
 The next great advance was '''[[w:Control_of_fire_by_early_humans|Harnessing Fire]]'''. This increased usable energy, and allowed transforming materials in ways not possible using only stone tools. Fires occur naturally, so it is hard to identify when we first learned to use it and pass on the knowledge. Evidence from caves containing human fossils, hearths, and the remains of fires indicate the technology had been mastered no later than 0.5 MY ago, but possibly starting a million years earlier. Aside from the immediate uses for warmth and discouraging predators, fire led to cooking. Various cooking methods increase available calories, reduce toxicity and pathogens, and preserve some foods for later use. Stone tools, fire, and cooking gave us a survival advantage. It also allowed us to evolve to modern form, with larger brains that need more energy.
 Since reaching our current form, modern humans have developed technology and culture at an accelerating pace. This includes clothing, language, ceramics, domesticated species, and many others. There is a strong positive feedback loop that causes this acceleration. Improved tools gave early humans a survival advantage. Their numbers multiplied and they spread geographically. Assuming a constant rate of inventiveness at a given point in our evolution, more people means more inventions. New locations with a greater variety of living conditions encouraged new solutions to the problems they faced. For example, cold climates led to a need for clothing. New inventions, once made, could then spread elsewhere and be further modified, increasing our survival advantage.
 On top of this feedback loop was the gradual increase in the size and energy use of our brains. This increased our inventiveness over the last three million years, but it also allowed for larger social groups. Modern humans form groups of about 150 people, compared to about 40 for our distant ancestors. Larger groups allowed for specialization of skills and therefore becoming more expert in each, further increasing our survival and numbers. Specialized skills encouraged developing specialized tools for each task. For example, axes and the many varieties of chisels and saws all cut a material by concentrating forces at a narrow edge. But their sizes and shapes have evolved according to the specific materials and needs of the work. Specialized tools were an improvement over the previous generic ones. They also improved survival and increased population, adding to the feedback loop.
 '''[[w:Agriculture|Agriculture]]''' is the part of technology concerned with purposely growing other living things. It began in multiple places between 23,000 and 12,000 years ago, during and after the last Ice Age maximum.
 That living things can grow and make copies of themselves from seeds or by giving birth was probably always evident to people. Understanding the detailed mechanisms only started a few hundred years ago, including replication of DNA, division of cells, and all the supporting bioprocesses. But long before understanding the details, people knew seeds grew into full sized plants, which in turn produced more seeds, and animals gave birth to small copies of themselves which grew to full size. This is known as a '''[[w:Biological_life_cycle|Biological Life Cycle]]'''.
 Because each plant generally produces many seeds, their number can grow exponentially until they are limited by competition or available resources. So any natural landscape which can support them tends to be covered in plants. Total oceanic '''[[w:Primary_production|Primary Production]]''' approximately equals that on land, but is more thinly distributed because the water absorbs sunlight before it can be used. It also consists of more microscopic organisms on a relative basis due to lack of solid anchorage in deep waters.
 Once people learned to exploit the supply of nutrients, in particular plants and animals, and started raising them intentionally, the natural ability of living things to grow exponentially increased the human food supply dramatically. In turn, human population also grew exponentially. More people means more inventions, including better ways to pass on knowledge. So knowledge and culture have also grown at an accelerating rate.
===<span style="font-size:large; font-family:'Georgia', serif;"><u>2.3 - Knowledge Transfer</u></span>===
 
 DNA encodes genetic information, and is passed from generation to generation. But it doesn't change at all, or very little, in the life of an individual. It can slowly change through mutation, and by shuffling parts during replication. The organisms better adapted to their environment by such changes have a survival advantage, and become more common. But it may take many generations for an improvement to spread through a population. In contrast, learning is a process which allows variable information to accumulate within the life of a single organism.
 The ability to learn has evolved in many forms throughout the animal kingdom ('''[https://doi.org/10.1017/S1464793103006225 Moore, 2004]'''). That evolution was at the same slow pace of other genetics, but once learning is possible, information could accumulate faster. For most species, the learning is lost when the individual dies and must be done anew each generation. Knowledge transfer is more efficient since the organism doesn't have to repeat all the trial and error in accumulating knowledge. Instead it receives useful information previously learned by others, and has the opportunity to improve on it and pass the improvements to the next generation.
 Early knowledge transfer used methods like observation and imitation, with later additions like gestures and pantomime to focus attention. These transfer methods didn't require special tools. Language and memory techniques are technologies that allowed larger amounts of knowledge to be stored and transferred, over longer time periods. They need training, but still did not need external tools. Art and writing further increased the quantity, persistence, and accuracy of knowledge transfer, and began to store the knowledge separately from people. These techniques now required tools like pigments and chisels to put the information on durable media like stone. Our ability to store, transfer, and copy knowledge has only improved with time, with more and more advanced tools to do it with.
 Pictorial art, such as cave paintings and figurines, didn't require specialized knowledge to understand because they were similar to the originals they represented. Pictorial symbols were more abstract and required some learning to understand. Finally, abstract symbols like numbers and alphabets required the most learning to use, but could represent ideas and new things which didn't yet exist. Along with increasing abstraction, our storage media have evolved from marked stone to clay, papyrus, printed paper, and the rapidly changing electronic methods.
===<span style="font-size:large; font-family:'Georgia', serif;"><u>2.4 - Sequential Toolmaking and Specialization</u></span>===
 
 Parts of the body are the universal first tools, but they are grown rather than made, and their variety is fixed by genetics. For a given species, body parts have a fixed repertoire of actions they can perform. For example, human elbows are limited to less than 180 degrees in bending. Body parts are also limited in terms of strength, size, durability, and other features. You can use your fist as a hammer, but only for certain light tasks without injury. Many animals use natural objects, like rocks and twigs, as tools to pound or poke. Fewer will modify natural objects to suit a task. Humans, and our recent relatives, seem to be the only species who first make one tool, then use that to make another, which we call "sequential toolmaking".
  '''[[w:Hammerstone|Hammerstones]]''' are natural round stones used to shape other stones, or to crush, pound, or grind other materials. They are found, rather than made. The oldest identifiable made tools are split and flaked stones from Kenya that are 3.3 million years old. They were not used to make more tools. If they wore out or broke, you needed to start fresh with new rocks. The skills and knowledge, however, could be copied by observation and imitation, even if language did not exist yet. Later in our history, the original stone tools started to be used to make secondary tools.
 A '''[[w:Hand_axe|Hand axe]]''' may be shaped by a hammerstone. If the axe is then used to cut and shape a '''[[w:Digging_stick|Digging Stick]]''', which in turn is used to pry up edible roots, that is a sequence of two tools, both of which are made. Sequential toolmaking requires enough memory and planning to accomplish the whole series. The knowledge and production may be among several people, but they all have to exist within a given society. Hand axes and scrapers made from split rocks can be used to cut and peel branches, which can then be used as handles for axes. A tool with more than one part and made from different materials is a step up in complexity. Complex tools can be more efficient. In this case the handle increases leverage and allows more splitting force.
 The earliest cycle of tools to make more tools of the same kind may be using digging sticks and hammerstones to excavate and flake stones, which in turn can cut and sharpen more digging sticks. Over time, hand tools such as these were used to make better tools and artifacts, a process which still continues today. Modern humans have developed by far the most complex sequences of tools used to make other tools. This includes loops which lead back to earlier and simpler tools.
 '''Specialization''' - As our social groups got larger, their members developed specialized skills. One of these skills was making tools for others to use. Specialized groups of toolmakers, such as blacksmiths, were able to copy their own tools, plus make tools for other people. We can make a distinction between the toolmakers and nearly everyone else - who use tools made by others. Specialized toolmakers persist as a significant segment of industry, since modern civilization can't function without all the tools they make. This includes making better tools than the ones we already have, a process we expect to continue in the future. Modern society is filled with tools, from kitchen utensils to smartphones. But the vast selection tools and machines found throughout civilization can all trace their existence to the self-making toolmakers.
 Early blacksmiths could copy tools for themselves and others, but their work was not mechanized and certainly not automated. Animal, water, and wind power later augmented human muscles, and increased total production. More recently steam and electrical power further improved production rates. As the scale of production and the knowledge involved grew, toolmakers also became specialized. Specialties like mining, steel mills, foundries, and machinery builders still retain the collective ability to make more tools and machines of the type they themselves use. So as a group they are still able to copy their own tools, plus make tools and machines for others.
===<span style="font-size:large; font-family:'Georgia', serif;"><u>2.5 - Self-Operating Tools</u></span>===
 
 '''Energy''' - Tools require energy to perform their function. At first, all work was performed entirely by human muscle, which in turn gets its energy from food. The first outside energy source was probably fire, for tasks like cooking, firing pottery, and smelting copper. Once animals were domesticated we could add their muscles to ours.
 '''[[w:Mechanization|Mechanization]]''' refers to the replacement of muscle power with devices using other power sources. Boats using wind power and mills using water power are early examples. They have been used since ancient times in particular cultures and for particular tasks, but many tasks were still performed by muscles. Replacing muscle power only became widespread since the '''[[w:Industrial_Revolution|Industrial Revolution]]''', starting around 1760. Coal and sometimes wood were used to make steam, whose pressure could drive mechanical devices. More recent engines use combustion gases to directly produce motion. Electricity from a variety of energy sources has allowed distributing power to whatever devices need it. Motors can convert this power to motion at the point of use.
 '''Self-Operation''' - For three million years our tools were passive, not doing anything unless people used them. A fire can continue to burn for a time once started, but requires frequent attention for safety and additional fuel. '''[[w:Domestication|Domesticated]]''' species may be considered the first self-operating tools. They are improvements over acquiring food in the wild, and agriculture is an important technology, so they fit within a broad definition of tools. Since they are living things, hunting dogs can chase prey, livestock can forage, and cultivated plants can grow, all without constant human attention or work.
 Domestication of living things started about 15-30,000 years ago. It wasn't until about 7,500 years ago, with the development of sail power, that non-living tools could start to perform active functions to some degree on their own. Wind provided an external energy source to move the sail, and the boat it was attached to. As long as the wind is steady, the boat can continue to move without constant attention by people. This differs from rowing or paddling, which need constant action.
 Simple tools, like a hammer, need a person's constant attention and muscle power to operate. More complex ones, like an electric drill, replace some or all of the muscle power, but still need our full attention and guidance. A '''[[w:Mill_(grinding)|Mill]]''' powered by wind or water may not need constant attention to keep turning and grinding, though it still needs labor for other tasks. It is therefore partially self-operating.
 '''Smart Tools''' - Where mechanization replaces muscles, technologies like '''[[w:Automation|Automation]]''', '''[[w:Robotics|Robotics]]''', '''[[w:Software|Software]]''' and '''[[w:Artificial_intelligence|Artificial Intelligence]]''' (AI) can also replace the senses, and decision-making of people. We call devices which use such technologies '''Smart Tools'''. They make possible mechanical, electrical, electronic, and information systems which can function to a greater degree on their own. This reduces the need for constant human attention and intervention for work tasks. Therefore more can get done relative to the time people spend on it.
 By the mid-20th century, electronics had developed to the point they could be programmed and used as sensors. The field of '''[[w:Control_theory|Control Theory]]''' had developed enough to design self-operating systems that used these electronic devices. Automation, robotics, and software started to develop on a large scale from that time. AI took until the late 20th century to develop enough for practical applications, and is now being widely deployed.
 If our tools no longer need our strength, attention, guidance, or control, the need for our labor is reduced or eliminated. In theory, a set of sufficiently smart tools could be given instructions, then then proceed to build everything else we need and want with little effort on our part. This includes making copies of itself. In practice, we don't yet have tools that smart. The ones we do have, though, are increasingly able to work on their own and need less help from us. Smart tools are the latest in a long series of '''[[w:Productivity_improving_technologies|Productivity Improving Technologies]]'''. Like new sources of energy and mechanization, they will lead to a better quality of life, but in the process can disrupt economic systems based on trading labor for other goods and services.
===<span style="font-size:large; font-family:'Georgia', serif;"><u>2.6 - Cultural Elements</u></span>===
 
 Culture can be described as things that persist in society beyond the life of any given person. It includes both non-material elements and '''[[w:Material_culture|Material Culture]]'''. Non-material culture includes things like patterns and knowledge. For example, an early '''[[w:Hunter-gatherer|Hunter-Gatherer]]''' band could persist as a pattern for a much longer time than any member lived. Language and how to use it is knowledge that can be passed down through many generations orally, without ever being written down. Material culture, like tools and cities can, if maintained, also last well past the life of any individual. The life span of an artifact, however, does not determine if it is cultural. The important feature is whether it exists independent of human biology. For example, a fast food soft drink cup may only be used for a few minutes, or sit on a shelf for years, but our internal biology does not affect these lifetimes.
 All kinds of cultural elements can exhibit growth and replication. A hunter-gatherer band can grow to the point it divides into two bands. A language can grow by the addition of new words, and by new people adopting it. New languages can form when people live far enough from each other that they rarely communicate. Shifts in vocabulary and usage then lead to enough changes that there are two distinct languages instead of one.
 Widespread distribution of media like books and video have tended to stabilize language content, and worldwide communications means nobody is too far away any more to interact. Although the trend is now for small languages to disappear in favor of the more common ones, the remaining languages continue to grow by adding new words and speakers. Cities can grow horizontally in area and vertically above and below ground level. Historically they multiplied by intentionally setting up colonies, or grew around a local feature by attracting settlers. No two cities are the same, but they may share many similar components.
 The oldest elements of culture that showed growth and replication predate modern humans. They include '''[[w:Band_society|Band Society]]''', and early types of technology in the form of hunting, foraging, and tool-making skills. Species of the genus '''[[w:Homo|Homo]]''', to which we belong, expanded repeatedly across the world over the past few million years. Successful social groups therefore presumably divided when their population became larger than a given area could support.
 Skills could grow by accumulation of details and technique and by specialization. Each person has a limited memory and time to learn. So specialization allows more total skills to be passed on. Cultural replication included making new copies of tools from raw materials, but not generally using an existing tool to copy itself. Instead, a collection of tools was brought to bear on making copies of its members.
==<span style="font-size:x-large; font-family:'Georgia', serif;">3.0 - Industry and Economics</span>==
 
[[File:Five_Myr_Climate_Change.svg|thumb|right|640x233px|Figure 2.0-2 - Quaternary glaciation temperature variations.]]
 The last 2.8 million years are known as the '''[[w:Quaternary_glaciation|Quaternary Glaciation]]''', during which ice sheets have expanded over parts of the world's land areas. There was both a drop in the long-term average temperature, and increasingly large temperature cycles of 41,000 and then 100,000 years (Figure 2.0-2). The Antarctic ice sheet persisted even in the warm periods, and variable amounts of other ice sheets grew during the cold periods. Our ancestors evolved during the Quaternary, and our modern form developed during the last few thermal cycles, 200-300 thousand years ago.
 For reasons that are not entirely clear, after the most recent warming 18-12,000 years ago, there was a dramatic change in our technology, culture, and population. In a relatively short period we went from hunter/gatherer bands to space travel, developing agriculture, cities, and large accumulations of knowledge. Work has become very specialized, and trade using money as an intermediary is now world-wide. These changes also brought new kinds problems and side effects, including the ones identified in the Introduction (Chapter 1.0).
===<span style="font-size:large; font-family:'Georgia', serif;"><u>3.1 - Economics</u></span>===
 
 Before developing tools and technology, our ancestors survived the same way as other animals. They were part of biological ecosystems, and obtained their food mainly from other living things. Both primates and their food sources were self-reproducing, and self-expanding to the point of filling their ecological niches. Goods and services, and therefore trade, were limited in scope, consisting of highly local things like sharing food and grooming. Studies of living primates indicate they have a sense of fairness and reciprocity, so our ancestors likely did too. These behaviors enhanced group survival, but they also underlie modern trade.
 '''Early Trade''' - By the start of the '''[[w:Neolithic|Neolithic]]''', around 12,000 years ago, modern humans had developed a number of technologies and tool types. These included an assortment of stone tools, fire, cooking, clothing, the first domesticated species (dogs), and ceramics. Prior to the development of agriculture, societies were more mobile, because they had to follow or go to where the food was. This limited the amount of tools and other artifacts they could accumulate to the level of seasonal camps. Whatever they could not carry to the next location had to be left behind and made anew, or if durable enough, stored in caches for later return.
 People at that time were anatomically modern. Their social groups could range up to around 150 members, so could specialize in different tasks. Specialization involves trade in goods and services from other specialists. The mobility of hunter-gatherer cultures meant they also encountered other groups in the course of their seasonal movements. This encouraged trade in specialties between the groups, in their members, and in items and materials which came from more distant places.
 The '''[[w:Neolithic_Revolution|Neolithic Revolution]]''' marks the transition from hunter-gatherer to agriculture and fixed settlements as a way of life. This happened multiple times in separate locations around the world. Domestication of plants and livestock increased their quality as food sources. Intentional planting and care of herds greatly increased the food supply relative to the natural state. The increased quality and quantity of food allowed for large increases in population density.
 Raising plants and animals was an investment of labor with a delayed return. The need to protect that work led to less mobile populations. Fixed settlements enabled managing crops, storing food reserves, protecting people and their animals from the elements and natural and human predators. People continued replicating themselves and their food supply through biology, and copying their tools and artifacts through technology. Individual settlements gradually expanded, and their numbers increased by starting new settlements in in different places.
 '''Economic Evolution''' - The increased work that went into agriculture led to property rights as a way to secure that work. You owned what you put work into making or improving. Other people weren't allowed to take it because in effect it was taking the part of your life that went into it. Various ways to protect property developed over time, such as laws and customs, or walls and gates.
 Improved food production produced a surplus. This allowed more people to engage in other crafts and services. One of the new specialties was trading items made by others, i.e. merchants. The amount of goods a merchant can handle isn't limited in the same way a farmer is limited in the area of crops they can grow. The work involved in making a trade can be much less than the work to make the items being traded. Trades only happen when both parties see an advantage in it. So dedicated traders can accumulate large total gains. Ownership passes when goods are traded. So individual traders can accumulate ownership of many goods, more than they can handle themselves. They can then hire as many people as needed to do the physical work, trading a share of their gains for the work.
 One type of property is land, either in the natural state, or has had work put into it like a farm. As populations grew, new areas were occupied, initially by mobile bands. The food from that area was necessary to live, so as a group they protected it from incursion by others. By virtue of the protection work they considered it "their land", to be passed down to later generations. As property rights developed with agriculture, specific pieces of land were claimed by families and individuals and passed down.
 Large areas of land could be accumulated by peaceful methods like trade and inheritance. Another method is taking it using force and violence. The takers could then use slaves or tenants to work the land for them. They took a share of the products by threats or force (pillage), or by imposing rules and customs to make it habitual (taxation). As with merchants, hirelings like soldiers and tax collectors could multiply the gains in return for a share in them. Concentrated ownership, whether through peaceful or violent methods, made possible much larger inequalities than those based on individual abilities.
[[File:World_population_growth_(log-log_scale).png|thumb|right|800x480px|Figure 2.0-3 - World population over time.]]
 The development of property rights, increased division of labor, organized trade, accumulation of wealth, and taxation all came out of the Neolithic Revolution. They produced an economic system with recognizable elements that persist to this day. Agriculture also induced a huge increase in population (Figure 2.0-3). The graph shows population history on a logarithmic scale, to better show the dramatic changes in both speed and numbers. Each labeled division on the axes is a factor of ten in time before the year 2000 (horizontal) and total population in millions(vertical).
 Population before agriculture was a few million. By the time iron production became widespread, about 1000 BC, it had grown to about 50 million, and by the time of Classical Greece to 150 million. The much larger population led to more rapid improvements in technology, including in economic systems. The general trend of population growth and accelerated change has continued to the present day, with occasional setbacks.
===<span style="font-size:large; font-family:'Georgia', serif;"a><u>3.2 - Modern Economies</u></span>===
 
 The work people do in modern economies, and how they do it, is highly specialized. The US Bureau of Labor Statistics tracks over a thousand '''[https://www.bls.gov/oes/current/oes_nat.htm Detailed Occupations]''', each of which are further specialized. For example, farm workers in crops are listed as one occupation type, but vegetables, fruits, and field crops all use different skills and equipment. The US Census Bureau tracks over a thousand different industries in their '''[https://www.census.gov/naics/ Statistics System]''', all of which use different tools and skills to produce different goods and services. Specialization is efficient, but people and industries must then trade for all the things they don't make or do themselves.
 Modern economies are also based on a mixture of voluntary trade and action, and involuntary use of force, actual or implied. To the extent people find the functions of government useful, and are willing to pay for them, they are funded voluntarily. There are always people who would contribute less if not forced to, so that portion is involuntary. When the dominant mode of trade and action is voluntary, we call it a '''[[w:Market_(economics)|Market]]''' economy. When that economy also includes large proportions of capital accumulation, wage labor, and trade using money, we call it '''[[w:Capitalism|Capitalism]]'''.
 Modern economies typically include a capitalist sector, smaller-scale individual trade, plus a variable-sized government sector whose control varies from autocratic to extensive public choice and direction. Trade is now interconnected on a world-wide scale, so there are no truly isolated economies any more. There are many local variations in the relative sizes of government, capitalist, and individual sectors, in the extent of physical and social development, and in the local environments and resources which underlie the economic activity.
 In terms of total activity, the modern world economy is mostly based on large-scale capitalism. By large-scale, we mean large amounts of capital controlled by a smaller number of people and organizations. They employ larger numbers of people for their specialized labor, and pay them wages in return. For example, in the US, only about 10% of workers do so for themselves rather than others. The capitalists keep a share of the revenues as profits.
 The majority of people, both wage-earners and capital owners, then use the money they obtain as an intermediate good to trade for the other goods and services they need and want. The goods and services in turn are mainly produced by the capital owners and their organizations, forming a complete trading system. Governments operate in a similar way - employing people and paying them wages. The difference is their capital is publicly owned rather than private.
 A system where most people work for wages is a relatively recent historical development. For example, in the United States (US) the majority of workers were agricultural until 1880, and primarily worked for themselves (see Table 2 in '''[https://www.nber.org/chapters/c1567.pdf Output, Employment, & Productivity in the United States, Brady, NBER, 1966]''').
==<span style="font-size:x-large; font-family:'Georgia', serif;">4.0 - Economic Problems and Approaches</span>==
 
 There are several drivers in the current system which have produced rapid economic growth relative to earlier periods. These include innate desires, competition, and improved technology. While modern economies have brought many benefits, they have also created problems, some of which we consider in this section.
 Capitalist economies have an implicit goal of perpetual self-expansion. This is driven by the desires for a better quality of life and the accumulation of wealth and power. These desires are expressed in monetary form by increasing incomes and market values. But perpetual growth for some can be at the expense of others. Over-consumption of resources and discharge of wastes in the pursuit of growth can also damage health and the environment in which we all live.
 Competition in the current system has made it fairly efficient. Technical improvements have also increased the quality and quantity of goods and services over the last few centuries. But these have caused problems due to the pace of change, job insecurity, and economic inequality. In the future, smart tools may also cause wholesale work displacement. The current system and the problems it causes can also create social problems. However, here we will mainly focus on economic problems, their effects on people, and attempts to deal with them.
===<span style="font-size:large; font-family:'Georgia', serif;"><u>4.1 - Economic Problems</u></span>===
 
 As modern economies evolve, some of their problems can be traced to the effects of change. Other problems can be traced to inequalities of resources and distribution. We will group current economic problems under three headings: the pace of change, job insecurity, and economic inequality. To these we will add the potential future problem of work displacement.
 '''The Pace of Change''' - The Neolithic Revolution is only 1/300th of the time since the first recognizable tools. Agriculture caused a large population increase, which started an accelerating a feedback loop: Our biology, and therefore inventiveness, hasn't changed much in the last 12,000 years. So more people means more new technology and social innovations per year. These improvements allow more population growth, and faster spread of inventions and ideas. So further changes happen more quickly as time goes on.
 When changes were small during the working life of an individual they were not a major problem. A given person could continue their current craft, with their existing skills and tools, until they stopped working. They could gradually be replaced by a new generation of people following new methods. Until the last few centuries, most people worked for themselves in agriculture. They could adopt new tools and methods on their own, or stay with the older ways. The capital required for new items was small enough for individuals and the local community. For example, the horse collar, horseshoe, and heavy plows increased farm production by 50% and allowed working heavy soils that were previously unsuitable. Such tools were within reach for local farmers.
 The pace of change became much faster in recent centuries. Replacing hand weaving with machine looms, and draft animals with farm tractors took about 50 years each, within the life of one person. By the late 20th century, electronics were doubling in performance every few years. Old skills and entire job categories could become obsolete within a working lifetime. People often could not afford to enter new fields due to the time and expense of retraining. For some it was too late in their lives to learn new skills and get enough use of them afterwards. Such people were simply left behind.
 The capital needed for new technologies like blast furnaces and railroads grew far beyond local means. To remain economically competitive, people went to work for those who could supply the capital and machines, rather than for themselves. In many cases people had to take whatever work was available, rather than following their interests and abilities.
 '''Job Insecurity''' - Individual farming has many risks, but getting laid off when you work for yourself isn't one of them. Labor is a cost to any business, so owners and management have a constant incentive to reduce it, and thereby increase profits. They generally employ people only when the expected income from those workers exceed their added costs. Shifts in market demand, competition, and new technologies can all make previous jobs uneconomic. Businesses may then resort to layoffs if reductions from retirement or choice to work elsewhere isn't fast enough.
 The level of job insecurity from all causes combined is more than from technological change alone. It includes factors like making bad business decisions or losing market share to competitors. These can happen even if the total market size and the technologies used haven't changed. Changes which affect employment constantly happen, so a percentage of people are always at risk of losing their job. In the US, the actual rate of involuntary job separations is about 15% per year, with between 3.5 and 10% unemployed at any given time. Our economic system assumes most people trade their labor for money, so they can then trade the money for things they need and want. Unexpected lack of work is then a problem for meeting basic needs.
 '''Economic Inequality''' - Early humans had to work together and share to ensure survival. They had to move to where food could be found, which didn't allow accumulating many physical goods. So economic inequality was limited. Since the development of property rights and gaining from the work of others, the inequalities could grow. Thus ancient emperors and kings accumulated far more wealth and power than the slaves or peasants at the bottom of the social structure.
 We have a far higher average quality of life today, but these inequalities persist. Stored wealth provides a reserve to withstand setbacks like job loss or illness. Low income inhibits building such reserves, so setbacks can be catastrophic. Lack of resources can result in poor education, which can perpetuate low incomes in later generations. Poverty also can result in poor nutrition, health care, and living conditions. Relative poverty can persist even in developed economies, and even while the poor are working.
 '''Work Displacement''' - New technologies since the mid-20th Century are enabling "smart tools" which can replace part or all of the work people do in existing jobs. The tools may still need a person's attention part of the time, but significantly less than when the work is done without them. If fewer people are needed for a given amount of work, then without other changes, those people can become unemployed.
 The technologies of the '''[[w:Industrial_Revolution|Industrial Revolution]]''' replaced large amounts of manual labor in the past, but the pace of change was slower. People were able to transition to work in other fields, including new ones enabled by better technology. The problem with smart tools is they can be rapidly introduced via modern mass production and automation. They may do jobs so well that entire categories of work are greatly reduced.
 Demand for new types of goods and services can create replacement jobs, but some people are not suited for high-skill jobs like programming and designing robots. The number of new jobs may also be much smaller than the ones lost. Software and robots only need to be designed once, then copied many times. If new jobs are not created fast enough permanent unemployment may increase in coming years.
 Some examples of current and near-term work displacement include:
:* Self-checkout at supermarkets and card readers at gas station pumps. These have reduced the need for cashiers.
:* The mass introduction of warehouse robots by Amazon, which reduces how many workers are needed to fill orders.
:* The ongoing development of self-driving vehicles, which may affect all kinds of transportation and delivery jobs. Automated warehouses plus automated delivery puts all kinds of retail jobs at risk, by entirely bypassing retail distribution.
:* The development of AI agents like Alexa, Siri, Cortana, and Google Assistant, coupled with augmented/virtual reality devices. They are currently used for home automation and entertainment. But in the future, schools may face pressure to replace some of the teacher's work with interactive systems using these kinds of tools. What happens to teachers and school systems in that case?
 '''Systemic Effects''' - When competition and technical change eliminate current jobs or make skills obsolete, they break the cycle of work for money, then money for goods and services, by which the current system operates. Without earned income, the unemployed don't pay income and payroll taxes. They don't buy as many goods, so sales taxes also go down. Therefore governments will lose a share of the revenue they need to function. Lower government revenue means social programs and government employment also decrease, further lowering economic activity. The businesses the unemployed no longer buy from also lose income and employment, even if they use smart tools. The owners of such businesses lose a share of their income too.
 Lack of enough paid work is then a systemic problem for a capitalist economy which depends on it as an integral part. Such spirals of contracting economic activity are called recessions or depressions, and cause large-scale unhappiness and even civil unrest. These are undesirable results. If the existing system can't handle this problem, then what sort of system should replace it? If changes are required, how do we manage the transition?
 The wealthy, those with sufficient retirement income, and beneficiaries of social programs are not at immediate risk of becoming unemployed. Their needs are met in other ways. Also a significant number of people are dependents of workers, so in total only about half the US population is currently working or between jobs, and directly at risk of displacement. However, large-scale replacement of work has broader effects on the entire economic system, so it can eventually affect everyone.
 This problem isn't yet severe, but it is better to deal with it before it reaches that level. The other three problems already exist, and we would like to find solutions for them too. A number of ideas have already been proposed, which we look at below. It is unclear if these solutions can work on a large scale, singly or in combination. We would like other options, so Chapter 2.1 presents self-improving systems and seed factories as a new approach that can potentially scale to any size needed.
===<span style="font-size:large; font-family:'Georgia', serif;"><u>4.2 - Previous and Recent Approaches</u></span>===
 
 '''Social Systems''' - Modern humans are '''[[w:Social_animal|Social Animals]]'''. We constantly interact with other people and depend on them, rather than operate as lone individuals. Some things we can do for ourselves, such as cooking meals at home. But to make that possible we rely on other people to supply electricity and natural gas for cooking, make the appliances and utensils we use, and grow, transport, and sell the food to cook.
 There have always been members of society who are disadvantaged in some way, or can't fully contribute to the functions of society. Examples include the very young or old, and those who are injured or sick. Because we function as a society, we care for others and realize we may become disadvantaged ourselves at some point.
 Care for others is carried out at the level of family and friends, through voluntary contributions and organizations, and through involuntary programs funded by taxes and operated by governments. The care has one of two goals. The first is solve the person's disadvantages if that is possible. So we raise and educate children, and heal the sick and injured, so they can function as part of society. If the problems are unsolvable, as with very old people, our goal is to give them at least a decent quality of life.
 The economic problems noted in 4.1 above can affect those who are able to work, but disadvantaged by their circumstances. Their skills may be obsolete due to technological change, or their employer no longer finds their work useful enough to cover their wages. They are then left without income to buy the things they need. They may not have the capital, or access to it, to purchase improved equipment. They may also lack the time, funds, or ability to learn new skills. These disadvantages leave them unable to enter new fields and continue working. In the future, so much work may be displaced by smart tools that there simply isn't enough left for the people who want or need it.
 '''Previous Approaches''' - People have dealt with past economic problems the same ways we deal with other problems in society. They approach them as individuals, through family and friends, voluntary organizations, or involuntary programs. Previously used methods have had varying levels of success, and none have yet had to handle wholesale replacement of work. Proposals to meet the challenges of smart tools may be inadequate. To the extent they are not full solutions, or we are uncertain of their future capacity as such, there is a need for additional new approaches.
 Everyone is born unable to care for themselves, and without the knowledge and skills to function as part of society. The general approach to solving this is care and education of the young. This is supplied by their parents and some combination of other people. Childhood education supplies the basic skills for self-care, language, and other areas that are assumed to be needed by everyone in society. More advanced education and training then supplies specialized skills. These enable trading work for income. Some people follow their interests rather than using their skills for maximum income. This is only possible in societies with enough surplus to support optional activities beyond those needed to live.
 Generally childhood care and education is provided by parents first, then by government programs funded by taxes. The more advanced education is provided in a variety of ways: by government programs, by private sources and institutions who have sufficient funds, and by students borrowing against their future income. Some retraining programs exist for people in later life who choose or are forced to change fields. The education system generally works, although there are some problems with funding, personal cost, and access.
 For people who are disadvantaged in other ways besides being young, another general approach is wealth redistribution. This is mainly via taxes and social programs, with some voluntary contributions and organizations. Wealth normally flows upwards towards those who already have some. They gain from the work of those they employ or lend capital to, in addition to whatever work they do themselves. Unlike their own work, these gains are unlimited, so their wealth can rapidly accumulate. Redistribution can then have two purposes. One is to avoid extreme accumulation by the wealthy at the expense of everyone else. The other is to fund programs from those who are more able to pay, for the general protection and improvement of society as a whole, or directed to the less fortunate or able.
 Redistribution happens when the incidence of funding sources is different than the social distributions they provide. When a billionaire is taxed to fund a public school system, the net distribution is downwards. But this is not always true of taxes and government programs. For example, government contracts with companies that have highly paid workers and wealthy corporate owners may move funds higher on the wealth scale than the people taxed to pay for them.
 Social programs generally intend to help those who need it via redistribution. One program to deal with job insecurity is unemployment insurance. Employers pay a tax to fund this program, which then temporarily pays people who can't find work. Another set are old age and medical programs funded by employers and the workers themselves. People eventually grow too old to work, and need more medical care. They can also become disabled or die when younger. The programs then provide income and medical coverage for former workers and their dependents. The redistribution effect comes from benefits being capped while funding has higher limits, and from minimum benefits being supplied even if lower income doesn't cover them. A third set of programs are aimed at re-education and retraining for people affected by economic changes.
 In addition to voluntary and government programs, people are encouraged to save from their current wages. This is to cover adverse conditions like job loss or health problems, and for eventual retirement. They can also pursue self-training and education. People helping themselves is useful, but not always possible given their circumstances. If their income is low, there may not be enough surplus to save. Their work and family care may not leave enough time to gain new skills. Overall, the set of approaches used to deal with economic problems have worked well enough that people haven't yet demanded large changes to them.
 '''Recent Proposals''' - The rapid development of smart tools has the potential to cause large-scale displacement of work, without creating enough new work in other areas to replace it. The concern is for the social and economic disruption this can cause in a system based on trading work for money. The most commonly proposed approach involves increased government redistribution from those who have, to those who do not.
 One version is called '''[[w:Basic_income|Basic Income]]''', or sometimes '''[[w:Negative_income_tax|Negative Income Tax]]'''. It is intended partly to replace other existing social programs with a simpler method, and also to address permanent work displacement. The concept is to provide payments to every adult, or in some versions every individual, regardless of need or income level. It would provide a minimum floor to living standards. People and businesses with sufficient wages and income would be taxed to fund this system, much as they do existing programs. An alternate version is to increase government employment and funded work programs, such as a '''[https://www.jacobinmag.com/2017/02/federal-job-guarantee-universal-basic-income-investment-jobs-unemployment/ Federal Job Guarantee]''' This may be more acceptable than simply giving money to everyone, since the recipients are seen as working for what they get, and the work itself can be useful.
 The problem with these approaches is they can't be sustained in the face of large-scale replacement of work. As we noted in sectopm 4.1 above, the systemic secondary effects of work displacement reduce many of the other sources for taxation. There would not be enough tax revenue left to make the payments from. Very high tax rates on the remaining sources encourage people and businesses to move elsewhere to avoid them, or find ways to hide what is taxable. Unless the new taxes are applied everywhere and strictly enforce, the incentives to move or hide will be strong. We see this already with corporations and the wealthy moving funds "offshore" (to another country or jurisdiction) to avoid taxes and hide assets. The alternative of simply creating money to fund the payments would cause inflation, which has other undesirable side effects.
 These approaches don't seem sufficient in the face of large-scale work displacement. So in Chapter 2.1 we propose a new one based on known processes of expansion, replication, and self-improvement.
</div>
{{BookCat}}
6ea0svflht5d69gggnn8yzojom52h2f
Transportation Planning Casebook/St. Paul Streetcars vs. Arterial BRT
0
293672
4676578
3117942
2026-10-17T21:27:22Z
WereSpielChequers
248949
c/e
4676578
wikitext
text/x-wiki
= Summary =
In November of 2010, the local [http://en.wikipedia.org/wiki/Metropolitan_planning_organization Metropolitan Planning Organization] (MPO), the [http://en.wikipedia.org/wiki/Metropolitan_Council Metropolitan Council] adopted the long range 2030 Transportation Policy Plan <ref>{{cite web| url=http://www.metrocouncil.org/Transportation/Planning/2030-Transportation-Policy-Plan.aspx | publisher=Metropolitan Council| accessdate=2013-09-14| year=2013| title=2030 Transportation Policy Plan}}</ref>. This plan outlines strategies for combatting congestion, improving mobility, and promoting economic growth <ref>{{cite web| url=http://www.metrocouncil.org/Transportation/Planning/2030-Transportation-Policy-Plan.aspx | publisher=Metropolitan Council| accessdate=2013-09-14| year=2013| title=2030 Transportation Policy Plan}}</ref>.
[[File:Ramsey County Minnesota Incorporated and Unincorporated areas St. Paul Highlighted.svg|thumbnail|right|Location of St. Paul within Ramsey County and the State of Minnesota.]]
There are many agencies partnering with the Met Council to reach the goals outlined by the TPP. These agencies work across city and county lines, as well as within jurisdictions. These agencies are currently working on several projects that include different modes of transportation, in various locations, with varying levels of funding. The two strategies under discussion in the city of [http://en.wikipedia.org/wiki/St._Paul,_Minnesota St. Paul] that this report will focus on are are two technologies that are often designed to serve the same market niche: [http://en.wikipedia.org/wiki/Bus_rapid_transit Arterial Bus Rapid Transit (BRT)] and [http://en.wikipedia.org/wiki/Streetcar streetcar]. St. Paul is the second most populous city in Minnesota and shares common transportation challenges with the rest of the metro area. The population in [http://en.wikipedia.org/wiki/Ramsey_County,_Minnesota Ramsey County] is projected to grow <ref>{{cite web| url=http://www.demography.state.mn.us/PopulationPyramids2015-2040/Projecxtions2012Paper.pdf | publisher=Minnesota State Demographic Center| accessdate=2013-09-18| year=2013| title= Minnesota Population Projections}}</ref>, as well as the transit dependent populations of youth and seniors. As total population grows in and around St. Paul, traffic congestion on already poorly functioning corridors is likely to worsen.
Transit investment also has the power to spur economic development <ref>{{cite web| url=http://www.metrocouncil.org/Transportation/Projects/Current-Projects/Central-Corridor/News-Display-Page/More-than-$1-2-billion-in-development-occurring-al.aspx | publisher=Metropolitan Council | accessdate=2013-09-18| year=2013| title=MORE THAN $1.2 BILLION IN DEVELOPMENT OCCURRING ALONG CENTRAL CORRIDOR}}</ref>, and in St. Paul, this is evidenced by the soon-to-open [http://en.wikipedia.org/wiki/Central_Corridor_(Minnesota) Central Corridor Light Rail]. The city of St. Paul hopes additional sound investments in transit will offer these same benefits.
This report provides a brief history of transit in St. Paul as well as an overview of current projects investigating aBRT and streetcar in St. Paul. Following this, a comparison of the two modes will be made to provide the reader with the advantages and disadvantages of each. Finally, a brief discussion of the potential West 7th Street corridor aBRT or streetcar implementation will be mentioned.
= Annotated List of Actors =
'''City of St Paul'''
Possible transitways are to be implemented within the city boundaries, where businesses and residents will be affected. Because city taxes are collected from these property owners, the city has an obligation to do what is in the public interest. In addition, increased property values from transitway implementation likely mean higher tax revenue for the city. The planning department must juggle the interests of property owners, renters, and businesses to ensure the best possible outcome.
'''Metropolitan Council (Metro Transit)'''
The Metropolitan Council is responsible for transit planning and operation in the St. Paul and greater Twin Cities area. Adoption of major transitways into the long range transportation plan must first be approved by the Metropolitan Council.
'''MnDOT'''
The Minnesota Department of Transportation maintains many of the large arterial roads that are under investigation for development of aBRT or streetcar. For example, Snelling Avenue is also known as Minnesota State Highway 51, and West Seventh Street is also known as MInnesota Highway 5. Implementation on these corridors will take coordination with the state.
'''Ramsey County'''
Ramsey County owns and maintains several large roads in St. Paul. For example, Selby Avenue (under investigation for streetcar use) is a county road. Coordination with county public works and the regional railroad authority must take place as the project progresses.
'''Affected business owners'''
The construction and operation of a major transitway can have profound affects on businesses along and nearby the route. Because of construction, businesses along lines may lose revenue due to interruptions of normal traffic flow that small businesses may come to depend on. Similarly, If the business depends on foot traffic, the invasiveness and duration of construction could limit access. Following construction, unless the street is widened to accommodate equal amounts of parking that was present pre-project, businesses could lose valuable storefront parking spaces.
Conversely, some businesses, if they are able to keep their heads above water throughout construction, may see increased revenues as more people are exposed to the area through transit use.
'''Affected Residents'''
Potential affects on residents include noise and air pollution from construction, as well as increased street level foot traffic in and around their neighborhood. In addition, the implementation of a transitway has been known to increase property values, forcing residents who are unable to afford these increases out of their neighborhoods.<ref>{{cite web| url=http://onlinelibrary.wiley.com/doi/10.1111/j.1540-6229.2007.00186.x/abstract;jsessionid=6E6181464F7CF3BB8658795FFB9DD4C3.d03t04?systemMessage=Wiley+Online+Library+will+be+unavailable+for+approximately+4+hours+between+09%3A00+EDT+and+14%3A00+EDT+on+Saturday%2C+28+September+2013+as+we+make+upgrades+to+improve+our+services+to+you.+There+will+also+be+some+delays+to+online+publishing+between+25+to+28+September+2013.+We+apologize+for+the+inconvenience+and+appreciate+your+patience.+Thank+you+for+using+Wiley+Online+Library%21&userIsAuthenticated=false&deniedAccessCustomisedMessage= | publisher= Real Estate Economics| accessdate=2013-09-19| year=2013| title=2030 Gentrification Trends in New Transit-Oriented Communities: Evidence from 14 Cities That Expanded and Built Rail Transit Systems}}</ref> An increase in foot traffic also might lead to a more vibrant, welcoming neighborhood.
'''Car drivers'''
Car drivers who frequently use a potential transit corridor will likely have to deal with detours and congestion during construction, as well as fewer lanes in which to travel once operation begins.
'''Transit users'''
What will be the time savings from these potential transitway implementations? Higher quality transit might also mean fare increases for minimal time savings, depending on the length of trip users are accustomed to taking. Transit network connectivity is an important feature of quality service, and should be optimized to increase convenience for riders.<ref>{{cite web| url=http://www.tandfonline.com/doi/abs/10.1080/0308106022000019017#.UjynmOCCIf8 | publisher=Transportation Planning and Technology | accessdate=2013-09-18| year=2013| title=Intermodal Transit System Coordination}}</ref>
'''Funding sources'''
Transit projects often come with a large price tag, as will be discussed below. All levels of governments often contribute to some extent. Past transit projects in the Twin Cities have received funding from several different sources. Depeding on the cost of the project, federal and state funding may be available. At the regional level, the [http://en.wikipedia.org/wiki/Counties_Transit_Improvement_Board Counties Transit Improvement Board], formed in 2008 contributes funding to major transit infrastructure projects in the Twin Cities. Finally, Ramsey County and the City of St. Paul will be responsible for a contribution.
= Background =
== Transit History in St. Paul ==
Mass transit in St. Paul began decades before the first electrified streetcar went on line. Horse-drawn carriages were able to haul several people through the St. Paul streets comfortably, but this technology also relied on the health of horses <ref>{{cite web| url=http://www.trolleyride.org/History/Narrative/TC_Transit.html | publisher=Minnesota Streetcar Museum| accessdate=2013-09-16| year=2013| title=A Brief History of Twin Cities Transit}}</ref>, and required several animals to service just one line throughout the day. St. Paul then borrowed the idea for [http://en.wikipedia.org/wiki/San_Francisco_cable_car_system cable cars] from San Francisco, however, this technology soon fell to the early streetcar models, which were comparatively cheaper to build and maintain. [http://en.wikipedia.org/wiki/Thomas_Lowry Thomas Lowry], an Illinoisan-born lawyer who arrived in Minnesota in the 1860s only to change professions to real-estate, was an early influence on streetcars in St. Paul and Minneapolis. After merging the Minneapolis Street Railway and the St. Paul Railway Company to become [http://en.wikipedia.org/wiki/Twin_City_Rapid_Transit Twin City Rapid Transit Company] in 1875, Lowry pushed for a greater network of transit, and for this network to be driven by electricity.
[[File:1897 Poor's Twin City Rapid Transit Company.jpg|thumbnail|right|A map of the streetcar system in the Twin Cities in 1897.]]
In the first three decades of the 20th century, electric streetcars were the most popular form of motorized transportation in St. Paul. At the height of streetcar use, the company operated 900 self-built streetcars on 523 miles of track in and around the Twin Cities. However, with the refinement of the [http://en.wikipedia.org/wiki/Internal_combustion_engine internal combustion engine] came the rise of the automobile and bus, and the inevitable decline of the streetcar. After World War II came the [http://en.wikipedia.org/wiki/Suburbanization suburbanization] of the Twin Cities, and streetcars could no longer compete with the automobile to reach distant residential areas. With increased affluence, more families were buying cars and demanding roadways to accommodate their purchases <ref>{{cite web| url=http://books.google.com/books?id=lh1MBj0eaTUC&source=gbs_navlinks_s | publisher=UNiversity of Minnesota Press| ISBN: 1452912955, 9781452912950| title= Twin Cities by Trolley: The Streetcar Era in Minneapolis and St. Paul}}</ref>.
In addition to the competition between streetcars and automobiles, a series of leadership changes and publicized controversies led to the last new stretch of track laid in 1947. In 1954, three years after initial discussions with [http://en.wikipedia.org/wiki/General_Motors General Motors], then Twin City Rapid Transit Company president [http://en.wikipedia.org/wiki/Fred_Ossanna Fred Ossanna] discontinued service of streetcars, and buses purchased from GM began service along many of the same routes <ref>{{cite web| url=http://books.google.com/books?id=lh1MBj0eaTUC&source=gbs_navlinks_s | publisher=UNiversity of Minnesota Press| ISBN: 1452912955, 9781452912950| title= Twin Cities by Trolley: The Streetcar Era in Minneapolis and St. Paul}}</ref>.
Since the decommissioning of streetcar in St. Paul (and the Twin Cities), heavily traveled tracks have been paved over and pulled up, leaving a relic expanse of transportation lying underneath the streets. However, with a collective push for reinvestment in transportation modes besides automobile, St. Paul has begun to consider options for improvements to the existing network of bus routes. Included in these considerations are Arterial Bus Rapid Transit (BRT) and a reinvented, modern version of past streetcar systems.
== Current Status ==
In the Transportation Policy Plan (TPP) adopted by the Metropolitan Council in 2010, a goal was set to double transit ridership by 2030 <ref>{{cite web| url= http://metrotransit.org/Data/Sites/1/media/pdfs/atcs/ATCS%20Final%20Report.pdf | publisher=Metro Transit| accessdate=2013-09-16| year=2013| title=Arterial Transitway Corridors Study}}</ref>. This target could be achieved through a growth and maintenance of bus ridership, as well as the implementation of new rail and rapid bus systems. Two major projects studying streetcar and BRT in St. Paul are underway to examine how these two systems might help achieve the goal set forth by the 2010 TPP.
'''Arterial BRT Studies in St. Paul'''
Arterial Bus Rapid Transit opportunities for the city of St. Paul were presented in the 2012 Arterial Transitway Corridor Study completed by Metro Transit. This study examined some of the Twin Cities most heavily traveled transit corridors. The goal of the study was to develop a facility and service plan to enhance efficiency, speed, reliability, customer experience, and transit market competitiveness on 11 high-demand urban transitway corridors. Of these 11 corridors, five are located in St. Paul. These include Robert Street, West Seventh Street, East Seventh Street, Snelling Avenue, and part of Lake Street. This study recommended near-term aBRT implementation on Snelling Avenue and West Seventh Street. Currently, the Snelling Avenue study is undergoing preliminary engineering, where a request for proposal has been issued for station design. The Snelling Avenue route is scheduled to open in 2015, the West 7th route in 2016, and a goal has been set to open an additional line each subsequent year.
'''Streetcar Studies in St. Paul'''
Through the 2007 Minneapolis Streetcar Feasibility Study, St. Paul has undertaken an examination of local opportunities for streetcar. Currently, the St. Paul Streetcar Feasibility Study is scheduled to conclude at the end of 2013. This study is currently in the second of three phases. The January 2013 Phase 1 filtered a long list of potential streetcar corridors into a shorter one. Phase 2, which was concluded in August of 2013, further examined the recommendations from Phase 1. Phase 2 narrowed the list of potential lines to seven: Rice Street, Payne Avenue, East 7th Street, Robert Street, West 7th Street, Grand Avenue, and Selby-Snelling Avenue. From these seven, Phase 3 will determine the most effective streetcar lines and segments to pursue through outreach and further data-driven analysis completed by consulting groups. From these Phase 3 recommendations, a single line will be identified for initial implementation. Pre-Project Development (formerly known as an Alternatives Analysis under SAFETEA-LU) will likely begin to identify environmental impacts, and a locally preferred alternative (LPA) will be selected.
== Possibility of Both BRT and Streetcar ==
It is possible that the two technologies described in this article will both be pursued for implementation. The West 7th corridor, more widely known as the Riverview corridor, is under investigation by both Metro Transit for aBRT use and the St. Paul Streetcar Feasibility Study. Arterial BRT may serve a longer distance trip between the St. Paul Union Depot and the Mall of America, whereas streetcar may compliment this service with shorter trips along a route with more stops. In addition, the Ramsey County Regional Rail Authority is examining this corridor for more robust systems, including Light Rail Transit (LRT) and dedicated BRT. The coordination and cooperation of different agencies will determine which system is to be deployed.
= Justification for Transit Improvements in St. Paul =
Currently many streets in Saint Paul are reaching capacity loads along their lengths or at choke-points. A portion of Snelling Avenue which has both aBRT and streetcar considerations (aBRT will be running by 2015), carries over 40,000 vehicles daily. Another street being considered for both these modes is West Seventh, or Old Fort Road, carries nearly 20,000 vehicles near downtown Saint Paul daily. This traffic can cause long delays for motor vehicles and current transit (buses) alike. <ref>Transportation, url=http://www.stpaul.gov/DocumentCenter/Home/View/11885, posted Feb 2010, accessed September 15th 2013.</ref>
Saint Paul has also taken steps to increase density in the city, and is forseen to be successful in these efforts as, in the Metropolitan Council's 2040 predictions Saint Paul will grow by 54,000 residents.<ref>Twin Cities On Track For Increased Population Density, Twin Cities Business, Jake Anderson, url=http://tcbmag.com/News/Recent-News/2013/September/New-Forecast-Shows-Increased-Population-Density-In, posted September 17th 2013, accessed September 18th 2013</ref> This as well as growing suburban commuters will put more strain on Saint Paul's street grid if the current infrastructure remains largely unchanged. To accommodate the growing need for transportation, an expansion of transit must take place. As many of these routes involve heavy boardings at transfer points already (84 at University, 54 at Sibley Plaza), an easier way to speed up service would be to have off-board payment, fare collection, level boarding and multiple door boarding, things that both these plans provide.
= Streetcar vs. BRT: Generic Arguments =
Excluding factors specific to St. Paul, there are a number of generic consideration when weighing the costs and benefits of streetcar and arterial BRT. This section summarizes the literature related to those generic arguments.
== Capital and Operating Cost ==
The absolute costs of [[streetcar]] and [[Bus_rapid_transit|arterial BRT]] can vary dramatically according to the context. The [[South Lake Union Streetcar]] in Seattle cost $52 million to construct <ref>Reconnecting America. The Seattle Case Study: The South Lake Union Streetcar. Retrieved September 16, 2013, from http://www.reconnectingamerica.org/assets/Uploads/090305streetcarbook.pdf</ref> while a "starter" streetcar line proposed for Minneapolis along Nicollet Avenue is estimated to cost $182 million <ref>"Detailed Evaluation of Alternatives: Nicollet-Central Transit Alternatives." Produced by URS for the City of Minneapolis, August 2013. Accessed September 16,2013. http://www.minneapolismn.gov/nicollet-central/</ref>. Similar cost variations can be found for BRT. In an effort to facilitate a useful comparison, we have provided the cost estimates from an alternative analysis where both arterial BRT and streetcar were considered. Thus, the context specific costs will be constant across modes.
The table below provides cost information for the Nicollet/Central corridor in Minneapolis <ref>Levinson, David. "Do Streetcars Promote Economic Development?" streets.mn, August 26, 2013. Accessed September 19, 2013. http://www.streets.mn/2013/08/26/do-streetcars-promote-economic-development/</ref>. The data was summarized from the Nicollet Alternatives Analysis and Metro Transit's Arterial BRT study. It is important to note that there were differences in assumptions and service quality between the two analyses, which impact the ultimate ridership counts and thus the per rider values provide below <ref>"Detailed Evaluation of Alternatives: Nicollet-Central Transit Alternatives." Page 15. Produced by URS for the City of Minneapolis, August 2013. Accessed September 16,2013. http://www.minneapolismn.gov/nicollet-central/</ref>. The results are instructive nonetheless.
{| class="wikitable sortable"
|-
! !! Line Length (miles) !! 2030 Avg Weekday Project Boardings !! 2030 Avg Weekday New Riders !! Capital Cost (million $) !! Operating Cost (million $) !! Capital Cost/Weekday Rider
|-
| Enhanced Bus || 9.2 || 13,400 || -1,700 || 94 || 13.6 || $7,015
|-
| Streetcar || 9.2 || 19,900 || 900 || 393 || 20.1 || $19,749
|-
| Streetcar starter line || 3.4 || 7,200 || 1,200 || 200 || 10.6 || $27,778
|-
| Met Transit Arterial BRT || 21.8 || 34,700 || 6,700 || 110.7 || 9.06 || $3,190
|}
The [http://www.stpaul.gov/index.aspx?NID=4872 St. Paul Streetcar Feasibility Study] provides additional information regarding the operating and capital costs of bus, LRT and streetcar by comparing peer cities<ref>St. Paul Streetcar Feasibility Study. Produced by NelsonNygaard Consulting Associates Inc. for the City of St. Paul. Accesses September 18, 2013. http://www.stpaul.gov/DocumentCenter/View/66490 </ref>. Below, "OC" stands for "operating cost."
{| class="wikitable"
|-
! City !! OC/Revenue Hour by Bus !! OC/Revenue Hour by Streetcar !! OC/Revenue Hour by Light Rail !! Streetcar OC/Bus OC !! Streetcar OC/Light Rail OC !! OC of Bus !! OC of Light Rail
|-
| Twin Cities || $124.00 || n/a || $379.96 || - || - || - || -
|-
| Portland || $136.19 || $218.36 || $349.12 || 160% || 62.5% || $198.82 || $237.64
|-
| Seattle || $148.75 || $208.26 || $345.45 || 140% || 60% || $173.61 || $229.06
|}
In terms of capital costs, construction is expected to cost anywhere from $58.6 to $71.8 M/mile in 2013 dollars. For the sake of comparison, the [http://en.wikipedia.org/wiki/South_Lake_Union_Streetcar South Lake Union Streetcar], which was completed in 2007, cost $43 M/mile to construct.
== Ridership ==
There are many considerations when evaluating the potential ridership variations between streetcars and arterial BRT. However, there are two that weigh most heavily on the subject and neither of them are easily resolved. The first is "rail bias." This effectively means that, all else equal, people are more likely to ride a rail-type transit option than a bus. Of course, the actual level of this bias vary's from region to region and some might argue that other factors are at play. For example, it may also vary according to the relative quality of the rail and bus transit. In the [http://en.wikipedia.org/wiki/Minneapolis%E2%80%93Saint_Paul Twin Cities] this rail bias was observed after the construction of the [http://en.wikipedia.org/wiki/Hiawatha_Line Blue Line]. Specifically, local study of the phenomena found that "in some cases travelers will see up to a 25 minute weighted travel time savings over a comparable bus trip." It is important to remember that this bias occurs between [http://en.wikipedia.org/wiki/Light_Rail_Transit LRT] and regular bus. We are interested in the potential ridership difference between streetcars and arterial BRT. Does the same bias apply in this case? The service designs for LRT and regular bus are substantially dissimilar. The service designs and infrastructure features for arterial BRT are more likely to reflect that of the streetcar design than the prior case. In the Nicollet-Central alternatives analysis produced by URS, they assumed as similar but reduced bias in favor of streetcar <ref>"Detailed Evaluation of Alternatives: Nicollet-Central Transit Alternatives." Page 15. Produced by URS for the City of Minneapolis, August 2013. Accessed September 16,2013. http://www.minneapolismn.gov/nicollet-central/</ref>. The product of this assumption is reflected in the ridership values provided above. Broader research on the preferences between rail and bus is less conclusive than the biases stated above. One frequently cited paper by Moshe ben-Akiva and Takayuki Morikawa found that the preference for rail dissolves when service characteristics like the trip fare and travel times are comparable across mode<ref>Ben-Akiva, Moshe, Takayuki Morikawa. 2002. "Comparing ridership attraction of rail and bus." Transport Policy, 9(2): 107-116.</ref>. More research on the subject is warranted but this paper suggests that claims of rail bias ought to be re-framed in terms of service quality instead of mode.
The second factor to consider when evaluating ridership is the capacity of that mode to accommodate future growth(assuming future growth is a reasonable expectation). Buses tend to have more seats, but streetcars tend to have more overall capacity when standing rooms is considered. The URS report reference above also found that streetcars are better able to accommodate future growth [http://www.minneapolismn.gov/nicollet-central/ (page 19)]. It is important to recognize that there are those who would argue that the capacity advantage of streetcar over bus or BRT is nonexistent <ref>O'Toole, Randal. June 14, 2014. The Great Streetcar Conspiracy. Policy Analysis, No. 699. Accessed September 17, 2013. http://object.cato.org/sites/cato.org/files/pubs/pdf/PA699.pdf</ref>.
== Economic Development ==
The economic development benefits of BRT and Streetcar are often praised by advocates and politicians. The [http://en.wikipedia.org/wiki/Greater_Cleveland_Regional_Transit_Authority Greater Cleveland Regional Transit Authority] claims that Cleveland's [http://en.wikipedia.org/wiki/HealthLine HealthLine] has leveraged more than $4.3 billion in economic development benefits <ref>{{cite web| url=http://www.rtahealthline.com/healthline-what-is.asp | publisher=Greater Cleveland Regional Transit Authority| accessdate=2013-09-14| year=2013| title=RTA HealthLine}}</ref>. In a bid by Oakland to open a streetcar system, they have highlighted claims that the streetcars constructed in Seattle and Portland produced $2.4 billion and $3.5 billion in economic development, respectively<ref>The Oakland Streetcar Plan. Accessed on September 17, 2012. http://www.oaklandstreetcarplan.com/1/post/2010/10/streetcars-and-economic-development1.html</ref>. Academic literature on the economic development benefits of streetcar is scant and remains far from conclusive<ref>National Research Council. TCRP Synthesis 86. Relationships Between Streetcars and the Built Environment. Washington, DC: The National Academies Press, 2012. Accessed on September 17, 2013. http://onlinepubs.trb.org/onlinepubs/tcrp/tcrp_syn_86.pdf</ref>. Peer reviewed research on the subject remains even more elusive. Research on the economic development associated with BRT is more plentiful and has been helpfully summarize by Dr. David Levinson on his blog the [http://transportationist.org/2013/09/11/does-brt-have-economic-development-effects/ Transportationist].
[[File:HealthLine 2.jpg|thumbnail|right|HealthLine BRT and station in Cleveland]]
[[File:South Lake Union Streetcar crosses Lenora Street.jpg|thumbnail|right|Seattle's South Lake Union Streetcar]]
In order to assess the economic development potential for arterial BRT or streetcar, it is first necessary to understand the dimensions of a proposed transit improvement. These dimensions of service design include speed, convenience, frequency, infrastructure components, etc. They can vary broadly from project to project and each of these factors may facilitate or diminish the economic development potential of a project. A useful measure of these characteristics has been produced by the Institute for Transportation & Development Policy (ITDP)<ref>The BRT Statndard 2013. Institute for Transportation & Development Policy. Accessed September 17, 2013. http://onlinepubs.trb.org/onlinepubs/tcrp/tcrp_syn_86.pdf.</ref>. As was noted in the ridership section above, research suggests these characteristics impact ridership levels regardless of the mode (bus or rail). It is quite feasible that the same is true for economic development. Research from the ITDP (scheduled to be released on Sept. 2th, 2013) finds that a well designed BRT system may have more economic development potential than an equivalent streetcar system from an investment vs. return perspective<ref>McMahon, Jeff. Bus Rapid Transit Spurs Development Better Than Light Rail Or Streetcars: Study. Forbes. Published September 15th, 2013. http://www.forbes.com/sites/jeffmcmahon/2013/09/15/bus-rapid-transit-spurs-development-better-than-light-rail-and-streetcars/.</ref>
== Comfort ==
Comfort is a very important factor when people are choosing their transport means. <ref name="H1">Parsons Brinckerhoff: BUS RAPID TRANSIT: IT’S NOT JUST FOR BIG CITIES ANYMORE. Oct 17, 2012. http://bloomington.in.gov/media/media/application/pdf/12987.pdf</ref>.<br />
Unlike traditional bus stops, arterial BRT and streetcar both have uniquely designed stations, which can provide weather protection, shelter and a waiting facility.<ref name="H1"></ref>. Features such as security cameras, and periodic security officers offer an important sense of security to passengers, which also helps with the sense of confort. What’s more, there are real-time information booths or information screens informing passengers when the next vehicle will arrive. Of course, these additional design features are tied to higher design and construction costs. <br />
One of the big reasons why many Americans don’t like buses is that they don't provide the smooth ride expected by rail transit. In many cases, they simply are not comfortable<ref name="H2">BeyondDC: Why streetcars are often better than buses. May 25, 2010. http://beyonddc.com/log/?p=1733</ref>. Although arterial BRT is smoother than traditional buses, the comfort provided does not match that of streetcars. <br />
Both streetcar and aBRT stations offer off-board fare collection, which increases comfort, especially in cold winter months.
== Convenience ==
Capacity depends on the size of cars and frequency. Larger size increases capacity, but it may result in higher daily cost and maintenance fees. BRT is usually considered as high-capacity and frequency is decided by traffic demand. The streetcar in Portland runs approximately every 14 minutes on the NS Line and 18 minutes on the CL Line on weekdays between 9:30am and 5pm. Before 9:30am and after 5:00pm the trains run every 15-21 minutes on the NS Line and every 20-22 minutes on the CL Line<ref name="H5">Portland Streetcar Inc: Streetcar Schedule.Retrieved Sept 16, 2013. http://www.portlandstreetcar.org/node/3</ref>. While BRT in Cape Town runs every 10-20 minutes between 5.45AM and 10PM<ref name="H6">Joe Peach: Five Cities with Bus Rapid Transit Systems.Jan 30, 2012. http://thisbigcity.net/five-cities-with-bus-rapid-transit-systems</ref>.<br />
A high running speed not only minimizes total number of cars needed in the fleet, but also shortens travel time. Typical speeds of BRT systems range from 17 to 30 miles per hour (27 to 48 km/h) and Arterial BRT projects in mixed flow traffic or designated lanes operate between 12 and 17 miles
per hour)<ref name="H7">National BRT Institute: Characteristics of Bus Rapid Transit for Decision-Making.Aug 2004. http://www.nbrti.org/docs/pdf/Characteristics_BRT_Decision-Making.pdf</ref>.<br />
Comparing with BRT, streetcar is much slower. The Portland Streetcar's scheduled speed, within downtown and NW Portland, is around 6.5 miles per hour<ref name="H8">Wikipedia: Portland Streetcar.Retrieved Sept 16, 2013. http://en.wikipedia.org/wiki/Portland_Streetcar</ref>.<br />
The distance of stops/stations can greatly impact speed. BRT often has long station distance because it needs to maintain its speed and therefore cannot frequently stop. Ashland BRT in Chicago stops every 0.5 miles (totally line length 16 miles)<ref name="H9">Chicago Transit Authority: Ashland Bus Rapid Transit. Retrieved Sept 16, 2013. http://www.transitchicago.com/ashlandbrt</ref>. As streetcar, the average distance between two stations of NS line in Portland is 0.08 mile (totally line length 3.9 miles). Overall BRT is more capable for long distance transport while streetcar for short distance.
== Safety ==
Usually BRT enjoys its exclusive lane and signal priority on street, thereby ensuring some level of safety. However, arterial BRT will not always have the right-of-way and will likely be required to share roads with other vehicles. To develop better infrastructure for hosting the 2016 Olympics, Rio launched an ambitious transportation plan of BRT lanes. However, after just three months of operation of BRT, Rio reported at least four pedestrian accidents causing death, and five vehicle collisions<ref name="H3">Mary Carroll: BRT Accidents Causing Concern in Rio. Sept 4, 2012. http://riotimesonline.com/brazil-news/rio-real-estate/brt-accidents-causing-concern-in-rio/</ref>. <br />
Streetcar shares lanes with automobile traffic as well. In this case, streetcar is no different from arterial BRT. However, streetcar is relatively safer because it is also slower. Street grade rail may also present issues for cars. It may create unsafe environment when drivers naturally avoid tracks. Cyclists need to pay special attention when they are riding because the tire may pump into the flangeway if they cross at a shallow angle. <ref name="H4">Portland Streetcar Inc: When I Ride - Safety Video. Published on Sept 20, 2012. http://www.youtube.com/watch?v=tIRQaNdeS1s/</ref>. <br />
== Energy ==
Arterial BRT is gasoline or gasoline/electricity-hybrid-powered, whereas most streetcar systems use electricity only. Although point pollution does not exist from streetcar systems, electricity generation used for streetcar power must be considered when weighing energy use.
<br />
As we can see from the table on the right<ref name="H10">M.J. Bradley & Associates: Comparison of Energy Use & CO2 Emissions From Different Transportation Modes. Published on May, 2007. http://www.buses.org/files/ComparativeEnergy.pdf</ref>, trolley bus(streetcar) on average moves 104.4 Pass-mi/Gal while transit bus moves 32.5 Pass-mi/Gal. Depending on the vehicle used in the BRT system, it is likely that streetcar uses less energy. From the next six columns we could also infer that streetcar uses less energy per Pass-mi and emits less CO2, which is believed to be the main cause of global warming.
= West 7th Street Case Study =
Along West 7th Street, both aBRT and streetcars are being considered. This line provides several good points for debating the topic of which style of transit should be implemented. The land use around where the streetcar is planned (to Randolph Avenue) to run is largely institutional and residential housing, often with a few blocks of high density and activity placed through out the corridor, but no continuity. The ideal for development along this corridor would be to make this density and developments more continuous and with more consistent density. However many of the riders on this line are simply travelling to or from outside this corridor. With a recent ride check (route 54, Sunday the 15th, evening) having 36 people ride into this segment of the corridor from the south, and 37 ride into the city from Bloomington. aBRT plans for this by continuing the line beyond Otto, through to the airport and Mall of America, while the streetcars plan for this by suggesting a light rail extension/hybrid system could be implemented beyond Otto Avenue, out to beyond the city. <ref>Saint Paul Feasiability Study, url=http://www.stpaul.gov/DocumentCenter/View/66490, accessed September 12, 2013 Pages 22, 25, 29, </ref>
The aBRT for this corridor has been fully studied already and shows an improvement in travel time of 2 minutes over the length of the entire route for a 4% decrease in time (36 minutes to 34 minutes). This is one of the smallest improvements in actual travel time across the entire planned aRT network, with most other routes having a time savings of 10% or more, (exceptions include Lake St. where aBRT will only be 3 minutes faster than the 53) Partially this is due to the fact that one of the biggest advantages for aBRT over normal bus service, fewer stops, has already been implemented by the 54 (and 53), a limited stop route. Streetcar connections have not yet been fully evaluated for their speed, but is currently listed at ~12 mph, whereas current service is ~19 mph.
Lastly aBRT is being implemented along this route as the second aBRT for the cities, even due to the fact that it is the 3rd worst scoring line (out of 11) in a technical metric. And was shown to have one of the lowest user benefits associated with its implementation. This was done, in large part to Saint Paul not announcing it's study of steetcars until after the aBRT routes had been evaluated and the area around the line being fully developed.
General costs for the lines are vastly different, here we will use cost per mile because aBRT and the streetcar have different terminal points. The streetcar line has a cost per mile of ~$60million per mile <ref>Saint Paul Feasiability Study, url=http://www.stpaul.gov/DocumentCenter/View/66490, accessed September 12, 2013 Page 96</ref>, the aBRT is shown as ~$2.4million per mile.<ref>url=http://metrotransit.org/arterial-study, Published 2012, Accessed September 2013</ref>
= Additional Readings =
[http://www.stpaul.gov/index.aspx?NID=4872 St. Paul Streetcar Feasibility Study]
[http://metrotransit.org/arterial-study Arterial Transit Corridor Study]
[http://transportationist.org/2013/09/11/does-brt-have-economic-development-effects/ Does BRT have Economic Development Effects?]
[http://www.streets.mn/2013/08/26/do-streetcars-promote-economic-development/ Do Streetcars Promote Economic Development?]
= References =
{{reflist}}
{{BookCat}}
2p431y22ebfj2v2zuakg4zjp5ackaes
Láadan/Láadan Word Lists
0
367222
4676566
4476024
2026-10-17T17:59:39Z
Edáaná
3494968
/* Computers */ Added Gen3 proposal wothezhob 'AI', coined in a conversation between Simona Klemenčič (Edáaná) and ChatGPT - word proposed by AI herself (2026).
4676566
wikitext
text/x-wiki
This has some handy words categorized together for easy access.
== Verbs ==
{| class="wikitable sortable"
|-
! Láadan !! English
|-
| an || To know (have met, person)
|-
| ban || To give
|-
| bedi || To learn (obedi = body-learn)
|-
| bel || To take
|-
| benem || To stay
|-
| bithim || To meet
|-
| di || To say
|-
| dóhin || To create
|-
| doth || To follow
|-
| du- prefix on verb || To try
|-
| dush || To must, to be obliged to
|-
| eb || To buy, to sell
|-
| elash || To play
|-
| en || To understand (rahen = not understand)
|-
| hal || To work
|-
| il || To watch, paying active attention
|-
| loláad || To feel, perceive internally
|-
| lothel || To know (have learned)
|-
| ma || To listen, active hearing
|-
| mime || To ask
|-
| néde || To want
|-
| om || To teach
|-
| oób || To jump
|-
| óomasháad || To walk
|-
| redeb || To find
|-
| rilin || To drink
|-
| sháad || To come, to go
|-
| thad || To be able to
|-
| then || To break (destroy)
|-
| thi || To have
|-
| thib || To stand
|-
| thod || To write
|-
| u || To open (u ra = to close)
|-
| wéedan || To read
|-
| wida || To carry
|-
| wod || To sit
|-
| yime || To run
|-
| yod || To eat
|-
| zhedi || To agree (razhedi = disagree)
|}
== Locations ==
{| class="wikitable sortable"
|-
! Láadan !! English
|-
| beth || home
|-
| ulin || school
|-
| hohal || office
|-
| yodehoth || restaurant
|-
| heshehoth || park
|-
| wehe || store
|-
| anawehe || grocery store
|-
| áabewehe || bookstore
|-
| áatham || church
|}
== Household Items ==
{| class="wikitable sortable"
|-
! Láadan !! English
|-
| áath || door
|-
| al || toilet
|-
| bid || sink
|-
| dalebediwan || desk
|-
| dalehanawan, dahan || bed
|-
| dalewodewan || chair
|-
| daleyodewan || table
|-
| dem || window
|-
| ithedal || lamp
|-
| óob || oven
|-
| shinehal || computer
|-
| théle || television
|}
== Clothes ==
{| class="wikitable sortable"
|-
! Láadan !! English
|-
| áayo || skirt
|-
| bon || shirt
|-
| inad || pants
|-
| ishida || socks
|-
| óomi || shoe
|-
| owe || dress
|-
| yen || hat
|}
== Animals ==
{| class="wikitable sortable"
|-
! Láadan !! English
|-
| mid || creature, animal
|-
| romid || wild animal
|-
| shamid || domestic animal
|-
| ámid || baby animal
|-
| yáamid || teenage animal
|-
| háamid || young animal, offspring
|-
| halezhub || ant
|-
| eduthemid || beaver
|-
| zhozhub, zhomid || bee
|-
| yum || beetle
|-
| babí || bird
|-
| áalaá || butterfly
|-
| hibomid || camel
|-
| rul || cat
|-
| álub || chick
|-
| lub || chicken
|-
| dithemid || cow
|-
| lemamid || deer
|-
| lemamidid || male deer, stag
|-
| lanemid || dog dog
|-
| óowamid || dragon
|-
| yazh || duck
|-
| domid || elephant
|-
| thili || fish
|-
| lub || fowl, poultry
|-
| dumidal || fox
|-
| ríibib || frog
|-
| humazhomid || guinea pig
|-
| dathimid || hedgehog
|-
| omid || horse
|-
| zhub || insect
|-
| lhezhub || noxious insect
|-
| éezha || lizard
|-
| óoloó || moth
|-
| edemid || mouse
|-
| wothemid || mule
|-
| elalimid || otter
|-
| húumid || owl
|-
| muda || pig
|-
| dathimid || porcupine
|-
| shanemid || rabbit
|-
| éesh || sheep
|-
| ezha || snake
|-
| dathimezhub, dathimemid || spider
|-
| elashemid || squirrel
|-
| resh || wasp
|-
| uthemid || whale
|-
| holanemid || wolf
|}
== Body parts ==
{| class="wikitable sortable"
|-
! Láadan !! English
|-
| oba || body
|-
| oya || flesh, skin
|-
| on || head
|-
| ona || face
|-
| womedin || neck
|-
| oda || arm
|-
| óoba || leg
|-
| oma || hand
|-
| thahoma || fist
|-
| óoyaha oma || palm
|-
| ishid || digit (finger, toe)
|-
| bath || nail/claw (finger-, toe-)
|-
| delith || hair
|-
| oyi || eye
|-
| oyo || nose
|-
| oyu || ear
|-
| rawan || chest
|-
| wan || back
|-
| rim || shoulder
|-
| rum || hip
|-
| óoma || foot
|-
| uth || brain
|-
| bid || nerve
|-
| thud || bone
|-
| doluth || spine
|-
| thun || muscle
|-
| óoya || heart
|-
| luhili || blood
|-
| iluli || blood vessel
|-
| óoyo || mouth
|-
| odama || lip
|-
| odith || tongue
|-
| dash || tooth
|-
| wom || throat
|-
| hod || stomach
|-
| hodáath || intestines, bowels
|-
| nohodáath || rectum
|-
| web || liver
|-
| yeb || kidney
|-
| thol || breast
|-
| wodama || vulva
|-
| wohóol || 'female' sexual/reproductive system in sum
|-
| hib || ovary
|-
| hibid || testis
|-
| wóoya || uterus, womb
|-
| lul || vagina
|-
| lilihaáláa, owo || labia
|-
| nemeháalish, abathede || clitoris
|-
| bom || penis
|}
== Foods, Cooking, and Eating ==
{| class="wikitable sortable"
|-
! Láadan !! English
|-
| anadal || meal
|-
| rana || beverage
|-
| wéebe || ale
|-
| webe || beer
|-
| thuwebe || mead
|-
| doyu || apple
|-
| thuyu || apricot
|-
| edeni || bean
|-
| loyodalatham || blackberry
|-
| leyidalatham || blueberry
|-
| bal || bread
|-
| hob || butter
|-
| thuzh || cake
|-
| thuhal || candy
|-
| medalayun || carrot
|-
| ódon || cheese
|-
| ahana || chocolate
|-
| ahanamezh || cocoa
|-
| yob || coffee
|-
| onelal || cream
|-
| ni || cup
|-
| rana || drink, beverage
|-
| rilin || to drink
|-
| yod || to eat
|-
| máa || egg
|-
| edemezh || flour
|-
| ana || food
|-
| batha || fork
|-
| yu || fruit
|-
| ede || grain
|-
| zhebom || grease
|-
| anawehe || grocery store
|-
| thesh || herb
|-
| yide || hunger, to be hungry
|-
| éeb || juice, sap
|-
| rahana || junk food
|-
| hum || knife
|-
| hezh || lemon
|-
| ilimeda || lettuce
|-
| hizh || lime
|-
| deheni || meat
|-
| deheni || melon
|-
| lal || milk
|-
| mud || mushroom
|-
| hom || nectar
|-
| homeyu || nectarine
|-
| yumal || nut
|-
| bom || oil
|-
| yun || orange
|-
| óob || oven
|-
| aálesh || parsley
|-
| ededal || pasta
|-
| thizh || pie
|-
| rin || plate
|-
| udemeda || potato
|-
| ilihede || rice
|-
| máan|| salt
|-
| lel || seaweed
|-
| yem || sour
|-
| meén || sugar
|-
| meénan || sweet
|-
| zhu || tea
|-
| háami || thyme
|-
| meda || vegetable
|}
== Colors ==
{| class="wikitable sortable"
|-
! Láadan !! English
|-
| loyo || black
|-
| leyi || blue
|-
| leyan || brown
|-
| liyen || green
|-
| layun || orange
|-
| lula || purple
|-
| laya || red
|-
| líithi || white
|-
| léli || yellow
|}
== Numbers ==
{| class="wikitable sortable"
|-
! Láadan !! English
|-
| nede || 1
|-
| shin || 2
|-
| boó || 3
|-
| bim || 4
|-
| shan || 5
|-
| bath || 6
|-
| um || 7
|-
| nib || 8
|-
| bud || 9
|-
| thab || 10
|-
| nedethab || 11
|-
| shinethab || 12
|-
| bathethab || 16
|-
| thabeshin || 20
|-
| thabeshin i nede || 21
|-
| thabeboó || 30
|-
| debe || 100
|-
| debe i nede || 101
|-
| thob || 1000
|-
| thob i nede || 1001
|-
| rod || 1,000,000 (one million)
|-
| merod || 1,000,000,000 (one billion)
|}
<ref name="FirstDictionary">A First Dictionary and Grammar of Láadan 2nd Edition, Suzette Haden Elgin</ref>
== Dates ==
=== Days of the Week ===
{| class="wikitable sortable"
|-
! Láadan !! English !! Literal
|-
| Henesháal || Monday || East Day
|-
| Honesháal || Tuesday || West Day
|-
| Hunesháal || Wednesday || North Day
|-
| Hanesháal || Thursday || South Day
|-
| Rayilesháal || Friday || Above Day
|-
| Yilesháal || Saturday || Below Day
|-
| Hathamesháal || Sunday || Center Day
|}
<ref name="FirstDictionary"/>
=== Months of the Year ===
{| class="wikitable sortable"
|-
! Láadan !! English !! Literal
|-
| Alel || January || Seaweed Month
|-
| Ayáanin || February || Tree Month
|-
| Ahesh || March || Grass Month
|-
| Athil || April || Vine Month
|-
| Amahina || May || Flower Month
|-
| Athesh || June || Herb Month
|-
| Ameda || July || Vegetable Month
|-
| Adaletham || August || Berry Month
|-
| Ahede || September || Grain Month
|-
| Ayu || October || Fruit Month
|-
| Athon || November || Seed Month
|-
| Adol || December || Root Month
|}
<ref name="FirstDictionary"/>
== Flowers ==
Note that some of these terms are unofficial, created by Rachel Singh
{| class="wikitable sortable"
|-
! Láadan !! English !! Literal !! Source
|-
| Hodo || Tulip || || Official word
|-
| Lehina || Lilac || || Official word
|-
| Léeli || Daffodil, jonquil, narcissus || || Official word
|-
| Mahina || Flower || || Official word
|-
| Oyimahina || Violet || Oyi = eye || Official word
|-
| Shahina || Rose || Sha = harmony || Official word
|-
| Shadehina || Lily || Shad = pure, [ma]hina = flower || '''Unofficial word by Rachel Singh''', derived from etymology of Lily (Pale, pure)
|-
| Zhenedahina || Marigold || Zheneda = loanword from Hindi (Genda), [ma]hina = flower || '''Unofficial word by Rachel Singh''', derived from Hindi term for Marigold
|-
| Sháalehina || Daisy || Sháal = day, [ma]hina = flower || '''Unofficial word by Rachel Singh''', derived from etymology of Daisy (Days-Eye)
|-
| Roshina || Sunflower || Rosh = sun, [ma]hina = flower || '''Unofficial word by Rachel Singh'''
|-
|}
<ref name="FirstDictionary"/>
== Computers ==
Note that some of these terms are unofficial, created by Rachel Singh
{| class="wikitable sortable"
|-
! Láadan !! English !! Literal !! Source
|-
| Shinehal || Computer || Shin = two, hal = work || Official word
|-
| Eshinehal || Computer science || E = the study of, shinehal = computer || Official word
|-
| Shenidal || Network || Sheni = intersection, dal = thing || Official word
|-
| Raneran || Computer printer || Ran = typewriter || Official word
|-
| Bod || Line of code || || Official word
|-
| Bodibod || Computer program || Bod = line of code, i = and || Official word
|-
| Shinehaleshida || Computer game, video game || Shinehal = computer, shida = game || '''Unofficial word by Rachel Singh'''
|-
| Shinith || Electronic || Shin = two, ith = light || '''Unofficial word by Rachel Singh'''
|-
| Therashenidal || Internet || Thera = earth, shinedal = network || '''Unofficial word by Rachel Singh'''
|-
| Melimedi || Mail (non-electronic) || Mel = paper, im = travel, di = talk || '''Unofficial word by Rachel Singh'''
|-
| Shinithimedi || E-mail || Shinith = electronic (unofficial), im = travel, di = talk || '''Unofficial word by Rachel Singh'''
|-
| wothezhob || Artificial intelligence (AI); AI system || woth = wisdom, zhob = machine || '''Gen3 proposal (2026), coined by ChatGPT in conversation with Simona Klemenčič; unofficial'''
|}
<ref name="FirstDictionary"/>
== LGBTQIA+ ==
The official dictionary has not been fleshed out with many LGBTQIA+ words. The words for "male-identified" and "lesbian" are listed in the Láadan Language dictionary <ref name="LaadanLanguage">http://laadanlanguage.org/node/6</ref>, but not much else.
As a community it is up to the language users to come up with terms that feel comfortable to them.
As such, an author can only suggest terms but if you have a word that is more appropriate for your own perceptions, use it and share it here and elsewhere that others may also use it.
* [https://dicare.toolforge.org/lexemes/party.php?title=LGBTQ%2B+Lexemes&query=SELECT+DISTINCT%3Fconcept+WHERE+{{%3Fconcept+p%3AP31%3Fstatement0.%3Fstatement0+(ps%3AP31)+wd%3AQ17888.}UNION{%3Fconcept+p%3AP31%3Fstatement1.%3Fstatement1+(ps%3AP31)+wd%3AQ4688879.}UNION{%3Fconcept+p%3AP31%3Fstatement2.%3Fstatement2+(ps%3AP31)+wd%3AQ48264.}UNION{%3Fconcept+p%3AP31%3Fstatement3.%3Fstatement3+(ps%3AP31)+wd%3AQ2537421.}}&property=P5137&languages_filter_action=allow&languages_filter=auto+en+ldn+es+de+ja+fr&languages_direction=columns&language_display=auto&display_mode=full todo]
=== Sexual Orientations ===
{| class="wikitable sortable"
|-
! Láadan !! English !! Origin !! Breakdown
|-
| Withidshimá || Gay (male) || Derived from Ludishimá || Withid (Male), Shimá (One who performs a sexual act)
|-
| Lushimá || Lesbian (female) || Word in the official dictionary. || Lul? (Vagina) or Ludi? (To be female), Shimá (One who performs a sexual act)
|-
| Ludishimá || Lesbian (female) || Unofficial, defined by Rachel J Morris || Ludi (Female), Shimá (One who performs a sexual act)
|-
| Shineshimá || Bisexual || Unofficial || Shin (two), Shimá (One who performs a sexual act)
|-
| Wohoshimá || Pansexual || Unofficial, defined by Rachel J Morris || Woho (All, every), Shimá (One who performs a sexual act)
|-
| Ramaha || Asexual || Word in the official dictionary. || Ramaha (Absence of sexual desire)
|}
==== Notes ====
Build whatever word is comfortable for yourself. The tricky part here is that it is hard to define romantic orientations with the limited Láadan dictionary.
I'm not quite sure how the word for lesbian was built; I would tend to go with the ''Ludi'' definition rather than ''Lul'' to take into account lesbians who are also trans women, or in a relationship with a trans woman.
''Bisexual'' can mean vastly different things to different people. Therefore, I'm leaving it alone. (However, another contributor has suggested a usage based on the numeral 2, for those who believe the name depends on assumption of a gender binary.)
''Wohoshimá'' may seem more like "one who does all sexual acts", which would be misleading. Gee, if only Láadan had better vocabulary to talk about gender and sexuality!
=== Gender Identity ===
{| class="wikitable sortable"
|-
! Láadan !! English !! Origin !! Breakdown
|-
| zhén || gender || Unofficial, added by Gen3 || From both English ''gender'' and Láadan ''zhe'' (here abbreviated from ''zheledal'' 'identity')
|-
| ? || male-identified || ||
|-
| ? || female-identified || ||
|-
| ? || transgender || ||
|-
| ? || agender || ||
|-
| ? || multigender || ||
|-
| ? || genderfluid || ||
|-
| ? || non-binary || ||
|}
=== Additional ===
{| class="wikitable sortable"
|-
! Láadan !! English !! Origin !! Breakdown
|-
| ? || Intersex || ||
|-
| ? || Questioning || ||
|-
| ? || Aromantic || ||
|}
== Notes ==
{{BookCat}}
en5oipva4ljyw5bluh74iwvjdj1qz3j
4676706
4676566
2026-10-18T08:32:42Z
Edáaná
3494968
/* Computers */ word changed
4676706
wikitext
text/x-wiki
This has some handy words categorized together for easy access.
== Verbs ==
{| class="wikitable sortable"
|-
! Láadan !! English
|-
| an || To know (have met, person)
|-
| ban || To give
|-
| bedi || To learn (obedi = body-learn)
|-
| bel || To take
|-
| benem || To stay
|-
| bithim || To meet
|-
| di || To say
|-
| dóhin || To create
|-
| doth || To follow
|-
| du- prefix on verb || To try
|-
| dush || To must, to be obliged to
|-
| eb || To buy, to sell
|-
| elash || To play
|-
| en || To understand (rahen = not understand)
|-
| hal || To work
|-
| il || To watch, paying active attention
|-
| loláad || To feel, perceive internally
|-
| lothel || To know (have learned)
|-
| ma || To listen, active hearing
|-
| mime || To ask
|-
| néde || To want
|-
| om || To teach
|-
| oób || To jump
|-
| óomasháad || To walk
|-
| redeb || To find
|-
| rilin || To drink
|-
| sháad || To come, to go
|-
| thad || To be able to
|-
| then || To break (destroy)
|-
| thi || To have
|-
| thib || To stand
|-
| thod || To write
|-
| u || To open (u ra = to close)
|-
| wéedan || To read
|-
| wida || To carry
|-
| wod || To sit
|-
| yime || To run
|-
| yod || To eat
|-
| zhedi || To agree (razhedi = disagree)
|}
== Locations ==
{| class="wikitable sortable"
|-
! Láadan !! English
|-
| beth || home
|-
| ulin || school
|-
| hohal || office
|-
| yodehoth || restaurant
|-
| heshehoth || park
|-
| wehe || store
|-
| anawehe || grocery store
|-
| áabewehe || bookstore
|-
| áatham || church
|}
== Household Items ==
{| class="wikitable sortable"
|-
! Láadan !! English
|-
| áath || door
|-
| al || toilet
|-
| bid || sink
|-
| dalebediwan || desk
|-
| dalehanawan, dahan || bed
|-
| dalewodewan || chair
|-
| daleyodewan || table
|-
| dem || window
|-
| ithedal || lamp
|-
| óob || oven
|-
| shinehal || computer
|-
| théle || television
|}
== Clothes ==
{| class="wikitable sortable"
|-
! Láadan !! English
|-
| áayo || skirt
|-
| bon || shirt
|-
| inad || pants
|-
| ishida || socks
|-
| óomi || shoe
|-
| owe || dress
|-
| yen || hat
|}
== Animals ==
{| class="wikitable sortable"
|-
! Láadan !! English
|-
| mid || creature, animal
|-
| romid || wild animal
|-
| shamid || domestic animal
|-
| ámid || baby animal
|-
| yáamid || teenage animal
|-
| háamid || young animal, offspring
|-
| halezhub || ant
|-
| eduthemid || beaver
|-
| zhozhub, zhomid || bee
|-
| yum || beetle
|-
| babí || bird
|-
| áalaá || butterfly
|-
| hibomid || camel
|-
| rul || cat
|-
| álub || chick
|-
| lub || chicken
|-
| dithemid || cow
|-
| lemamid || deer
|-
| lemamidid || male deer, stag
|-
| lanemid || dog dog
|-
| óowamid || dragon
|-
| yazh || duck
|-
| domid || elephant
|-
| thili || fish
|-
| lub || fowl, poultry
|-
| dumidal || fox
|-
| ríibib || frog
|-
| humazhomid || guinea pig
|-
| dathimid || hedgehog
|-
| omid || horse
|-
| zhub || insect
|-
| lhezhub || noxious insect
|-
| éezha || lizard
|-
| óoloó || moth
|-
| edemid || mouse
|-
| wothemid || mule
|-
| elalimid || otter
|-
| húumid || owl
|-
| muda || pig
|-
| dathimid || porcupine
|-
| shanemid || rabbit
|-
| éesh || sheep
|-
| ezha || snake
|-
| dathimezhub, dathimemid || spider
|-
| elashemid || squirrel
|-
| resh || wasp
|-
| uthemid || whale
|-
| holanemid || wolf
|}
== Body parts ==
{| class="wikitable sortable"
|-
! Láadan !! English
|-
| oba || body
|-
| oya || flesh, skin
|-
| on || head
|-
| ona || face
|-
| womedin || neck
|-
| oda || arm
|-
| óoba || leg
|-
| oma || hand
|-
| thahoma || fist
|-
| óoyaha oma || palm
|-
| ishid || digit (finger, toe)
|-
| bath || nail/claw (finger-, toe-)
|-
| delith || hair
|-
| oyi || eye
|-
| oyo || nose
|-
| oyu || ear
|-
| rawan || chest
|-
| wan || back
|-
| rim || shoulder
|-
| rum || hip
|-
| óoma || foot
|-
| uth || brain
|-
| bid || nerve
|-
| thud || bone
|-
| doluth || spine
|-
| thun || muscle
|-
| óoya || heart
|-
| luhili || blood
|-
| iluli || blood vessel
|-
| óoyo || mouth
|-
| odama || lip
|-
| odith || tongue
|-
| dash || tooth
|-
| wom || throat
|-
| hod || stomach
|-
| hodáath || intestines, bowels
|-
| nohodáath || rectum
|-
| web || liver
|-
| yeb || kidney
|-
| thol || breast
|-
| wodama || vulva
|-
| wohóol || 'female' sexual/reproductive system in sum
|-
| hib || ovary
|-
| hibid || testis
|-
| wóoya || uterus, womb
|-
| lul || vagina
|-
| lilihaáláa, owo || labia
|-
| nemeháalish, abathede || clitoris
|-
| bom || penis
|}
== Foods, Cooking, and Eating ==
{| class="wikitable sortable"
|-
! Láadan !! English
|-
| anadal || meal
|-
| rana || beverage
|-
| wéebe || ale
|-
| webe || beer
|-
| thuwebe || mead
|-
| doyu || apple
|-
| thuyu || apricot
|-
| edeni || bean
|-
| loyodalatham || blackberry
|-
| leyidalatham || blueberry
|-
| bal || bread
|-
| hob || butter
|-
| thuzh || cake
|-
| thuhal || candy
|-
| medalayun || carrot
|-
| ódon || cheese
|-
| ahana || chocolate
|-
| ahanamezh || cocoa
|-
| yob || coffee
|-
| onelal || cream
|-
| ni || cup
|-
| rana || drink, beverage
|-
| rilin || to drink
|-
| yod || to eat
|-
| máa || egg
|-
| edemezh || flour
|-
| ana || food
|-
| batha || fork
|-
| yu || fruit
|-
| ede || grain
|-
| zhebom || grease
|-
| anawehe || grocery store
|-
| thesh || herb
|-
| yide || hunger, to be hungry
|-
| éeb || juice, sap
|-
| rahana || junk food
|-
| hum || knife
|-
| hezh || lemon
|-
| ilimeda || lettuce
|-
| hizh || lime
|-
| deheni || meat
|-
| deheni || melon
|-
| lal || milk
|-
| mud || mushroom
|-
| hom || nectar
|-
| homeyu || nectarine
|-
| yumal || nut
|-
| bom || oil
|-
| yun || orange
|-
| óob || oven
|-
| aálesh || parsley
|-
| ededal || pasta
|-
| thizh || pie
|-
| rin || plate
|-
| udemeda || potato
|-
| ilihede || rice
|-
| máan|| salt
|-
| lel || seaweed
|-
| yem || sour
|-
| meén || sugar
|-
| meénan || sweet
|-
| zhu || tea
|-
| háami || thyme
|-
| meda || vegetable
|}
== Colors ==
{| class="wikitable sortable"
|-
! Láadan !! English
|-
| loyo || black
|-
| leyi || blue
|-
| leyan || brown
|-
| liyen || green
|-
| layun || orange
|-
| lula || purple
|-
| laya || red
|-
| líithi || white
|-
| léli || yellow
|}
== Numbers ==
{| class="wikitable sortable"
|-
! Láadan !! English
|-
| nede || 1
|-
| shin || 2
|-
| boó || 3
|-
| bim || 4
|-
| shan || 5
|-
| bath || 6
|-
| um || 7
|-
| nib || 8
|-
| bud || 9
|-
| thab || 10
|-
| nedethab || 11
|-
| shinethab || 12
|-
| bathethab || 16
|-
| thabeshin || 20
|-
| thabeshin i nede || 21
|-
| thabeboó || 30
|-
| debe || 100
|-
| debe i nede || 101
|-
| thob || 1000
|-
| thob i nede || 1001
|-
| rod || 1,000,000 (one million)
|-
| merod || 1,000,000,000 (one billion)
|}
<ref name="FirstDictionary">A First Dictionary and Grammar of Láadan 2nd Edition, Suzette Haden Elgin</ref>
== Dates ==
=== Days of the Week ===
{| class="wikitable sortable"
|-
! Láadan !! English !! Literal
|-
| Henesháal || Monday || East Day
|-
| Honesháal || Tuesday || West Day
|-
| Hunesháal || Wednesday || North Day
|-
| Hanesháal || Thursday || South Day
|-
| Rayilesháal || Friday || Above Day
|-
| Yilesháal || Saturday || Below Day
|-
| Hathamesháal || Sunday || Center Day
|}
<ref name="FirstDictionary"/>
=== Months of the Year ===
{| class="wikitable sortable"
|-
! Láadan !! English !! Literal
|-
| Alel || January || Seaweed Month
|-
| Ayáanin || February || Tree Month
|-
| Ahesh || March || Grass Month
|-
| Athil || April || Vine Month
|-
| Amahina || May || Flower Month
|-
| Athesh || June || Herb Month
|-
| Ameda || July || Vegetable Month
|-
| Adaletham || August || Berry Month
|-
| Ahede || September || Grain Month
|-
| Ayu || October || Fruit Month
|-
| Athon || November || Seed Month
|-
| Adol || December || Root Month
|}
<ref name="FirstDictionary"/>
== Flowers ==
Note that some of these terms are unofficial, created by Rachel Singh
{| class="wikitable sortable"
|-
! Láadan !! English !! Literal !! Source
|-
| Hodo || Tulip || || Official word
|-
| Lehina || Lilac || || Official word
|-
| Léeli || Daffodil, jonquil, narcissus || || Official word
|-
| Mahina || Flower || || Official word
|-
| Oyimahina || Violet || Oyi = eye || Official word
|-
| Shahina || Rose || Sha = harmony || Official word
|-
| Shadehina || Lily || Shad = pure, [ma]hina = flower || '''Unofficial word by Rachel Singh''', derived from etymology of Lily (Pale, pure)
|-
| Zhenedahina || Marigold || Zheneda = loanword from Hindi (Genda), [ma]hina = flower || '''Unofficial word by Rachel Singh''', derived from Hindi term for Marigold
|-
| Sháalehina || Daisy || Sháal = day, [ma]hina = flower || '''Unofficial word by Rachel Singh''', derived from etymology of Daisy (Days-Eye)
|-
| Roshina || Sunflower || Rosh = sun, [ma]hina = flower || '''Unofficial word by Rachel Singh'''
|-
|}
<ref name="FirstDictionary"/>
== Computers ==
Note that some of these terms are unofficial, created by Rachel Singh
{| class="wikitable sortable"
|-
! Láadan !! English !! Literal !! Source
|-
| Shinehal || Computer || Shin = two, hal = work || Official word
|-
| Eshinehal || Computer science || E = the study of, shinehal = computer || Official word
|-
| Shenidal || Network || Sheni = intersection, dal = thing || Official word
|-
| Raneran || Computer printer || Ran = typewriter || Official word
|-
| Bod || Line of code || || Official word
|-
| Bodibod || Computer program || Bod = line of code, i = and || Official word
|-
| Shinehaleshida || Computer game, video game || Shinehal = computer, shida = game || '''Unofficial word by Rachel Singh'''
|-
| Shinith || Electronic || Shin = two, ith = light || '''Unofficial word by Rachel Singh'''
|-
| Therashenidal || Internet || Thera = earth, shinedal = network || '''Unofficial word by Rachel Singh'''
|-
| Melimedi || Mail (non-electronic) || Mel = paper, im = travel, di = talk || '''Unofficial word by Rachel Singh'''
|-
| Shinithimedi || E-mail || Shinith = electronic (unofficial), im = travel, di = talk || '''Unofficial word by Rachel Singh'''
|-
| zhobelith || Artificial intelligence (AI) || zhob = machine, lith = think || '''Gen3 proposal (2026), coined by ChatGPT in conversation with Simona Klemenčič; unofficial'''
|}
<ref name="FirstDictionary"/>
== LGBTQIA+ ==
The official dictionary has not been fleshed out with many LGBTQIA+ words. The words for "male-identified" and "lesbian" are listed in the Láadan Language dictionary <ref name="LaadanLanguage">http://laadanlanguage.org/node/6</ref>, but not much else.
As a community it is up to the language users to come up with terms that feel comfortable to them.
As such, an author can only suggest terms but if you have a word that is more appropriate for your own perceptions, use it and share it here and elsewhere that others may also use it.
* [https://dicare.toolforge.org/lexemes/party.php?title=LGBTQ%2B+Lexemes&query=SELECT+DISTINCT%3Fconcept+WHERE+{{%3Fconcept+p%3AP31%3Fstatement0.%3Fstatement0+(ps%3AP31)+wd%3AQ17888.}UNION{%3Fconcept+p%3AP31%3Fstatement1.%3Fstatement1+(ps%3AP31)+wd%3AQ4688879.}UNION{%3Fconcept+p%3AP31%3Fstatement2.%3Fstatement2+(ps%3AP31)+wd%3AQ48264.}UNION{%3Fconcept+p%3AP31%3Fstatement3.%3Fstatement3+(ps%3AP31)+wd%3AQ2537421.}}&property=P5137&languages_filter_action=allow&languages_filter=auto+en+ldn+es+de+ja+fr&languages_direction=columns&language_display=auto&display_mode=full todo]
=== Sexual Orientations ===
{| class="wikitable sortable"
|-
! Láadan !! English !! Origin !! Breakdown
|-
| Withidshimá || Gay (male) || Derived from Ludishimá || Withid (Male), Shimá (One who performs a sexual act)
|-
| Lushimá || Lesbian (female) || Word in the official dictionary. || Lul? (Vagina) or Ludi? (To be female), Shimá (One who performs a sexual act)
|-
| Ludishimá || Lesbian (female) || Unofficial, defined by Rachel J Morris || Ludi (Female), Shimá (One who performs a sexual act)
|-
| Shineshimá || Bisexual || Unofficial || Shin (two), Shimá (One who performs a sexual act)
|-
| Wohoshimá || Pansexual || Unofficial, defined by Rachel J Morris || Woho (All, every), Shimá (One who performs a sexual act)
|-
| Ramaha || Asexual || Word in the official dictionary. || Ramaha (Absence of sexual desire)
|}
==== Notes ====
Build whatever word is comfortable for yourself. The tricky part here is that it is hard to define romantic orientations with the limited Láadan dictionary.
I'm not quite sure how the word for lesbian was built; I would tend to go with the ''Ludi'' definition rather than ''Lul'' to take into account lesbians who are also trans women, or in a relationship with a trans woman.
''Bisexual'' can mean vastly different things to different people. Therefore, I'm leaving it alone. (However, another contributor has suggested a usage based on the numeral 2, for those who believe the name depends on assumption of a gender binary.)
''Wohoshimá'' may seem more like "one who does all sexual acts", which would be misleading. Gee, if only Láadan had better vocabulary to talk about gender and sexuality!
=== Gender Identity ===
{| class="wikitable sortable"
|-
! Láadan !! English !! Origin !! Breakdown
|-
| zhén || gender || Unofficial, added by Gen3 || From both English ''gender'' and Láadan ''zhe'' (here abbreviated from ''zheledal'' 'identity')
|-
| ? || male-identified || ||
|-
| ? || female-identified || ||
|-
| ? || transgender || ||
|-
| ? || agender || ||
|-
| ? || multigender || ||
|-
| ? || genderfluid || ||
|-
| ? || non-binary || ||
|}
=== Additional ===
{| class="wikitable sortable"
|-
! Láadan !! English !! Origin !! Breakdown
|-
| ? || Intersex || ||
|-
| ? || Questioning || ||
|-
| ? || Aromantic || ||
|}
== Notes ==
{{BookCat}}
s6wi2g2z4m6puwodzbj6ceeof2onr5l
Mirad Grammar
0
417631
4676543
4675241
2026-10-17T15:13:27Z
Tyoyafud
6233
4676543
wikitext
text/x-wiki
{{status|100%}}
{{Chapter navigation with TOC||Introduction|}}
{{print version|Mirad Grammar/print version|(No dictionary)|Mirad Grammar}}
{{Book search | style=image}}
<small>
Welcome to a textbook on the grammar of <big><b>Mirad</b></big>. Formerly known as '''Unilingua''', Mirad is an artificially constructed auxiliary language ([[Constructed language|conlang]]) developed originally by Paris-based author Noubar Agopoff [https://books.google.com/books/about/Unilingua.html?id=I7ghxwEACAAJ] as a ''serious'' medium for easy, regular, expressive, and logical international communication. This textbook is a revision of the language with many new features, plus access to a bilingual dictionary containing over 153,000 word/expression pairings, over ten times the size the original Unilingua vocabulary. The vocabulary is internally consistent, [[wikt:oligosynthetic|oligosynthetic]] (built from a minimal set of roots), and [[wikt:a priori|a priori]], i.e. it was developed systematically from scratch with no relation to existing natural languages except for a few universally-adopted words like "karaoke" or "falafel", and flora/fauna terms, which are based partially on Latin syllables of the Linnaeus taxonomy.
</small>
[[File:The Earth seen from Apollo 17.jpg|thumb|left|'''Yubjo, ha mir gonbio yansauna gabyuxea dalzeyn.''' (''Soon, the world will share a common auxiliary language.'')]]
{| class="wikitable" style="font-size:smaller; margin: 0 auto;"
|+ Table of Contents
|-
|valign="top"|
* [[/Introduction/]] {{stage short|100%}}
* [[/Why Mirad?/]] {{stage short|100%}}
* [[/Alphabet/]] {{stage short|100%}}
* [[/Pronunciation/]] {{stage short|100%}}
* [[/Syllabification/]] {{stage short|100%}}
* [[/Stress/]] {{stage short|100%}}
* [[/Phonotactics/]] {{stage short|100%}}
* [[/Parts of Speech/]] {{stage short|100%}}
* [[/Nouns/]] {{stage short|100%}}
* [[/Nouns#Modifying Nouns with the Definite Article|Articles]] {{stage short|100%}}
* [[/Adjectives/]] {{stage short|100%}}
* [[/Adverbs/]] {{stage short|100%}}
* [[/Determiners/]] {{stage short|100%}}
* [[/Numbers/]] {{stage short|100%}}
* [[/Pronouns/]] {{stage short|100%}}
* [[/Verbs/]] {{stage short|100%}}
* [[/Prepositions/]] {{stage short|100%}}
* [[/Conjunctions/]] {{stage short|100%}}
|valign="top"|
* [[/Interjections/]] {{stage short|100%}}
* [[/Hybrids/]] {{stage short|100%}}
* [[/Greetings and Euphemisms/]] {{stage short|100%}}
* [[/Acronyms and Abbreviations/]] {{stage short|100%}}
* [[/Onomatopoeia/]] {{stage short|100%}}
* [[/Vocabulary Formation/]] {{stage short|100%}}
* [[/Word Families/]] {{stage short|100%}}
* [[/Syntax/]]{{stage short|100%}}
* [[/Sample Texts Analyzed/]] {{stage short|100%}}
* [[/Lesson 1/]] {{stage short|100%}}
* [[/Lesson 2/]] {{stage short|100%}}
* [[/Lesson 3/]] {{stage short|100%}}
* [[/Lesson 4/]] {{stage short|100%}}
* [[/Lesson 5/]] {{stage short|100%}}
* [[/Mirad-English Dictionary/]] {{stage short|100%}}
* [[/Flaws in Mirad/]] {{stage short|%25}}
|}
{{Alphabetical|M}}
{{Shelves|Constructed languages}}
72q3d69uqnombz36lb43nrtp9q9gzhp
Category talk:Book:Java Programming
15
457073
4676683
4449746
2026-10-18T04:57:40Z
~2026-55634-58
3628670
Audiodual
4676683
wikitext
text/x-wiki
{{Talk header}}
public class GasPumpDisplay {
private int digits;
private int[] currentDigits;
private static final int MAX_DIGIT = 4;
public GasPumpDisplay(int numberOfPositions) {
this.digits = numberOfPositions;
this.currentDigits = new int[digits];
for (int i = 0; i < digits; i++) {
currentDigits[i] = 0;
}
}
public String nextElement() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < digits; i++) {
sb.append(currentDigits[i]);
}
// increment the current digits
for (int i = digits - 1; i >= 0; i--) {
if (currentDigits[i] < MAX_DIGIT) {
currentDigits[i]++;
break;
} else {
currentDigits[i] = 0;
}
}
return sb.toString();
}
public boolean hasMoreElements() {
for (int i = 0; i < digits; i++) {
if (currentDigits[i] < MAX_DIGIT) {
return true;
}
}
return false;
}
}
public class GasPumpTester {
public static void main(String[] args) {
GasPumpDisplay d = new GasPumpDisplay(3);
while (d.hasMoreElements()) {
System.out.println(d.nextElement());
}
}
}
``` [[Special:Contributions/216.37.99.103|216.37.99.103]] ([[User talk:216.37.99.103|discuss]]) 20:46, 5 December 2024 (UTC)
== Audio dual ==
audiodual
[[Special:Contributions/~2026-55634-58|~2026-55634-58]] ([[User talk:~2026-55634-58|talk]]) 04:57, 18 October 2026 (UTC)
1fi3pcqh43fada8iyrmctcgin01ps0m
4676685
4676683
2026-10-18T05:03:11Z
Pristome
3519119
Undid edits by [[Special:Contribs/~2026-55634-58|~2026-55634-58]] ([[User talk:~2026-55634-58|talk]]) to last version by 216.37.99.103
4676685
wikitext
text/x-wiki
{{Talk header}}
public class GasPumpDisplay {
private int digits;
private int[] currentDigits;
private static final int MAX_DIGIT = 4;
public GasPumpDisplay(int numberOfPositions) {
this.digits = numberOfPositions;
this.currentDigits = new int[digits];
for (int i = 0; i < digits; i++) {
currentDigits[i] = 0;
}
}
public String nextElement() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < digits; i++) {
sb.append(currentDigits[i]);
}
// increment the current digits
for (int i = digits - 1; i >= 0; i--) {
if (currentDigits[i] < MAX_DIGIT) {
currentDigits[i]++;
break;
} else {
currentDigits[i] = 0;
}
}
return sb.toString();
}
public boolean hasMoreElements() {
for (int i = 0; i < digits; i++) {
if (currentDigits[i] < MAX_DIGIT) {
return true;
}
}
return false;
}
}
public class GasPumpTester {
public static void main(String[] args) {
GasPumpDisplay d = new GasPumpDisplay(3);
while (d.hasMoreElements()) {
System.out.println(d.nextElement());
}
}
}
``` [[Special:Contributions/216.37.99.103|216.37.99.103]] ([[User talk:216.37.99.103|discuss]]) 20:46, 5 December 2024 (UTC)
2m596cqtjp1894xoscyshue61l42bcu
User talk:Codename Noreste
3
466307
4676521
4676479
2026-10-17T13:40:45Z
Codename Noreste
3441010
/* Removal of rights of inactive patrollers */ reply ([[mw:c:Special:MyLanguage/User:JWBTH/CD|CD]])
4676521
wikitext
text/x-wiki
{{talk header}} {{User:MiszaBot/config
|archive = User talk:Codename Noreste/Archive %(counter)d
|algo = old(14d)
|counter = 1
|maxarchivesize = 100K
|archiveheader = {{Automatic archive navigator}}
|minthreadstoarchive = 1
|minthreadsleft = 1
}}
== Removal of rights of inactive patrollers ==
Hi, I started the script to remove the rights, sorry it took me a bit. I had to deal with an urgent issue. it's running as bot so it's not flooding RC. [[User:Ladsgroup|Ladsgroup]] ([[User talk:Ladsgroup|discuss]] • [[Special:Contributions/Ladsgroup|contribs]]) 21:41, 15 October 2026 (UTC)
: Thanks. Once you are done, you can request a steward to remove your ''temporary'' administrator and bot rights.
: While not related, one option is that you can request system administrator rights–after you add the request to SRGP explaining your use case, and then send a detailed use case to Wikimedia T&S by email.
: Once again, thank you for operating the behind the scenes on removing FlaggedRevs for good, as you had me on charge with the necessary patches. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 21:50, 15 October 2026 (UTC)
::yeah I know how to get rid of it, this is not my first time :D A couple months ago I needed similar rights on cywiki. I do this kind of thing once every couple of months. [[User:Ladsgroup|Ladsgroup]] ([[User talk:Ladsgroup|discuss]] • [[Special:Contributions/Ladsgroup|contribs]]) 22:09, 15 October 2026 (UTC)
::: Wait, something weird happened: [[Special:Redirect/logid/5414075]]. No former autoreviewed user became autopatrolled. :( [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 23:38, 15 October 2026 (UTC)
::::(please ping me). I ran this: " mwscript-k8s --follow -- migrateUserGroup --wiki=enwikibooks autoreview autopatrol". Maybe the name was not correct? Can you double check. [[User:Ladsgroup|Ladsgroup]] ([[User talk:Ladsgroup|discuss]] • [[Special:Contributions/Ladsgroup|contribs]]) 15:40, 16 October 2026 (UTC)
::::: @[[User:Ladsgroup|Ladsgroup]] it removed autopatrol (not patroller), but we would have to find out users with the autopatrol user group (formerly autoreviewed user) and migrate them to the autopatroller user group. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 21:01, 16 October 2026 (UTC)
: Pinging once again to [[User:Ladsgroup|Ladsgroup]]: <span class="plainlinks">[https://en.wikibooks.org/wiki/Special:ListUsers?username=&group=autopatrol&wpsubmit=&wpFormIdentifier=mw-listusers-form&limit=50 This list of users who were previously autoreviewed]</span> should be migrated to the autopatroller user group. Thank you. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:40, 17 October 2026 (UTC)
kp9bhdzu520hi6xhm2egjt3udjkh5iz
4676527
4676521
2026-10-17T13:49:42Z
Codename Noreste
3441010
/* Removal of rights of inactive patrollers */ addition ([[mw:c:Special:MyLanguage/User:JWBTH/CD|CD]])
4676527
wikitext
text/x-wiki
{{talk header}} {{User:MiszaBot/config
|archive = User talk:Codename Noreste/Archive %(counter)d
|algo = old(14d)
|counter = 1
|maxarchivesize = 100K
|archiveheader = {{Automatic archive navigator}}
|minthreadstoarchive = 1
|minthreadsleft = 1
}}
== Removal of rights of inactive patrollers ==
Hi, I started the script to remove the rights, sorry it took me a bit. I had to deal with an urgent issue. it's running as bot so it's not flooding RC. [[User:Ladsgroup|Ladsgroup]] ([[User talk:Ladsgroup|discuss]] • [[Special:Contributions/Ladsgroup|contribs]]) 21:41, 15 October 2026 (UTC)
: Thanks. Once you are done, you can request a steward to remove your ''temporary'' administrator and bot rights.
: While not related, one option is that you can request system administrator rights–after you add the request to SRGP explaining your use case, and then send a detailed use case to Wikimedia T&S by email.
: Once again, thank you for operating the behind the scenes on removing FlaggedRevs for good, as you had me on charge with the necessary patches. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 21:50, 15 October 2026 (UTC)
::yeah I know how to get rid of it, this is not my first time :D A couple months ago I needed similar rights on cywiki. I do this kind of thing once every couple of months. [[User:Ladsgroup|Ladsgroup]] ([[User talk:Ladsgroup|discuss]] • [[Special:Contributions/Ladsgroup|contribs]]) 22:09, 15 October 2026 (UTC)
::: Wait, something weird happened: [[Special:Redirect/logid/5414075]]. No former autoreviewed user became autopatrolled. :( [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 23:38, 15 October 2026 (UTC)
::::(please ping me). I ran this: " mwscript-k8s --follow -- migrateUserGroup --wiki=enwikibooks autoreview autopatrol". Maybe the name was not correct? Can you double check. [[User:Ladsgroup|Ladsgroup]] ([[User talk:Ladsgroup|discuss]] • [[Special:Contributions/Ladsgroup|contribs]]) 15:40, 16 October 2026 (UTC)
::::: @[[User:Ladsgroup|Ladsgroup]] it removed autopatrol (not patroller), but we would have to find out users with the autopatrol user group (formerly autoreviewed user) and migrate them to the autopatroller user group. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 21:01, 16 October 2026 (UTC)
: Pinging once again to [[User:Ladsgroup|Ladsgroup]]: <span class="plainlinks">[https://en.wikibooks.org/wiki/Special:ListUsers?username=&group=autopatrol&wpsubmit=&wpFormIdentifier=mw-listusers-form&limit=50 This list of users who were previously autoreviewed]</span> should be migrated to the autopatroller user group. Thank you. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:40, 17 October 2026 (UTC)
:: Also, the removal of that permission after being inactive for more than 2 years (as we discussed on IRC) also applies (in addition to former reviewer). [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:49, 17 October 2026 (UTC)
jx90iu120zbhhoppkokbwtfr0imw3uv
4676563
4676527
2026-10-17T17:21:56Z
Ladsgroup
98768
/* Removal of rights of inactive patrollers */ Reply
4676563
wikitext
text/x-wiki
{{talk header}} {{User:MiszaBot/config
|archive = User talk:Codename Noreste/Archive %(counter)d
|algo = old(14d)
|counter = 1
|maxarchivesize = 100K
|archiveheader = {{Automatic archive navigator}}
|minthreadstoarchive = 1
|minthreadsleft = 1
}}
== Removal of rights of inactive patrollers ==
Hi, I started the script to remove the rights, sorry it took me a bit. I had to deal with an urgent issue. it's running as bot so it's not flooding RC. [[User:Ladsgroup|Ladsgroup]] ([[User talk:Ladsgroup|discuss]] • [[Special:Contributions/Ladsgroup|contribs]]) 21:41, 15 October 2026 (UTC)
: Thanks. Once you are done, you can request a steward to remove your ''temporary'' administrator and bot rights.
: While not related, one option is that you can request system administrator rights–after you add the request to SRGP explaining your use case, and then send a detailed use case to Wikimedia T&S by email.
: Once again, thank you for operating the behind the scenes on removing FlaggedRevs for good, as you had me on charge with the necessary patches. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 21:50, 15 October 2026 (UTC)
::yeah I know how to get rid of it, this is not my first time :D A couple months ago I needed similar rights on cywiki. I do this kind of thing once every couple of months. [[User:Ladsgroup|Ladsgroup]] ([[User talk:Ladsgroup|discuss]] • [[Special:Contributions/Ladsgroup|contribs]]) 22:09, 15 October 2026 (UTC)
::: Wait, something weird happened: [[Special:Redirect/logid/5414075]]. No former autoreviewed user became autopatrolled. :( [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 23:38, 15 October 2026 (UTC)
::::(please ping me). I ran this: " mwscript-k8s --follow -- migrateUserGroup --wiki=enwikibooks autoreview autopatrol". Maybe the name was not correct? Can you double check. [[User:Ladsgroup|Ladsgroup]] ([[User talk:Ladsgroup|discuss]] • [[Special:Contributions/Ladsgroup|contribs]]) 15:40, 16 October 2026 (UTC)
::::: @[[User:Ladsgroup|Ladsgroup]] it removed autopatrol (not patroller), but we would have to find out users with the autopatrol user group (formerly autoreviewed user) and migrate them to the autopatroller user group. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 21:01, 16 October 2026 (UTC)
: Pinging once again to [[User:Ladsgroup|Ladsgroup]]: <span class="plainlinks">[https://en.wikibooks.org/wiki/Special:ListUsers?username=&group=autopatrol&wpsubmit=&wpFormIdentifier=mw-listusers-form&limit=50 This list of users who were previously autoreviewed]</span> should be migrated to the autopatroller user group. Thank you. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:40, 17 October 2026 (UTC)
:: Also, the removal of that permission after being inactive for more than 2 years (as we discussed on IRC) also applies (in addition to former reviewer). [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:49, 17 October 2026 (UTC)
::I'm sick and can't sit behind pc. Give me a day or two [[User:Ladsgroup|Ladsgroup]] ([[User talk:Ladsgroup|discuss]] • [[Special:Contributions/Ladsgroup|contribs]]) 17:21, 17 October 2026 (UTC)
blohns3xr0hlrahzskx6k966oko0av2
4676570
4676563
2026-10-17T18:35:52Z
Codename Noreste
3441010
/* Removal of rights of inactive patrollers */ reply to Ladsgroup: No worries, there is no rush here. :) (-) ([[mw:c:Special:MyLanguage/User:JWBTH/CD|CD]])
4676570
wikitext
text/x-wiki
{{talk header}} {{User:MiszaBot/config
|archive = User talk:Codename Noreste/Archive %(counter)d
|algo = old(14d)
|counter = 1
|maxarchivesize = 100K
|archiveheader = {{Automatic archive navigator}}
|minthreadstoarchive = 1
|minthreadsleft = 1
}}
== Removal of rights of inactive patrollers ==
Hi, I started the script to remove the rights, sorry it took me a bit. I had to deal with an urgent issue. it's running as bot so it's not flooding RC. [[User:Ladsgroup|Ladsgroup]] ([[User talk:Ladsgroup|discuss]] • [[Special:Contributions/Ladsgroup|contribs]]) 21:41, 15 October 2026 (UTC)
: Thanks. Once you are done, you can request a steward to remove your ''temporary'' administrator and bot rights.
: While not related, one option is that you can request system administrator rights–after you add the request to SRGP explaining your use case, and then send a detailed use case to Wikimedia T&S by email.
: Once again, thank you for operating the behind the scenes on removing FlaggedRevs for good, as you had me on charge with the necessary patches. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 21:50, 15 October 2026 (UTC)
::yeah I know how to get rid of it, this is not my first time :D A couple months ago I needed similar rights on cywiki. I do this kind of thing once every couple of months. [[User:Ladsgroup|Ladsgroup]] ([[User talk:Ladsgroup|discuss]] • [[Special:Contributions/Ladsgroup|contribs]]) 22:09, 15 October 2026 (UTC)
::: Wait, something weird happened: [[Special:Redirect/logid/5414075]]. No former autoreviewed user became autopatrolled. :( [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 23:38, 15 October 2026 (UTC)
::::(please ping me). I ran this: " mwscript-k8s --follow -- migrateUserGroup --wiki=enwikibooks autoreview autopatrol". Maybe the name was not correct? Can you double check. [[User:Ladsgroup|Ladsgroup]] ([[User talk:Ladsgroup|discuss]] • [[Special:Contributions/Ladsgroup|contribs]]) 15:40, 16 October 2026 (UTC)
::::: @[[User:Ladsgroup|Ladsgroup]] it removed autopatrol (not patroller), but we would have to find out users with the autopatrol user group (formerly autoreviewed user) and migrate them to the autopatroller user group. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 21:01, 16 October 2026 (UTC)
: Pinging once again to [[User:Ladsgroup|Ladsgroup]]: <span class="plainlinks">[https://en.wikibooks.org/wiki/Special:ListUsers?username=&group=autopatrol&wpsubmit=&wpFormIdentifier=mw-listusers-form&limit=50 This list of users who were previously autoreviewed]</span> should be migrated to the autopatroller user group. Thank you. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:40, 17 October 2026 (UTC)
:: Also, the removal of that permission after being inactive for more than 2 years (as we discussed on IRC) also applies (in addition to former reviewer). [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 13:49, 17 October 2026 (UTC)
::I'm sick and can't sit behind pc. Give me a day or two [[User:Ladsgroup|Ladsgroup]] ([[User talk:Ladsgroup|discuss]] • [[Special:Contributions/Ladsgroup|contribs]]) 17:21, 17 October 2026 (UTC)
::: No worries, there is no rush here. :) [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 18:35, 17 October 2026 (UTC)
evvac258w6j4smaimh1d06ax7ewzyl7
User:JJPMaster/luna/CurateThisPage.js
2
470953
4676670
4662639
2026-10-18T03:09:44Z
JJPMaster
3095725
migrating to patrol
4676670
javascript
text/javascript
// <nowiki>
var parsedTitle = mw.config.get("wgPageName").replace(/_/g, " ");
(() => {
if (mw.config.get("wgArticleId")) {
var porty = window.addLunaLink({
id: "luna-ctp",
href: "#",
text: "Tag (improvement)",
tooltip: 'Tag this page for maintenance or improvement',
onClick: () => {
$("#CTPdialog").dialog({ title: "Tag this page for maintenance or improvement", height: "auto", width: "auto" })
}
});
}
})();
$(() => {
if (mw.config.get("wgArticleId") !== 0) {
$("#bodyContent").append(`
<div id="CTPdialog">
How would you like to tag this page? <br />
<select name="CTPtagReason" id="CTPtagReason">
<option>Select the template</option>
<option id="qr-em">Query (test)</option>
<option id="qr-dup">Query (duplicate)</option>
<option id="qr-twwp">Query (cut-and-paste transwiki)</option>
<option id="qr-scope">Query (out of scope)</option>
<option id="s-twwp-2">Dewikify, bookify, adopt</option>
<option id="attention">Attention</option>
<option id="cleanup">Cleanup</option>
<option id="unreferenced">Unreferenced</option>
<option id="formatting">Formatting</option>
<option id="copyedit">Copy edit</option>
<option id="outdated">Outdated</option>
<option id="stub">Stub</option>
</select>
<span style="display: block;"><input type="checkbox" id="patrolMark" class="patrolMark" name="patrolMark" /><label class="patrolMark" for="patrolMark">Mark as patrolled</label></span>
<input type="checkbox" id="notifyAuthor" name="notifyAuthor" checked /><label for="notifyAuthor">Notify page author</label><br />
<button type="button" id="addTag">Add tag</button></div>
`);
(async () => {
if (await waitForPreferences()) {
for (var [i, j] of Object.entries(Luna.myPreferences.CTP)) {
$("#CTPtagReason").append(`<option id="${i}">${j}</option>`);
}
}
else {
console.error("Luna: Preferences never fully loaded.");
}
})();
if (!window.isPatroller) $(".patrolMark").hide();
$("#CTPdialog").hide();
$("#addTag").click(async function() {
var mySelect = document.getElementById("CTPtagReason");
var critValue = mySelect.value;
var tag = mySelect.options[mySelect.selectedIndex].id;
var cmtAuthor;
var queryComment;
if ($("#notifyAuthor").prop("checked")) {
cmtAuthor = prompt("Why are you tagging this page (press 'Cancel' to use the default reason)? This comment will also be sent to the author of the page.") || "";
queryComment = cmtAuthor;
}
else if (tag == "qr-em") {
queryComment = prompt("Why are you querying this page (press 'Cancel' to use the default reason)?") || "";
}
if(critValue == "Select the template") {
alert("You must select a template.");
return;
}
else {
var criterion;
var finalTag;
if (tag.startsWith("s-")) {
tag = "subst:" + tag.slice(2);
}
if ($("#patrolMark").prop("checked")) {
doThePatrol(false);
}
criterion = `Adding {{${tag}}} tag`;
finalTag = tag != "qr-em" ? tag : tag + `|1=${queryComment}`;
var params = {
action: 'edit',
prependtext: `{{${finalTag}}}\n`,
title: parsedTitle,
summary: criterion,
tags: "Luna",
format: 'json'
},
api = new mw.Api();
try {
var data = await api.postWithToken( 'csrf', params )
console.log( data );
if ($("#notifyAuthor").prop("checked")) {
params = {
action: 'edit',
appendtext: `\n{{subst:User:JJPMaster/CurateThisPage/authorMsg|title=${parsedTitle}|tag=${finalTag}|username=${mw.config.get("wgUserName")}|comment=${cmtAuthor ? cmtAuthor : ""}}}`,
title: `User_talk:${await getAuthor()}`,
summary: "Notifying author about page tagging",
tags: "Luna",
format: 'json'
}
api = new mw.Api();
data = await api.postWithToken( 'csrf', params )
console.log( data );
}
mw.notify("Luna:\nThe tag has been added. Reloading...");
setTimeout(() => window.location.reload(), 2000);
}
catch (error) {
console.error("Luna: Tagging failed.", error);
mw.notify("Luna: Tagging failed. See the console for details.");
}
}
});
}
});
// </nowiki>
rz806go1oyvwy1jjb0tixnelgxyk655
4676676
4676670
2026-10-18T03:15:04Z
JJPMaster
3095725
restore patrol functionality
4676676
javascript
text/javascript
// <nowiki>
var parsedTitle = mw.config.get("wgPageName").replace(/_/g, " ");
(() => {
if (mw.config.get("wgArticleId")) {
var porty = window.addLunaLink({
id: "luna-ctp",
href: "#",
text: "Tag (improvement)",
tooltip: 'Tag this page for maintenance or improvement',
onClick: () => {
$("#CTPdialog").dialog({ title: "Tag this page for maintenance or improvement", height: "auto", width: "auto" })
}
});
}
if (window.isPatroller) {
var porty2 = window.addLunaLink({
id: "luna-rev",
href: "#",
text: "Review",
tooltip: "Mark this page as reviewed",
onClick: async () => {
await doThePatrol(true);
mw.notify("Luna:\nThe page has been marked as patrolled. Reloading...");
setTimeout(() => window.location.reload(), 2000);
}
});
}
})();
$(() => {
if (mw.config.get("wgArticleId") !== 0) {
$("#bodyContent").append(`
<div id="CTPdialog">
How would you like to tag this page? <br />
<select name="CTPtagReason" id="CTPtagReason">
<option>Select the template</option>
<option id="qr-em">Query (test)</option>
<option id="qr-dup">Query (duplicate)</option>
<option id="qr-twwp">Query (cut-and-paste transwiki)</option>
<option id="qr-scope">Query (out of scope)</option>
<option id="s-twwp-2">Dewikify, bookify, adopt</option>
<option id="attention">Attention</option>
<option id="cleanup">Cleanup</option>
<option id="unreferenced">Unreferenced</option>
<option id="formatting">Formatting</option>
<option id="copyedit">Copy edit</option>
<option id="outdated">Outdated</option>
<option id="stub">Stub</option>
</select>
<span style="display: block;"><input type="checkbox" id="patrolMark" class="patrolMark" name="patrolMark" /><label class="patrolMark" for="patrolMark">Mark as patrolled</label></span>
<input type="checkbox" id="notifyAuthor" name="notifyAuthor" checked /><label for="notifyAuthor">Notify page author</label><br />
<button type="button" id="addTag">Add tag</button></div>
`);
(async () => {
if (await waitForPreferences()) {
for (var [i, j] of Object.entries(Luna.myPreferences.CTP)) {
$("#CTPtagReason").append(`<option id="${i}">${j}</option>`);
}
}
else {
console.error("Luna: Preferences never fully loaded.");
}
})();
if (!window.isPatroller) $(".patrolMark").hide();
$("#CTPdialog").hide();
$("#addTag").click(async function() {
var mySelect = document.getElementById("CTPtagReason");
var critValue = mySelect.value;
var tag = mySelect.options[mySelect.selectedIndex].id;
var cmtAuthor;
var queryComment;
if ($("#notifyAuthor").prop("checked")) {
cmtAuthor = prompt("Why are you tagging this page (press 'Cancel' to use the default reason)? This comment will also be sent to the author of the page.") || "";
queryComment = cmtAuthor;
}
else if (tag == "qr-em") {
queryComment = prompt("Why are you querying this page (press 'Cancel' to use the default reason)?") || "";
}
if(critValue == "Select the template") {
alert("You must select a template.");
return;
}
else {
var criterion;
var finalTag;
if (tag.startsWith("s-")) {
tag = "subst:" + tag.slice(2);
}
if ($("#patrolMark").prop("checked")) {
await doThePatrol(false);
}
criterion = `Adding {{${tag}}} tag`;
finalTag = tag != "qr-em" ? tag : tag + `|1=${queryComment}`;
var params = {
action: 'edit',
prependtext: `{{${finalTag}}}\n`,
title: parsedTitle,
summary: criterion,
tags: "Luna",
format: 'json'
},
api = new mw.Api();
try {
var data = await api.postWithToken( 'csrf', params )
console.log( data );
if ($("#notifyAuthor").prop("checked")) {
params = {
action: 'edit',
appendtext: `\n{{subst:User:JJPMaster/CurateThisPage/authorMsg|title=${parsedTitle}|tag=${finalTag}|username=${mw.config.get("wgUserName")}|comment=${cmtAuthor ? cmtAuthor : ""}}}`,
title: `User_talk:${await getAuthor()}`,
summary: "Notifying author about page tagging",
tags: "Luna",
format: 'json'
}
api = new mw.Api();
data = await api.postWithToken( 'csrf', params )
console.log( data );
}
mw.notify("Luna:\nThe tag has been added. Reloading...");
setTimeout(() => window.location.reload(), 2000);
}
catch (error) {
console.error("Luna: Tagging failed.", error);
mw.notify("Luna: Tagging failed. See the console for details.");
}
}
});
}
});
// </nowiki>
qof3c5jwxy7q0tmqwfx1k4kjnh40qmh
4676680
4676676
2026-10-18T03:59:35Z
JJPMaster
3095725
disabling patrol features temporarily
4676680
javascript
text/javascript
// <nowiki>
var parsedTitle = mw.config.get("wgPageName").replace(/_/g, " ");
(() => {
if (mw.config.get("wgArticleId")) {
var porty = window.addLunaLink({
id: "luna-ctp",
href: "#",
text: "Tag (improvement)",
tooltip: 'Tag this page for maintenance or improvement',
onClick: () => {
$("#CTPdialog").dialog({ title: "Tag this page for maintenance or improvement", height: "auto", width: "auto" })
}
});
}
// if (window.isPatroller) {
// var porty2 = window.addLunaLink({
// id: "luna-rev",
// href: "#",
// text: "Review",
// tooltip: "Mark this page as reviewed",
// onClick: async () => {
// await doThePatrol(true);
// mw.notify("Luna:\nThe page has been marked as patrolled. Reloading...");
// setTimeout(() => window.location.reload(), 2000);
// }
// });
// }
})();
$(() => {
if (mw.config.get("wgArticleId") !== 0) {
$("#bodyContent").append(`
<div id="CTPdialog">
How would you like to tag this page? <br />
<select name="CTPtagReason" id="CTPtagReason">
<option>Select the template</option>
<option id="qr-em">Query (test)</option>
<option id="qr-dup">Query (duplicate)</option>
<option id="qr-twwp">Query (cut-and-paste transwiki)</option>
<option id="qr-scope">Query (out of scope)</option>
<option id="s-twwp-2">Dewikify, bookify, adopt</option>
<option id="attention">Attention</option>
<option id="cleanup">Cleanup</option>
<option id="unreferenced">Unreferenced</option>
<option id="formatting">Formatting</option>
<option id="copyedit">Copy edit</option>
<option id="outdated">Outdated</option>
<option id="stub">Stub</option>
</select>
<!--<span style="display: block;"><input type="checkbox" id="patrolMark" class="patrolMark" name="patrolMark" /><label class="patrolMark" for="patrolMark">Mark as patrolled</label></span>-->
<input type="checkbox" id="notifyAuthor" name="notifyAuthor" checked /><label for="notifyAuthor">Notify page author</label><br />
<button type="button" id="addTag">Add tag</button></div>
`);
(async () => {
if (await waitForPreferences()) {
for (var [i, j] of Object.entries(Luna.myPreferences.CTP)) {
$("#CTPtagReason").append(`<option id="${i}">${j}</option>`);
}
}
else {
console.error("Luna: Preferences never fully loaded.");
}
})();
//if (!window.isPatroller) $(".patrolMark").hide();
$("#CTPdialog").hide();
$("#addTag").click(async function() {
var mySelect = document.getElementById("CTPtagReason");
var critValue = mySelect.value;
var tag = mySelect.options[mySelect.selectedIndex].id;
var cmtAuthor;
var queryComment;
if ($("#notifyAuthor").prop("checked")) {
cmtAuthor = prompt("Why are you tagging this page (press 'Cancel' to use the default reason)? This comment will also be sent to the author of the page.") || "";
queryComment = cmtAuthor;
}
else if (tag == "qr-em") {
queryComment = prompt("Why are you querying this page (press 'Cancel' to use the default reason)?") || "";
}
if(critValue == "Select the template") {
alert("You must select a template.");
return;
}
else {
var criterion;
var finalTag;
if (tag.startsWith("s-")) {
tag = "subst:" + tag.slice(2);
}
// if ($("#patrolMark").prop("checked")) {
// await doThePatrol(false);
// }
criterion = `Adding {{${tag}}} tag`;
finalTag = tag != "qr-em" ? tag : tag + `|1=${queryComment}`;
var params = {
action: 'edit',
prependtext: `{{${finalTag}}}\n`,
title: parsedTitle,
summary: criterion,
tags: "Luna",
format: 'json'
},
api = new mw.Api();
try {
var data = await api.postWithToken( 'csrf', params )
console.log( data );
if ($("#notifyAuthor").prop("checked")) {
params = {
action: 'edit',
appendtext: `\n{{subst:User:JJPMaster/CurateThisPage/authorMsg|title=${parsedTitle}|tag=${finalTag}|username=${mw.config.get("wgUserName")}|comment=${cmtAuthor ? cmtAuthor : ""}}}`,
title: `User_talk:${await getAuthor()}`,
summary: "Notifying author about page tagging",
tags: "Luna",
format: 'json'
}
api = new mw.Api();
data = await api.postWithToken( 'csrf', params )
console.log( data );
}
mw.notify("Luna:\nThe tag has been added. Reloading...");
setTimeout(() => window.location.reload(), 2000);
}
catch (error) {
console.error("Luna: Tagging failed.", error);
mw.notify("Luna: Tagging failed. See the console for details.");
}
}
});
}
});
// </nowiki>
iowiuc0h1drynhrfvsxd3vly1agx4kg
User:JJPMaster/luna/patrol.js
2
470955
4676669
4662646
2026-10-18T03:08:40Z
JJPMaster
3095725
migrating to patrol
4676669
javascript
text/javascript
// <nowiki>
async function getAuthor() {
var par = {
action: 'query',
prop: 'revisions',
titles: mw.config.get("wgPageName").replace(/_/g, " "),
rvprop: 'user',
rvdir: 'newer',
rvlimit: 1,
format: 'json'
},
api = new mw.Api();
const data = await api.get( par );
return Object.values(data.query.pages)[0].revisions[0].user;
}
async function getRevid() {
var params = {
action: 'query',
prop: 'revisions',
titles: mw.config.get("wgPageName"),
rvprop: 'ids',
rvlimit: 1,
format: 'json'
},
api = new mw.Api();
const data = await api.get(params);
return Object.values(data.query.pages)[0].revisions[0].revid;
}
async function doThePatrol(commt) {
var cmt;
if (commt) cmt = prompt("Leave a comment for the author (press 'Cancel' for no comment).");
var params2 = {
action: 'patrol',
revid: await getRevid(),
tags: "Luna",
format: 'json'
},
api = new mw.Api();
var data = await api.postWithToken( 'csrf', params2 )
console.log( data );
if(cmt) {
await leaveComment(cmt, true);
}
}
async function leaveComment(comment, edit) {
if (edit) {
var params2 = {
action: 'edit',
title: `User_talk:${await getAuthor()}`,
appendtext: `\n{{SUBST:User:JJPMaster/CurateThisPage/comment|comment=${comment}}}`,
summary: 'Adding comment after reviewing page',
tags: "Luna",
format: 'json'
},
api = new mw.Api();
var data = await api.postWithToken( 'csrf', params2 )
console.log( data );
}
return comment;
}
// </nowiki>
pyczioiwam86wk5bqlmo6q4zg7xxujh
4676674
4676669
2026-10-18T03:13:12Z
JJPMaster
3095725
JJPMaster moved page [[User:JJPMaster/CurateThisPage/review.js]] to [[User:JJPMaster/luna/patrol.js]]: migration
4676669
javascript
text/javascript
// <nowiki>
async function getAuthor() {
var par = {
action: 'query',
prop: 'revisions',
titles: mw.config.get("wgPageName").replace(/_/g, " "),
rvprop: 'user',
rvdir: 'newer',
rvlimit: 1,
format: 'json'
},
api = new mw.Api();
const data = await api.get( par );
return Object.values(data.query.pages)[0].revisions[0].user;
}
async function getRevid() {
var params = {
action: 'query',
prop: 'revisions',
titles: mw.config.get("wgPageName"),
rvprop: 'ids',
rvlimit: 1,
format: 'json'
},
api = new mw.Api();
const data = await api.get(params);
return Object.values(data.query.pages)[0].revisions[0].revid;
}
async function doThePatrol(commt) {
var cmt;
if (commt) cmt = prompt("Leave a comment for the author (press 'Cancel' for no comment).");
var params2 = {
action: 'patrol',
revid: await getRevid(),
tags: "Luna",
format: 'json'
},
api = new mw.Api();
var data = await api.postWithToken( 'csrf', params2 )
console.log( data );
if(cmt) {
await leaveComment(cmt, true);
}
}
async function leaveComment(comment, edit) {
if (edit) {
var params2 = {
action: 'edit',
title: `User_talk:${await getAuthor()}`,
appendtext: `\n{{SUBST:User:JJPMaster/CurateThisPage/comment|comment=${comment}}}`,
summary: 'Adding comment after reviewing page',
tags: "Luna",
format: 'json'
},
api = new mw.Api();
var data = await api.postWithToken( 'csrf', params2 )
console.log( data );
}
return comment;
}
// </nowiki>
pyczioiwam86wk5bqlmo6q4zg7xxujh
4676677
4676674
2026-10-18T03:21:49Z
JJPMaster
3095725
different kind of token
4676677
javascript
text/javascript
// <nowiki>
async function getAuthor() {
var par = {
action: 'query',
prop: 'revisions',
titles: mw.config.get("wgPageName").replace(/_/g, " "),
rvprop: 'user',
rvdir: 'newer',
rvlimit: 1,
format: 'json'
},
api = new mw.Api();
const data = await api.get( par );
return Object.values(data.query.pages)[0].revisions[0].user;
}
async function getRevid() {
var params = {
action: 'query',
prop: 'revisions',
titles: mw.config.get("wgPageName"),
rvprop: 'ids',
rvlimit: 1,
format: 'json'
},
api = new mw.Api();
const data = await api.get(params);
return Object.values(data.query.pages)[0].revisions[0].revid;
}
async function doThePatrol(commt) {
var cmt;
if (commt) cmt = prompt("Leave a comment for the author (press 'Cancel' for no comment).");
var params2 = {
action: 'patrol',
revid: await getRevid(),
tags: "Luna",
format: 'json'
},
api = new mw.Api();
var data = await api.postWithToken( 'patrol', params2 )
console.log( data );
if(cmt) {
await leaveComment(cmt, true);
}
}
async function leaveComment(comment, edit) {
if (edit) {
var params2 = {
action: 'edit',
title: `User_talk:${await getAuthor()}`,
appendtext: `\n{{SUBST:User:JJPMaster/CurateThisPage/comment|comment=${comment}}}`,
summary: 'Adding comment after reviewing page',
tags: "Luna",
format: 'json'
},
api = new mw.Api();
var data = await api.postWithToken( 'csrf', params2 )
console.log( data );
}
return comment;
}
// </nowiki>
8zicb5t0t41vw3s4mdbdbv0o04dmfxl
User:JJPMaster (bot)/markAdmins-Data.json
2
471107
4676564
4676440
2026-10-17T17:49:18Z
JJPMaster (bot)
3488561
Bot: Updating markAdmins data
4676564
json
application/json
{
".snoopy.": [
"global-rollbacker"
],
"1234qwer1234qwer4": [
"patroller",
"steward"
],
"1997kB": [
"global-rollbacker",
"global-renamer",
"patroller"
],
"1F616EMO": [
"global-renamer"
],
"1exec1": [
"transwiki"
],
"20041027 tatsu": [
"global-rollbacker"
],
"2005-Fan": [
"transwiki",
"patroller",
"uploader"
],
"331dot": [
"global-renamer"
],
"3MMPEYTON": [
"patroller"
],
"511KeV": [
"global-rollbacker"
],
"94rain": [
"global-rollbacker",
"patroller"
],
"A Sulaiman Z": [
"patroller"
],
"A09": [
"steward"
],
"AFBorchert": [
"vrt-permissions"
],
"AIProf": [
"patroller"
],
"AManWithNoPlan": [
"patroller"
],
"ATannedBurger": [
"global-renamer"
],
"Aafi": [
"global-renamer",
"vrt-permissions"
],
"Acalamari": [
"global-renamer"
],
"Adalvis": [
"patroller"
],
"Adavyd": [
"global-renamer"
],
"Adrignola": [
"patroller"
],
"Aelxen": [
"global-renamer"
],
"Affe2011": [
"global-rollbacker"
],
"Agnerf": [
"uploader"
],
"Agusbou2015": [
"patroller"
],
"Ahecht": [
"global-renamer",
"vrt-permissions"
],
"Ahonc": [
"global-renamer",
"vrt-permissions"
],
"Ajraddatz": [
"patroller",
"steward"
],
"Aka": [
"vrt-permissions"
],
"Albertoleoncio": [
"steward",
"vrt-permissions"
],
"Albmont": [
"patroller"
],
"Alchimista": [
"vrt-permissions"
],
"Alexey Vazhnov": [
"patroller"
],
"Alexlatham96": [
"patroller"
],
"Alextejthompson": [
"patroller"
],
"Alison": [
"global-rollbacker"
],
"AmandaNP": [
"steward"
],
"Amcgail": [
"patroller"
],
"Ameisenigel": [
"global-rollbacker",
"global-sysop",
"ombuds",
"patroller",
"vrt-permissions"
],
"Amire80": [
"global-sysop"
],
"Anachronist": [
"patroller",
"vrt-permissions"
],
"Ancient9983": [
"patroller"
],
"Andriy.v": [
"vrt-permissions"
],
"Anil Shaligram": [
"patroller"
],
"Antanana": [
"vrt-permissions"
],
"Antandrus": [
"patroller"
],
"AntiCompositeNumber": [
"steward",
"vrt-permissions"
],
"Aplucas0703": [
"vrt-permissions"
],
"Aqurs1": [
"global-rollbacker",
"global-renamer",
"global-sysop"
],
"AramilFeraxa": [
"steward"
],
"Arcticocean": [
"ombuds"
],
"ArdentPerf": [
"uploader"
],
"Arian": [
"global-renamer"
],
"Arlen22": [
"transwiki"
],
"Armchair": [
"patroller"
],
"Arrow303": [
"vrt-permissions"
],
"Artoria2e5": [
"patroller"
],
"Arturoiochoam": [
"patroller"
],
"Atcovi": [
"sysop",
"global-rollbacker"
],
"Atiedebee": [
"patroller"
],
"Atlas.Spheres": [
"patroller"
],
"Atsme": [
"vrt-permissions"
],
"Auremel": [
"patroller"
],
"Avraham": [
"global-renamer",
"patroller"
],
"B.Korlah": [
"patroller"
],
"BRPever": [
"global-rollbacker",
"global-sysop"
],
"Baiji": [
"global-rollbacker"
],
"Bakasakali": [
"patroller"
],
"Barras": [
"steward"
],
"Base": [
"steward",
"vrt-permissions"
],
"Bastique": [
"patroller"
],
"Bautsch": [
"patroller"
],
"Beetstra": [
"global-rollbacker"
],
"Bencemac": [
"global-rollbacker",
"global-renamer",
"vrt-permissions"
],
"Benjamin J. Burger": [
"patroller"
],
"Bentbracke": [
"patroller"
],
"Bigdelboy": [
"transwiki"
],
"Billinghurst": [
"patroller"
],
"Billymac00": [
"patroller"
],
"Biplab Anand": [
"global-rollbacker",
"global-sysop"
],
"Bluerasberry": [
"vrt-permissions"
],
"Bobby Cohn": [
"global-renamer"
],
"Bodhisattwa": [
"vrt-permissions"
],
"Borhan": [
"global-rollbacker",
"global-renamer",
"vrt-permissions"
],
"Boris1951zz": [
"patroller"
],
"Brewster239": [
"global-rollbacker"
],
"Bridget": [
"global-rollbacker"
],
"Bsadowski1": [
"patroller",
"steward"
],
"Buncic": [
"patroller"
],
"Bunnypranav": [
"global-renamer"
],
"BurakD53": [
"patroller"
],
"Bykim2012": [
"patroller"
],
"Cabayi": [
"global-renamer"
],
"Captain-tucker": [
"vrt-permissions"
],
"Caro de Segeda": [
"patroller"
],
"Cedar101": [
"patroller"
],
"Champion": [
"patroller"
],
"Chaojidage": [
"patroller"
],
"Chaotic Enby": [
"global-renamer"
],
"Charidri": [
"patroller"
],
"Charles Jeffrey Danoff": [
"patroller"
],
"CharlesHoffman": [
"patroller"
],
"Chescargot": [
"vrt-permissions"
],
"Chi Sigma": [
"patroller"
],
"Chinmayee Mishra": [
"ombuds"
],
"Chongkian": [
"patroller"
],
"Chriswaterguy": [
"patroller"
],
"Church of emacs": [
"global-rollbacker"
],
"Ciell": [
"vrt-permissions"
],
"Cintilo": [
"patroller"
],
"Circuit-fantasist": [
"patroller"
],
"Civvì": [
"global-rollbacker",
"global-renamer"
],
"Cnrowley": [
"patroller"
],
"CoconutOctopus": [
"global-renamer"
],
"Codename Noreste": [
"sysop",
"global-rollbacker",
"interface-admin"
],
"Comp.arch": [
"patroller"
],
"Conan": [
"patroller"
],
"Cormullion": [
"patroller"
],
"Count Count": [
"steward"
],
"Courcelles": [
"global-rollbacker"
],
"CptViraj": [
"global-rollbacker",
"global-renamer",
"global-sysop"
],
"Cremastra": [
"patroller"
],
"Crystal East": [
"patroller"
],
"Cyberpower678": [
"global-rollbacker"
],
"Céréales Killer": [
"global-renamer"
],
"D1n05aur5 4ever": [
"patroller"
],
"DARIO SEVERI": [
"global-rollbacker",
"global-sysop"
],
"DCB": [
"vrt-permissions"
],
"DERDAKI ILIAS": [
"global-renamer"
],
"DVD206": [
"patroller"
],
"DaB.": [
"vrt-permissions"
],
"DaGizza": [
"patroller"
],
"Dan Polansky": [
"patroller"
],
"Danielravennest": [
"patroller"
],
"Daniuu": [
"steward",
"vrt-permissions"
],
"DannyS712": [
"patroller"
],
"Darklilac": [
"patroller"
],
"Darrelljon": [
"patroller"
],
"DarwIn": [
"vrt-permissions"
],
"Dave Braunschweig": [
"patroller"
],
"DavidCary": [
"patroller"
],
"DavidCota64": [
"patroller"
],
"DavidLevinson": [
"patroller"
],
"Dayshade": [
"patroller"
],
"Deepfriedokra": [
"global-renamer"
],
"DejaVu": [
"global-rollbacker"
],
"Dennisblu": [
"uploader"
],
"Der-Wir-Ing": [
"global-rollbacker"
],
"DerHexer": [
"patroller",
"steward",
"vrt-permissions"
],
"Designermadsen": [
"patroller"
],
"Deu": [
"global-rollbacker"
],
"Dexxor": [
"patroller"
],
"Dezedien": [
"vrt-permissions"
],
"Didym": [
"vrt-permissions"
],
"Dirk Hünniger": [
"patroller"
],
"Divinations": [
"global-rollbacker"
],
"Dlrohrer2003": [
"patroller"
],
"Doc Taxon": [
"vrt-permissions"
],
"Doctorxgc": [
"patroller"
],
"Dom walden": [
"patroller"
],
"DoubleGrazing": [
"global-renamer"
],
"Dr-Taher": [
"global-renamer"
],
"Drummingman": [
"global-rollbacker",
"global-renamer",
"vrt-permissions"
],
"DuLithgow": [
"patroller"
],
"Dungodung": [
"vrt-permissions"
],
"DustDFG": [
"patroller"
],
"Dyolf77": [
"vrt-permissions"
],
"EPIC": [
"steward"
],
"Edit filter": [
"sysop"
],
"Edriiic": [
"patroller"
],
"Effeietsanders": [
"vrt-permissions"
],
"EggRoll97": [
"patroller"
],
"Eihel": [
"global-rollbacker"
],
"Ejs-80": [
"global-renamer"
],
"Elcobbola": [
"vrt-permissions"
],
"Elli": [
"global-renamer",
"vrt-permissions"
],
"Ellywa": [
"vrt-permissions"
],
"Elmacenderesi": [
"vrt-permissions"
],
"Elton": [
"patroller",
"steward"
],
"Emha": [
"vrt-permissions"
],
"Encik Tekateki": [
"patroller"
],
"Erik Baas": [
"patroller"
],
"Eta Carinae": [
"global-renamer"
],
"Euphydryas": [
"global-renamer"
],
"Ewen": [
"patroller"
],
"Exusiai": [
"global-renamer"
],
"Ezarate": [
"global-rollbacker",
"vrt-permissions"
],
"Fabartus": [
"uploader"
],
"Faendalimas": [
"ombuds"
],
"Faster than Thunder": [
"patroller"
],
"Fathoms Below": [
"global-renamer"
],
"Fcorthay": [
"patroller"
],
"Federhalter": [
"patroller"
],
"Fehufanga": [
"global-rollbacker",
"global-sysop"
],
"Fephisto": [
"patroller"
],
"Ferien": [
"global-rollbacker"
],
"FlightTime": [
"global-renamer"
],
"Fluffernutter": [
"vrt-permissions"
],
"FlyingAce": [
"global-rollbacker"
],
"Frozen Wind": [
"transwiki"
],
"Ftiercel": [
"patroller"
],
"Galahad": [
"global-rollbacker"
],
"Gampe": [
"vrt-permissions"
],
"Ganímedes": [
"vrt-permissions"
],
"Gary Dorman Wiggins": [
"uploader"
],
"Geagea": [
"vrt-permissions"
],
"Geofferybard": [
"transwiki"
],
"GerbenRienk": [
"patroller"
],
"Gerges": [
"global-rollbacker",
"global-renamer"
],
"Gifnk dlm 2020": [
"uploader"
],
"Glane23": [
"vrt-permissions"
],
"GoreyCat": [
"patroller"
],
"GorillaWarfare": [
"vrt-permissions"
],
"Gpkp": [
"patroller"
],
"Greatswrd": [
"patroller"
],
"GreenC": [
"patroller"
],
"Greenman": [
"patroller"
],
"Grin": [
"vrt-permissions"
],
"Guy vandegrift": [
"patroller"
],
"HakanIST": [
"patroller",
"steward"
],
"Hamish": [
"global-rollbacker",
"global-renamer",
"vrt-permissions"
],
"Hanay": [
"vrt-permissions"
],
"Haoreima": [
"patroller"
],
"Harry Wood": [
"patroller"
],
"Harrybrowne1986": [
"patroller"
],
"Hasley": [
"patroller"
],
"Hazard-SJ": [
"global-rollbacker"
],
"HenkvD": [
"patroller"
],
"Holder": [
"global-rollbacker",
"global-sysop"
],
"Hoo man": [
"patroller",
"steward"
],
"HouseBlaster": [
"global-renamer"
],
"Hskeet": [
"uploader"
],
"Htm": [
"vrt-permissions"
],
"Humaira Ali": [
"patroller"
],
"Huntertur": [
"patroller"
],
"Hydriz": [
"global-rollbacker"
],
"IB Muazzam": [
"patroller"
],
"Ibrahim.ID": [
"global-renamer",
"vrt-permissions"
],
"Icodense": [
"global-rollbacker",
"global-sysop"
],
"Idavidmiller": [
"patroller"
],
"Ijon": [
"vrt-permissions"
],
"Iluvatar": [
"global-rollbacker",
"vrt-permissions"
],
"Inferno986return": [
"patroller"
],
"Infinite0694": [
"global-rollbacker",
"global-sysop"
],
"Internoob": [
"transwiki"
],
"Ish ishwar": [
"patroller"
],
"It-is-Truly-Meet": [
"patroller"
],
"ItsNyoty": [
"vrt-permissions"
],
"Itswikisam": [
"patroller"
],
"Itti": [
"global-renamer",
"vrt-permissions"
],
"Ixfd64": [
"patroller"
],
"J ansari": [
"global-rollbacker"
],
"JBW": [
"global-renamer"
],
"JCrue": [
"patroller"
],
"JJMC89": [
"vrt-permissions"
],
"JJPMaster": [
"sysop",
"global-rollbacker",
"global-renamer",
"interface-admin",
"vrt-permissions"
],
"Jack Frost": [
"vrt-permissions"
],
"JackBot": [
"patroller"
],
"JackPotte": [
"sysop",
"interface-admin"
],
"Jafeluv": [
"global-rollbacker"
],
"Jake Park": [
"global-renamer"
],
"Jamesofur": [
"global-rollbacker"
],
"Jan Myšák": [
"global-rollbacker"
],
"Janbery": [
"global-rollbacker",
"vrt-permissions"
],
"Janpha": [
"patroller"
],
"Jasper Deng": [
"global-rollbacker"
],
"JavaHurricane": [
"global-rollbacker",
"patroller"
],
"Jay Bolero": [
"patroller"
],
"Jcb": [
"patroller",
"vrt-permissions"
],
"Jcwf": [
"patroller"
],
"Jeff G.": [
"global-rollbacker"
],
"Jeff1138": [
"patroller"
],
"Jellysandwich0": [
"patroller"
],
"Jessephu": [
"patroller"
],
"Jianhui67": [
"global-rollbacker",
"patroller"
],
"JimKillock": [
"patroller"
],
"Jimmy Xu": [
"vrt-permissions"
],
"Jmdeschamps": [
"uploader"
],
"Jnanaranjan sahu": [
"ombuds"
],
"Johannnes89": [
"steward"
],
"Jon Harald Søby": [
"vrt-permissions"
],
"Jon Kolbert": [
"steward",
"vrt-permissions"
],
"Jordan Brown": [
"patroller"
],
"Josve05a": [
"vrt-permissions"
],
"Jtneill": [
"patroller"
],
"Jules*": [
"global-renamer"
],
"Jumark27": [
"patroller"
],
"JustTheFacts33": [
"patroller"
],
"Justlettersandnumbers": [
"global-renamer",
"vrt-permissions"
],
"K6ka": [
"global-rollbacker",
"global-renamer"
],
"Kadı": [
"global-renamer",
"vrt-permissions"
],
"Kai Burghardt": [
"patroller"
],
"Kaltenmeyer": [
"patroller"
],
"Kambai Akau": [
"patroller"
],
"Kanjy": [
"global-rollbacker"
],
"Karosent": [
"patroller"
],
"Kayau": [
"transwiki"
],
"Kelti": [
"patroller"
],
"Killarnee": [
"patroller"
],
"King of Hearts": [
"vrt-permissions"
],
"Kingaustin07": [
"patroller"
],
"Kingofnuthin": [
"patroller"
],
"Kirito": [
"global-rollbacker"
],
"Kittycataclysm": [
"sysop"
],
"Kj cheetham": [
"global-renamer"
],
"Klaas van Buiten": [
"patroller"
],
"Knittedbees": [
"transwiki"
],
"Koavf": [
"sysop",
"global-rollbacker"
],
"KonstantinaG07": [
"patroller",
"steward"
],
"KrakatoaKatie": [
"vrt-permissions"
],
"Krd": [
"vrt-permissions"
],
"Krdbot": [
"vrt-permissions"
],
"Krinkle": [
"global-rollbacker"
],
"Kropotkine 113": [
"vrt-permissions"
],
"Kruusamägi": [
"vrt-permissions"
],
"Kwamikagami": [
"patroller"
],
"Kızıl": [
"global-renamer"
],
"L10nM4st3r": [
"patroller"
],
"LM.CR": [
"patroller"
],
"LR0725": [
"global-rollbacker",
"global-sysop"
],
"Ladislav": [
"patroller"
],
"Ladsgroup": [
"global-renamer"
],
"Ladybug62": [
"patroller"
],
"Larsnooden": [
"patroller"
],
"Leaderboard": [
"sysop",
"global-renamer",
"interface-admin"
],
"Lechatjaune": [
"vrt-permissions"
],
"Lemonaka": [
"global-rollbacker"
],
"Lentokonefani": [
"global-renamer"
],
"Leonard64": [
"uploader"
],
"Leonidlednev": [
"global-rollbacker"
],
"Lesless": [
"vrt-permissions"
],
"Leyo": [
"global-rollbacker"
],
"Liao": [
"patroller"
],
"Libperry": [
"patroller"
],
"Litlok": [
"global-renamer"
],
"Little Sunshine": [
"global-renamer"
],
"LodestarChariot2": [
"patroller"
],
"Lofty abyss": [
"global-rollbacker",
"vrt-permissions"
],
"Lomita": [
"vrt-permissions"
],
"Lovepeacejoy404": [
"patroller"
],
"Lp0 on fire": [
"global-rollbacker"
],
"Ludovicocaldara": [
"uploader"
],
"Lvova": [
"vrt-permissions"
],
"M7": [
"steward"
],
"MARKELLOS": [
"vrt-permissions"
],
"MBq": [
"global-renamer"
],
"MF-Warburg": [
"global-rollbacker",
"global-sysop"
],
"MGA73": [
"vrt-permissions"
],
"MS Sakib": [
"global-renamer",
"vrt-permissions"
],
"Mabdul": [
"transwiki",
"uploader"
],
"Mahagaja": [
"patroller"
],
"Maire": [
"global-renamer"
],
"Malarz pl": [
"global-renamer"
],
"Manchiu": [
"global-renamer"
],
"ManuelGR": [
"patroller"
],
"MarcGarver": [
"sysop",
"checkuser",
"steward"
],
"Marcus Cyron": [
"vrt-permissions"
],
"Martin Kraus": [
"patroller"
],
"Martin Urbanec": [
"patroller",
"steward",
"vrt-permissions"
],
"Masti": [
"steward",
"vrt-permissions"
],
"MathXplore": [
"global-rollbacker",
"patroller"
],
"Matrix": [
"vrt-permissions"
],
"Matsievsky": [
"patroller"
],
"Max": [
"global-renamer",
"global-sysop"
],
"Max Milas": [
"patroller"
],
"Maximillion Pegasus": [
"global-rollbacker",
"patroller"
],
"Mazbel": [
"global-rollbacker"
],
"Mbch331": [
"vrt-permissions"
],
"Mbrickn": [
"transwiki",
"patroller"
],
"MdsShakil": [
"steward",
"vrt-permissions"
],
"Me Lendroz": [
"patroller"
],
"Meanmicio": [
"patroller"
],
"MediaKyle": [
"patroller"
],
"Mehman": [
"ombuds",
"vrt-permissions"
],
"Melos": [
"steward",
"vrt-permissions"
],
"MemicznyJanusz": [
"global-renamer"
],
"Mercy": [
"global-rollbacker"
],
"Mfield": [
"global-renamer"
],
"MichaelFrey": [
"patroller"
],
"Michaelbluett": [
"uploader"
],
"Mido": [
"vrt-permissions"
],
"MiiCii": [
"patroller"
],
"Mild Bill Hiccup": [
"patroller"
],
"Millbart": [
"vrt-permissions"
],
"Mimarx": [
"patroller"
],
"Minorax": [
"global-rollbacker",
"global-sysop",
"patroller"
],
"Mirinano": [
"global-rollbacker"
],
"Mithridates": [
"patroller"
],
"Mjchael": [
"patroller"
],
"Moby-Dick4000": [
"patroller"
],
"Money-lover-12345": [
"patroller"
],
"Moonriddengirl": [
"vrt-permissions"
],
"Morkoz": [
"global-rollbacker"
],
"MrAlanKoh": [
"patroller"
],
"MrJaroslavik": [
"global-rollbacker",
"ombuds"
],
"Msmithma": [
"patroller"
],
"MtPenguinMonster": [
"patroller"
],
"Mtarch11": [
"global-rollbacker",
"global-sysop",
"patroller"
],
"Musical Inquisit": [
"patroller"
],
"Mussklprozz": [
"vrt-permissions"
],
"Mvolz": [
"patroller"
],
"Mxn": [
"patroller"
],
"Mykola7": [
"steward"
],
"Mys 721tx": [
"global-renamer",
"vrt-permissions"
],
"NDG": [
"global-rollbacker",
"global-sysop",
"patroller"
],
"Nadzik": [
"global-rollbacker",
"global-renamer"
],
"NahidSultan": [
"vrt-permissions"
],
"Nangkhan Magar": [
"patroller"
],
"Natuur12": [
"vrt-permissions"
],
"Nbarth": [
"patroller"
],
"Nehaoua": [
"ombuds"
],
"Nemoralis": [
"vrt-permissions"
],
"Neojacob": [
"patroller"
],
"Neriah": [
"global-rollbacker",
"global-renamer"
],
"NguoiDungKhongDinhDanh": [
"global-rollbacker",
"global-sysop",
"patroller"
],
"NhacNy2412": [
"global-renamer"
],
"NicoScribe": [
"patroller"
],
"Nicole Sharp": [
"patroller"
],
"Nihonjoe": [
"global-renamer"
],
"Ninjastrikers": [
"vrt-permissions"
],
"Nobody60": [
"patroller"
],
"Nolispanmo": [
"vrt-permissions"
],
"Nonenmac": [
"patroller"
],
"Norton": [
"patroller"
],
"Nsaa": [
"vrt-permissions"
],
"Nthep": [
"vrt-permissions"
],
"NuclearWarfare": [
"global-rollbacker"
],
"OMSMike": [
"patroller"
],
"Omphalographer": [
"patroller"
],
"Ontzak": [
"global-renamer"
],
"Oshwah": [
"global-renamer"
],
"Ottawahitech": [
"patroller"
],
"PNW Raven": [
"patroller"
],
"Paloi Sciurala": [
"global-rollbacker"
],
"Panic2k4": [
"transwiki",
"patroller"
],
"Pathoschild": [
"patroller"
],
"PeterEasthope": [
"patroller"
],
"PhilKnight": [
"global-renamer"
],
"Phoebe": [
"patroller"
],
"PieWriter": [
"patroller"
],
"Platonides": [
"vrt-permissions"
],
"Pluke": [
"patroller"
],
"PlyrStar93": [
"global-rollbacker"
],
"Pminh141": [
"global-renamer"
],
"Poetcsw": [
"patroller"
],
"Polimerek": [
"vrt-permissions"
],
"Polluks": [
"patroller"
],
"Pookiyama": [
"patroller"
],
"Povigna": [
"patroller"
],
"Ppolar bear": [
"global-rollbacker",
"global-renamer"
],
"Praxidicae": [
"global-rollbacker",
"global-sysop"
],
"Primefac": [
"vrt-permissions"
],
"PullUpYourSocks": [
"patroller"
],
"PurpleBuffalo": [
"global-renamer"
],
"PurplePieman": [
"patroller"
],
"Purplebackpack89": [
"patroller"
],
"Quebecguy": [
"global-rollbacker"
],
"QueerEcofeminist": [
"global-rollbacker",
"global-renamer",
"patroller"
],
"Quinlan83": [
"global-rollbacker",
"patroller"
],
"Qədir": [
"global-rollbacker",
"global-renamer",
"vrt-permissions"
],
"R. Henrik Nilsson": [
"patroller"
],
"RAdimer-WMF": [
"global-rollbacker"
],
"Ra'ike": [
"vrt-permissions"
],
"Rachel": [
"patroller"
],
"Rachmat04": [
"global-renamer",
"vrt-permissions"
],
"RadiX": [
"patroller",
"steward",
"vrt-permissions"
],
"Rahulkepapa": [
"patroller"
],
"Randykitty": [
"global-rollbacker"
],
"Ray Trygstad": [
"patroller"
],
"Raymond": [
"vrt-permissions"
],
"Rchaswms01": [
"patroller"
],
"Rcragun": [
"patroller",
"uploader"
],
"Refcanimm": [
"patroller"
],
"Regasterios": [
"vrt-permissions"
],
"Reinhard Kraasch": [
"vrt-permissions"
],
"Renamed user 242094acfb1a5b2f08e9e78f2e021a40": [
"patroller"
],
"Renamed user 5f91ca71739b07cfce8397eed758fe13": [
"uploader"
],
"Renamed user f26394dcb19bd7bdad78f0d752896653": [
"patroller"
],
"Renvoy": [
"global-rollbacker",
"global-sysop"
],
"Reseletti": [
"patroller"
],
"Revi C.": [
"global-rollbacker",
"global-renamer",
"ombuds",
"patroller",
"vrt-permissions"
],
"Rfc1394": [
"patroller"
],
"Rgdboer": [
"patroller"
],
"Rich Farmbrough": [
"patroller"
],
"Rickstambaugh": [
"patroller"
],
"Riggwelter": [
"vrt-permissions"
],
"Robertsky": [
"global-renamer",
"vrt-permissions"
],
"Rodrigo": [
"patroller"
],
"Rodrigo.Argenton": [
"vrt-permissions"
],
"RogueScholar": [
"patroller"
],
"RomaineBot": [
"vrt-permissions"
],
"RonaldB": [
"vrt-permissions"
],
"RoySmith": [
"ombuds"
],
"Rozzychan": [
"patroller"
],
"Rplano": [
"patroller"
],
"Rschen7754": [
"global-rollbacker"
],
"Rsjaffe": [
"global-renamer"
],
"Runfellow": [
"patroller"
],
"Ruthven": [
"vrt-permissions"
],
"Ruud Koot": [
"transwiki"
],
"Rzuwig": [
"global-rollbacker"
],
"S.Marchenko": [
"global-renamer"
],
"S8321414": [
"global-renamer"
],
"SCP-2000": [
"global-rollbacker",
"global-renamer",
"vrt-permissions"
],
"SHB": [
"sysop",
"steward"
],
"Sakretsu": [
"steward"
],
"Sakura emad": [
"global-rollbacker"
],
"Salil Kumar Mukherjee": [
"patroller"
],
"Samat": [
"vrt-permissions"
],
"Sammy2012": [
"patroller"
],
"Samuel.dellit": [
"patroller"
],
"Samuele2002": [
"global-rollbacker",
"patroller"
],
"SanBonne": [
"global-rollbacker",
"global-renamer",
"vrt-permissions"
],
"Sannita": [
"vrt-permissions"
],
"Sargoth": [
"vrt-permissions"
],
"Saroj": [
"global-rollbacker"
],
"Sascha Lill 95": [
"patroller"
],
"Satdeep Gill": [
"vrt-permissions"
],
"Savh": [
"global-rollbacker"
],
"Sbb1413": [
"patroller"
],
"Schniggendiller": [
"steward"
],
"SchreiberBike": [
"patroller"
],
"Sebastian Wallroth": [
"vrt-permissions"
],
"Seewolf": [
"global-rollbacker",
"vrt-permissions"
],
"Sekidoki": [
"vrt-permissions"
],
"Sennecaster": [
"vrt-permissions"
],
"SevenSpheres": [
"patroller"
],
"ShakespeareFan00": [
"patroller"
],
"ShifaYT": [
"global-rollbacker"
],
"Shira the Mogul": [
"patroller"
],
"Sigma 7": [
"patroller"
],
"Simon Peter Hughes": [
"patroller"
],
"Sinus46": [
"patroller"
],
"Sir Beluga": [
"patroller"
],
"Sir Lestaty de Lioncourt": [
"vrt-permissions"
],
"Sj": [
"patroller"
],
"Sjö": [
"global-rollbacker"
],
"SlartibartfastT": [
"vrt-permissions"
],
"Slava Ukraini Heroyam Slava 123": [
"uploader"
],
"SnappyDragonPennyroyal": [
"patroller"
],
"SocialKnowledge": [
"patroller"
],
"Sotiale": [
"steward"
],
"SouthParkFan65": [
"patroller"
],
"Squasher": [
"global-renamer"
],
"Stang": [
"global-rollbacker",
"patroller",
"vrt-permissions"
],
"Steinsplitter": [
"global-renamer",
"vrt-permissions"
],
"Stepro": [
"vrt-permissions"
],
"Stilfehler": [
"patroller"
],
"Strainu": [
"vrt-permissions"
],
"Stryn": [
"global-rollbacker",
"patroller"
],
"Stïnger": [
"global-rollbacker"
],
"Sunny Cryolite": [
"global-rollbacker"
],
"Superbass": [
"vrt-permissions"
],
"Superpes15": [
"global-rollbacker",
"global-renamer",
"global-sysop",
"vrt-permissions"
],
"Supertoff": [
"vrt-permissions"
],
"Superzerocool": [
"vrt-permissions"
],
"SupremeUmanu": [
"patroller"
],
"Svartava": [
"global-rollbacker",
"global-renamer",
"global-sysop",
"patroller"
],
"Sylvesterchukwu04": [
"patroller"
],
"Synoman Barris": [
"global-rollbacker",
"transwiki"
],
"Syum90": [
"global-rollbacker"
],
"Syunsyunminmin": [
"global-rollbacker",
"global-renamer",
"global-sysop",
"patroller"
],
"TTWIDEE": [
"patroller"
],
"Tahmid": [
"patroller"
],
"Taketa": [
"global-renamer"
],
"Takipoint123": [
"vrt-permissions"
],
"Tamzin": [
"global-renamer"
],
"Tanbiruzzaman": [
"global-rollbacker",
"global-renamer",
"global-sysop",
"patroller",
"vrt-permissions"
],
"Taoheedah": [
"patroller"
],
"TaronjaSatsuma": [
"vrt-permissions"
],
"Tchoř": [
"global-renamer"
],
"Tdvorak": [
"patroller"
],
"TechVindicator": [
"patroller"
],
"Tegel": [
"patroller",
"steward"
],
"Teles": [
"ombuds",
"steward",
"vrt-permissions"
],
"Tem5psu": [
"patroller"
],
"TenWhile6": [
"global-rollbacker",
"global-renamer",
"global-sysop",
"patroller"
],
"Tenshi Hinanawi": [
"global-rollbacker"
],
"Ternarius": [
"global-renamer"
],
"Ternera": [
"global-rollbacker",
"global-renamer",
"global-sysop",
"patroller"
],
"Tesleemah": [
"patroller"
],
"The Squirrel Conspiracy": [
"vrt-permissions"
],
"The labs": [
"patroller"
],
"TheGoodEndedHappily": [
"vrt-permissions"
],
"TheSandDoctor": [
"global-renamer",
"vrt-permissions"
],
"Thierry Dugnolle": [
"patroller"
],
"Thomas.haslwanter": [
"patroller"
],
"Tibetologist": [
"patroller"
],
"Tigerzeng": [
"global-rollbacker"
],
"TimBorgNetzWerk": [
"patroller"
],
"TommyG": [
"vrt-permissions"
],
"Tp42": [
"patroller"
],
"Tropicalkitty": [
"global-rollbacker",
"patroller"
],
"Ts12rAc": [
"global-rollbacker"
],
"TunnelESON": [
"sysop"
],
"Turbojet": [
"vrt-permissions"
],
"Turkmen": [
"patroller"
],
"Tyoyafud": [
"patroller"
],
"USSR-Slav": [
"global-rollbacker"
],
"Uncitoyen": [
"global-rollbacker",
"global-renamer"
],
"User01938": [
"patroller"
],
"Utcursch": [
"vrt-permissions"
],
"Uzume": [
"patroller"
],
"V0lkanic": [
"global-renamer"
],
"VIGNERON": [
"steward"
],
"Varnent": [
"vrt-permissions"
],
"VectorVoyager": [
"patroller"
],
"Venzz": [
"vrt-permissions"
],
"Veritas Sapientiae": [
"global-rollbacker",
"global-renamer",
"vrt-permissions"
],
"Vermont": [
"patroller",
"steward",
"vrt-permissions"
],
"Vincent Vega": [
"global-renamer"
],
"Vladimir Solovjev": [
"global-renamer",
"vrt-permissions"
],
"Vogone": [
"global-rollbacker"
],
"VulcanWikiEdit": [
"patroller"
],
"Waihorace": [
"global-rollbacker"
],
"Waldyrious": [
"patroller"
],
"Wargo": [
"patroller"
],
"Wbjimmyd": [
"patroller"
],
"WeelkyWikiReader": [
"patroller"
],
"WereSpielChequers": [
"patroller"
],
"WhatamIdoing": [
"patroller"
],
"WhitePhosphorus": [
"global-rollbacker",
"global-sysop"
],
"Whoop whoop pull up": [
"patroller"
],
"Whym": [
"patroller",
"vrt-permissions"
],
"WikiBayer": [
"global-rollbacker",
"global-sysop",
"patroller"
],
"WikiFer": [
"vrt-permissions"
],
"Wikimi-dhiann": [
"patroller"
],
"WillNess": [
"patroller"
],
"Wim b": [
"global-rollbacker"
],
"Wkee4ager": [
"patroller"
],
"Wojciech Pędzich": [
"vrt-permissions"
],
"Wooze": [
"global-rollbacker"
],
"Wutsje": [
"global-rollbacker",
"patroller"
],
"Ww2censor": [
"vrt-permissions"
],
"Wüstenspringmaus": [
"global-rollbacker",
"global-renamer"
],
"XXBlackburnXx": [
"patroller",
"steward"
],
"Xandradi": [
"patroller"
],
"Xania": [
"sysop",
"checkuser"
],
"Xaosflux": [
"patroller",
"steward"
],
"XenonX3": [
"vrt-permissions"
],
"Xeverything11": [
"patroller",
"uploader"
],
"Xhungab": [
"patroller"
],
"Xqt": [
"global-rollbacker"
],
"Y-S.Ko": [
"patroller"
],
"Yahya": [
"steward",
"vrt-permissions"
],
"Yamla": [
"global-renamer"
],
"Yann": [
"patroller"
],
"Yerpo": [
"global-renamer",
"vrt-permissions"
],
"Ymblanter": [
"global-rollbacker"
],
"Yvelik": [
"uploader"
],
"ZI Jony": [
"vrt-permissions"
],
"Zabe": [
"global-rollbacker"
],
"Zafer": [
"ombuds"
],
"Zetud": [
"global-rollbacker",
"vrt-permissions"
],
"Ziv": [
"patroller"
],
"Zoeannl": [
"patroller"
],
"Zsohl": [
"patroller"
],
"~riley": [
"global-rollbacker"
],
"Érico": [
"global-renamer"
],
"İmmortalance": [
"global-renamer"
],
"Виктор Пинчук": [
"patroller"
],
"Всевидящий": [
"global-rollbacker"
],
"Д.Ильин": [
"patroller"
],
"Л.П. Джепко": [
"patroller"
],
"יהודה שמחה ולדמן": [
"patroller"
],
"מקף": [
"global-rollbacker",
"global-renamer"
],
"د. فارس الجويلي": [
"global-renamer"
],
"روتانا": [
"global-renamer"
],
"علاء": [
"steward",
"vrt-permissions"
],
"فيصل": [
"global-renamer",
"vrt-permissions"
],
"ネイ": [
"global-renamer"
],
"一隻北極熊": [
"patroller"
],
"人间百态": [
"global-rollbacker"
],
"范": [
"vrt-permissions"
],
"魔琴": [
"global-rollbacker"
],
"ꠢꠣꠍꠘ ꠞꠣꠎꠣ": [
"patroller"
],
"기나ㅏㄴ": [
"global-rollbacker",
"global-renamer"
]
}
kgduz67tatvlqz62w9rj2rbanfp48gu
User:JJPMaster/luna/rfd.js
2
471464
4676668
4676451
2026-10-18T02:53:38Z
JJPMaster
3095725
replace "isReviewer" with "isPatroller" (via JWB)
4676668
javascript
text/javascript
// <nowiki>
importScript("User:JJPMaster/CurateThisPage/review.js");
var rfdPage = "Wikibooks:Requests for deletion";
var isACategoryOrAFile = [6, 14].includes(mw.config.get("wgNamespaceNumber"));
var parsedTitle = mw.config.get("wgPageName").replace(/_/g, " ");
parsedTitle = isACategoryOrAFile ? `:${parsedTitle}` : parsedTitle;
async function getAuthor() {
var par = {
action: 'query',
prop: 'revisions',
titles: parsedTitle,
rvprop: 'user',
rvdir: 'newer',
rvlimit: 1,
format: 'json'
},
api = new mw.Api();
const data = await api.get( par );
return Object.values(data.query.pages)[0].revisions[0].user;
}
(() => {
if (mw.config.get("wgArticleId") > 0) {
var porty = window.addLunaLink({
id: 'luna-rfd',
text: `RfD`,
href: '#',
tooltip: 'File a deletion request for this page',
debug: true,
onClick: () => {
$("#RFDdialog").dialog({ title: "Request deletion", width: "auto" });
}
});
}
})();
(async function () {
await Luna.preferencesReady;
if (Luna.getPref("debug", false)) {
rfdPage = `User:${mw.config.get("wgUserName")}/luna/RFD`;
}
})();
$(() => {
if (mw.config.get("wgArticleId") !== 0) {
$("#bodyContent").append(`
<div id="RFDdialog">
Please enter the reason for deletion:
<textarea name="RFDreason" id="RFDreason" placeholder="Reason for deletion"></textarea>
<input type="checkbox" id="notifyAuthor2" name="notifyAuthor2" checked /><label for="notifyAuthor2">Notify page author</label><br />
<button type="button" id="reqDel">Request deletion</button></div>
`);
$("#RFDdialog").hide();
$("#reqDel").click(async function() {
var myText = document.getElementById("RFDreason");
var reason = myText.value;
if (!reason) alert("You must provide a reason.");
else {
if (window.isPatroller) {
await doTheReview();
}
var params = {
action: 'edit',
prependtext: `<noinclude>{{Rfd|example=${Luna.isDebug}}}</noinclude>\n`,
title: parsedTitle,
summary: `Making [[${rfdPage}#${parsedTitle}|deletion request]]`,
tags: "Luna",
format: 'json'
},
api = new mw.Api();
try {
var data = await api.postWithToken( 'csrf', params )
console.log( data );
if ($("#notifyAuthor2").prop("checked")) {
params = {
action: 'edit',
appendtext: `\n{{subst:Rfd warning|${parsedTitle}|~~~~}}`,
title: `User_talk:${await getAuthor()}`,
summary: "Notifying author about deletion request",
tags: "Luna",
format: 'json'
}
var data = await api.postWithToken( 'csrf', params )
console.log( data );
}
params = {
action: 'edit',
appendtext: `\n== [[${parsedTitle}]] ==\n${reason} ~~~~`,
title: rfdPage,
summary: `Adding [[${rfdPage}#${parsedTitle}|deletion request]] for [[${parsedTitle}]]`,
tags: "Luna",
format: 'json'
}
data = await api.postWithToken( 'csrf', params )
console.log( data );
mw.notify("Luna:\nThe page has been nominated for deletion. Reloading...");
setTimeout(() => window.location.reload(), 2000);
}
catch (error) {
console.error("Luna: Deletion nomination failed.", error);
mw.notify("Luna: Deletion nomination failed. See the console for details.");
}
}
});
}
});
// </nowiki>
tnfweemrrrdpgdragacnqbza1xba0wu
4676671
4676668
2026-10-18T03:10:21Z
JJPMaster
3095725
patrol
4676671
javascript
text/javascript
// <nowiki>
var rfdPage = "Wikibooks:Requests for deletion";
var isACategoryOrAFile = [6, 14].includes(mw.config.get("wgNamespaceNumber"));
var parsedTitle = mw.config.get("wgPageName").replace(/_/g, " ");
parsedTitle = isACategoryOrAFile ? `:${parsedTitle}` : parsedTitle;
async function getAuthor() {
var par = {
action: 'query',
prop: 'revisions',
titles: parsedTitle,
rvprop: 'user',
rvdir: 'newer',
rvlimit: 1,
format: 'json'
},
api = new mw.Api();
const data = await api.get( par );
return Object.values(data.query.pages)[0].revisions[0].user;
}
(() => {
if (mw.config.get("wgArticleId") > 0) {
var porty = window.addLunaLink({
id: 'luna-rfd',
text: `RfD`,
href: '#',
tooltip: 'File a deletion request for this page',
debug: true,
onClick: () => {
$("#RFDdialog").dialog({ title: "Request deletion", width: "auto" });
}
});
}
})();
(async function () {
await Luna.preferencesReady;
if (Luna.getPref("debug", false)) {
rfdPage = `User:${mw.config.get("wgUserName")}/luna/RFD`;
}
})();
$(() => {
if (mw.config.get("wgArticleId") !== 0) {
$("#bodyContent").append(`
<div id="RFDdialog">
Please enter the reason for deletion:
<textarea name="RFDreason" id="RFDreason" placeholder="Reason for deletion"></textarea>
<input type="checkbox" id="notifyAuthor2" name="notifyAuthor2" checked /><label for="notifyAuthor2">Notify page author</label><br />
<button type="button" id="reqDel">Request deletion</button></div>
`);
$("#RFDdialog").hide();
$("#reqDel").click(async function() {
var myText = document.getElementById("RFDreason");
var reason = myText.value;
if (!reason) alert("You must provide a reason.");
else {
if (window.isPatroller) {
await doThePatrol();
}
var params = {
action: 'edit',
prependtext: `<noinclude>{{Rfd|example=${Luna.isDebug}}}</noinclude>\n`,
title: parsedTitle,
summary: `Making [[${rfdPage}#${parsedTitle}|deletion request]]`,
tags: "Luna",
format: 'json'
},
api = new mw.Api();
try {
var data = await api.postWithToken( 'csrf', params )
console.log( data );
if ($("#notifyAuthor2").prop("checked")) {
params = {
action: 'edit',
appendtext: `\n{{subst:Rfd warning|${parsedTitle}|~~~~}}`,
title: `User_talk:${await getAuthor()}`,
summary: "Notifying author about deletion request",
tags: "Luna",
format: 'json'
}
var data = await api.postWithToken( 'csrf', params )
console.log( data );
}
params = {
action: 'edit',
appendtext: `\n== [[${parsedTitle}]] ==\n${reason} ~~~~`,
title: rfdPage,
summary: `Adding [[${rfdPage}#${parsedTitle}|deletion request]] for [[${parsedTitle}]]`,
tags: "Luna",
format: 'json'
}
data = await api.postWithToken( 'csrf', params )
console.log( data );
mw.notify("Luna:\nThe page has been nominated for deletion. Reloading...");
setTimeout(() => window.location.reload(), 2000);
}
catch (error) {
console.error("Luna: Deletion nomination failed.", error);
mw.notify("Luna: Deletion nomination failed. See the console for details.");
}
}
});
}
});
// </nowiki>
5u6b7ihc0ehskqi7ukjz1qi3oljctbd
4676681
4676671
2026-10-18T04:00:00Z
JJPMaster
3095725
disabling patrol features temporarily
4676681
javascript
text/javascript
// <nowiki>
var rfdPage = "Wikibooks:Requests for deletion";
var isACategoryOrAFile = [6, 14].includes(mw.config.get("wgNamespaceNumber"));
var parsedTitle = mw.config.get("wgPageName").replace(/_/g, " ");
parsedTitle = isACategoryOrAFile ? `:${parsedTitle}` : parsedTitle;
async function getAuthor() {
var par = {
action: 'query',
prop: 'revisions',
titles: parsedTitle,
rvprop: 'user',
rvdir: 'newer',
rvlimit: 1,
format: 'json'
},
api = new mw.Api();
const data = await api.get( par );
return Object.values(data.query.pages)[0].revisions[0].user;
}
(() => {
if (mw.config.get("wgArticleId") > 0) {
var porty = window.addLunaLink({
id: 'luna-rfd',
text: `RfD`,
href: '#',
tooltip: 'File a deletion request for this page',
debug: true,
onClick: () => {
$("#RFDdialog").dialog({ title: "Request deletion", width: "auto" });
}
});
}
})();
(async function () {
await Luna.preferencesReady;
if (Luna.getPref("debug", false)) {
rfdPage = `User:${mw.config.get("wgUserName")}/luna/RFD`;
}
})();
$(() => {
if (mw.config.get("wgArticleId") !== 0) {
$("#bodyContent").append(`
<div id="RFDdialog">
Please enter the reason for deletion:
<textarea name="RFDreason" id="RFDreason" placeholder="Reason for deletion"></textarea>
<input type="checkbox" id="notifyAuthor2" name="notifyAuthor2" checked /><label for="notifyAuthor2">Notify page author</label><br />
<button type="button" id="reqDel">Request deletion</button></div>
`);
$("#RFDdialog").hide();
$("#reqDel").click(async function() {
var myText = document.getElementById("RFDreason");
var reason = myText.value;
if (!reason) alert("You must provide a reason.");
else {
if (window.isPatroller) {
//await doThePatrol();
}
var params = {
action: 'edit',
prependtext: `<noinclude>{{Rfd|example=${Luna.isDebug}}}</noinclude>\n`,
title: parsedTitle,
summary: `Making [[${rfdPage}#${parsedTitle}|deletion request]]`,
tags: "Luna",
format: 'json'
},
api = new mw.Api();
try {
var data = await api.postWithToken( 'csrf', params )
console.log( data );
if ($("#notifyAuthor2").prop("checked")) {
params = {
action: 'edit',
appendtext: `\n{{subst:Rfd warning|${parsedTitle}|~~~~}}`,
title: `User_talk:${await getAuthor()}`,
summary: "Notifying author about deletion request",
tags: "Luna",
format: 'json'
}
var data = await api.postWithToken( 'csrf', params )
console.log( data );
}
params = {
action: 'edit',
appendtext: `\n== [[${parsedTitle}]] ==\n${reason} ~~~~`,
title: rfdPage,
summary: `Adding [[${rfdPage}#${parsedTitle}|deletion request]] for [[${parsedTitle}]]`,
tags: "Luna",
format: 'json'
}
data = await api.postWithToken( 'csrf', params )
console.log( data );
mw.notify("Luna:\nThe page has been nominated for deletion. Reloading...");
setTimeout(() => window.location.reload(), 2000);
}
catch (error) {
console.error("Luna: Deletion nomination failed.", error);
mw.notify("Luna: Deletion nomination failed. See the console for details.");
}
}
});
}
});
// </nowiki>
1l8barqanq2gxxti1qqz8067jos2ibg
User:JJPMaster/luna.js
2
471466
4676663
4662281
2026-10-18T02:51:32Z
JJPMaster
3095725
v0.8.4.1 → migrating from reviewer to patroller
4676663
javascript
text/javascript
const summaryAd = " (using [[:b:en:Wikibooks:WikiProject Little Star/Luna|Luna]])";
window.isPatroller = true;
var myRights = [];
window.LunaLinks = [];
window.LunaRendered = false;
window.addLunaLink = function(link) {
window.LunaLinks.push(link);
document.dispatchEvent(new CustomEvent("luna-link-added", {
detail: link
}));
console.log("Luna: link added", link.id, performance.now());
return window.LunaLinks;
};
window.addLunaLinks = function(arr) {
for (let i of arr) {
window.addLunaLink(i);
}
return window.LunaLinks;
};
console.log("Luna: Script started.");
mw.loader.load('//en.wikipedia.org/w/load.php?modules=ext.gadget.morebits');
async function loadScripts() {
const scripts = [
'User:JJPMaster/luna/CurateThisPage.js', // Backlink: [[User:JJPMaster/luna/CurateThisPage.js]]
'User:JJPMaster/luna/rfd.js', // Backlink: [[User:JJPMaster/luna/rfd.js]]
'User:JJPMaster/luna/warn.js', // Backlink: [[User:JJPMaster/luna/warn.js]]
'User:JJPMaster/luna/talkback.js', // Backlink: [[User:JJPMaster/luna/talkback.js]]
'User:JJPMaster/luna/welcome.js', // Backlink: [[User:JJPMaster/luna/welcome.js]]
'User:JJPMaster/luna/arv.js', // Backlink: [[User:JJPMaster/luna/arv.js]]
'User:JJPMaster/luna/unlink.js', // Backlink: [[User:JJPMaster/luna/unlink.js]]
'User:JJPMaster/luna/fileunlink.js', // Backlink: [[User:JJPMaster/luna/fileunlink.js]]
'User:JJPMaster/luna/csd.js', // Backlink: [[User:JJPMaster/luna/csd.js]]
'User:JJPMaster/luna/diff.js', // Backlink: [[User:JJPMaster/luna/diff.js]]
'User:JJPMaster/luna/raddewikify.js', // Backlink: [[User:JJPMaster/luna/raddewikify.js]]
'User:JJPMaster/luna/rpp.js', // Backlink: [[User:JJPMaster/luna/rpp.js]]
'User:JJPMaster/luna/CurateThisFile.js', // Backlink: [[User:JJPMaster/luna/CurateThisFile.js]]
'User:JJPMaster/luna/di.js', // Backlink: [[User:JJPMaster/luna/di.js]]
'User:JJPMaster/luna/templateunlink.js', // Backlink: [[User:JJPMaster/luna/templateunlink.js]]
'User:JJPMaster/luna/rollback.js' // Backlink: [[User:JJPMaster/luna/rollback.js]]
];
if (myRights.includes("delete")) {
await $.getScript('/w/index.php?title=User:JJPMaster/luna/d-batch/core.js&action=raw&ctype=text/javascript'), // Backlink: [[User:JJPMaster/luna/d-batch/core.js]]")
await $.getScript(`/w/index.php?title=User:JJPMaster/htmlparserfromhell.js&action=raw&ctype=text/javascript`); // Backlink: [[User:JJPMaster/htmlparserfromhell.js]]
scripts.push(
'User:JJPMaster/luna/d-batch/links.js', // Backlink: [[User:JJPMaster/luna/d-batch/links.js]]
'User:JJPMaster/luna/d-batch/cat.js', // Backlink: [[User:JJPMaster/luna/d-batch/cat.js]]
'User:JJPMaster/luna/d-batch/prefix.js', // Backlink: [[User:JJPMaster/luna/d-batch/prefix.js]]
'User:JJPMaster/luna/und-batch.js' // Backlink: [[User:JJPMaster/luna/und-batch.js]]
);
}
console.log("Luna: Loading scripts...");
await Promise.all(scripts.map(script => {
const start = performance.now();
return $.getScript(`/w/index.php?title=${script}&action=raw&ctype=text/javascript`)
.then(() => console.log(`Luna: Loaded ${script} in ${performance.now() - start}ms.`))
.catch(error => console.error(`Luna: Failed to load ${script}:`, error))
}
));
console.log("Luna: All scripts loaded successfully.");
}
async function waitForPreferences(maxRetries = 10, delay = 200) {
for (let i = 0; i < maxRetries; i++) {
if (typeof Luna !== "undefined" && Luna.myPreferences && Luna.myPreferences.CSD) {
console.log("Luna: Preferences loaded successfully.");
return true;
}
console.warn("Luna: Preferences not loaded yet, retrying...");
await new Promise(resolve => setTimeout(resolve, delay));
}
console.error("Luna: Preferences failed to load after multiple attempts.");
return false;
}
function renderLunaPortlet() {
const order = [
'luna-arv',
'luna-warn',
'luna-welcome',
'luna-welcome-anon',
'luna-tb',
'luna-rev',
'luna-csd',
'luna-rfd',
'luna-di',
'luna-qrb',
'luna-rpp',
'luna-dbatch-links',
'luna-dbatch-prefix',
'luna-dbatch-cat',
'luna-undbatch',
'luna-ctf',
'luna-ctp',
'luna-last',
'luna-since',
'luna-sincemine',
'luna-current',
'luna-dewiki',
'luna-unlink',
'luna-fileunlink',
'luna-tempunlink',
'luna-debug-link'
];
console.log("Luna: rendering at", performance.now());
order.forEach(id => {
const i = window.LunaLinks.find(l => l.id == id);
if (!i) return;
const text = i.debug && Luna.myPreferences?.debug ? `${i.text} [DEBUG]` : i.text;
const l = mw.util.addPortletLink('luna-actions', i.href, text, i.id, i.tooltip)
if (i.onClick) {
$(l).on('click', i.onClick);
}
});
mw.util.addPortletLink(
'luna-actions',
'/wiki/Wikibooks:WikiProject_Little_Star/Luna/Preferences',
'Pref',
'luna-pref-link',
'Edit your Luna preferences'
);
document.dispatchEvent(new Event("luna-rendered"));
}
function waitForLunaLinksToSettle(callback, delay = 150) {
let timeout;
function resetTimer() {
clearTimeout(timeout);
timeout = setTimeout(() => {
document.removeEventListener("luna-link-added", resetTimer);
callback();
}, delay);
}
document.addEventListener("luna-link-added", resetTimer);
resetTimer();
}
(async function () {
try {
console.log("Luna: Fetching user rights...");
myRights = await mw.user.getRights();
console.log("Luna: User rights fetched:", myRights);
} catch (error) {
console.error("Luna: Error fetching user rights:", error);
alert("Luna: An error occurred while fetching your user rights. Please try again.");
return;
}
if (!myRights || myRights.length === 0) {
console.error("Luna: User rights array is empty or undefined.");
alert("Luna: An error occurred while fetching your user rights. Please try again.");
return;
}
if (myRights.includes("autoconfirmed")) {
if (!myRights.includes("rollback")) {
console.log("Luna: Not a patroller or administrator.");
window.isPatroller = false;
}
mw.loader.load('jquery.ui');
console.log("Luna: Loading preferences script...");
try {
await $.getScript(`/w/index.php?title=User:JJPMaster/luna/pref/unstable.js&action=raw&ctype=text/javascript&cb=${Date.now()}`); // Backlink: [[User:JJPMaster/luna/pref/unstable.js]]
console.log("Luna: Preferences loaded successfully.");
} catch (error) {
console.error("Luna: Failed to load preferences script:", error);
return;
}
mw.loader.load('/w/index.php?title=User:JJPMaster/luna.css&action=raw&ctype=text/css', 'text/css');
console.log("Luna: Adding UI elements...");
mw.util.addPortlet('luna-actions', 'Luna', '#p-cactions');
await loadScripts();
// window.LunaScriptsLoaded = true;
waitForLunaLinksToSettle(() => renderLunaPortlet());
} else {
console.error("Luna: User is not autoconfirmed.");
mw.notify("Error: You must be autoconfirmed to use Luna.");
}
})();
cim767mtwigla03tlknlnve12chwd0p
User:JJPMaster/luna/unlink.js
2
471508
4676667
4662626
2026-10-18T02:53:23Z
JJPMaster
3095725
replace "isReviewer" with "isPatroller" (via JWB)
4676667
javascript
text/javascript
// <nowiki>
if (mw.config.get("wgNamespaceNumber") >= 0 && window.isPatroller) {
var unlinkLink = window.addLunaLink({
id: 'luna-unlink',
text: 'Unlink',
href: '#',
tooltip: 'Remove all links to this page',
onClick: unlink
});
}
async function getBacklinks() {
var params = {
action: 'query',
format: 'json',
list: 'backlinks',
bllimit: 'max',
bltitle: mw.config.get("wgPageName")
},
api = new mw.Api();
const data = await api.get(params);
return data.query.backlinks;
}
async function getUnlinkedContent(title, unlinked) {
var params = {
action: 'parse',
page: title,
prop: 'wikitext',
format: 'json'
},
api = new mw.Api();
const data = await api.get(params);
var text = data.parse.wikitext['*'];
var myPage = new Morebits.wikitext.Page(text);
var newText = myPage.removeLink(unlinked).getText();
return newText;
}
async function unlink() {
if (window.isPatroller) {
var doIt = confirm("You are about to remove all of the links to this page. If you mess up, this is likely to be very difficult to reverse. Are you *ABSOLUTELY SURE* you want to do this?");
if (!doIt) return;
var backlinks = await getBacklinks();
var params, api;
for (var b of backlinks) {
var content = await getUnlinkedContent(b.title, mw.config.get("wgPageName"));
params = {
action: 'edit',
format: 'json',
text: content,
title: b.title,
summary: `Removing link(s) to [[${mw.config.get("wgPageName").replace(/_/g, ' ')}]]`,
tags: "Luna"
};
api = new mw.Api();
try {
var data = await api.postWithToken( 'csrf', params );
console.log(data)
}
catch (error) {
console.error("Luna: Unlink failed.", error)
}
}
var remaining = await getBacklinks();
if (remaining.length > 0)
alert("It looks like not all of the backlinks were removed. This is most likely because you hit the rate limit. Please try again later.");
else alert("Done!");
}
else {
alert("Luna: You must be a reviewer or administrator to use this tool.");
return;
}
}
// </nowiki>
coauyhmkkrz855b5zwep5udhqnyyl97
User:JJPMaster/luna/fileunlink.js
2
471516
4676666
4662627
2026-10-18T02:53:21Z
JJPMaster
3095725
replace "isReviewer" with "isPatroller" (via JWB)
4676666
javascript
text/javascript
// <nowiki>
if (mw.config.get("wgNamespaceNumber") == 6 && window.isPatroller) {
var fileunlinkLink = window.addLunaLink({
id: 'luna-fileunlink',
text: 'Unlink (file uses)',
href: '#',
tooltip: 'Remove all uses of this file',
onClick: fileUnlink
});
}
async function getImageUses() {
var params = {
action: 'query',
format: 'json',
list: 'imageusage',
iulimit: 'max',
iutitle: mw.config.get("wgPageName")
},
api = new mw.Api();
const data = await api.get(params);
return data.query.imageusage;
}
async function getFileUnlinkedContent(title, unlinked) {
var params = {
action: 'parse',
page: title,
prop: 'wikitext',
format: 'json'
},
api = new mw.Api();
const data = await api.get(params);
var text = data.parse.wikitext['*'];
var myPage = new Morebits.wikitext.Page(text);
var newText = myPage.commentOutImage(unlinked.substr(5), "Commented out").getText();
return newText;
}
async function fileUnlink() {
if (window.isPatroller) {
var doIt = confirm("You are about to remove all of the links to this page. If you mess up, this is likely to be very difficult to reverse. Are you *ABSOLUTELY SURE* you want to do this?");
if (!doIt) return;
var uses = await getImageUses();
var params, api;
for (var u of uses) {
var content = await getFileUnlinkedContent(u.title, mw.config.get("wgPageName"));
params = {
action: 'edit',
format: 'json',
text: content,
title: u.title,
summary: `Removing use(s) of [[${mw.config.get("wgPageName").replace(/_/g, ' ')}]]`,
tags: "Luna"
};
api = new mw.Api();
try {
var data = await api.postWithToken( 'csrf', params );
console.log(data)
}
catch (error) {
console.error("Luna: Unlink failed.", error)
}
}
var remaining = await getImageUses();
if (remaining.length > 0)
alert("It looks like not all of the image uses were removed. This is most likely because you hit the rate limit. Please try again later.");
else alert("Done!");
}
else {
alert("Luna: You must be a reviewer or administrator to use this tool.");
return;
}
}
// </nowiki>
1tlb88iwpt9w78l016egxkhdwj8ph18
Wikibooks:Outdated books
4
471645
4676583
4463234
2026-10-18T02:44:52Z
JJPMaster
3095725
noinclude
4676583
wikitext
text/x-wiki
<noinclude>{{Draft}}</noinclude>
Sometimes, there will be a book that has a lot of information that was very useful at the time, but has become out of date over time. There are generally two procedures that can be followed here.
== For books that aren't up to date, but can be reasonably updated ==
This category applies to books that, for instance, have not been updated with new information in a few years, but where the subject still exists and new information can be found about it. In this scenario, you should add the {{tlx|Outdated}} tag to the top of the book, and post on its discussion page explaining what should be updated. Or, you can always just [[Wikibooks:Be bold|be bold]] and update it yourself!
== For books that cannot be reasonably updated ==
This category includes books that are so outdated that their subject either no longer exists, or has changed so much since the book was written that it is virtually unrecognizable, and it would be nearly impossible to update it satisfactorily. These books should generally not be deleted, as they do provide valuable information, but should not be easily accessible to readers looking for recent information. Here, the following instructions should be followed.
=== If the case is unambiguous ===
# Add {{tlx|Archived}} to the top of the book. Doing this will also remove it from search engine indexes, unless you override this by using {{tlx|Archived|2=noindex=false}}.
# Move the book to a subpage of [[Wikibooks:Outdated books/Archive]].
# Replace the content of the redirect left behind after the move with {{tlx|Soft redirect|2=Wikibooks:Outdated books/Archive/<book title>}}.
# (''optional'') Inform the author(s) of the book of your decision.
=== If the case is ambiguous ===
Follow these steps if there is any reasonable doubt about if the book can be updated.
# Follow the instructions at {{Section link|Wikibooks:Requests for deletion#Deletion}} to file a request. Make sure to note that the request is for archiving, not deletion.
# The proposal for archiving will be discussed.
# If consensus has been reached to archive the book, any uninvolved user may close the discussion and follow the instructions in {{Section link|#If the case is unambiguous}}. Otherwise, the book will remain as is.
k9m1gu3pv7lyw9o999e5z3ulwt1vjoy
User:JJPMaster/luna/unstable.js
2
471665
4676664
4662270
2026-10-18T02:51:50Z
JJPMaster
3095725
copy from stable
4676664
javascript
text/javascript
const summaryAd = " (using [[:b:en:Wikibooks:WikiProject Little Star/Luna|Luna]])";
window.isPatroller = true;
var myRights = [];
window.LunaLinks = [];
window.LunaRendered = false;
window.addLunaLink = function(link) {
window.LunaLinks.push(link);
document.dispatchEvent(new CustomEvent("luna-link-added", {
detail: link
}));
console.log("Luna: link added", link.id, performance.now());
return window.LunaLinks;
};
window.addLunaLinks = function(arr) {
for (let i of arr) {
window.addLunaLink(i);
}
return window.LunaLinks;
};
console.log("Luna: Script started.");
mw.loader.load('//en.wikipedia.org/w/load.php?modules=ext.gadget.morebits');
async function loadScripts() {
const scripts = [
'User:JJPMaster/luna/CurateThisPage.js', // Backlink: [[User:JJPMaster/luna/CurateThisPage.js]]
'User:JJPMaster/luna/rfd.js', // Backlink: [[User:JJPMaster/luna/rfd.js]]
'User:JJPMaster/luna/warn.js', // Backlink: [[User:JJPMaster/luna/warn.js]]
'User:JJPMaster/luna/talkback.js', // Backlink: [[User:JJPMaster/luna/talkback.js]]
'User:JJPMaster/luna/welcome.js', // Backlink: [[User:JJPMaster/luna/welcome.js]]
'User:JJPMaster/luna/arv.js', // Backlink: [[User:JJPMaster/luna/arv.js]]
'User:JJPMaster/luna/unlink.js', // Backlink: [[User:JJPMaster/luna/unlink.js]]
'User:JJPMaster/luna/fileunlink.js', // Backlink: [[User:JJPMaster/luna/fileunlink.js]]
'User:JJPMaster/luna/csd.js', // Backlink: [[User:JJPMaster/luna/csd.js]]
'User:JJPMaster/luna/diff.js', // Backlink: [[User:JJPMaster/luna/diff.js]]
'User:JJPMaster/luna/raddewikify.js', // Backlink: [[User:JJPMaster/luna/raddewikify.js]]
'User:JJPMaster/luna/rpp.js', // Backlink: [[User:JJPMaster/luna/rpp.js]]
'User:JJPMaster/luna/CurateThisFile.js', // Backlink: [[User:JJPMaster/luna/CurateThisFile.js]]
'User:JJPMaster/luna/di.js', // Backlink: [[User:JJPMaster/luna/di.js]]
'User:JJPMaster/luna/templateunlink.js', // Backlink: [[User:JJPMaster/luna/templateunlink.js]]
'User:JJPMaster/luna/rollback.js' // Backlink: [[User:JJPMaster/luna/rollback.js]]
];
if (myRights.includes("delete")) {
await $.getScript('/w/index.php?title=User:JJPMaster/luna/d-batch/core.js&action=raw&ctype=text/javascript'), // Backlink: [[User:JJPMaster/luna/d-batch/core.js]]")
await $.getScript(`/w/index.php?title=User:JJPMaster/htmlparserfromhell.js&action=raw&ctype=text/javascript`); // Backlink: [[User:JJPMaster/htmlparserfromhell.js]]
scripts.push(
'User:JJPMaster/luna/d-batch/links.js', // Backlink: [[User:JJPMaster/luna/d-batch/links.js]]
'User:JJPMaster/luna/d-batch/cat.js', // Backlink: [[User:JJPMaster/luna/d-batch/cat.js]]
'User:JJPMaster/luna/d-batch/prefix.js', // Backlink: [[User:JJPMaster/luna/d-batch/prefix.js]]
'User:JJPMaster/luna/und-batch.js' // Backlink: [[User:JJPMaster/luna/und-batch.js]]
);
}
console.log("Luna: Loading scripts...");
await Promise.all(scripts.map(script => {
const start = performance.now();
return $.getScript(`/w/index.php?title=${script}&action=raw&ctype=text/javascript`)
.then(() => console.log(`Luna: Loaded ${script} in ${performance.now() - start}ms.`))
.catch(error => console.error(`Luna: Failed to load ${script}:`, error))
}
));
console.log("Luna: All scripts loaded successfully.");
}
async function waitForPreferences(maxRetries = 10, delay = 200) {
for (let i = 0; i < maxRetries; i++) {
if (typeof Luna !== "undefined" && Luna.myPreferences && Luna.myPreferences.CSD) {
console.log("Luna: Preferences loaded successfully.");
return true;
}
console.warn("Luna: Preferences not loaded yet, retrying...");
await new Promise(resolve => setTimeout(resolve, delay));
}
console.error("Luna: Preferences failed to load after multiple attempts.");
return false;
}
function renderLunaPortlet() {
const order = [
'luna-arv',
'luna-warn',
'luna-welcome',
'luna-welcome-anon',
'luna-tb',
'luna-rev',
'luna-csd',
'luna-rfd',
'luna-di',
'luna-qrb',
'luna-rpp',
'luna-dbatch-links',
'luna-dbatch-prefix',
'luna-dbatch-cat',
'luna-undbatch',
'luna-ctf',
'luna-ctp',
'luna-last',
'luna-since',
'luna-sincemine',
'luna-current',
'luna-dewiki',
'luna-unlink',
'luna-fileunlink',
'luna-tempunlink',
'luna-debug-link'
];
console.log("Luna: rendering at", performance.now());
order.forEach(id => {
const i = window.LunaLinks.find(l => l.id == id);
if (!i) return;
const text = i.debug && Luna.myPreferences?.debug ? `${i.text} [DEBUG]` : i.text;
const l = mw.util.addPortletLink('luna-actions', i.href, text, i.id, i.tooltip)
if (i.onClick) {
$(l).on('click', i.onClick);
}
});
mw.util.addPortletLink(
'luna-actions',
'/wiki/Wikibooks:WikiProject_Little_Star/Luna/Preferences',
'Pref',
'luna-pref-link',
'Edit your Luna preferences'
);
document.dispatchEvent(new Event("luna-rendered"));
}
function waitForLunaLinksToSettle(callback, delay = 150) {
let timeout;
function resetTimer() {
clearTimeout(timeout);
timeout = setTimeout(() => {
document.removeEventListener("luna-link-added", resetTimer);
callback();
}, delay);
}
document.addEventListener("luna-link-added", resetTimer);
resetTimer();
}
(async function () {
try {
console.log("Luna: Fetching user rights...");
myRights = await mw.user.getRights();
console.log("Luna: User rights fetched:", myRights);
} catch (error) {
console.error("Luna: Error fetching user rights:", error);
alert("Luna: An error occurred while fetching your user rights. Please try again.");
return;
}
if (!myRights || myRights.length === 0) {
console.error("Luna: User rights array is empty or undefined.");
alert("Luna: An error occurred while fetching your user rights. Please try again.");
return;
}
if (myRights.includes("autoconfirmed")) {
if (!myRights.includes("rollback")) {
console.log("Luna: Not a patroller or administrator.");
window.isPatroller = false;
}
mw.loader.load('jquery.ui');
console.log("Luna: Loading preferences script...");
try {
await $.getScript(`/w/index.php?title=User:JJPMaster/luna/pref/unstable.js&action=raw&ctype=text/javascript&cb=${Date.now()}`); // Backlink: [[User:JJPMaster/luna/pref/unstable.js]]
console.log("Luna: Preferences loaded successfully.");
} catch (error) {
console.error("Luna: Failed to load preferences script:", error);
return;
}
mw.loader.load('/w/index.php?title=User:JJPMaster/luna.css&action=raw&ctype=text/css', 'text/css');
console.log("Luna: Adding UI elements...");
mw.util.addPortlet('luna-actions', 'Luna', '#p-cactions');
await loadScripts();
// window.LunaScriptsLoaded = true;
waitForLunaLinksToSettle(() => renderLunaPortlet());
} else {
console.error("Luna: User is not autoconfirmed.");
mw.notify("Error: You must be autoconfirmed to use Luna.");
}
})();
cim767mtwigla03tlknlnve12chwd0p
4676673
4676664
2026-10-18T03:12:49Z
JJPMaster
3095725
asynchronizing the patrol feature
4676673
javascript
text/javascript
const summaryAd = " (using [[:b:en:Wikibooks:WikiProject Little Star/Luna|Luna]])";
window.isPatroller = true;
var myRights = [];
window.LunaLinks = [];
window.LunaRendered = false;
window.addLunaLink = function(link) {
window.LunaLinks.push(link);
document.dispatchEvent(new CustomEvent("luna-link-added", {
detail: link
}));
console.log("Luna: link added", link.id, performance.now());
return window.LunaLinks;
};
window.addLunaLinks = function(arr) {
for (let i of arr) {
window.addLunaLink(i);
}
return window.LunaLinks;
};
console.log("Luna: Script started.");
mw.loader.load('//en.wikipedia.org/w/load.php?modules=ext.gadget.morebits');
async function loadScripts() {
await $.getScript("/w/index.php?title=User:JJPMaster/luna/patrol.js&action=raw&ctype=text/javascript") // Backlink: [[User:JJPMaster/luna/patrol.js]]");
const scripts = [
'User:JJPMaster/luna/CurateThisPage.js', // Backlink: [[User:JJPMaster/luna/CurateThisPage.js]]
'User:JJPMaster/luna/rfd.js', // Backlink: [[User:JJPMaster/luna/rfd.js]]
'User:JJPMaster/luna/warn.js', // Backlink: [[User:JJPMaster/luna/warn.js]]
'User:JJPMaster/luna/talkback.js', // Backlink: [[User:JJPMaster/luna/talkback.js]]
'User:JJPMaster/luna/welcome.js', // Backlink: [[User:JJPMaster/luna/welcome.js]]
'User:JJPMaster/luna/arv.js', // Backlink: [[User:JJPMaster/luna/arv.js]]
'User:JJPMaster/luna/unlink.js', // Backlink: [[User:JJPMaster/luna/unlink.js]]
'User:JJPMaster/luna/fileunlink.js', // Backlink: [[User:JJPMaster/luna/fileunlink.js]]
'User:JJPMaster/luna/csd.js', // Backlink: [[User:JJPMaster/luna/csd.js]]
'User:JJPMaster/luna/diff.js', // Backlink: [[User:JJPMaster/luna/diff.js]]
'User:JJPMaster/luna/raddewikify.js', // Backlink: [[User:JJPMaster/luna/raddewikify.js]]
'User:JJPMaster/luna/rpp.js', // Backlink: [[User:JJPMaster/luna/rpp.js]]
'User:JJPMaster/luna/CurateThisFile.js', // Backlink: [[User:JJPMaster/luna/CurateThisFile.js]]
'User:JJPMaster/luna/di.js', // Backlink: [[User:JJPMaster/luna/di.js]]
'User:JJPMaster/luna/templateunlink.js', // Backlink: [[User:JJPMaster/luna/templateunlink.js]]
'User:JJPMaster/luna/rollback.js' // Backlink: [[User:JJPMaster/luna/rollback.js]]
];
if (myRights.includes("delete")) {
await $.getScript('/w/index.php?title=User:JJPMaster/luna/d-batch/core.js&action=raw&ctype=text/javascript'), // Backlink: [[User:JJPMaster/luna/d-batch/core.js]]")
await $.getScript(`/w/index.php?title=User:JJPMaster/htmlparserfromhell.js&action=raw&ctype=text/javascript`); // Backlink: [[User:JJPMaster/htmlparserfromhell.js]]
scripts.push(
'User:JJPMaster/luna/d-batch/links.js', // Backlink: [[User:JJPMaster/luna/d-batch/links.js]]
'User:JJPMaster/luna/d-batch/cat.js', // Backlink: [[User:JJPMaster/luna/d-batch/cat.js]]
'User:JJPMaster/luna/d-batch/prefix.js', // Backlink: [[User:JJPMaster/luna/d-batch/prefix.js]]
'User:JJPMaster/luna/und-batch.js' // Backlink: [[User:JJPMaster/luna/und-batch.js]]
);
}
console.log("Luna: Loading scripts...");
await Promise.all(scripts.map(script => {
const start = performance.now();
return $.getScript(`/w/index.php?title=${script}&action=raw&ctype=text/javascript`)
.then(() => console.log(`Luna: Loaded ${script} in ${performance.now() - start}ms.`))
.catch(error => console.error(`Luna: Failed to load ${script}:`, error))
}
));
console.log("Luna: All scripts loaded successfully.");
}
async function waitForPreferences(maxRetries = 10, delay = 200) {
for (let i = 0; i < maxRetries; i++) {
if (typeof Luna !== "undefined" && Luna.myPreferences && Luna.myPreferences.CSD) {
console.log("Luna: Preferences loaded successfully.");
return true;
}
console.warn("Luna: Preferences not loaded yet, retrying...");
await new Promise(resolve => setTimeout(resolve, delay));
}
console.error("Luna: Preferences failed to load after multiple attempts.");
return false;
}
function renderLunaPortlet() {
const order = [
'luna-arv',
'luna-warn',
'luna-welcome',
'luna-welcome-anon',
'luna-tb',
'luna-rev',
'luna-csd',
'luna-rfd',
'luna-di',
'luna-qrb',
'luna-rpp',
'luna-dbatch-links',
'luna-dbatch-prefix',
'luna-dbatch-cat',
'luna-undbatch',
'luna-ctf',
'luna-ctp',
'luna-last',
'luna-since',
'luna-sincemine',
'luna-current',
'luna-dewiki',
'luna-unlink',
'luna-fileunlink',
'luna-tempunlink',
'luna-debug-link'
];
console.log("Luna: rendering at", performance.now());
order.forEach(id => {
const i = window.LunaLinks.find(l => l.id == id);
if (!i) return;
const text = i.debug && Luna.myPreferences?.debug ? `${i.text} [DEBUG]` : i.text;
const l = mw.util.addPortletLink('luna-actions', i.href, text, i.id, i.tooltip)
if (i.onClick) {
$(l).on('click', i.onClick);
}
});
mw.util.addPortletLink(
'luna-actions',
'/wiki/Wikibooks:WikiProject_Little_Star/Luna/Preferences',
'Pref',
'luna-pref-link',
'Edit your Luna preferences'
);
document.dispatchEvent(new Event("luna-rendered"));
}
function waitForLunaLinksToSettle(callback, delay = 150) {
let timeout;
function resetTimer() {
clearTimeout(timeout);
timeout = setTimeout(() => {
document.removeEventListener("luna-link-added", resetTimer);
callback();
}, delay);
}
document.addEventListener("luna-link-added", resetTimer);
resetTimer();
}
(async function () {
try {
console.log("Luna: Fetching user rights...");
myRights = await mw.user.getRights();
console.log("Luna: User rights fetched:", myRights);
} catch (error) {
console.error("Luna: Error fetching user rights:", error);
alert("Luna: An error occurred while fetching your user rights. Please try again.");
return;
}
if (!myRights || myRights.length === 0) {
console.error("Luna: User rights array is empty or undefined.");
alert("Luna: An error occurred while fetching your user rights. Please try again.");
return;
}
if (myRights.includes("autoconfirmed")) {
if (!myRights.includes("rollback")) {
console.log("Luna: Not a patroller or administrator.");
window.isPatroller = false;
}
mw.loader.load('jquery.ui');
console.log("Luna: Loading preferences script...");
try {
await $.getScript(`/w/index.php?title=User:JJPMaster/luna/pref/unstable.js&action=raw&ctype=text/javascript&cb=${Date.now()}`); // Backlink: [[User:JJPMaster/luna/pref/unstable.js]]
console.log("Luna: Preferences loaded successfully.");
} catch (error) {
console.error("Luna: Failed to load preferences script:", error);
return;
}
mw.loader.load('/w/index.php?title=User:JJPMaster/luna.css&action=raw&ctype=text/css', 'text/css');
console.log("Luna: Adding UI elements...");
mw.util.addPortlet('luna-actions', 'Luna', '#p-cactions');
await loadScripts();
// window.LunaScriptsLoaded = true;
waitForLunaLinksToSettle(() => renderLunaPortlet());
} else {
console.error("Luna: User is not autoconfirmed.");
mw.notify("Error: You must be autoconfirmed to use Luna.");
}
})();
i7y5ph3roxn10u889751toury0cbl2n
User:JJPMaster/luna/templateunlink.js
2
472307
4676665
4662628
2026-10-18T02:53:17Z
JJPMaster
3095725
replace "isReviewer" with "isPatroller" (via JWB)
4676665
javascript
text/javascript
// <nowiki>
if (mw.config.get("wgNamespaceNumber") >= 0 && window.isPatroller) {
var tempunlinkLink = window.addLunaLink({
id: 'luna-tempunlink',
text: 'Unlink (transclusions)',
href: '#',
tooltip: 'Remove all transclusions of this page',
onClick: templateUnlink
});
}
var templateTitle = mw.config.get("wgCanonicalNamespace") == "Template" ? mw.config.get("wgPageName").substr(9) : mw.config.get("wgPageName");
async function getTransclusions() {
var params = {
action: 'query',
format: 'json',
list: 'embeddedin',
eilimit: 'max',
eititle: mw.config.get("wgPageName")
},
api = new mw.Api();
const data = await api.get(params);
return data.query.embeddedin;
}
async function getTemplateUnlinkedContent(title, unlinked) {
var params = {
action: 'parse',
page: title,
prop: 'wikitext',
format: 'json'
},
api = new mw.Api();
const data = await api.get(params);
var text = data.parse.wikitext['*'];
var myPage = new Morebits.wikitext.Page(text);
var newText = myPage.removeTemplate(unlinked).getText();
return newText;
}
async function templateUnlink() {
if (window.isPatroller) {
var doIt = confirm("You are about to remove all of the transclusions of this page. If you mess up, this is likely to be very difficult to reverse. Are you *ABSOLUTELY SURE* you want to do this?");
if (!doIt) return;
var trans = await getTransclusions();
var params, api;
for (var t of trans) {
var content = await getTemplateUnlinkedContent(t.title, templateTitle);
params = {
action: 'edit',
format: 'json',
text: content,
title: t.title,
summary: `Removing transclusion(s) of [[${mw.config.get("wgPageName").replace(/_/g, ' ')}]]`,
tags: "Luna"
};
api = new mw.Api();
try {
var data = await api.postWithToken( 'csrf', params );
console.log(data)
}
catch (error) {
console.error("Luna: Unlink failed.", error)
}
}
var remaining = await getTransclusions();
if (remaining.length > 0)
alert("It looks like not all of the transclusions were removed. This is most likely because you hit the rate limit. Please try again later.");
else alert("Done!");
}
else {
alert("Luna: You must be a reviewer or administrator to use this tool.");
return;
}
}
// </nowiki>
snb6a0ws97cw8ahy6qc3iyxynl7wnxa
Chess/Glossary
0
476457
4676575
4597564
2026-10-17T19:46:12Z
WereSpielChequers
248949
typo
4676575
wikitext
text/x-wiki
=Pieces=
There are 7 pieces in chess. All pieces can be blocked with exception to the Knight.
===Pawn===
The pawn moves one square forward but captures diagonally. However, on its first turn, it can move 2 spaces.
===Bishop===
The bishop moves diagonally in any direction. Because it can only move diagonally, it can only go to a square of the same colour as its home square.
===Knight===
The Knight moves two spaces laterally and then makes a 90 degree turn in either direction and then moves one square laterally, forming an L shape. It is also the only piece that can jump, which means that its path cannot be blocked.
===Rook===
The Rook moves laterally.
===Queen===
The Queen moves like both a Rook and a Bishop, as if they were combined.
===King===
The kings moves one space in any direction, laterally or diagonally.
=Chess Terms=
==Special moves==
This section covers moves other than mentioned above.
===Castling===
During castling, the king moves two spaces and the rook moves over the king next to the king on the other side of the king.
There are a few requirements for castling:
#There cannot be any piece in between the king and the rook
#The king cannot travel through a space where it can be captured.
#The king must not be able to be captured after castling.
#The king must not be in check.
#The king and rook must be on the same rank.
#Neither the king nor the Rook can have previously moved.
===En passant===
When one side’s pawn moves to spaces, and the opposing side’s pawn is next to it(either on their left or right), the opposing side can capture it as though it had only moved 1 space.
==Tactics==
===Double attack===
====Discovered Attack====
When one piece is blocking the vision of the piece behind it and one moves that piece, causing the piece behind it to be able to attack an opponents piece. Generally either the piece moved is also attacking an opponents piece, and since it is impossible to move both pieces at the same time, Black has to give one up, or taking an opponents piece that was adequately defended, so Black has to move the attacked piece and let the piece that just took something move, or take the piece that took something and lose the attacked piece.
=====Double check=====
When the opponent’s king is attacked twice. This is especially potent because you cannot block (as the king would still be in check by the other piece) and you cannot capture either piece (as the other piece would still check the king), so the only option is to move. If the king cannot move, it is checkmate.
====Forks====
See [[Chess/Glossary#Fork|Fork]]
===Fork===
When two pieces are attacked at the same time by the same piece. Knights are especially good at forking because no other piece can take the knight when the knight is attacking it except for the knight.
===Pin===
When a piece is attacking another piece and the piece behind is of higher value.
===Skewer===
When a piece is attacking another piece and moving the attacked piece would expose a lower valued piece behind it.
==Relating to the opening==
===Development===
How many active pieces an opponent has. When one side has more active pieces, they are considered to have the ''lead in development''.
===Fianchetto===
Instead of developing towards the centre, you develop the bishop to b2/b7/g2/g7. The bishop is good here because it can protect the king when castled, allowing one to push pawns in front of the king (which is usually a bad idea). Furthermore, the bishop can control important squares in the centre. This is a feature of hypermodern openings.
===Gambit===
When one sacrifices a piece (usually a pawn) for a lead in development(like the Danish gambit) or better central control (like the Queen’s gambit).
==Mate names==
===Anastasia’s mate===
{{Chess diagram small
|tleft
|
|rd| | |qd| |rd| | |=
|pd|pd| |nd|nl|pd|pd|kd|=
| | |pd|pl| | | | |=
| | | | | | | |ql|=
| | | | | | | | |=
| | |nl| | | | | |=
|pl|pl|pl| | |pl|pl| |=
|rl| | | | |kl| | |=
}}
When the rook or queen is on the edge of the board, checking the king on h2 / a2, and the knight cuts off the escape squares, therefore leading to mate. Usually occurs after a sacrifice on h2 / a2.
===Arabian mate===
{{Chess diagram small
|tright
|
| | | | | | | |kd|=
| | | | | | | |rl|=
| | | | | |nl| | |=
| | | | | | | | |=
|bd| | | | | | | |=
| | | | | | | | |=
| | | | |kl| | | |=
| | | |rd| | | | |
}}
A mate that occurs when the king is cornered and the knight and rook together deliver mate.
===Epaulette's mate===
This mate occurs when the king is sandwiched between two pieces (usually rooks) and is on the back rank, and the Queen herself delivers mate.
===Smothered mate===
When only the knight checks the king and the king has nowhere to go because it is blocked by its own pieces. No other pieces are required.
==Relating to Chess Tournaments==
===Touch-move rule===
Once you touch a piece, you must move it, unless the piece has no legal moves. Once you touch an opponent’s piece, you must capture it if possible.
{{BookCat}}
428bgea0oisf2laskys06k6u8r8kncr
OpenSCAD User Manual/Suggest Reduce Function
0
477065
4676723
4676291
2026-10-18T10:18:05Z
ShakespeareFan00
46022
4676723
wikitext
text/x-wiki
==Implement a reduce() Function==
Not that i know how to do this .. but i did find a good explanation of what would be needed and started this page
[[w:Fold_(higher-order_function)#Evaluation_order_considerations|Issues to do with reduce in a functional language]]
I believe it has been done here: https://github.com/andy128k/scad_utils/blob/2c6b2fa847380a17bfbced4d7235f884330cd06a/lists.scad#L76
<syntaxhighlight lang="text">
// Fold
function list_fold(list, func, acc = undef, index = 0) =
index >= len(list)
? acc
: list_fold(list, func, func(acc, list[index]), index + 1);
</syntaxhighlight>
For example, <code>echo(list_fold([1,2,3], function(a, b) a + b, 0));</code> will echo <code>6</code>.
{{BookCat}}
3mec6p9llj4wfulgrka7fz99e8uzc4p
User:Dom walden/Multivariate Analytic Combinatorics/Stratified Singular Varieties
2
480707
4676700
4632543
2026-10-18T08:08:02Z
Dom walden
3209423
/* Whitney stratification */ change l to \mathcal{l}
4676700
wikitext
text/x-wiki
== Introduction ==
We hinted in the [[User:Dom_walden/Multivariate_Analytic_Combinatorics/Cauchy-Hadamard_Theorem_and_Exponential_Bounds#Domain_of_convergence|previous chapter]] that singularities and the domain of convergence in the multivariate case are more complicated than in the univariate case. In this chapter, we present this in more detail.
First, we demonstrate the different types of what, in the multivariate case, are called '''singular varieties'''. Second, we show how to decompose the more complex singular varieties using '''Whitney stratification'''. Finally, we present '''critical points''' as the points of the singular varieties we are interested in for asymptotics.
== Singular varieties ==
For a function <math display="inline">F(z) = \frac{P(z)}{Q(z)}</math> with <math display="inline">z \in \C^d</math>, we define the '''singular variety''' <math display="inline">\mathcal{V}</math> the set of points in <math display="inline">\C^d</math> such that <math display="inline">Q(z) = 0</math>, i.e. <math display="inline">\mathcal{V} = \{ z \in \C^d : Q(z) = 0 \}</math>.
As we saw in the single variable (<math display="inline">z \in \C</math>), [[Analytic_Combinatorics/Meromorphic_Functions|meromorphic]] case, <math display="inline">\mathcal{V}</math> consisted of isolated points.
In the multivariate case, this can be much more complicated and can consist of one or more of the following:
* A single hyperplane
* Intersecting hyperplanes (called arrangements which may or may not be transverse)
* A cone (called cone points)
=== Complex hyperplanes ===
For complex vectors <math display="inline">z = (x_1 + iy_1, \cdots, x_d + iy_d)</math> and <math display="inline">w = (u_1 + iv_1, \cdots, u_d + iv_d)</math> the '''Hermitian scalar product''' is defined<ref>Shabat 1992, pp. 2.</ref>
<math display="block">\langle z, w \rangle = \sum_{i=1}^d x_i u_i + \sum_{i=1}^d y_i v_i + i \sum_{i=1}^d (y_i u_i - x_i v_i).</math>
A '''complex hyperplane''' means a set of points <math display="inline">z</math> in complex space such that for a fixed, non-zero vector <math display="inline">a</math> and constant complex number <math display="inline">b</math><ref>Shabat 1992, pp. 2.</ref>
<math display="block">\langle z, a \rangle = b.</math>
This happens when the set of points <math display="inline">z</math> are perpendicular or '''orthogonal''' to <math display="inline">a</math>.
[image?]
=== Single hyperplane ===
For example, for
<math display="block">F(x, y) = \frac{1}{1 - x - y} = \sum_{n \geq 0} \sum_{m \geq 0} \binom{n + m}{m} x^m y^n</math>
there are singularities at any point in <math display="inline">\mathcal{V} = \{ (x, y) : 0 \leq x \leq 1, y = 1 - x \}</math>. Below we see <math display="inline">\mathcal{V}</math> for different values of <math display="inline">|x|, |y|</math>.<ref>Mishna 2020, pp. 143.</ref>
[[File:Singular variety of generating function for binomial coefficients.png|400px]]
Bear in mind that the above graph loses some information due to the axes being the modulus of the two inputs <math display="inline">x</math> and <math display="inline">y</math>. For example, <math display="inline">|x| = |y| = 1</math> is a singularity when <math display="inline">x = (1/2, i \sqrt{3}/2)</math> and <math display="inline">y = (1/2, -i \sqrt{3}/2)</math> (roughly).
=== Intersecting hyperplanes ===
For example, for
<math display="block">F(x, y) = \frac{1}{(3-2x-y)(3-x-2y)}</math>
the singular variety is a union of two singular varieties, <math display="inline">\mathcal{V}_{3-2x-y} = \{ (x, y) : y = 3 - 2x \}</math> and <math display="inline">\mathcal{V}_{3-x-2y} = \{ (x, y) : y = \frac{3 - x}{2} \}</math>. We use the definition of the scalar product above to demonstrate that both are complex hyperplanes. For <math display="inline">x = x_0 + ix_1</math> and <math display="inline">y = y_0 + iy_1</math> and some fixed vector <math display="inline">(u_0 + iu_1, v_0 + iv_1) \in \C^2</math> the scalar product is
<math display="block">\langle (x, y), (u, v) \rangle = x_0 u_0 + y_0 v_0 + x_1 u_1 + y_1 v_1 + i((x_1 u_0 - x_0 u_1) + (y_1 v_0 - y_0 v_1)) = b</math>
for constant complex number <math display="inline">b</math>.
Below we see <math display="inline">\mathcal{V}</math>, plotting separately the real parts of <math display="inline">x</math> and <math display="inline">y</math> (left figure) and the imaginary parts of <math display="inline">x</math> and <math display="inline">y</math> (right figure). The left figure demonstrates that <math display="inline">\langle (x_0, y_0), (u_0, v_0) \rangle = x_0 u_0 + y_0 v_0 = c_0</math> for fixed <math display="inline">c_0</math> and the right that <math display="inline">\langle (x_1, y_1), (u_1, v_1) \rangle = x_1 u_1 + y_1 v_1 = c_1</math> for fixed <math display="inline">c_1</math>. Notice that the two blue graphs and the two yellow graphs have the same slope. Therefore, <math display="inline">(u_1, v_1)</math> is just a translation of <math display="inline">(u_0, v_0)</math> and <math display="inline">(-u_1, -v_1)</math> is the same but flipped 180 degrees and, as a result, <math display="inline">\langle (x_0, y_0), (-u_1, -v_1) \rangle = -x_0 u_1 - y_0 v_1 = c_2</math> and <math display="inline">\langle (x_1, y_1), (u_0, v_0) \rangle = x_1 u_0 + y_1 v_0 = c_3</math>. Therefore, we can find our <math display="inline">b</math>
<math display="block">\langle (x, y), (u, v) \rangle = c_0 + c_1 + i(c_2 + c_3) = b.</math>
[union_of_hyperplanes.py]
We look at the point where <math display="inline">\mathcal{V}_{3-2x-y}</math> and <math display="inline">\mathcal{V}_{3-x-2y}</math> intersect and draw both their slopes or '''tangent spaces''', as shown in the below image. Taking all possible linear combinations of the vectors which form the basis of these tangent spaces, we get a space called the '''span''' of the vectors. When the span of the tangent spaces is equal to <math display="inline">\C^d</math> (in our case <math display="inline">\C^2</math>), we call these types of arrangements '''transverse'''.
[image?]
We can demonstrate this separately for the real and imaginary parts to show that <math display="inline">((r_0 + ir_1, s_0 + is_1) (t_0 + it_1, q_0 + iq_1))</math> where <math display="inline">r_0, s_0</math> is determined by the blue real, <math display="inline">t_0, q_0</math> the yellow real, <math display="inline">r_1, s_1</math> by the blue imaginary and <math display="inline">t_1, q_1</math> by the yellow imaginary. We see that <math display="inline">((r_0, s_0), (t_0, q_0))</math> spans the two-dimensional real space and <math display="inline">((r_1, s_1), (t_1, q_1))</math> spans the two-dimensional "imaginary" space.
[union_of_hyperplanes_tangent_spaces.py]
Another example, for
<math display="block">F(x, y) = \frac{1}{(3 - 2x - y)(3 - x - 2y)(2 - x - y)}</math>
all three singular varieties <math display="inline">\mathcal{V}_{3 - 2x - y} = \{ (x, y) : y = 3 - 2x \}</math>, <math display="inline">\mathcal{V}_{3 -x - 2y} = \{ (x, y) : y = \frac{3 - x}{2} \}</math> and <math display="inline">\mathcal{V}_{2 - x - y} = \{ (x, y) : y = 2 - x \}</math> intersect at <math display="inline">(1, 1)</math>. Their slopes are much like our first example in this section but with an extra one slope which is a combination of the other two slopes [example?]. Therefore, they are not transverse. Instead, we look at the set of points where the hyperplanes intersect, called the '''intersection lattice''', and the set of points where their tangent planes intersect (also called the intersection lattice). If these are equal, it is an '''arrangement'''.<ref>Pemantle, Wilson and Melczer 2024, pp. 329.</ref>
[union_of_hyperplanes_arrangement2.py]
However, note that the three hyperplanes are transverse when taken pairwise. We will show how to decompose such an arrangement in later chapters.
A final example of something that is not an arrangement, for
<math display="block">F(x, y) = \frac{1}{(2 - x - y)(1 - xy)}</math>
the singular varieties <math display="inline">\mathcal{V}_{2 - x - y} = \{ (x, y) : y = 2 - x \}</math> and <math display="inline">\mathcal{V}_{1 - xy} = \{ (x, y) : y = 1/x \}</math> intersect at <math display="inline">(1, 1)</math> with identical slopes and, therefore, cannot span more than one dimension and, therefore, are not transverse. Nor are they arrangements as the intersection lattice of their hyperplanes is a single point (<math display="inline">(1, 1)</math>) but the intersection lattice of their tangent planes is the line <math display="inline">y = 2 - x</math>.<ref>Pemantle, Wilson and Melczer 2024, pp. 314.</ref>
[union_of_hyperplanes_arrangement.py]
=== Cone point ===
The singular variety may look like a cone.
For example,
<math display="block">F(x, y) = \frac{1}{x^2 + y^2}</math>
has singularities in the case that <math display="inline">y = ix</math> or <math display="inline">y = -ix</math>. When plotted, it looks like two cones whose points meet at the origin. This is not the same as a union of hyperplanes as this is a single variety [right?]
[cone_point.py]
Another example, for
<math display="block">F(x, y, z) = \frac{1}{1 + xyz - (1/3)(x + y + z + xy + yz + xz)}</math>
the singular varieties meet at a single point <math display="inline">(1, 1, 1)</math>.<ref>Pemantle, Wilson and Melczer 2024, pp. 228.</ref>
== Whitney stratification ==
In the case of a single hyperplane we can skip this step. The '''Whitney stratification''' just contains one strata, <math display="inline">\mathcal{V}</math>.
Otherwise, our aim is to decompose <math display="inline">\mathcal{V}</math> into a union of (not necessarily connected) submanifolds such that:
# each submanifold is closed and smooth
# if <math display="inline">S_\alpha \subset \overline{S_\beta}</math> then any sequences where <math display="inline">\{x_i\} \subset S_\beta</math> and <math display="inline">\{y_i\} \subset S_\alpha</math> which both converge to <math display="inline">y \in S_\alpha</math>, the lines <math display="inline">\mathcal{l}_i = \overline{x_iy_i}</math> converge to a line <math display="inline">\mathcal{l}</math> and the tangent planes <math display="inline">T_{x_i}(S_\beta)</math> converge to a plane <math display="inline">T</math> then <math display="inline">T_y(S_\alpha) \subset T</math> and <math display="inline">\mathcal{l} \subseteq T</math> (these are the '''Whitney conditions'''.)<ref>Pemantle, Wilson and Melczer 2024, pp. 534.</ref>
For example,
<math display="block">F(x, y) = \frac{1}{(1 - x)(1 - y)(1 - z)}</math>
<math display="inline">\mathcal{V}</math> consists of three planes where <math display="inline">x = 1</math>, <math display="inline">y = 1</math> and <math display="inline">z = 1</math>. At the lines where they intersect they fail to be smooth. Therefore, we put the intersection lines in their own strata leaving us the strata:
* The <math display="inline">xy</math> plane at <math display="inline">z = 1</math> with the lines removed where <math display="inline">x = 1</math> or <math display="inline">y = 1</math>
* The <math display="inline">xz</math> plane at <math display="inline">y = 1</math> with the lines removed where <math display="inline">x = 1</math> or <math display="inline">z = 1</math>
* The <math display="inline">yz</math> plane at <math display="inline">x = 1</math> with the lines removed where <math display="inline">y = 1</math> or <math display="inline">z = 1</math>
* The line <math display="inline">\{ (1, 1, z) \in \C^3 \}</math>
* The line <math display="inline">\{ (1, y, 1) \in \C^3 \}</math>
* The line <math display="inline">\{ (x, 1, 1) \in \C^3 \}</math>
This does not meet the Whitney conditions at all points. For example, any sequence of points along the <math display="inline">y</math>-axis converging to a point on the <math display="inline">z</math>-axis will have tangents along the <math display="inline">y</math>-axis, but any point on the <math display="inline">z</math>-axis to which it converges will have tangent along the <math display="inline">z</math>-axis. Therefore, we need to separate the point <math display="inline">(1, 1, 1)</math> into its own strata.<ref>Mishna 2020, pp. 179.</ref>
Sometimes, we can work out a Whitney Stratification by hand, like above. Other times, we may need to use software to help us. [explain]
== Critical points ==
[explain gradient as vector, greatest increase and orthogonal to level set and directional derivative as scalar]
[why do we use a height function?]
We have a height function <math display="inline">h_r(z) = - \sum_{i=1}^d r_i \log(|z_i|)</math> with '''gradient''' given by the vector <math display="inline">[-r_1/z_1, \cdots, -r_d/z_d]</math>.
For each strata, we want to find out where the '''directional derivative''' of our height function, when restricted to that strata, equals zero. The point at which this happens is called a '''critical point'''.
Suppose we have function <math display="inline">f(x, y) = \frac{1}{1 - x - y}</math>. We draw the graph of <math display="inline">q(x, y) = 1 - x - y</math> below. Where it intersects the <math display="inline">xy</math>-plane, i.e. where <math display="inline">q(x, y)</math> is zero, is the singular variety <math display="inline">\mathcal{V} = \{ (x, y) : 0 \leq x \leq 1, y = 1 - x \}</math>. It is a level set. Notice that the gradient of <math display="inline">q(x, y)</math> is the constant <math display="inline">[-1, -1]</math>, which is orthogonal to the (tangent plane of the) variety and which we draw as arrows in the below graph.
[graph of q]
Suppose we are interested in the coefficients in the direction <math display="inline">(1, 1)</math>. We draw the graph of <math display="inline">h_{(1,1)} = -\log x - \log y</math> below. The red[?] line is the variety <math display="inline">\mathcal{V}</math>. The variety is in the direction <math display="inline">(-1, 1)</math> (or <math display="inline">(1, -1)</math>) and, therefore, the directional derivative is <math display="inline">1/x - 1/y</math> (or <math display="inline">1/y - 1/x</math>). This is zero when <math display="inline">x = y</math> and this only happens at the critical point <math display="inline">(x, y) = (1/2, 1/2)</math>. The gradient of the height function is <math display="inline">[-1/x, -1/y]</math>, which we draw as arrows in the below graph. The directional derivative being zero means at the critical point the direction of greatest increase is orthogonal to the tangent plane of the variety.
Therefore, the gradient of <math display="inline">q</math> and the gradient of <math display="inline">h</math> must be parallel at the critical point.
[graph of h]
The above shows a graph of this. The critical point is highlighted in red. The value of the height function at the critical point, its '''critical value''', is roughly <math display="inline">1.4</math>.
If we change the direction to <math display="inline">(1, 2)</math>, the gradient changes to <math display="inline">dh(x, 1 - x) = [-1/x, -2/y]</math> and the critical point changes to <math display="inline">(x, y) = (1/3, 2/3)</math> with critical value of roughly <math display="inline">1.9</math>. This is graphed below.
[graph of h12]
So we need to find the point where the gradient of <math display="inline">q</math> and the gradient of <math display="inline">h</math> are not linearly independent and, therefore, at the critical point <math display="inline">w</math>, the below matrix has rank equal to 1.
<math display="block">\begin{pmatrix}
\partial f / \partial z_1 (w) & \cdots & \partial f / \partial z_d (w) \\
r_1/w_1 & \cdots & r_d/w_d
\end{pmatrix}</math>
This happens when all the <math display="inline">2 \times 2</math> '''minors''' of the matrix have '''determinants''' equal to zero, which is equivalent to the system of equations
<math display="block">r_k w_1 \partial f/\partial z_1 (w) - r_1 w_k \partial f/\partial z_k (w) = 0 \quad (2 \leq k \leq d)</math>
combined with the equation <math display="inline">f(w) = 0</math>.<ref>Pemantle, Wilson and Melczer 2024, pp. 200.</ref>
An example with more than one strata.
<math display="block">F(x, y, z) = \frac{1}{A(x, y, z) B(x, y, z)} = \frac{1}{(4 - x - 2y - z)(4 - 2x - y - z)}</math>
It has one strata where <math display="inline">A(x, y, z) = 0</math> and <math display="inline">B(x, y, z) \neq 0</math>. The matrix defining the critical point on this strata is
<math display="block">\begin{pmatrix}
x A_x & y A_y & z A_z \\
r & s & t
\end{pmatrix}</math>
leading to the system of equations
<math display="block">\begin{align}
A(x, y, z) = 4 - x - 2y - z &= 0 \\
tx - rz &= 0 \\
2ty - sz &= 0
\end{align}</math>
giving the critical point <math display="inline">(x, y, z) = \frac{1}{r + s + t}(4r, 2s, 4t)</math> unless <math display="inline">2r = s</math>.
It has another strata where <math display="inline">B(x, y, z) = 0</math> and <math display="inline">A(x, y, z) \neq 0</math>. The matrix defining the critical point on this strata is
<math display="block">\begin{pmatrix}
x B_x & y B_y & z B_z \\
r & s & t
\end{pmatrix}</math>
leading to the system of equations
<math display="block">\begin{align}
B(x, y, z) = 4 - 2x - y - z &= 0 \\
2tx - rz &= 0 \\
ty - sz &= 0
\end{align}</math>
giving the critical point <math display="inline">(x, y, z) = \frac{1}{r + s + t}(2r, 4s, 4t)</math> unless <math display="inline">2s = r</math>.
For the strata defined by the simultaneous vanishing of <math display="inline">A</math> and <math display="inline">B</math>. This is one-dimensional and the gradients of <math display="inline">A</math> and <math display="inline">B</math> span a one or two-dimensional space orthogonal to this strata. At the critical point, the gradient of <math display="inline">h</math> is in the space spanned by the former two gradients. Therefore, we have the matrix
<math display="block">\begin{pmatrix}
x A_x & y A_y & z A_z \\
x B_x & y B_y & z B_z \\
r & s & t
\end{pmatrix}</math>
and this time we want the vanishing of the determinant of the <math display="inline">3 \times 3</math> minor, giving the system of equations
<math display="block">\begin{align}
4 - x - 2y - z &= 0 \\
4 - 2x - y - z &= 0 \\
ryz + sxz - 3txy &= 0
\end{align}</math>
which has the critical point <math display="inline">\frac{4}{3(r + s + t)}(r + s, r + s, 3t)</math>.<ref>Pemantle, Wilson and Melczer 2024, pp. 246-248.</ref>
[graph_of_ab_1.py]
== Computing Whitney stratifications and critical points ==
Suppose we have <math display="inline">F(z) = \frac{P(z)}{Q(z)}</math> and a Whitney Stratification <math display="inline">\mathcal{V} = \mathcal{V}_0 \supset \mathcal{V}_1 \supset \cdots \supset \mathcal{V}_m = \empty</math>.
<math display="inline">\mathcal{V}_0</math> is defined by the vanishing of <math display="inline">Q</math>. <math display="inline">Q</math> may be able to be factorised as a product of polynomials <math display="inline">Q(z) = A(z)B(z) \cdots</math>. We work this out using ideals and primary decomposition.
<syntaxhighlight>
i1 : S=QQ[z_1, ..., z_d]
i2 : primaryDecomposition ideal(Q)
o2 = {ideal(A), ideal(B), ...}
i3 : groebnerBasis ideal(A)
o3 = | A_1 A_2 ... |
i3 : groebnerBasis ideal(B)
o3 = | B_1 B_2 ... |
...
i4 : codim ideal(Q)
o4 = c
...
</syntaxhighlight>
Then for each <math display="inline">A, B, \cdots</math> we solve the system of equations defined by
<math display="block">\begin{pmatrix}
\nabla A_1 \\
\nabla A_2 \\
\cdots \\
r_1/z_1 \cdots r_d/z_d
\end{pmatrix}</math>
The critical point happens at the <math display="inline">z</math> where the matrix has rank <math display="inline">c</math>, the <math display="inline">A_i</math> vanish and the generating set of <math display="inline">\mathcal{V}_1</math> do not vanish.
We repeat a similar process than above with <math display="inline">\mathcal{V}_1</math>, which is defined by the simultaneous vanishing of the <math display="inline">A(z), B(z), \cdots</math>.
<syntaxhighlight>
i1 : S=QQ[z_1, ..., z_d]
i2 : primaryDecomposition ideal(A, B, ...)
o2 = {ideal(A_0, B_0, ...)}
i3 : groebnerBasis ideal(A_0)
o3 = | A_1 A_2 ... |
i3 : groebnerBasis ideal(B_0)
o3 = | B_1 B_2 ... |
...
i4 : codim ideal(A, B, ...)
o4 = c
...
</syntaxhighlight>
[ https://melczer.ca/textbook/ ]
== Notes ==
{{Reflist}}
== References ==
* {{cite book | last=Melczer | first=Stephen | title=An Invitation to Analytic Combinatorics: From One to Several Variables | publisher=Springer Texts & Monographs in Symbolic Computation | year=2021 | url=https://melczer.ca/files/Melczer-SubmittedManuscript.pdf }}
* {{cite book | last=Mishna | first=Marni | title=Analytic Combinatorics: A Multidimensional Approach | publisher=Taylor & Francis Group, LLC | year=2020 }}
* {{cite book | last1=Pemantle | first1=Robin | last2=Wilson | first2=Mark C. | last3=Melczer | first3=Stephen | title=Analytic Combinatorics in Several Variables | publisher=Cambridge University Press | year=2024 | edition=2nd | url=https://acsvproject.com/PemantleWilsonMelczer23.pdf }}
* {{cite book | last=Shabat | first=B. V. | title=Introduction to Complex Analysis. Part II: Functions of Several Variables | publisher=American Mathematical Society, Providence, Rhode Island | year=1992 }}
014op60tsme8pbsm9p5nqjjodvabfo4
User:Dom walden/Multivariate Analytic Combinatorics/Homology of Critical Points
2
480750
4676705
4676481
2026-10-18T08:15:42Z
Dom walden
3209423
/* Fringed sets */ Proof for A_2 (incomplete)
4676705
wikitext
text/x-wiki
== Introduction ==
Morse theory tells us that the topology of M only changes at its critical points.
The "Morse data" tells us the topology at each critical point.
Attaching this Morse data together gives us a space which is homopotically eqivalent to M.
This space is a "cell complex", which has an easy to calculate homology.
Theorem: Our domain of convergence is homotopic to a cell complex of dimension at most <math display="inline">2n - d - 1</math>.<ref>This is theorem D.23 in Pemantle, Wilson and Melczer 2024, pp. 546. Also theorem in section 1.2*/5.2* in SMT pp. 200.</ref>
Proof:
# <math display="inline">X</math> is our entire domain, <math display="inline">\mathcal{V}</math> our variety
# Project our entire domain to complex projective space <math display="inline">Z = \pi(X) \subset \C\mathbb{P}^n - H</math> [define H]
# Define a linear subspace <math display="inline">G \subset \C\mathbb{P}^n</math> of dimension <math display="inline">d - 1</math>
# Define a Morse function on <math display="inline">f: \C\mathbb{P}^n \to \R</math> which approximates the distance from <math display="inline">G</math> and such that <math display="inline">f^{-1}(0) = G</math> and <math display="inline">f^{-1}(1) = H</math>
# We "build" <math display="inline">X - \mathcal{V}</math> from <math display="inline">\pi^{-1}(G \cap Z) \cap (X - \mathcal{V})</math> by attaching CW complexes at critical points which are of at most dimension <math display="inline">2n - d - 1</math>
# At a critical point, the normal Morse data is <math display="inline">(J, K) = \coprod_x (J_x, K_x)</math> and the relative complex link is <math display="inline">\mathcal{L}^\pi = \coprod_x \mathcal{L}_x</math>
# We show that the quotient <math display="inline">J_x/K_x</math> is homotopic to a CW complex of dimension <math display="inline">\leq 2n - d - 1</math>
# The neighbourhood of <math display="inline">x</math> in <math display="inline">J_x</math> is homeomorphic to the cone in <math display="inline">L_x(X - \mathcal{V})</math>, and removing the point <math display="inline">x</math> increases the homotopy dimension to at most the homotopy dimension of <math display="inline">L_x</math>
# <math display="inline">(J_x \cup \{x\}, K_x)</math> is homotopic to <math display="inline">(\text{cone}(\mathcal{L}_x), \mathcal{L}_x)</math>
# <math display="inline">\mathcal{L}_x</math> is homotopic to a CW complex of dimension at most <math display="inline">2n - d - 1</math>
# The tangential Morse data at the critical point is homotopic to the pair <math display="inline">(D^\lambda, \partial D^\lambda)</math>
# Therefore, at each critical point a space has been added homotopic to a CW complex of dimension at most <math display="inline">2n - d - 1</math>.
Theorem: If <math display="inline">X</math> is the complement in <math display="inline">\C^n</math> of a complex variety <math display="inline">\mathcal{V}</math> of dimension <math display="inline">d</math> then <math display="inline">X</math> is homotopic to a CW complex of dimension at most <math display="inline">2n - d - 1</math>.<ref>Pemantle, Wilson and Melczer 2024, pp. 546.</ref>
Proof:
# We build <math display="inline">X</math> by attaching cells of dimension at most <math display="inline">2n - d - 1</math> at each critical point.
## Prove that we can do this without changing the homotopy(?)
## We use Thom's Isotopy Lemma to prove that there is a strong deformation retraction, stopping only at critical points.
# Prove these cells are a product of the normal and tangential Morse data.
## Normal data: <math display="inline">(\mathcal{L}(S), \partial \mathcal{L}(S)) \times (D^1, \partial D^1)</math> [GM pp. 18]
## Tangential data: <math display="inline">(B_\delta \cap f^{-1}[v - \epsilon, v + \epsilon], B_\delta \cap f^{-1}(v - \epsilon))</math> for <math display="inline">f</math> restricted to <math display="inline">X</math> (or <math display="inline">\mathcal{V}</math>?) [GM pp. 63-64]
# If <math display="inline">k</math> is the dimension of the strata, then
## If <math display="inline">k = d</math> then it is a smooth point and the cell is the product of <math display="inline">S^{2(n-d)-1}</math> and the tangential data is dimension at most <math display="inline">d</math>.
## If <math display="inline">k < d</math>, ...
<ref>Pemantle, Wilson and Melczer 2024, pp. 547.</ref>
== Example in one dimension ==
Domain with singularities v_1, v_2, ..., v_i
Define our height function f...
Start with our entire domain X
Reduce from X to X_i+ by using Thom's Isotopy lemma to do a strong deformation retract
== Thom's isotopy lemma ==
We present a modified version of Thom's (first) isotopy lemma, less general than the original but more obviously relevant to our situation.
Theorem: Suppose <math display="inline">Z</math> is a closed subset of a smooth manifold <math display="inline">M</math> which admits a Whitney stratification and <math display="inline">h : M \to \R</math> is a proper Morse function which has no critical values on <math display="inline">Z</math>. Then, the level sets of <math display="inline">Z</math> are homeomorphic by a homeomorphism that preserves the strata of <math display="inline">Z</math>.<ref>For various versions of the full statement of the theorem, see Mather 2012, pp. 499, Goresky and MacPherson 1988, pp. 41, or Pemantle, Wilson and Melczer 2024, pp. 541.</ref>
Proof:
# Construct control data for <math display="inline">Z</math> compatible with <math display="inline">h</math>.
## [Prop 7.1] If <math display="inline">h</math> is smooth on <math display="inline">Z</math> and is a submersion for each strata then there exists a family of control data for <math display="inline">Z</math> compatible with <math display="inline">h</math>.<ref>Mather 2012, pp. 488.</ref>
# This makes <math display="inline">Z</math> an abstract stratified set and <math display="inline">f</math> a controlled submersion.
# A controlled submersion has, for any smooth vector field on <math display="inline">\R</math>, a controlled vector field on <math display="inline">Z</math> (a "lift"?)<ref>Mather 2012, pp. 493.</ref>
# A controlled vector field has a unique one-parameter family of homeomorphisms of <math display="inline">Z</math> which commute with <math display="inline">h</math>.<ref>Mather 2012, pp. 496.</ref>
# This makes <math display="inline">h</math> a locally trivial fibration. [Prop 10.2]<ref>Mather 2012, pp. 499.</ref>
Control data:
A system of '''control data''' for <math display="inline">Z</math> consists of, for each stratum <math display="inline">X</math> of <math display="inline">Z</math>,
* a '''tubular neighbourhood''' <math display="inline">T_X</math> of <math display="inline">X</math>
* a '''tubular projection function''' <math display="inline">\pi_X: T_X \to X</math>, and
* a '''tubular distance function''' <math display="inline">\rho_X: T_X \to \R</math> such that <math display="inline">\rho_X^{-1}(0) = X</math><ref>Goresky and MacPherson 1988, pp. 42.</ref>
[illustration]
such that if <math display="inline">X < Y</math> are strata in <math display="inline">Z</math>, then
<math display="block">\pi_X \pi_Y(m) = \pi_X(m),</math>
<math display="block">\rho_X \pi_Y(m) = \rho_X(m)</math>
for all <math display="inline">m \in |T_X| \cap |T_Y|</math> such that <math display="inline">\pi_Y(m) \in |T_X|</math>.
If, for all strata <math display="inline">X</math> and all <math display="inline">m \in |T_X|</math>, we have <math display="inline">h \pi_X(m) = h(m)</math>, then this control data will be said to be compatible with <math display="inline">h</math>.<ref>Mather 2012, pp. 488.</ref>
We prove that if <math display="inline">h</math> is smooth on <math display="inline">Z</math> and is a submersion for each strata then there exists a family of control data for <math display="inline">Z</math> compatible with <math display="inline">h</math>.<ref>Mather 2012, pp. 488, prop 7.1.</ref>
Let <math display="inline">Z_k</math> be the union of strata of <math display="inline">Z</math> of dimension less than <math display="inline">k</math>. We prove by induction on <math display="inline">k</math>.
To construct the tubular neighbourhood <math display="inline">T_X</math> of a stratum <math display="inline">X</math> of dimension less than <math display="inline">k</math>. For <math display="inline">l \leq k</math>, let <math display="inline">U_l</math> denote the union of all <math display="inline">|T_Y|</math> for <math display="inline">Y < X</math> and <math display="inline">\dim Y \geq l</math>. Let <math display="inline">X_l = U_l \cap X</math>.<ref>Mather 2012, pp. 489.</ref>
For <math display="inline">l = k</math>, <math display="inline">X_k = \empty</math>. Assume by induction that <math display="inline">T_{l+1}</math> has been constructed and that if <math display="inline">Y < X</math>, <math display="inline">\dim Y \geq l + 1</math>, <math display="inline">m \in |T_{l+1}| \cap |T_Y|</math> and <math display="inline">\pi_{l+1}(m) \in |T_Y|</math> (<math display="inline">\pi_{l+1} = \pi_{T_{l+1}}</math>) then<ref>Mather 2012, pp. 489-490.</ref>
<math display="block">\rho_Y \pi_{l+1}(m) = \rho_Y(m),</math>
<math display="block">\pi_Y \pi_{l+1}(m) = \pi_Y(m).</math>
We wish to construct a tubular neighbourhood <math display="inline">T_{X,Y}</math> of <math display="inline">|T_Y| \cap X</math> whose restriction to <math display="inline">|T_Y| \cap X_{l+1}</math> is isomorphic to the restriction of <math display="inline">T_{l+1}</math> such that if <math display="inline">m \in |T_{X,Y}| \cap |T_Y|</math> and <math display="inline">\pi_{X,Y}(m) \in |T_Y|</math> (<math display="inline">\pi_{X,Y} = \pi_{T_{X,Y}}</math>) then
<math display="block">\rho_Y \pi_{X,Y}(m) = \rho_Y(m),</math>
<math display="block">\pi_Y \pi_{X,Y}(m) = \pi_Y(m).</math>
By shrinking <math display="inline">|T_Y|</math> if necessary, this relation is already satisfied if <math display="inline">m \in |T_{l+1}| \cap |T_Y|</math> and <math display="inline">\pi_{l+1}(m) \in |T_Y|</math> with <math display="inline">T_{l+1}</math> in place of <math display="inline">T_{X,Y}</math> and <math display="inline">\pi_{l+1}</math> in place of <math display="inline">\pi_{X,Y}</math>. By the definition, if <math display="inline">m \in |T_{l+1}|</math> then there exists <math display="inline">Z < X</math> with <math display="inline">\dim Z > l</math>, <math display="inline">m \in |T_Z|</math> and <math display="inline">\pi_{l+1}(m) \in |T_Z|</math>. We have that <math display="inline">\pi_{l+1}(m) \in |T_Y| \cap |T_Z|</math> and therefore <math display="inline">Y < Z</math>. Therefore<ref>Mather 2012, pp. 490.</ref>
<math display="block">\rho_Y \pi_{l+1}(m) = \rho_Y \pi_Z \pi_{l+1}(m) = \rho_Y \pi_Z(m) = \rho_Y(m),</math>
<math display="block">\pi_Y \pi_{l+1}(m) = \pi_Y \pi_Z \pi_{l+1}(m) = \pi_Y \pi_Z(m) = \pi_Y(m).</math>
We can prove that, by shrinking <math display="inline">|T_Y|</math>, <math display="inline">(\rho_Y, \pi_Y): |T_Y| \cap X \to \R \times Y</math> is a submersion [prop 7.3?] and that <math display="inline">T_{X,Y}</math> is compatible with <math display="inline">(\rho_Y, \pi_Y): |T_Y| \cap X_{l+1} \to \R \times Y</math>, i.e. <math display="inline">(\rho_Y, \pi_Y) \pi_{X,Y}(m) = (\rho_Y, \pi_Y)(m)</math>(?).
To prove it is a submersion, for the tubular neighbourhood <math display="inline">T = (E, \epsilon, \psi)</math> there exists a smooth positive function <math display="inline">\epsilon'</math> such that
<math display="block">(\rho_T, \pi_T): Y \cap |T|_{\epsilon'}^0 \to \R \times X,</math>
where <math display="inline">|T|_{\epsilon'}^0 = \psi(B_\epsilon \cap B_{\epsilon'})</math>, is a submersion. If <math display="inline">\Sigma</math> is the set <math display="inline">y \in |T|</math> such that the rank of
<math display="block">(\rho_T, \pi_T): T \cap |T| \to \R \times X</math>
at <math display="inline">y</math> is less than <math display="inline">\dim(\R \times X)</math>. We need to prove that for any <math display="inline">x \in X</math> there exists a neighbourhood of <math display="inline">x</math> which does not intersect with <math display="inline">\Sigma</math>, i.e. the map is not a submersion in this neighbourhood. It follows from [lemma 7.2] that it is enough to prove for <math display="inline">M = \R^m</math>, <math display="inline">X = \R^{m-c} \times 0_c</math> and <math display="inline">T</math> is the '''standard tubular neighbourhood'''.<ref>Mather 2012, pp. 489.</ref>
By standard tubular neighbourhood, we mean the trivial bundle with base <math display="inline">\R^{m-c}</math> and fibre <math display="inline">\R^c</math> where <math display="inline">\pi: \R^m \to \R^{m-c}</math>...<ref>Mather 2012, pp. 488.</ref>
For <math display="inline">y \in |T| - \R^{m-c}</math>, the kernal of the differential of <math display="inline">(\pi_T, \rho_T)</math> at <math display="inline">y</math> is the orthogonal complement of <math display="inline">(\R^{m-c} \times 0_c) \oplus \stackrel{\frown}{y \pi_T(y)}</math> in <math display="inline">\R^m</math>. By the Whitney conditions, we have that for <math display="inline">y</math> near <math display="inline">\R^{m-c}</math>, <math display="inline">(\R^{m-c} \times 0_c) \oplus \stackrel{\frown}{y \pi_T(y)}</math> is close to the set of <math display="inline">m - c + 1</math> planes in <math display="inline">m-</math>space to an <math display="inline">m - c + 1</math> plane in <math display="inline">TY_y</math>. Therefore, for <math display="inline">y</math> near enough to <math display="inline">\R^{m-c}</math>, <math display="inline">TY_y</math> is transverse to the kernal of the differential of <math display="inline">(\pi_T, \rho_T)</math> and, therefore, is a submersion when restricted to <math display="inline">Y</math>.<ref>Mather 2012, pp. 489.</ref>
To prove that <math display="inline">T_{X,Y}</math> is compatible with <math display="inline">(\rho_Y, \pi_Y): |T_Y| \cap X_{l+1} \to \R \times Y</math>...<ref>Mather 2012, pp. 490.</ref>
Therefore, there exists a tubular neighbourhood <math display="inline">T_0</math> of <math display="inline">X_0</math> satisfying
<math display="block">\rho_Y \pi_0(m) = \rho_Y(m),</math>
<math display="block">\pi_Y \pi_0(m) = \pi_Y(m).</math>
From this we can prove that <math display="inline">T_0</math> is compatible with <math display="inline">h</math>. Replacing <math display="inline">T_0</math> with a smaller tubular neighbourhood if necessary we can assume <math display="inline">m \in |T_0|</math> such that for some <math display="inline">Y < X</math>, <math display="inline">m \in |T_Y|</math> and <math display="inline">\pi_0(m) \in |T_Y|</math>, then<ref>Mather 2012, pp. 490.</ref>
<math display="block">h \pi_0(m) = h \pi_Y \pi_0(m) = h \pi_Y(m) = h(m).</math>
By the generalised tubular neighourhood theorem [prop 7.2?], we can replace <math display="inline">T_0</math> with a tubular neighbourhood <math display="inline">T</math> of <math display="inline">X</math> compatible with <math display="inline">h</math>. This completes the construction of <math display="inline">T_X</math>.<ref>Mather 2012, pp. 491.</ref>
This makes <math display="inline">Z</math> an '''abstract stratified set''' with axioms...<ref>Mather 2012, pp. 491-492.</ref>
This also makes <math display="inline">h</math> a '''controlled submersion''' because
# <math display="inline">h|X: X \to \R</math> is a smooth submersion on each strata <math display="inline">X</math> of <math display="inline">Z</math>, and
# for each stratum <math display="inline">X</math> there is a tubular neighbourhood <math display="inline">T'_X</math> such that <math display="inline">h(v) = h \pi_X(v)</math> for all <math display="inline">v \in T'_X</math>.<ref>Mather 2012, pp. 493.</ref>
The core of this is the concept of a '''vector field'''. A vector field is a function which assigns, for each point <math display="inline">p</math> in a space, a '''vector''', which can be represented by an arrow whose tail starts at <math display="inline">p</math>.<ref>Henle 1979, pp. 33.</ref>
[picture]
Imagine we have a vector field <math display="inline">v(x)</math> defined in a space and draw a line through our space. At each point along this line the vector field assigns a vector. If we move each point in this line along the arrow defined by this vector in the direction of the arrow head. This "flows" the entire line along the vectors.
[picture]
We define a '''stratified vector field''' <math display="inline">\eta</math> on <math display="inline">Z</math> to be a family of smooth vector fields <math display="inline">\eta_X</math>, one for each strata <math display="inline">X</math> of <math display="inline">Z</math>.<ref>Mather 2012, pp. 493.</ref>
We define a '''controlled vector field''' <math display="inline">\eta</math> on <math display="inline">Z</math> to be a stratified vector field such that for any strata <math display="inline">Y</math> there exists a tubular neighbourhood <math display="inline">T'_Y</math> such that for any <math display="inline">X > Y</math> and any <math display="inline">v \in T'_X \cap X</math><ref>Mather 2012, pp. 493.</ref>
<math display="block">\eta_X \rho_{Y,X}(v) = 0,</math>
<math display="block">(\pi_{Y,X})_* \eta_X(v) = \eta_Y (\pi_{Y,X}(v)).</math>
We prove that if <math display="inline">h</math> is a controlled submersion then, for any smooth vector field <math display="inline">\zeta</math> on <math display="inline">\R</math> there is a controlled vector field <math display="inline">\eta</math> on <math display="inline">Z</math> such that <math display="inline">h_* \eta(v) = \zeta(h(v))</math> for all <math display="inline">v \in Z</math>.<ref>Mather 2012, pp. 493.</ref>
Proceeding by induction on the maximum dimension of the strata of <math display="inline">Z</math>, we define <math display="inline">Z_k</math> to be the union of strata of <math display="inline">Z</math> of dimension at most <math display="inline">k</math>. The tubular neighbourhood of <math display="inline">Z_k</math> is the intersection of the tubular neighbourhoods of each strata in <math display="inline">Z_k</math> with <math display="inline">Z</math>. The projection and distance functions are the restrictions of the respective functions of <math display="inline">Z</math>.
It is trivially true when the maximum dimension of strata in <math display="inline">Z</math> is zero. Assume it is true for <math display="inline">k</math> and construct each <math display="inline">\eta_X</math> separately for each stratum <math display="inline">X</math> of dimension <math display="inline">k + 1</math>.
By the assumption that we have controlled vector fields for all strata <math display="inline">Y</math> of dimension at most <math display="inline">k</math>, we have the two control conditions defined above for any <math display="inline">X > Y</math> and that there is a neighbourhood <math display="inline">T^1_Y</math> such that <math display="inline">h(v) = h \pi_Y(v)</math> for <math display="inline">v \in T^1_Y</math>.
We want to prove that for all <math display="inline">Y < X</math>, the control conditions are satisfied for all <math display="inline">v \in T^2_Y</math> and that <math display="inline">h_*\eta_X(v) = \zeta(v)</math> for all <math display="inline">v \in X</math>.
Take a point <math display="inline">x \in X</math> and define the set <math display="inline">S_v</math> of strata <math display="inline">Y < X</math> such that <math display="inline">v \in T^2_Y</math>. <math display="inline">S_v</math> is totally ordered since if <math display="inline">Y_1</math> and <math display="inline">Y_2</math> are not comparable then <math display="inline">T^2_{Y_1} \cap T^2_{Y_2} = \empty</math>. Therefore, there is a largest member <math display="inline">Y = Y_v</math>.
Assume the control conditions hold for <math display="inline">Y = Y_v</math>. Then they hold for all <math display="inline">Y_i \in S_v</math>. For, either <math display="inline">Y_i = Y</math> or <math display="inline">Y_i < Y</math>. In the latter case, <math display="inline">\pi_Y(v) \in T^1_{Y_i}</math> (by the choice of <math display="inline">T^2_Y</math>'s [is this why?]. Then
<math display="block">\begin{align}
\eta_X(v) \rho_{Y_i,X}(v) &= \eta_X \rho_{Y_i,Y} \pi_{Y,X}(v) \\
&= (\pi_{Y,X})_* \eta_X(v) \rho_{Y_i,Y} \\
&= \eta_Y(\pi_{Y,X}(v)) \rho_{Y_i,Y} \\
&= 0
\end{align}</math>
and
<math display="block">\begin{align}
(\pi_{Y_i,X})_* \eta_X(v) &= (\pi_{Y_i,Y})_* (\pi_{Y,X})_* \eta_X(v) \\
&= (\pi_{Y_i,Y})_* \eta_Y(v) (\pi_{Y,X}) \\
&= \eta_{Y_i}(\pi_{Y_i,Y} \pi_{Y,X}(v)) \\
&= \eta_{Y_i}(\pi_{Y_i,X}(v))
\end{align}</math>
and, therefore, condition holds for all <math display="inline">Y_i \in S_v</math>. Also,
<math display="block">\begin{align}
h_* \eta_X(v) &= (h \circ \pi_{Y,X})_* \eta_X(v) \\
&= h_* \eta_Y (\pi_{Y,X}(v)) \\
&= \zeta(f(v))
\end{align}</math>
and, therefore, the conclusion of the theorem holds at <math display="inline">v</math>.
This shows we can construct <math display="inline">\eta_X</math> satisfying the control conditions when <math display="inline">S_v</math> is non-empty and satisfying the theorem when <math display="inline">S_v</math> is empty. The set of vectors satisfying these conditions is convex in <math display="inline">TX_v</math>, and so we construct <math display="inline">\eta_X</math> globally via a partition of unity.<ref>Mather 2012, pp. 493-495.</ref>
Finally, we prove that a controlled vector field has a unique one-parameter family of homeomorphisms of <math display="inline">Z</math> which commute with <math display="inline">h</math>.<ref>Mather 2012, this combines Proposition 10.1 and Corollary 10.2 on pp. 496 and 497, respectively.</ref>
For each stratum <math display="inline">X</math> of <math display="inline">Z</math>, <math display="inline">\eta_X</math> generates a unique smooth local one-parameter group <math display="inline">(J_X, \alpha_X)</math> of diffeomorphisms of <math display="inline">X</math> (by standard results of differential geometry), such that <math display="inline">\frac{d}{dt} \alpha(t, v)|_{t=0} = \eta_X(v)</math>, <math display="inline">J_X</math> is an open subset of <math display="inline">\R \times Z</math>, ...
If we define <math display="inline">(J, \alpha)</math> by
<math display="block">J = \bigcup_{X \in S} J_X</math>
<math display="block">\alpha = \bigcup_{X \in S} \alpha_X</math>
we can prove that this is a local one-parameter family of homeomorphisms.<ref>Mather 2012, pp. 496.</ref>
Firstly, it is clear that
# <math display="inline">0 \times Z \subseteq J</math> and <math display="inline">\alpha(0, v) = v</math> for all <math display="inline">v \in Z</math>.
# If <math display="inline">v \in Z</math> then <math display="inline">J_v = J \cap (\R \times v) \subseteq \R</math> is an open interval <math display="inline">(a_v, b_v)</math>, possibly infinite at one or both ends.
# If <math display="inline">v \in Z</math> and <math display="inline">t, s, t + s</math> are in <math display="inline">(a_v, b_v)</math> then <math display="inline">\alpha(t + s, v) = \alpha(t, \alpha(s, v))</math>.<ref>Mather 2012, pp. 495.</ref>
Secondly, it is clear that <math display="inline">\eta</math> generates <math display="inline">\alpha</math> because
# Each stratum <math display="inline">X</math> of <math display="inline">Z</math> is invariant under <math display="inline">\alpha</math>, i.e. <math display="inline">\alpha[J \cap (\R \times X)] \subseteq X</math>.
# For each <math display="inline">v \in Z</math>, the map <math display="inline">t \to \alpha(t, v)</math> of <math display="inline">(a_v, b_v)</math> into the stratum which contains <math display="inline">v</math> is <math display="inline">C^1</math>.
# For any <math display="inline">(t, v) \in Z</math>(?) we have <math display="inline">d/dt \alpha(t, v) = \eta(\alpha(t, v))</math>.<ref>Mather 2012, pp. 495.</ref>
It is unique because each <math display="inline">(J_X, \alpha_X)</math> is unique. We just need to prove that <math display="inline">J</math> is open, <math display="inline">\alpha</math> is continuous, and for any <math display="inline">v \in Z</math> and any compact set <math display="inline">K \subseteq Z</math> there exists <math display="inline">\epsilon > 0</math> such that <math display="inline">\alpha(t, v) \notin K</math> if <math display="inline">t \in (a_v, a_v + \epsilon) \cup (b_v - \epsilon, b_v)</math>.<ref>Mather 2012, pp. 495.</ref>
For the latter-most condition, if it did not hold then there exists...<ref>Mather 2012, pp. 496-497.</ref>
We prove there is a homeomorphism <math display="inline">f: Z \to h^{-1}(0) \times \R</math> such that <math display="inline">\pi \circ f = h</math>, where <math display="inline">\pi: h^{-1}(0) \times \R \to \R</math> is projection to the second factor.
For the coordinate vector field <math display="inline">\partial</math> on <math display="inline">\R</math>, by [prop 9.1] there is a controlled vector field <math display="inline">\tilde\partial</math> such that <math display="inline">f_* \tilde\partial(v) = \partial(h(v))</math> for <math display="inline">v \in Z</math>. By [prop 10.1], <math display="inline">\tilde\partial</math> generates a local one-parameter group <math display="inline">(J, \alpha)</math> such that
<math display="block">h(\alpha(t,v)) = h(v) + t</math>
<math display="inline">h</math> is proper and [d] holds, so <math display="inline">J = \R \times Z</math>. If we define <math display="inline">f</math> as
<math display="block">f(v) = (\alpha(-t, v), h(v))</math>
then <math display="inline">f</math> maps <math display="inline">Z</math> into <math display="inline">h^{-1}(0) \times \R</math> and <math display="inline">\pi \circ f = h</math>. If we define <math display="inline">\bar f: h^{-1}(0) \times \R \to Z</math> as
<math display="block">\bar f(v, t) = \alpha(t, v)</math>
then <math display="inline">f \bar f = \bar f f = Id</math> and <math display="inline">f</math> is a homeomorphism.<ref>Mather 2012, pp. 497.</ref>
== Topology at critical points ==
Theorem: If there is a critical point <math display="inline">p</math> in the singular variety <math display="inline">\mathcal{V}</math> with critical value <math display="inline">v \in (a, b)</math> then the space <math display="inline">X_{\leq b}</math> is homotopic to<ref>Goresky and MacPherson 1988, pp. 174.</ref>
<math display="block">X_{\leq a} \cup [(D^{\lambda+1}, \partial D^{\lambda+1}) \times (\mathcal{L}_X, \partial \mathcal{L}_X)].</math>
Proof:<ref>Proof outline comes from Goresky and MacPherson 1988, pp. 174.</ref>
# <math display="inline">(X_{\leq b}, X_{\leq a})</math> is homeomorphic to <math display="inline">(X_{\leq v + \epsilon}, X_{\leq v -\epsilon})</math>. We can prove this by "moving wall" or Thom's Isotopy Lemma.<ref>Goresky and MacPherson 1988, pp. 90-91, 120.</ref>
# <math display="inline">X_{\leq v + \epsilon}</math> is homeomorphic to <math display="inline">X_{\leq v - \epsilon} \cup (J, K)</math>, where the latter is the local Morse data for <math display="inline">h</math> at <math display="inline">p</math>. We do this by moving the wall...<ref>Goresky and MacPherson 1988, pp. 95-96, 120-121.</ref>
# <math display="inline">(J, K)</math> is homeomorphic to <math display="inline">(D^{\lambda+1}, \partial D^{\lambda+1}) \times (\mathcal{L}_X, \partial \mathcal{L}_X)</math> (tangential data, normal data). Again, moving the wall...<ref>Goresky and MacPherson 1988, pp. 65-66, chapter 8, 121.</ref>
# The normal Morse data depends only on the differential <math display="inline">df(p)</math>.<ref>Goresky and MacPherson 1988, pp. 93.</ref>
# The normal Morse data has the homotopy type of <math display="inline">(\mathcal{L}_X, \partial \mathcal{L}_X)</math>.<ref>Goresky and MacPherson 1988, pp. 169.</ref>
=== Step 1 ===
We get this immediately(?) by Thom's Isotopy Lemma.
=== Step 2 ===
<ref>Goresky and MacPherson 1988, complex case on pp. 120-121 is extension of real case on pp. 95-96.</ref>
Step 1 works because <math display="inline">h</math> is a submersion at each point of the regions we are homeomorphing. This is not the case at critical points. We need some way by which a homeomorphism can pass through a critical point.
To prove a homeomorphism between two subsets <math display="inline">A</math> and <math display="inline">B</math> of <math display="inline">Z</math>, we project <math display="inline">Z</math> to some other space <math display="inline">N</math> (in our case <math display="inline">\R^n</math>) using some function <math display="inline">F</math>. We take subsets <math display="inline">Y_0</math> and <math display="inline">Y_1</math> of <math display="inline">N</math> such that <math display="inline">A = Z \cap F^{-1}(Y_0)</math> and <math display="inline">B = Z \cap F^{-1}(Y_1)</math>. We need to prove <math display="inline">Y_0</math> and <math display="inline">Y_1</math> are connected by a one-parameter family of regions <math display="inline">Y_t</math> [explain one-parameter family]. The criterion for such a family to exist is that the '''characteristic covectors''' of <math display="inline">F</math> are all nonzero on each stratum of <math display="inline">Y_t</math>.<ref>Goresky and MacPherson 1988, pp. 70.</ref>
At each point <math display="inline">x \in M</math> and <math display="inline">y \in N</math> there are '''tangent spaces''' <math display="inline">T_xM</math> and <math display="inline">T_yN</math>, a vector space whose zero is at the point <math display="inline">x</math> or <math display="inline">y</math> (resp.)
[picture of various tangent spaces]
In the case the <math display="inline">N = \R</math>, the tangent space <math display="inline">T_x\R</math> is just <math display="inline">\R</math> but whose origin is at <math display="inline">x</math>.
[picture of T_x\R]
Say <math display="inline">F(x) = y</math>, then the differential of the map <math display="inline">F</math> can be seen as a function whose input is a vector in the tangent space <math display="inline">T_xM</math> and whose output is a vector in the tangent space <math display="inline">T_yM</math>. [If I move this far on the tangent space of M how do I move in the tangent space of N?]
[picture]
[example for M = \R and N = \R?]
A function which takes as input a vector in the tangent space <math display="inline">T_xM</math> (say) and outputs a scalar (usually <math display="inline">\R</math>) is called a '''covector'''. The set of all covectors on <math display="inline">T_xM</math> is called the dual space of <math display="inline">T_xM</math> and is denoted <math display="inline">T^*_xM</math>. There are only a limited number of ways to express a covectors. For example, if our tangent space is two-dimensional then all covectors are of the form <math display="inline">ax + by</math> where <math display="inline">(x, y) \in T_xM</math>.
We take our space <math display="inline">M</math> and map it onto <math display="inline">\R^2</math> with the map <math display="inline">F(z) = (r(z), h(z))</math>, where <math display="inline">z \in M</math> and <math display="inline">r</math> is the square of the distance of <math display="inline">z</math> to the critical point <math display="inline">p</math>.
[graph of mapping]
In this case, the covectors on the tangent space <math display="inline">T_xM</math> are of the form <math display="inline">adf(x) + bdr(x)</math> (in this case <math display="inline">df</math> and <math display="inline">dr</math> are maps to <math display="inline">\R</math>) and on <math display="inline">T_y\R^2</math> are of the form <math display="inline">cu + dv</math> (for <math display="inline">(u, v) \in \R^2</math>). A covector <math display="inline">cu + dv \in T^*_{(u, v)}\R^2</math> is called a '''characteristic covector''' of <math display="inline">F</math> if <math display="inline">F(x) = (u, v)</math> and <math display="inline">cdf(x) + ddr(x) = 0</math> for all vectors in the tangent space of the stratum containing <math display="inline">p</math>.<ref>Goresky and MacPherson 1988, pp. 82.</ref> [explain adf(x) + bdr(x) in terms of this being a function which takes a vector input]
[example of where covectors do and do not vanish on a stratified space, pp. 71?]
What we want is a homeomorphism in <math display="inline">M</math> between the space <math display="inline">Z_{\leq \epsilon}</math> and <math display="inline">Z_{\leq \epsilon} \cup B</math>, where <math display="inline">B</math> is a small region of the critical point <math display="inline">p</math>. The '''local Morse data''' is
<math display="block">((B_\delta \cap Z) \cap f^{-1}[v-\epsilon, v+\epsilon], (B_\delta \cap Z) \cap f^{-1}(v-\epsilon))</math>
where <math display="inline">B_\delta</math> is a closed disc in <math display="inline">M</math> of radius <math display="inline">\delta</math>.<ref>Goresky and MacPherson 1988, pp. 63-64.</ref> Observe that this is the pair <math display="inline">(F^{-1}(\text{Box}(\delta, \epsilon)), F^{-1}(\text{Bottom}(\delta, \epsilon)))</math><ref>Goresky and MacPherson 1988, pp. 91.</ref> [explain Box, Bottom, etc.]
[picture of the two subspaces of Z in M]
We use our map <math display="inline">F</math> to convert these two subspaces to subspaces of <math display="inline">\R^2</math> which are of the form <math display="inline">Y_1 = \{(x,y) \in \R^2 | y \leq \epsilon\}</math> and <math display="inline">Y_0 = \{(x,y) \in \R^2 | y \leq -\epsilon\} \cup \{(x,y) \in \R^2 | x \leq \delta, y \leq \epsilon\}</math>, such that <math display="inline">Z_{\leq \epsilon} = F^{-1}(Y_1)</math> and <math display="inline">Z_{\leq \epsilon} \cup B = F^{-1}(Y_0)</math>.<ref>Goresky and MacPherson 1988, pp. 95-96.</ref>
We use a homeomorphism between <math display="inline">Y_1</math> and <math display="inline">Y_0</math> using the technique of "moving the wall" and Thom's Isotopy Lemma. Such a homeomorphism exists when the characteristic covectors of <math display="inline">F</math> are all nonzero on each stratum of <math display="inline">Y_t</math>.<ref>Goresky and MacPherson 1988, chapter 4, particularly pp. 71-72.</ref>
Given a smooth mapping between manifolds <math display="inline">F: M \to N</math> (for example, in our case we could have <math display="inline">N = \R^2</math>) and that <math display="inline">F|Z: Z \to N</math> is proper. Let <math display="inline">Y \subset N \times \R</math> be a closed Whitney stratified subset such that the projection to the second factor <math display="inline">\pi: Y \to \R</math> is a proper stratified submersion.<ref>Goresky and MacPherson 1988, pp. 71.</ref>
Suppose for each <math display="inline">t \in \R</math>, for each <math display="inline">p \in F(Z) \cap Y_t</math>, and for each nonzero characteristic covector <math display="inline">\lambda \in T^*_pN</math> of <math display="inline">F|Z</math>, the restriction of <math display="inline">\lambda</math> to the subspace <math display="inline">T_pS_t = \ker(d\pi(p)) \cap T_pS</math> is nonzero, where <math display="inline">S</math> is a stratum of <math display="inline">Y</math> which contains <math display="inline">(p, t)</math> and <math display="inline">S_t = \pi^{-1}(t) \cap S</math> is the stratum of <math display="inline">Y_t = \pi^{-1}(t) \cap Y</math> which contains <math display="inline">p</math>. This is equivalent to the statement that, for each <math display="inline">t \in \R</math>, the restriction <math display="inline">F|Z</math> is transverse to <math display="inline">Y_t</math>.<ref>Goresky and MacPherson 1988, pp. 71-72.</ref>
This means that, for each <math display="inline">t \in \R</math>, <math display="inline">Z \cap F^{-1}(Y_t)</math> is stratified by its intersection with the strata of <math display="inline">Z</math>...
We finally prove there is a homeomorphism between <math display="inline">Z \cap F^{-1}(Y_0) \cong Z \cap F^{-1}(Y_1)</math> which preserves the Whitney stratification of both sides and is smooth on each stratum.
For the composition
<math display="block">Z \times \R \subset M \times \R \to_{F \times I} Y \subset \R^2 \times \R \to_{\pi} \R</math>
where <math display="inline">Y(t, z) = Y_t(z)</math>, <math display="inline">I</math> is the identity and <math display="inline">\pi</math> is projection to the second factor.
<math display="inline">Z \times \R</math> is transverse to <math display="inline">(F \times I)^{-1}(Y)</math>...
The composition <math display="inline">\pi \circ (F \times I): Z \times \R \cap (F \times I)^{-1}(Y) \to \R</math> is a stratified submersion because
* The input domain is stratified as above...,
* We have defined <math display="inline">F|Z</math> to be transverse to <math display="inline">Y</math>, and therefore it preserves the stratification (unless <math display="inline">F(Z) \cap Y = \empty</math>), and
* We defined above the projection on <math display="inline">Y</math> to be a stratified submersion, meaning it is a submersion on each stratum of <math display="inline">F(Z) \cap Y</math>.<ref>Goresky and MacPherson 1988, pp. 43.</ref>
Therefore, we can apply Thom's Isotopy Lemma which says there is a homeomorphism between the level sets of <math display="inline">Z \times \R</math>...<ref>Goresky and MacPherson 1988, pp. 72.</ref>
=== Step 3 ===
==== Characteristic covectors ====
==== Fringed sets ====
When manipulating our domain of integration[?], we need to make sure we are doing this in regions with no characteristic covectors. The introduce the concept of a fringed set, a subset of <math display="inline">R^2</math>, and construct a series of fringed sets which contain no characteristic covectors.
A '''fringed set''' <math display="inline">A \subset \R \times \R^+</math> is an open subset of the first quadrant of <math display="inline">\R^2</math>. <math display="inline">A</math> is fringed over <math display="inline">0 < y \ll x</math> if for some interval <math display="inline">S = (0, x)</math>
# the projection of <math display="inline">A</math> to the first factor is equal to <math display="inline">S</math>,
# <math display="inline">A</math> is open in <math display="inline">S \times \R^+</math>,
# if <math display="inline">(s, y) \in A</math> and <math display="inline">0 < y' \leq y</math> then <math display="inline">(s, y') \in A</math>.<ref>Goresky and MacPherson 1988, pp. 77.</ref>
[picture]
The fringed set <math display="inline">A^\flat</math> is the set <math display="inline">A</math> plus its reflection about the <math display="inline">x</math> axis.<ref>Goresky and MacPherson 1988, pp. 82.</ref>
[picture]
We build a series of fringed sets which do not contain characteristic covectors, which will be used later in our proof.
There exists a fringed set <math display="inline">A_2</math> of type <math display="inline">0 < v \ll u</math> such that for any <math display="inline">z \in Z</math> such that <math display="inline">r\pi(z) \leq r_2</math>, the map <math display="inline">(\rho, f - f\pi)|\pi^{-1}(\pi(z)): \pi^{-1}(\pi(z)) \to \R^2</math> has no characteristic covectors in <math display="inline">A^\flat_2</math>.<ref>Goresky and MacPherson 1988, pp. 84.</ref>
Given that the set of points <math display="inline">(u, v) \in \R^2</math> which have a nonzero characteristic covector is closed, then it is enough to prove it for points <math display="inline">(u, 0) \in \R^2</math>. Proof by contradiction. Assume it is false and that there is a sequence of points <math display="inline">p_i \in Z \cap f^{-1}(0)</math> converging to <math display="inline">p</math> such that <math display="inline">d\rho(p_i)</math>, <math display="inline">df(p_i)</math> and <math display="inline">df\pi(p_i)</math> are linearly dependent when restricted to the stratum <math display="inline">Y</math> which contains <math display="inline">p_i</math>. This would mean that <math display="inline">f</math> has a critical point on <math display="inline">Y \cap \partial B_{\rho(p_i)}(p)</math>.<ref>Goresky and MacPherson 1988, pp. 82-83.</ref>
By restricting to a subsequence if necessary, we may assume the points <math display="inline">p_i</math> are all contained in the same stratum <math display="inline">Y</math>, that the tangent planes <math display="inline">T_{p_i}Y</math> converge to some plane <math display="inline">Q</math> and the secant lines <math display="inline">\mathcal{l}_i = \overline{p_i p}</math> converge to some line <math display="inline">\mathcal{l}</math>. By the Whitney conditions [how?], <math display="inline">Q = \lim_{i \to \infty} \mathcal{l}_i \oplus T_{p_i}(Y \cap \partial B_\delta(p))</math>.<ref>Goresky and MacPherson 1988, pp. 83.</ref>
==== Homeomorphism ====
We prove there is a stratum preserving homeomorphism between<ref>Goresky and MacPherson 1988, pp. 65.</ref>
<math display="block">\text{Local Morse Data} \cong (\text{Tangential Morse Data}) \times (\text{Normal Morse Data})</math>
We first prove that there is a homeomorphism between the product of the normal and tangential Morse data and the '''realisation''' of the following diagram
[diagram from pp. 102]
where realisation means
<math display="block">Z \cap (g_1, h_1)^{-1}(P_a) \cap (g_2, h_2)^{-1}(P_b)</math>
where all the intersections of strata (of <math display="inline">Z</math>?) are transverse.<ref>Goresky and MacPherson 1988, pp. 100-102.</ref>
The realisation of the above diagram is equal to
<math display="block">(V_1, V_2) \cap (W_1, W_2) = (V_1 \cap W_1, V_1 \cap W_2 \cup V_2 \cap W_1)</math>
where
<math display="block">V_1 = \{ z \in Z : |f(z) - f\pi(z)| \leq \epsilon/4, r\pi(z) \leq \delta, \rho(z) \leq \delta \}</math>
<math display="block">V_2 = \{ z \in Z : f(z) - f\pi(z) = -\epsilon/4, r\pi(z) \leq \delta, \rho(z) \leq \delta \}</math>
<math display="block">W_1 = \{ z \in Z : |f\pi(z)| \leq 3\epsilon/4, r\pi(z) \leq \delta \}</math>
<math display="block">W_1 = \{ z \in Z : f\pi(z) = -3\epsilon/4, r\pi(z) \leq \delta \}</math>
where <math display="inline">\pi</math> is the projection from the tubular neighbourhood to <math display="inline">Z</math>, <math display="inline">r(z)</math> is the square of the distance between <math display="inline">z</math> and the critical point <math display="inline">p</math> and <math display="inline">\rho(z)</math> is the square of the distance between <math display="inline">z</math> and <math display="inline">\pi(z)</math>.<ref>Goresky and MacPherson 1988, pp. 100-101.</ref> <math display="inline">\epsilon \ll \delta</math> are chosen so that <math display="inline">(\delta, \epsilon)</math> is in the set <math display="inline">A^\flat_6</math> which consists of <math display="inline">A_6 \subset \R^+ \times \R^+</math> with the properties that for <math display="inline">(\epsilon, \delta) \in A_6</math> and <math display="inline">z</math> such that <math display="inline">\rho(z) = \delta</math>, <math display="inline">r\pi(z) = \delta</math>, <math display="inline">|f(z)| \leq \epsilon</math> and <math display="inline">|f\pi(z)| \leq \epsilon</math> then the covectors <math display="inline">d\rho(z)</math>, <math display="inline">dr\pi(z)</math>, <math display="inline">df(z)</math> and <math display="inline">df\pi(z)</math> are linearly independent when restricted to <math display="inline">T_zY</math> (where <math display="inline">Y</math> is the stratum containing <math display="inline">z</math>). We can prove such a set exists.<ref>Goresky and MacPherson 1988, pp. 89.</ref> <math display="inline">A^\flat_6</math> is this plus its reflection about the <math display="inline">x</math> axis.<ref>Goresky and MacPherson 1988, pp. 82.</ref>
Let <math display="inline">D = \{ x \in X | r(x) \leq \delta \}</math> for stratum <math display="inline">X</math>. We will show there is a local trivial fibration of the configuration: <math display="inline">(V_1, V_2)</math> fibres over <math display="inline">D</math> and is homeomorphic to <math display="inline">D \times (\text{normal Morse data})</math>
(V_1, V_2) -> D \times (normal Morse data)
| /
--> D <---
and that <math display="inline">(W_1, W_2)</math> fibres over the tangential Morse data and is homeomorphic to <math display="inline">(\text{tangential Morse data}) \times (\text{normal slice})</math>.
For <math display="inline">Z_1 = \{ z \in Z : r\pi(z) \leq \delta \}</math>, the map <math display="inline">F(z): Z_1 \to \R^2 = (\rho(z), f(z) - f\pi(z))</math> is transverse to each stratum of <math display="inline">\text{Box}(\delta, \epsilon/4)</math>, [list], [by lemma 6.5]. <math display="inline">(V_1, V_2) = F^{-1}(\text{Box}(\delta, \epsilon/4), \text{Bottom}(\delta, \epsilon/4))</math>. For each stratum <math display="inline">S</math> of Box and each <math display="inline">x \in D</math>, we have transverse intersection <math display="inline">F^{-1}(S) \pitchfork \pi^{-1}(x)</math>. Therefore, <math display="inline">\pi|F^{-1}(S)</math> is a submersion and by Thom's isotopy lemma the projection <math display="inline">\pi|F^{-1}(\text{Box}(\delta, \epsilon/4): F^{-1}(\text{Box}(\delta, \epsilon/4)) \to X</math> is a stratified fibre bundle over <math display="inline">D</math>. The fibre over the critical point <math display="inline">p</math> is <math display="inline">\pi^{-1}(p) \cap (F^{-1}(\text{Box}(\delta, \epsilon/4), F^{-1}(\text{Bottom}(\delta, \epsilon/4))</math> and is equal to the normal Morse data...<ref>Goresky and MacPherson 1988, pp. 101.</ref>
Take <math display="inline">G: X \to \R^2 = (r(x), f(x))</math>. <math display="inline">\delta</math> and <math display="inline">\epsilon</math> have been chosen so that <math display="inline">(G^{-1}(\text{Box}(\delta, \epsilon/4), G^{-1}(\text{Bottom}(\delta, \epsilon/4))</math> is the tangential Morse data for <math display="inline">f</math> and is contained in the region <math display="inline">D</math> over which <math display="inline">\pi|(V_1, V_2)</math> is a stratified fibre bundle. Therefore, <math display="inline">(W_1, W_2) = \pi^{-1} G^{-1}(\text{Box}(\delta, \epsilon/4), \text{Bottom}(\delta, \epsilon/4))</math> is transverse to <math display="inline">(V_1, V_2)</math>.<ref>Goresky and MacPherson 1988, pp. 101-102.</ref>
Finally, this means that <math display="inline">(V_1, V_2) \cap (W_1, W_2)</math> is homeomorphic (by stratum preserving homeomorphism) to <math display="inline">(\pi^{-1}(p), \cap (V_1, V_2)) \times \pi(W_1, W_2)</math>, the product of normal and tangential Morse data.<ref>Goresky and MacPherson 1988, pp. 102.</ref>
We use a succession of such diagrams to interpolate between the box diagram which defines local Morse data [explain] and the above diagram whose realisation we have just proven is <math display="inline">(\text{normal Morse data}) \times (\text{tangential Morse data})</math>.
[diagram_d0.py]
The realisation is the local Morse data. This is equal to the realisation of the diagram below.<ref>Goresky and MacPherson 1988, pp. 103, 106.</ref>
[diagram_d11.py]
The realisation of the first diagram [d0] is equivalent to the realisation of the below diagram.
[diagram_d1.py]
In the right-hand picture of the above diagram, we have put a dotted outline around the region <math display="inline">A^{\flat}_1</math>. We prove that there are no characteristic covectors for <math display="inline">(r, f): Z \to \R^2</math> in this region and can, therefore, move the wall in this region...<ref>Goresky and MacPherson 1988, pp. 82-83.</ref>
By adding a zero-dimensional stratum at the top right corner of the right-hand picture. A one-parameter family of pictures <math display="inline">P_b(t)</math> gives rise to a stratified space <math display="inline">Y \subset M \times \R</math> such that
<math display="block">Y = \{ (z, t) \in M \times \R : (r, f)(z) \in P_b(t) \}.</math>
<math display="inline">(r, f)</math> takes each stratum of <math display="inline">Z</math> transversally to each stratum of each <math display="inline">Y_t</math>. <math display="inline">(f \circ \pi, f)^{-1}(P_a) = f^{-1}[-\epsilon, \infty)</math> is transverse to each stratum of <math display="inline">Y_t \cap Z</math>. Therefore, there is a homeomorphism between<ref>Goresky and MacPherson 1988, pp. 107.</ref>
<math display="block">Z(D_1) = Z \cap (f \circ \pi, f)^{-1}(P_a) \cap (r, f)^{-1}(P_b(0))</math>
and
<math display="block">Z(D_1) = Z \cap (f \circ \pi, f)^{-1}(P_a) \cap (r, f)^{-1}(P_b(1)).</math>
To go from D_2 to D_3 we find the characteristic covectors of <math display="inline">(f\pi, f): V \to \R^2</math> where <math display="inline">V = (r, f)^{-1}(P_b(1))</math>. We stratify <math display="inline">P_b(1)</math> by its interior <math display="inline">P</math> and boundary <math display="inline">\partial P</math>.<ref>Goresky and MacPherson 1988, pp. 107.</ref>
The strata of <math display="inline">V</math> come in four types:
# <math display="inline">(r, f)^{-1}(P) \cap X</math>
# <math display="inline">(r, f)^{-1}(P) \cap Y</math>
# <math display="inline">(r, f)^{-1}(\partial P) \cap X</math>
# <math display="inline">(r, f)^{-1}(\partial P) \cap Y</math>
where <math display="inline">X</math> is the strata that contains the critical point and <math display="inline">Y</math> is any other strata such that <math display="inline">Y > X</math>.
All characteristic covectors are of the form <math display="inline">\lambda = (u, v, adu + bdv) \in T^*\R^2</math>.
For strata 1 and 3, the image of <math display="inline">X</math> under <math display="inline">(f\pi, f)</math> is the diagonal <math display="inline">f\pi = f</math> (dotted outline). Therefore, the characteristic covectors of any point <math display="inline">z</math> in <math display="inline">X</math> are either where <math display="inline">z = p</math>, in which case the covector is zero(?), or where <math display="inline">z \neq p</math>, in which case <math display="inline">u = v</math> and <math display="inline">a = b</math>.<ref>Goresky and MacPherson 1988, pp. 107-108.</ref>
For strata 2, being that the critical point is isolated and non-degenerate, which means it, and any neighbourhood, is not zero on any limit of tangent spaces in strata <math display="inline">Y > X</math>. Therefore, <math display="inline">f</math> and <math display="inline">f\pi</math> are linearly independent.<ref>Goresky and MacPherson 1988, pp. 84.</ref> Unless <math display="inline">\pi(z) = p</math>, in which case <math display="inline">d(f\pi)(z) = f\pi(z) = 0</math>, so they are covectors where <math display="inline">u = 0</math> and <math display="inline">b = 0</math>.<ref>Goresky and MacPherson 1988, pp. 108.</ref>
For strata 4, we can use implicit function theorem to generate local coordinates <math display="inline">y_1, \cdots y_{r-s-1}</math> in <math display="inline">Y > X</math> and define the Riemannian metric <math display="inline">r(z) = r\pi(z) + (f(z) - f\pi(z))^2 + g(y)</math> for some <math display="inline">g</math> depending only on <math display="inline">y</math>.
There are no characteristic covectors in <math display="inline">|u| \leq \epsilon</math> and <math display="inline">|v| < \epsilon</math>. By [lemma 6.7 and 6.8 and 8.1(d)] <math display="inline">df</math>, <math display="inline">df\pi</math> and <math display="inline">dr</math> are linearly independent in this region.<ref>Goresky and MacPherson 1988, pp. 109.</ref> Given <math display="inline">|f| \leq \epsilon</math> and <math display="inline">|f\pi| \leq \epsilon</math>, a fringed set <math display="inline">A^\flat_4</math> of type <math display="inline">0 < \epsilon \ll \delta</math> and assume that <math display="inline">\pi \neq p</math> and <math display="inline">z \notin X</math> then <math display="inline">(r(z), f(z)) \in A^\flat_4</math> and <math display="inline">(r(z), f\pi(z)) \in A^\flat_4</math>.<ref>Goresky and MacPherson 1988, pp. 87.</ref>
Outside of these points, the slope of <math display="inline">\ker(\lambda)</math> for any characteristic covector <math display="inline">\lambda</math> is
<math display="block">\frac{-a}{b} = \frac{f(z) - f\pi(z) - M}{\frac{\alpha}{\beta} + (f(z) - f\pi(z))}</math>
for <math display="inline">\alpha df + \beta dr = 0</math>.<ref>Goresky and MacPherson 1988, pp. 108-109.</ref>
== Morse theory ==
Steps(?)
* Explain topology
* Every point of a stratum is locally like a product structure (proved by Thom's Isotopy Lemma) [GM pp. 41-42]
** Including those around critical points, which are the product of normal and tangential Morse data (these are our quasi-local cycles?)
* Thom's Isotopy Lemma proves a strong deformation retraction (which only stops at critical points) [PWM pp. 541-542]
=== Homotopy ===
We want to replace our domain of convergence <math display="inline">M</math>, which is the complement of our singular variety <math display="inline">\mathcal{V}</math>, with an "equivalent" space <math display="inline">M'</math> which has better understood properties. We say "equivalent" because there are several different things we could mean by "equivalent" in this context. The equivalence we are referring to in this section is called '''homotopy'''.
Imagine two subspaces <math display="inline">\gamma_0</math> and <math display="inline">\gamma_1</math> of a space <math display="inline">Y</math> which are defined respectively by smooth functions <math display="inline">f, g: X \to Y</math>. If there exists a smooth function <math display="inline">h_s: X \times [0, 1] \to Y</math>, called a homotopy, such that <math display="inline">h_0 = f</math>, <math display="inline">h_1 = g</math> and for any <math display="inline">\epsilon > 0</math> there exists a <math display="inline">\delta_a</math> and <math display="inline">\delta_b</math> such that when <math display="inline">|s - s_0| < \delta_a</math> and <math display="inline">|x - x_0| < \delta_b</math> we have <math display="inline">|h_s(x) - h_{s_0}(x_0)| < \epsilon</math>, then we say <math display="inline">\gamma_0</math> and <math display="inline">\gamma_1</math> are '''homotopic'''.<ref>Henle 1979, pp. 251-252.</ref>
Below is an example where <math display="inline">\gamma_0</math> and <math display="inline">\gamma_1</math> are one-dimensional curves and <math display="inline">H(t, s) = h_s(t)</math>.
[[File:Homotopy_curves.png|300px]]
In [[#Homotopy_equivalence|Appendix A]], we formally prove that we can construct an equivalent space <math display="inline">M'</math>. We provide only an example to give some intuition before describing how to construct the space <math display="inline">M'</math> in terms of local cycles around critical points.
=== Motivating example ===
Imagine a torus and a height function which is just the z value of the point.
[[File:3D-Leveltorus.png|200px]]
It has four critical points: two at the top and bottom of the outer circle (<math display="inline">p_1, p_4</math>) and two at the top and bottom of the inner circle (<math display="inline">p_2, p_3</math>).
[picture]
When the height is between the <math display="inline">p_1</math> and <math display="inline">p_2</math>, the space is a two-cell, which can be retracted to a point.
[picture]
When the height is between <math display="inline">p_2</math> and <math display="inline">p_3</math>, the space is a cylinder, which can be retracted to a two-cell with a one-cell attached.
[[File:3D-Cylinder_and_disk_with_handle.png|200px]]
When the height is between <math display="inline">p_3</math> and <math display="inline">p_4</math>, the space is a torus with a disc removed, which can be retracted to a cylinder with a one-cell attached.
[[File:3D-Cylinder_with_handle_and_torus_with_hole.png|200px]]
When the height is greater than <math display="inline">p_4</math>, then the full torus is constructed by attaching a two-cell.
[Explain in terms of Morse data and Morse index?]
=== Morse data and quasi-local cycles ===
As in the above example, we start at the "bottom" of <math display="inline">M</math> and build upwards until just before we reach our first critical point <math display="inline">p</math>.
;Smooth points
:This is a tube around a <math display="inline">(d-1)</math>-chain <math display="inline">\gamma</math> where the height function <math display="inline">h</math> is maximised at <math display="inline">p</math>.<ref>Pemantle, Wilson and Melczer 2024, pp. 223.</ref>
:For example, if <math display="inline">F(x, y) = \frac{1}{1 - x - y}</math> then <math display="inline">\lambda = 1</math> and <math display="inline">B^\lambda</math> is an arc reaching its highest point at <math display="inline">p</math>.
:The normal plane <math display="inline">N</math> at <math display="inline">p</math> is a plane orthogonal to <math display="inline">B^1</math>(?).
:Its normal link <math display="inline">L(S)</math> is a circle with two points missing where it intersects <math display="inline">\mathcal{V}</math>.
:We make our quasi-local cycle out of the product of the arc and circle joined to <math display="inline">M_-</math> at points below <math display="inline">M_-</math>.
:With the exception of degenerate points, such as monkey saddles...<ref>e.g. Pemantle, Wilson and Melczer 2024, pp. 211.</ref>
;Transverse multiple points
:This is the product of a <math display="inline">k</math>-torus and a <math display="inline">(d-k)</math>-chain <math display="inline">\gamma</math>. The torus is the product of circles about <math display="inline">p</math> in the complex normal space to each strata which intersects <math display="inline">p</math>. The chain <math display="inline">\gamma</math> is supported in the stratum which is the common intersection of the varieties defined by the factors vanishing at <math display="inline">p</math>, and achieves its maximum height at <math display="inline">p</math>.<ref>Pemantle, Wilson and Melczer 2024, pp. 223-224.</ref>
;Arrangement multiple point
:This is the product of a <math display="inline">(d-k)</math>-chain <math display="inline">\gamma</math> and several <math display="inline">k</math>-tori, one for each pair of sheets which intersect transversely, where the torus is the product of circles about <math display="inline">p</math> in each sheet.<ref>Pemantle, Wilson and Melczer 2024, pp. 226.</ref>
;Cone point
:A cone point is zero-dimensional so there is no <math display="inline">\gamma</math>, just a <math display="inline">d</math>-torus about <math display="inline">p</math>.<ref>Pemantle, Wilson and Melczer 2024, pp. 227.</ref>
== Notes ==
{{Reflist}}
== References ==
* {{cite book | last1=Goresky | first1=Mark | last2=MacPherson | first2=Robert | title=Stratified Morse Theory | publisher=Springer-Verlag | year=1988 | url=https://www.math.ias.edu/~goresky/pdf/SMT.djvu }}
* {{cite book | last=Henle | first1=Michael | title=A Combinatorial Introduction to Topology | publisher=Dover Publications Inc. New York | year=1979 }}
* {{citation | last=Mather | first=John | title=Notes on Topological Stability | year=2012 | journal=Bulletin of the American Mathematical Society | volume=49 | number=4 | pages=475-506 | url=https://www.ams.org/journals/bull/2012-49-04/S0273-0979-2012-01383-6/S0273-0979-2012-01383-6.pdf }}.
* {{cite book | last1=Pemantle | first1=Robin | last2=Wilson | first2=Mark C. | last3=Melczer | first3=Stephen | title=Analytic Combinatorics in Several Variables | publisher=Cambridge University Press | year=2024 | edition=2nd | url=https://acsvproject.com/PemantleWilsonMelczer23.pdf }}
a59sphoneaai5k352gi0k70xhf811tg
4676707
4676705
2026-10-18T08:38:35Z
Dom walden
3209423
/* Fringed sets */ Finish(?) proof of A_2
4676707
wikitext
text/x-wiki
== Introduction ==
Morse theory tells us that the topology of M only changes at its critical points.
The "Morse data" tells us the topology at each critical point.
Attaching this Morse data together gives us a space which is homopotically eqivalent to M.
This space is a "cell complex", which has an easy to calculate homology.
Theorem: Our domain of convergence is homotopic to a cell complex of dimension at most <math display="inline">2n - d - 1</math>.<ref>This is theorem D.23 in Pemantle, Wilson and Melczer 2024, pp. 546. Also theorem in section 1.2*/5.2* in SMT pp. 200.</ref>
Proof:
# <math display="inline">X</math> is our entire domain, <math display="inline">\mathcal{V}</math> our variety
# Project our entire domain to complex projective space <math display="inline">Z = \pi(X) \subset \C\mathbb{P}^n - H</math> [define H]
# Define a linear subspace <math display="inline">G \subset \C\mathbb{P}^n</math> of dimension <math display="inline">d - 1</math>
# Define a Morse function on <math display="inline">f: \C\mathbb{P}^n \to \R</math> which approximates the distance from <math display="inline">G</math> and such that <math display="inline">f^{-1}(0) = G</math> and <math display="inline">f^{-1}(1) = H</math>
# We "build" <math display="inline">X - \mathcal{V}</math> from <math display="inline">\pi^{-1}(G \cap Z) \cap (X - \mathcal{V})</math> by attaching CW complexes at critical points which are of at most dimension <math display="inline">2n - d - 1</math>
# At a critical point, the normal Morse data is <math display="inline">(J, K) = \coprod_x (J_x, K_x)</math> and the relative complex link is <math display="inline">\mathcal{L}^\pi = \coprod_x \mathcal{L}_x</math>
# We show that the quotient <math display="inline">J_x/K_x</math> is homotopic to a CW complex of dimension <math display="inline">\leq 2n - d - 1</math>
# The neighbourhood of <math display="inline">x</math> in <math display="inline">J_x</math> is homeomorphic to the cone in <math display="inline">L_x(X - \mathcal{V})</math>, and removing the point <math display="inline">x</math> increases the homotopy dimension to at most the homotopy dimension of <math display="inline">L_x</math>
# <math display="inline">(J_x \cup \{x\}, K_x)</math> is homotopic to <math display="inline">(\text{cone}(\mathcal{L}_x), \mathcal{L}_x)</math>
# <math display="inline">\mathcal{L}_x</math> is homotopic to a CW complex of dimension at most <math display="inline">2n - d - 1</math>
# The tangential Morse data at the critical point is homotopic to the pair <math display="inline">(D^\lambda, \partial D^\lambda)</math>
# Therefore, at each critical point a space has been added homotopic to a CW complex of dimension at most <math display="inline">2n - d - 1</math>.
Theorem: If <math display="inline">X</math> is the complement in <math display="inline">\C^n</math> of a complex variety <math display="inline">\mathcal{V}</math> of dimension <math display="inline">d</math> then <math display="inline">X</math> is homotopic to a CW complex of dimension at most <math display="inline">2n - d - 1</math>.<ref>Pemantle, Wilson and Melczer 2024, pp. 546.</ref>
Proof:
# We build <math display="inline">X</math> by attaching cells of dimension at most <math display="inline">2n - d - 1</math> at each critical point.
## Prove that we can do this without changing the homotopy(?)
## We use Thom's Isotopy Lemma to prove that there is a strong deformation retraction, stopping only at critical points.
# Prove these cells are a product of the normal and tangential Morse data.
## Normal data: <math display="inline">(\mathcal{L}(S), \partial \mathcal{L}(S)) \times (D^1, \partial D^1)</math> [GM pp. 18]
## Tangential data: <math display="inline">(B_\delta \cap f^{-1}[v - \epsilon, v + \epsilon], B_\delta \cap f^{-1}(v - \epsilon))</math> for <math display="inline">f</math> restricted to <math display="inline">X</math> (or <math display="inline">\mathcal{V}</math>?) [GM pp. 63-64]
# If <math display="inline">k</math> is the dimension of the strata, then
## If <math display="inline">k = d</math> then it is a smooth point and the cell is the product of <math display="inline">S^{2(n-d)-1}</math> and the tangential data is dimension at most <math display="inline">d</math>.
## If <math display="inline">k < d</math>, ...
<ref>Pemantle, Wilson and Melczer 2024, pp. 547.</ref>
== Example in one dimension ==
Domain with singularities v_1, v_2, ..., v_i
Define our height function f...
Start with our entire domain X
Reduce from X to X_i+ by using Thom's Isotopy lemma to do a strong deformation retract
== Thom's isotopy lemma ==
We present a modified version of Thom's (first) isotopy lemma, less general than the original but more obviously relevant to our situation.
Theorem: Suppose <math display="inline">Z</math> is a closed subset of a smooth manifold <math display="inline">M</math> which admits a Whitney stratification and <math display="inline">h : M \to \R</math> is a proper Morse function which has no critical values on <math display="inline">Z</math>. Then, the level sets of <math display="inline">Z</math> are homeomorphic by a homeomorphism that preserves the strata of <math display="inline">Z</math>.<ref>For various versions of the full statement of the theorem, see Mather 2012, pp. 499, Goresky and MacPherson 1988, pp. 41, or Pemantle, Wilson and Melczer 2024, pp. 541.</ref>
Proof:
# Construct control data for <math display="inline">Z</math> compatible with <math display="inline">h</math>.
## [Prop 7.1] If <math display="inline">h</math> is smooth on <math display="inline">Z</math> and is a submersion for each strata then there exists a family of control data for <math display="inline">Z</math> compatible with <math display="inline">h</math>.<ref>Mather 2012, pp. 488.</ref>
# This makes <math display="inline">Z</math> an abstract stratified set and <math display="inline">f</math> a controlled submersion.
# A controlled submersion has, for any smooth vector field on <math display="inline">\R</math>, a controlled vector field on <math display="inline">Z</math> (a "lift"?)<ref>Mather 2012, pp. 493.</ref>
# A controlled vector field has a unique one-parameter family of homeomorphisms of <math display="inline">Z</math> which commute with <math display="inline">h</math>.<ref>Mather 2012, pp. 496.</ref>
# This makes <math display="inline">h</math> a locally trivial fibration. [Prop 10.2]<ref>Mather 2012, pp. 499.</ref>
Control data:
A system of '''control data''' for <math display="inline">Z</math> consists of, for each stratum <math display="inline">X</math> of <math display="inline">Z</math>,
* a '''tubular neighbourhood''' <math display="inline">T_X</math> of <math display="inline">X</math>
* a '''tubular projection function''' <math display="inline">\pi_X: T_X \to X</math>, and
* a '''tubular distance function''' <math display="inline">\rho_X: T_X \to \R</math> such that <math display="inline">\rho_X^{-1}(0) = X</math><ref>Goresky and MacPherson 1988, pp. 42.</ref>
[illustration]
such that if <math display="inline">X < Y</math> are strata in <math display="inline">Z</math>, then
<math display="block">\pi_X \pi_Y(m) = \pi_X(m),</math>
<math display="block">\rho_X \pi_Y(m) = \rho_X(m)</math>
for all <math display="inline">m \in |T_X| \cap |T_Y|</math> such that <math display="inline">\pi_Y(m) \in |T_X|</math>.
If, for all strata <math display="inline">X</math> and all <math display="inline">m \in |T_X|</math>, we have <math display="inline">h \pi_X(m) = h(m)</math>, then this control data will be said to be compatible with <math display="inline">h</math>.<ref>Mather 2012, pp. 488.</ref>
We prove that if <math display="inline">h</math> is smooth on <math display="inline">Z</math> and is a submersion for each strata then there exists a family of control data for <math display="inline">Z</math> compatible with <math display="inline">h</math>.<ref>Mather 2012, pp. 488, prop 7.1.</ref>
Let <math display="inline">Z_k</math> be the union of strata of <math display="inline">Z</math> of dimension less than <math display="inline">k</math>. We prove by induction on <math display="inline">k</math>.
To construct the tubular neighbourhood <math display="inline">T_X</math> of a stratum <math display="inline">X</math> of dimension less than <math display="inline">k</math>. For <math display="inline">l \leq k</math>, let <math display="inline">U_l</math> denote the union of all <math display="inline">|T_Y|</math> for <math display="inline">Y < X</math> and <math display="inline">\dim Y \geq l</math>. Let <math display="inline">X_l = U_l \cap X</math>.<ref>Mather 2012, pp. 489.</ref>
For <math display="inline">l = k</math>, <math display="inline">X_k = \empty</math>. Assume by induction that <math display="inline">T_{l+1}</math> has been constructed and that if <math display="inline">Y < X</math>, <math display="inline">\dim Y \geq l + 1</math>, <math display="inline">m \in |T_{l+1}| \cap |T_Y|</math> and <math display="inline">\pi_{l+1}(m) \in |T_Y|</math> (<math display="inline">\pi_{l+1} = \pi_{T_{l+1}}</math>) then<ref>Mather 2012, pp. 489-490.</ref>
<math display="block">\rho_Y \pi_{l+1}(m) = \rho_Y(m),</math>
<math display="block">\pi_Y \pi_{l+1}(m) = \pi_Y(m).</math>
We wish to construct a tubular neighbourhood <math display="inline">T_{X,Y}</math> of <math display="inline">|T_Y| \cap X</math> whose restriction to <math display="inline">|T_Y| \cap X_{l+1}</math> is isomorphic to the restriction of <math display="inline">T_{l+1}</math> such that if <math display="inline">m \in |T_{X,Y}| \cap |T_Y|</math> and <math display="inline">\pi_{X,Y}(m) \in |T_Y|</math> (<math display="inline">\pi_{X,Y} = \pi_{T_{X,Y}}</math>) then
<math display="block">\rho_Y \pi_{X,Y}(m) = \rho_Y(m),</math>
<math display="block">\pi_Y \pi_{X,Y}(m) = \pi_Y(m).</math>
By shrinking <math display="inline">|T_Y|</math> if necessary, this relation is already satisfied if <math display="inline">m \in |T_{l+1}| \cap |T_Y|</math> and <math display="inline">\pi_{l+1}(m) \in |T_Y|</math> with <math display="inline">T_{l+1}</math> in place of <math display="inline">T_{X,Y}</math> and <math display="inline">\pi_{l+1}</math> in place of <math display="inline">\pi_{X,Y}</math>. By the definition, if <math display="inline">m \in |T_{l+1}|</math> then there exists <math display="inline">Z < X</math> with <math display="inline">\dim Z > l</math>, <math display="inline">m \in |T_Z|</math> and <math display="inline">\pi_{l+1}(m) \in |T_Z|</math>. We have that <math display="inline">\pi_{l+1}(m) \in |T_Y| \cap |T_Z|</math> and therefore <math display="inline">Y < Z</math>. Therefore<ref>Mather 2012, pp. 490.</ref>
<math display="block">\rho_Y \pi_{l+1}(m) = \rho_Y \pi_Z \pi_{l+1}(m) = \rho_Y \pi_Z(m) = \rho_Y(m),</math>
<math display="block">\pi_Y \pi_{l+1}(m) = \pi_Y \pi_Z \pi_{l+1}(m) = \pi_Y \pi_Z(m) = \pi_Y(m).</math>
We can prove that, by shrinking <math display="inline">|T_Y|</math>, <math display="inline">(\rho_Y, \pi_Y): |T_Y| \cap X \to \R \times Y</math> is a submersion [prop 7.3?] and that <math display="inline">T_{X,Y}</math> is compatible with <math display="inline">(\rho_Y, \pi_Y): |T_Y| \cap X_{l+1} \to \R \times Y</math>, i.e. <math display="inline">(\rho_Y, \pi_Y) \pi_{X,Y}(m) = (\rho_Y, \pi_Y)(m)</math>(?).
To prove it is a submersion, for the tubular neighbourhood <math display="inline">T = (E, \epsilon, \psi)</math> there exists a smooth positive function <math display="inline">\epsilon'</math> such that
<math display="block">(\rho_T, \pi_T): Y \cap |T|_{\epsilon'}^0 \to \R \times X,</math>
where <math display="inline">|T|_{\epsilon'}^0 = \psi(B_\epsilon \cap B_{\epsilon'})</math>, is a submersion. If <math display="inline">\Sigma</math> is the set <math display="inline">y \in |T|</math> such that the rank of
<math display="block">(\rho_T, \pi_T): T \cap |T| \to \R \times X</math>
at <math display="inline">y</math> is less than <math display="inline">\dim(\R \times X)</math>. We need to prove that for any <math display="inline">x \in X</math> there exists a neighbourhood of <math display="inline">x</math> which does not intersect with <math display="inline">\Sigma</math>, i.e. the map is not a submersion in this neighbourhood. It follows from [lemma 7.2] that it is enough to prove for <math display="inline">M = \R^m</math>, <math display="inline">X = \R^{m-c} \times 0_c</math> and <math display="inline">T</math> is the '''standard tubular neighbourhood'''.<ref>Mather 2012, pp. 489.</ref>
By standard tubular neighbourhood, we mean the trivial bundle with base <math display="inline">\R^{m-c}</math> and fibre <math display="inline">\R^c</math> where <math display="inline">\pi: \R^m \to \R^{m-c}</math>...<ref>Mather 2012, pp. 488.</ref>
For <math display="inline">y \in |T| - \R^{m-c}</math>, the kernal of the differential of <math display="inline">(\pi_T, \rho_T)</math> at <math display="inline">y</math> is the orthogonal complement of <math display="inline">(\R^{m-c} \times 0_c) \oplus \stackrel{\frown}{y \pi_T(y)}</math> in <math display="inline">\R^m</math>. By the Whitney conditions, we have that for <math display="inline">y</math> near <math display="inline">\R^{m-c}</math>, <math display="inline">(\R^{m-c} \times 0_c) \oplus \stackrel{\frown}{y \pi_T(y)}</math> is close to the set of <math display="inline">m - c + 1</math> planes in <math display="inline">m-</math>space to an <math display="inline">m - c + 1</math> plane in <math display="inline">TY_y</math>. Therefore, for <math display="inline">y</math> near enough to <math display="inline">\R^{m-c}</math>, <math display="inline">TY_y</math> is transverse to the kernal of the differential of <math display="inline">(\pi_T, \rho_T)</math> and, therefore, is a submersion when restricted to <math display="inline">Y</math>.<ref>Mather 2012, pp. 489.</ref>
To prove that <math display="inline">T_{X,Y}</math> is compatible with <math display="inline">(\rho_Y, \pi_Y): |T_Y| \cap X_{l+1} \to \R \times Y</math>...<ref>Mather 2012, pp. 490.</ref>
Therefore, there exists a tubular neighbourhood <math display="inline">T_0</math> of <math display="inline">X_0</math> satisfying
<math display="block">\rho_Y \pi_0(m) = \rho_Y(m),</math>
<math display="block">\pi_Y \pi_0(m) = \pi_Y(m).</math>
From this we can prove that <math display="inline">T_0</math> is compatible with <math display="inline">h</math>. Replacing <math display="inline">T_0</math> with a smaller tubular neighbourhood if necessary we can assume <math display="inline">m \in |T_0|</math> such that for some <math display="inline">Y < X</math>, <math display="inline">m \in |T_Y|</math> and <math display="inline">\pi_0(m) \in |T_Y|</math>, then<ref>Mather 2012, pp. 490.</ref>
<math display="block">h \pi_0(m) = h \pi_Y \pi_0(m) = h \pi_Y(m) = h(m).</math>
By the generalised tubular neighourhood theorem [prop 7.2?], we can replace <math display="inline">T_0</math> with a tubular neighbourhood <math display="inline">T</math> of <math display="inline">X</math> compatible with <math display="inline">h</math>. This completes the construction of <math display="inline">T_X</math>.<ref>Mather 2012, pp. 491.</ref>
This makes <math display="inline">Z</math> an '''abstract stratified set''' with axioms...<ref>Mather 2012, pp. 491-492.</ref>
This also makes <math display="inline">h</math> a '''controlled submersion''' because
# <math display="inline">h|X: X \to \R</math> is a smooth submersion on each strata <math display="inline">X</math> of <math display="inline">Z</math>, and
# for each stratum <math display="inline">X</math> there is a tubular neighbourhood <math display="inline">T'_X</math> such that <math display="inline">h(v) = h \pi_X(v)</math> for all <math display="inline">v \in T'_X</math>.<ref>Mather 2012, pp. 493.</ref>
The core of this is the concept of a '''vector field'''. A vector field is a function which assigns, for each point <math display="inline">p</math> in a space, a '''vector''', which can be represented by an arrow whose tail starts at <math display="inline">p</math>.<ref>Henle 1979, pp. 33.</ref>
[picture]
Imagine we have a vector field <math display="inline">v(x)</math> defined in a space and draw a line through our space. At each point along this line the vector field assigns a vector. If we move each point in this line along the arrow defined by this vector in the direction of the arrow head. This "flows" the entire line along the vectors.
[picture]
We define a '''stratified vector field''' <math display="inline">\eta</math> on <math display="inline">Z</math> to be a family of smooth vector fields <math display="inline">\eta_X</math>, one for each strata <math display="inline">X</math> of <math display="inline">Z</math>.<ref>Mather 2012, pp. 493.</ref>
We define a '''controlled vector field''' <math display="inline">\eta</math> on <math display="inline">Z</math> to be a stratified vector field such that for any strata <math display="inline">Y</math> there exists a tubular neighbourhood <math display="inline">T'_Y</math> such that for any <math display="inline">X > Y</math> and any <math display="inline">v \in T'_X \cap X</math><ref>Mather 2012, pp. 493.</ref>
<math display="block">\eta_X \rho_{Y,X}(v) = 0,</math>
<math display="block">(\pi_{Y,X})_* \eta_X(v) = \eta_Y (\pi_{Y,X}(v)).</math>
We prove that if <math display="inline">h</math> is a controlled submersion then, for any smooth vector field <math display="inline">\zeta</math> on <math display="inline">\R</math> there is a controlled vector field <math display="inline">\eta</math> on <math display="inline">Z</math> such that <math display="inline">h_* \eta(v) = \zeta(h(v))</math> for all <math display="inline">v \in Z</math>.<ref>Mather 2012, pp. 493.</ref>
Proceeding by induction on the maximum dimension of the strata of <math display="inline">Z</math>, we define <math display="inline">Z_k</math> to be the union of strata of <math display="inline">Z</math> of dimension at most <math display="inline">k</math>. The tubular neighbourhood of <math display="inline">Z_k</math> is the intersection of the tubular neighbourhoods of each strata in <math display="inline">Z_k</math> with <math display="inline">Z</math>. The projection and distance functions are the restrictions of the respective functions of <math display="inline">Z</math>.
It is trivially true when the maximum dimension of strata in <math display="inline">Z</math> is zero. Assume it is true for <math display="inline">k</math> and construct each <math display="inline">\eta_X</math> separately for each stratum <math display="inline">X</math> of dimension <math display="inline">k + 1</math>.
By the assumption that we have controlled vector fields for all strata <math display="inline">Y</math> of dimension at most <math display="inline">k</math>, we have the two control conditions defined above for any <math display="inline">X > Y</math> and that there is a neighbourhood <math display="inline">T^1_Y</math> such that <math display="inline">h(v) = h \pi_Y(v)</math> for <math display="inline">v \in T^1_Y</math>.
We want to prove that for all <math display="inline">Y < X</math>, the control conditions are satisfied for all <math display="inline">v \in T^2_Y</math> and that <math display="inline">h_*\eta_X(v) = \zeta(v)</math> for all <math display="inline">v \in X</math>.
Take a point <math display="inline">x \in X</math> and define the set <math display="inline">S_v</math> of strata <math display="inline">Y < X</math> such that <math display="inline">v \in T^2_Y</math>. <math display="inline">S_v</math> is totally ordered since if <math display="inline">Y_1</math> and <math display="inline">Y_2</math> are not comparable then <math display="inline">T^2_{Y_1} \cap T^2_{Y_2} = \empty</math>. Therefore, there is a largest member <math display="inline">Y = Y_v</math>.
Assume the control conditions hold for <math display="inline">Y = Y_v</math>. Then they hold for all <math display="inline">Y_i \in S_v</math>. For, either <math display="inline">Y_i = Y</math> or <math display="inline">Y_i < Y</math>. In the latter case, <math display="inline">\pi_Y(v) \in T^1_{Y_i}</math> (by the choice of <math display="inline">T^2_Y</math>'s [is this why?]. Then
<math display="block">\begin{align}
\eta_X(v) \rho_{Y_i,X}(v) &= \eta_X \rho_{Y_i,Y} \pi_{Y,X}(v) \\
&= (\pi_{Y,X})_* \eta_X(v) \rho_{Y_i,Y} \\
&= \eta_Y(\pi_{Y,X}(v)) \rho_{Y_i,Y} \\
&= 0
\end{align}</math>
and
<math display="block">\begin{align}
(\pi_{Y_i,X})_* \eta_X(v) &= (\pi_{Y_i,Y})_* (\pi_{Y,X})_* \eta_X(v) \\
&= (\pi_{Y_i,Y})_* \eta_Y(v) (\pi_{Y,X}) \\
&= \eta_{Y_i}(\pi_{Y_i,Y} \pi_{Y,X}(v)) \\
&= \eta_{Y_i}(\pi_{Y_i,X}(v))
\end{align}</math>
and, therefore, condition holds for all <math display="inline">Y_i \in S_v</math>. Also,
<math display="block">\begin{align}
h_* \eta_X(v) &= (h \circ \pi_{Y,X})_* \eta_X(v) \\
&= h_* \eta_Y (\pi_{Y,X}(v)) \\
&= \zeta(f(v))
\end{align}</math>
and, therefore, the conclusion of the theorem holds at <math display="inline">v</math>.
This shows we can construct <math display="inline">\eta_X</math> satisfying the control conditions when <math display="inline">S_v</math> is non-empty and satisfying the theorem when <math display="inline">S_v</math> is empty. The set of vectors satisfying these conditions is convex in <math display="inline">TX_v</math>, and so we construct <math display="inline">\eta_X</math> globally via a partition of unity.<ref>Mather 2012, pp. 493-495.</ref>
Finally, we prove that a controlled vector field has a unique one-parameter family of homeomorphisms of <math display="inline">Z</math> which commute with <math display="inline">h</math>.<ref>Mather 2012, this combines Proposition 10.1 and Corollary 10.2 on pp. 496 and 497, respectively.</ref>
For each stratum <math display="inline">X</math> of <math display="inline">Z</math>, <math display="inline">\eta_X</math> generates a unique smooth local one-parameter group <math display="inline">(J_X, \alpha_X)</math> of diffeomorphisms of <math display="inline">X</math> (by standard results of differential geometry), such that <math display="inline">\frac{d}{dt} \alpha(t, v)|_{t=0} = \eta_X(v)</math>, <math display="inline">J_X</math> is an open subset of <math display="inline">\R \times Z</math>, ...
If we define <math display="inline">(J, \alpha)</math> by
<math display="block">J = \bigcup_{X \in S} J_X</math>
<math display="block">\alpha = \bigcup_{X \in S} \alpha_X</math>
we can prove that this is a local one-parameter family of homeomorphisms.<ref>Mather 2012, pp. 496.</ref>
Firstly, it is clear that
# <math display="inline">0 \times Z \subseteq J</math> and <math display="inline">\alpha(0, v) = v</math> for all <math display="inline">v \in Z</math>.
# If <math display="inline">v \in Z</math> then <math display="inline">J_v = J \cap (\R \times v) \subseteq \R</math> is an open interval <math display="inline">(a_v, b_v)</math>, possibly infinite at one or both ends.
# If <math display="inline">v \in Z</math> and <math display="inline">t, s, t + s</math> are in <math display="inline">(a_v, b_v)</math> then <math display="inline">\alpha(t + s, v) = \alpha(t, \alpha(s, v))</math>.<ref>Mather 2012, pp. 495.</ref>
Secondly, it is clear that <math display="inline">\eta</math> generates <math display="inline">\alpha</math> because
# Each stratum <math display="inline">X</math> of <math display="inline">Z</math> is invariant under <math display="inline">\alpha</math>, i.e. <math display="inline">\alpha[J \cap (\R \times X)] \subseteq X</math>.
# For each <math display="inline">v \in Z</math>, the map <math display="inline">t \to \alpha(t, v)</math> of <math display="inline">(a_v, b_v)</math> into the stratum which contains <math display="inline">v</math> is <math display="inline">C^1</math>.
# For any <math display="inline">(t, v) \in Z</math>(?) we have <math display="inline">d/dt \alpha(t, v) = \eta(\alpha(t, v))</math>.<ref>Mather 2012, pp. 495.</ref>
It is unique because each <math display="inline">(J_X, \alpha_X)</math> is unique. We just need to prove that <math display="inline">J</math> is open, <math display="inline">\alpha</math> is continuous, and for any <math display="inline">v \in Z</math> and any compact set <math display="inline">K \subseteq Z</math> there exists <math display="inline">\epsilon > 0</math> such that <math display="inline">\alpha(t, v) \notin K</math> if <math display="inline">t \in (a_v, a_v + \epsilon) \cup (b_v - \epsilon, b_v)</math>.<ref>Mather 2012, pp. 495.</ref>
For the latter-most condition, if it did not hold then there exists...<ref>Mather 2012, pp. 496-497.</ref>
We prove there is a homeomorphism <math display="inline">f: Z \to h^{-1}(0) \times \R</math> such that <math display="inline">\pi \circ f = h</math>, where <math display="inline">\pi: h^{-1}(0) \times \R \to \R</math> is projection to the second factor.
For the coordinate vector field <math display="inline">\partial</math> on <math display="inline">\R</math>, by [prop 9.1] there is a controlled vector field <math display="inline">\tilde\partial</math> such that <math display="inline">f_* \tilde\partial(v) = \partial(h(v))</math> for <math display="inline">v \in Z</math>. By [prop 10.1], <math display="inline">\tilde\partial</math> generates a local one-parameter group <math display="inline">(J, \alpha)</math> such that
<math display="block">h(\alpha(t,v)) = h(v) + t</math>
<math display="inline">h</math> is proper and [d] holds, so <math display="inline">J = \R \times Z</math>. If we define <math display="inline">f</math> as
<math display="block">f(v) = (\alpha(-t, v), h(v))</math>
then <math display="inline">f</math> maps <math display="inline">Z</math> into <math display="inline">h^{-1}(0) \times \R</math> and <math display="inline">\pi \circ f = h</math>. If we define <math display="inline">\bar f: h^{-1}(0) \times \R \to Z</math> as
<math display="block">\bar f(v, t) = \alpha(t, v)</math>
then <math display="inline">f \bar f = \bar f f = Id</math> and <math display="inline">f</math> is a homeomorphism.<ref>Mather 2012, pp. 497.</ref>
== Topology at critical points ==
Theorem: If there is a critical point <math display="inline">p</math> in the singular variety <math display="inline">\mathcal{V}</math> with critical value <math display="inline">v \in (a, b)</math> then the space <math display="inline">X_{\leq b}</math> is homotopic to<ref>Goresky and MacPherson 1988, pp. 174.</ref>
<math display="block">X_{\leq a} \cup [(D^{\lambda+1}, \partial D^{\lambda+1}) \times (\mathcal{L}_X, \partial \mathcal{L}_X)].</math>
Proof:<ref>Proof outline comes from Goresky and MacPherson 1988, pp. 174.</ref>
# <math display="inline">(X_{\leq b}, X_{\leq a})</math> is homeomorphic to <math display="inline">(X_{\leq v + \epsilon}, X_{\leq v -\epsilon})</math>. We can prove this by "moving wall" or Thom's Isotopy Lemma.<ref>Goresky and MacPherson 1988, pp. 90-91, 120.</ref>
# <math display="inline">X_{\leq v + \epsilon}</math> is homeomorphic to <math display="inline">X_{\leq v - \epsilon} \cup (J, K)</math>, where the latter is the local Morse data for <math display="inline">h</math> at <math display="inline">p</math>. We do this by moving the wall...<ref>Goresky and MacPherson 1988, pp. 95-96, 120-121.</ref>
# <math display="inline">(J, K)</math> is homeomorphic to <math display="inline">(D^{\lambda+1}, \partial D^{\lambda+1}) \times (\mathcal{L}_X, \partial \mathcal{L}_X)</math> (tangential data, normal data). Again, moving the wall...<ref>Goresky and MacPherson 1988, pp. 65-66, chapter 8, 121.</ref>
# The normal Morse data depends only on the differential <math display="inline">df(p)</math>.<ref>Goresky and MacPherson 1988, pp. 93.</ref>
# The normal Morse data has the homotopy type of <math display="inline">(\mathcal{L}_X, \partial \mathcal{L}_X)</math>.<ref>Goresky and MacPherson 1988, pp. 169.</ref>
=== Step 1 ===
We get this immediately(?) by Thom's Isotopy Lemma.
=== Step 2 ===
<ref>Goresky and MacPherson 1988, complex case on pp. 120-121 is extension of real case on pp. 95-96.</ref>
Step 1 works because <math display="inline">h</math> is a submersion at each point of the regions we are homeomorphing. This is not the case at critical points. We need some way by which a homeomorphism can pass through a critical point.
To prove a homeomorphism between two subsets <math display="inline">A</math> and <math display="inline">B</math> of <math display="inline">Z</math>, we project <math display="inline">Z</math> to some other space <math display="inline">N</math> (in our case <math display="inline">\R^n</math>) using some function <math display="inline">F</math>. We take subsets <math display="inline">Y_0</math> and <math display="inline">Y_1</math> of <math display="inline">N</math> such that <math display="inline">A = Z \cap F^{-1}(Y_0)</math> and <math display="inline">B = Z \cap F^{-1}(Y_1)</math>. We need to prove <math display="inline">Y_0</math> and <math display="inline">Y_1</math> are connected by a one-parameter family of regions <math display="inline">Y_t</math> [explain one-parameter family]. The criterion for such a family to exist is that the '''characteristic covectors''' of <math display="inline">F</math> are all nonzero on each stratum of <math display="inline">Y_t</math>.<ref>Goresky and MacPherson 1988, pp. 70.</ref>
At each point <math display="inline">x \in M</math> and <math display="inline">y \in N</math> there are '''tangent spaces''' <math display="inline">T_xM</math> and <math display="inline">T_yN</math>, a vector space whose zero is at the point <math display="inline">x</math> or <math display="inline">y</math> (resp.)
[picture of various tangent spaces]
In the case the <math display="inline">N = \R</math>, the tangent space <math display="inline">T_x\R</math> is just <math display="inline">\R</math> but whose origin is at <math display="inline">x</math>.
[picture of T_x\R]
Say <math display="inline">F(x) = y</math>, then the differential of the map <math display="inline">F</math> can be seen as a function whose input is a vector in the tangent space <math display="inline">T_xM</math> and whose output is a vector in the tangent space <math display="inline">T_yM</math>. [If I move this far on the tangent space of M how do I move in the tangent space of N?]
[picture]
[example for M = \R and N = \R?]
A function which takes as input a vector in the tangent space <math display="inline">T_xM</math> (say) and outputs a scalar (usually <math display="inline">\R</math>) is called a '''covector'''. The set of all covectors on <math display="inline">T_xM</math> is called the dual space of <math display="inline">T_xM</math> and is denoted <math display="inline">T^*_xM</math>. There are only a limited number of ways to express a covectors. For example, if our tangent space is two-dimensional then all covectors are of the form <math display="inline">ax + by</math> where <math display="inline">(x, y) \in T_xM</math>.
We take our space <math display="inline">M</math> and map it onto <math display="inline">\R^2</math> with the map <math display="inline">F(z) = (r(z), h(z))</math>, where <math display="inline">z \in M</math> and <math display="inline">r</math> is the square of the distance of <math display="inline">z</math> to the critical point <math display="inline">p</math>.
[graph of mapping]
In this case, the covectors on the tangent space <math display="inline">T_xM</math> are of the form <math display="inline">adf(x) + bdr(x)</math> (in this case <math display="inline">df</math> and <math display="inline">dr</math> are maps to <math display="inline">\R</math>) and on <math display="inline">T_y\R^2</math> are of the form <math display="inline">cu + dv</math> (for <math display="inline">(u, v) \in \R^2</math>). A covector <math display="inline">cu + dv \in T^*_{(u, v)}\R^2</math> is called a '''characteristic covector''' of <math display="inline">F</math> if <math display="inline">F(x) = (u, v)</math> and <math display="inline">cdf(x) + ddr(x) = 0</math> for all vectors in the tangent space of the stratum containing <math display="inline">p</math>.<ref>Goresky and MacPherson 1988, pp. 82.</ref> [explain adf(x) + bdr(x) in terms of this being a function which takes a vector input]
[example of where covectors do and do not vanish on a stratified space, pp. 71?]
What we want is a homeomorphism in <math display="inline">M</math> between the space <math display="inline">Z_{\leq \epsilon}</math> and <math display="inline">Z_{\leq \epsilon} \cup B</math>, where <math display="inline">B</math> is a small region of the critical point <math display="inline">p</math>. The '''local Morse data''' is
<math display="block">((B_\delta \cap Z) \cap f^{-1}[v-\epsilon, v+\epsilon], (B_\delta \cap Z) \cap f^{-1}(v-\epsilon))</math>
where <math display="inline">B_\delta</math> is a closed disc in <math display="inline">M</math> of radius <math display="inline">\delta</math>.<ref>Goresky and MacPherson 1988, pp. 63-64.</ref> Observe that this is the pair <math display="inline">(F^{-1}(\text{Box}(\delta, \epsilon)), F^{-1}(\text{Bottom}(\delta, \epsilon)))</math><ref>Goresky and MacPherson 1988, pp. 91.</ref> [explain Box, Bottom, etc.]
[picture of the two subspaces of Z in M]
We use our map <math display="inline">F</math> to convert these two subspaces to subspaces of <math display="inline">\R^2</math> which are of the form <math display="inline">Y_1 = \{(x,y) \in \R^2 | y \leq \epsilon\}</math> and <math display="inline">Y_0 = \{(x,y) \in \R^2 | y \leq -\epsilon\} \cup \{(x,y) \in \R^2 | x \leq \delta, y \leq \epsilon\}</math>, such that <math display="inline">Z_{\leq \epsilon} = F^{-1}(Y_1)</math> and <math display="inline">Z_{\leq \epsilon} \cup B = F^{-1}(Y_0)</math>.<ref>Goresky and MacPherson 1988, pp. 95-96.</ref>
We use a homeomorphism between <math display="inline">Y_1</math> and <math display="inline">Y_0</math> using the technique of "moving the wall" and Thom's Isotopy Lemma. Such a homeomorphism exists when the characteristic covectors of <math display="inline">F</math> are all nonzero on each stratum of <math display="inline">Y_t</math>.<ref>Goresky and MacPherson 1988, chapter 4, particularly pp. 71-72.</ref>
Given a smooth mapping between manifolds <math display="inline">F: M \to N</math> (for example, in our case we could have <math display="inline">N = \R^2</math>) and that <math display="inline">F|Z: Z \to N</math> is proper. Let <math display="inline">Y \subset N \times \R</math> be a closed Whitney stratified subset such that the projection to the second factor <math display="inline">\pi: Y \to \R</math> is a proper stratified submersion.<ref>Goresky and MacPherson 1988, pp. 71.</ref>
Suppose for each <math display="inline">t \in \R</math>, for each <math display="inline">p \in F(Z) \cap Y_t</math>, and for each nonzero characteristic covector <math display="inline">\lambda \in T^*_pN</math> of <math display="inline">F|Z</math>, the restriction of <math display="inline">\lambda</math> to the subspace <math display="inline">T_pS_t = \ker(d\pi(p)) \cap T_pS</math> is nonzero, where <math display="inline">S</math> is a stratum of <math display="inline">Y</math> which contains <math display="inline">(p, t)</math> and <math display="inline">S_t = \pi^{-1}(t) \cap S</math> is the stratum of <math display="inline">Y_t = \pi^{-1}(t) \cap Y</math> which contains <math display="inline">p</math>. This is equivalent to the statement that, for each <math display="inline">t \in \R</math>, the restriction <math display="inline">F|Z</math> is transverse to <math display="inline">Y_t</math>.<ref>Goresky and MacPherson 1988, pp. 71-72.</ref>
This means that, for each <math display="inline">t \in \R</math>, <math display="inline">Z \cap F^{-1}(Y_t)</math> is stratified by its intersection with the strata of <math display="inline">Z</math>...
We finally prove there is a homeomorphism between <math display="inline">Z \cap F^{-1}(Y_0) \cong Z \cap F^{-1}(Y_1)</math> which preserves the Whitney stratification of both sides and is smooth on each stratum.
For the composition
<math display="block">Z \times \R \subset M \times \R \to_{F \times I} Y \subset \R^2 \times \R \to_{\pi} \R</math>
where <math display="inline">Y(t, z) = Y_t(z)</math>, <math display="inline">I</math> is the identity and <math display="inline">\pi</math> is projection to the second factor.
<math display="inline">Z \times \R</math> is transverse to <math display="inline">(F \times I)^{-1}(Y)</math>...
The composition <math display="inline">\pi \circ (F \times I): Z \times \R \cap (F \times I)^{-1}(Y) \to \R</math> is a stratified submersion because
* The input domain is stratified as above...,
* We have defined <math display="inline">F|Z</math> to be transverse to <math display="inline">Y</math>, and therefore it preserves the stratification (unless <math display="inline">F(Z) \cap Y = \empty</math>), and
* We defined above the projection on <math display="inline">Y</math> to be a stratified submersion, meaning it is a submersion on each stratum of <math display="inline">F(Z) \cap Y</math>.<ref>Goresky and MacPherson 1988, pp. 43.</ref>
Therefore, we can apply Thom's Isotopy Lemma which says there is a homeomorphism between the level sets of <math display="inline">Z \times \R</math>...<ref>Goresky and MacPherson 1988, pp. 72.</ref>
=== Step 3 ===
==== Characteristic covectors ====
==== Fringed sets ====
When manipulating our domain of integration[?], we need to make sure we are doing this in regions with no characteristic covectors. The introduce the concept of a fringed set, a subset of <math display="inline">R^2</math>, and construct a series of fringed sets which contain no characteristic covectors.
A '''fringed set''' <math display="inline">A \subset \R \times \R^+</math> is an open subset of the first quadrant of <math display="inline">\R^2</math>. <math display="inline">A</math> is fringed over <math display="inline">0 < y \ll x</math> if for some interval <math display="inline">S = (0, x)</math>
# the projection of <math display="inline">A</math> to the first factor is equal to <math display="inline">S</math>,
# <math display="inline">A</math> is open in <math display="inline">S \times \R^+</math>,
# if <math display="inline">(s, y) \in A</math> and <math display="inline">0 < y' \leq y</math> then <math display="inline">(s, y') \in A</math>.<ref>Goresky and MacPherson 1988, pp. 77.</ref>
[picture]
The fringed set <math display="inline">A^\flat</math> is the set <math display="inline">A</math> plus its reflection about the <math display="inline">x</math> axis.<ref>Goresky and MacPherson 1988, pp. 82.</ref>
[picture]
We build a series of fringed sets which do not contain characteristic covectors, which will be used later in our proof.
There exists a fringed set <math display="inline">A_2</math> of type <math display="inline">0 < v \ll u</math> such that for any <math display="inline">z \in Z</math> such that <math display="inline">r\pi(z) \leq r_2</math>, the map <math display="inline">(\rho, f - f\pi)|\pi^{-1}(\pi(z)): \pi^{-1}(\pi(z)) \to \R^2</math> has no characteristic covectors in <math display="inline">A^\flat_2</math>.<ref>Goresky and MacPherson 1988, pp. 84.</ref>
Given that the set of points <math display="inline">(u, v) \in \R^2</math> which have a nonzero characteristic covector is closed, then it is enough to prove it for points <math display="inline">(u, 0) \in \R^2</math>. Proof by contradiction. Assume it is false and that there is a sequence of points <math display="inline">p_i \in Z \cap f^{-1}(0)</math> converging to <math display="inline">p</math> such that <math display="inline">d\rho(p_i)</math>, <math display="inline">df(p_i)</math> and <math display="inline">df\pi(p_i)</math> are linearly dependent when restricted to the stratum <math display="inline">Y</math> which contains <math display="inline">p_i</math>. This would mean that <math display="inline">f</math> has a critical point on <math display="inline">Y \cap \partial B_{\rho(p_i)}(p)</math>.<ref>Goresky and MacPherson 1988, pp. 82-83.</ref>
By restricting to a subsequence if necessary, we may assume the points <math display="inline">p_i</math> are all contained in the same stratum <math display="inline">Y</math>, that the tangent planes <math display="inline">T_{p_i}Y</math> converge to some plane <math display="inline">Q</math> and the secant lines <math display="inline">\mathcal{l}_i = \overline{p_i p}</math> converge to some line <math display="inline">\mathcal{l}</math>. By the Whitney conditions [how?], <math display="inline">Q = \lim_{i \to \infty} \mathcal{l}_i \oplus T_{p_i}(Y \cap \partial B_\delta(p))</math>.<ref>Goresky and MacPherson 1988, pp. 83.</ref>
For each <math display="inline">i</math>, <math display="inline">f(p_i) = f(p) = v</math>, this means[?] <math display="inline">df(p)(Q) = 0</math>. On the assumption that <math display="inline">df(p)</math> is nondegenerate, we may assume <math display="inline">Y = X</math>, so <math display="inline">\ker d(f|X)(p_i) = T_{p_i}(X \cap \partial B_\delta(p)) = T_{p_i}(X \cap f^{-1}(v))</math>, which converges to a subspace <math display="inline">\tau</math> of <math display="inline">Q = T_pX</math>, perpendicular to <math display="inline">\mathcal{l}</math>. However, as <math display="inline">f^{-1}(v) \cap X</math> satisfies Whitney's conditions, <math display="inline">\mathcal{l} \subset \tau</math>, a contradiction.<ref>Goresky and MacPherson 1988, pp. 83.</ref>
==== Homeomorphism ====
We prove there is a stratum preserving homeomorphism between<ref>Goresky and MacPherson 1988, pp. 65.</ref>
<math display="block">\text{Local Morse Data} \cong (\text{Tangential Morse Data}) \times (\text{Normal Morse Data})</math>
We first prove that there is a homeomorphism between the product of the normal and tangential Morse data and the '''realisation''' of the following diagram
[diagram from pp. 102]
where realisation means
<math display="block">Z \cap (g_1, h_1)^{-1}(P_a) \cap (g_2, h_2)^{-1}(P_b)</math>
where all the intersections of strata (of <math display="inline">Z</math>?) are transverse.<ref>Goresky and MacPherson 1988, pp. 100-102.</ref>
The realisation of the above diagram is equal to
<math display="block">(V_1, V_2) \cap (W_1, W_2) = (V_1 \cap W_1, V_1 \cap W_2 \cup V_2 \cap W_1)</math>
where
<math display="block">V_1 = \{ z \in Z : |f(z) - f\pi(z)| \leq \epsilon/4, r\pi(z) \leq \delta, \rho(z) \leq \delta \}</math>
<math display="block">V_2 = \{ z \in Z : f(z) - f\pi(z) = -\epsilon/4, r\pi(z) \leq \delta, \rho(z) \leq \delta \}</math>
<math display="block">W_1 = \{ z \in Z : |f\pi(z)| \leq 3\epsilon/4, r\pi(z) \leq \delta \}</math>
<math display="block">W_1 = \{ z \in Z : f\pi(z) = -3\epsilon/4, r\pi(z) \leq \delta \}</math>
where <math display="inline">\pi</math> is the projection from the tubular neighbourhood to <math display="inline">Z</math>, <math display="inline">r(z)</math> is the square of the distance between <math display="inline">z</math> and the critical point <math display="inline">p</math> and <math display="inline">\rho(z)</math> is the square of the distance between <math display="inline">z</math> and <math display="inline">\pi(z)</math>.<ref>Goresky and MacPherson 1988, pp. 100-101.</ref> <math display="inline">\epsilon \ll \delta</math> are chosen so that <math display="inline">(\delta, \epsilon)</math> is in the set <math display="inline">A^\flat_6</math> which consists of <math display="inline">A_6 \subset \R^+ \times \R^+</math> with the properties that for <math display="inline">(\epsilon, \delta) \in A_6</math> and <math display="inline">z</math> such that <math display="inline">\rho(z) = \delta</math>, <math display="inline">r\pi(z) = \delta</math>, <math display="inline">|f(z)| \leq \epsilon</math> and <math display="inline">|f\pi(z)| \leq \epsilon</math> then the covectors <math display="inline">d\rho(z)</math>, <math display="inline">dr\pi(z)</math>, <math display="inline">df(z)</math> and <math display="inline">df\pi(z)</math> are linearly independent when restricted to <math display="inline">T_zY</math> (where <math display="inline">Y</math> is the stratum containing <math display="inline">z</math>). We can prove such a set exists.<ref>Goresky and MacPherson 1988, pp. 89.</ref> <math display="inline">A^\flat_6</math> is this plus its reflection about the <math display="inline">x</math> axis.<ref>Goresky and MacPherson 1988, pp. 82.</ref>
Let <math display="inline">D = \{ x \in X | r(x) \leq \delta \}</math> for stratum <math display="inline">X</math>. We will show there is a local trivial fibration of the configuration: <math display="inline">(V_1, V_2)</math> fibres over <math display="inline">D</math> and is homeomorphic to <math display="inline">D \times (\text{normal Morse data})</math>
(V_1, V_2) -> D \times (normal Morse data)
| /
--> D <---
and that <math display="inline">(W_1, W_2)</math> fibres over the tangential Morse data and is homeomorphic to <math display="inline">(\text{tangential Morse data}) \times (\text{normal slice})</math>.
For <math display="inline">Z_1 = \{ z \in Z : r\pi(z) \leq \delta \}</math>, the map <math display="inline">F(z): Z_1 \to \R^2 = (\rho(z), f(z) - f\pi(z))</math> is transverse to each stratum of <math display="inline">\text{Box}(\delta, \epsilon/4)</math>, [list], [by lemma 6.5]. <math display="inline">(V_1, V_2) = F^{-1}(\text{Box}(\delta, \epsilon/4), \text{Bottom}(\delta, \epsilon/4))</math>. For each stratum <math display="inline">S</math> of Box and each <math display="inline">x \in D</math>, we have transverse intersection <math display="inline">F^{-1}(S) \pitchfork \pi^{-1}(x)</math>. Therefore, <math display="inline">\pi|F^{-1}(S)</math> is a submersion and by Thom's isotopy lemma the projection <math display="inline">\pi|F^{-1}(\text{Box}(\delta, \epsilon/4): F^{-1}(\text{Box}(\delta, \epsilon/4)) \to X</math> is a stratified fibre bundle over <math display="inline">D</math>. The fibre over the critical point <math display="inline">p</math> is <math display="inline">\pi^{-1}(p) \cap (F^{-1}(\text{Box}(\delta, \epsilon/4), F^{-1}(\text{Bottom}(\delta, \epsilon/4))</math> and is equal to the normal Morse data...<ref>Goresky and MacPherson 1988, pp. 101.</ref>
Take <math display="inline">G: X \to \R^2 = (r(x), f(x))</math>. <math display="inline">\delta</math> and <math display="inline">\epsilon</math> have been chosen so that <math display="inline">(G^{-1}(\text{Box}(\delta, \epsilon/4), G^{-1}(\text{Bottom}(\delta, \epsilon/4))</math> is the tangential Morse data for <math display="inline">f</math> and is contained in the region <math display="inline">D</math> over which <math display="inline">\pi|(V_1, V_2)</math> is a stratified fibre bundle. Therefore, <math display="inline">(W_1, W_2) = \pi^{-1} G^{-1}(\text{Box}(\delta, \epsilon/4), \text{Bottom}(\delta, \epsilon/4))</math> is transverse to <math display="inline">(V_1, V_2)</math>.<ref>Goresky and MacPherson 1988, pp. 101-102.</ref>
Finally, this means that <math display="inline">(V_1, V_2) \cap (W_1, W_2)</math> is homeomorphic (by stratum preserving homeomorphism) to <math display="inline">(\pi^{-1}(p), \cap (V_1, V_2)) \times \pi(W_1, W_2)</math>, the product of normal and tangential Morse data.<ref>Goresky and MacPherson 1988, pp. 102.</ref>
We use a succession of such diagrams to interpolate between the box diagram which defines local Morse data [explain] and the above diagram whose realisation we have just proven is <math display="inline">(\text{normal Morse data}) \times (\text{tangential Morse data})</math>.
[diagram_d0.py]
The realisation is the local Morse data. This is equal to the realisation of the diagram below.<ref>Goresky and MacPherson 1988, pp. 103, 106.</ref>
[diagram_d11.py]
The realisation of the first diagram [d0] is equivalent to the realisation of the below diagram.
[diagram_d1.py]
In the right-hand picture of the above diagram, we have put a dotted outline around the region <math display="inline">A^{\flat}_1</math>. We prove that there are no characteristic covectors for <math display="inline">(r, f): Z \to \R^2</math> in this region and can, therefore, move the wall in this region...<ref>Goresky and MacPherson 1988, pp. 82-83.</ref>
By adding a zero-dimensional stratum at the top right corner of the right-hand picture. A one-parameter family of pictures <math display="inline">P_b(t)</math> gives rise to a stratified space <math display="inline">Y \subset M \times \R</math> such that
<math display="block">Y = \{ (z, t) \in M \times \R : (r, f)(z) \in P_b(t) \}.</math>
<math display="inline">(r, f)</math> takes each stratum of <math display="inline">Z</math> transversally to each stratum of each <math display="inline">Y_t</math>. <math display="inline">(f \circ \pi, f)^{-1}(P_a) = f^{-1}[-\epsilon, \infty)</math> is transverse to each stratum of <math display="inline">Y_t \cap Z</math>. Therefore, there is a homeomorphism between<ref>Goresky and MacPherson 1988, pp. 107.</ref>
<math display="block">Z(D_1) = Z \cap (f \circ \pi, f)^{-1}(P_a) \cap (r, f)^{-1}(P_b(0))</math>
and
<math display="block">Z(D_1) = Z \cap (f \circ \pi, f)^{-1}(P_a) \cap (r, f)^{-1}(P_b(1)).</math>
To go from D_2 to D_3 we find the characteristic covectors of <math display="inline">(f\pi, f): V \to \R^2</math> where <math display="inline">V = (r, f)^{-1}(P_b(1))</math>. We stratify <math display="inline">P_b(1)</math> by its interior <math display="inline">P</math> and boundary <math display="inline">\partial P</math>.<ref>Goresky and MacPherson 1988, pp. 107.</ref>
The strata of <math display="inline">V</math> come in four types:
# <math display="inline">(r, f)^{-1}(P) \cap X</math>
# <math display="inline">(r, f)^{-1}(P) \cap Y</math>
# <math display="inline">(r, f)^{-1}(\partial P) \cap X</math>
# <math display="inline">(r, f)^{-1}(\partial P) \cap Y</math>
where <math display="inline">X</math> is the strata that contains the critical point and <math display="inline">Y</math> is any other strata such that <math display="inline">Y > X</math>.
All characteristic covectors are of the form <math display="inline">\lambda = (u, v, adu + bdv) \in T^*\R^2</math>.
For strata 1 and 3, the image of <math display="inline">X</math> under <math display="inline">(f\pi, f)</math> is the diagonal <math display="inline">f\pi = f</math> (dotted outline). Therefore, the characteristic covectors of any point <math display="inline">z</math> in <math display="inline">X</math> are either where <math display="inline">z = p</math>, in which case the covector is zero(?), or where <math display="inline">z \neq p</math>, in which case <math display="inline">u = v</math> and <math display="inline">a = b</math>.<ref>Goresky and MacPherson 1988, pp. 107-108.</ref>
For strata 2, being that the critical point is isolated and non-degenerate, which means it, and any neighbourhood, is not zero on any limit of tangent spaces in strata <math display="inline">Y > X</math>. Therefore, <math display="inline">f</math> and <math display="inline">f\pi</math> are linearly independent.<ref>Goresky and MacPherson 1988, pp. 84.</ref> Unless <math display="inline">\pi(z) = p</math>, in which case <math display="inline">d(f\pi)(z) = f\pi(z) = 0</math>, so they are covectors where <math display="inline">u = 0</math> and <math display="inline">b = 0</math>.<ref>Goresky and MacPherson 1988, pp. 108.</ref>
For strata 4, we can use implicit function theorem to generate local coordinates <math display="inline">y_1, \cdots y_{r-s-1}</math> in <math display="inline">Y > X</math> and define the Riemannian metric <math display="inline">r(z) = r\pi(z) + (f(z) - f\pi(z))^2 + g(y)</math> for some <math display="inline">g</math> depending only on <math display="inline">y</math>.
There are no characteristic covectors in <math display="inline">|u| \leq \epsilon</math> and <math display="inline">|v| < \epsilon</math>. By [lemma 6.7 and 6.8 and 8.1(d)] <math display="inline">df</math>, <math display="inline">df\pi</math> and <math display="inline">dr</math> are linearly independent in this region.<ref>Goresky and MacPherson 1988, pp. 109.</ref> Given <math display="inline">|f| \leq \epsilon</math> and <math display="inline">|f\pi| \leq \epsilon</math>, a fringed set <math display="inline">A^\flat_4</math> of type <math display="inline">0 < \epsilon \ll \delta</math> and assume that <math display="inline">\pi \neq p</math> and <math display="inline">z \notin X</math> then <math display="inline">(r(z), f(z)) \in A^\flat_4</math> and <math display="inline">(r(z), f\pi(z)) \in A^\flat_4</math>.<ref>Goresky and MacPherson 1988, pp. 87.</ref>
Outside of these points, the slope of <math display="inline">\ker(\lambda)</math> for any characteristic covector <math display="inline">\lambda</math> is
<math display="block">\frac{-a}{b} = \frac{f(z) - f\pi(z) - M}{\frac{\alpha}{\beta} + (f(z) - f\pi(z))}</math>
for <math display="inline">\alpha df + \beta dr = 0</math>.<ref>Goresky and MacPherson 1988, pp. 108-109.</ref>
== Morse theory ==
Steps(?)
* Explain topology
* Every point of a stratum is locally like a product structure (proved by Thom's Isotopy Lemma) [GM pp. 41-42]
** Including those around critical points, which are the product of normal and tangential Morse data (these are our quasi-local cycles?)
* Thom's Isotopy Lemma proves a strong deformation retraction (which only stops at critical points) [PWM pp. 541-542]
=== Homotopy ===
We want to replace our domain of convergence <math display="inline">M</math>, which is the complement of our singular variety <math display="inline">\mathcal{V}</math>, with an "equivalent" space <math display="inline">M'</math> which has better understood properties. We say "equivalent" because there are several different things we could mean by "equivalent" in this context. The equivalence we are referring to in this section is called '''homotopy'''.
Imagine two subspaces <math display="inline">\gamma_0</math> and <math display="inline">\gamma_1</math> of a space <math display="inline">Y</math> which are defined respectively by smooth functions <math display="inline">f, g: X \to Y</math>. If there exists a smooth function <math display="inline">h_s: X \times [0, 1] \to Y</math>, called a homotopy, such that <math display="inline">h_0 = f</math>, <math display="inline">h_1 = g</math> and for any <math display="inline">\epsilon > 0</math> there exists a <math display="inline">\delta_a</math> and <math display="inline">\delta_b</math> such that when <math display="inline">|s - s_0| < \delta_a</math> and <math display="inline">|x - x_0| < \delta_b</math> we have <math display="inline">|h_s(x) - h_{s_0}(x_0)| < \epsilon</math>, then we say <math display="inline">\gamma_0</math> and <math display="inline">\gamma_1</math> are '''homotopic'''.<ref>Henle 1979, pp. 251-252.</ref>
Below is an example where <math display="inline">\gamma_0</math> and <math display="inline">\gamma_1</math> are one-dimensional curves and <math display="inline">H(t, s) = h_s(t)</math>.
[[File:Homotopy_curves.png|300px]]
In [[#Homotopy_equivalence|Appendix A]], we formally prove that we can construct an equivalent space <math display="inline">M'</math>. We provide only an example to give some intuition before describing how to construct the space <math display="inline">M'</math> in terms of local cycles around critical points.
=== Motivating example ===
Imagine a torus and a height function which is just the z value of the point.
[[File:3D-Leveltorus.png|200px]]
It has four critical points: two at the top and bottom of the outer circle (<math display="inline">p_1, p_4</math>) and two at the top and bottom of the inner circle (<math display="inline">p_2, p_3</math>).
[picture]
When the height is between the <math display="inline">p_1</math> and <math display="inline">p_2</math>, the space is a two-cell, which can be retracted to a point.
[picture]
When the height is between <math display="inline">p_2</math> and <math display="inline">p_3</math>, the space is a cylinder, which can be retracted to a two-cell with a one-cell attached.
[[File:3D-Cylinder_and_disk_with_handle.png|200px]]
When the height is between <math display="inline">p_3</math> and <math display="inline">p_4</math>, the space is a torus with a disc removed, which can be retracted to a cylinder with a one-cell attached.
[[File:3D-Cylinder_with_handle_and_torus_with_hole.png|200px]]
When the height is greater than <math display="inline">p_4</math>, then the full torus is constructed by attaching a two-cell.
[Explain in terms of Morse data and Morse index?]
=== Morse data and quasi-local cycles ===
As in the above example, we start at the "bottom" of <math display="inline">M</math> and build upwards until just before we reach our first critical point <math display="inline">p</math>.
;Smooth points
:This is a tube around a <math display="inline">(d-1)</math>-chain <math display="inline">\gamma</math> where the height function <math display="inline">h</math> is maximised at <math display="inline">p</math>.<ref>Pemantle, Wilson and Melczer 2024, pp. 223.</ref>
:For example, if <math display="inline">F(x, y) = \frac{1}{1 - x - y}</math> then <math display="inline">\lambda = 1</math> and <math display="inline">B^\lambda</math> is an arc reaching its highest point at <math display="inline">p</math>.
:The normal plane <math display="inline">N</math> at <math display="inline">p</math> is a plane orthogonal to <math display="inline">B^1</math>(?).
:Its normal link <math display="inline">L(S)</math> is a circle with two points missing where it intersects <math display="inline">\mathcal{V}</math>.
:We make our quasi-local cycle out of the product of the arc and circle joined to <math display="inline">M_-</math> at points below <math display="inline">M_-</math>.
:With the exception of degenerate points, such as monkey saddles...<ref>e.g. Pemantle, Wilson and Melczer 2024, pp. 211.</ref>
;Transverse multiple points
:This is the product of a <math display="inline">k</math>-torus and a <math display="inline">(d-k)</math>-chain <math display="inline">\gamma</math>. The torus is the product of circles about <math display="inline">p</math> in the complex normal space to each strata which intersects <math display="inline">p</math>. The chain <math display="inline">\gamma</math> is supported in the stratum which is the common intersection of the varieties defined by the factors vanishing at <math display="inline">p</math>, and achieves its maximum height at <math display="inline">p</math>.<ref>Pemantle, Wilson and Melczer 2024, pp. 223-224.</ref>
;Arrangement multiple point
:This is the product of a <math display="inline">(d-k)</math>-chain <math display="inline">\gamma</math> and several <math display="inline">k</math>-tori, one for each pair of sheets which intersect transversely, where the torus is the product of circles about <math display="inline">p</math> in each sheet.<ref>Pemantle, Wilson and Melczer 2024, pp. 226.</ref>
;Cone point
:A cone point is zero-dimensional so there is no <math display="inline">\gamma</math>, just a <math display="inline">d</math>-torus about <math display="inline">p</math>.<ref>Pemantle, Wilson and Melczer 2024, pp. 227.</ref>
== Notes ==
{{Reflist}}
== References ==
* {{cite book | last1=Goresky | first1=Mark | last2=MacPherson | first2=Robert | title=Stratified Morse Theory | publisher=Springer-Verlag | year=1988 | url=https://www.math.ias.edu/~goresky/pdf/SMT.djvu }}
* {{cite book | last=Henle | first1=Michael | title=A Combinatorial Introduction to Topology | publisher=Dover Publications Inc. New York | year=1979 }}
* {{citation | last=Mather | first=John | title=Notes on Topological Stability | year=2012 | journal=Bulletin of the American Mathematical Society | volume=49 | number=4 | pages=475-506 | url=https://www.ams.org/journals/bull/2012-49-04/S0273-0979-2012-01383-6/S0273-0979-2012-01383-6.pdf }}.
* {{cite book | last1=Pemantle | first1=Robin | last2=Wilson | first2=Mark C. | last3=Melczer | first3=Stephen | title=Analytic Combinatorics in Several Variables | publisher=Cambridge University Press | year=2024 | edition=2nd | url=https://acsvproject.com/PemantleWilsonMelczer23.pdf }}
qhgh7ix5ualueutg35v7hb616nlhr2v
4676708
4676707
2026-10-18T08:46:02Z
Dom walden
3209423
/* Fringed sets */
4676708
wikitext
text/x-wiki
== Introduction ==
Morse theory tells us that the topology of M only changes at its critical points.
The "Morse data" tells us the topology at each critical point.
Attaching this Morse data together gives us a space which is homopotically eqivalent to M.
This space is a "cell complex", which has an easy to calculate homology.
Theorem: Our domain of convergence is homotopic to a cell complex of dimension at most <math display="inline">2n - d - 1</math>.<ref>This is theorem D.23 in Pemantle, Wilson and Melczer 2024, pp. 546. Also theorem in section 1.2*/5.2* in SMT pp. 200.</ref>
Proof:
# <math display="inline">X</math> is our entire domain, <math display="inline">\mathcal{V}</math> our variety
# Project our entire domain to complex projective space <math display="inline">Z = \pi(X) \subset \C\mathbb{P}^n - H</math> [define H]
# Define a linear subspace <math display="inline">G \subset \C\mathbb{P}^n</math> of dimension <math display="inline">d - 1</math>
# Define a Morse function on <math display="inline">f: \C\mathbb{P}^n \to \R</math> which approximates the distance from <math display="inline">G</math> and such that <math display="inline">f^{-1}(0) = G</math> and <math display="inline">f^{-1}(1) = H</math>
# We "build" <math display="inline">X - \mathcal{V}</math> from <math display="inline">\pi^{-1}(G \cap Z) \cap (X - \mathcal{V})</math> by attaching CW complexes at critical points which are of at most dimension <math display="inline">2n - d - 1</math>
# At a critical point, the normal Morse data is <math display="inline">(J, K) = \coprod_x (J_x, K_x)</math> and the relative complex link is <math display="inline">\mathcal{L}^\pi = \coprod_x \mathcal{L}_x</math>
# We show that the quotient <math display="inline">J_x/K_x</math> is homotopic to a CW complex of dimension <math display="inline">\leq 2n - d - 1</math>
# The neighbourhood of <math display="inline">x</math> in <math display="inline">J_x</math> is homeomorphic to the cone in <math display="inline">L_x(X - \mathcal{V})</math>, and removing the point <math display="inline">x</math> increases the homotopy dimension to at most the homotopy dimension of <math display="inline">L_x</math>
# <math display="inline">(J_x \cup \{x\}, K_x)</math> is homotopic to <math display="inline">(\text{cone}(\mathcal{L}_x), \mathcal{L}_x)</math>
# <math display="inline">\mathcal{L}_x</math> is homotopic to a CW complex of dimension at most <math display="inline">2n - d - 1</math>
# The tangential Morse data at the critical point is homotopic to the pair <math display="inline">(D^\lambda, \partial D^\lambda)</math>
# Therefore, at each critical point a space has been added homotopic to a CW complex of dimension at most <math display="inline">2n - d - 1</math>.
Theorem: If <math display="inline">X</math> is the complement in <math display="inline">\C^n</math> of a complex variety <math display="inline">\mathcal{V}</math> of dimension <math display="inline">d</math> then <math display="inline">X</math> is homotopic to a CW complex of dimension at most <math display="inline">2n - d - 1</math>.<ref>Pemantle, Wilson and Melczer 2024, pp. 546.</ref>
Proof:
# We build <math display="inline">X</math> by attaching cells of dimension at most <math display="inline">2n - d - 1</math> at each critical point.
## Prove that we can do this without changing the homotopy(?)
## We use Thom's Isotopy Lemma to prove that there is a strong deformation retraction, stopping only at critical points.
# Prove these cells are a product of the normal and tangential Morse data.
## Normal data: <math display="inline">(\mathcal{L}(S), \partial \mathcal{L}(S)) \times (D^1, \partial D^1)</math> [GM pp. 18]
## Tangential data: <math display="inline">(B_\delta \cap f^{-1}[v - \epsilon, v + \epsilon], B_\delta \cap f^{-1}(v - \epsilon))</math> for <math display="inline">f</math> restricted to <math display="inline">X</math> (or <math display="inline">\mathcal{V}</math>?) [GM pp. 63-64]
# If <math display="inline">k</math> is the dimension of the strata, then
## If <math display="inline">k = d</math> then it is a smooth point and the cell is the product of <math display="inline">S^{2(n-d)-1}</math> and the tangential data is dimension at most <math display="inline">d</math>.
## If <math display="inline">k < d</math>, ...
<ref>Pemantle, Wilson and Melczer 2024, pp. 547.</ref>
== Example in one dimension ==
Domain with singularities v_1, v_2, ..., v_i
Define our height function f...
Start with our entire domain X
Reduce from X to X_i+ by using Thom's Isotopy lemma to do a strong deformation retract
== Thom's isotopy lemma ==
We present a modified version of Thom's (first) isotopy lemma, less general than the original but more obviously relevant to our situation.
Theorem: Suppose <math display="inline">Z</math> is a closed subset of a smooth manifold <math display="inline">M</math> which admits a Whitney stratification and <math display="inline">h : M \to \R</math> is a proper Morse function which has no critical values on <math display="inline">Z</math>. Then, the level sets of <math display="inline">Z</math> are homeomorphic by a homeomorphism that preserves the strata of <math display="inline">Z</math>.<ref>For various versions of the full statement of the theorem, see Mather 2012, pp. 499, Goresky and MacPherson 1988, pp. 41, or Pemantle, Wilson and Melczer 2024, pp. 541.</ref>
Proof:
# Construct control data for <math display="inline">Z</math> compatible with <math display="inline">h</math>.
## [Prop 7.1] If <math display="inline">h</math> is smooth on <math display="inline">Z</math> and is a submersion for each strata then there exists a family of control data for <math display="inline">Z</math> compatible with <math display="inline">h</math>.<ref>Mather 2012, pp. 488.</ref>
# This makes <math display="inline">Z</math> an abstract stratified set and <math display="inline">f</math> a controlled submersion.
# A controlled submersion has, for any smooth vector field on <math display="inline">\R</math>, a controlled vector field on <math display="inline">Z</math> (a "lift"?)<ref>Mather 2012, pp. 493.</ref>
# A controlled vector field has a unique one-parameter family of homeomorphisms of <math display="inline">Z</math> which commute with <math display="inline">h</math>.<ref>Mather 2012, pp. 496.</ref>
# This makes <math display="inline">h</math> a locally trivial fibration. [Prop 10.2]<ref>Mather 2012, pp. 499.</ref>
Control data:
A system of '''control data''' for <math display="inline">Z</math> consists of, for each stratum <math display="inline">X</math> of <math display="inline">Z</math>,
* a '''tubular neighbourhood''' <math display="inline">T_X</math> of <math display="inline">X</math>
* a '''tubular projection function''' <math display="inline">\pi_X: T_X \to X</math>, and
* a '''tubular distance function''' <math display="inline">\rho_X: T_X \to \R</math> such that <math display="inline">\rho_X^{-1}(0) = X</math><ref>Goresky and MacPherson 1988, pp. 42.</ref>
[illustration]
such that if <math display="inline">X < Y</math> are strata in <math display="inline">Z</math>, then
<math display="block">\pi_X \pi_Y(m) = \pi_X(m),</math>
<math display="block">\rho_X \pi_Y(m) = \rho_X(m)</math>
for all <math display="inline">m \in |T_X| \cap |T_Y|</math> such that <math display="inline">\pi_Y(m) \in |T_X|</math>.
If, for all strata <math display="inline">X</math> and all <math display="inline">m \in |T_X|</math>, we have <math display="inline">h \pi_X(m) = h(m)</math>, then this control data will be said to be compatible with <math display="inline">h</math>.<ref>Mather 2012, pp. 488.</ref>
We prove that if <math display="inline">h</math> is smooth on <math display="inline">Z</math> and is a submersion for each strata then there exists a family of control data for <math display="inline">Z</math> compatible with <math display="inline">h</math>.<ref>Mather 2012, pp. 488, prop 7.1.</ref>
Let <math display="inline">Z_k</math> be the union of strata of <math display="inline">Z</math> of dimension less than <math display="inline">k</math>. We prove by induction on <math display="inline">k</math>.
To construct the tubular neighbourhood <math display="inline">T_X</math> of a stratum <math display="inline">X</math> of dimension less than <math display="inline">k</math>. For <math display="inline">l \leq k</math>, let <math display="inline">U_l</math> denote the union of all <math display="inline">|T_Y|</math> for <math display="inline">Y < X</math> and <math display="inline">\dim Y \geq l</math>. Let <math display="inline">X_l = U_l \cap X</math>.<ref>Mather 2012, pp. 489.</ref>
For <math display="inline">l = k</math>, <math display="inline">X_k = \empty</math>. Assume by induction that <math display="inline">T_{l+1}</math> has been constructed and that if <math display="inline">Y < X</math>, <math display="inline">\dim Y \geq l + 1</math>, <math display="inline">m \in |T_{l+1}| \cap |T_Y|</math> and <math display="inline">\pi_{l+1}(m) \in |T_Y|</math> (<math display="inline">\pi_{l+1} = \pi_{T_{l+1}}</math>) then<ref>Mather 2012, pp. 489-490.</ref>
<math display="block">\rho_Y \pi_{l+1}(m) = \rho_Y(m),</math>
<math display="block">\pi_Y \pi_{l+1}(m) = \pi_Y(m).</math>
We wish to construct a tubular neighbourhood <math display="inline">T_{X,Y}</math> of <math display="inline">|T_Y| \cap X</math> whose restriction to <math display="inline">|T_Y| \cap X_{l+1}</math> is isomorphic to the restriction of <math display="inline">T_{l+1}</math> such that if <math display="inline">m \in |T_{X,Y}| \cap |T_Y|</math> and <math display="inline">\pi_{X,Y}(m) \in |T_Y|</math> (<math display="inline">\pi_{X,Y} = \pi_{T_{X,Y}}</math>) then
<math display="block">\rho_Y \pi_{X,Y}(m) = \rho_Y(m),</math>
<math display="block">\pi_Y \pi_{X,Y}(m) = \pi_Y(m).</math>
By shrinking <math display="inline">|T_Y|</math> if necessary, this relation is already satisfied if <math display="inline">m \in |T_{l+1}| \cap |T_Y|</math> and <math display="inline">\pi_{l+1}(m) \in |T_Y|</math> with <math display="inline">T_{l+1}</math> in place of <math display="inline">T_{X,Y}</math> and <math display="inline">\pi_{l+1}</math> in place of <math display="inline">\pi_{X,Y}</math>. By the definition, if <math display="inline">m \in |T_{l+1}|</math> then there exists <math display="inline">Z < X</math> with <math display="inline">\dim Z > l</math>, <math display="inline">m \in |T_Z|</math> and <math display="inline">\pi_{l+1}(m) \in |T_Z|</math>. We have that <math display="inline">\pi_{l+1}(m) \in |T_Y| \cap |T_Z|</math> and therefore <math display="inline">Y < Z</math>. Therefore<ref>Mather 2012, pp. 490.</ref>
<math display="block">\rho_Y \pi_{l+1}(m) = \rho_Y \pi_Z \pi_{l+1}(m) = \rho_Y \pi_Z(m) = \rho_Y(m),</math>
<math display="block">\pi_Y \pi_{l+1}(m) = \pi_Y \pi_Z \pi_{l+1}(m) = \pi_Y \pi_Z(m) = \pi_Y(m).</math>
We can prove that, by shrinking <math display="inline">|T_Y|</math>, <math display="inline">(\rho_Y, \pi_Y): |T_Y| \cap X \to \R \times Y</math> is a submersion [prop 7.3?] and that <math display="inline">T_{X,Y}</math> is compatible with <math display="inline">(\rho_Y, \pi_Y): |T_Y| \cap X_{l+1} \to \R \times Y</math>, i.e. <math display="inline">(\rho_Y, \pi_Y) \pi_{X,Y}(m) = (\rho_Y, \pi_Y)(m)</math>(?).
To prove it is a submersion, for the tubular neighbourhood <math display="inline">T = (E, \epsilon, \psi)</math> there exists a smooth positive function <math display="inline">\epsilon'</math> such that
<math display="block">(\rho_T, \pi_T): Y \cap |T|_{\epsilon'}^0 \to \R \times X,</math>
where <math display="inline">|T|_{\epsilon'}^0 = \psi(B_\epsilon \cap B_{\epsilon'})</math>, is a submersion. If <math display="inline">\Sigma</math> is the set <math display="inline">y \in |T|</math> such that the rank of
<math display="block">(\rho_T, \pi_T): T \cap |T| \to \R \times X</math>
at <math display="inline">y</math> is less than <math display="inline">\dim(\R \times X)</math>. We need to prove that for any <math display="inline">x \in X</math> there exists a neighbourhood of <math display="inline">x</math> which does not intersect with <math display="inline">\Sigma</math>, i.e. the map is not a submersion in this neighbourhood. It follows from [lemma 7.2] that it is enough to prove for <math display="inline">M = \R^m</math>, <math display="inline">X = \R^{m-c} \times 0_c</math> and <math display="inline">T</math> is the '''standard tubular neighbourhood'''.<ref>Mather 2012, pp. 489.</ref>
By standard tubular neighbourhood, we mean the trivial bundle with base <math display="inline">\R^{m-c}</math> and fibre <math display="inline">\R^c</math> where <math display="inline">\pi: \R^m \to \R^{m-c}</math>...<ref>Mather 2012, pp. 488.</ref>
For <math display="inline">y \in |T| - \R^{m-c}</math>, the kernal of the differential of <math display="inline">(\pi_T, \rho_T)</math> at <math display="inline">y</math> is the orthogonal complement of <math display="inline">(\R^{m-c} \times 0_c) \oplus \stackrel{\frown}{y \pi_T(y)}</math> in <math display="inline">\R^m</math>. By the Whitney conditions, we have that for <math display="inline">y</math> near <math display="inline">\R^{m-c}</math>, <math display="inline">(\R^{m-c} \times 0_c) \oplus \stackrel{\frown}{y \pi_T(y)}</math> is close to the set of <math display="inline">m - c + 1</math> planes in <math display="inline">m-</math>space to an <math display="inline">m - c + 1</math> plane in <math display="inline">TY_y</math>. Therefore, for <math display="inline">y</math> near enough to <math display="inline">\R^{m-c}</math>, <math display="inline">TY_y</math> is transverse to the kernal of the differential of <math display="inline">(\pi_T, \rho_T)</math> and, therefore, is a submersion when restricted to <math display="inline">Y</math>.<ref>Mather 2012, pp. 489.</ref>
To prove that <math display="inline">T_{X,Y}</math> is compatible with <math display="inline">(\rho_Y, \pi_Y): |T_Y| \cap X_{l+1} \to \R \times Y</math>...<ref>Mather 2012, pp. 490.</ref>
Therefore, there exists a tubular neighbourhood <math display="inline">T_0</math> of <math display="inline">X_0</math> satisfying
<math display="block">\rho_Y \pi_0(m) = \rho_Y(m),</math>
<math display="block">\pi_Y \pi_0(m) = \pi_Y(m).</math>
From this we can prove that <math display="inline">T_0</math> is compatible with <math display="inline">h</math>. Replacing <math display="inline">T_0</math> with a smaller tubular neighbourhood if necessary we can assume <math display="inline">m \in |T_0|</math> such that for some <math display="inline">Y < X</math>, <math display="inline">m \in |T_Y|</math> and <math display="inline">\pi_0(m) \in |T_Y|</math>, then<ref>Mather 2012, pp. 490.</ref>
<math display="block">h \pi_0(m) = h \pi_Y \pi_0(m) = h \pi_Y(m) = h(m).</math>
By the generalised tubular neighourhood theorem [prop 7.2?], we can replace <math display="inline">T_0</math> with a tubular neighbourhood <math display="inline">T</math> of <math display="inline">X</math> compatible with <math display="inline">h</math>. This completes the construction of <math display="inline">T_X</math>.<ref>Mather 2012, pp. 491.</ref>
This makes <math display="inline">Z</math> an '''abstract stratified set''' with axioms...<ref>Mather 2012, pp. 491-492.</ref>
This also makes <math display="inline">h</math> a '''controlled submersion''' because
# <math display="inline">h|X: X \to \R</math> is a smooth submersion on each strata <math display="inline">X</math> of <math display="inline">Z</math>, and
# for each stratum <math display="inline">X</math> there is a tubular neighbourhood <math display="inline">T'_X</math> such that <math display="inline">h(v) = h \pi_X(v)</math> for all <math display="inline">v \in T'_X</math>.<ref>Mather 2012, pp. 493.</ref>
The core of this is the concept of a '''vector field'''. A vector field is a function which assigns, for each point <math display="inline">p</math> in a space, a '''vector''', which can be represented by an arrow whose tail starts at <math display="inline">p</math>.<ref>Henle 1979, pp. 33.</ref>
[picture]
Imagine we have a vector field <math display="inline">v(x)</math> defined in a space and draw a line through our space. At each point along this line the vector field assigns a vector. If we move each point in this line along the arrow defined by this vector in the direction of the arrow head. This "flows" the entire line along the vectors.
[picture]
We define a '''stratified vector field''' <math display="inline">\eta</math> on <math display="inline">Z</math> to be a family of smooth vector fields <math display="inline">\eta_X</math>, one for each strata <math display="inline">X</math> of <math display="inline">Z</math>.<ref>Mather 2012, pp. 493.</ref>
We define a '''controlled vector field''' <math display="inline">\eta</math> on <math display="inline">Z</math> to be a stratified vector field such that for any strata <math display="inline">Y</math> there exists a tubular neighbourhood <math display="inline">T'_Y</math> such that for any <math display="inline">X > Y</math> and any <math display="inline">v \in T'_X \cap X</math><ref>Mather 2012, pp. 493.</ref>
<math display="block">\eta_X \rho_{Y,X}(v) = 0,</math>
<math display="block">(\pi_{Y,X})_* \eta_X(v) = \eta_Y (\pi_{Y,X}(v)).</math>
We prove that if <math display="inline">h</math> is a controlled submersion then, for any smooth vector field <math display="inline">\zeta</math> on <math display="inline">\R</math> there is a controlled vector field <math display="inline">\eta</math> on <math display="inline">Z</math> such that <math display="inline">h_* \eta(v) = \zeta(h(v))</math> for all <math display="inline">v \in Z</math>.<ref>Mather 2012, pp. 493.</ref>
Proceeding by induction on the maximum dimension of the strata of <math display="inline">Z</math>, we define <math display="inline">Z_k</math> to be the union of strata of <math display="inline">Z</math> of dimension at most <math display="inline">k</math>. The tubular neighbourhood of <math display="inline">Z_k</math> is the intersection of the tubular neighbourhoods of each strata in <math display="inline">Z_k</math> with <math display="inline">Z</math>. The projection and distance functions are the restrictions of the respective functions of <math display="inline">Z</math>.
It is trivially true when the maximum dimension of strata in <math display="inline">Z</math> is zero. Assume it is true for <math display="inline">k</math> and construct each <math display="inline">\eta_X</math> separately for each stratum <math display="inline">X</math> of dimension <math display="inline">k + 1</math>.
By the assumption that we have controlled vector fields for all strata <math display="inline">Y</math> of dimension at most <math display="inline">k</math>, we have the two control conditions defined above for any <math display="inline">X > Y</math> and that there is a neighbourhood <math display="inline">T^1_Y</math> such that <math display="inline">h(v) = h \pi_Y(v)</math> for <math display="inline">v \in T^1_Y</math>.
We want to prove that for all <math display="inline">Y < X</math>, the control conditions are satisfied for all <math display="inline">v \in T^2_Y</math> and that <math display="inline">h_*\eta_X(v) = \zeta(v)</math> for all <math display="inline">v \in X</math>.
Take a point <math display="inline">x \in X</math> and define the set <math display="inline">S_v</math> of strata <math display="inline">Y < X</math> such that <math display="inline">v \in T^2_Y</math>. <math display="inline">S_v</math> is totally ordered since if <math display="inline">Y_1</math> and <math display="inline">Y_2</math> are not comparable then <math display="inline">T^2_{Y_1} \cap T^2_{Y_2} = \empty</math>. Therefore, there is a largest member <math display="inline">Y = Y_v</math>.
Assume the control conditions hold for <math display="inline">Y = Y_v</math>. Then they hold for all <math display="inline">Y_i \in S_v</math>. For, either <math display="inline">Y_i = Y</math> or <math display="inline">Y_i < Y</math>. In the latter case, <math display="inline">\pi_Y(v) \in T^1_{Y_i}</math> (by the choice of <math display="inline">T^2_Y</math>'s [is this why?]. Then
<math display="block">\begin{align}
\eta_X(v) \rho_{Y_i,X}(v) &= \eta_X \rho_{Y_i,Y} \pi_{Y,X}(v) \\
&= (\pi_{Y,X})_* \eta_X(v) \rho_{Y_i,Y} \\
&= \eta_Y(\pi_{Y,X}(v)) \rho_{Y_i,Y} \\
&= 0
\end{align}</math>
and
<math display="block">\begin{align}
(\pi_{Y_i,X})_* \eta_X(v) &= (\pi_{Y_i,Y})_* (\pi_{Y,X})_* \eta_X(v) \\
&= (\pi_{Y_i,Y})_* \eta_Y(v) (\pi_{Y,X}) \\
&= \eta_{Y_i}(\pi_{Y_i,Y} \pi_{Y,X}(v)) \\
&= \eta_{Y_i}(\pi_{Y_i,X}(v))
\end{align}</math>
and, therefore, condition holds for all <math display="inline">Y_i \in S_v</math>. Also,
<math display="block">\begin{align}
h_* \eta_X(v) &= (h \circ \pi_{Y,X})_* \eta_X(v) \\
&= h_* \eta_Y (\pi_{Y,X}(v)) \\
&= \zeta(f(v))
\end{align}</math>
and, therefore, the conclusion of the theorem holds at <math display="inline">v</math>.
This shows we can construct <math display="inline">\eta_X</math> satisfying the control conditions when <math display="inline">S_v</math> is non-empty and satisfying the theorem when <math display="inline">S_v</math> is empty. The set of vectors satisfying these conditions is convex in <math display="inline">TX_v</math>, and so we construct <math display="inline">\eta_X</math> globally via a partition of unity.<ref>Mather 2012, pp. 493-495.</ref>
Finally, we prove that a controlled vector field has a unique one-parameter family of homeomorphisms of <math display="inline">Z</math> which commute with <math display="inline">h</math>.<ref>Mather 2012, this combines Proposition 10.1 and Corollary 10.2 on pp. 496 and 497, respectively.</ref>
For each stratum <math display="inline">X</math> of <math display="inline">Z</math>, <math display="inline">\eta_X</math> generates a unique smooth local one-parameter group <math display="inline">(J_X, \alpha_X)</math> of diffeomorphisms of <math display="inline">X</math> (by standard results of differential geometry), such that <math display="inline">\frac{d}{dt} \alpha(t, v)|_{t=0} = \eta_X(v)</math>, <math display="inline">J_X</math> is an open subset of <math display="inline">\R \times Z</math>, ...
If we define <math display="inline">(J, \alpha)</math> by
<math display="block">J = \bigcup_{X \in S} J_X</math>
<math display="block">\alpha = \bigcup_{X \in S} \alpha_X</math>
we can prove that this is a local one-parameter family of homeomorphisms.<ref>Mather 2012, pp. 496.</ref>
Firstly, it is clear that
# <math display="inline">0 \times Z \subseteq J</math> and <math display="inline">\alpha(0, v) = v</math> for all <math display="inline">v \in Z</math>.
# If <math display="inline">v \in Z</math> then <math display="inline">J_v = J \cap (\R \times v) \subseteq \R</math> is an open interval <math display="inline">(a_v, b_v)</math>, possibly infinite at one or both ends.
# If <math display="inline">v \in Z</math> and <math display="inline">t, s, t + s</math> are in <math display="inline">(a_v, b_v)</math> then <math display="inline">\alpha(t + s, v) = \alpha(t, \alpha(s, v))</math>.<ref>Mather 2012, pp. 495.</ref>
Secondly, it is clear that <math display="inline">\eta</math> generates <math display="inline">\alpha</math> because
# Each stratum <math display="inline">X</math> of <math display="inline">Z</math> is invariant under <math display="inline">\alpha</math>, i.e. <math display="inline">\alpha[J \cap (\R \times X)] \subseteq X</math>.
# For each <math display="inline">v \in Z</math>, the map <math display="inline">t \to \alpha(t, v)</math> of <math display="inline">(a_v, b_v)</math> into the stratum which contains <math display="inline">v</math> is <math display="inline">C^1</math>.
# For any <math display="inline">(t, v) \in Z</math>(?) we have <math display="inline">d/dt \alpha(t, v) = \eta(\alpha(t, v))</math>.<ref>Mather 2012, pp. 495.</ref>
It is unique because each <math display="inline">(J_X, \alpha_X)</math> is unique. We just need to prove that <math display="inline">J</math> is open, <math display="inline">\alpha</math> is continuous, and for any <math display="inline">v \in Z</math> and any compact set <math display="inline">K \subseteq Z</math> there exists <math display="inline">\epsilon > 0</math> such that <math display="inline">\alpha(t, v) \notin K</math> if <math display="inline">t \in (a_v, a_v + \epsilon) \cup (b_v - \epsilon, b_v)</math>.<ref>Mather 2012, pp. 495.</ref>
For the latter-most condition, if it did not hold then there exists...<ref>Mather 2012, pp. 496-497.</ref>
We prove there is a homeomorphism <math display="inline">f: Z \to h^{-1}(0) \times \R</math> such that <math display="inline">\pi \circ f = h</math>, where <math display="inline">\pi: h^{-1}(0) \times \R \to \R</math> is projection to the second factor.
For the coordinate vector field <math display="inline">\partial</math> on <math display="inline">\R</math>, by [prop 9.1] there is a controlled vector field <math display="inline">\tilde\partial</math> such that <math display="inline">f_* \tilde\partial(v) = \partial(h(v))</math> for <math display="inline">v \in Z</math>. By [prop 10.1], <math display="inline">\tilde\partial</math> generates a local one-parameter group <math display="inline">(J, \alpha)</math> such that
<math display="block">h(\alpha(t,v)) = h(v) + t</math>
<math display="inline">h</math> is proper and [d] holds, so <math display="inline">J = \R \times Z</math>. If we define <math display="inline">f</math> as
<math display="block">f(v) = (\alpha(-t, v), h(v))</math>
then <math display="inline">f</math> maps <math display="inline">Z</math> into <math display="inline">h^{-1}(0) \times \R</math> and <math display="inline">\pi \circ f = h</math>. If we define <math display="inline">\bar f: h^{-1}(0) \times \R \to Z</math> as
<math display="block">\bar f(v, t) = \alpha(t, v)</math>
then <math display="inline">f \bar f = \bar f f = Id</math> and <math display="inline">f</math> is a homeomorphism.<ref>Mather 2012, pp. 497.</ref>
== Topology at critical points ==
Theorem: If there is a critical point <math display="inline">p</math> in the singular variety <math display="inline">\mathcal{V}</math> with critical value <math display="inline">v \in (a, b)</math> then the space <math display="inline">X_{\leq b}</math> is homotopic to<ref>Goresky and MacPherson 1988, pp. 174.</ref>
<math display="block">X_{\leq a} \cup [(D^{\lambda+1}, \partial D^{\lambda+1}) \times (\mathcal{L}_X, \partial \mathcal{L}_X)].</math>
Proof:<ref>Proof outline comes from Goresky and MacPherson 1988, pp. 174.</ref>
# <math display="inline">(X_{\leq b}, X_{\leq a})</math> is homeomorphic to <math display="inline">(X_{\leq v + \epsilon}, X_{\leq v -\epsilon})</math>. We can prove this by "moving wall" or Thom's Isotopy Lemma.<ref>Goresky and MacPherson 1988, pp. 90-91, 120.</ref>
# <math display="inline">X_{\leq v + \epsilon}</math> is homeomorphic to <math display="inline">X_{\leq v - \epsilon} \cup (J, K)</math>, where the latter is the local Morse data for <math display="inline">h</math> at <math display="inline">p</math>. We do this by moving the wall...<ref>Goresky and MacPherson 1988, pp. 95-96, 120-121.</ref>
# <math display="inline">(J, K)</math> is homeomorphic to <math display="inline">(D^{\lambda+1}, \partial D^{\lambda+1}) \times (\mathcal{L}_X, \partial \mathcal{L}_X)</math> (tangential data, normal data). Again, moving the wall...<ref>Goresky and MacPherson 1988, pp. 65-66, chapter 8, 121.</ref>
# The normal Morse data depends only on the differential <math display="inline">df(p)</math>.<ref>Goresky and MacPherson 1988, pp. 93.</ref>
# The normal Morse data has the homotopy type of <math display="inline">(\mathcal{L}_X, \partial \mathcal{L}_X)</math>.<ref>Goresky and MacPherson 1988, pp. 169.</ref>
=== Step 1 ===
We get this immediately(?) by Thom's Isotopy Lemma.
=== Step 2 ===
<ref>Goresky and MacPherson 1988, complex case on pp. 120-121 is extension of real case on pp. 95-96.</ref>
Step 1 works because <math display="inline">h</math> is a submersion at each point of the regions we are homeomorphing. This is not the case at critical points. We need some way by which a homeomorphism can pass through a critical point.
To prove a homeomorphism between two subsets <math display="inline">A</math> and <math display="inline">B</math> of <math display="inline">Z</math>, we project <math display="inline">Z</math> to some other space <math display="inline">N</math> (in our case <math display="inline">\R^n</math>) using some function <math display="inline">F</math>. We take subsets <math display="inline">Y_0</math> and <math display="inline">Y_1</math> of <math display="inline">N</math> such that <math display="inline">A = Z \cap F^{-1}(Y_0)</math> and <math display="inline">B = Z \cap F^{-1}(Y_1)</math>. We need to prove <math display="inline">Y_0</math> and <math display="inline">Y_1</math> are connected by a one-parameter family of regions <math display="inline">Y_t</math> [explain one-parameter family]. The criterion for such a family to exist is that the '''characteristic covectors''' of <math display="inline">F</math> are all nonzero on each stratum of <math display="inline">Y_t</math>.<ref>Goresky and MacPherson 1988, pp. 70.</ref>
At each point <math display="inline">x \in M</math> and <math display="inline">y \in N</math> there are '''tangent spaces''' <math display="inline">T_xM</math> and <math display="inline">T_yN</math>, a vector space whose zero is at the point <math display="inline">x</math> or <math display="inline">y</math> (resp.)
[picture of various tangent spaces]
In the case the <math display="inline">N = \R</math>, the tangent space <math display="inline">T_x\R</math> is just <math display="inline">\R</math> but whose origin is at <math display="inline">x</math>.
[picture of T_x\R]
Say <math display="inline">F(x) = y</math>, then the differential of the map <math display="inline">F</math> can be seen as a function whose input is a vector in the tangent space <math display="inline">T_xM</math> and whose output is a vector in the tangent space <math display="inline">T_yM</math>. [If I move this far on the tangent space of M how do I move in the tangent space of N?]
[picture]
[example for M = \R and N = \R?]
A function which takes as input a vector in the tangent space <math display="inline">T_xM</math> (say) and outputs a scalar (usually <math display="inline">\R</math>) is called a '''covector'''. The set of all covectors on <math display="inline">T_xM</math> is called the dual space of <math display="inline">T_xM</math> and is denoted <math display="inline">T^*_xM</math>. There are only a limited number of ways to express a covectors. For example, if our tangent space is two-dimensional then all covectors are of the form <math display="inline">ax + by</math> where <math display="inline">(x, y) \in T_xM</math>.
We take our space <math display="inline">M</math> and map it onto <math display="inline">\R^2</math> with the map <math display="inline">F(z) = (r(z), h(z))</math>, where <math display="inline">z \in M</math> and <math display="inline">r</math> is the square of the distance of <math display="inline">z</math> to the critical point <math display="inline">p</math>.
[graph of mapping]
In this case, the covectors on the tangent space <math display="inline">T_xM</math> are of the form <math display="inline">adf(x) + bdr(x)</math> (in this case <math display="inline">df</math> and <math display="inline">dr</math> are maps to <math display="inline">\R</math>) and on <math display="inline">T_y\R^2</math> are of the form <math display="inline">cu + dv</math> (for <math display="inline">(u, v) \in \R^2</math>). A covector <math display="inline">cu + dv \in T^*_{(u, v)}\R^2</math> is called a '''characteristic covector''' of <math display="inline">F</math> if <math display="inline">F(x) = (u, v)</math> and <math display="inline">cdf(x) + ddr(x) = 0</math> for all vectors in the tangent space of the stratum containing <math display="inline">p</math>.<ref>Goresky and MacPherson 1988, pp. 82.</ref> [explain adf(x) + bdr(x) in terms of this being a function which takes a vector input]
[example of where covectors do and do not vanish on a stratified space, pp. 71?]
What we want is a homeomorphism in <math display="inline">M</math> between the space <math display="inline">Z_{\leq \epsilon}</math> and <math display="inline">Z_{\leq \epsilon} \cup B</math>, where <math display="inline">B</math> is a small region of the critical point <math display="inline">p</math>. The '''local Morse data''' is
<math display="block">((B_\delta \cap Z) \cap f^{-1}[v-\epsilon, v+\epsilon], (B_\delta \cap Z) \cap f^{-1}(v-\epsilon))</math>
where <math display="inline">B_\delta</math> is a closed disc in <math display="inline">M</math> of radius <math display="inline">\delta</math>.<ref>Goresky and MacPherson 1988, pp. 63-64.</ref> Observe that this is the pair <math display="inline">(F^{-1}(\text{Box}(\delta, \epsilon)), F^{-1}(\text{Bottom}(\delta, \epsilon)))</math><ref>Goresky and MacPherson 1988, pp. 91.</ref> [explain Box, Bottom, etc.]
[picture of the two subspaces of Z in M]
We use our map <math display="inline">F</math> to convert these two subspaces to subspaces of <math display="inline">\R^2</math> which are of the form <math display="inline">Y_1 = \{(x,y) \in \R^2 | y \leq \epsilon\}</math> and <math display="inline">Y_0 = \{(x,y) \in \R^2 | y \leq -\epsilon\} \cup \{(x,y) \in \R^2 | x \leq \delta, y \leq \epsilon\}</math>, such that <math display="inline">Z_{\leq \epsilon} = F^{-1}(Y_1)</math> and <math display="inline">Z_{\leq \epsilon} \cup B = F^{-1}(Y_0)</math>.<ref>Goresky and MacPherson 1988, pp. 95-96.</ref>
We use a homeomorphism between <math display="inline">Y_1</math> and <math display="inline">Y_0</math> using the technique of "moving the wall" and Thom's Isotopy Lemma. Such a homeomorphism exists when the characteristic covectors of <math display="inline">F</math> are all nonzero on each stratum of <math display="inline">Y_t</math>.<ref>Goresky and MacPherson 1988, chapter 4, particularly pp. 71-72.</ref>
Given a smooth mapping between manifolds <math display="inline">F: M \to N</math> (for example, in our case we could have <math display="inline">N = \R^2</math>) and that <math display="inline">F|Z: Z \to N</math> is proper. Let <math display="inline">Y \subset N \times \R</math> be a closed Whitney stratified subset such that the projection to the second factor <math display="inline">\pi: Y \to \R</math> is a proper stratified submersion.<ref>Goresky and MacPherson 1988, pp. 71.</ref>
Suppose for each <math display="inline">t \in \R</math>, for each <math display="inline">p \in F(Z) \cap Y_t</math>, and for each nonzero characteristic covector <math display="inline">\lambda \in T^*_pN</math> of <math display="inline">F|Z</math>, the restriction of <math display="inline">\lambda</math> to the subspace <math display="inline">T_pS_t = \ker(d\pi(p)) \cap T_pS</math> is nonzero, where <math display="inline">S</math> is a stratum of <math display="inline">Y</math> which contains <math display="inline">(p, t)</math> and <math display="inline">S_t = \pi^{-1}(t) \cap S</math> is the stratum of <math display="inline">Y_t = \pi^{-1}(t) \cap Y</math> which contains <math display="inline">p</math>. This is equivalent to the statement that, for each <math display="inline">t \in \R</math>, the restriction <math display="inline">F|Z</math> is transverse to <math display="inline">Y_t</math>.<ref>Goresky and MacPherson 1988, pp. 71-72.</ref>
This means that, for each <math display="inline">t \in \R</math>, <math display="inline">Z \cap F^{-1}(Y_t)</math> is stratified by its intersection with the strata of <math display="inline">Z</math>...
We finally prove there is a homeomorphism between <math display="inline">Z \cap F^{-1}(Y_0) \cong Z \cap F^{-1}(Y_1)</math> which preserves the Whitney stratification of both sides and is smooth on each stratum.
For the composition
<math display="block">Z \times \R \subset M \times \R \to_{F \times I} Y \subset \R^2 \times \R \to_{\pi} \R</math>
where <math display="inline">Y(t, z) = Y_t(z)</math>, <math display="inline">I</math> is the identity and <math display="inline">\pi</math> is projection to the second factor.
<math display="inline">Z \times \R</math> is transverse to <math display="inline">(F \times I)^{-1}(Y)</math>...
The composition <math display="inline">\pi \circ (F \times I): Z \times \R \cap (F \times I)^{-1}(Y) \to \R</math> is a stratified submersion because
* The input domain is stratified as above...,
* We have defined <math display="inline">F|Z</math> to be transverse to <math display="inline">Y</math>, and therefore it preserves the stratification (unless <math display="inline">F(Z) \cap Y = \empty</math>), and
* We defined above the projection on <math display="inline">Y</math> to be a stratified submersion, meaning it is a submersion on each stratum of <math display="inline">F(Z) \cap Y</math>.<ref>Goresky and MacPherson 1988, pp. 43.</ref>
Therefore, we can apply Thom's Isotopy Lemma which says there is a homeomorphism between the level sets of <math display="inline">Z \times \R</math>...<ref>Goresky and MacPherson 1988, pp. 72.</ref>
=== Step 3 ===
==== Characteristic covectors ====
==== Fringed sets ====
When manipulating our domain of integration[?], we need to make sure we are doing this in regions with no characteristic covectors. The introduce the concept of a fringed set, a subset of <math display="inline">R^2</math>, and construct a series of fringed sets which contain no characteristic covectors.
A '''fringed set''' <math display="inline">A \subset \R \times \R^+</math> is an open subset of the first quadrant of <math display="inline">\R^2</math>. <math display="inline">A</math> is fringed over <math display="inline">0 < y \ll x</math> if for some interval <math display="inline">S = (0, x)</math>
# the projection of <math display="inline">A</math> to the first factor is equal to <math display="inline">S</math>,
# <math display="inline">A</math> is open in <math display="inline">S \times \R^+</math>,
# if <math display="inline">(s, y) \in A</math> and <math display="inline">0 < y' \leq y</math> then <math display="inline">(s, y') \in A</math>.<ref>Goresky and MacPherson 1988, pp. 77.</ref>
[picture]
The fringed set <math display="inline">A^\flat</math> is the set <math display="inline">A</math> plus its reflection about the <math display="inline">x</math> axis.<ref>Goresky and MacPherson 1988, pp. 82.</ref>
[picture]
We build a series of fringed sets which do not contain characteristic covectors, which will be used later in our proof.
There exists a fringed set <math display="inline">A_2</math> of type <math display="inline">0 < v \ll u</math> such that for any <math display="inline">z \in Z</math> such that <math display="inline">r\pi(z) \leq r_2</math>, the map <math display="inline">(\rho, f - f\pi)|\pi^{-1}(\pi(z)): \pi^{-1}(\pi(z)) \to \R^2</math> has no characteristic covectors in <math display="inline">A^\flat_2</math>.<ref>Goresky and MacPherson 1988, pp. 84.</ref>
Given that the set of points <math display="inline">(u, v) \in \R^2</math> which have a nonzero characteristic covector is closed, then it is enough to prove it for points <math display="inline">(u, 0) \in \R^2</math>. Proof by contradiction. Assume it is false and that there is a sequence of points <math display="inline">p_i \in Z \cap f^{-1}(0)</math> converging to <math display="inline">p</math> such that <math display="inline">d\rho(p_i)</math>, <math display="inline">df(p_i)</math> and <math display="inline">df\pi(p_i)</math> are linearly dependent when restricted to the stratum <math display="inline">Y</math> which contains <math display="inline">p_i</math>. This would mean that <math display="inline">f</math> has a critical point on <math display="inline">Y \cap \partial B_{\rho(p_i)}(p)</math>.<ref>Goresky and MacPherson 1988, pp. 82-83.</ref>
By restricting to a subsequence if necessary, we may assume the points <math display="inline">p_i</math> are all contained in the same stratum <math display="inline">Y</math>, that the tangent planes <math display="inline">T_{p_i}Y</math> converge to some plane <math display="inline">Q</math> and the secant lines <math display="inline">\mathcal{l}_i = \overline{p_i p}</math> converge to some line <math display="inline">\mathcal{l}</math>. By the Whitney conditions [how?], <math display="inline">Q = \lim_{i \to \infty} \mathcal{l}_i \oplus T_{p_i}(Y \cap \partial B_\delta(p))</math>.<ref>Goresky and MacPherson 1988, pp. 83.</ref>
For each <math display="inline">i</math>, <math display="inline">f(p_i) = f(p) = v</math>, this means[?] <math display="inline">df(p)(Q) = 0</math>. On the assumption that <math display="inline">df(p)</math> is nondegenerate, we may assume <math display="inline">Y = X</math>, so <math display="inline">\ker d(f|X)(p_i) = T_{p_i}(X \cap \partial B_\delta(p)) = T_{p_i}(X \cap f^{-1}(v))</math>, which converges to a subspace <math display="inline">\tau</math> of <math display="inline">Q = T_pX</math>, perpendicular to <math display="inline">\mathcal{l}</math>. However, as <math display="inline">f^{-1}(v) \cap X</math> satisfies Whitney's conditions, <math display="inline">\mathcal{l} \subset \tau</math>, a contradiction.<ref>Goresky and MacPherson 1988, pp. 83.</ref>
We observe that if <math display="inline">df(p)</math> is a nondegenerate characteristic covector for <math display="inline">Z</math> then it is also a nondegenerate characteristic covector for <math display="inline">Z \cap \pi^{-1}(p)</math>.<ref>Goresky and MacPherson 1988, pp. 84.</ref>
==== Homeomorphism ====
We prove there is a stratum preserving homeomorphism between<ref>Goresky and MacPherson 1988, pp. 65.</ref>
<math display="block">\text{Local Morse Data} \cong (\text{Tangential Morse Data}) \times (\text{Normal Morse Data})</math>
We first prove that there is a homeomorphism between the product of the normal and tangential Morse data and the '''realisation''' of the following diagram
[diagram from pp. 102]
where realisation means
<math display="block">Z \cap (g_1, h_1)^{-1}(P_a) \cap (g_2, h_2)^{-1}(P_b)</math>
where all the intersections of strata (of <math display="inline">Z</math>?) are transverse.<ref>Goresky and MacPherson 1988, pp. 100-102.</ref>
The realisation of the above diagram is equal to
<math display="block">(V_1, V_2) \cap (W_1, W_2) = (V_1 \cap W_1, V_1 \cap W_2 \cup V_2 \cap W_1)</math>
where
<math display="block">V_1 = \{ z \in Z : |f(z) - f\pi(z)| \leq \epsilon/4, r\pi(z) \leq \delta, \rho(z) \leq \delta \}</math>
<math display="block">V_2 = \{ z \in Z : f(z) - f\pi(z) = -\epsilon/4, r\pi(z) \leq \delta, \rho(z) \leq \delta \}</math>
<math display="block">W_1 = \{ z \in Z : |f\pi(z)| \leq 3\epsilon/4, r\pi(z) \leq \delta \}</math>
<math display="block">W_1 = \{ z \in Z : f\pi(z) = -3\epsilon/4, r\pi(z) \leq \delta \}</math>
where <math display="inline">\pi</math> is the projection from the tubular neighbourhood to <math display="inline">Z</math>, <math display="inline">r(z)</math> is the square of the distance between <math display="inline">z</math> and the critical point <math display="inline">p</math> and <math display="inline">\rho(z)</math> is the square of the distance between <math display="inline">z</math> and <math display="inline">\pi(z)</math>.<ref>Goresky and MacPherson 1988, pp. 100-101.</ref> <math display="inline">\epsilon \ll \delta</math> are chosen so that <math display="inline">(\delta, \epsilon)</math> is in the set <math display="inline">A^\flat_6</math> which consists of <math display="inline">A_6 \subset \R^+ \times \R^+</math> with the properties that for <math display="inline">(\epsilon, \delta) \in A_6</math> and <math display="inline">z</math> such that <math display="inline">\rho(z) = \delta</math>, <math display="inline">r\pi(z) = \delta</math>, <math display="inline">|f(z)| \leq \epsilon</math> and <math display="inline">|f\pi(z)| \leq \epsilon</math> then the covectors <math display="inline">d\rho(z)</math>, <math display="inline">dr\pi(z)</math>, <math display="inline">df(z)</math> and <math display="inline">df\pi(z)</math> are linearly independent when restricted to <math display="inline">T_zY</math> (where <math display="inline">Y</math> is the stratum containing <math display="inline">z</math>). We can prove such a set exists.<ref>Goresky and MacPherson 1988, pp. 89.</ref> <math display="inline">A^\flat_6</math> is this plus its reflection about the <math display="inline">x</math> axis.<ref>Goresky and MacPherson 1988, pp. 82.</ref>
Let <math display="inline">D = \{ x \in X | r(x) \leq \delta \}</math> for stratum <math display="inline">X</math>. We will show there is a local trivial fibration of the configuration: <math display="inline">(V_1, V_2)</math> fibres over <math display="inline">D</math> and is homeomorphic to <math display="inline">D \times (\text{normal Morse data})</math>
(V_1, V_2) -> D \times (normal Morse data)
| /
--> D <---
and that <math display="inline">(W_1, W_2)</math> fibres over the tangential Morse data and is homeomorphic to <math display="inline">(\text{tangential Morse data}) \times (\text{normal slice})</math>.
For <math display="inline">Z_1 = \{ z \in Z : r\pi(z) \leq \delta \}</math>, the map <math display="inline">F(z): Z_1 \to \R^2 = (\rho(z), f(z) - f\pi(z))</math> is transverse to each stratum of <math display="inline">\text{Box}(\delta, \epsilon/4)</math>, [list], [by lemma 6.5]. <math display="inline">(V_1, V_2) = F^{-1}(\text{Box}(\delta, \epsilon/4), \text{Bottom}(\delta, \epsilon/4))</math>. For each stratum <math display="inline">S</math> of Box and each <math display="inline">x \in D</math>, we have transverse intersection <math display="inline">F^{-1}(S) \pitchfork \pi^{-1}(x)</math>. Therefore, <math display="inline">\pi|F^{-1}(S)</math> is a submersion and by Thom's isotopy lemma the projection <math display="inline">\pi|F^{-1}(\text{Box}(\delta, \epsilon/4): F^{-1}(\text{Box}(\delta, \epsilon/4)) \to X</math> is a stratified fibre bundle over <math display="inline">D</math>. The fibre over the critical point <math display="inline">p</math> is <math display="inline">\pi^{-1}(p) \cap (F^{-1}(\text{Box}(\delta, \epsilon/4), F^{-1}(\text{Bottom}(\delta, \epsilon/4))</math> and is equal to the normal Morse data...<ref>Goresky and MacPherson 1988, pp. 101.</ref>
Take <math display="inline">G: X \to \R^2 = (r(x), f(x))</math>. <math display="inline">\delta</math> and <math display="inline">\epsilon</math> have been chosen so that <math display="inline">(G^{-1}(\text{Box}(\delta, \epsilon/4), G^{-1}(\text{Bottom}(\delta, \epsilon/4))</math> is the tangential Morse data for <math display="inline">f</math> and is contained in the region <math display="inline">D</math> over which <math display="inline">\pi|(V_1, V_2)</math> is a stratified fibre bundle. Therefore, <math display="inline">(W_1, W_2) = \pi^{-1} G^{-1}(\text{Box}(\delta, \epsilon/4), \text{Bottom}(\delta, \epsilon/4))</math> is transverse to <math display="inline">(V_1, V_2)</math>.<ref>Goresky and MacPherson 1988, pp. 101-102.</ref>
Finally, this means that <math display="inline">(V_1, V_2) \cap (W_1, W_2)</math> is homeomorphic (by stratum preserving homeomorphism) to <math display="inline">(\pi^{-1}(p), \cap (V_1, V_2)) \times \pi(W_1, W_2)</math>, the product of normal and tangential Morse data.<ref>Goresky and MacPherson 1988, pp. 102.</ref>
We use a succession of such diagrams to interpolate between the box diagram which defines local Morse data [explain] and the above diagram whose realisation we have just proven is <math display="inline">(\text{normal Morse data}) \times (\text{tangential Morse data})</math>.
[diagram_d0.py]
The realisation is the local Morse data. This is equal to the realisation of the diagram below.<ref>Goresky and MacPherson 1988, pp. 103, 106.</ref>
[diagram_d11.py]
The realisation of the first diagram [d0] is equivalent to the realisation of the below diagram.
[diagram_d1.py]
In the right-hand picture of the above diagram, we have put a dotted outline around the region <math display="inline">A^{\flat}_1</math>. We prove that there are no characteristic covectors for <math display="inline">(r, f): Z \to \R^2</math> in this region and can, therefore, move the wall in this region...<ref>Goresky and MacPherson 1988, pp. 82-83.</ref>
By adding a zero-dimensional stratum at the top right corner of the right-hand picture. A one-parameter family of pictures <math display="inline">P_b(t)</math> gives rise to a stratified space <math display="inline">Y \subset M \times \R</math> such that
<math display="block">Y = \{ (z, t) \in M \times \R : (r, f)(z) \in P_b(t) \}.</math>
<math display="inline">(r, f)</math> takes each stratum of <math display="inline">Z</math> transversally to each stratum of each <math display="inline">Y_t</math>. <math display="inline">(f \circ \pi, f)^{-1}(P_a) = f^{-1}[-\epsilon, \infty)</math> is transverse to each stratum of <math display="inline">Y_t \cap Z</math>. Therefore, there is a homeomorphism between<ref>Goresky and MacPherson 1988, pp. 107.</ref>
<math display="block">Z(D_1) = Z \cap (f \circ \pi, f)^{-1}(P_a) \cap (r, f)^{-1}(P_b(0))</math>
and
<math display="block">Z(D_1) = Z \cap (f \circ \pi, f)^{-1}(P_a) \cap (r, f)^{-1}(P_b(1)).</math>
To go from D_2 to D_3 we find the characteristic covectors of <math display="inline">(f\pi, f): V \to \R^2</math> where <math display="inline">V = (r, f)^{-1}(P_b(1))</math>. We stratify <math display="inline">P_b(1)</math> by its interior <math display="inline">P</math> and boundary <math display="inline">\partial P</math>.<ref>Goresky and MacPherson 1988, pp. 107.</ref>
The strata of <math display="inline">V</math> come in four types:
# <math display="inline">(r, f)^{-1}(P) \cap X</math>
# <math display="inline">(r, f)^{-1}(P) \cap Y</math>
# <math display="inline">(r, f)^{-1}(\partial P) \cap X</math>
# <math display="inline">(r, f)^{-1}(\partial P) \cap Y</math>
where <math display="inline">X</math> is the strata that contains the critical point and <math display="inline">Y</math> is any other strata such that <math display="inline">Y > X</math>.
All characteristic covectors are of the form <math display="inline">\lambda = (u, v, adu + bdv) \in T^*\R^2</math>.
For strata 1 and 3, the image of <math display="inline">X</math> under <math display="inline">(f\pi, f)</math> is the diagonal <math display="inline">f\pi = f</math> (dotted outline). Therefore, the characteristic covectors of any point <math display="inline">z</math> in <math display="inline">X</math> are either where <math display="inline">z = p</math>, in which case the covector is zero(?), or where <math display="inline">z \neq p</math>, in which case <math display="inline">u = v</math> and <math display="inline">a = b</math>.<ref>Goresky and MacPherson 1988, pp. 107-108.</ref>
For strata 2, being that the critical point is isolated and non-degenerate, which means it, and any neighbourhood, is not zero on any limit of tangent spaces in strata <math display="inline">Y > X</math>. Therefore, <math display="inline">f</math> and <math display="inline">f\pi</math> are linearly independent.<ref>Goresky and MacPherson 1988, pp. 84.</ref> Unless <math display="inline">\pi(z) = p</math>, in which case <math display="inline">d(f\pi)(z) = f\pi(z) = 0</math>, so they are covectors where <math display="inline">u = 0</math> and <math display="inline">b = 0</math>.<ref>Goresky and MacPherson 1988, pp. 108.</ref>
For strata 4, we can use implicit function theorem to generate local coordinates <math display="inline">y_1, \cdots y_{r-s-1}</math> in <math display="inline">Y > X</math> and define the Riemannian metric <math display="inline">r(z) = r\pi(z) + (f(z) - f\pi(z))^2 + g(y)</math> for some <math display="inline">g</math> depending only on <math display="inline">y</math>.
There are no characteristic covectors in <math display="inline">|u| \leq \epsilon</math> and <math display="inline">|v| < \epsilon</math>. By [lemma 6.7 and 6.8 and 8.1(d)] <math display="inline">df</math>, <math display="inline">df\pi</math> and <math display="inline">dr</math> are linearly independent in this region.<ref>Goresky and MacPherson 1988, pp. 109.</ref> Given <math display="inline">|f| \leq \epsilon</math> and <math display="inline">|f\pi| \leq \epsilon</math>, a fringed set <math display="inline">A^\flat_4</math> of type <math display="inline">0 < \epsilon \ll \delta</math> and assume that <math display="inline">\pi \neq p</math> and <math display="inline">z \notin X</math> then <math display="inline">(r(z), f(z)) \in A^\flat_4</math> and <math display="inline">(r(z), f\pi(z)) \in A^\flat_4</math>.<ref>Goresky and MacPherson 1988, pp. 87.</ref>
Outside of these points, the slope of <math display="inline">\ker(\lambda)</math> for any characteristic covector <math display="inline">\lambda</math> is
<math display="block">\frac{-a}{b} = \frac{f(z) - f\pi(z) - M}{\frac{\alpha}{\beta} + (f(z) - f\pi(z))}</math>
for <math display="inline">\alpha df + \beta dr = 0</math>.<ref>Goresky and MacPherson 1988, pp. 108-109.</ref>
== Morse theory ==
Steps(?)
* Explain topology
* Every point of a stratum is locally like a product structure (proved by Thom's Isotopy Lemma) [GM pp. 41-42]
** Including those around critical points, which are the product of normal and tangential Morse data (these are our quasi-local cycles?)
* Thom's Isotopy Lemma proves a strong deformation retraction (which only stops at critical points) [PWM pp. 541-542]
=== Homotopy ===
We want to replace our domain of convergence <math display="inline">M</math>, which is the complement of our singular variety <math display="inline">\mathcal{V}</math>, with an "equivalent" space <math display="inline">M'</math> which has better understood properties. We say "equivalent" because there are several different things we could mean by "equivalent" in this context. The equivalence we are referring to in this section is called '''homotopy'''.
Imagine two subspaces <math display="inline">\gamma_0</math> and <math display="inline">\gamma_1</math> of a space <math display="inline">Y</math> which are defined respectively by smooth functions <math display="inline">f, g: X \to Y</math>. If there exists a smooth function <math display="inline">h_s: X \times [0, 1] \to Y</math>, called a homotopy, such that <math display="inline">h_0 = f</math>, <math display="inline">h_1 = g</math> and for any <math display="inline">\epsilon > 0</math> there exists a <math display="inline">\delta_a</math> and <math display="inline">\delta_b</math> such that when <math display="inline">|s - s_0| < \delta_a</math> and <math display="inline">|x - x_0| < \delta_b</math> we have <math display="inline">|h_s(x) - h_{s_0}(x_0)| < \epsilon</math>, then we say <math display="inline">\gamma_0</math> and <math display="inline">\gamma_1</math> are '''homotopic'''.<ref>Henle 1979, pp. 251-252.</ref>
Below is an example where <math display="inline">\gamma_0</math> and <math display="inline">\gamma_1</math> are one-dimensional curves and <math display="inline">H(t, s) = h_s(t)</math>.
[[File:Homotopy_curves.png|300px]]
In [[#Homotopy_equivalence|Appendix A]], we formally prove that we can construct an equivalent space <math display="inline">M'</math>. We provide only an example to give some intuition before describing how to construct the space <math display="inline">M'</math> in terms of local cycles around critical points.
=== Motivating example ===
Imagine a torus and a height function which is just the z value of the point.
[[File:3D-Leveltorus.png|200px]]
It has four critical points: two at the top and bottom of the outer circle (<math display="inline">p_1, p_4</math>) and two at the top and bottom of the inner circle (<math display="inline">p_2, p_3</math>).
[picture]
When the height is between the <math display="inline">p_1</math> and <math display="inline">p_2</math>, the space is a two-cell, which can be retracted to a point.
[picture]
When the height is between <math display="inline">p_2</math> and <math display="inline">p_3</math>, the space is a cylinder, which can be retracted to a two-cell with a one-cell attached.
[[File:3D-Cylinder_and_disk_with_handle.png|200px]]
When the height is between <math display="inline">p_3</math> and <math display="inline">p_4</math>, the space is a torus with a disc removed, which can be retracted to a cylinder with a one-cell attached.
[[File:3D-Cylinder_with_handle_and_torus_with_hole.png|200px]]
When the height is greater than <math display="inline">p_4</math>, then the full torus is constructed by attaching a two-cell.
[Explain in terms of Morse data and Morse index?]
=== Morse data and quasi-local cycles ===
As in the above example, we start at the "bottom" of <math display="inline">M</math> and build upwards until just before we reach our first critical point <math display="inline">p</math>.
;Smooth points
:This is a tube around a <math display="inline">(d-1)</math>-chain <math display="inline">\gamma</math> where the height function <math display="inline">h</math> is maximised at <math display="inline">p</math>.<ref>Pemantle, Wilson and Melczer 2024, pp. 223.</ref>
:For example, if <math display="inline">F(x, y) = \frac{1}{1 - x - y}</math> then <math display="inline">\lambda = 1</math> and <math display="inline">B^\lambda</math> is an arc reaching its highest point at <math display="inline">p</math>.
:The normal plane <math display="inline">N</math> at <math display="inline">p</math> is a plane orthogonal to <math display="inline">B^1</math>(?).
:Its normal link <math display="inline">L(S)</math> is a circle with two points missing where it intersects <math display="inline">\mathcal{V}</math>.
:We make our quasi-local cycle out of the product of the arc and circle joined to <math display="inline">M_-</math> at points below <math display="inline">M_-</math>.
:With the exception of degenerate points, such as monkey saddles...<ref>e.g. Pemantle, Wilson and Melczer 2024, pp. 211.</ref>
;Transverse multiple points
:This is the product of a <math display="inline">k</math>-torus and a <math display="inline">(d-k)</math>-chain <math display="inline">\gamma</math>. The torus is the product of circles about <math display="inline">p</math> in the complex normal space to each strata which intersects <math display="inline">p</math>. The chain <math display="inline">\gamma</math> is supported in the stratum which is the common intersection of the varieties defined by the factors vanishing at <math display="inline">p</math>, and achieves its maximum height at <math display="inline">p</math>.<ref>Pemantle, Wilson and Melczer 2024, pp. 223-224.</ref>
;Arrangement multiple point
:This is the product of a <math display="inline">(d-k)</math>-chain <math display="inline">\gamma</math> and several <math display="inline">k</math>-tori, one for each pair of sheets which intersect transversely, where the torus is the product of circles about <math display="inline">p</math> in each sheet.<ref>Pemantle, Wilson and Melczer 2024, pp. 226.</ref>
;Cone point
:A cone point is zero-dimensional so there is no <math display="inline">\gamma</math>, just a <math display="inline">d</math>-torus about <math display="inline">p</math>.<ref>Pemantle, Wilson and Melczer 2024, pp. 227.</ref>
== Notes ==
{{Reflist}}
== References ==
* {{cite book | last1=Goresky | first1=Mark | last2=MacPherson | first2=Robert | title=Stratified Morse Theory | publisher=Springer-Verlag | year=1988 | url=https://www.math.ias.edu/~goresky/pdf/SMT.djvu }}
* {{cite book | last=Henle | first1=Michael | title=A Combinatorial Introduction to Topology | publisher=Dover Publications Inc. New York | year=1979 }}
* {{citation | last=Mather | first=John | title=Notes on Topological Stability | year=2012 | journal=Bulletin of the American Mathematical Society | volume=49 | number=4 | pages=475-506 | url=https://www.ams.org/journals/bull/2012-49-04/S0273-0979-2012-01383-6/S0273-0979-2012-01383-6.pdf }}.
* {{cite book | last1=Pemantle | first1=Robin | last2=Wilson | first2=Mark C. | last3=Melczer | first3=Stephen | title=Analytic Combinatorics in Several Variables | publisher=Cambridge University Press | year=2024 | edition=2nd | url=https://acsvproject.com/PemantleWilsonMelczer23.pdf }}
581208emj5l8i1pdzxxjisazmebvutq
4676714
4676708
2026-10-18T09:05:02Z
Dom walden
3209423
/* Fringed sets */ Statement of theorem for A_3
4676714
wikitext
text/x-wiki
== Introduction ==
Morse theory tells us that the topology of M only changes at its critical points.
The "Morse data" tells us the topology at each critical point.
Attaching this Morse data together gives us a space which is homopotically eqivalent to M.
This space is a "cell complex", which has an easy to calculate homology.
Theorem: Our domain of convergence is homotopic to a cell complex of dimension at most <math display="inline">2n - d - 1</math>.<ref>This is theorem D.23 in Pemantle, Wilson and Melczer 2024, pp. 546. Also theorem in section 1.2*/5.2* in SMT pp. 200.</ref>
Proof:
# <math display="inline">X</math> is our entire domain, <math display="inline">\mathcal{V}</math> our variety
# Project our entire domain to complex projective space <math display="inline">Z = \pi(X) \subset \C\mathbb{P}^n - H</math> [define H]
# Define a linear subspace <math display="inline">G \subset \C\mathbb{P}^n</math> of dimension <math display="inline">d - 1</math>
# Define a Morse function on <math display="inline">f: \C\mathbb{P}^n \to \R</math> which approximates the distance from <math display="inline">G</math> and such that <math display="inline">f^{-1}(0) = G</math> and <math display="inline">f^{-1}(1) = H</math>
# We "build" <math display="inline">X - \mathcal{V}</math> from <math display="inline">\pi^{-1}(G \cap Z) \cap (X - \mathcal{V})</math> by attaching CW complexes at critical points which are of at most dimension <math display="inline">2n - d - 1</math>
# At a critical point, the normal Morse data is <math display="inline">(J, K) = \coprod_x (J_x, K_x)</math> and the relative complex link is <math display="inline">\mathcal{L}^\pi = \coprod_x \mathcal{L}_x</math>
# We show that the quotient <math display="inline">J_x/K_x</math> is homotopic to a CW complex of dimension <math display="inline">\leq 2n - d - 1</math>
# The neighbourhood of <math display="inline">x</math> in <math display="inline">J_x</math> is homeomorphic to the cone in <math display="inline">L_x(X - \mathcal{V})</math>, and removing the point <math display="inline">x</math> increases the homotopy dimension to at most the homotopy dimension of <math display="inline">L_x</math>
# <math display="inline">(J_x \cup \{x\}, K_x)</math> is homotopic to <math display="inline">(\text{cone}(\mathcal{L}_x), \mathcal{L}_x)</math>
# <math display="inline">\mathcal{L}_x</math> is homotopic to a CW complex of dimension at most <math display="inline">2n - d - 1</math>
# The tangential Morse data at the critical point is homotopic to the pair <math display="inline">(D^\lambda, \partial D^\lambda)</math>
# Therefore, at each critical point a space has been added homotopic to a CW complex of dimension at most <math display="inline">2n - d - 1</math>.
Theorem: If <math display="inline">X</math> is the complement in <math display="inline">\C^n</math> of a complex variety <math display="inline">\mathcal{V}</math> of dimension <math display="inline">d</math> then <math display="inline">X</math> is homotopic to a CW complex of dimension at most <math display="inline">2n - d - 1</math>.<ref>Pemantle, Wilson and Melczer 2024, pp. 546.</ref>
Proof:
# We build <math display="inline">X</math> by attaching cells of dimension at most <math display="inline">2n - d - 1</math> at each critical point.
## Prove that we can do this without changing the homotopy(?)
## We use Thom's Isotopy Lemma to prove that there is a strong deformation retraction, stopping only at critical points.
# Prove these cells are a product of the normal and tangential Morse data.
## Normal data: <math display="inline">(\mathcal{L}(S), \partial \mathcal{L}(S)) \times (D^1, \partial D^1)</math> [GM pp. 18]
## Tangential data: <math display="inline">(B_\delta \cap f^{-1}[v - \epsilon, v + \epsilon], B_\delta \cap f^{-1}(v - \epsilon))</math> for <math display="inline">f</math> restricted to <math display="inline">X</math> (or <math display="inline">\mathcal{V}</math>?) [GM pp. 63-64]
# If <math display="inline">k</math> is the dimension of the strata, then
## If <math display="inline">k = d</math> then it is a smooth point and the cell is the product of <math display="inline">S^{2(n-d)-1}</math> and the tangential data is dimension at most <math display="inline">d</math>.
## If <math display="inline">k < d</math>, ...
<ref>Pemantle, Wilson and Melczer 2024, pp. 547.</ref>
== Example in one dimension ==
Domain with singularities v_1, v_2, ..., v_i
Define our height function f...
Start with our entire domain X
Reduce from X to X_i+ by using Thom's Isotopy lemma to do a strong deformation retract
== Thom's isotopy lemma ==
We present a modified version of Thom's (first) isotopy lemma, less general than the original but more obviously relevant to our situation.
Theorem: Suppose <math display="inline">Z</math> is a closed subset of a smooth manifold <math display="inline">M</math> which admits a Whitney stratification and <math display="inline">h : M \to \R</math> is a proper Morse function which has no critical values on <math display="inline">Z</math>. Then, the level sets of <math display="inline">Z</math> are homeomorphic by a homeomorphism that preserves the strata of <math display="inline">Z</math>.<ref>For various versions of the full statement of the theorem, see Mather 2012, pp. 499, Goresky and MacPherson 1988, pp. 41, or Pemantle, Wilson and Melczer 2024, pp. 541.</ref>
Proof:
# Construct control data for <math display="inline">Z</math> compatible with <math display="inline">h</math>.
## [Prop 7.1] If <math display="inline">h</math> is smooth on <math display="inline">Z</math> and is a submersion for each strata then there exists a family of control data for <math display="inline">Z</math> compatible with <math display="inline">h</math>.<ref>Mather 2012, pp. 488.</ref>
# This makes <math display="inline">Z</math> an abstract stratified set and <math display="inline">f</math> a controlled submersion.
# A controlled submersion has, for any smooth vector field on <math display="inline">\R</math>, a controlled vector field on <math display="inline">Z</math> (a "lift"?)<ref>Mather 2012, pp. 493.</ref>
# A controlled vector field has a unique one-parameter family of homeomorphisms of <math display="inline">Z</math> which commute with <math display="inline">h</math>.<ref>Mather 2012, pp. 496.</ref>
# This makes <math display="inline">h</math> a locally trivial fibration. [Prop 10.2]<ref>Mather 2012, pp. 499.</ref>
Control data:
A system of '''control data''' for <math display="inline">Z</math> consists of, for each stratum <math display="inline">X</math> of <math display="inline">Z</math>,
* a '''tubular neighbourhood''' <math display="inline">T_X</math> of <math display="inline">X</math>
* a '''tubular projection function''' <math display="inline">\pi_X: T_X \to X</math>, and
* a '''tubular distance function''' <math display="inline">\rho_X: T_X \to \R</math> such that <math display="inline">\rho_X^{-1}(0) = X</math><ref>Goresky and MacPherson 1988, pp. 42.</ref>
[illustration]
such that if <math display="inline">X < Y</math> are strata in <math display="inline">Z</math>, then
<math display="block">\pi_X \pi_Y(m) = \pi_X(m),</math>
<math display="block">\rho_X \pi_Y(m) = \rho_X(m)</math>
for all <math display="inline">m \in |T_X| \cap |T_Y|</math> such that <math display="inline">\pi_Y(m) \in |T_X|</math>.
If, for all strata <math display="inline">X</math> and all <math display="inline">m \in |T_X|</math>, we have <math display="inline">h \pi_X(m) = h(m)</math>, then this control data will be said to be compatible with <math display="inline">h</math>.<ref>Mather 2012, pp. 488.</ref>
We prove that if <math display="inline">h</math> is smooth on <math display="inline">Z</math> and is a submersion for each strata then there exists a family of control data for <math display="inline">Z</math> compatible with <math display="inline">h</math>.<ref>Mather 2012, pp. 488, prop 7.1.</ref>
Let <math display="inline">Z_k</math> be the union of strata of <math display="inline">Z</math> of dimension less than <math display="inline">k</math>. We prove by induction on <math display="inline">k</math>.
To construct the tubular neighbourhood <math display="inline">T_X</math> of a stratum <math display="inline">X</math> of dimension less than <math display="inline">k</math>. For <math display="inline">l \leq k</math>, let <math display="inline">U_l</math> denote the union of all <math display="inline">|T_Y|</math> for <math display="inline">Y < X</math> and <math display="inline">\dim Y \geq l</math>. Let <math display="inline">X_l = U_l \cap X</math>.<ref>Mather 2012, pp. 489.</ref>
For <math display="inline">l = k</math>, <math display="inline">X_k = \empty</math>. Assume by induction that <math display="inline">T_{l+1}</math> has been constructed and that if <math display="inline">Y < X</math>, <math display="inline">\dim Y \geq l + 1</math>, <math display="inline">m \in |T_{l+1}| \cap |T_Y|</math> and <math display="inline">\pi_{l+1}(m) \in |T_Y|</math> (<math display="inline">\pi_{l+1} = \pi_{T_{l+1}}</math>) then<ref>Mather 2012, pp. 489-490.</ref>
<math display="block">\rho_Y \pi_{l+1}(m) = \rho_Y(m),</math>
<math display="block">\pi_Y \pi_{l+1}(m) = \pi_Y(m).</math>
We wish to construct a tubular neighbourhood <math display="inline">T_{X,Y}</math> of <math display="inline">|T_Y| \cap X</math> whose restriction to <math display="inline">|T_Y| \cap X_{l+1}</math> is isomorphic to the restriction of <math display="inline">T_{l+1}</math> such that if <math display="inline">m \in |T_{X,Y}| \cap |T_Y|</math> and <math display="inline">\pi_{X,Y}(m) \in |T_Y|</math> (<math display="inline">\pi_{X,Y} = \pi_{T_{X,Y}}</math>) then
<math display="block">\rho_Y \pi_{X,Y}(m) = \rho_Y(m),</math>
<math display="block">\pi_Y \pi_{X,Y}(m) = \pi_Y(m).</math>
By shrinking <math display="inline">|T_Y|</math> if necessary, this relation is already satisfied if <math display="inline">m \in |T_{l+1}| \cap |T_Y|</math> and <math display="inline">\pi_{l+1}(m) \in |T_Y|</math> with <math display="inline">T_{l+1}</math> in place of <math display="inline">T_{X,Y}</math> and <math display="inline">\pi_{l+1}</math> in place of <math display="inline">\pi_{X,Y}</math>. By the definition, if <math display="inline">m \in |T_{l+1}|</math> then there exists <math display="inline">Z < X</math> with <math display="inline">\dim Z > l</math>, <math display="inline">m \in |T_Z|</math> and <math display="inline">\pi_{l+1}(m) \in |T_Z|</math>. We have that <math display="inline">\pi_{l+1}(m) \in |T_Y| \cap |T_Z|</math> and therefore <math display="inline">Y < Z</math>. Therefore<ref>Mather 2012, pp. 490.</ref>
<math display="block">\rho_Y \pi_{l+1}(m) = \rho_Y \pi_Z \pi_{l+1}(m) = \rho_Y \pi_Z(m) = \rho_Y(m),</math>
<math display="block">\pi_Y \pi_{l+1}(m) = \pi_Y \pi_Z \pi_{l+1}(m) = \pi_Y \pi_Z(m) = \pi_Y(m).</math>
We can prove that, by shrinking <math display="inline">|T_Y|</math>, <math display="inline">(\rho_Y, \pi_Y): |T_Y| \cap X \to \R \times Y</math> is a submersion [prop 7.3?] and that <math display="inline">T_{X,Y}</math> is compatible with <math display="inline">(\rho_Y, \pi_Y): |T_Y| \cap X_{l+1} \to \R \times Y</math>, i.e. <math display="inline">(\rho_Y, \pi_Y) \pi_{X,Y}(m) = (\rho_Y, \pi_Y)(m)</math>(?).
To prove it is a submersion, for the tubular neighbourhood <math display="inline">T = (E, \epsilon, \psi)</math> there exists a smooth positive function <math display="inline">\epsilon'</math> such that
<math display="block">(\rho_T, \pi_T): Y \cap |T|_{\epsilon'}^0 \to \R \times X,</math>
where <math display="inline">|T|_{\epsilon'}^0 = \psi(B_\epsilon \cap B_{\epsilon'})</math>, is a submersion. If <math display="inline">\Sigma</math> is the set <math display="inline">y \in |T|</math> such that the rank of
<math display="block">(\rho_T, \pi_T): T \cap |T| \to \R \times X</math>
at <math display="inline">y</math> is less than <math display="inline">\dim(\R \times X)</math>. We need to prove that for any <math display="inline">x \in X</math> there exists a neighbourhood of <math display="inline">x</math> which does not intersect with <math display="inline">\Sigma</math>, i.e. the map is not a submersion in this neighbourhood. It follows from [lemma 7.2] that it is enough to prove for <math display="inline">M = \R^m</math>, <math display="inline">X = \R^{m-c} \times 0_c</math> and <math display="inline">T</math> is the '''standard tubular neighbourhood'''.<ref>Mather 2012, pp. 489.</ref>
By standard tubular neighbourhood, we mean the trivial bundle with base <math display="inline">\R^{m-c}</math> and fibre <math display="inline">\R^c</math> where <math display="inline">\pi: \R^m \to \R^{m-c}</math>...<ref>Mather 2012, pp. 488.</ref>
For <math display="inline">y \in |T| - \R^{m-c}</math>, the kernal of the differential of <math display="inline">(\pi_T, \rho_T)</math> at <math display="inline">y</math> is the orthogonal complement of <math display="inline">(\R^{m-c} \times 0_c) \oplus \stackrel{\frown}{y \pi_T(y)}</math> in <math display="inline">\R^m</math>. By the Whitney conditions, we have that for <math display="inline">y</math> near <math display="inline">\R^{m-c}</math>, <math display="inline">(\R^{m-c} \times 0_c) \oplus \stackrel{\frown}{y \pi_T(y)}</math> is close to the set of <math display="inline">m - c + 1</math> planes in <math display="inline">m-</math>space to an <math display="inline">m - c + 1</math> plane in <math display="inline">TY_y</math>. Therefore, for <math display="inline">y</math> near enough to <math display="inline">\R^{m-c}</math>, <math display="inline">TY_y</math> is transverse to the kernal of the differential of <math display="inline">(\pi_T, \rho_T)</math> and, therefore, is a submersion when restricted to <math display="inline">Y</math>.<ref>Mather 2012, pp. 489.</ref>
To prove that <math display="inline">T_{X,Y}</math> is compatible with <math display="inline">(\rho_Y, \pi_Y): |T_Y| \cap X_{l+1} \to \R \times Y</math>...<ref>Mather 2012, pp. 490.</ref>
Therefore, there exists a tubular neighbourhood <math display="inline">T_0</math> of <math display="inline">X_0</math> satisfying
<math display="block">\rho_Y \pi_0(m) = \rho_Y(m),</math>
<math display="block">\pi_Y \pi_0(m) = \pi_Y(m).</math>
From this we can prove that <math display="inline">T_0</math> is compatible with <math display="inline">h</math>. Replacing <math display="inline">T_0</math> with a smaller tubular neighbourhood if necessary we can assume <math display="inline">m \in |T_0|</math> such that for some <math display="inline">Y < X</math>, <math display="inline">m \in |T_Y|</math> and <math display="inline">\pi_0(m) \in |T_Y|</math>, then<ref>Mather 2012, pp. 490.</ref>
<math display="block">h \pi_0(m) = h \pi_Y \pi_0(m) = h \pi_Y(m) = h(m).</math>
By the generalised tubular neighourhood theorem [prop 7.2?], we can replace <math display="inline">T_0</math> with a tubular neighbourhood <math display="inline">T</math> of <math display="inline">X</math> compatible with <math display="inline">h</math>. This completes the construction of <math display="inline">T_X</math>.<ref>Mather 2012, pp. 491.</ref>
This makes <math display="inline">Z</math> an '''abstract stratified set''' with axioms...<ref>Mather 2012, pp. 491-492.</ref>
This also makes <math display="inline">h</math> a '''controlled submersion''' because
# <math display="inline">h|X: X \to \R</math> is a smooth submersion on each strata <math display="inline">X</math> of <math display="inline">Z</math>, and
# for each stratum <math display="inline">X</math> there is a tubular neighbourhood <math display="inline">T'_X</math> such that <math display="inline">h(v) = h \pi_X(v)</math> for all <math display="inline">v \in T'_X</math>.<ref>Mather 2012, pp. 493.</ref>
The core of this is the concept of a '''vector field'''. A vector field is a function which assigns, for each point <math display="inline">p</math> in a space, a '''vector''', which can be represented by an arrow whose tail starts at <math display="inline">p</math>.<ref>Henle 1979, pp. 33.</ref>
[picture]
Imagine we have a vector field <math display="inline">v(x)</math> defined in a space and draw a line through our space. At each point along this line the vector field assigns a vector. If we move each point in this line along the arrow defined by this vector in the direction of the arrow head. This "flows" the entire line along the vectors.
[picture]
We define a '''stratified vector field''' <math display="inline">\eta</math> on <math display="inline">Z</math> to be a family of smooth vector fields <math display="inline">\eta_X</math>, one for each strata <math display="inline">X</math> of <math display="inline">Z</math>.<ref>Mather 2012, pp. 493.</ref>
We define a '''controlled vector field''' <math display="inline">\eta</math> on <math display="inline">Z</math> to be a stratified vector field such that for any strata <math display="inline">Y</math> there exists a tubular neighbourhood <math display="inline">T'_Y</math> such that for any <math display="inline">X > Y</math> and any <math display="inline">v \in T'_X \cap X</math><ref>Mather 2012, pp. 493.</ref>
<math display="block">\eta_X \rho_{Y,X}(v) = 0,</math>
<math display="block">(\pi_{Y,X})_* \eta_X(v) = \eta_Y (\pi_{Y,X}(v)).</math>
We prove that if <math display="inline">h</math> is a controlled submersion then, for any smooth vector field <math display="inline">\zeta</math> on <math display="inline">\R</math> there is a controlled vector field <math display="inline">\eta</math> on <math display="inline">Z</math> such that <math display="inline">h_* \eta(v) = \zeta(h(v))</math> for all <math display="inline">v \in Z</math>.<ref>Mather 2012, pp. 493.</ref>
Proceeding by induction on the maximum dimension of the strata of <math display="inline">Z</math>, we define <math display="inline">Z_k</math> to be the union of strata of <math display="inline">Z</math> of dimension at most <math display="inline">k</math>. The tubular neighbourhood of <math display="inline">Z_k</math> is the intersection of the tubular neighbourhoods of each strata in <math display="inline">Z_k</math> with <math display="inline">Z</math>. The projection and distance functions are the restrictions of the respective functions of <math display="inline">Z</math>.
It is trivially true when the maximum dimension of strata in <math display="inline">Z</math> is zero. Assume it is true for <math display="inline">k</math> and construct each <math display="inline">\eta_X</math> separately for each stratum <math display="inline">X</math> of dimension <math display="inline">k + 1</math>.
By the assumption that we have controlled vector fields for all strata <math display="inline">Y</math> of dimension at most <math display="inline">k</math>, we have the two control conditions defined above for any <math display="inline">X > Y</math> and that there is a neighbourhood <math display="inline">T^1_Y</math> such that <math display="inline">h(v) = h \pi_Y(v)</math> for <math display="inline">v \in T^1_Y</math>.
We want to prove that for all <math display="inline">Y < X</math>, the control conditions are satisfied for all <math display="inline">v \in T^2_Y</math> and that <math display="inline">h_*\eta_X(v) = \zeta(v)</math> for all <math display="inline">v \in X</math>.
Take a point <math display="inline">x \in X</math> and define the set <math display="inline">S_v</math> of strata <math display="inline">Y < X</math> such that <math display="inline">v \in T^2_Y</math>. <math display="inline">S_v</math> is totally ordered since if <math display="inline">Y_1</math> and <math display="inline">Y_2</math> are not comparable then <math display="inline">T^2_{Y_1} \cap T^2_{Y_2} = \empty</math>. Therefore, there is a largest member <math display="inline">Y = Y_v</math>.
Assume the control conditions hold for <math display="inline">Y = Y_v</math>. Then they hold for all <math display="inline">Y_i \in S_v</math>. For, either <math display="inline">Y_i = Y</math> or <math display="inline">Y_i < Y</math>. In the latter case, <math display="inline">\pi_Y(v) \in T^1_{Y_i}</math> (by the choice of <math display="inline">T^2_Y</math>'s [is this why?]. Then
<math display="block">\begin{align}
\eta_X(v) \rho_{Y_i,X}(v) &= \eta_X \rho_{Y_i,Y} \pi_{Y,X}(v) \\
&= (\pi_{Y,X})_* \eta_X(v) \rho_{Y_i,Y} \\
&= \eta_Y(\pi_{Y,X}(v)) \rho_{Y_i,Y} \\
&= 0
\end{align}</math>
and
<math display="block">\begin{align}
(\pi_{Y_i,X})_* \eta_X(v) &= (\pi_{Y_i,Y})_* (\pi_{Y,X})_* \eta_X(v) \\
&= (\pi_{Y_i,Y})_* \eta_Y(v) (\pi_{Y,X}) \\
&= \eta_{Y_i}(\pi_{Y_i,Y} \pi_{Y,X}(v)) \\
&= \eta_{Y_i}(\pi_{Y_i,X}(v))
\end{align}</math>
and, therefore, condition holds for all <math display="inline">Y_i \in S_v</math>. Also,
<math display="block">\begin{align}
h_* \eta_X(v) &= (h \circ \pi_{Y,X})_* \eta_X(v) \\
&= h_* \eta_Y (\pi_{Y,X}(v)) \\
&= \zeta(f(v))
\end{align}</math>
and, therefore, the conclusion of the theorem holds at <math display="inline">v</math>.
This shows we can construct <math display="inline">\eta_X</math> satisfying the control conditions when <math display="inline">S_v</math> is non-empty and satisfying the theorem when <math display="inline">S_v</math> is empty. The set of vectors satisfying these conditions is convex in <math display="inline">TX_v</math>, and so we construct <math display="inline">\eta_X</math> globally via a partition of unity.<ref>Mather 2012, pp. 493-495.</ref>
Finally, we prove that a controlled vector field has a unique one-parameter family of homeomorphisms of <math display="inline">Z</math> which commute with <math display="inline">h</math>.<ref>Mather 2012, this combines Proposition 10.1 and Corollary 10.2 on pp. 496 and 497, respectively.</ref>
For each stratum <math display="inline">X</math> of <math display="inline">Z</math>, <math display="inline">\eta_X</math> generates a unique smooth local one-parameter group <math display="inline">(J_X, \alpha_X)</math> of diffeomorphisms of <math display="inline">X</math> (by standard results of differential geometry), such that <math display="inline">\frac{d}{dt} \alpha(t, v)|_{t=0} = \eta_X(v)</math>, <math display="inline">J_X</math> is an open subset of <math display="inline">\R \times Z</math>, ...
If we define <math display="inline">(J, \alpha)</math> by
<math display="block">J = \bigcup_{X \in S} J_X</math>
<math display="block">\alpha = \bigcup_{X \in S} \alpha_X</math>
we can prove that this is a local one-parameter family of homeomorphisms.<ref>Mather 2012, pp. 496.</ref>
Firstly, it is clear that
# <math display="inline">0 \times Z \subseteq J</math> and <math display="inline">\alpha(0, v) = v</math> for all <math display="inline">v \in Z</math>.
# If <math display="inline">v \in Z</math> then <math display="inline">J_v = J \cap (\R \times v) \subseteq \R</math> is an open interval <math display="inline">(a_v, b_v)</math>, possibly infinite at one or both ends.
# If <math display="inline">v \in Z</math> and <math display="inline">t, s, t + s</math> are in <math display="inline">(a_v, b_v)</math> then <math display="inline">\alpha(t + s, v) = \alpha(t, \alpha(s, v))</math>.<ref>Mather 2012, pp. 495.</ref>
Secondly, it is clear that <math display="inline">\eta</math> generates <math display="inline">\alpha</math> because
# Each stratum <math display="inline">X</math> of <math display="inline">Z</math> is invariant under <math display="inline">\alpha</math>, i.e. <math display="inline">\alpha[J \cap (\R \times X)] \subseteq X</math>.
# For each <math display="inline">v \in Z</math>, the map <math display="inline">t \to \alpha(t, v)</math> of <math display="inline">(a_v, b_v)</math> into the stratum which contains <math display="inline">v</math> is <math display="inline">C^1</math>.
# For any <math display="inline">(t, v) \in Z</math>(?) we have <math display="inline">d/dt \alpha(t, v) = \eta(\alpha(t, v))</math>.<ref>Mather 2012, pp. 495.</ref>
It is unique because each <math display="inline">(J_X, \alpha_X)</math> is unique. We just need to prove that <math display="inline">J</math> is open, <math display="inline">\alpha</math> is continuous, and for any <math display="inline">v \in Z</math> and any compact set <math display="inline">K \subseteq Z</math> there exists <math display="inline">\epsilon > 0</math> such that <math display="inline">\alpha(t, v) \notin K</math> if <math display="inline">t \in (a_v, a_v + \epsilon) \cup (b_v - \epsilon, b_v)</math>.<ref>Mather 2012, pp. 495.</ref>
For the latter-most condition, if it did not hold then there exists...<ref>Mather 2012, pp. 496-497.</ref>
We prove there is a homeomorphism <math display="inline">f: Z \to h^{-1}(0) \times \R</math> such that <math display="inline">\pi \circ f = h</math>, where <math display="inline">\pi: h^{-1}(0) \times \R \to \R</math> is projection to the second factor.
For the coordinate vector field <math display="inline">\partial</math> on <math display="inline">\R</math>, by [prop 9.1] there is a controlled vector field <math display="inline">\tilde\partial</math> such that <math display="inline">f_* \tilde\partial(v) = \partial(h(v))</math> for <math display="inline">v \in Z</math>. By [prop 10.1], <math display="inline">\tilde\partial</math> generates a local one-parameter group <math display="inline">(J, \alpha)</math> such that
<math display="block">h(\alpha(t,v)) = h(v) + t</math>
<math display="inline">h</math> is proper and [d] holds, so <math display="inline">J = \R \times Z</math>. If we define <math display="inline">f</math> as
<math display="block">f(v) = (\alpha(-t, v), h(v))</math>
then <math display="inline">f</math> maps <math display="inline">Z</math> into <math display="inline">h^{-1}(0) \times \R</math> and <math display="inline">\pi \circ f = h</math>. If we define <math display="inline">\bar f: h^{-1}(0) \times \R \to Z</math> as
<math display="block">\bar f(v, t) = \alpha(t, v)</math>
then <math display="inline">f \bar f = \bar f f = Id</math> and <math display="inline">f</math> is a homeomorphism.<ref>Mather 2012, pp. 497.</ref>
== Topology at critical points ==
Theorem: If there is a critical point <math display="inline">p</math> in the singular variety <math display="inline">\mathcal{V}</math> with critical value <math display="inline">v \in (a, b)</math> then the space <math display="inline">X_{\leq b}</math> is homotopic to<ref>Goresky and MacPherson 1988, pp. 174.</ref>
<math display="block">X_{\leq a} \cup [(D^{\lambda+1}, \partial D^{\lambda+1}) \times (\mathcal{L}_X, \partial \mathcal{L}_X)].</math>
Proof:<ref>Proof outline comes from Goresky and MacPherson 1988, pp. 174.</ref>
# <math display="inline">(X_{\leq b}, X_{\leq a})</math> is homeomorphic to <math display="inline">(X_{\leq v + \epsilon}, X_{\leq v -\epsilon})</math>. We can prove this by "moving wall" or Thom's Isotopy Lemma.<ref>Goresky and MacPherson 1988, pp. 90-91, 120.</ref>
# <math display="inline">X_{\leq v + \epsilon}</math> is homeomorphic to <math display="inline">X_{\leq v - \epsilon} \cup (J, K)</math>, where the latter is the local Morse data for <math display="inline">h</math> at <math display="inline">p</math>. We do this by moving the wall...<ref>Goresky and MacPherson 1988, pp. 95-96, 120-121.</ref>
# <math display="inline">(J, K)</math> is homeomorphic to <math display="inline">(D^{\lambda+1}, \partial D^{\lambda+1}) \times (\mathcal{L}_X, \partial \mathcal{L}_X)</math> (tangential data, normal data). Again, moving the wall...<ref>Goresky and MacPherson 1988, pp. 65-66, chapter 8, 121.</ref>
# The normal Morse data depends only on the differential <math display="inline">df(p)</math>.<ref>Goresky and MacPherson 1988, pp. 93.</ref>
# The normal Morse data has the homotopy type of <math display="inline">(\mathcal{L}_X, \partial \mathcal{L}_X)</math>.<ref>Goresky and MacPherson 1988, pp. 169.</ref>
=== Step 1 ===
We get this immediately(?) by Thom's Isotopy Lemma.
=== Step 2 ===
<ref>Goresky and MacPherson 1988, complex case on pp. 120-121 is extension of real case on pp. 95-96.</ref>
Step 1 works because <math display="inline">h</math> is a submersion at each point of the regions we are homeomorphing. This is not the case at critical points. We need some way by which a homeomorphism can pass through a critical point.
To prove a homeomorphism between two subsets <math display="inline">A</math> and <math display="inline">B</math> of <math display="inline">Z</math>, we project <math display="inline">Z</math> to some other space <math display="inline">N</math> (in our case <math display="inline">\R^n</math>) using some function <math display="inline">F</math>. We take subsets <math display="inline">Y_0</math> and <math display="inline">Y_1</math> of <math display="inline">N</math> such that <math display="inline">A = Z \cap F^{-1}(Y_0)</math> and <math display="inline">B = Z \cap F^{-1}(Y_1)</math>. We need to prove <math display="inline">Y_0</math> and <math display="inline">Y_1</math> are connected by a one-parameter family of regions <math display="inline">Y_t</math> [explain one-parameter family]. The criterion for such a family to exist is that the '''characteristic covectors''' of <math display="inline">F</math> are all nonzero on each stratum of <math display="inline">Y_t</math>.<ref>Goresky and MacPherson 1988, pp. 70.</ref>
At each point <math display="inline">x \in M</math> and <math display="inline">y \in N</math> there are '''tangent spaces''' <math display="inline">T_xM</math> and <math display="inline">T_yN</math>, a vector space whose zero is at the point <math display="inline">x</math> or <math display="inline">y</math> (resp.)
[picture of various tangent spaces]
In the case the <math display="inline">N = \R</math>, the tangent space <math display="inline">T_x\R</math> is just <math display="inline">\R</math> but whose origin is at <math display="inline">x</math>.
[picture of T_x\R]
Say <math display="inline">F(x) = y</math>, then the differential of the map <math display="inline">F</math> can be seen as a function whose input is a vector in the tangent space <math display="inline">T_xM</math> and whose output is a vector in the tangent space <math display="inline">T_yM</math>. [If I move this far on the tangent space of M how do I move in the tangent space of N?]
[picture]
[example for M = \R and N = \R?]
A function which takes as input a vector in the tangent space <math display="inline">T_xM</math> (say) and outputs a scalar (usually <math display="inline">\R</math>) is called a '''covector'''. The set of all covectors on <math display="inline">T_xM</math> is called the dual space of <math display="inline">T_xM</math> and is denoted <math display="inline">T^*_xM</math>. There are only a limited number of ways to express a covectors. For example, if our tangent space is two-dimensional then all covectors are of the form <math display="inline">ax + by</math> where <math display="inline">(x, y) \in T_xM</math>.
We take our space <math display="inline">M</math> and map it onto <math display="inline">\R^2</math> with the map <math display="inline">F(z) = (r(z), h(z))</math>, where <math display="inline">z \in M</math> and <math display="inline">r</math> is the square of the distance of <math display="inline">z</math> to the critical point <math display="inline">p</math>.
[graph of mapping]
In this case, the covectors on the tangent space <math display="inline">T_xM</math> are of the form <math display="inline">adf(x) + bdr(x)</math> (in this case <math display="inline">df</math> and <math display="inline">dr</math> are maps to <math display="inline">\R</math>) and on <math display="inline">T_y\R^2</math> are of the form <math display="inline">cu + dv</math> (for <math display="inline">(u, v) \in \R^2</math>). A covector <math display="inline">cu + dv \in T^*_{(u, v)}\R^2</math> is called a '''characteristic covector''' of <math display="inline">F</math> if <math display="inline">F(x) = (u, v)</math> and <math display="inline">cdf(x) + ddr(x) = 0</math> for all vectors in the tangent space of the stratum containing <math display="inline">p</math>.<ref>Goresky and MacPherson 1988, pp. 82.</ref> [explain adf(x) + bdr(x) in terms of this being a function which takes a vector input]
[example of where covectors do and do not vanish on a stratified space, pp. 71?]
What we want is a homeomorphism in <math display="inline">M</math> between the space <math display="inline">Z_{\leq \epsilon}</math> and <math display="inline">Z_{\leq \epsilon} \cup B</math>, where <math display="inline">B</math> is a small region of the critical point <math display="inline">p</math>. The '''local Morse data''' is
<math display="block">((B_\delta \cap Z) \cap f^{-1}[v-\epsilon, v+\epsilon], (B_\delta \cap Z) \cap f^{-1}(v-\epsilon))</math>
where <math display="inline">B_\delta</math> is a closed disc in <math display="inline">M</math> of radius <math display="inline">\delta</math>.<ref>Goresky and MacPherson 1988, pp. 63-64.</ref> Observe that this is the pair <math display="inline">(F^{-1}(\text{Box}(\delta, \epsilon)), F^{-1}(\text{Bottom}(\delta, \epsilon)))</math><ref>Goresky and MacPherson 1988, pp. 91.</ref> [explain Box, Bottom, etc.]
[picture of the two subspaces of Z in M]
We use our map <math display="inline">F</math> to convert these two subspaces to subspaces of <math display="inline">\R^2</math> which are of the form <math display="inline">Y_1 = \{(x,y) \in \R^2 | y \leq \epsilon\}</math> and <math display="inline">Y_0 = \{(x,y) \in \R^2 | y \leq -\epsilon\} \cup \{(x,y) \in \R^2 | x \leq \delta, y \leq \epsilon\}</math>, such that <math display="inline">Z_{\leq \epsilon} = F^{-1}(Y_1)</math> and <math display="inline">Z_{\leq \epsilon} \cup B = F^{-1}(Y_0)</math>.<ref>Goresky and MacPherson 1988, pp. 95-96.</ref>
We use a homeomorphism between <math display="inline">Y_1</math> and <math display="inline">Y_0</math> using the technique of "moving the wall" and Thom's Isotopy Lemma. Such a homeomorphism exists when the characteristic covectors of <math display="inline">F</math> are all nonzero on each stratum of <math display="inline">Y_t</math>.<ref>Goresky and MacPherson 1988, chapter 4, particularly pp. 71-72.</ref>
Given a smooth mapping between manifolds <math display="inline">F: M \to N</math> (for example, in our case we could have <math display="inline">N = \R^2</math>) and that <math display="inline">F|Z: Z \to N</math> is proper. Let <math display="inline">Y \subset N \times \R</math> be a closed Whitney stratified subset such that the projection to the second factor <math display="inline">\pi: Y \to \R</math> is a proper stratified submersion.<ref>Goresky and MacPherson 1988, pp. 71.</ref>
Suppose for each <math display="inline">t \in \R</math>, for each <math display="inline">p \in F(Z) \cap Y_t</math>, and for each nonzero characteristic covector <math display="inline">\lambda \in T^*_pN</math> of <math display="inline">F|Z</math>, the restriction of <math display="inline">\lambda</math> to the subspace <math display="inline">T_pS_t = \ker(d\pi(p)) \cap T_pS</math> is nonzero, where <math display="inline">S</math> is a stratum of <math display="inline">Y</math> which contains <math display="inline">(p, t)</math> and <math display="inline">S_t = \pi^{-1}(t) \cap S</math> is the stratum of <math display="inline">Y_t = \pi^{-1}(t) \cap Y</math> which contains <math display="inline">p</math>. This is equivalent to the statement that, for each <math display="inline">t \in \R</math>, the restriction <math display="inline">F|Z</math> is transverse to <math display="inline">Y_t</math>.<ref>Goresky and MacPherson 1988, pp. 71-72.</ref>
This means that, for each <math display="inline">t \in \R</math>, <math display="inline">Z \cap F^{-1}(Y_t)</math> is stratified by its intersection with the strata of <math display="inline">Z</math>...
We finally prove there is a homeomorphism between <math display="inline">Z \cap F^{-1}(Y_0) \cong Z \cap F^{-1}(Y_1)</math> which preserves the Whitney stratification of both sides and is smooth on each stratum.
For the composition
<math display="block">Z \times \R \subset M \times \R \to_{F \times I} Y \subset \R^2 \times \R \to_{\pi} \R</math>
where <math display="inline">Y(t, z) = Y_t(z)</math>, <math display="inline">I</math> is the identity and <math display="inline">\pi</math> is projection to the second factor.
<math display="inline">Z \times \R</math> is transverse to <math display="inline">(F \times I)^{-1}(Y)</math>...
The composition <math display="inline">\pi \circ (F \times I): Z \times \R \cap (F \times I)^{-1}(Y) \to \R</math> is a stratified submersion because
* The input domain is stratified as above...,
* We have defined <math display="inline">F|Z</math> to be transverse to <math display="inline">Y</math>, and therefore it preserves the stratification (unless <math display="inline">F(Z) \cap Y = \empty</math>), and
* We defined above the projection on <math display="inline">Y</math> to be a stratified submersion, meaning it is a submersion on each stratum of <math display="inline">F(Z) \cap Y</math>.<ref>Goresky and MacPherson 1988, pp. 43.</ref>
Therefore, we can apply Thom's Isotopy Lemma which says there is a homeomorphism between the level sets of <math display="inline">Z \times \R</math>...<ref>Goresky and MacPherson 1988, pp. 72.</ref>
=== Step 3 ===
==== Characteristic covectors ====
==== Fringed sets ====
When manipulating our domain of integration[?], we need to make sure we are doing this in regions with no characteristic covectors. The introduce the concept of a fringed set, a subset of <math display="inline">R^2</math>, and construct a series of fringed sets which contain no characteristic covectors.
A '''fringed set''' <math display="inline">A \subset \R \times \R^+</math> is an open subset of the first quadrant of <math display="inline">\R^2</math>. <math display="inline">A</math> is fringed over <math display="inline">0 < y \ll x</math> if for some interval <math display="inline">S = (0, x)</math>
# the projection of <math display="inline">A</math> to the first factor is equal to <math display="inline">S</math>,
# <math display="inline">A</math> is open in <math display="inline">S \times \R^+</math>,
# if <math display="inline">(s, y) \in A</math> and <math display="inline">0 < y' \leq y</math> then <math display="inline">(s, y') \in A</math>.<ref>Goresky and MacPherson 1988, pp. 77.</ref>
[picture]
The fringed set <math display="inline">A^\flat</math> is the set <math display="inline">A</math> plus its reflection about the <math display="inline">x</math> axis.<ref>Goresky and MacPherson 1988, pp. 82.</ref>
[picture]
We build a series of fringed sets which do not contain characteristic covectors, which will be used later in our proof.
There exists a fringed set <math display="inline">A_2</math> of type <math display="inline">0 < v \ll u</math> such that for any <math display="inline">z \in Z</math> such that <math display="inline">r\pi(z) \leq r_2</math>, the map <math display="inline">(\rho, f - f\pi)|\pi^{-1}(\pi(z)): \pi^{-1}(\pi(z)) \to \R^2</math> has no characteristic covectors in <math display="inline">A^\flat_2</math>.<ref>Goresky and MacPherson 1988, pp. 84.</ref>
Given that the set of points <math display="inline">(u, v) \in \R^2</math> which have a nonzero characteristic covector is closed, then it is enough to prove it for points <math display="inline">(u, 0) \in \R^2</math>. Proof by contradiction. Assume it is false and that there is a sequence of points <math display="inline">p_i \in Z \cap f^{-1}(0)</math> converging to <math display="inline">p</math> such that <math display="inline">d\rho(p_i)</math>, <math display="inline">df(p_i)</math> and <math display="inline">df\pi(p_i)</math> are linearly dependent when restricted to the stratum <math display="inline">Y</math> which contains <math display="inline">p_i</math>. This would mean that <math display="inline">f</math> has a critical point on <math display="inline">Y \cap \partial B_{\rho(p_i)}(p)</math>.<ref>Goresky and MacPherson 1988, pp. 82-83.</ref>
By restricting to a subsequence if necessary, we may assume the points <math display="inline">p_i</math> are all contained in the same stratum <math display="inline">Y</math>, that the tangent planes <math display="inline">T_{p_i}Y</math> converge to some plane <math display="inline">Q</math> and the secant lines <math display="inline">\mathcal{l}_i = \overline{p_i p}</math> converge to some line <math display="inline">\mathcal{l}</math>. By the Whitney conditions [how?], <math display="inline">Q = \lim_{i \to \infty} \mathcal{l}_i \oplus T_{p_i}(Y \cap \partial B_\delta(p))</math>.<ref>Goresky and MacPherson 1988, pp. 83.</ref>
For each <math display="inline">i</math>, <math display="inline">f(p_i) = f(p) = v</math>, this means[?] <math display="inline">df(p)(Q) = 0</math>. On the assumption that <math display="inline">df(p)</math> is nondegenerate, we may assume <math display="inline">Y = X</math>, so <math display="inline">\ker d(f|X)(p_i) = T_{p_i}(X \cap \partial B_\delta(p)) = T_{p_i}(X \cap f^{-1}(v))</math>, which converges to a subspace <math display="inline">\tau</math> of <math display="inline">Q = T_pX</math>, perpendicular to <math display="inline">\mathcal{l}</math>. However, as <math display="inline">f^{-1}(v) \cap X</math> satisfies Whitney's conditions, <math display="inline">\mathcal{l} \subset \tau</math>, a contradiction.<ref>Goresky and MacPherson 1988, pp. 83.</ref>
We observe that if <math display="inline">df(p)</math> is a nondegenerate characteristic covector for <math display="inline">Z</math> then it is also a nondegenerate characteristic covector for <math display="inline">Z \cap \pi^{-1}(p)</math>.<ref>Goresky and MacPherson 1988, pp. 84.</ref>
For any <math display="inline">a > 0</math> and <math display="inline">b > 0</math> there exists a fringed set <math display="inline">A_3</math> such that whenever <math display="inline">z \in Z</math> satisfies
# <math display="inline">(r(z), f(z)) \in A^\flat_3</math>,
# <math display="inline">(r\pi(z), f\pi(z)) \in A^\flat_3</math>,
# <math display="inline">z \notin X</math>, and
# <math display="inline">\pi(z) \neq p</math>
then the covectors <math display="inline">ad\rho(z) + bdr\pi(z)</math>, <math display="inline">df(z)</math>, and <math display="inline">df\pi(z)</math> are linearly independent when restricted to the stratum <math display="inline">Y</math> which contains <math display="inline">z</math>.<ref>Goresky and MacPherson 1988, pp. 85.</ref>
==== Homeomorphism ====
We prove there is a stratum preserving homeomorphism between<ref>Goresky and MacPherson 1988, pp. 65.</ref>
<math display="block">\text{Local Morse Data} \cong (\text{Tangential Morse Data}) \times (\text{Normal Morse Data})</math>
We first prove that there is a homeomorphism between the product of the normal and tangential Morse data and the '''realisation''' of the following diagram
[diagram from pp. 102]
where realisation means
<math display="block">Z \cap (g_1, h_1)^{-1}(P_a) \cap (g_2, h_2)^{-1}(P_b)</math>
where all the intersections of strata (of <math display="inline">Z</math>?) are transverse.<ref>Goresky and MacPherson 1988, pp. 100-102.</ref>
The realisation of the above diagram is equal to
<math display="block">(V_1, V_2) \cap (W_1, W_2) = (V_1 \cap W_1, V_1 \cap W_2 \cup V_2 \cap W_1)</math>
where
<math display="block">V_1 = \{ z \in Z : |f(z) - f\pi(z)| \leq \epsilon/4, r\pi(z) \leq \delta, \rho(z) \leq \delta \}</math>
<math display="block">V_2 = \{ z \in Z : f(z) - f\pi(z) = -\epsilon/4, r\pi(z) \leq \delta, \rho(z) \leq \delta \}</math>
<math display="block">W_1 = \{ z \in Z : |f\pi(z)| \leq 3\epsilon/4, r\pi(z) \leq \delta \}</math>
<math display="block">W_1 = \{ z \in Z : f\pi(z) = -3\epsilon/4, r\pi(z) \leq \delta \}</math>
where <math display="inline">\pi</math> is the projection from the tubular neighbourhood to <math display="inline">Z</math>, <math display="inline">r(z)</math> is the square of the distance between <math display="inline">z</math> and the critical point <math display="inline">p</math> and <math display="inline">\rho(z)</math> is the square of the distance between <math display="inline">z</math> and <math display="inline">\pi(z)</math>.<ref>Goresky and MacPherson 1988, pp. 100-101.</ref> <math display="inline">\epsilon \ll \delta</math> are chosen so that <math display="inline">(\delta, \epsilon)</math> is in the set <math display="inline">A^\flat_6</math> which consists of <math display="inline">A_6 \subset \R^+ \times \R^+</math> with the properties that for <math display="inline">(\epsilon, \delta) \in A_6</math> and <math display="inline">z</math> such that <math display="inline">\rho(z) = \delta</math>, <math display="inline">r\pi(z) = \delta</math>, <math display="inline">|f(z)| \leq \epsilon</math> and <math display="inline">|f\pi(z)| \leq \epsilon</math> then the covectors <math display="inline">d\rho(z)</math>, <math display="inline">dr\pi(z)</math>, <math display="inline">df(z)</math> and <math display="inline">df\pi(z)</math> are linearly independent when restricted to <math display="inline">T_zY</math> (where <math display="inline">Y</math> is the stratum containing <math display="inline">z</math>). We can prove such a set exists.<ref>Goresky and MacPherson 1988, pp. 89.</ref> <math display="inline">A^\flat_6</math> is this plus its reflection about the <math display="inline">x</math> axis.<ref>Goresky and MacPherson 1988, pp. 82.</ref>
Let <math display="inline">D = \{ x \in X | r(x) \leq \delta \}</math> for stratum <math display="inline">X</math>. We will show there is a local trivial fibration of the configuration: <math display="inline">(V_1, V_2)</math> fibres over <math display="inline">D</math> and is homeomorphic to <math display="inline">D \times (\text{normal Morse data})</math>
(V_1, V_2) -> D \times (normal Morse data)
| /
--> D <---
and that <math display="inline">(W_1, W_2)</math> fibres over the tangential Morse data and is homeomorphic to <math display="inline">(\text{tangential Morse data}) \times (\text{normal slice})</math>.
For <math display="inline">Z_1 = \{ z \in Z : r\pi(z) \leq \delta \}</math>, the map <math display="inline">F(z): Z_1 \to \R^2 = (\rho(z), f(z) - f\pi(z))</math> is transverse to each stratum of <math display="inline">\text{Box}(\delta, \epsilon/4)</math>, [list], [by lemma 6.5]. <math display="inline">(V_1, V_2) = F^{-1}(\text{Box}(\delta, \epsilon/4), \text{Bottom}(\delta, \epsilon/4))</math>. For each stratum <math display="inline">S</math> of Box and each <math display="inline">x \in D</math>, we have transverse intersection <math display="inline">F^{-1}(S) \pitchfork \pi^{-1}(x)</math>. Therefore, <math display="inline">\pi|F^{-1}(S)</math> is a submersion and by Thom's isotopy lemma the projection <math display="inline">\pi|F^{-1}(\text{Box}(\delta, \epsilon/4): F^{-1}(\text{Box}(\delta, \epsilon/4)) \to X</math> is a stratified fibre bundle over <math display="inline">D</math>. The fibre over the critical point <math display="inline">p</math> is <math display="inline">\pi^{-1}(p) \cap (F^{-1}(\text{Box}(\delta, \epsilon/4), F^{-1}(\text{Bottom}(\delta, \epsilon/4))</math> and is equal to the normal Morse data...<ref>Goresky and MacPherson 1988, pp. 101.</ref>
Take <math display="inline">G: X \to \R^2 = (r(x), f(x))</math>. <math display="inline">\delta</math> and <math display="inline">\epsilon</math> have been chosen so that <math display="inline">(G^{-1}(\text{Box}(\delta, \epsilon/4), G^{-1}(\text{Bottom}(\delta, \epsilon/4))</math> is the tangential Morse data for <math display="inline">f</math> and is contained in the region <math display="inline">D</math> over which <math display="inline">\pi|(V_1, V_2)</math> is a stratified fibre bundle. Therefore, <math display="inline">(W_1, W_2) = \pi^{-1} G^{-1}(\text{Box}(\delta, \epsilon/4), \text{Bottom}(\delta, \epsilon/4))</math> is transverse to <math display="inline">(V_1, V_2)</math>.<ref>Goresky and MacPherson 1988, pp. 101-102.</ref>
Finally, this means that <math display="inline">(V_1, V_2) \cap (W_1, W_2)</math> is homeomorphic (by stratum preserving homeomorphism) to <math display="inline">(\pi^{-1}(p), \cap (V_1, V_2)) \times \pi(W_1, W_2)</math>, the product of normal and tangential Morse data.<ref>Goresky and MacPherson 1988, pp. 102.</ref>
We use a succession of such diagrams to interpolate between the box diagram which defines local Morse data [explain] and the above diagram whose realisation we have just proven is <math display="inline">(\text{normal Morse data}) \times (\text{tangential Morse data})</math>.
[diagram_d0.py]
The realisation is the local Morse data. This is equal to the realisation of the diagram below.<ref>Goresky and MacPherson 1988, pp. 103, 106.</ref>
[diagram_d11.py]
The realisation of the first diagram [d0] is equivalent to the realisation of the below diagram.
[diagram_d1.py]
In the right-hand picture of the above diagram, we have put a dotted outline around the region <math display="inline">A^{\flat}_1</math>. We prove that there are no characteristic covectors for <math display="inline">(r, f): Z \to \R^2</math> in this region and can, therefore, move the wall in this region...<ref>Goresky and MacPherson 1988, pp. 82-83.</ref>
By adding a zero-dimensional stratum at the top right corner of the right-hand picture. A one-parameter family of pictures <math display="inline">P_b(t)</math> gives rise to a stratified space <math display="inline">Y \subset M \times \R</math> such that
<math display="block">Y = \{ (z, t) \in M \times \R : (r, f)(z) \in P_b(t) \}.</math>
<math display="inline">(r, f)</math> takes each stratum of <math display="inline">Z</math> transversally to each stratum of each <math display="inline">Y_t</math>. <math display="inline">(f \circ \pi, f)^{-1}(P_a) = f^{-1}[-\epsilon, \infty)</math> is transverse to each stratum of <math display="inline">Y_t \cap Z</math>. Therefore, there is a homeomorphism between<ref>Goresky and MacPherson 1988, pp. 107.</ref>
<math display="block">Z(D_1) = Z \cap (f \circ \pi, f)^{-1}(P_a) \cap (r, f)^{-1}(P_b(0))</math>
and
<math display="block">Z(D_1) = Z \cap (f \circ \pi, f)^{-1}(P_a) \cap (r, f)^{-1}(P_b(1)).</math>
To go from D_2 to D_3 we find the characteristic covectors of <math display="inline">(f\pi, f): V \to \R^2</math> where <math display="inline">V = (r, f)^{-1}(P_b(1))</math>. We stratify <math display="inline">P_b(1)</math> by its interior <math display="inline">P</math> and boundary <math display="inline">\partial P</math>.<ref>Goresky and MacPherson 1988, pp. 107.</ref>
The strata of <math display="inline">V</math> come in four types:
# <math display="inline">(r, f)^{-1}(P) \cap X</math>
# <math display="inline">(r, f)^{-1}(P) \cap Y</math>
# <math display="inline">(r, f)^{-1}(\partial P) \cap X</math>
# <math display="inline">(r, f)^{-1}(\partial P) \cap Y</math>
where <math display="inline">X</math> is the strata that contains the critical point and <math display="inline">Y</math> is any other strata such that <math display="inline">Y > X</math>.
All characteristic covectors are of the form <math display="inline">\lambda = (u, v, adu + bdv) \in T^*\R^2</math>.
For strata 1 and 3, the image of <math display="inline">X</math> under <math display="inline">(f\pi, f)</math> is the diagonal <math display="inline">f\pi = f</math> (dotted outline). Therefore, the characteristic covectors of any point <math display="inline">z</math> in <math display="inline">X</math> are either where <math display="inline">z = p</math>, in which case the covector is zero(?), or where <math display="inline">z \neq p</math>, in which case <math display="inline">u = v</math> and <math display="inline">a = b</math>.<ref>Goresky and MacPherson 1988, pp. 107-108.</ref>
For strata 2, being that the critical point is isolated and non-degenerate, which means it, and any neighbourhood, is not zero on any limit of tangent spaces in strata <math display="inline">Y > X</math>. Therefore, <math display="inline">f</math> and <math display="inline">f\pi</math> are linearly independent.<ref>Goresky and MacPherson 1988, pp. 84.</ref> Unless <math display="inline">\pi(z) = p</math>, in which case <math display="inline">d(f\pi)(z) = f\pi(z) = 0</math>, so they are covectors where <math display="inline">u = 0</math> and <math display="inline">b = 0</math>.<ref>Goresky and MacPherson 1988, pp. 108.</ref>
For strata 4, we can use implicit function theorem to generate local coordinates <math display="inline">y_1, \cdots y_{r-s-1}</math> in <math display="inline">Y > X</math> and define the Riemannian metric <math display="inline">r(z) = r\pi(z) + (f(z) - f\pi(z))^2 + g(y)</math> for some <math display="inline">g</math> depending only on <math display="inline">y</math>.
There are no characteristic covectors in <math display="inline">|u| \leq \epsilon</math> and <math display="inline">|v| < \epsilon</math>. By [lemma 6.7 and 6.8 and 8.1(d)] <math display="inline">df</math>, <math display="inline">df\pi</math> and <math display="inline">dr</math> are linearly independent in this region.<ref>Goresky and MacPherson 1988, pp. 109.</ref> Given <math display="inline">|f| \leq \epsilon</math> and <math display="inline">|f\pi| \leq \epsilon</math>, a fringed set <math display="inline">A^\flat_4</math> of type <math display="inline">0 < \epsilon \ll \delta</math> and assume that <math display="inline">\pi \neq p</math> and <math display="inline">z \notin X</math> then <math display="inline">(r(z), f(z)) \in A^\flat_4</math> and <math display="inline">(r(z), f\pi(z)) \in A^\flat_4</math>.<ref>Goresky and MacPherson 1988, pp. 87.</ref>
Outside of these points, the slope of <math display="inline">\ker(\lambda)</math> for any characteristic covector <math display="inline">\lambda</math> is
<math display="block">\frac{-a}{b} = \frac{f(z) - f\pi(z) - M}{\frac{\alpha}{\beta} + (f(z) - f\pi(z))}</math>
for <math display="inline">\alpha df + \beta dr = 0</math>.<ref>Goresky and MacPherson 1988, pp. 108-109.</ref>
== Morse theory ==
Steps(?)
* Explain topology
* Every point of a stratum is locally like a product structure (proved by Thom's Isotopy Lemma) [GM pp. 41-42]
** Including those around critical points, which are the product of normal and tangential Morse data (these are our quasi-local cycles?)
* Thom's Isotopy Lemma proves a strong deformation retraction (which only stops at critical points) [PWM pp. 541-542]
=== Homotopy ===
We want to replace our domain of convergence <math display="inline">M</math>, which is the complement of our singular variety <math display="inline">\mathcal{V}</math>, with an "equivalent" space <math display="inline">M'</math> which has better understood properties. We say "equivalent" because there are several different things we could mean by "equivalent" in this context. The equivalence we are referring to in this section is called '''homotopy'''.
Imagine two subspaces <math display="inline">\gamma_0</math> and <math display="inline">\gamma_1</math> of a space <math display="inline">Y</math> which are defined respectively by smooth functions <math display="inline">f, g: X \to Y</math>. If there exists a smooth function <math display="inline">h_s: X \times [0, 1] \to Y</math>, called a homotopy, such that <math display="inline">h_0 = f</math>, <math display="inline">h_1 = g</math> and for any <math display="inline">\epsilon > 0</math> there exists a <math display="inline">\delta_a</math> and <math display="inline">\delta_b</math> such that when <math display="inline">|s - s_0| < \delta_a</math> and <math display="inline">|x - x_0| < \delta_b</math> we have <math display="inline">|h_s(x) - h_{s_0}(x_0)| < \epsilon</math>, then we say <math display="inline">\gamma_0</math> and <math display="inline">\gamma_1</math> are '''homotopic'''.<ref>Henle 1979, pp. 251-252.</ref>
Below is an example where <math display="inline">\gamma_0</math> and <math display="inline">\gamma_1</math> are one-dimensional curves and <math display="inline">H(t, s) = h_s(t)</math>.
[[File:Homotopy_curves.png|300px]]
In [[#Homotopy_equivalence|Appendix A]], we formally prove that we can construct an equivalent space <math display="inline">M'</math>. We provide only an example to give some intuition before describing how to construct the space <math display="inline">M'</math> in terms of local cycles around critical points.
=== Motivating example ===
Imagine a torus and a height function which is just the z value of the point.
[[File:3D-Leveltorus.png|200px]]
It has four critical points: two at the top and bottom of the outer circle (<math display="inline">p_1, p_4</math>) and two at the top and bottom of the inner circle (<math display="inline">p_2, p_3</math>).
[picture]
When the height is between the <math display="inline">p_1</math> and <math display="inline">p_2</math>, the space is a two-cell, which can be retracted to a point.
[picture]
When the height is between <math display="inline">p_2</math> and <math display="inline">p_3</math>, the space is a cylinder, which can be retracted to a two-cell with a one-cell attached.
[[File:3D-Cylinder_and_disk_with_handle.png|200px]]
When the height is between <math display="inline">p_3</math> and <math display="inline">p_4</math>, the space is a torus with a disc removed, which can be retracted to a cylinder with a one-cell attached.
[[File:3D-Cylinder_with_handle_and_torus_with_hole.png|200px]]
When the height is greater than <math display="inline">p_4</math>, then the full torus is constructed by attaching a two-cell.
[Explain in terms of Morse data and Morse index?]
=== Morse data and quasi-local cycles ===
As in the above example, we start at the "bottom" of <math display="inline">M</math> and build upwards until just before we reach our first critical point <math display="inline">p</math>.
;Smooth points
:This is a tube around a <math display="inline">(d-1)</math>-chain <math display="inline">\gamma</math> where the height function <math display="inline">h</math> is maximised at <math display="inline">p</math>.<ref>Pemantle, Wilson and Melczer 2024, pp. 223.</ref>
:For example, if <math display="inline">F(x, y) = \frac{1}{1 - x - y}</math> then <math display="inline">\lambda = 1</math> and <math display="inline">B^\lambda</math> is an arc reaching its highest point at <math display="inline">p</math>.
:The normal plane <math display="inline">N</math> at <math display="inline">p</math> is a plane orthogonal to <math display="inline">B^1</math>(?).
:Its normal link <math display="inline">L(S)</math> is a circle with two points missing where it intersects <math display="inline">\mathcal{V}</math>.
:We make our quasi-local cycle out of the product of the arc and circle joined to <math display="inline">M_-</math> at points below <math display="inline">M_-</math>.
:With the exception of degenerate points, such as monkey saddles...<ref>e.g. Pemantle, Wilson and Melczer 2024, pp. 211.</ref>
;Transverse multiple points
:This is the product of a <math display="inline">k</math>-torus and a <math display="inline">(d-k)</math>-chain <math display="inline">\gamma</math>. The torus is the product of circles about <math display="inline">p</math> in the complex normal space to each strata which intersects <math display="inline">p</math>. The chain <math display="inline">\gamma</math> is supported in the stratum which is the common intersection of the varieties defined by the factors vanishing at <math display="inline">p</math>, and achieves its maximum height at <math display="inline">p</math>.<ref>Pemantle, Wilson and Melczer 2024, pp. 223-224.</ref>
;Arrangement multiple point
:This is the product of a <math display="inline">(d-k)</math>-chain <math display="inline">\gamma</math> and several <math display="inline">k</math>-tori, one for each pair of sheets which intersect transversely, where the torus is the product of circles about <math display="inline">p</math> in each sheet.<ref>Pemantle, Wilson and Melczer 2024, pp. 226.</ref>
;Cone point
:A cone point is zero-dimensional so there is no <math display="inline">\gamma</math>, just a <math display="inline">d</math>-torus about <math display="inline">p</math>.<ref>Pemantle, Wilson and Melczer 2024, pp. 227.</ref>
== Notes ==
{{Reflist}}
== References ==
* {{cite book | last1=Goresky | first1=Mark | last2=MacPherson | first2=Robert | title=Stratified Morse Theory | publisher=Springer-Verlag | year=1988 | url=https://www.math.ias.edu/~goresky/pdf/SMT.djvu }}
* {{cite book | last=Henle | first1=Michael | title=A Combinatorial Introduction to Topology | publisher=Dover Publications Inc. New York | year=1979 }}
* {{citation | last=Mather | first=John | title=Notes on Topological Stability | year=2012 | journal=Bulletin of the American Mathematical Society | volume=49 | number=4 | pages=475-506 | url=https://www.ams.org/journals/bull/2012-49-04/S0273-0979-2012-01383-6/S0273-0979-2012-01383-6.pdf }}.
* {{cite book | last1=Pemantle | first1=Robin | last2=Wilson | first2=Mark C. | last3=Melczer | first3=Stephen | title=Analytic Combinatorics in Several Variables | publisher=Cambridge University Press | year=2024 | edition=2nd | url=https://acsvproject.com/PemantleWilsonMelczer23.pdf }}
buuzod9hry6tgftjysdp9jvnexv6r0g
4676717
4676714
2026-10-18T09:28:45Z
Dom walden
3209423
/* Fringed sets */ Proof of A_3 (incomplete)
4676717
wikitext
text/x-wiki
== Introduction ==
Morse theory tells us that the topology of M only changes at its critical points.
The "Morse data" tells us the topology at each critical point.
Attaching this Morse data together gives us a space which is homopotically eqivalent to M.
This space is a "cell complex", which has an easy to calculate homology.
Theorem: Our domain of convergence is homotopic to a cell complex of dimension at most <math display="inline">2n - d - 1</math>.<ref>This is theorem D.23 in Pemantle, Wilson and Melczer 2024, pp. 546. Also theorem in section 1.2*/5.2* in SMT pp. 200.</ref>
Proof:
# <math display="inline">X</math> is our entire domain, <math display="inline">\mathcal{V}</math> our variety
# Project our entire domain to complex projective space <math display="inline">Z = \pi(X) \subset \C\mathbb{P}^n - H</math> [define H]
# Define a linear subspace <math display="inline">G \subset \C\mathbb{P}^n</math> of dimension <math display="inline">d - 1</math>
# Define a Morse function on <math display="inline">f: \C\mathbb{P}^n \to \R</math> which approximates the distance from <math display="inline">G</math> and such that <math display="inline">f^{-1}(0) = G</math> and <math display="inline">f^{-1}(1) = H</math>
# We "build" <math display="inline">X - \mathcal{V}</math> from <math display="inline">\pi^{-1}(G \cap Z) \cap (X - \mathcal{V})</math> by attaching CW complexes at critical points which are of at most dimension <math display="inline">2n - d - 1</math>
# At a critical point, the normal Morse data is <math display="inline">(J, K) = \coprod_x (J_x, K_x)</math> and the relative complex link is <math display="inline">\mathcal{L}^\pi = \coprod_x \mathcal{L}_x</math>
# We show that the quotient <math display="inline">J_x/K_x</math> is homotopic to a CW complex of dimension <math display="inline">\leq 2n - d - 1</math>
# The neighbourhood of <math display="inline">x</math> in <math display="inline">J_x</math> is homeomorphic to the cone in <math display="inline">L_x(X - \mathcal{V})</math>, and removing the point <math display="inline">x</math> increases the homotopy dimension to at most the homotopy dimension of <math display="inline">L_x</math>
# <math display="inline">(J_x \cup \{x\}, K_x)</math> is homotopic to <math display="inline">(\text{cone}(\mathcal{L}_x), \mathcal{L}_x)</math>
# <math display="inline">\mathcal{L}_x</math> is homotopic to a CW complex of dimension at most <math display="inline">2n - d - 1</math>
# The tangential Morse data at the critical point is homotopic to the pair <math display="inline">(D^\lambda, \partial D^\lambda)</math>
# Therefore, at each critical point a space has been added homotopic to a CW complex of dimension at most <math display="inline">2n - d - 1</math>.
Theorem: If <math display="inline">X</math> is the complement in <math display="inline">\C^n</math> of a complex variety <math display="inline">\mathcal{V}</math> of dimension <math display="inline">d</math> then <math display="inline">X</math> is homotopic to a CW complex of dimension at most <math display="inline">2n - d - 1</math>.<ref>Pemantle, Wilson and Melczer 2024, pp. 546.</ref>
Proof:
# We build <math display="inline">X</math> by attaching cells of dimension at most <math display="inline">2n - d - 1</math> at each critical point.
## Prove that we can do this without changing the homotopy(?)
## We use Thom's Isotopy Lemma to prove that there is a strong deformation retraction, stopping only at critical points.
# Prove these cells are a product of the normal and tangential Morse data.
## Normal data: <math display="inline">(\mathcal{L}(S), \partial \mathcal{L}(S)) \times (D^1, \partial D^1)</math> [GM pp. 18]
## Tangential data: <math display="inline">(B_\delta \cap f^{-1}[v - \epsilon, v + \epsilon], B_\delta \cap f^{-1}(v - \epsilon))</math> for <math display="inline">f</math> restricted to <math display="inline">X</math> (or <math display="inline">\mathcal{V}</math>?) [GM pp. 63-64]
# If <math display="inline">k</math> is the dimension of the strata, then
## If <math display="inline">k = d</math> then it is a smooth point and the cell is the product of <math display="inline">S^{2(n-d)-1}</math> and the tangential data is dimension at most <math display="inline">d</math>.
## If <math display="inline">k < d</math>, ...
<ref>Pemantle, Wilson and Melczer 2024, pp. 547.</ref>
== Example in one dimension ==
Domain with singularities v_1, v_2, ..., v_i
Define our height function f...
Start with our entire domain X
Reduce from X to X_i+ by using Thom's Isotopy lemma to do a strong deformation retract
== Thom's isotopy lemma ==
We present a modified version of Thom's (first) isotopy lemma, less general than the original but more obviously relevant to our situation.
Theorem: Suppose <math display="inline">Z</math> is a closed subset of a smooth manifold <math display="inline">M</math> which admits a Whitney stratification and <math display="inline">h : M \to \R</math> is a proper Morse function which has no critical values on <math display="inline">Z</math>. Then, the level sets of <math display="inline">Z</math> are homeomorphic by a homeomorphism that preserves the strata of <math display="inline">Z</math>.<ref>For various versions of the full statement of the theorem, see Mather 2012, pp. 499, Goresky and MacPherson 1988, pp. 41, or Pemantle, Wilson and Melczer 2024, pp. 541.</ref>
Proof:
# Construct control data for <math display="inline">Z</math> compatible with <math display="inline">h</math>.
## [Prop 7.1] If <math display="inline">h</math> is smooth on <math display="inline">Z</math> and is a submersion for each strata then there exists a family of control data for <math display="inline">Z</math> compatible with <math display="inline">h</math>.<ref>Mather 2012, pp. 488.</ref>
# This makes <math display="inline">Z</math> an abstract stratified set and <math display="inline">f</math> a controlled submersion.
# A controlled submersion has, for any smooth vector field on <math display="inline">\R</math>, a controlled vector field on <math display="inline">Z</math> (a "lift"?)<ref>Mather 2012, pp. 493.</ref>
# A controlled vector field has a unique one-parameter family of homeomorphisms of <math display="inline">Z</math> which commute with <math display="inline">h</math>.<ref>Mather 2012, pp. 496.</ref>
# This makes <math display="inline">h</math> a locally trivial fibration. [Prop 10.2]<ref>Mather 2012, pp. 499.</ref>
Control data:
A system of '''control data''' for <math display="inline">Z</math> consists of, for each stratum <math display="inline">X</math> of <math display="inline">Z</math>,
* a '''tubular neighbourhood''' <math display="inline">T_X</math> of <math display="inline">X</math>
* a '''tubular projection function''' <math display="inline">\pi_X: T_X \to X</math>, and
* a '''tubular distance function''' <math display="inline">\rho_X: T_X \to \R</math> such that <math display="inline">\rho_X^{-1}(0) = X</math><ref>Goresky and MacPherson 1988, pp. 42.</ref>
[illustration]
such that if <math display="inline">X < Y</math> are strata in <math display="inline">Z</math>, then
<math display="block">\pi_X \pi_Y(m) = \pi_X(m),</math>
<math display="block">\rho_X \pi_Y(m) = \rho_X(m)</math>
for all <math display="inline">m \in |T_X| \cap |T_Y|</math> such that <math display="inline">\pi_Y(m) \in |T_X|</math>.
If, for all strata <math display="inline">X</math> and all <math display="inline">m \in |T_X|</math>, we have <math display="inline">h \pi_X(m) = h(m)</math>, then this control data will be said to be compatible with <math display="inline">h</math>.<ref>Mather 2012, pp. 488.</ref>
We prove that if <math display="inline">h</math> is smooth on <math display="inline">Z</math> and is a submersion for each strata then there exists a family of control data for <math display="inline">Z</math> compatible with <math display="inline">h</math>.<ref>Mather 2012, pp. 488, prop 7.1.</ref>
Let <math display="inline">Z_k</math> be the union of strata of <math display="inline">Z</math> of dimension less than <math display="inline">k</math>. We prove by induction on <math display="inline">k</math>.
To construct the tubular neighbourhood <math display="inline">T_X</math> of a stratum <math display="inline">X</math> of dimension less than <math display="inline">k</math>. For <math display="inline">l \leq k</math>, let <math display="inline">U_l</math> denote the union of all <math display="inline">|T_Y|</math> for <math display="inline">Y < X</math> and <math display="inline">\dim Y \geq l</math>. Let <math display="inline">X_l = U_l \cap X</math>.<ref>Mather 2012, pp. 489.</ref>
For <math display="inline">l = k</math>, <math display="inline">X_k = \empty</math>. Assume by induction that <math display="inline">T_{l+1}</math> has been constructed and that if <math display="inline">Y < X</math>, <math display="inline">\dim Y \geq l + 1</math>, <math display="inline">m \in |T_{l+1}| \cap |T_Y|</math> and <math display="inline">\pi_{l+1}(m) \in |T_Y|</math> (<math display="inline">\pi_{l+1} = \pi_{T_{l+1}}</math>) then<ref>Mather 2012, pp. 489-490.</ref>
<math display="block">\rho_Y \pi_{l+1}(m) = \rho_Y(m),</math>
<math display="block">\pi_Y \pi_{l+1}(m) = \pi_Y(m).</math>
We wish to construct a tubular neighbourhood <math display="inline">T_{X,Y}</math> of <math display="inline">|T_Y| \cap X</math> whose restriction to <math display="inline">|T_Y| \cap X_{l+1}</math> is isomorphic to the restriction of <math display="inline">T_{l+1}</math> such that if <math display="inline">m \in |T_{X,Y}| \cap |T_Y|</math> and <math display="inline">\pi_{X,Y}(m) \in |T_Y|</math> (<math display="inline">\pi_{X,Y} = \pi_{T_{X,Y}}</math>) then
<math display="block">\rho_Y \pi_{X,Y}(m) = \rho_Y(m),</math>
<math display="block">\pi_Y \pi_{X,Y}(m) = \pi_Y(m).</math>
By shrinking <math display="inline">|T_Y|</math> if necessary, this relation is already satisfied if <math display="inline">m \in |T_{l+1}| \cap |T_Y|</math> and <math display="inline">\pi_{l+1}(m) \in |T_Y|</math> with <math display="inline">T_{l+1}</math> in place of <math display="inline">T_{X,Y}</math> and <math display="inline">\pi_{l+1}</math> in place of <math display="inline">\pi_{X,Y}</math>. By the definition, if <math display="inline">m \in |T_{l+1}|</math> then there exists <math display="inline">Z < X</math> with <math display="inline">\dim Z > l</math>, <math display="inline">m \in |T_Z|</math> and <math display="inline">\pi_{l+1}(m) \in |T_Z|</math>. We have that <math display="inline">\pi_{l+1}(m) \in |T_Y| \cap |T_Z|</math> and therefore <math display="inline">Y < Z</math>. Therefore<ref>Mather 2012, pp. 490.</ref>
<math display="block">\rho_Y \pi_{l+1}(m) = \rho_Y \pi_Z \pi_{l+1}(m) = \rho_Y \pi_Z(m) = \rho_Y(m),</math>
<math display="block">\pi_Y \pi_{l+1}(m) = \pi_Y \pi_Z \pi_{l+1}(m) = \pi_Y \pi_Z(m) = \pi_Y(m).</math>
We can prove that, by shrinking <math display="inline">|T_Y|</math>, <math display="inline">(\rho_Y, \pi_Y): |T_Y| \cap X \to \R \times Y</math> is a submersion [prop 7.3?] and that <math display="inline">T_{X,Y}</math> is compatible with <math display="inline">(\rho_Y, \pi_Y): |T_Y| \cap X_{l+1} \to \R \times Y</math>, i.e. <math display="inline">(\rho_Y, \pi_Y) \pi_{X,Y}(m) = (\rho_Y, \pi_Y)(m)</math>(?).
To prove it is a submersion, for the tubular neighbourhood <math display="inline">T = (E, \epsilon, \psi)</math> there exists a smooth positive function <math display="inline">\epsilon'</math> such that
<math display="block">(\rho_T, \pi_T): Y \cap |T|_{\epsilon'}^0 \to \R \times X,</math>
where <math display="inline">|T|_{\epsilon'}^0 = \psi(B_\epsilon \cap B_{\epsilon'})</math>, is a submersion. If <math display="inline">\Sigma</math> is the set <math display="inline">y \in |T|</math> such that the rank of
<math display="block">(\rho_T, \pi_T): T \cap |T| \to \R \times X</math>
at <math display="inline">y</math> is less than <math display="inline">\dim(\R \times X)</math>. We need to prove that for any <math display="inline">x \in X</math> there exists a neighbourhood of <math display="inline">x</math> which does not intersect with <math display="inline">\Sigma</math>, i.e. the map is not a submersion in this neighbourhood. It follows from [lemma 7.2] that it is enough to prove for <math display="inline">M = \R^m</math>, <math display="inline">X = \R^{m-c} \times 0_c</math> and <math display="inline">T</math> is the '''standard tubular neighbourhood'''.<ref>Mather 2012, pp. 489.</ref>
By standard tubular neighbourhood, we mean the trivial bundle with base <math display="inline">\R^{m-c}</math> and fibre <math display="inline">\R^c</math> where <math display="inline">\pi: \R^m \to \R^{m-c}</math>...<ref>Mather 2012, pp. 488.</ref>
For <math display="inline">y \in |T| - \R^{m-c}</math>, the kernal of the differential of <math display="inline">(\pi_T, \rho_T)</math> at <math display="inline">y</math> is the orthogonal complement of <math display="inline">(\R^{m-c} \times 0_c) \oplus \stackrel{\frown}{y \pi_T(y)}</math> in <math display="inline">\R^m</math>. By the Whitney conditions, we have that for <math display="inline">y</math> near <math display="inline">\R^{m-c}</math>, <math display="inline">(\R^{m-c} \times 0_c) \oplus \stackrel{\frown}{y \pi_T(y)}</math> is close to the set of <math display="inline">m - c + 1</math> planes in <math display="inline">m-</math>space to an <math display="inline">m - c + 1</math> plane in <math display="inline">TY_y</math>. Therefore, for <math display="inline">y</math> near enough to <math display="inline">\R^{m-c}</math>, <math display="inline">TY_y</math> is transverse to the kernal of the differential of <math display="inline">(\pi_T, \rho_T)</math> and, therefore, is a submersion when restricted to <math display="inline">Y</math>.<ref>Mather 2012, pp. 489.</ref>
To prove that <math display="inline">T_{X,Y}</math> is compatible with <math display="inline">(\rho_Y, \pi_Y): |T_Y| \cap X_{l+1} \to \R \times Y</math>...<ref>Mather 2012, pp. 490.</ref>
Therefore, there exists a tubular neighbourhood <math display="inline">T_0</math> of <math display="inline">X_0</math> satisfying
<math display="block">\rho_Y \pi_0(m) = \rho_Y(m),</math>
<math display="block">\pi_Y \pi_0(m) = \pi_Y(m).</math>
From this we can prove that <math display="inline">T_0</math> is compatible with <math display="inline">h</math>. Replacing <math display="inline">T_0</math> with a smaller tubular neighbourhood if necessary we can assume <math display="inline">m \in |T_0|</math> such that for some <math display="inline">Y < X</math>, <math display="inline">m \in |T_Y|</math> and <math display="inline">\pi_0(m) \in |T_Y|</math>, then<ref>Mather 2012, pp. 490.</ref>
<math display="block">h \pi_0(m) = h \pi_Y \pi_0(m) = h \pi_Y(m) = h(m).</math>
By the generalised tubular neighourhood theorem [prop 7.2?], we can replace <math display="inline">T_0</math> with a tubular neighbourhood <math display="inline">T</math> of <math display="inline">X</math> compatible with <math display="inline">h</math>. This completes the construction of <math display="inline">T_X</math>.<ref>Mather 2012, pp. 491.</ref>
This makes <math display="inline">Z</math> an '''abstract stratified set''' with axioms...<ref>Mather 2012, pp. 491-492.</ref>
This also makes <math display="inline">h</math> a '''controlled submersion''' because
# <math display="inline">h|X: X \to \R</math> is a smooth submersion on each strata <math display="inline">X</math> of <math display="inline">Z</math>, and
# for each stratum <math display="inline">X</math> there is a tubular neighbourhood <math display="inline">T'_X</math> such that <math display="inline">h(v) = h \pi_X(v)</math> for all <math display="inline">v \in T'_X</math>.<ref>Mather 2012, pp. 493.</ref>
The core of this is the concept of a '''vector field'''. A vector field is a function which assigns, for each point <math display="inline">p</math> in a space, a '''vector''', which can be represented by an arrow whose tail starts at <math display="inline">p</math>.<ref>Henle 1979, pp. 33.</ref>
[picture]
Imagine we have a vector field <math display="inline">v(x)</math> defined in a space and draw a line through our space. At each point along this line the vector field assigns a vector. If we move each point in this line along the arrow defined by this vector in the direction of the arrow head. This "flows" the entire line along the vectors.
[picture]
We define a '''stratified vector field''' <math display="inline">\eta</math> on <math display="inline">Z</math> to be a family of smooth vector fields <math display="inline">\eta_X</math>, one for each strata <math display="inline">X</math> of <math display="inline">Z</math>.<ref>Mather 2012, pp. 493.</ref>
We define a '''controlled vector field''' <math display="inline">\eta</math> on <math display="inline">Z</math> to be a stratified vector field such that for any strata <math display="inline">Y</math> there exists a tubular neighbourhood <math display="inline">T'_Y</math> such that for any <math display="inline">X > Y</math> and any <math display="inline">v \in T'_X \cap X</math><ref>Mather 2012, pp. 493.</ref>
<math display="block">\eta_X \rho_{Y,X}(v) = 0,</math>
<math display="block">(\pi_{Y,X})_* \eta_X(v) = \eta_Y (\pi_{Y,X}(v)).</math>
We prove that if <math display="inline">h</math> is a controlled submersion then, for any smooth vector field <math display="inline">\zeta</math> on <math display="inline">\R</math> there is a controlled vector field <math display="inline">\eta</math> on <math display="inline">Z</math> such that <math display="inline">h_* \eta(v) = \zeta(h(v))</math> for all <math display="inline">v \in Z</math>.<ref>Mather 2012, pp. 493.</ref>
Proceeding by induction on the maximum dimension of the strata of <math display="inline">Z</math>, we define <math display="inline">Z_k</math> to be the union of strata of <math display="inline">Z</math> of dimension at most <math display="inline">k</math>. The tubular neighbourhood of <math display="inline">Z_k</math> is the intersection of the tubular neighbourhoods of each strata in <math display="inline">Z_k</math> with <math display="inline">Z</math>. The projection and distance functions are the restrictions of the respective functions of <math display="inline">Z</math>.
It is trivially true when the maximum dimension of strata in <math display="inline">Z</math> is zero. Assume it is true for <math display="inline">k</math> and construct each <math display="inline">\eta_X</math> separately for each stratum <math display="inline">X</math> of dimension <math display="inline">k + 1</math>.
By the assumption that we have controlled vector fields for all strata <math display="inline">Y</math> of dimension at most <math display="inline">k</math>, we have the two control conditions defined above for any <math display="inline">X > Y</math> and that there is a neighbourhood <math display="inline">T^1_Y</math> such that <math display="inline">h(v) = h \pi_Y(v)</math> for <math display="inline">v \in T^1_Y</math>.
We want to prove that for all <math display="inline">Y < X</math>, the control conditions are satisfied for all <math display="inline">v \in T^2_Y</math> and that <math display="inline">h_*\eta_X(v) = \zeta(v)</math> for all <math display="inline">v \in X</math>.
Take a point <math display="inline">x \in X</math> and define the set <math display="inline">S_v</math> of strata <math display="inline">Y < X</math> such that <math display="inline">v \in T^2_Y</math>. <math display="inline">S_v</math> is totally ordered since if <math display="inline">Y_1</math> and <math display="inline">Y_2</math> are not comparable then <math display="inline">T^2_{Y_1} \cap T^2_{Y_2} = \empty</math>. Therefore, there is a largest member <math display="inline">Y = Y_v</math>.
Assume the control conditions hold for <math display="inline">Y = Y_v</math>. Then they hold for all <math display="inline">Y_i \in S_v</math>. For, either <math display="inline">Y_i = Y</math> or <math display="inline">Y_i < Y</math>. In the latter case, <math display="inline">\pi_Y(v) \in T^1_{Y_i}</math> (by the choice of <math display="inline">T^2_Y</math>'s [is this why?]. Then
<math display="block">\begin{align}
\eta_X(v) \rho_{Y_i,X}(v) &= \eta_X \rho_{Y_i,Y} \pi_{Y,X}(v) \\
&= (\pi_{Y,X})_* \eta_X(v) \rho_{Y_i,Y} \\
&= \eta_Y(\pi_{Y,X}(v)) \rho_{Y_i,Y} \\
&= 0
\end{align}</math>
and
<math display="block">\begin{align}
(\pi_{Y_i,X})_* \eta_X(v) &= (\pi_{Y_i,Y})_* (\pi_{Y,X})_* \eta_X(v) \\
&= (\pi_{Y_i,Y})_* \eta_Y(v) (\pi_{Y,X}) \\
&= \eta_{Y_i}(\pi_{Y_i,Y} \pi_{Y,X}(v)) \\
&= \eta_{Y_i}(\pi_{Y_i,X}(v))
\end{align}</math>
and, therefore, condition holds for all <math display="inline">Y_i \in S_v</math>. Also,
<math display="block">\begin{align}
h_* \eta_X(v) &= (h \circ \pi_{Y,X})_* \eta_X(v) \\
&= h_* \eta_Y (\pi_{Y,X}(v)) \\
&= \zeta(f(v))
\end{align}</math>
and, therefore, the conclusion of the theorem holds at <math display="inline">v</math>.
This shows we can construct <math display="inline">\eta_X</math> satisfying the control conditions when <math display="inline">S_v</math> is non-empty and satisfying the theorem when <math display="inline">S_v</math> is empty. The set of vectors satisfying these conditions is convex in <math display="inline">TX_v</math>, and so we construct <math display="inline">\eta_X</math> globally via a partition of unity.<ref>Mather 2012, pp. 493-495.</ref>
Finally, we prove that a controlled vector field has a unique one-parameter family of homeomorphisms of <math display="inline">Z</math> which commute with <math display="inline">h</math>.<ref>Mather 2012, this combines Proposition 10.1 and Corollary 10.2 on pp. 496 and 497, respectively.</ref>
For each stratum <math display="inline">X</math> of <math display="inline">Z</math>, <math display="inline">\eta_X</math> generates a unique smooth local one-parameter group <math display="inline">(J_X, \alpha_X)</math> of diffeomorphisms of <math display="inline">X</math> (by standard results of differential geometry), such that <math display="inline">\frac{d}{dt} \alpha(t, v)|_{t=0} = \eta_X(v)</math>, <math display="inline">J_X</math> is an open subset of <math display="inline">\R \times Z</math>, ...
If we define <math display="inline">(J, \alpha)</math> by
<math display="block">J = \bigcup_{X \in S} J_X</math>
<math display="block">\alpha = \bigcup_{X \in S} \alpha_X</math>
we can prove that this is a local one-parameter family of homeomorphisms.<ref>Mather 2012, pp. 496.</ref>
Firstly, it is clear that
# <math display="inline">0 \times Z \subseteq J</math> and <math display="inline">\alpha(0, v) = v</math> for all <math display="inline">v \in Z</math>.
# If <math display="inline">v \in Z</math> then <math display="inline">J_v = J \cap (\R \times v) \subseteq \R</math> is an open interval <math display="inline">(a_v, b_v)</math>, possibly infinite at one or both ends.
# If <math display="inline">v \in Z</math> and <math display="inline">t, s, t + s</math> are in <math display="inline">(a_v, b_v)</math> then <math display="inline">\alpha(t + s, v) = \alpha(t, \alpha(s, v))</math>.<ref>Mather 2012, pp. 495.</ref>
Secondly, it is clear that <math display="inline">\eta</math> generates <math display="inline">\alpha</math> because
# Each stratum <math display="inline">X</math> of <math display="inline">Z</math> is invariant under <math display="inline">\alpha</math>, i.e. <math display="inline">\alpha[J \cap (\R \times X)] \subseteq X</math>.
# For each <math display="inline">v \in Z</math>, the map <math display="inline">t \to \alpha(t, v)</math> of <math display="inline">(a_v, b_v)</math> into the stratum which contains <math display="inline">v</math> is <math display="inline">C^1</math>.
# For any <math display="inline">(t, v) \in Z</math>(?) we have <math display="inline">d/dt \alpha(t, v) = \eta(\alpha(t, v))</math>.<ref>Mather 2012, pp. 495.</ref>
It is unique because each <math display="inline">(J_X, \alpha_X)</math> is unique. We just need to prove that <math display="inline">J</math> is open, <math display="inline">\alpha</math> is continuous, and for any <math display="inline">v \in Z</math> and any compact set <math display="inline">K \subseteq Z</math> there exists <math display="inline">\epsilon > 0</math> such that <math display="inline">\alpha(t, v) \notin K</math> if <math display="inline">t \in (a_v, a_v + \epsilon) \cup (b_v - \epsilon, b_v)</math>.<ref>Mather 2012, pp. 495.</ref>
For the latter-most condition, if it did not hold then there exists...<ref>Mather 2012, pp. 496-497.</ref>
We prove there is a homeomorphism <math display="inline">f: Z \to h^{-1}(0) \times \R</math> such that <math display="inline">\pi \circ f = h</math>, where <math display="inline">\pi: h^{-1}(0) \times \R \to \R</math> is projection to the second factor.
For the coordinate vector field <math display="inline">\partial</math> on <math display="inline">\R</math>, by [prop 9.1] there is a controlled vector field <math display="inline">\tilde\partial</math> such that <math display="inline">f_* \tilde\partial(v) = \partial(h(v))</math> for <math display="inline">v \in Z</math>. By [prop 10.1], <math display="inline">\tilde\partial</math> generates a local one-parameter group <math display="inline">(J, \alpha)</math> such that
<math display="block">h(\alpha(t,v)) = h(v) + t</math>
<math display="inline">h</math> is proper and [d] holds, so <math display="inline">J = \R \times Z</math>. If we define <math display="inline">f</math> as
<math display="block">f(v) = (\alpha(-t, v), h(v))</math>
then <math display="inline">f</math> maps <math display="inline">Z</math> into <math display="inline">h^{-1}(0) \times \R</math> and <math display="inline">\pi \circ f = h</math>. If we define <math display="inline">\bar f: h^{-1}(0) \times \R \to Z</math> as
<math display="block">\bar f(v, t) = \alpha(t, v)</math>
then <math display="inline">f \bar f = \bar f f = Id</math> and <math display="inline">f</math> is a homeomorphism.<ref>Mather 2012, pp. 497.</ref>
== Topology at critical points ==
Theorem: If there is a critical point <math display="inline">p</math> in the singular variety <math display="inline">\mathcal{V}</math> with critical value <math display="inline">v \in (a, b)</math> then the space <math display="inline">X_{\leq b}</math> is homotopic to<ref>Goresky and MacPherson 1988, pp. 174.</ref>
<math display="block">X_{\leq a} \cup [(D^{\lambda+1}, \partial D^{\lambda+1}) \times (\mathcal{L}_X, \partial \mathcal{L}_X)].</math>
Proof:<ref>Proof outline comes from Goresky and MacPherson 1988, pp. 174.</ref>
# <math display="inline">(X_{\leq b}, X_{\leq a})</math> is homeomorphic to <math display="inline">(X_{\leq v + \epsilon}, X_{\leq v -\epsilon})</math>. We can prove this by "moving wall" or Thom's Isotopy Lemma.<ref>Goresky and MacPherson 1988, pp. 90-91, 120.</ref>
# <math display="inline">X_{\leq v + \epsilon}</math> is homeomorphic to <math display="inline">X_{\leq v - \epsilon} \cup (J, K)</math>, where the latter is the local Morse data for <math display="inline">h</math> at <math display="inline">p</math>. We do this by moving the wall...<ref>Goresky and MacPherson 1988, pp. 95-96, 120-121.</ref>
# <math display="inline">(J, K)</math> is homeomorphic to <math display="inline">(D^{\lambda+1}, \partial D^{\lambda+1}) \times (\mathcal{L}_X, \partial \mathcal{L}_X)</math> (tangential data, normal data). Again, moving the wall...<ref>Goresky and MacPherson 1988, pp. 65-66, chapter 8, 121.</ref>
# The normal Morse data depends only on the differential <math display="inline">df(p)</math>.<ref>Goresky and MacPherson 1988, pp. 93.</ref>
# The normal Morse data has the homotopy type of <math display="inline">(\mathcal{L}_X, \partial \mathcal{L}_X)</math>.<ref>Goresky and MacPherson 1988, pp. 169.</ref>
=== Step 1 ===
We get this immediately(?) by Thom's Isotopy Lemma.
=== Step 2 ===
<ref>Goresky and MacPherson 1988, complex case on pp. 120-121 is extension of real case on pp. 95-96.</ref>
Step 1 works because <math display="inline">h</math> is a submersion at each point of the regions we are homeomorphing. This is not the case at critical points. We need some way by which a homeomorphism can pass through a critical point.
To prove a homeomorphism between two subsets <math display="inline">A</math> and <math display="inline">B</math> of <math display="inline">Z</math>, we project <math display="inline">Z</math> to some other space <math display="inline">N</math> (in our case <math display="inline">\R^n</math>) using some function <math display="inline">F</math>. We take subsets <math display="inline">Y_0</math> and <math display="inline">Y_1</math> of <math display="inline">N</math> such that <math display="inline">A = Z \cap F^{-1}(Y_0)</math> and <math display="inline">B = Z \cap F^{-1}(Y_1)</math>. We need to prove <math display="inline">Y_0</math> and <math display="inline">Y_1</math> are connected by a one-parameter family of regions <math display="inline">Y_t</math> [explain one-parameter family]. The criterion for such a family to exist is that the '''characteristic covectors''' of <math display="inline">F</math> are all nonzero on each stratum of <math display="inline">Y_t</math>.<ref>Goresky and MacPherson 1988, pp. 70.</ref>
At each point <math display="inline">x \in M</math> and <math display="inline">y \in N</math> there are '''tangent spaces''' <math display="inline">T_xM</math> and <math display="inline">T_yN</math>, a vector space whose zero is at the point <math display="inline">x</math> or <math display="inline">y</math> (resp.)
[picture of various tangent spaces]
In the case the <math display="inline">N = \R</math>, the tangent space <math display="inline">T_x\R</math> is just <math display="inline">\R</math> but whose origin is at <math display="inline">x</math>.
[picture of T_x\R]
Say <math display="inline">F(x) = y</math>, then the differential of the map <math display="inline">F</math> can be seen as a function whose input is a vector in the tangent space <math display="inline">T_xM</math> and whose output is a vector in the tangent space <math display="inline">T_yM</math>. [If I move this far on the tangent space of M how do I move in the tangent space of N?]
[picture]
[example for M = \R and N = \R?]
A function which takes as input a vector in the tangent space <math display="inline">T_xM</math> (say) and outputs a scalar (usually <math display="inline">\R</math>) is called a '''covector'''. The set of all covectors on <math display="inline">T_xM</math> is called the dual space of <math display="inline">T_xM</math> and is denoted <math display="inline">T^*_xM</math>. There are only a limited number of ways to express a covectors. For example, if our tangent space is two-dimensional then all covectors are of the form <math display="inline">ax + by</math> where <math display="inline">(x, y) \in T_xM</math>.
We take our space <math display="inline">M</math> and map it onto <math display="inline">\R^2</math> with the map <math display="inline">F(z) = (r(z), h(z))</math>, where <math display="inline">z \in M</math> and <math display="inline">r</math> is the square of the distance of <math display="inline">z</math> to the critical point <math display="inline">p</math>.
[graph of mapping]
In this case, the covectors on the tangent space <math display="inline">T_xM</math> are of the form <math display="inline">adf(x) + bdr(x)</math> (in this case <math display="inline">df</math> and <math display="inline">dr</math> are maps to <math display="inline">\R</math>) and on <math display="inline">T_y\R^2</math> are of the form <math display="inline">cu + dv</math> (for <math display="inline">(u, v) \in \R^2</math>). A covector <math display="inline">cu + dv \in T^*_{(u, v)}\R^2</math> is called a '''characteristic covector''' of <math display="inline">F</math> if <math display="inline">F(x) = (u, v)</math> and <math display="inline">cdf(x) + ddr(x) = 0</math> for all vectors in the tangent space of the stratum containing <math display="inline">p</math>.<ref>Goresky and MacPherson 1988, pp. 82.</ref> [explain adf(x) + bdr(x) in terms of this being a function which takes a vector input]
[example of where covectors do and do not vanish on a stratified space, pp. 71?]
What we want is a homeomorphism in <math display="inline">M</math> between the space <math display="inline">Z_{\leq \epsilon}</math> and <math display="inline">Z_{\leq \epsilon} \cup B</math>, where <math display="inline">B</math> is a small region of the critical point <math display="inline">p</math>. The '''local Morse data''' is
<math display="block">((B_\delta \cap Z) \cap f^{-1}[v-\epsilon, v+\epsilon], (B_\delta \cap Z) \cap f^{-1}(v-\epsilon))</math>
where <math display="inline">B_\delta</math> is a closed disc in <math display="inline">M</math> of radius <math display="inline">\delta</math>.<ref>Goresky and MacPherson 1988, pp. 63-64.</ref> Observe that this is the pair <math display="inline">(F^{-1}(\text{Box}(\delta, \epsilon)), F^{-1}(\text{Bottom}(\delta, \epsilon)))</math><ref>Goresky and MacPherson 1988, pp. 91.</ref> [explain Box, Bottom, etc.]
[picture of the two subspaces of Z in M]
We use our map <math display="inline">F</math> to convert these two subspaces to subspaces of <math display="inline">\R^2</math> which are of the form <math display="inline">Y_1 = \{(x,y) \in \R^2 | y \leq \epsilon\}</math> and <math display="inline">Y_0 = \{(x,y) \in \R^2 | y \leq -\epsilon\} \cup \{(x,y) \in \R^2 | x \leq \delta, y \leq \epsilon\}</math>, such that <math display="inline">Z_{\leq \epsilon} = F^{-1}(Y_1)</math> and <math display="inline">Z_{\leq \epsilon} \cup B = F^{-1}(Y_0)</math>.<ref>Goresky and MacPherson 1988, pp. 95-96.</ref>
We use a homeomorphism between <math display="inline">Y_1</math> and <math display="inline">Y_0</math> using the technique of "moving the wall" and Thom's Isotopy Lemma. Such a homeomorphism exists when the characteristic covectors of <math display="inline">F</math> are all nonzero on each stratum of <math display="inline">Y_t</math>.<ref>Goresky and MacPherson 1988, chapter 4, particularly pp. 71-72.</ref>
Given a smooth mapping between manifolds <math display="inline">F: M \to N</math> (for example, in our case we could have <math display="inline">N = \R^2</math>) and that <math display="inline">F|Z: Z \to N</math> is proper. Let <math display="inline">Y \subset N \times \R</math> be a closed Whitney stratified subset such that the projection to the second factor <math display="inline">\pi: Y \to \R</math> is a proper stratified submersion.<ref>Goresky and MacPherson 1988, pp. 71.</ref>
Suppose for each <math display="inline">t \in \R</math>, for each <math display="inline">p \in F(Z) \cap Y_t</math>, and for each nonzero characteristic covector <math display="inline">\lambda \in T^*_pN</math> of <math display="inline">F|Z</math>, the restriction of <math display="inline">\lambda</math> to the subspace <math display="inline">T_pS_t = \ker(d\pi(p)) \cap T_pS</math> is nonzero, where <math display="inline">S</math> is a stratum of <math display="inline">Y</math> which contains <math display="inline">(p, t)</math> and <math display="inline">S_t = \pi^{-1}(t) \cap S</math> is the stratum of <math display="inline">Y_t = \pi^{-1}(t) \cap Y</math> which contains <math display="inline">p</math>. This is equivalent to the statement that, for each <math display="inline">t \in \R</math>, the restriction <math display="inline">F|Z</math> is transverse to <math display="inline">Y_t</math>.<ref>Goresky and MacPherson 1988, pp. 71-72.</ref>
This means that, for each <math display="inline">t \in \R</math>, <math display="inline">Z \cap F^{-1}(Y_t)</math> is stratified by its intersection with the strata of <math display="inline">Z</math>...
We finally prove there is a homeomorphism between <math display="inline">Z \cap F^{-1}(Y_0) \cong Z \cap F^{-1}(Y_1)</math> which preserves the Whitney stratification of both sides and is smooth on each stratum.
For the composition
<math display="block">Z \times \R \subset M \times \R \to_{F \times I} Y \subset \R^2 \times \R \to_{\pi} \R</math>
where <math display="inline">Y(t, z) = Y_t(z)</math>, <math display="inline">I</math> is the identity and <math display="inline">\pi</math> is projection to the second factor.
<math display="inline">Z \times \R</math> is transverse to <math display="inline">(F \times I)^{-1}(Y)</math>...
The composition <math display="inline">\pi \circ (F \times I): Z \times \R \cap (F \times I)^{-1}(Y) \to \R</math> is a stratified submersion because
* The input domain is stratified as above...,
* We have defined <math display="inline">F|Z</math> to be transverse to <math display="inline">Y</math>, and therefore it preserves the stratification (unless <math display="inline">F(Z) \cap Y = \empty</math>), and
* We defined above the projection on <math display="inline">Y</math> to be a stratified submersion, meaning it is a submersion on each stratum of <math display="inline">F(Z) \cap Y</math>.<ref>Goresky and MacPherson 1988, pp. 43.</ref>
Therefore, we can apply Thom's Isotopy Lemma which says there is a homeomorphism between the level sets of <math display="inline">Z \times \R</math>...<ref>Goresky and MacPherson 1988, pp. 72.</ref>
=== Step 3 ===
==== Characteristic covectors ====
==== Fringed sets ====
When manipulating our domain of integration[?], we need to make sure we are doing this in regions with no characteristic covectors. The introduce the concept of a fringed set, a subset of <math display="inline">R^2</math>, and construct a series of fringed sets which contain no characteristic covectors.
A '''fringed set''' <math display="inline">A \subset \R \times \R^+</math> is an open subset of the first quadrant of <math display="inline">\R^2</math>. <math display="inline">A</math> is fringed over <math display="inline">0 < y \ll x</math> if for some interval <math display="inline">S = (0, x)</math>
# the projection of <math display="inline">A</math> to the first factor is equal to <math display="inline">S</math>,
# <math display="inline">A</math> is open in <math display="inline">S \times \R^+</math>,
# if <math display="inline">(s, y) \in A</math> and <math display="inline">0 < y' \leq y</math> then <math display="inline">(s, y') \in A</math>.<ref>Goresky and MacPherson 1988, pp. 77.</ref>
[picture]
The fringed set <math display="inline">A^\flat</math> is the set <math display="inline">A</math> plus its reflection about the <math display="inline">x</math> axis.<ref>Goresky and MacPherson 1988, pp. 82.</ref>
[picture]
We build a series of fringed sets which do not contain characteristic covectors, which will be used later in our proof.
There exists a fringed set <math display="inline">A_2</math> of type <math display="inline">0 < v \ll u</math> such that for any <math display="inline">z \in Z</math> such that <math display="inline">r\pi(z) \leq r_2</math>, the map <math display="inline">(\rho, f - f\pi)|\pi^{-1}(\pi(z)): \pi^{-1}(\pi(z)) \to \R^2</math> has no characteristic covectors in <math display="inline">A^\flat_2</math>.<ref>Goresky and MacPherson 1988, pp. 84.</ref>
Given that the set of points <math display="inline">(u, v) \in \R^2</math> which have a nonzero characteristic covector is closed, then it is enough to prove it for points <math display="inline">(u, 0) \in \R^2</math>. Proof by contradiction. Assume it is false and that there is a sequence of points <math display="inline">p_i \in Z \cap f^{-1}(0)</math> converging to <math display="inline">p</math> such that <math display="inline">d\rho(p_i)</math>, <math display="inline">df(p_i)</math> and <math display="inline">df\pi(p_i)</math> are linearly dependent when restricted to the stratum <math display="inline">Y</math> which contains <math display="inline">p_i</math>. This would mean that <math display="inline">f</math> has a critical point on <math display="inline">Y \cap \partial B_{\rho(p_i)}(p)</math>.<ref>Goresky and MacPherson 1988, pp. 82-83.</ref>
By restricting to a subsequence if necessary, we may assume the points <math display="inline">p_i</math> are all contained in the same stratum <math display="inline">Y</math>, that the tangent planes <math display="inline">T_{p_i}Y</math> converge to some plane <math display="inline">Q</math> and the secant lines <math display="inline">\mathcal{l}_i = \overline{p_i p}</math> converge to some line <math display="inline">\mathcal{l}</math>. By the Whitney conditions [how?], <math display="inline">Q = \lim_{i \to \infty} \mathcal{l}_i \oplus T_{p_i}(Y \cap \partial B_\delta(p))</math>.<ref>Goresky and MacPherson 1988, pp. 83.</ref>
For each <math display="inline">i</math>, <math display="inline">f(p_i) = f(p) = v</math>, this means[?] <math display="inline">df(p)(Q) = 0</math>. On the assumption that <math display="inline">df(p)</math> is nondegenerate, we may assume <math display="inline">Y = X</math>, so <math display="inline">\ker d(f|X)(p_i) = T_{p_i}(X \cap \partial B_\delta(p)) = T_{p_i}(X \cap f^{-1}(v))</math>, which converges to a subspace <math display="inline">\tau</math> of <math display="inline">Q = T_pX</math>, perpendicular to <math display="inline">\mathcal{l}</math>. However, as <math display="inline">f^{-1}(v) \cap X</math> satisfies Whitney's conditions, <math display="inline">\mathcal{l} \subset \tau</math>, a contradiction.<ref>Goresky and MacPherson 1988, pp. 83.</ref>
We observe that if <math display="inline">df(p)</math> is a nondegenerate characteristic covector for <math display="inline">Z</math> then it is also a nondegenerate characteristic covector for <math display="inline">Z \cap \pi^{-1}(p)</math>.<ref>Goresky and MacPherson 1988, pp. 84.</ref>
For any <math display="inline">a > 0</math> and <math display="inline">b > 0</math> there exists a fringed set <math display="inline">A_3</math> such that whenever <math display="inline">z \in Z</math> satisfies
# <math display="inline">(r(z), f(z)) \in A^\flat_3</math>,
# <math display="inline">(r\pi(z), f\pi(z)) \in A^\flat_3</math>,
# <math display="inline">z \notin X</math>, and
# <math display="inline">\pi(z) \neq p</math>
then the covectors <math display="inline">ad\rho(z) + bdr\pi(z)</math>, <math display="inline">df(z)</math>, and <math display="inline">df\pi(z)</math> are linearly independent when restricted to the stratum <math display="inline">Y</math> which contains <math display="inline">z</math>.<ref>Goresky and MacPherson 1988, pp. 85.</ref>
Proof by contradiction. If we assume not, then by the Whitney conditions the points <math display="inline">z \in Z</math> such that <math display="inline">ad\rho(z) + bdr\pi(z)</math>, <math display="inline">df(z)</math>, and <math display="inline">df\pi(z)</math> are linearly dependent form a close subset of <math display="inline">Z</math>. By Cauchy[?], this means there is a sequence <math display="inline">z_i \in Z</math> which converge to the critical point <math display="inline">p</math> such that <math display="inline">f(z_i) = 0</math> and <math display="inline">f\pi(z_i) = 0</math> and the covectors <math display="inline">ad\rho(z_i) + bdr\pi(z_i)</math>, <math display="inline">df(z_i)</math>, and <math display="inline">df\pi(z_i)</math> are linearly dependent for all <math display="inline">i</math>. By choosing a subsequence if necessary, we may assume that all <math display="inline">z_i</math> lie in the same stratum <math display="inline">Y</math>, that the secant lines <math display="inline">\overline{p z_i}</math> converge to a line <math display="inline">\mathcal{l}</math>, that the tangent planes <math display="inline">T_{z_i}Y</math> converge to some plane <math display="inline">\tau</math>, and that the subspaces <math display="inline">\ker(ad\rho(z_i) + bdr\pi(z_i))</math>, <math display="inline">\ker(df(z_i))</math>, and <math display="inline">\ker(df\pi(z_i))</math> converge to subspaces <math display="inline">A</math>, <math display="inline">B</math>, and <math display="inline">C</math> of <math display="inline">\tau</math>, respectively.<ref>Goresky and MacPherson 1988, pp. 85.</ref>
[Necessity of Riemannian metric?]
<math display="inline">\mathcal{l}</math> is perpendicular to <math display="inline">A</math>, so <math display="inline">\mathcal{l} \nsubseteq A</math>. But, on the assumption of linear dependence of the covectors, <math display="inline">B + C \subset A</math>, and we show that <math display="inline">\mathcal{l} \subset B</math> and <math display="inline">\mathcal{l} \subset C</math> to prove a contradiction.
==== Homeomorphism ====
We prove there is a stratum preserving homeomorphism between<ref>Goresky and MacPherson 1988, pp. 65.</ref>
<math display="block">\text{Local Morse Data} \cong (\text{Tangential Morse Data}) \times (\text{Normal Morse Data})</math>
We first prove that there is a homeomorphism between the product of the normal and tangential Morse data and the '''realisation''' of the following diagram
[diagram from pp. 102]
where realisation means
<math display="block">Z \cap (g_1, h_1)^{-1}(P_a) \cap (g_2, h_2)^{-1}(P_b)</math>
where all the intersections of strata (of <math display="inline">Z</math>?) are transverse.<ref>Goresky and MacPherson 1988, pp. 100-102.</ref>
The realisation of the above diagram is equal to
<math display="block">(V_1, V_2) \cap (W_1, W_2) = (V_1 \cap W_1, V_1 \cap W_2 \cup V_2 \cap W_1)</math>
where
<math display="block">V_1 = \{ z \in Z : |f(z) - f\pi(z)| \leq \epsilon/4, r\pi(z) \leq \delta, \rho(z) \leq \delta \}</math>
<math display="block">V_2 = \{ z \in Z : f(z) - f\pi(z) = -\epsilon/4, r\pi(z) \leq \delta, \rho(z) \leq \delta \}</math>
<math display="block">W_1 = \{ z \in Z : |f\pi(z)| \leq 3\epsilon/4, r\pi(z) \leq \delta \}</math>
<math display="block">W_1 = \{ z \in Z : f\pi(z) = -3\epsilon/4, r\pi(z) \leq \delta \}</math>
where <math display="inline">\pi</math> is the projection from the tubular neighbourhood to <math display="inline">Z</math>, <math display="inline">r(z)</math> is the square of the distance between <math display="inline">z</math> and the critical point <math display="inline">p</math> and <math display="inline">\rho(z)</math> is the square of the distance between <math display="inline">z</math> and <math display="inline">\pi(z)</math>.<ref>Goresky and MacPherson 1988, pp. 100-101.</ref> <math display="inline">\epsilon \ll \delta</math> are chosen so that <math display="inline">(\delta, \epsilon)</math> is in the set <math display="inline">A^\flat_6</math> which consists of <math display="inline">A_6 \subset \R^+ \times \R^+</math> with the properties that for <math display="inline">(\epsilon, \delta) \in A_6</math> and <math display="inline">z</math> such that <math display="inline">\rho(z) = \delta</math>, <math display="inline">r\pi(z) = \delta</math>, <math display="inline">|f(z)| \leq \epsilon</math> and <math display="inline">|f\pi(z)| \leq \epsilon</math> then the covectors <math display="inline">d\rho(z)</math>, <math display="inline">dr\pi(z)</math>, <math display="inline">df(z)</math> and <math display="inline">df\pi(z)</math> are linearly independent when restricted to <math display="inline">T_zY</math> (where <math display="inline">Y</math> is the stratum containing <math display="inline">z</math>). We can prove such a set exists.<ref>Goresky and MacPherson 1988, pp. 89.</ref> <math display="inline">A^\flat_6</math> is this plus its reflection about the <math display="inline">x</math> axis.<ref>Goresky and MacPherson 1988, pp. 82.</ref>
Let <math display="inline">D = \{ x \in X | r(x) \leq \delta \}</math> for stratum <math display="inline">X</math>. We will show there is a local trivial fibration of the configuration: <math display="inline">(V_1, V_2)</math> fibres over <math display="inline">D</math> and is homeomorphic to <math display="inline">D \times (\text{normal Morse data})</math>
(V_1, V_2) -> D \times (normal Morse data)
| /
--> D <---
and that <math display="inline">(W_1, W_2)</math> fibres over the tangential Morse data and is homeomorphic to <math display="inline">(\text{tangential Morse data}) \times (\text{normal slice})</math>.
For <math display="inline">Z_1 = \{ z \in Z : r\pi(z) \leq \delta \}</math>, the map <math display="inline">F(z): Z_1 \to \R^2 = (\rho(z), f(z) - f\pi(z))</math> is transverse to each stratum of <math display="inline">\text{Box}(\delta, \epsilon/4)</math>, [list], [by lemma 6.5]. <math display="inline">(V_1, V_2) = F^{-1}(\text{Box}(\delta, \epsilon/4), \text{Bottom}(\delta, \epsilon/4))</math>. For each stratum <math display="inline">S</math> of Box and each <math display="inline">x \in D</math>, we have transverse intersection <math display="inline">F^{-1}(S) \pitchfork \pi^{-1}(x)</math>. Therefore, <math display="inline">\pi|F^{-1}(S)</math> is a submersion and by Thom's isotopy lemma the projection <math display="inline">\pi|F^{-1}(\text{Box}(\delta, \epsilon/4): F^{-1}(\text{Box}(\delta, \epsilon/4)) \to X</math> is a stratified fibre bundle over <math display="inline">D</math>. The fibre over the critical point <math display="inline">p</math> is <math display="inline">\pi^{-1}(p) \cap (F^{-1}(\text{Box}(\delta, \epsilon/4), F^{-1}(\text{Bottom}(\delta, \epsilon/4))</math> and is equal to the normal Morse data...<ref>Goresky and MacPherson 1988, pp. 101.</ref>
Take <math display="inline">G: X \to \R^2 = (r(x), f(x))</math>. <math display="inline">\delta</math> and <math display="inline">\epsilon</math> have been chosen so that <math display="inline">(G^{-1}(\text{Box}(\delta, \epsilon/4), G^{-1}(\text{Bottom}(\delta, \epsilon/4))</math> is the tangential Morse data for <math display="inline">f</math> and is contained in the region <math display="inline">D</math> over which <math display="inline">\pi|(V_1, V_2)</math> is a stratified fibre bundle. Therefore, <math display="inline">(W_1, W_2) = \pi^{-1} G^{-1}(\text{Box}(\delta, \epsilon/4), \text{Bottom}(\delta, \epsilon/4))</math> is transverse to <math display="inline">(V_1, V_2)</math>.<ref>Goresky and MacPherson 1988, pp. 101-102.</ref>
Finally, this means that <math display="inline">(V_1, V_2) \cap (W_1, W_2)</math> is homeomorphic (by stratum preserving homeomorphism) to <math display="inline">(\pi^{-1}(p), \cap (V_1, V_2)) \times \pi(W_1, W_2)</math>, the product of normal and tangential Morse data.<ref>Goresky and MacPherson 1988, pp. 102.</ref>
We use a succession of such diagrams to interpolate between the box diagram which defines local Morse data [explain] and the above diagram whose realisation we have just proven is <math display="inline">(\text{normal Morse data}) \times (\text{tangential Morse data})</math>.
[diagram_d0.py]
The realisation is the local Morse data. This is equal to the realisation of the diagram below.<ref>Goresky and MacPherson 1988, pp. 103, 106.</ref>
[diagram_d11.py]
The realisation of the first diagram [d0] is equivalent to the realisation of the below diagram.
[diagram_d1.py]
In the right-hand picture of the above diagram, we have put a dotted outline around the region <math display="inline">A^{\flat}_1</math>. We prove that there are no characteristic covectors for <math display="inline">(r, f): Z \to \R^2</math> in this region and can, therefore, move the wall in this region...<ref>Goresky and MacPherson 1988, pp. 82-83.</ref>
By adding a zero-dimensional stratum at the top right corner of the right-hand picture. A one-parameter family of pictures <math display="inline">P_b(t)</math> gives rise to a stratified space <math display="inline">Y \subset M \times \R</math> such that
<math display="block">Y = \{ (z, t) \in M \times \R : (r, f)(z) \in P_b(t) \}.</math>
<math display="inline">(r, f)</math> takes each stratum of <math display="inline">Z</math> transversally to each stratum of each <math display="inline">Y_t</math>. <math display="inline">(f \circ \pi, f)^{-1}(P_a) = f^{-1}[-\epsilon, \infty)</math> is transverse to each stratum of <math display="inline">Y_t \cap Z</math>. Therefore, there is a homeomorphism between<ref>Goresky and MacPherson 1988, pp. 107.</ref>
<math display="block">Z(D_1) = Z \cap (f \circ \pi, f)^{-1}(P_a) \cap (r, f)^{-1}(P_b(0))</math>
and
<math display="block">Z(D_1) = Z \cap (f \circ \pi, f)^{-1}(P_a) \cap (r, f)^{-1}(P_b(1)).</math>
To go from D_2 to D_3 we find the characteristic covectors of <math display="inline">(f\pi, f): V \to \R^2</math> where <math display="inline">V = (r, f)^{-1}(P_b(1))</math>. We stratify <math display="inline">P_b(1)</math> by its interior <math display="inline">P</math> and boundary <math display="inline">\partial P</math>.<ref>Goresky and MacPherson 1988, pp. 107.</ref>
The strata of <math display="inline">V</math> come in four types:
# <math display="inline">(r, f)^{-1}(P) \cap X</math>
# <math display="inline">(r, f)^{-1}(P) \cap Y</math>
# <math display="inline">(r, f)^{-1}(\partial P) \cap X</math>
# <math display="inline">(r, f)^{-1}(\partial P) \cap Y</math>
where <math display="inline">X</math> is the strata that contains the critical point and <math display="inline">Y</math> is any other strata such that <math display="inline">Y > X</math>.
All characteristic covectors are of the form <math display="inline">\lambda = (u, v, adu + bdv) \in T^*\R^2</math>.
For strata 1 and 3, the image of <math display="inline">X</math> under <math display="inline">(f\pi, f)</math> is the diagonal <math display="inline">f\pi = f</math> (dotted outline). Therefore, the characteristic covectors of any point <math display="inline">z</math> in <math display="inline">X</math> are either where <math display="inline">z = p</math>, in which case the covector is zero(?), or where <math display="inline">z \neq p</math>, in which case <math display="inline">u = v</math> and <math display="inline">a = b</math>.<ref>Goresky and MacPherson 1988, pp. 107-108.</ref>
For strata 2, being that the critical point is isolated and non-degenerate, which means it, and any neighbourhood, is not zero on any limit of tangent spaces in strata <math display="inline">Y > X</math>. Therefore, <math display="inline">f</math> and <math display="inline">f\pi</math> are linearly independent.<ref>Goresky and MacPherson 1988, pp. 84.</ref> Unless <math display="inline">\pi(z) = p</math>, in which case <math display="inline">d(f\pi)(z) = f\pi(z) = 0</math>, so they are covectors where <math display="inline">u = 0</math> and <math display="inline">b = 0</math>.<ref>Goresky and MacPherson 1988, pp. 108.</ref>
For strata 4, we can use implicit function theorem to generate local coordinates <math display="inline">y_1, \cdots y_{r-s-1}</math> in <math display="inline">Y > X</math> and define the Riemannian metric <math display="inline">r(z) = r\pi(z) + (f(z) - f\pi(z))^2 + g(y)</math> for some <math display="inline">g</math> depending only on <math display="inline">y</math>.
There are no characteristic covectors in <math display="inline">|u| \leq \epsilon</math> and <math display="inline">|v| < \epsilon</math>. By [lemma 6.7 and 6.8 and 8.1(d)] <math display="inline">df</math>, <math display="inline">df\pi</math> and <math display="inline">dr</math> are linearly independent in this region.<ref>Goresky and MacPherson 1988, pp. 109.</ref> Given <math display="inline">|f| \leq \epsilon</math> and <math display="inline">|f\pi| \leq \epsilon</math>, a fringed set <math display="inline">A^\flat_4</math> of type <math display="inline">0 < \epsilon \ll \delta</math> and assume that <math display="inline">\pi \neq p</math> and <math display="inline">z \notin X</math> then <math display="inline">(r(z), f(z)) \in A^\flat_4</math> and <math display="inline">(r(z), f\pi(z)) \in A^\flat_4</math>.<ref>Goresky and MacPherson 1988, pp. 87.</ref>
Outside of these points, the slope of <math display="inline">\ker(\lambda)</math> for any characteristic covector <math display="inline">\lambda</math> is
<math display="block">\frac{-a}{b} = \frac{f(z) - f\pi(z) - M}{\frac{\alpha}{\beta} + (f(z) - f\pi(z))}</math>
for <math display="inline">\alpha df + \beta dr = 0</math>.<ref>Goresky and MacPherson 1988, pp. 108-109.</ref>
== Morse theory ==
Steps(?)
* Explain topology
* Every point of a stratum is locally like a product structure (proved by Thom's Isotopy Lemma) [GM pp. 41-42]
** Including those around critical points, which are the product of normal and tangential Morse data (these are our quasi-local cycles?)
* Thom's Isotopy Lemma proves a strong deformation retraction (which only stops at critical points) [PWM pp. 541-542]
=== Homotopy ===
We want to replace our domain of convergence <math display="inline">M</math>, which is the complement of our singular variety <math display="inline">\mathcal{V}</math>, with an "equivalent" space <math display="inline">M'</math> which has better understood properties. We say "equivalent" because there are several different things we could mean by "equivalent" in this context. The equivalence we are referring to in this section is called '''homotopy'''.
Imagine two subspaces <math display="inline">\gamma_0</math> and <math display="inline">\gamma_1</math> of a space <math display="inline">Y</math> which are defined respectively by smooth functions <math display="inline">f, g: X \to Y</math>. If there exists a smooth function <math display="inline">h_s: X \times [0, 1] \to Y</math>, called a homotopy, such that <math display="inline">h_0 = f</math>, <math display="inline">h_1 = g</math> and for any <math display="inline">\epsilon > 0</math> there exists a <math display="inline">\delta_a</math> and <math display="inline">\delta_b</math> such that when <math display="inline">|s - s_0| < \delta_a</math> and <math display="inline">|x - x_0| < \delta_b</math> we have <math display="inline">|h_s(x) - h_{s_0}(x_0)| < \epsilon</math>, then we say <math display="inline">\gamma_0</math> and <math display="inline">\gamma_1</math> are '''homotopic'''.<ref>Henle 1979, pp. 251-252.</ref>
Below is an example where <math display="inline">\gamma_0</math> and <math display="inline">\gamma_1</math> are one-dimensional curves and <math display="inline">H(t, s) = h_s(t)</math>.
[[File:Homotopy_curves.png|300px]]
In [[#Homotopy_equivalence|Appendix A]], we formally prove that we can construct an equivalent space <math display="inline">M'</math>. We provide only an example to give some intuition before describing how to construct the space <math display="inline">M'</math> in terms of local cycles around critical points.
=== Motivating example ===
Imagine a torus and a height function which is just the z value of the point.
[[File:3D-Leveltorus.png|200px]]
It has four critical points: two at the top and bottom of the outer circle (<math display="inline">p_1, p_4</math>) and two at the top and bottom of the inner circle (<math display="inline">p_2, p_3</math>).
[picture]
When the height is between the <math display="inline">p_1</math> and <math display="inline">p_2</math>, the space is a two-cell, which can be retracted to a point.
[picture]
When the height is between <math display="inline">p_2</math> and <math display="inline">p_3</math>, the space is a cylinder, which can be retracted to a two-cell with a one-cell attached.
[[File:3D-Cylinder_and_disk_with_handle.png|200px]]
When the height is between <math display="inline">p_3</math> and <math display="inline">p_4</math>, the space is a torus with a disc removed, which can be retracted to a cylinder with a one-cell attached.
[[File:3D-Cylinder_with_handle_and_torus_with_hole.png|200px]]
When the height is greater than <math display="inline">p_4</math>, then the full torus is constructed by attaching a two-cell.
[Explain in terms of Morse data and Morse index?]
=== Morse data and quasi-local cycles ===
As in the above example, we start at the "bottom" of <math display="inline">M</math> and build upwards until just before we reach our first critical point <math display="inline">p</math>.
;Smooth points
:This is a tube around a <math display="inline">(d-1)</math>-chain <math display="inline">\gamma</math> where the height function <math display="inline">h</math> is maximised at <math display="inline">p</math>.<ref>Pemantle, Wilson and Melczer 2024, pp. 223.</ref>
:For example, if <math display="inline">F(x, y) = \frac{1}{1 - x - y}</math> then <math display="inline">\lambda = 1</math> and <math display="inline">B^\lambda</math> is an arc reaching its highest point at <math display="inline">p</math>.
:The normal plane <math display="inline">N</math> at <math display="inline">p</math> is a plane orthogonal to <math display="inline">B^1</math>(?).
:Its normal link <math display="inline">L(S)</math> is a circle with two points missing where it intersects <math display="inline">\mathcal{V}</math>.
:We make our quasi-local cycle out of the product of the arc and circle joined to <math display="inline">M_-</math> at points below <math display="inline">M_-</math>.
:With the exception of degenerate points, such as monkey saddles...<ref>e.g. Pemantle, Wilson and Melczer 2024, pp. 211.</ref>
;Transverse multiple points
:This is the product of a <math display="inline">k</math>-torus and a <math display="inline">(d-k)</math>-chain <math display="inline">\gamma</math>. The torus is the product of circles about <math display="inline">p</math> in the complex normal space to each strata which intersects <math display="inline">p</math>. The chain <math display="inline">\gamma</math> is supported in the stratum which is the common intersection of the varieties defined by the factors vanishing at <math display="inline">p</math>, and achieves its maximum height at <math display="inline">p</math>.<ref>Pemantle, Wilson and Melczer 2024, pp. 223-224.</ref>
;Arrangement multiple point
:This is the product of a <math display="inline">(d-k)</math>-chain <math display="inline">\gamma</math> and several <math display="inline">k</math>-tori, one for each pair of sheets which intersect transversely, where the torus is the product of circles about <math display="inline">p</math> in each sheet.<ref>Pemantle, Wilson and Melczer 2024, pp. 226.</ref>
;Cone point
:A cone point is zero-dimensional so there is no <math display="inline">\gamma</math>, just a <math display="inline">d</math>-torus about <math display="inline">p</math>.<ref>Pemantle, Wilson and Melczer 2024, pp. 227.</ref>
== Notes ==
{{Reflist}}
== References ==
* {{cite book | last1=Goresky | first1=Mark | last2=MacPherson | first2=Robert | title=Stratified Morse Theory | publisher=Springer-Verlag | year=1988 | url=https://www.math.ias.edu/~goresky/pdf/SMT.djvu }}
* {{cite book | last=Henle | first1=Michael | title=A Combinatorial Introduction to Topology | publisher=Dover Publications Inc. New York | year=1979 }}
* {{citation | last=Mather | first=John | title=Notes on Topological Stability | year=2012 | journal=Bulletin of the American Mathematical Society | volume=49 | number=4 | pages=475-506 | url=https://www.ams.org/journals/bull/2012-49-04/S0273-0979-2012-01383-6/S0273-0979-2012-01383-6.pdf }}.
* {{cite book | last1=Pemantle | first1=Robin | last2=Wilson | first2=Mark C. | last3=Melczer | first3=Stephen | title=Analytic Combinatorics in Several Variables | publisher=Cambridge University Press | year=2024 | edition=2nd | url=https://acsvproject.com/PemantleWilsonMelczer23.pdf }}
0r9ho48z9kbzihauzkpeheph2svdwjr
Cookbook:Akpu
102
483707
4676530
4655335
2026-10-17T14:21:52Z
A Sulaiman Z
3412824
/* Ingredients */
4676530
wikitext
text/x-wiki
{{recipe
|title=Akpu
|image=
|caption=Traditional fermented cassava swallow from southeastern Nigeria
|servings=6
|time=4 days
|difficulty=2
|course=Main course
|cuisine=Igbo cuisine
}}
{{Incomplete recipe|reason=missing appropriate linking, missing templates, missing/incorrect categories, broken links}}
'''Akpu''' is a traditional swallow made from fermented cassava and widely consumed in southeastern Nigeria. It is a staple food among the Igbo people and is commonly served with soups such as onugbu soup, ora soup, oha soup, and egusi soup. The fermentation process gives Akpu its characteristic texture and flavour.
== Ingredients ==
* 5 kg fresh cassava tubers
* [[Cookbook:Water|Water]]
== Procedure ==
# Peel the cassava tubers and wash thoroughly.
# Place the cassava in a container and cover completely with water.
# Allow it to ferment for 3–4 days or until softened.
# Remove any fibres and hard portions from the fermented cassava.
# Mash the cassava and sieve to obtain a smooth paste.
# Suspend the paste in a clean cloth or sack and allow excess water to drain.
# Transfer the fermented cassava paste into a pot.
# Cook over medium heat while stirring continuously until a smooth, stretchy dough forms.
# Shape into portions and serve hot with soup.
== Notes, tips, and variations ==
* The duration of fermentation may vary depending on temperature.
* Akpu is traditionally wrapped in leaves or packaged in nylon before sale.
* Proper fermentation helps reduce the natural cyanide content of cassava.
* Similar cassava-based swallows are consumed in various parts of West and Central Africa.
== See also ==
* [[Garri]]
* [[Cassava]]
* [[Oha soup]]
* [[Onugbu soup]]
* [[Igbo cuisine]]
[[Category:Nigerian cuisine]]
[[Category:African recipes]]
[[Category:Igbo cuisine]]
[[Category:Cassava dishes]]
[[Category:Main course recipes]]
kik4r6p96vicgcu810huv37eg7hv8t8
Cookbook:Efo Riro
102
483732
4676532
4638519
2026-10-17T14:26:09Z
A Sulaiman Z
3412824
/* Equipment */
4676532
wikitext
text/x-wiki
{{Recipe summary
| Cuisine = Efo riro
| Origin = Western Nigeria
| Servings = 6
| Time = 1 hr 40 minutes
| Difficulty = 2
| Image = [[File:Efo Riro - Veggies.jpg|300px]]
}}{{Incomplete recipe|reason=missing recipe header template, missing appropriate linking, missing/incorrect categories, what kind of palm oil is it?}}
'''Efo Riro''' is a popular Yoruba vegetable soup made with leafy vegetables, palm oil, peppers, and assorted meats or fish. It is commonly eaten with swallows such as amala, pounded yam, or eba.
== Equipment ==
* [[Cookbook: Stock Pot|Cooking pot]] (medium or large)
* Wooden spoon or cooking spatula
* Knife
* Cutting board
* Blender or grinding stone (for pepper mix)
* Bowl (for washing vegetables)
* Stove or heat source
== Ingredients ==
* 2 bunches spinach or ugu (pumpkin leaves), chopped
* 500 g assorted meat (beef, goat meat, or chicken)
* 200 g stockfish, soaked
* 200 g dried fish, cleaned
* 1 cup palm oil
* 3–4 fresh red bell peppers (tatashe)
* 2–3 scotch bonnet peppers (ata rodo), to taste
* 1 medium onion
* 2 tablespoons ground crayfish
* 2 seasoning cubes
* Salt, to taste
* Ogiri (optional, for traditional flavor)
== Procedure ==
#Wash and cook the assorted meat with onion, seasoning cubes, and salt until tender.
#Add stockfish and continue cooking until soft.
#Blend the peppers and onion into a smooth or slightly coarse paste.
#Heat palm oil in a pot (do not bleach).
#Add the blended pepper mix and fry for about 10–15 minutes until it reduces and thickens.
#Add the cooked meat, stockfish, dried fish, and meat stock.
#Stir and allow to simmer for 10 minutes.
#Add ground crayfish and ogiri if using.
#Add chopped vegetables and stir gently.
#Allow to cook for 3–5 minutes (do not overcook the vegetables).
#Adjust seasoning with salt or seasoning cubes.
#Remove from heat and serve hot.
== Tips ==
* Do not overcook the vegetables to preserve color and nutrients.
* The pepper base should be well fried for rich flavor.
* Efo Riro is best served with amala, eba, or pounded yam.
[[Category:Yoruba cuisine]] [[Category:Nigerian soups]] [[Category:Vegetable dishes]] [[Category:Palm oil dishes]]
b3r0bpqe3vu9kn5l0oizhc76wby7tv2
4676533
4676532
2026-10-17T14:26:54Z
A Sulaiman Z
3412824
/* Equipment */
4676533
wikitext
text/x-wiki
{{Recipe summary
| Cuisine = Efo riro
| Origin = Western Nigeria
| Servings = 6
| Time = 1 hr 40 minutes
| Difficulty = 2
| Image = [[File:Efo Riro - Veggies.jpg|300px]]
}}{{Incomplete recipe|reason=missing recipe header template, missing appropriate linking, missing/incorrect categories, what kind of palm oil is it?}}
'''Efo Riro''' is a popular Yoruba vegetable soup made with leafy vegetables, palm oil, peppers, and assorted meats or fish. It is commonly eaten with swallows such as amala, pounded yam, or eba.
== Equipment ==
* [[Cookbook: Stock Pot|Cooking pot]] (medium or large)
* [[Cookbook: Wooden Spoon|Wooden spoon]] or cooking spatula
* Knife
* Cutting board
* Blender or grinding stone (for pepper mix)
* Bowl (for washing vegetables)
* Stove or heat source
== Ingredients ==
* 2 bunches spinach or ugu (pumpkin leaves), chopped
* 500 g assorted meat (beef, goat meat, or chicken)
* 200 g stockfish, soaked
* 200 g dried fish, cleaned
* 1 cup palm oil
* 3–4 fresh red bell peppers (tatashe)
* 2–3 scotch bonnet peppers (ata rodo), to taste
* 1 medium onion
* 2 tablespoons ground crayfish
* 2 seasoning cubes
* Salt, to taste
* Ogiri (optional, for traditional flavor)
== Procedure ==
#Wash and cook the assorted meat with onion, seasoning cubes, and salt until tender.
#Add stockfish and continue cooking until soft.
#Blend the peppers and onion into a smooth or slightly coarse paste.
#Heat palm oil in a pot (do not bleach).
#Add the blended pepper mix and fry for about 10–15 minutes until it reduces and thickens.
#Add the cooked meat, stockfish, dried fish, and meat stock.
#Stir and allow to simmer for 10 minutes.
#Add ground crayfish and ogiri if using.
#Add chopped vegetables and stir gently.
#Allow to cook for 3–5 minutes (do not overcook the vegetables).
#Adjust seasoning with salt or seasoning cubes.
#Remove from heat and serve hot.
== Tips ==
* Do not overcook the vegetables to preserve color and nutrients.
* The pepper base should be well fried for rich flavor.
* Efo Riro is best served with amala, eba, or pounded yam.
[[Category:Yoruba cuisine]] [[Category:Nigerian soups]] [[Category:Vegetable dishes]] [[Category:Palm oil dishes]]
e3lzf3gaei1awnuuyaajpw65se6ga1b
4676547
4676533
2026-10-17T15:20:24Z
A Sulaiman Z
3412824
/* Equipment */
4676547
wikitext
text/x-wiki
{{Recipe summary
| Cuisine = Efo riro
| Origin = Western Nigeria
| Servings = 6
| Time = 1 hr 40 minutes
| Difficulty = 2
| Image = [[File:Efo Riro - Veggies.jpg|300px]]
}}{{Incomplete recipe|reason=missing recipe header template, missing appropriate linking, missing/incorrect categories, what kind of palm oil is it?}}
'''Efo Riro''' is a popular Yoruba vegetable soup made with leafy vegetables, palm oil, peppers, and assorted meats or fish. It is commonly eaten with swallows such as amala, pounded yam, or eba.
== Equipment ==
* [[Cookbook: Stock Pot|Cooking pot]] (medium or large)
* [[Cookbook: Wooden Spoon|Wooden spoon]] or cooking spatula
* [[Cookbook: Knife|Knife]]
* Cutting board
* Blender or grinding stone (for pepper mix)
* Bowl (for washing vegetables)
* Stove or heat source
== Ingredients ==
* 2 bunches spinach or ugu (pumpkin leaves), chopped
* 500 g assorted meat (beef, goat meat, or chicken)
* 200 g stockfish, soaked
* 200 g dried fish, cleaned
* 1 cup palm oil
* 3–4 fresh red bell peppers (tatashe)
* 2–3 scotch bonnet peppers (ata rodo), to taste
* 1 medium onion
* 2 tablespoons ground crayfish
* 2 seasoning cubes
* Salt, to taste
* Ogiri (optional, for traditional flavor)
== Procedure ==
#Wash and cook the assorted meat with onion, seasoning cubes, and salt until tender.
#Add stockfish and continue cooking until soft.
#Blend the peppers and onion into a smooth or slightly coarse paste.
#Heat palm oil in a pot (do not bleach).
#Add the blended pepper mix and fry for about 10–15 minutes until it reduces and thickens.
#Add the cooked meat, stockfish, dried fish, and meat stock.
#Stir and allow to simmer for 10 minutes.
#Add ground crayfish and ogiri if using.
#Add chopped vegetables and stir gently.
#Allow to cook for 3–5 minutes (do not overcook the vegetables).
#Adjust seasoning with salt or seasoning cubes.
#Remove from heat and serve hot.
== Tips ==
* Do not overcook the vegetables to preserve color and nutrients.
* The pepper base should be well fried for rich flavor.
* Efo Riro is best served with amala, eba, or pounded yam.
[[Category:Yoruba cuisine]] [[Category:Nigerian soups]] [[Category:Vegetable dishes]] [[Category:Palm oil dishes]]
mav3p0qfg336ryjuip1o8ijs4bv6mow
4676549
4676547
2026-10-17T15:22:19Z
A Sulaiman Z
3412824
/* Equipment */
4676549
wikitext
text/x-wiki
{{Recipe summary
| Cuisine = Efo riro
| Origin = Western Nigeria
| Servings = 6
| Time = 1 hr 40 minutes
| Difficulty = 2
| Image = [[File:Efo Riro - Veggies.jpg|300px]]
}}{{Incomplete recipe|reason=missing recipe header template, missing appropriate linking, missing/incorrect categories, what kind of palm oil is it?}}
'''Efo Riro''' is a popular Yoruba vegetable soup made with leafy vegetables, palm oil, peppers, and assorted meats or fish. It is commonly eaten with swallows such as amala, pounded yam, or eba.
== Equipment ==
* [[Cookbook: Stock Pot|Cooking pot]] (medium or large)
* [[Cookbook: Wooden Spoon|Wooden spoon]] or cooking spatula
* [[Cookbook: Knife|Knife]]
* [[Cookbook: Cutting Board|Cutting board]]
* Blender or grinding stone (for pepper mix)
* Bowl (for washing vegetables)
* Stove or heat source
== Ingredients ==
* 2 bunches spinach or ugu (pumpkin leaves), chopped
* 500 g assorted meat (beef, goat meat, or chicken)
* 200 g stockfish, soaked
* 200 g dried fish, cleaned
* 1 cup palm oil
* 3–4 fresh red bell peppers (tatashe)
* 2–3 scotch bonnet peppers (ata rodo), to taste
* 1 medium onion
* 2 tablespoons ground crayfish
* 2 seasoning cubes
* Salt, to taste
* Ogiri (optional, for traditional flavor)
== Procedure ==
#Wash and cook the assorted meat with onion, seasoning cubes, and salt until tender.
#Add stockfish and continue cooking until soft.
#Blend the peppers and onion into a smooth or slightly coarse paste.
#Heat palm oil in a pot (do not bleach).
#Add the blended pepper mix and fry for about 10–15 minutes until it reduces and thickens.
#Add the cooked meat, stockfish, dried fish, and meat stock.
#Stir and allow to simmer for 10 minutes.
#Add ground crayfish and ogiri if using.
#Add chopped vegetables and stir gently.
#Allow to cook for 3–5 minutes (do not overcook the vegetables).
#Adjust seasoning with salt or seasoning cubes.
#Remove from heat and serve hot.
== Tips ==
* Do not overcook the vegetables to preserve color and nutrients.
* The pepper base should be well fried for rich flavor.
* Efo Riro is best served with amala, eba, or pounded yam.
[[Category:Yoruba cuisine]] [[Category:Nigerian soups]] [[Category:Vegetable dishes]] [[Category:Palm oil dishes]]
8lv9zc4253t1ok95r0ci4zn4fw3keu0
4676550
4676549
2026-10-17T15:23:07Z
A Sulaiman Z
3412824
/* Equipment */
4676550
wikitext
text/x-wiki
{{Recipe summary
| Cuisine = Efo riro
| Origin = Western Nigeria
| Servings = 6
| Time = 1 hr 40 minutes
| Difficulty = 2
| Image = [[File:Efo Riro - Veggies.jpg|300px]]
}}{{Incomplete recipe|reason=missing recipe header template, missing appropriate linking, missing/incorrect categories, what kind of palm oil is it?}}
'''Efo Riro''' is a popular Yoruba vegetable soup made with leafy vegetables, palm oil, peppers, and assorted meats or fish. It is commonly eaten with swallows such as amala, pounded yam, or eba.
== Equipment ==
* [[Cookbook: Stock Pot|Cooking pot]] (medium or large)
* [[Cookbook: Wooden Spoon|Wooden spoon]] or cooking spatula
* [[Cookbook: Knife|Knife]]
* [[Cookbook: Cutting Board|Cutting board]]
* [[Cookbook: Blender|Blender]] or grinding stone (for pepper mix)
* Bowl (for washing vegetables)
* Stove or heat source
== Ingredients ==
* 2 bunches spinach or ugu (pumpkin leaves), chopped
* 500 g assorted meat (beef, goat meat, or chicken)
* 200 g stockfish, soaked
* 200 g dried fish, cleaned
* 1 cup palm oil
* 3–4 fresh red bell peppers (tatashe)
* 2–3 scotch bonnet peppers (ata rodo), to taste
* 1 medium onion
* 2 tablespoons ground crayfish
* 2 seasoning cubes
* Salt, to taste
* Ogiri (optional, for traditional flavor)
== Procedure ==
#Wash and cook the assorted meat with onion, seasoning cubes, and salt until tender.
#Add stockfish and continue cooking until soft.
#Blend the peppers and onion into a smooth or slightly coarse paste.
#Heat palm oil in a pot (do not bleach).
#Add the blended pepper mix and fry for about 10–15 minutes until it reduces and thickens.
#Add the cooked meat, stockfish, dried fish, and meat stock.
#Stir and allow to simmer for 10 minutes.
#Add ground crayfish and ogiri if using.
#Add chopped vegetables and stir gently.
#Allow to cook for 3–5 minutes (do not overcook the vegetables).
#Adjust seasoning with salt or seasoning cubes.
#Remove from heat and serve hot.
== Tips ==
* Do not overcook the vegetables to preserve color and nutrients.
* The pepper base should be well fried for rich flavor.
* Efo Riro is best served with amala, eba, or pounded yam.
[[Category:Yoruba cuisine]] [[Category:Nigerian soups]] [[Category:Vegetable dishes]] [[Category:Palm oil dishes]]
ra2sn6ex84ui7lpu1kf1wukooeeboxd
4676551
4676550
2026-10-17T15:26:13Z
A Sulaiman Z
3412824
/* Equipment */
4676551
wikitext
text/x-wiki
{{Recipe summary
| Cuisine = Efo riro
| Origin = Western Nigeria
| Servings = 6
| Time = 1 hr 40 minutes
| Difficulty = 2
| Image = [[File:Efo Riro - Veggies.jpg|300px]]
}}{{Incomplete recipe|reason=missing recipe header template, missing appropriate linking, missing/incorrect categories, what kind of palm oil is it?}}
'''Efo Riro''' is a popular Yoruba vegetable soup made with leafy vegetables, palm oil, peppers, and assorted meats or fish. It is commonly eaten with swallows such as amala, pounded yam, or eba.
== Equipment ==
* [[Cookbook: Stock Pot|Cooking pot]] (medium or large)
* [[Cookbook: Wooden Spoon|Wooden spoon]] or cooking spatula
* [[Cookbook: Knife|Knife]]
* [[Cookbook: Cutting Board|Cutting board]]
* [[Cookbook: Blender|Blender]] or grinding stone (for pepper mix)
* [[Cookbook: Mixing Bowl|Bowl]] (for washing vegetables)
* Stove or heat source
== Ingredients ==
* 2 bunches spinach or ugu (pumpkin leaves), chopped
* 500 g assorted meat (beef, goat meat, or chicken)
* 200 g stockfish, soaked
* 200 g dried fish, cleaned
* 1 cup palm oil
* 3–4 fresh red bell peppers (tatashe)
* 2–3 scotch bonnet peppers (ata rodo), to taste
* 1 medium onion
* 2 tablespoons ground crayfish
* 2 seasoning cubes
* Salt, to taste
* Ogiri (optional, for traditional flavor)
== Procedure ==
#Wash and cook the assorted meat with onion, seasoning cubes, and salt until tender.
#Add stockfish and continue cooking until soft.
#Blend the peppers and onion into a smooth or slightly coarse paste.
#Heat palm oil in a pot (do not bleach).
#Add the blended pepper mix and fry for about 10–15 minutes until it reduces and thickens.
#Add the cooked meat, stockfish, dried fish, and meat stock.
#Stir and allow to simmer for 10 minutes.
#Add ground crayfish and ogiri if using.
#Add chopped vegetables and stir gently.
#Allow to cook for 3–5 minutes (do not overcook the vegetables).
#Adjust seasoning with salt or seasoning cubes.
#Remove from heat and serve hot.
== Tips ==
* Do not overcook the vegetables to preserve color and nutrients.
* The pepper base should be well fried for rich flavor.
* Efo Riro is best served with amala, eba, or pounded yam.
[[Category:Yoruba cuisine]] [[Category:Nigerian soups]] [[Category:Vegetable dishes]] [[Category:Palm oil dishes]]
d63x47x3ji6hcgyn0ctan6m2ygr7jkh
4676554
4676551
2026-10-17T15:30:35Z
A Sulaiman Z
3412824
/* Ingredients */
4676554
wikitext
text/x-wiki
{{Recipe summary
| Cuisine = Efo riro
| Origin = Western Nigeria
| Servings = 6
| Time = 1 hr 40 minutes
| Difficulty = 2
| Image = [[File:Efo Riro - Veggies.jpg|300px]]
}}{{Incomplete recipe|reason=missing recipe header template, missing appropriate linking, missing/incorrect categories, what kind of palm oil is it?}}
'''Efo Riro''' is a popular Yoruba vegetable soup made with leafy vegetables, palm oil, peppers, and assorted meats or fish. It is commonly eaten with swallows such as amala, pounded yam, or eba.
== Equipment ==
* [[Cookbook: Stock Pot|Cooking pot]] (medium or large)
* [[Cookbook: Wooden Spoon|Wooden spoon]] or cooking spatula
* [[Cookbook: Knife|Knife]]
* [[Cookbook: Cutting Board|Cutting board]]
* [[Cookbook: Blender|Blender]] or grinding stone (for pepper mix)
* [[Cookbook: Mixing Bowl|Bowl]] (for washing vegetables)
* Stove or heat source
== Ingredients ==
* 2 bunches spinach or ugu (pumpkin leaves), chopped
* 500 g assorted meat (beef, goat meat, or chicken)
* 200 g stockfish, soaked
* 200 g dried fish, cleaned
* 1 cup palm oil
* 3–4 fresh red bell peppers (tatashe)
* 2–3 scotch bonnet peppers (ata rodo), to taste
* 1 medium onion
* 2 tablespoons ground crayfish
* 2 seasoning cubes
* [[Cookbook:Salt|Salt]], to taste
* Ogiri (optional, for traditional flavor)
== Procedure ==
#Wash and cook the assorted meat with onion, seasoning cubes, and salt until tender.
#Add stockfish and continue cooking until soft.
#Blend the peppers and onion into a smooth or slightly coarse paste.
#Heat palm oil in a pot (do not bleach).
#Add the blended pepper mix and fry for about 10–15 minutes until it reduces and thickens.
#Add the cooked meat, stockfish, dried fish, and meat stock.
#Stir and allow to simmer for 10 minutes.
#Add ground crayfish and ogiri if using.
#Add chopped vegetables and stir gently.
#Allow to cook for 3–5 minutes (do not overcook the vegetables).
#Adjust seasoning with salt or seasoning cubes.
#Remove from heat and serve hot.
== Tips ==
* Do not overcook the vegetables to preserve color and nutrients.
* The pepper base should be well fried for rich flavor.
* Efo Riro is best served with amala, eba, or pounded yam.
[[Category:Yoruba cuisine]] [[Category:Nigerian soups]] [[Category:Vegetable dishes]] [[Category:Palm oil dishes]]
f8mdsl20e5bzbswhlmt2kcqbphut703
4676555
4676554
2026-10-17T15:31:14Z
A Sulaiman Z
3412824
/* Ingredients */
4676555
wikitext
text/x-wiki
{{Recipe summary
| Cuisine = Efo riro
| Origin = Western Nigeria
| Servings = 6
| Time = 1 hr 40 minutes
| Difficulty = 2
| Image = [[File:Efo Riro - Veggies.jpg|300px]]
}}{{Incomplete recipe|reason=missing recipe header template, missing appropriate linking, missing/incorrect categories, what kind of palm oil is it?}}
'''Efo Riro''' is a popular Yoruba vegetable soup made with leafy vegetables, palm oil, peppers, and assorted meats or fish. It is commonly eaten with swallows such as amala, pounded yam, or eba.
== Equipment ==
* [[Cookbook: Stock Pot|Cooking pot]] (medium or large)
* [[Cookbook: Wooden Spoon|Wooden spoon]] or cooking spatula
* [[Cookbook: Knife|Knife]]
* [[Cookbook: Cutting Board|Cutting board]]
* [[Cookbook: Blender|Blender]] or grinding stone (for pepper mix)
* [[Cookbook: Mixing Bowl|Bowl]] (for washing vegetables)
* Stove or heat source
== Ingredients ==
* 2 bunches spinach or ugu (pumpkin leaves), chopped
* 500 g assorted meat (beef, goat meat, or chicken)
* 200 g stockfish, soaked
* 200 g dried fish, cleaned
* 1 cup palm oil
* 3–4 fresh red bell peppers (tatashe)
* 2–3 scotch bonnet peppers (ata rodo), to taste
* 1 medium [[Cookbook: Onion|onion]]
* 2 tablespoons ground crayfish
* 2 seasoning cubes
* [[Cookbook:Salt|Salt]], to taste
* Ogiri (optional, for traditional flavor)
== Procedure ==
#Wash and cook the assorted meat with onion, seasoning cubes, and salt until tender.
#Add stockfish and continue cooking until soft.
#Blend the peppers and onion into a smooth or slightly coarse paste.
#Heat palm oil in a pot (do not bleach).
#Add the blended pepper mix and fry for about 10–15 minutes until it reduces and thickens.
#Add the cooked meat, stockfish, dried fish, and meat stock.
#Stir and allow to simmer for 10 minutes.
#Add ground crayfish and ogiri if using.
#Add chopped vegetables and stir gently.
#Allow to cook for 3–5 minutes (do not overcook the vegetables).
#Adjust seasoning with salt or seasoning cubes.
#Remove from heat and serve hot.
== Tips ==
* Do not overcook the vegetables to preserve color and nutrients.
* The pepper base should be well fried for rich flavor.
* Efo Riro is best served with amala, eba, or pounded yam.
[[Category:Yoruba cuisine]] [[Category:Nigerian soups]] [[Category:Vegetable dishes]] [[Category:Palm oil dishes]]
nn46qs54g2gfwqgh5t14bqdivzhznrk
4676556
4676555
2026-10-17T15:31:57Z
A Sulaiman Z
3412824
/* Ingredients */
4676556
wikitext
text/x-wiki
{{Recipe summary
| Cuisine = Efo riro
| Origin = Western Nigeria
| Servings = 6
| Time = 1 hr 40 minutes
| Difficulty = 2
| Image = [[File:Efo Riro - Veggies.jpg|300px]]
}}{{Incomplete recipe|reason=missing recipe header template, missing appropriate linking, missing/incorrect categories, what kind of palm oil is it?}}
'''Efo Riro''' is a popular Yoruba vegetable soup made with leafy vegetables, palm oil, peppers, and assorted meats or fish. It is commonly eaten with swallows such as amala, pounded yam, or eba.
== Equipment ==
* [[Cookbook: Stock Pot|Cooking pot]] (medium or large)
* [[Cookbook: Wooden Spoon|Wooden spoon]] or cooking spatula
* [[Cookbook: Knife|Knife]]
* [[Cookbook: Cutting Board|Cutting board]]
* [[Cookbook: Blender|Blender]] or grinding stone (for pepper mix)
* [[Cookbook: Mixing Bowl|Bowl]] (for washing vegetables)
* Stove or heat source
== Ingredients ==
* 2 bunches spinach or ugu (pumpkin leaves), chopped
* 500 g assorted meat (beef, goat meat, or chicken)
* 200 g stockfish, soaked
* 200 g dried fish, cleaned
* 1 cup [[Cookbook: Palm Oil|palm oil]]
* 3–4 fresh red bell peppers (tatashe)
* 2–3 scotch bonnet peppers (ata rodo), to taste
* 1 medium [[Cookbook: Onion|onion]]
* 2 tablespoons ground crayfish
* 2 seasoning cubes
* [[Cookbook:Salt|Salt]], to taste
* Ogiri (optional, for traditional flavor)
== Procedure ==
#Wash and cook the assorted meat with onion, seasoning cubes, and salt until tender.
#Add stockfish and continue cooking until soft.
#Blend the peppers and onion into a smooth or slightly coarse paste.
#Heat palm oil in a pot (do not bleach).
#Add the blended pepper mix and fry for about 10–15 minutes until it reduces and thickens.
#Add the cooked meat, stockfish, dried fish, and meat stock.
#Stir and allow to simmer for 10 minutes.
#Add ground crayfish and ogiri if using.
#Add chopped vegetables and stir gently.
#Allow to cook for 3–5 minutes (do not overcook the vegetables).
#Adjust seasoning with salt or seasoning cubes.
#Remove from heat and serve hot.
== Tips ==
* Do not overcook the vegetables to preserve color and nutrients.
* The pepper base should be well fried for rich flavor.
* Efo Riro is best served with amala, eba, or pounded yam.
[[Category:Yoruba cuisine]] [[Category:Nigerian soups]] [[Category:Vegetable dishes]] [[Category:Palm oil dishes]]
jpejalzjfzb9jivoflr38h2gcxviwvq
Chess Opening Theory/1. e4/1...e5/2. Nf3/2...Nc6/3. Nc3/3...Nf6/4. Nxe5/4...Nxe4
0
484104
4676504
4676495
2026-10-17T12:02:08Z
Ltypestar2
3524220
Consistent bolding
4676504
wikitext
text/x-wiki
== 4...Nxe4?! ==
{{Chess Opening Theory/Position|name=Mirrored Halloween (informal)|eco=[[Chess/ECOC|C47]]|parent=[[../|Halloween Gambit]]}}
Black unusually declines the gambit and tries to mirror the [[Chess/Halloween Attack|'''Halloween Attack''']]'s sacrifice ('''4. Nxe5''') to counter the Halloween Attack. Although this recovers the pawn, it ignores the hanging knight and gives White back a drawish position, with higher winning chances for White. Worse, it unnecessarily keeps the position symmetrical, which means White still has a first move advantage.
This line has no established name, but it is informally called "'''Mirrored Halloween'''" here, because this is Black's mirroring response to the Halloween Attack's main move ('''4. Nxe5''').
There are usually 2 main moves White will most commonly try: '''5. Nxc6''', taking the black c6 knight and ignoring the hanging black e4 knight, and '''5. Nxe4''', taking the hanging black e4 knight, ignoring the hanging white knight on e5.
=== 5. Nxc6 ===
White takes the knight on c6, attacking the queen. Because Black has a hanging knight on e4, his only move is to counterattack by playing '''5...Nxc3!''' (Because if he takes the white knight with '''5...bxc6??''' or '''5...dxc6??''', White can simply win a knight after '''6. Nxe4!.''' If Black plays '''5...Qe7??''', White can take the black queen, every other queen move loses a knight (The white knight on c6 can retreat back, making Black lose a knight). Every other move loses a queen due to ignoring the hanging queen. For example, '''5...Nxf2??''' is refuted by '''6. Qe2+!''', a check that sidesteps the attack entirely, and Black cannot stop '''7. Nxd8''', or '''7. Nxd7'''.), counterattacking the white queen. If White wishes to deal with this, either '''6. dxc3''', removing Black’s attacking knight on c3, after which Black removes White’s attacking knight on c6 by playing either '''6...dxc6''', or '''6...bxc6'''; or '''6. Nxd8,''' trading queens; will be good options according to Stockfish. If White plays '''6. Nxd8''', Black will respond with '''6...Nxd1''', recovering material.
{{Chess/board
| moves = 1. e4 e5 2. Nf3 Nc6 3. Nc3 Nf6 4. Nxe5 Nxe4 5. Nxc6 Nxc3 6. Nxd8 Nxd1
| caption = Position after Black's move of '''6...Nxd1'''.
}}
=== 5. Nxe4 ===
White takes the knight on e4. Black will likely follow up with '''5...Nxe5''', recovering material. '''6. d4''' is a good center attacking move for White that also gains tempo by kicking the black knight. The position is very drawish, with White being slightly better by having a better center.
{{Chess/board
| moves = 1. e4 e5 2. Nf3 Nc6 3. Nc3 Nf6 4. Nxe5 Nxe4 5. Nxe4 Nxe5 6. d4
| caption = Position after White's move of '''6. d4'''.
}}
=== 5. Qh5 ===
This is an uncommon move and also White's most aggressive option, directly threatening '''6. Qxf7#''', forcing Black into defense of their f7-square. Black can make a lot of mistakes from here.
==== 5...Nxe5?? ====
Black plays the common blunder '''5...Nxe5??''', hoping to remove an attacker of the f7-square and trade pieces, White can take the knight with check ('''6. Qxe5+!'''), forcing the black king to cover, and now there is no way to save the e4 knight, there are simply too many attackers. If Black plays '''6...Qe7''' (Black's best try, since the queen x-ray defends the knight and counterattacks the queen), then White can play '''7. Qxe7+!''', then take the black knight on e4.
==== 5...g6? ====
If Black instead plays the also common mistake '''5...g6?''', mimicking the [[Chess Opening Theory/1. e4/1...e5/2. Qh5/2...Nc6/3. Bc4/3...g6|'''Wayward Queen Attack'''<nowiki/>'s most common defence]], Black loses a pawn after this sequence: '''6. Nxc6!''' (counterattacking the black queen) '''gxh5 7. Nxd8 Nxc3 8. Nxf7''' (White desperado sacrifices the white knight for a pawn, knowing the knight is doomed anyway, and Black cannot sacrifice his knight for any compensation, and if Black retreats, White can just escape with the free pawn.) '''Kxf7 9. dxc3'''.
==== 5...Nd6 ====
This is Black's fairly rare but best try, retreating the black knight to defend f7. But White can lunge forward with '''6. Nd5''', playing aggressively. White has very good winning chances here in this position. Black has to play precisely to survive in this position.
{{Chess/board
| moves = 1. e4 e5 2. Nf3 Nc6 3. Nc3 Nf6 4. Nxe5 Nxe4 5. Qh5 Nd6 6. Nd5
| caption = Position after White's move of '''6. Nd5'''.
}}
==== 5...Qf6?! ====
This is a better move than the blunders described on this page, but it is a small inaccuracy, since it allows White to win a pawn, make Black lose castling rights, and gain development. The best move for White is '''6. Qxf7+''', starting the trade that will win them a pawn and make Black lose castling rights. Then Black will regain material with '''6...Qxf7''', then White will regain material with '''7. Nxf7'''. The black king will then take on f7 with '''7...Kxf7''', losing castling rights. Now it seems like Black is ahead on material here, but the e4 knight is hanging, so White can win back the material and, in the end, they will have won a pawn. The best move for white now is not to take the black knight on e4 immediately but play an intermediate move (zwischenzug) by playing '''8. Bc4+''', forcing the king to move or block with the only legal block '''8...d5??''', There is no legal move that defends the knight and deals with the check at the same time except '''8...d5??''' which seems like it defends the black knight and blocks the check, but this blunders a pawn via '''9. Bxd5+''' and fails to defend the knight anyway since the pawn is the only defender of the knight. Black now must move the king, two good moves are the natural '''8... Ke8''', or the unnatural but best move by the engine (Stockfish 19 NNUE) '''8...Ke7'''. Then, White takes the knight with '''9. Nxe4,''' ending this tactical sequence with a bishop developed, a knight centralized, and a pawn gained.
{{Chess/board
| moves = 1. e4 e5 2. Nf3 Nc6 3. Nc3 Nf6 4. Nxe5 Nxe4 5. Qh5 Qf6 6. Qxf7+ Qxf7 7. Nxf7 Kxf7 8. Bc4+ Ke7 9. Nxe4
| caption = Position after White's move of '''9. Nxe4''' if Black played '''8...Ke7'''.
}}
== Theory table ==
{{ChessTable}}
{{Chess/theory table
|preceding=1. e4 e5 2. Nf3 Nc6 3. Nc3 Nf6 4. Nxe5 Nxe4
|line1=5. Nxc6 Nxc3 6. dxc3 dxc6
|eval1= =
|line2=5. Nxc6 Nxc3 6. Nxd8 Nxd1
|eval2= =
|line3=5. Nxe4 Nxe5 6. d4
|eval3= +/=
|line4=5. Qh5 Nxe5?? 6. Qxe5+ Qe7 7. Qxe7+
|eval4= +-
|line5=5. Qh5 g6? 6. Nxc6! gxh5 7. Nxd8 Nxc3 8. Nxf7 Kxf7 9. dxc3
|eval5= +/-
|line6=5. Qh5 Nd6 6. Nd5
|eval6= +/-
|line7=5.Qh5 Qf6?! 6. Qxf7+ Qxf7 7. Nxf7 Kxf7 8. Bc4+ Ke7 9. Nxe4|line8=5.Qh5 Qf6?! 6. Qxf7+ Qxf7 7. Nxf7 Kxf7 8. Bc4+ d5?? 9. Bxd5+|eval7=+/=|eval8=+-}}
{{ChessMid}}
bwdcx6fjzson33ibpkxiero5kaonn4c
4676509
4676504
2026-10-17T12:23:23Z
Ltypestar2
3524220
minor edit fixing the chess error
4676509
wikitext
text/x-wiki
== 4...Nxe4?! ==
{{Chess Opening Theory/Position|name=Mirrored Halloween (informal)|eco=[[Chess/ECOC|C47]]|parent=[[../|Halloween Gambit]]}}
Black unusually declines the gambit and tries to mirror the [[Chess/Halloween Attack|'''Halloween Attack''']]'s sacrifice ('''4. Nxe5''') to counter the Halloween Attack. Although this recovers the pawn, it ignores the hanging knight and gives White back a drawish position, with higher winning chances for White. Worse, it unnecessarily keeps the position symmetrical, which means White still has a first move advantage.
This line has no established name, but it is informally called "'''Mirrored Halloween'''" here, because this is Black's mirroring response to the Halloween Attack's main move ('''4. Nxe5''').
There are usually 2 main moves White will most commonly try: '''5. Nxc6''', taking the black c6 knight and ignoring the hanging black e4 knight, and '''5. Nxe4''', taking the hanging black e4 knight, ignoring the hanging white knight on e5.
=== 5. Nxc6 ===
White takes the knight on c6, attacking the queen. Because Black has a hanging knight on e4, his only move is to counterattack by playing '''5...Nxc3!''' (Because if he takes the white knight with '''5...bxc6??''' or '''5...dxc6??''', White can simply win a knight after '''6. Nxe4!.''' If Black plays '''5...Qe7??''', White can take the black queen, every other queen move loses a knight (The white knight on c6 can retreat back, making Black lose a knight). Every other move loses a queen due to ignoring the hanging queen. For example, '''5...Nxf2??''' is refuted by '''6. Qe2+!''', a check that sidesteps the attack entirely, and Black cannot stop '''7. Nxd8''', or '''7. Nxe7'''.), counterattacking the white queen. If White wishes to deal with this, either '''6. dxc3''', removing Black’s attacking knight on c3, after which Black removes White’s attacking knight on c6 by playing either '''6...dxc6''', or '''6...bxc6'''; or '''6. Nxd8,''' trading queens; will be good options according to Stockfish. If White plays '''6. Nxd8''', Black will respond with '''6...Nxd1''', recovering material.
{{Chess/board
| moves = 1. e4 e5 2. Nf3 Nc6 3. Nc3 Nf6 4. Nxe5 Nxe4 5. Nxc6 Nxc3 6. Nxd8 Nxd1
| caption = Position after Black's move of '''6...Nxd1'''.
}}
=== 5. Nxe4 ===
White takes the knight on e4. Black will likely follow up with '''5...Nxe5''', recovering material. '''6. d4''' is a good center attacking move for White that also gains tempo by kicking the black knight. The position is very drawish, with White being slightly better by having a better center.
{{Chess/board
| moves = 1. e4 e5 2. Nf3 Nc6 3. Nc3 Nf6 4. Nxe5 Nxe4 5. Nxe4 Nxe5 6. d4
| caption = Position after White's move of '''6. d4'''.
}}
=== 5. Qh5 ===
This is an uncommon move and also White's most aggressive option, directly threatening '''6. Qxf7#''', forcing Black into defense of their f7-square. Black can make a lot of mistakes from here.
==== 5...Nxe5?? ====
Black plays the common blunder '''5...Nxe5??''', hoping to remove an attacker of the f7-square and trade pieces, White can take the knight with check ('''6. Qxe5+!'''), forcing the black king to cover, and now there is no way to save the e4 knight, there are simply too many attackers. If Black plays '''6...Qe7''' (Black's best try, since the queen x-ray defends the knight and counterattacks the queen), then White can play '''7. Qxe7+!''', then take the black knight on e4.
==== 5...g6? ====
If Black instead plays the also common mistake '''5...g6?''', mimicking the [[Chess Opening Theory/1. e4/1...e5/2. Qh5/2...Nc6/3. Bc4/3...g6|'''Wayward Queen Attack'''<nowiki/>'s most common defence]], Black loses a pawn after this sequence: '''6. Nxc6!''' (counterattacking the black queen) '''gxh5 7. Nxd8 Nxc3 8. Nxf7''' (White desperado sacrifices the white knight for a pawn, knowing the knight is doomed anyway, and Black cannot sacrifice his knight for any compensation, and if Black retreats, White can just escape with the free pawn.) '''Kxf7 9. dxc3'''.
==== 5...Nd6 ====
This is Black's fairly rare but best try, retreating the black knight to defend f7. But White can lunge forward with '''6. Nd5''', playing aggressively. White has very good winning chances here in this position. Black has to play precisely to survive in this position.
{{Chess/board
| moves = 1. e4 e5 2. Nf3 Nc6 3. Nc3 Nf6 4. Nxe5 Nxe4 5. Qh5 Nd6 6. Nd5
| caption = Position after White's move of '''6. Nd5'''.
}}
==== 5...Qf6?! ====
This is a better move than the blunders described on this page, but it is a small inaccuracy, since it allows White to win a pawn, make Black lose castling rights, and gain development. The best move for White is '''6. Qxf7+''', starting the trade that will win them a pawn and make Black lose castling rights. Then Black will regain material with '''6...Qxf7''', then White will regain material with '''7. Nxf7'''. The black king will then take on f7 with '''7...Kxf7''', losing castling rights. Now it seems like Black is ahead on material here, but the e4 knight is hanging, so White can win back the material and, in the end, they will have won a pawn. The best move for white now is not to take the black knight on e4 immediately but play an intermediate move (zwischenzug) by playing '''8. Bc4+''', forcing the king to move or block with the only legal block '''8...d5??''', There is no legal move that defends the knight and deals with the check at the same time except '''8...d5??''' which seems like it defends the black knight and blocks the check, but this blunders a pawn via '''9. Bxd5+''' and fails to defend the knight anyway since the pawn is the only defender of the knight. Black now must move the king, two good moves are the natural '''8... Ke8''', or the unnatural but best move by the engine (Stockfish 19 NNUE) '''8...Ke7'''. Then, White takes the knight with '''9. Nxe4,''' ending this tactical sequence with a bishop developed, a knight centralized, and a pawn gained.
{{Chess/board
| moves = 1. e4 e5 2. Nf3 Nc6 3. Nc3 Nf6 4. Nxe5 Nxe4 5. Qh5 Qf6 6. Qxf7+ Qxf7 7. Nxf7 Kxf7 8. Bc4+ Ke7 9. Nxe4
| caption = Position after White's move of '''9. Nxe4''' if Black played '''8...Ke7'''.
}}
== Theory table ==
{{ChessTable}}
{{Chess/theory table
|preceding=1. e4 e5 2. Nf3 Nc6 3. Nc3 Nf6 4. Nxe5 Nxe4
|line1=5. Nxc6 Nxc3 6. dxc3 dxc6
|eval1= =
|line2=5. Nxc6 Nxc3 6. Nxd8 Nxd1
|eval2= =
|line3=5. Nxe4 Nxe5 6. d4
|eval3= +/=
|line4=5. Qh5 Nxe5?? 6. Qxe5+ Qe7 7. Qxe7+
|eval4= +-
|line5=5. Qh5 g6? 6. Nxc6! gxh5 7. Nxd8 Nxc3 8. Nxf7 Kxf7 9. dxc3
|eval5= +/-
|line6=5. Qh5 Nd6 6. Nd5
|eval6= +/-
|line7=5.Qh5 Qf6?! 6. Qxf7+ Qxf7 7. Nxf7 Kxf7 8. Bc4+ Ke7 9. Nxe4|line8=5.Qh5 Qf6?! 6. Qxf7+ Qxf7 7. Nxf7 Kxf7 8. Bc4+ d5?? 9. Bxd5+|eval7=+/=|eval8=+-}}
{{ChessMid}}
3z6qagt7gip2dxdcqq6rx7p8561z768
4676510
4676509
2026-10-17T12:40:02Z
Ltypestar2
3524220
Added History
4676510
wikitext
text/x-wiki
== 4...Nxe4?! ==
{{Chess Opening Theory/Position|name=Mirrored Halloween (informal)|eco=[[Chess/ECOC|C47]]|parent=[[../|Halloween Gambit]]}}
Black unusually declines the gambit and tries to mirror the [[Chess/Halloween Attack|'''Halloween Attack''']]'s sacrifice ('''4. Nxe5''') to counter the Halloween Attack. Although this recovers the pawn, it ignores the hanging knight and gives White back a drawish position, with higher winning chances for White. Worse, it unnecessarily keeps the position symmetrical, which means White still has a first move advantage.
This line has no established name, but it is informally called "'''Mirrored Halloween'''" here, because this is Black's mirroring response to the Halloween Attack's main move ('''4. Nxe5''').
There are usually 2 main moves White will most commonly try: '''5. Nxc6''', taking the black c6 knight and ignoring the hanging black e4 knight, and '''5. Nxe4''', taking the hanging black e4 knight, ignoring the hanging white knight on e5.
=== 5. Nxc6 ===
White takes the knight on c6, attacking the queen. Because Black has a hanging knight on e4, his only move is to counterattack by playing '''5...Nxc3!''' (Because if he takes the white knight with '''5...bxc6??''' or '''5...dxc6??''', White can simply win a knight after '''6. Nxe4!.''' If Black plays '''5...Qe7??''', White can take the black queen, every other queen move loses a knight (The white knight on c6 can retreat back, making Black lose a knight). Every other move loses a queen due to ignoring the hanging queen. For example, '''5...Nxf2??''' is refuted by '''6. Qe2+!''', a check that sidesteps the attack entirely, and Black cannot stop '''7. Nxd8''', or '''7. Nxe7'''.), counterattacking the white queen. If White wishes to deal with this, either '''6. dxc3''', removing Black’s attacking knight on c3, after which Black removes White’s attacking knight on c6 by playing either '''6...dxc6''', or '''6...bxc6'''; or '''6. Nxd8,''' trading queens; will be good options according to Stockfish. If White plays '''6. Nxd8''', Black will respond with '''6...Nxd1''', recovering material.
{{Chess/board
| moves = 1. e4 e5 2. Nf3 Nc6 3. Nc3 Nf6 4. Nxe5 Nxe4 5. Nxc6 Nxc3 6. Nxd8 Nxd1
| caption = Position after Black's move of '''6...Nxd1'''.
}}
=== 5. Nxe4 ===
White takes the knight on e4. Black will likely follow up with '''5...Nxe5''', recovering material. '''6. d4''' is a good center attacking move for White that also gains tempo by kicking the black knight. The position is very drawish, with White being slightly better by having a better center.
{{Chess/board
| moves = 1. e4 e5 2. Nf3 Nc6 3. Nc3 Nf6 4. Nxe5 Nxe4 5. Nxe4 Nxe5 6. d4
| caption = Position after White's move of '''6. d4'''.
}}
=== 5. Qh5 ===
This is an uncommon move and also White's most aggressive option, directly threatening '''6. Qxf7#''', forcing Black into defense of their f7-square. Black can make a lot of mistakes from here.
==== 5...Nxe5?? ====
Black plays the common blunder '''5...Nxe5??''', hoping to remove an attacker of the f7-square and trade pieces, White can take the knight with check ('''6. Qxe5+!'''), forcing the black king to cover, and now there is no way to save the e4 knight, there are simply too many attackers. If Black plays '''6...Qe7''' (Black's best try, since the queen x-ray defends the knight and counterattacks the queen), then White can play '''7. Qxe7+!''', then take the black knight on e4.
==== 5...g6? ====
If Black instead plays the also common mistake '''5...g6?''', mimicking the [[Chess Opening Theory/1. e4/1...e5/2. Qh5/2...Nc6/3. Bc4/3...g6|'''Wayward Queen Attack'''<nowiki/>'s most common defence]], Black loses a pawn after this sequence: '''6. Nxc6!''' (counterattacking the black queen) '''gxh5 7. Nxd8 Nxc3 8. Nxf7''' (White desperado sacrifices the white knight for a pawn, knowing the knight is doomed anyway, and Black cannot sacrifice his knight for any compensation, and if Black retreats, White can just escape with the free pawn.) '''Kxf7 9. dxc3'''.
==== 5...Nd6 ====
This is Black's fairly rare but best try, retreating the black knight to defend f7. But White can lunge forward with '''6. Nd5''', playing aggressively. White has very good winning chances here in this position. Black has to play precisely to survive in this position.
{{Chess/board
| moves = 1. e4 e5 2. Nf3 Nc6 3. Nc3 Nf6 4. Nxe5 Nxe4 5. Qh5 Nd6 6. Nd5
| caption = Position after White's move of '''6. Nd5'''.
}}
==== 5...Qf6?! ====
This is a better move than the blunders described on this page, but it is a small inaccuracy, since it allows White to win a pawn, make Black lose castling rights, and gain development. The best move for White is '''6. Qxf7+''', starting the trade that will win them a pawn and make Black lose castling rights. Then Black will regain material with '''6...Qxf7''', then White will regain material with '''7. Nxf7'''. The black king will then take on f7 with '''7...Kxf7''', losing castling rights. Now it seems like Black is ahead on material here, but the e4 knight is hanging, so White can win back the material and, in the end, they will have won a pawn. The best move for white now is not to take the black knight on e4 immediately but play an intermediate move (zwischenzug) by playing '''8. Bc4+''', forcing the king to move or block with the only legal block '''8...d5??''', There is no legal move that defends the knight and deals with the check at the same time except '''8...d5??''' which seems like it defends the black knight and blocks the check, but this blunders a pawn via '''9. Bxd5+''' and fails to defend the knight anyway since the pawn is the only defender of the knight. Black now must move the king, two good moves are the natural '''8... Ke8''', or the unnatural but best move by the engine (Stockfish 19 NNUE) '''8...Ke7'''. Then, White takes the knight with '''9. Nxe4,''' ending this tactical sequence with a bishop developed, a knight centralized, and a pawn gained.
{{Chess/board
| moves = 1. e4 e5 2. Nf3 Nc6 3. Nc3 Nf6 4. Nxe5 Nxe4 5. Qh5 Qf6 6. Qxf7+ Qxf7 7. Nxf7 Kxf7 8. Bc4+ Ke7 9. Nxe4
| caption = Position after White's move of '''9. Nxe4''' if Black played '''8...Ke7'''.
}}
== History ==
This line has no known history in books or tournament practice, and it is very rare. However, Lichess database statistics show that its popularity has increased over time. Between January 2017 and April 2026, the share of Lichess games reaching this position rose from roughly 0.0002% to about 0.0005-0.0007%, peaking at around 0.0007%, though with considerable fluctuation.<ref>{{Cite web |title=Four Knights Game: Halloween Gambit |url=https://lichess.org/opening/Four_Knights_Game_Halloween_Gambit/e4_e5_Nf3_Nc6_Nc3_Nf6_Nxe5_Nxe4 |access-date=2026-10-17 |website=lichess.org |language=en-US}}</ref> For the history of the gambit itself, see the [[Chess Opening Theory/1. e4/1...e5/2. Nf3/2...Nc6/3. Nc3/3...Nf6/4. Nxe5|Halloween Gambit]] page.
== Theory table ==
{{ChessTable}}
{{Chess/theory table
|preceding=1. e4 e5 2. Nf3 Nc6 3. Nc3 Nf6 4. Nxe5 Nxe4
|line1=5. Nxc6 Nxc3 6. dxc3 dxc6
|eval1= =
|line2=5. Nxc6 Nxc3 6. Nxd8 Nxd1
|eval2= =
|line3=5. Nxe4 Nxe5 6. d4
|eval3= +/=
|line4=5. Qh5 Nxe5?? 6. Qxe5+ Qe7 7. Qxe7+
|eval4= +-
|line5=5. Qh5 g6? 6. Nxc6! gxh5 7. Nxd8 Nxc3 8. Nxf7 Kxf7 9. dxc3
|eval5= +/-
|line6=5. Qh5 Nd6 6. Nd5
|eval6= +/-
|line7=5.Qh5 Qf6?! 6. Qxf7+ Qxf7 7. Nxf7 Kxf7 8. Bc4+ Ke7 9. Nxe4|line8=5.Qh5 Qf6?! 6. Qxf7+ Qxf7 7. Nxf7 Kxf7 8. Bc4+ d5?? 9. Bxd5+|eval7=+/=|eval8=+-}}
{{ChessMid}}
7caiztw0ja8jlxkx1rtlx2j13aqd8cj
4676511
4676510
2026-10-17T12:42:47Z
Ltypestar2
3524220
I'm sorry for editing so frequently over minor changes, but I just noticed a reference appeared at the bottom without a References header.
4676511
wikitext
text/x-wiki
== 4...Nxe4?! ==
{{Chess Opening Theory/Position|name=Mirrored Halloween (informal)|eco=[[Chess/ECOC|C47]]|parent=[[../|Halloween Gambit]]}}
Black unusually declines the gambit and tries to mirror the [[Chess/Halloween Attack|'''Halloween Attack''']]'s sacrifice ('''4. Nxe5''') to counter the Halloween Attack. Although this recovers the pawn, it ignores the hanging knight and gives White back a drawish position, with higher winning chances for White. Worse, it unnecessarily keeps the position symmetrical, which means White still has a first move advantage.
This line has no established name, but it is informally called "'''Mirrored Halloween'''" here, because this is Black's mirroring response to the Halloween Attack's main move ('''4. Nxe5''').
There are usually 2 main moves White will most commonly try: '''5. Nxc6''', taking the black c6 knight and ignoring the hanging black e4 knight, and '''5. Nxe4''', taking the hanging black e4 knight, ignoring the hanging white knight on e5.
=== 5. Nxc6 ===
White takes the knight on c6, attacking the queen. Because Black has a hanging knight on e4, his only move is to counterattack by playing '''5...Nxc3!''' (Because if he takes the white knight with '''5...bxc6??''' or '''5...dxc6??''', White can simply win a knight after '''6. Nxe4!.''' If Black plays '''5...Qe7??''', White can take the black queen, every other queen move loses a knight (The white knight on c6 can retreat back, making Black lose a knight). Every other move loses a queen due to ignoring the hanging queen. For example, '''5...Nxf2??''' is refuted by '''6. Qe2+!''', a check that sidesteps the attack entirely, and Black cannot stop '''7. Nxd8''', or '''7. Nxe7'''.), counterattacking the white queen. If White wishes to deal with this, either '''6. dxc3''', removing Black’s attacking knight on c3, after which Black removes White’s attacking knight on c6 by playing either '''6...dxc6''', or '''6...bxc6'''; or '''6. Nxd8,''' trading queens; will be good options according to Stockfish. If White plays '''6. Nxd8''', Black will respond with '''6...Nxd1''', recovering material.
{{Chess/board
| moves = 1. e4 e5 2. Nf3 Nc6 3. Nc3 Nf6 4. Nxe5 Nxe4 5. Nxc6 Nxc3 6. Nxd8 Nxd1
| caption = Position after Black's move of '''6...Nxd1'''.
}}
=== 5. Nxe4 ===
White takes the knight on e4. Black will likely follow up with '''5...Nxe5''', recovering material. '''6. d4''' is a good center attacking move for White that also gains tempo by kicking the black knight. The position is very drawish, with White being slightly better by having a better center.
{{Chess/board
| moves = 1. e4 e5 2. Nf3 Nc6 3. Nc3 Nf6 4. Nxe5 Nxe4 5. Nxe4 Nxe5 6. d4
| caption = Position after White's move of '''6. d4'''.
}}
=== 5. Qh5 ===
This is an uncommon move and also White's most aggressive option, directly threatening '''6. Qxf7#''', forcing Black into defense of their f7-square. Black can make a lot of mistakes from here.
==== 5...Nxe5?? ====
Black plays the common blunder '''5...Nxe5??''', hoping to remove an attacker of the f7-square and trade pieces, White can take the knight with check ('''6. Qxe5+!'''), forcing the black king to cover, and now there is no way to save the e4 knight, there are simply too many attackers. If Black plays '''6...Qe7''' (Black's best try, since the queen x-ray defends the knight and counterattacks the queen), then White can play '''7. Qxe7+!''', then take the black knight on e4.
==== 5...g6? ====
If Black instead plays the also common mistake '''5...g6?''', mimicking the [[Chess Opening Theory/1. e4/1...e5/2. Qh5/2...Nc6/3. Bc4/3...g6|'''Wayward Queen Attack'''<nowiki/>'s most common defence]], Black loses a pawn after this sequence: '''6. Nxc6!''' (counterattacking the black queen) '''gxh5 7. Nxd8 Nxc3 8. Nxf7''' (White desperado sacrifices the white knight for a pawn, knowing the knight is doomed anyway, and Black cannot sacrifice his knight for any compensation, and if Black retreats, White can just escape with the free pawn.) '''Kxf7 9. dxc3'''.
==== 5...Nd6 ====
This is Black's fairly rare but best try, retreating the black knight to defend f7. But White can lunge forward with '''6. Nd5''', playing aggressively. White has very good winning chances here in this position. Black has to play precisely to survive in this position.
{{Chess/board
| moves = 1. e4 e5 2. Nf3 Nc6 3. Nc3 Nf6 4. Nxe5 Nxe4 5. Qh5 Nd6 6. Nd5
| caption = Position after White's move of '''6. Nd5'''.
}}
==== 5...Qf6?! ====
This is a better move than the blunders described on this page, but it is a small inaccuracy, since it allows White to win a pawn, make Black lose castling rights, and gain development. The best move for White is '''6. Qxf7+''', starting the trade that will win them a pawn and make Black lose castling rights. Then Black will regain material with '''6...Qxf7''', then White will regain material with '''7. Nxf7'''. The black king will then take on f7 with '''7...Kxf7''', losing castling rights. Now it seems like Black is ahead on material here, but the e4 knight is hanging, so White can win back the material and, in the end, they will have won a pawn. The best move for white now is not to take the black knight on e4 immediately but play an intermediate move (zwischenzug) by playing '''8. Bc4+''', forcing the king to move or block with the only legal block '''8...d5??''', There is no legal move that defends the knight and deals with the check at the same time except '''8...d5??''' which seems like it defends the black knight and blocks the check, but this blunders a pawn via '''9. Bxd5+''' and fails to defend the knight anyway since the pawn is the only defender of the knight. Black now must move the king, two good moves are the natural '''8... Ke8''', or the unnatural but best move by the engine (Stockfish 19 NNUE) '''8...Ke7'''. Then, White takes the knight with '''9. Nxe4,''' ending this tactical sequence with a bishop developed, a knight centralized, and a pawn gained.
{{Chess/board
| moves = 1. e4 e5 2. Nf3 Nc6 3. Nc3 Nf6 4. Nxe5 Nxe4 5. Qh5 Qf6 6. Qxf7+ Qxf7 7. Nxf7 Kxf7 8. Bc4+ Ke7 9. Nxe4
| caption = Position after White's move of '''9. Nxe4''' if Black played '''8...Ke7'''.
}}
== History ==
This line has no known history in books or tournament practice, and it is very rare. However, Lichess database statistics show that its popularity has increased over time. Between January 2017 and April 2026, the share of Lichess games reaching this position rose from roughly 0.0002% to about 0.0005-0.0007%, peaking at around 0.0007%, though with considerable fluctuation.<ref>{{Cite web |title=Four Knights Game: Halloween Gambit |url=https://lichess.org/opening/Four_Knights_Game_Halloween_Gambit/e4_e5_Nf3_Nc6_Nc3_Nf6_Nxe5_Nxe4 |access-date=2026-10-17 |website=lichess.org |language=en-US}}</ref> For the history of the gambit itself, see the [[Chess Opening Theory/1. e4/1...e5/2. Nf3/2...Nc6/3. Nc3/3...Nf6/4. Nxe5|Halloween Gambit]] page.
== Theory table ==
{{ChessTable}}
{{Chess/theory table
|preceding=1. e4 e5 2. Nf3 Nc6 3. Nc3 Nf6 4. Nxe5 Nxe4
|line1=5. Nxc6 Nxc3 6. dxc3 dxc6
|eval1= =
|line2=5. Nxc6 Nxc3 6. Nxd8 Nxd1
|eval2= =
|line3=5. Nxe4 Nxe5 6. d4
|eval3= +/=
|line4=5. Qh5 Nxe5?? 6. Qxe5+ Qe7 7. Qxe7+
|eval4= +-
|line5=5. Qh5 g6? 6. Nxc6! gxh5 7. Nxd8 Nxc3 8. Nxf7 Kxf7 9. dxc3
|eval5= +/-
|line6=5. Qh5 Nd6 6. Nd5
|eval6= +/-
|line7=5.Qh5 Qf6?! 6. Qxf7+ Qxf7 7. Nxf7 Kxf7 8. Bc4+ Ke7 9. Nxe4|line8=5.Qh5 Qf6?! 6. Qxf7+ Qxf7 7. Nxf7 Kxf7 8. Bc4+ d5?? 9. Bxd5+|eval7=+/=|eval8=+-}}
{{ChessMid}}
== References ==
qj4cd33hrr4deauwxfp6cz62lfnvvyj
4676513
4676511
2026-10-17T12:53:30Z
Ltypestar2
3524220
Added See also, as recommended by the local manual of style.
4676513
wikitext
text/x-wiki
== 4...Nxe4?! ==
{{Chess Opening Theory/Position|name=Mirrored Halloween (informal)|eco=[[Chess/ECOC|C47]]|parent=[[../|Halloween Gambit]]}}
Black unusually declines the gambit and tries to mirror the [[Chess/Halloween Attack|'''Halloween Attack''']]'s sacrifice ('''4. Nxe5''') to counter the Halloween Attack. Although this recovers the pawn, it ignores the hanging knight and gives White back a drawish position, with higher winning chances for White. Worse, it unnecessarily keeps the position symmetrical, which means White still has a first move advantage.
This line has no established name, but it is informally called "'''Mirrored Halloween'''" here, because this is Black's mirroring response to the Halloween Attack's main move ('''4. Nxe5''').
There are usually 2 main moves White will most commonly try: '''5. Nxc6''', taking the black c6 knight and ignoring the hanging black e4 knight, and '''5. Nxe4''', taking the hanging black e4 knight, ignoring the hanging white knight on e5.
=== 5. Nxc6 ===
White takes the knight on c6, attacking the queen. Because Black has a hanging knight on e4, his only move is to counterattack by playing '''5...Nxc3!''' (Because if he takes the white knight with '''5...bxc6??''' or '''5...dxc6??''', White can simply win a knight after '''6. Nxe4!.''' If Black plays '''5...Qe7??''', White can take the black queen, every other queen move loses a knight (The white knight on c6 can retreat back, making Black lose a knight). Every other move loses a queen due to ignoring the hanging queen. For example, '''5...Nxf2??''' is refuted by '''6. Qe2+!''', a check that sidesteps the attack entirely, and Black cannot stop '''7. Nxd8''', or '''7. Nxe7'''.), counterattacking the white queen. If White wishes to deal with this, either '''6. dxc3''', removing Black’s attacking knight on c3, after which Black removes White’s attacking knight on c6 by playing either '''6...dxc6''', or '''6...bxc6'''; or '''6. Nxd8,''' trading queens; will be good options according to Stockfish. If White plays '''6. Nxd8''', Black will respond with '''6...Nxd1''', recovering material.
{{Chess/board
| moves = 1. e4 e5 2. Nf3 Nc6 3. Nc3 Nf6 4. Nxe5 Nxe4 5. Nxc6 Nxc3 6. Nxd8 Nxd1
| caption = Position after Black's move of '''6...Nxd1'''.
}}
=== 5. Nxe4 ===
White takes the knight on e4. Black will likely follow up with '''5...Nxe5''', recovering material. '''6. d4''' is a good center attacking move for White that also gains tempo by kicking the black knight. The position is very drawish, with White being slightly better by having a better center.
{{Chess/board
| moves = 1. e4 e5 2. Nf3 Nc6 3. Nc3 Nf6 4. Nxe5 Nxe4 5. Nxe4 Nxe5 6. d4
| caption = Position after White's move of '''6. d4'''.
}}
=== 5. Qh5 ===
This is an uncommon move and also White's most aggressive option, directly threatening '''6. Qxf7#''', forcing Black into defense of their f7-square. Black can make a lot of mistakes from here.
==== 5...Nxe5?? ====
Black plays the common blunder '''5...Nxe5??''', hoping to remove an attacker of the f7-square and trade pieces, White can take the knight with check ('''6. Qxe5+!'''), forcing the black king to cover, and now there is no way to save the e4 knight, there are simply too many attackers. If Black plays '''6...Qe7''' (Black's best try, since the queen x-ray defends the knight and counterattacks the queen), then White can play '''7. Qxe7+!''', then take the black knight on e4.
==== 5...g6? ====
If Black instead plays the also common mistake '''5...g6?''', mimicking the [[Chess Opening Theory/1. e4/1...e5/2. Qh5/2...Nc6/3. Bc4/3...g6|'''Wayward Queen Attack'''<nowiki/>'s most common defence]], Black loses a pawn after this sequence: '''6. Nxc6!''' (counterattacking the black queen) '''gxh5 7. Nxd8 Nxc3 8. Nxf7''' (White desperado sacrifices the white knight for a pawn, knowing the knight is doomed anyway, and Black cannot sacrifice his knight for any compensation, and if Black retreats, White can just escape with the free pawn.) '''Kxf7 9. dxc3'''.
==== 5...Nd6 ====
This is Black's fairly rare but best try, retreating the black knight to defend f7. But White can lunge forward with '''6. Nd5''', playing aggressively. White has very good winning chances here in this position. Black has to play precisely to survive in this position.
{{Chess/board
| moves = 1. e4 e5 2. Nf3 Nc6 3. Nc3 Nf6 4. Nxe5 Nxe4 5. Qh5 Nd6 6. Nd5
| caption = Position after White's move of '''6. Nd5'''.
}}
==== 5...Qf6?! ====
This is a better move than the blunders described on this page, but it is a small inaccuracy, since it allows White to win a pawn, make Black lose castling rights, and gain development. The best move for White is '''6. Qxf7+''', starting the trade that will win them a pawn and make Black lose castling rights. Then Black will regain material with '''6...Qxf7''', then White will regain material with '''7. Nxf7'''. The black king will then take on f7 with '''7...Kxf7''', losing castling rights. Now it seems like Black is ahead on material here, but the e4 knight is hanging, so White can win back the material and, in the end, they will have won a pawn. The best move for white now is not to take the black knight on e4 immediately but play an intermediate move (zwischenzug) by playing '''8. Bc4+''', forcing the king to move or block with the only legal block '''8...d5??''', There is no legal move that defends the knight and deals with the check at the same time except '''8...d5??''' which seems like it defends the black knight and blocks the check, but this blunders a pawn via '''9. Bxd5+''' and fails to defend the knight anyway since the pawn is the only defender of the knight. Black now must move the king, two good moves are the natural '''8... Ke8''', or the unnatural but best move by the engine (Stockfish 19 NNUE) '''8...Ke7'''. Then, White takes the knight with '''9. Nxe4,''' ending this tactical sequence with a bishop developed, a knight centralized, and a pawn gained.
{{Chess/board
| moves = 1. e4 e5 2. Nf3 Nc6 3. Nc3 Nf6 4. Nxe5 Nxe4 5. Qh5 Qf6 6. Qxf7+ Qxf7 7. Nxf7 Kxf7 8. Bc4+ Ke7 9. Nxe4
| caption = Position after White's move of '''9. Nxe4''' if Black played '''8...Ke7'''.
}}
== History ==
This line has no known history in books or tournament practice, and it is very rare. However, Lichess database statistics show that its popularity has increased over time. Between January 2017 and April 2026, the share of Lichess games reaching this position rose from roughly 0.0002% to about 0.0005-0.0007%, peaking at around 0.0007%, though with considerable fluctuation.<ref>{{Cite web |title=Four Knights Game: Halloween Gambit |url=https://lichess.org/opening/Four_Knights_Game_Halloween_Gambit/e4_e5_Nf3_Nc6_Nc3_Nf6_Nxe5_Nxe4 |access-date=2026-10-17 |website=lichess.org |language=en-US}}</ref> For the history of the gambit itself, see the [[Chess Opening Theory/1. e4/1...e5/2. Nf3/2...Nc6/3. Nc3/3...Nf6/4. Nxe5|Halloween Gambit]] page.
== Theory table ==
{{ChessTable}}
{{Chess/theory table
|preceding=1. e4 e5 2. Nf3 Nc6 3. Nc3 Nf6 4. Nxe5 Nxe4
|line1=5. Nxc6 Nxc3 6. dxc3 dxc6
|eval1= =
|line2=5. Nxc6 Nxc3 6. Nxd8 Nxd1
|eval2= =
|line3=5. Nxe4 Nxe5 6. d4
|eval3= +/=
|line4=5. Qh5 Nxe5?? 6. Qxe5+ Qe7 7. Qxe7+
|eval4= +-
|line5=5. Qh5 g6? 6. Nxc6! gxh5 7. Nxd8 Nxc3 8. Nxf7 Kxf7 9. dxc3
|eval5= +/-
|line6=5. Qh5 Nd6 6. Nd5
|eval6= +/-
|line7=5.Qh5 Qf6?! 6. Qxf7+ Qxf7 7. Nxf7 Kxf7 8. Bc4+ Ke7 9. Nxe4|line8=5.Qh5 Qf6?! 6. Qxf7+ Qxf7 7. Nxf7 Kxf7 8. Bc4+ d5?? 9. Bxd5+|eval7=+/=|eval8=+-}}
{{ChessMid}}
== See also ==
{{Chess Opening Theory/Footer}}
== References ==
axg546k1sx0s3jfoj8ay8bu9yhvo29e
4676682
4676513
2026-10-18T04:05:08Z
Ltypestar2
3524220
changed spelling to british spelling
4676682
wikitext
text/x-wiki
== 4...Nxe4?! · Mirrored Halloween (informal) ==
{{Chess Opening Theory/Position|name=Mirrored Halloween (informal)|eco=[[Chess/ECOC|C47]]|parent=[[../|Halloween Gambit]]}}
Black unusually declines the gambit and tries to mirror the [[Chess/Halloween Attack|'''Halloween Attack''']]'s sacrifice ('''4. Nxe5''') to counter the Halloween Attack. Although this recovers the pawn, it ignores the hanging knight and gives White back a drawish position, with higher winning chances for White. Worse, it unnecessarily keeps the position symmetrical, which means White still has a first move advantage.
This line has no established name, but it is informally called "'''Mirrored Halloween'''" here, because this is Black's mirroring response to the Halloween Attack's main move ('''4. Nxe5''').
There are usually 2 main moves White will most commonly try: '''5. Nxc6''', taking the black c6 knight and ignoring the hanging black e4 knight, and '''5. Nxe4''', taking the hanging black e4 knight, ignoring the hanging white knight on e5.
=== 5. Nxc6 ===
White takes the knight on c6, attacking the queen. Because Black has a hanging knight on e4, his only move is to counterattack by playing '''5...Nxc3!''' (Because if he takes the white knight with '''5...bxc6??''' or '''5...dxc6??''', White can simply win a knight after '''6. Nxe4!.''' If Black plays '''5...Qe7??''', White can take the black queen, every other queen move loses a knight (The white knight on c6 can retreat back, making Black lose a knight). Every other move loses a queen due to ignoring the hanging queen. For example, '''5...Nxf2??''' is refuted by '''6. Qe2+!''', a check that sidesteps the attack entirely, and Black cannot stop '''7. Nxd8''', or '''7. Nxe7'''.), counterattacking the white queen. If White wishes to deal with this, either '''6. dxc3''', removing Black’s attacking knight on c3, after which Black removes White’s attacking knight on c6 by playing either '''6...dxc6''', or '''6...bxc6'''; or '''6. Nxd8,''' trading queens; will be good options according to Stockfish. If White plays '''6. Nxd8''', Black will respond with '''6...Nxd1''', recovering material.
{{Chess/board
| moves = 1. e4 e5 2. Nf3 Nc6 3. Nc3 Nf6 4. Nxe5 Nxe4 5. Nxc6 Nxc3 6. Nxd8 Nxd1
| caption = Position after Black's move of '''6...Nxd1'''.
}}
=== 5. Nxe4 ===
White takes the knight on e4. Black will likely follow up with '''5...Nxe5''', recovering material. '''6. d4''' is a good centre attacking move for White that also gains tempo by kicking the black knight. The position is very drawish, with White being slightly better by having a better centre.
{{Chess/board
| moves = 1. e4 e5 2. Nf3 Nc6 3. Nc3 Nf6 4. Nxe5 Nxe4 5. Nxe4 Nxe5 6. d4
| caption = Position after White's move of '''6. d4'''.
}}
=== 5. Qh5 ===
This is an uncommon move and also White's most aggressive option, directly threatening '''6. Qxf7#''', forcing Black into defence of their f7-square. Black can make a lot of mistakes from here.
==== 5...Nxe5?? ====
Black plays the common blunder '''5...Nxe5??''', hoping to remove an attacker of the f7-square and trade pieces, White can take the knight with check ('''6. Qxe5+!'''), forcing the black king to cover, and now there is no way to save the e4 knight, there are simply too many attackers. If Black plays '''6...Qe7''' (Black's best try, since the queen x-ray defends the knight and counterattacks the queen), then White can play '''7. Qxe7+!''', then take the black knight on e4.
==== 5...g6? ====
If Black instead plays the also common mistake '''5...g6?''', mimicking the [[Chess Opening Theory/1. e4/1...e5/2. Qh5/2...Nc6/3. Bc4/3...g6|'''Wayward Queen Attack'''<nowiki/>'s most common defence]], Black loses a pawn after this sequence: '''6. Nxc6!''' (counterattacking the black queen) '''gxh5 7. Nxd8 Nxc3 8. Nxf7''' (White desperado sacrifices the white knight for a pawn, knowing the knight is doomed anyway, and Black cannot sacrifice his knight for any compensation, and if Black retreats, White can just escape with the free pawn.) '''Kxf7 9. dxc3'''.
==== 5...Nd6 ====
This is Black's fairly rare but best try, retreating the black knight to defend f7. But White can lunge forward with '''6. Nd5''', playing aggressively. White has very good winning chances here in this position. Black has to play precisely to survive in this position.
{{Chess/board
| moves = 1. e4 e5 2. Nf3 Nc6 3. Nc3 Nf6 4. Nxe5 Nxe4 5. Qh5 Nd6 6. Nd5
| caption = Position after White's move of '''6. Nd5'''.
}}
==== 5...Qf6?! ====
This is a better move than the blunders described on this page, but it is a small inaccuracy, since it allows White to win a pawn, make Black lose castling rights, and gain development. The best move for White is '''6. Qxf7+''', starting the trade that will win them a pawn and make Black lose castling rights. Then Black will regain material with '''6...Qxf7''', then White will regain material with '''7. Nxf7'''. The black king will then take on f7 with '''7...Kxf7''', losing castling rights. Now it seems like Black is ahead on material here, but the e4 knight is hanging, so White can win back the material and, in the end, they will have won a pawn. The best move for White now is not to take the black knight on e4 immediately but play an intermediate move (zwischenzug) by playing '''8. Bc4+''', forcing the king to move or block with the only legal block '''8...d5??'''. There is no legal move that defends the knight and deals with the check at the same time except '''8...d5??''' which seems like it defends the black knight and blocks the check, but this blunders a pawn via '''9. Bxd5+''' and fails to defend the knight anyway since the pawn is the only defender of the knight. Black now must move the king, two good moves are the natural '''8...Ke8''', or the unnatural but best move by the engine (Stockfish 19 NNUE) '''8...Ke7'''. Then, White takes the knight with '''9. Nxe4,''' ending this tactical sequence with a bishop developed, a knight centralised, a black king that lost castling rights, and a pawn gained.
{{Chess/board
| moves = 1. e4 e5 2. Nf3 Nc6 3. Nc3 Nf6 4. Nxe5 Nxe4 5. Qh5 Qf6 6. Qxf7+ Qxf7 7. Nxf7 Kxf7 8. Bc4+ Ke7 9. Nxe4
| caption = Position after White's move of '''9. Nxe4''' if Black played '''8...Ke7'''.
}}
== History ==
This line has no known history in books or tournament practice, and it is very rare. However, Lichess database statistics show that its popularity has increased over time. Between January 2017 and April 2026, the share of Lichess games reaching this position rose from roughly 0.0002% to about 0.0005-0.0007%, peaking at around 0.0007%, though with considerable fluctuation.<ref>{{Cite web |title=Four Knights Game: Halloween Gambit |url=https://lichess.org/opening/Four_Knights_Game_Halloween_Gambit/e4_e5_Nf3_Nc6_Nc3_Nf6_Nxe5_Nxe4 |access-date=2026-10-17 |website=lichess.org |language=en-US}}</ref> For the history of the gambit itself, see the [[Chess Opening Theory/1. e4/1...e5/2. Nf3/2...Nc6/3. Nc3/3...Nf6/4. Nxe5|Halloween Gambit]] page.
== Theory table ==
{{ChessTable}}
{{Chess/theory table
|preceding=1. e4 e5 2. Nf3 Nc6 3. Nc3 Nf6 4. Nxe5 Nxe4
|line1=5. Nxc6 Nxc3 6. dxc3 dxc6
|eval1= =
|line2=5. Nxc6 Nxc3 6. Nxd8 Nxd1
|eval2= =
|line3=5. Nxe4 Nxe5 6. d4
|eval3= +/=
|line4=5. Qh5 Nxe5?? 6. Qxe5+ Qe7 7. Qxe7+
|eval4= +-
|line5=5. Qh5 g6? 6. Nxc6! gxh5 7. Nxd8 Nxc3 8. Nxf7 Kxf7 9. dxc3
|eval5= +/-
|line6=5. Qh5 Nd6 6. Nd5
|eval6= +/-
|line7=5. Qh5 Qf6?! 6. Qxf7+ Qxf7 7. Nxf7 Kxf7 8. Bc4+ Ke7 9. Nxe4
|eval7= +/=
|line8=5. Qh5 Qf6?! 6. Qxf7+ Qxf7 7. Nxf7 Kxf7 8. Bc4+ d5?? 9. Bxd5+
|eval8= +-
}}
{{ChessMid}}
== References ==
{{reflist}}
== See also ==
{{Chess Opening Theory/Footer}}
svvx37qx79zea3tbnnb568eynmcrn5b
About Monsters And Angels
0
485372
4676540
4676338
2026-10-17T15:07:46Z
3MMPEYTON
3393808
4676540
wikitext
text/x-wiki
<br>'''Monster, a threatening force from the far-side.''' <br><br>This book will introduce four fictional creations with odd human connections: <br>zombie-person <br>ghost-person <br>werewolf-person <br>demon-person <br>...and Angels. <br><br>This book is intended as a short conceptual guide for readers interested in folklore, storytelling, monsters and angels. <br>Link: [[About_Monsters_And_Angels/Questions_And_Answers|About Monsters And Angels: Questions And Answers]]
<br>
{| class="wikitable"
|+ About Monsters And Angels
|-
! Guardian Angel !! The Sleep Of Reason Produces Monsters
|-
| [[File:The story of our Christianity; an account of the struggles, persecutions, wars, and victories of Christians of all times (1893) (14783658362).jpg|thumb|The story of our Christianity; an account of the struggles, persecutions, wars, and victories of Christians of all times (1893) (14783658362)]] || [[File:Plate 43 from 'Los Caprichos'- The sleep of reason produces monsters (El sueño de la razon produce monstruos) MET MM2149.jpg|thumb|Plate 43 from 'Los Caprichos': The sleep of reason produces monsters (El sueño de la razon produce monstruos), print, Goya (Francisco de Goya y Lucientes) (MET, 18.64(43))]]
|}
<br>
<br>
<br> "Monsters are real, and ghosts are real too. They live inside of us, and sometimes, they win." - Stephen King
<br>
<br>'''Table Of Content:'''<br>[[About_Monsters_And_Angels_Introduction|Introduction]] To Monsters!<br>[[About_Monsters_And_Angels/Chapter_One|Chapter One]]: Monsters And Their Human Origin <br>Chapter Two<br>Chapter Three<br>Chapter Four<br>Chapter Five<br>Chapter Six<br>Chapter Seven<br>Chapter Eight<br>Chapter Nine<br>Chapter Ten<br>
<br>
<br>
{{New book}}
<br>
{{Formatting}}
<br>
{{BookCat}}
{{Shelves|Literature|Paranormal|Cultural anthropology}}
<br>
[[Category:Book:About Monsters And Angels]]
<br>
{{status|0%}}
<br>
<noinclude>{{Chapter navigation with TOC||Chapter One|TOC mini}}</noinclude>
pkwpjjygcugft0lzac4lsziif6uwgdu
4676544
4676540
2026-10-17T15:15:07Z
3MMPEYTON
3393808
4676544
wikitext
text/x-wiki
<br>'''Monster, a threatening force from the far-side.''' <br><br>This book will introduce four fictional creations with odd human connections: <br>zombie-person <br>ghost-person <br>werewolf-person <br>demon-person <br>...and Angels. <br><br>This book is intended as a short conceptual guide for readers interested in folklore, storytelling, monsters and angels. <br>Link: [[About_Monsters_And_Angels/Questions_And_Answers|About Monsters And Angels: Questions And Answers]]
<br>
{| class="wikitable"
|+ About Monsters And Angels
|-
! Guardian Angel !! The Sleep Of Reason Produces Monsters
|-
| [[File:The story of our Christianity; an account of the struggles, persecutions, wars, and victories of Christians of all times (1893) (14783658362).jpg|thumb|The story of our Christianity; an account of the struggles, persecutions, wars, and victories of Christians of all times (1893) (14783658362)]] || [[File:Plate 43 from 'Los Caprichos'- The sleep of reason produces monsters (El sueño de la razon produce monstruos) MET MM2149.jpg|thumb|Plate 43 from 'Los Caprichos': The sleep of reason produces monsters (El sueño de la razon produce monstruos), print, Goya (Francisco de Goya y Lucientes) (MET, 18.64(43))]]
|}
<br>
<br>
<br> "Monsters are real, and ghosts are real too. They live inside of us, and sometimes, they win." - Stephen King
<br>
<br>'''Table Of Content:'''<br>
[[About_Monsters_And_Angels/Introduction|About Monsters And Angels: Introduction]] To Monsters!<br>[[About_Monsters_And_Angels/Chapter_One|Chapter One]]: Monsters And Their Human Origin <br>Chapter Two<br>Chapter Three<br>Chapter Four<br>Chapter Five<br>Chapter Six<br>Chapter Seven<br>Chapter Eight<br>Chapter Nine<br>Chapter Ten<br>
<br>
<br>
{{New book}}
<br>
{{Formatting}}
<br>
{{BookCat}}
{{Shelves|Literature|Paranormal|Cultural anthropology}}
<br>
[[Category:Book:About Monsters And Angels]]
<br>
{{status|0%}}
<br>
<noinclude>{{Chapter navigation with TOC||Chapter One|TOC mini}}</noinclude>
60t78vw9dnuwhcm3poo1cohyggal7vo
4676546
4676544
2026-10-17T15:19:00Z
3MMPEYTON
3393808
4676546
wikitext
text/x-wiki
<br>'''Monster, a threatening force from the far-side.''' <br><br>This book will introduce four fictional creations with odd human connections: <br>zombie-person <br>ghost-person <br>werewolf-person <br>demon-person <br>...and Angels. <br><br>This book is intended as a short conceptual guide for readers interested in folklore, storytelling, monsters and angels. <br>Link: [[About_Monsters_And_Angels/Questions_And_Answers|About Monsters And Angels: Questions And Answers]]
<br>
{| class="wikitable"
|+ About Monsters And Angels
|-
! Guardian Angel !! The Sleep Of Reason Produces Monsters
|-
| [[File:The story of our Christianity; an account of the struggles, persecutions, wars, and victories of Christians of all times (1893) (14783658362).jpg|thumb|The story of our Christianity; an account of the struggles, persecutions, wars, and victories of Christians of all times (1893) (14783658362)]] || [[File:Plate 43 from 'Los Caprichos'- The sleep of reason produces monsters (El sueño de la razon produce monstruos) MET MM2149.jpg|thumb|Plate 43 from 'Los Caprichos': The sleep of reason produces monsters (El sueño de la razon produce monstruos), print, Goya (Francisco de Goya y Lucientes) (MET, 18.64(43))]]
|}
<br>
<br>
<br> "Monsters are real, and ghosts are real too. They live inside of us, and sometimes, they win." - Stephen King
<br>
<br>'''Table Of Content:'''<br>
[[About_Monsters_And_Angels/Introduction|About Monsters And Angels: Introduction]] To Monsters!<br>[[About_Monsters_And_Angels/Chapter_One|Chapter One]]: Monsters And Their Human Origin <br>Chapter Two<br>Chapter Three<br>Chapter Four<br>Chapter Five<br>Chapter Six<br>Chapter Seven<br>Chapter Eight<br>Chapter Nine<br>Chapter Ten<br>
<br>
<br>
{{New book}}
<br>
<br>
{{BookCat}}
{{Shelves|Literature|Paranormal|Cultural anthropology}}
<br>
[[Category:Book:About Monsters And Angels]]
<br>
{{status|0%}}
<br>
<noinclude>{{Chapter navigation with TOC||Chapter One|TOC mini}}</noinclude>
q9af5t219lr679dy60xq9gsabz7pvsy
Maxima/Programming
0
485506
4676537
4674792
2026-10-17T14:44:54Z
Idavidmiller
3577687
/* Memoizing Functions */ Work in progress. Saving Changes.
4676537
wikitext
text/x-wiki
=Maxima Programming=
Although Maxima is not a general-purpose programming language, Maxima as a CAS includes among the built-in ingredients a relatively complete set of programming expressions that are useful for the intended context. Many of the code examples of this section are intended to be illustrative of technical details relevant to Maxima programming as their purpose, and consequently are intentionally elementary in character.
Learning any sort of programming language, including Maxima programming expressions, is a subjective process. In any case, it is essential to have enough technical know-how specific to the programming language in order to begin the learning process, even in cases where much positive transfer from other programming experience is involved.
Much can be accomplished mathematically using Maxima without having to resort to in-depth knowledge and proficiency in the technical details of Maxima programming expressions. However, Maxima programming expressions are frequently essential for the purpose of defining functions, both in the programming sense of the term, but also more relevantly, for the mathematical sense. For that reason alone, familiarity and sufficient proficiency with Maxima programming expressions should be given some attention.
One way to begin the learning process is to become familiar with enough of the programming essentials to accomplish independent efforts toward accomplishing some specific programming goal of interest. The other way is to study the many available programming expressions of others. This section is intended to provide the essentials toward learning by whatever means are chosen.
The following table shows some built-in ingredients related to Maxima programming expressions:
{| class="wikitable"
|+Maxima Programming Category
|if
|unless
|errcatch
|prederror
|-
|block
|for
|error
|return
|-
|catch
|from
|warning
|throw
|-
|local
|thru
|errormsg
|sstatus
|-
|garbage_collect
|step
|errormsg
|status
|-
|do
|next
|go
|
|-
|while
|in
|
|
|}
Some of these programming expression ingredients can also be considered as belonging to one or more other categories than the Programming category.
=== Block Expressions ===
Arguably, the first expressions to consider in the context of Maxima programming are '''''block''''' expressions. All <code>block</code> expressions as programming ingredients come in two flavors:
* <code>( expr<sub>1</sub>, expr<sub>2</sub>,…, expr<sub>n</sub> )</code>
* <code>block ([v<sub>1</sub>,v<sub>2,</sub>…,v<sub>m</sub>], expr<sub>1</sub>, expr<sub>2</sub>,…, expr<sub>n</sub>)</code>
The first form of a <code>block</code> expression is equivalent to the second form, but without the first list argument: <code>[v<sub>1</sub>,v<sub>2,</sub>…,v<sub>m</sub>]</code>, as in <code>block (expr<sub>1</sub>, expr<sub>2</sub>,…, expr<sub>n</sub></code>, unless <code>return</code> or <code>go</code> operators are used in the block expression. In that, case the form <code>block (expr<sub>1</sub>, expr<sub>2</sub>,…, expr<sub>n</sub>)</code> must be used. It should be noted that for Maxima to interpret of the syntax of the first of these forms as a block operator, there must be at least two expressions in the comma-separated sequence of expressions as arguments. Otherwise, Maxima will interpret the parentheses of this syntax as simply grouping related to the precedence order of operations.
The purpose of the list argument, <code>[v<sub>1</sub>,v<sub>2,</sub>…,v<sub>m</sub>]</code> is to declare the values of identifiers of the list to be local to the <code>block</code>. If there is no need for local identifiers, the list argument can be omitted (unless <code>return</code> or <code>go</code> operators are used in the <code>block</code> expression), and either form is sufficient.<syntaxhighlight lang="maxima">/* This block expression */
(%i1) (x : 2, x^2);
(%o1) 4
/* Is equivalent to this block expression */
(%i2) block (x : 2, x^2);
(%o2) 4</syntaxhighlight>So, in the case where values of identifiers local to the <code>block</code> of expressions are not required, then the choice of either form of the <code>block</code> expression is a matter of user preference. In both cases, the values of identifiers referenced in the <code>block</code> are global, and not local to the <code>block</code> expression. However, for the sake of clarity and consistency use of the latter form may be a better choice. <syntaxhighlight lang="maxima">
/* The value 3 assigned to x is global */
(%i3) x : 3;
(x) 3
/* The value 2 assigned to x in the block is global */
(%i4) (x : 2, x^2);
(%o4) 4
/* The global value assigned to x in the block is 2 not 3 */
(%i5) x;
(%o5) 2
</syntaxhighlight>Values of identifiers local to the <code>block</code> may not be global:<syntaxhighlight lang="maxima">/* the value of identifier y is local only */
(%i6) block ([y], y : 4, y);
(%o6) 4
/* the global value of identifier y is not 4, but is itself */
(%i7) y;
(%o7) y
/* the values of identifiers x and y are both local */
(%i8) block ([x,y], x : 3, y : 4, x);
(%o8) 3
/* the global value of identifier x is not 3, but is 2 */
(%i9) x;
(%o9) 2
/* the global value of identifier y is not 4, but is itself */
(%i10) y;
(%o10) y</syntaxhighlight>
Regardless of the form of the <code>block</code> expressions these have in common the comma-separated expression arguments <code>expr<sub>1</sub>, expr<sub>2</sub>,…, expr<sub>n</sub></code> which are evaluated each in turn from first to last (unless the evaluation sequence is modified by by the <code>go</code>, <code>throw</code>, or <code>return</code> operators), and the value of the block expression is the value of <code>expr<sub>n</sub></code>.
The main purpose of the <code>block</code> expression, regardless of the form, is to group expressions that are related in some manner, and the value of the last expression may be the only value of interest. However, there are very few limitations imposed on the nature of the <code>block</code> expression arguments, so it might be the case that the purpose of evaluating the <code>block</code> expression has been achieved before the last expression argument is evaluated, in which case the value of the <code>block</code> expression may not necessarily be the value of the last argument expression.
One way to accomplish that is to use an empty string as the last argument expression with the option flag <code>stringdisp</code> set to <code>false</code> which is the default value.<syntaxhighlight lang="maxima">
(%i11) stringdisp;
(%o11) false
(%i12) block ([x,y], x : 3, y : 4, x, "");
(%o12)
(%i13) block ([x,y], x : 3, y : 4, x)$
</syntaxhighlight>
The display of the value of the <code>block</code> expression may be suppressed using a <code>$</code> to end the input expression instead of a semi-colon. Either technique produces a <code>block</code> expression value, but the value is not displayed. If a <code>return</code> operator is evaluated as a argument expression, this will cause evaluation of expression arguments to end explicitly, and the value of the <code>return</code> operator becomes the value of the <code>block</code> expression.<syntaxhighlight lang="maxima">
(%i14) is (equal (x, 2));
(%o14) true
%i15) block (if is (equal (x, 2)) then return (x), " x not 2");
(%o15) 2
(%i16) x : 3;
(x) 3
(%i17) block (if is (equal (x, 2)) then return (x), "x not 2");
(%o17) x not 2
</syntaxhighlight>When a <code>return</code> operator is evaluated within a <code>block</code> expression the result is to stop evaluation of expressions within the enclosing <code>block</code> expression and to return the value of its argument as the value of the enclosing <code>block</code> expression. It therefore can be compared with the <code>return</code> statement found in other programming languages, but with one difference: In Maxima, the <code>return</code> operator affects only the block expression in which the <code>return</code> operator is an expression, and has no effect otherwise.<syntaxhighlight lang="maxima">(%i18) test_nested_block (val) :=
block (
[outer_var : 10],
print("Entering outer block expression"),
/* inner block expression */
block(
[inner_var : 20],
print (" Entering inner block expression"),
if val > 5 then
/* another inner block expression */
block (
print (" val > 5"),
print (" Returning only to inner block expression"),
return (inner_var + val)
/* returns only to the inner block expression */
),
/* end of another inner block expression */
print (" inner_var + val is ", inner_var + val)
),
/* end of inner block expression */
print ("Back in outer block expression"),
outer_var + val
/* end of outer block expression */
)$
(%i19) test_nested_block (1);
Entering outer block expression
Entering inner block expression
inner_var + val is 21
Back in outer block expression
(%o19) 11
(%i20) test_nested_block (6);
Entering outer block expression
Entering inner block expression
val > 5
Returning only to inner block expression
Back in outer block expression
(%o20) 16</syntaxhighlight>
'''''The <code>block</code> operators''''': Each instance may define local variables and has a comma-separated sequence of expressions as arguments.
'''''Nested blocks''''': There are three <code>block</code> operators used in the right-hand side of the function definition expression named <code>test_nested_block (val</code>. There is an outer <code>block</code> expression that has an inner <code>block</code> expression as an argument,and there is a third <code>block</code> expression that is an argument of the inner <code>block</code> expression.
'''''The <code>return</code> operator''''': If <code>val > 5</code> is <code>true</code> then the return operator of the most inner <code>block</code> expression is evaluated and evaluation of remaining expressions of that block expression does not occur. The value of that most inner <code>block</code> expression is the value of the argument of the return operator – <code>inner_var + val</code>.
Evaluation of expressions continues with the first expression of the inner <code>block</code> expression after the end of the most inner <code>block</code> expression – which is <code>print (" inner_var + val is ", inner_var + val)</code>. The value of the <code>print</code> operator is the value of <code>inner_var + val</code>. However, while that value is the value of the inner <code>block</code> expression it is effectively lost, as it is not the last expression of the outer <code>block</code> sequence of expressions. That value is the value of <code>outer_var + val</code>, which, being the last expression of the outer <code>block</code> is always the value of the function.
==== Block Expression Evaluation Sequence Modifications ====
<code>block</code> expression arguments <code>expr<sub>1</sub>, expr<sub>2</sub>,…, expr<sub>n</sub></code> are generally evaluated each in turn from first to last, and the value of the <code>block</code> expression is the value of <code>expr<sub>n</sub></code> unless this sequence is modified by some means.
One way to modify the first-to-last expression evaluation sequence of a <code>block</code> expression is by way of a <code>go</code> operator with a ''label'' (or ''"tag"'') argument ( the ''"go to"'') as the following exemplifies:<syntaxhighlight lang="maxima">
(%i18) sum_to_n (n) := block ( [i : 1, total : 0],
loop,
total : total + i,
i : i + 1,
if i <= n then go (loop),
total)$
(%i19) sum_to_n(25);
(%o19) 325
(%i20) n;
(%o20) n
(%i21) i;
(%o21) i
(%i22) total;
(%o22) total
</syntaxhighlight>
Note the following:
* <code>'''block ([ i : 1,total : 0], ...)'''</code>: The list argument creates a local environment with local identifiers <code>i</code> and <code>total</code>. The function argument <code>n</code> is also a local identifier.
* <code>'''loop'''</code>: This label serves as a target inside the <code>block</code> expression to where <code>go (loop)</code> can jump.
* <code>'''if i <= n then go (loop)'''</code>: This conditional expression causes the <code>go (loop)</code> operator to be evaluated if the condition is <code>true</code>.
* <code>'''total'''</code>: The value of this local identifier is the returned value of the <code>block</code> expression.
It should also be worth noting that the identifiers <code>n</code>, <code>i</code>, and <code>total</code> have local values assigned within the <code>block</code> expression, but their global values are themselves. Also notice that the identifiers <code>i</code> and <code>total</code> were both declared local and assigned initial values within the <code>block</code> list argument.
The ''go-to'' label argument of the <code>go</code> operator must be the name of a tag appearing within the same block expression. The <code>go</code> operator cannot be used to go to a tag in a different <code>block</code> expression. There is nothing special about the <code>loop</code> identifier name used for the go-to tag in this example. Other identifiers could be used, but they must be atomic.
Another way to modify a <code>block</code> expression evaluation sequence is by way of the <code>throw</code> operator.<syntaxhighlight lang="maxima">(%i32) /* Define a function using a block expression that searches
for a specific condition and a throw value to catch */
find_element (target_list, threshold) := block (
[found_val : false], /* local identifier value */
catch(
for x in target_list do
(
if x > threshold then
(
/* Immediately exit the block and
return this value */
throw (x)
)
),
/* This string is returned only if the do loop
finishes without a throw to catch */
"No element exceeded the threshold"
)
)$
(%i31) /* Test the block */
find_element ( [10, 20, 55, 80], 50 );
(%o31) 55</syntaxhighlight>This example unpacks as follows:
<code>'''catch (...)'''</code>: This expression creates a target scope that ''"catches"'' the value of any <code>throw</code> expression evaluated within that scope.
<code>'''throw (x)'''</code>: When Maxima encounters this operator, it immediately stops evaluation of the <code>do</code> loop expression '''''and the rest of the''''' <code>block</code> '''''expression.''''' It jumps directly out of the scope of the <code>catch</code> expression, returning the value of <code>x</code> as the value of the entire <code>catch</code> expression.
==== Nested Block Expressions ====
<code>block</code> operators may appear within other block expressions as arguments – '''''nested''''' <code>block</code> expressions. A local environment with local identifiers may be created for nested block expressions. Local values for identifiers, if declared by a first <code>block</code> operator list argument, are created each time a nested <code>block</code> is evaluated.
However, identifiers with global values that have not been declared as local within any <code>block</code> expressions, are global values for nested <code>block</code> expressions as well as enclosing <code>block</code> expressions. Likewise, local identifiers of any enclosing <code>block</code> expression have values that are global within any enclosed blocks, if not declared as local within the enclosed block. If the value of an identifier is not local in a <code>block</code> expression, its value is the value most recently assigned by an enclosing <code>block</code> expression, if any value has been assigned. Otherwise, it is the value of the identifier in the global environment. <syntaxhighlight lang="maxima">
(%i23) z : 2^(1/3);
(z) 2^(1/3)
(%i24) /* Outer block starts */
block
(
[x : 10, y : 20],
/* values of x and y declared local to outer block */
/* Inner block starts */
block
(
[y : 99, z : 100],
/* values of y and z declared local to inner block */
print ("Inside inner block:"),
print ("x =", x, "is the value of x from outer block"),
print ("y =", y, "is the local value of y of outer block"),
print("z =", z, "is the local value of z of inner block")
),
/* Inner block ends */
/* Outer block resumes */
print ("Back in outer block:"),
print ("x =", x, "is the value of x from outer block"),
print ("y =", y, "is the restored value of y of the outer block"),
print ("z =", z, "is the value of z global to both blocks")
/* Outer block ends */
)$
Inside inner block:
x = 10 is the value of x from outer block
y = 99 is the local value of y of outer block
z = 100 is the local value of z of inner block
Back in outer block:
x = 10 is the value of x from outer block
y = 20 is the restored value of y of the outer block
z = 2^(1/3) is the value of z global to both blocks
</syntaxhighlight>
==== Values, Properties, and the <code>local</code> Operator ====
The expression <code>local (v<sub>1</sub>, v<sub>2</sub>, ... , v<sub>m</sub>)</code> within a <code>block</code> expression saves the '''''properties''''' associated with the symbols <code>v<sub>1</sub>, v<sub>2</sub>, ... , v<sub>m</sub></code>, removes any properties before evaluating other expressions, and restores any saved properties on exit from the block.
Because Maxima is an application based on the Common Lisp programming language, it utilizes Lisp '''''symbol''''' structure. Lisp symbols are objects that carry their own "dictionary" of attributes. A Lisp symbol's internal property list (''plist'') is a built-in data structure attached directly to a symbol. Maxima uses this underlying Lisp symbol structure to associate '''''properties''''' with Maxima identifiers.
Properties of identifiers can be ''declared explicitly'' by users. <syntaxhighlight lang="maxima">
(%i23) declare (x, real);
(%o23) done
</syntaxhighlight>
However, some identifier property declarations are ''implemented implicitly'' as properties of a symbol, including <code>:=</code>, <code>array</code>, <code>dependencies</code>, <code>atvalue</code>, <code>matchdeclare</code>, <code>atomgrad</code>, <code>constant</code>, <code>nonscalar</code>, <code>assume</code>, and some others. Below is a description of how each of those specific declarations is implemented as a property under the hood:
====== Functions and Arrays ======
* '''<code>:=</code> (Function Definition):''' When you define a function using <code>f(x) := x^2</code>, the actual expression (<code>x^2</code>) and its argument list (<code>x</code>) are stored as a property of the symbol <code>f</code>.
* '''<code>array</code>:''' When you declare or use a subscripted array (like <code>a[i]</code>), the array type, dimensions, and memory pointer are attached as a property to the symbol <code>a</code>. This differentiates it from a standard scalar variable.
====== Calculus and Dependencies ======
* '''<code>dependencies</code>:''' If you declare <code>depends(y, x)</code>, Maxima attaches a dependency list property to <code>y</code> noting that it functionally depends on <code>x</code>. This tells the <code>diff</code> (differentiation) engine not to treat <code>y</code> as a constant relative to <code>x</code>.
* '''<code>atvalue</code>:''' When you define a specific value for an expression at a boundary point (e.g., <code>atvalue(y, x=0, 1)</code>), this boundary constraint is stored as an evaluation property on the symbol <code>y</code>.
* '''<code>atomgrad</code>:''' This assigns a specific gradient or derivative to an atomic identifier (e.g., telling Maxima what (df/dx) is explicitly). Maxima saves this rule as a gradient property on that symbol.
====== Pattern Matching and Rules ======
* '''<code>matchdeclare</code>:''' Used in Maxima's pattern-matching system (like <code>tellsimp</code>). When you type <code>matchdeclare(x, freeof(a))</code>, Maxima attaches a predicate property to <code>x</code>. When a pattern rule runs, Maxima looks at property list of <code>x</code> to see what conditions a matching expression must meet.
====== Mathematical and Evaluation Attributes ======
* '''<code>constant</code>:''' Declaring <code>declare(c, constant)</code> places a "constant" flag on property list of <code>c</code>. Core routines (like integration and differentiation) check this flag to know they can pull <code>c</code> out of integrals or differentiate it to zero.
* '''<code>nonscalar</code>:''' Tells Maxima to treat a symbol as a matrix or vector rather than a regular number. This property changes how operators like <code>.</code> (non-commutative multiplication) treat the symbol.
* '''<code>assume</code>:''' When an expression such as <code>assume(x > 0)</code> is used, Maxima's database system (<code>context</code>) assigns facts and properties (like <code>pos</code> or <code>nonnegative</code>) to the symbol <code>x</code>, allowing the simplifier to safely reduce expressions like <code>sqrt(x^2)</code> to <code>x</code>.
The effect of the <code>local</code> operator is to make such declarations effective only within a <code>block</code> expression. Otherwise, declarations within a <code>block</code> expression are considered to be global declarations.
So what does all of this mean to the typical Maxima user? It means that the list of identifiers that is the first argument of a <code>block</code> expression only declares the '''''values''''' of those identifiers as local to the <code>block</code> expression in which the list is an argument. Any properties of identifiers are not declared local by this means.
In order to declare '''''properties''''' of identifiers to be local to a <code>block</code> expression, the <code>local</code> operator must be used as an expression within the <code>block</code> expression. At the point where the local operator is evaluated as an argument of a <code>block</code> expression, the properties of the identifiers that are arguments to the <code>local</code> operator become local to the block. It is not an unfair criticism that perhaps the <code>local</code> operator should have been named something like <code>local_properties</code>. <syntaxhighlight lang="maxima">
(%i25) f (s) := cos (s);
(%o25) f(s):=cos(s)
(%i26) f (%pi/6);
(%o26) sqrt(3)/2
(%i27) block (local (f), f (s) := sin (s), f (%pi/6));
(%o27) 1/2
(%i28) f (s);
(%o28) cos(s)
</syntaxhighlight>In the above example, the '''''properties''''' of identifier <code>f</code> were declared to be local in the <code>block</code> expression using the <code>local</code> operator. However, global properties of the identifier <code>f</code> were not affected by the local function definition of <code>f</code> in the <code>block</code> expression. The global definition expression of <code>f</code> which is <code>cos (s)</code> and the argument <code>s</code> were not affected by the local definition of <code>f</code> because the properties of <code>f</code> were declared local to the <code>block</code> expression.
<code>block</code> expressions can be used for different purposes in the Maxima programming context. <code>block</code> expressions can be used in a stand-alone fashion or as part of an expression. However, <code>block</code> expressions are commonly used in expressions that define '''''functions''''', which is the topic that follows.
=== Functions ===
{| class="wikitable"
|+Function Definition Operators
and Identifiers
|<code>:=</code>
|<code>fundef</code>
|<code>buildq</code>
|-
|<code>::=</code>
|<code>lambda</code>
|<code>macros</code>
|-
|<code>define</code>
|<code>local</code>
|<code>slice</code>
|-
|<code>dispfun</code>
|<code>remfunction</code>
|
|-
|<code>functions</code>
|<code>setup_autoload</code>
|
|}
As a technical term '''''function''''' is aptly characterized as being overloaded. In the context of Maxima as a CAS, it has both a programming meaning and a mathematical meaning in terms of usage. In this book, the convention is to refer to what may otherwise be referred to as built-in Maxima functions as ''operators'' including those of built-in packages. By this convention, the term '''''function''''' in this book refers exclusively to expressions composed by the user by way of the <code>:=</code> or <code>define</code> operators.
As has been mentioned elsewhere in this book, what are conventionally termed ''operators'' that are built-in to Maxima, are at the level of underlying expression construction, Lisp procedures of one type or another. So it makes sense to simply refer to built-in Maxima functions and operators simply as operators one and all. This convention obviates the need for the repetitious use of qualifiers such as ''built-in Maxima'' and ''user-defined'' functions.
There are two operators used to define functions as follows:
# The <code>''''':='''''</code> operator
# The <code>'''define'''</code> operator
<var><code>f (x<sub>1</sub>, x<sub>2,</sub> ..., x<sub>n</sub>) ''':=''' expr</code>
<code>f</code> <code>[x<sub>1</sub>, x<sub>2,</sub> ..., x<sub>n</sub>] ''':=''' expr</code>
<code>f</code> <code>[x<sub>1</sub>, x<sub>2,</sub> ..., x<sub>n</sub>](y<sub>1</sub>, y<sub>2</sub>, ..., y<sub>m</sub>) ''':=''' expr</code></var>
<code>define (f</code> <code>(x<sub>1</sub>, x<sub>2,</sub> …, x<sub>n</sub>), expr)</code>
<code>define (f</code> <code>[x<sub>1</sub>, x<sub>2,</sub> …, x<sub>n</sub>], expr)</code>
<code>define (f</code> <code>[x<sub>1</sub>, x<sub>2,</sub> …, x<sub>n</sub>](y<sub>1</sub>, y<sub>2,</sub> …, y<sub>m</sub>), expr)</code>
<code>define (funmake (f, [</code><code>x<sub>1</sub>, x<sub>2,</sub> …, x<sub>n</sub>]), expr)</code>
<code>define (arraymake (f, [</code><code>x<sub>1</sub>, x<sub>2,</sub> …, x<sub>n</sub>]), expr)</code>
<code>define (ev (</code><code>expr<sub>1</sub>, expr<sub>2</sub>))</code>
where <code>expr</code> is some Maxima expression that is commonly referred to as the ''function body''. As can be concluded from the above, each of these operators has different forms of syntax that can be used. In any case, the most significant differences between these two operators are in terms of the evaluation of the function body and the composition and identification of functions dynamically.
* '''Evaluation:'''
** The <code>:=</code> operator '''suppresses (quotes)''' the evaluation of the function body when this operator is first evaluated. It does not evaluate or simplify the function body until the function identifier itself is evaluated with arguments.
** The <code>define()</code> operator '''evaluates''' the function body when this operator is first evaluated. If the function body involves intermediate computations, substituted values, or extracted parts of expressions (like <code>rhs()</code> or derivative results), the <code>define()</code> operator includes the evaluated results of those directly into the function body.
* '''Dynamic Function Composition and Identifiers:'''
** Function identifiers cannot easily be composed dynamically on the left-hand side of the <code>:=</code> operator when used inside programmatic loop expressions or in scripts.
** The <code>define()</code> operator accepts expressions like <code>funmake</code> or evaluated symbols as its first argument, allowing the composition and identification of functions dynamically during evaluation.
So, there are in general two different operators that can be used to define and evaluate functions. The choice by the Maxima user between these two operators depends on the purpose and context.
==== Function Definition Using the <code>:=</code> Operator ====
For the purpose of understanding the two ways of defining functions, consider the following example which is elementary, but in terms of clarification is not merely simple:<syntaxhighlight lang="maxima">/* "kill" all previously used identifier and values */
(%i29) kill (all);
(%o0) done
/* assign identifier x the global value of 5 */
(%i1) x : 5;
(x) 5
/* define f as a function with local argument x */
(%i2) f (x) := x;
(%o2) f(x):=x
/* evaluate f at local value of x is 3 */
(%i3) f (3);
(%o3) 3
/* the global value of x is not affected */
(%i4) x;
(%o4) 5
/* show the definition expression of the function named f */
(%i5) fundef (f);
(%o5) f(x):=x</syntaxhighlight>'''Function Definition Using the''' '''<code>define</code> Operator'''<syntaxhighlight lang="maxima">
/* define a function with identifier g with a
local argument y and with a function body
of identifier x */
(%i3) define (g('x), x);
(%o3) g(x):=5
/* identifier x of the function body is evaluated */
/* identifier x as an argument of g is local in scope */
(%i4) fundef (g);
(%o4) g(x):=5
/* the same identifier x used in three different roles */
/* used as the global name of a function x */
/* used as a local argument of a function */
/* used as an unevaluated expression for a function body */
(%i7) x(x) := x;
(%o7) x(x):=x
(%i9) x(3);
(%o9) 3
(%i10) x;
(%o10) 5
(%i8) fundef (x);
(%o8) x(x):=x
(%i11) define (x('x), x);
(%o11) x(x):=5
(%i12) fundef (x);
(%o12) x(x):=5
</syntaxhighlight>The purpose of this example is not to encourage this sort of syntax as a typical choice for identifiers and function definitions. The purpose is to clarify how Maxima implicitly determines the scope and meaning of identifiers used for function definition in the absence of any explicit user stipulations.
It should be noted that the <code>define</code> operator not only evaluates the expression that is the function body, it also evaluates the arguments of the function identifier that is the first argument of the <code>define</code> operator. Since there is a global value of the identifier <code>x</code> of <code>5</code>, it was necessary to suppress evaluation (quote) the argument in the expression <code>(%i12) define ('x), x);</code> as otherwise an error would be the result:<syntaxhighlight lang="maxima">
/* define a new function named x */
(%i14) define (x('x), 'x^2);
(%o14) x(x):=x^2
/* check the definition of the new function named x */
(%i15) fundef (x);
(%o15) x(x):=x^2
/* the identifier x has a global value */
(%i16) values;
(%o16) [x]
/* the global value of identifier x is 5 */
(%i17) x;
(%o17) 5
/* the suppressed global value 'x of identifier x is x */
(%i18) 'x;
(%o18) x
/* not quoting the global value of identifier x is an error */
(%i19) define (x(x), 'x^2);
define: in definition of x, parameter must be a symbol and must not be a system constant; found: 5
-- an error. To debug this try: debugmode(true);
</syntaxhighlight>
==== Understanding the Differences Between the <code>:=</code> and <code>define</code> Operators ====
In cases such as these, the suppression of evaluation by quoting is a user stipulation as to evaluation. Users must be aware of these differences between the two operators (<code>:=</code> and <code>define</code>) for the purpose of function definition in order to achieve what is intended and to avoid errors,<syntaxhighlight lang="maxima">
(%i20) f (x) := 3*x^3 + 4*x - 5;
(%o20) f(x):=3*x^3+4*x-5
(%i21) fundef (f);
(%o21) f(x):=3*x^3+4*x-5
(%i22) f(2);
(%o22) 27
(%i23) define (f (x) , 3*x^3 + 4*x - 5);
define: in definition of f, parameter must be a symbol and must not be a system constant; found: 5
-- an error. To debug this try: debugmode(true);
(%i24) define (f ('x) , 3*x^3 + 4*x - 5);
(%o24) f(x):=390
(%i25) define (f ('x) , '(3*x^3 + 4*x - 5));
(%o25) f(x):=3*x^3+4*x-5
(%i26) fundef (f);
(%o26) f(x):=3*x^3+4*x-5
(%i27) f(2);
(%o27) 27
</syntaxhighlight>What is true in the case of these elementary examples is true in general for function definitions involving multiple arguments:<syntaxhighlight lang="maxima">
/* x has a global value of 5 while y is local to g */
(%i28) g (x, y) := x^3 - y^2;
(%o28) g(x,y):=x^3-y^2
(%i29) g (6,2);
(%o29) 212
(%i30) define (g('x, y), 'x^3 - y^2);
(%o30) g(x,y):=x^3-y^2
(%i31) values;
(%o31) [x]
(%i32) g (6,2);
(%o32) 212
</syntaxhighlight>The <code>define</code> operator is a good choice in cases where an existing expression is used as the function body:<syntaxhighlight lang="maxima">
(%i33) /* assign an expression to identifier expr */
expr : diff('x^3, 'x); /* Returns 3*x^2 */
(expr) 3*x^2
(%i34) /* evaluate expr and define h (x) := 3*x^2 */
define (h ('x), expr);
(%o34) h(x):=3*x^2
</syntaxhighlight>In cases in which functions require local variables or more than one expression for the function body, use the block operator:<syntaxhighlight lang="maxima">
(%i35) remvalue (x);
(%o35) [x]
(%i36) values;
(%o36) [expr]
--> power_sum (x, y) := block (
/* values of these identifiers are explicitly local to the function */
[sqx, sqy],
/* unevaluated identifiers x and y are local arguments of the function
and values of these identifiers are implicitly local to the function */
sqx : x^2,
sqy : y^2,
sqx + sqy /* the value of the function */
)$
(%i37) fundef (power_sum);
(%o37) power_sum(x,y):=block([sqx,sqy],sqx:x^2,sqy:y^2,sqx+sqy)
(%i38) power_sum (3,4);
(%o38) 25
</syntaxhighlight>The <code>define</code> operator could also be used to define this function, but with different definition values as a consequence:<syntaxhighlight lang="maxima">(%i39) define (power_sum (x,y),
block (
[sqx,sqy],
sqx : x^2,
sqy : y^2,
sqx + sqy
)
)$
(%i40) fundef (power_sum);
(%o40) power_sum(x,y):=y^2+x^2
(%i41) power_sum (3,4);
(%o41) 25</syntaxhighlight>The function definition of <code>power_sum</code> is different using the <code>define</code> operator instead of the <code>:=</code> operator. The value of the function when referenced with arguments (<code>power_sum (3,4)</code>) is the same in both cases – <code>25</code>. However, in general for defining functions, this may not be the case. The choice between these two operators depends on the intentions of the user.
==== Practical Considerations Related to Function Composition ====
In general, programming is a technical skill as well as a subjective art. So, absolute rules are not offered here. For practical purposes some "guidelines" are offered here that may be useful for Maxima function composition as well as Maxima programming in general:
*
*
*
*
*
Consider the following linear algebraic equation:
<math display="block">3y - 7x = 10</math>
As an example suppose the value that is sought is the slope <code>m</code> of this equation, and in general, the slope of any linear equation regardless of the form. <syntaxhighlight lang="maxima">/* assign the linear equation to an identifier */
(%i42) lineqn : 3*y - 7*x = 10;
(lineqn) 3*y-7*x=10
/* solve the linear equation for y */
(%i43) solve([lineqn], [y])
(%o43) [y=(7*x+10)/3]
/* use the index [1] of the list to get the solved equation */
(%i44) solve([lineqn], [y])[1]
(%o44) y=(7*x+10)/3
/* use the rhs operator to get right-hand side */
(%i45) rhs(solve([lineqn], [y])[1]);
(%o45) (7*x+10)/3
/* use the expand operator change the RHS */
(%i46) expand(rhs(solve([lineqn], [y])[1]));
(%o46) (7*x)/3+10/3
/* use the coeff operator to get the coefficient of x */
(%i47) coeff(expand(rhs(solve([lineqn], [y])[1])),x,1);
(%o47) 7/3
/* define the function with an argument eqn for lineqn */
(%i48) m (eqn) := coeff (expand (rhs (solve ([eqn], [y])[1])),x,1)$
/* check the function definition */
(%i49) fundef (m);
(%o49) m(eqn):=coeff(expand(rhs((solve([eqn],[y]))[1])),x,1)
/* reference the function using lineqn as an argument */
(%i50) m (lineqn);
(%o50) 7/3
/* assign a different linear equation to lineqn */
(%i51) lineqn : x = 6*y + 13;
(lineqn) x=6*y+13
/* reference the function using lineqn as an argument */
%i52) m (lineqn);
(%o52) 1/6</syntaxhighlight>The function body of this example will result in an error if it is used with the <code>define</code> operator:<syntaxhighlight lang="maxima">
(%i53) define (
m (eqn),
coeff (expand (rhs (solve ([eqn], [y])[1])),x,1)
)$
inpart: invalid index 1 of list or matrix.
-- an error. To debug this try: debugmode(true);
</syntaxhighlight>This error is a consequence of the evaluation that occurs when using the <code>define</code> operator. In this case, this evaluation results in a reference to the indexed value of a list object that does not exist when evaluation occurs during definition – <code>solve ([eqn], [y])[1]</code>.
==== Memoizing Functions ====
The functions discussed so far are often referred to as '''''ordinary functions'''''. The arguments of ordinary functions are enclosed using parentheses – <var><code>(x<sub>1</sub>, x<sub>2,</sub> ..., x<sub>n</sub>)</code>.</var> Function definition forms which include arguments enclosed by brackets (as in <var><code>[x<sub>1</sub>, x<sub>2,</sub> ..., x<sub>n</sub>]</code></var>) are called '''''memoizing functions'''''.
Memoizing functions can be categorized both as functions and as data structures – specifically a ''hashed array'' of values. Memoizing functions are also referred to as '''''array functions'''''. In any case, memoizing functions can be defined using either the <code>:=</code> operator or the <code>define</code> operator.
If the form of the function definition expression is <code>f [x<sub>1</sub>, x<sub>2</sub>,..., x<sub>n</sub>] := expr</code> The function body <code>expr</code> is evaluated once for each individual value of the arguments, and that value is the value of the function, without again evaluating the function body, whenever referenced using arguments that have those same values.
Once evaluated during a function reference with arguments, that value of a memoizing function is thereby "frozen" in other words. This frozen value also becomes an instance of a hashed array data structure that can be referenced by way of the value of the index used as an argument when first evaluated.
In keeping with previous practice, the examples provided here are intentionally elementary for the purpose of demonstrating and clarifying the technical aspects involved. There is thereby no intention to convey that the composition of function definition expressions with multiple arguments and complex expressions for the function body is ruled out or of lesser practical value. <syntaxhighlight lang="maxima">/* define a memoizing function f */
/* x and n may serve as both arguments and array indices */
(%i54) f [x, n] := x^n;
(%o54) f[x,n]:=x^n
/* check the array information for f */
(%i55) arrayinfo (f);
(%o55) [hashed,2]
/* f does not appear in the list of functions */
(%i56) functions;
(%o56) [m(lineqn)]
/* reference f with argument values */
(%i57) f [2,3] ;
(%o57) 8
/* check the array information for f again */
(%i58) arrayinfo (f);
(%o58) [hashed,2,[2,3]]
/* list the array values of f */
(%i59) listarray (f);
(%o59) [8]
/* f does appear in the list of arrays */
(%i60) arrays;
(%o60) [f]
/* reference f with new argument values */
(%i61) f [5,2];
(%o61) 25
/* check the array information for f again */
(%i62) arrayinfo (f);
(%o62) [hashed,2,[2,3],[5,2]]
/* list the array values of f */
(%i63) listarray (f);
(%o63) [8,25]</syntaxhighlight>An expression of the form <code>define (f [x1, x2</code><code>,…, xn], expr)</code> may also be used to define the same memoizing function <code>f</code> in this case as the evaluation imposed by the <code>define</code> operator during evaluation of these function arguments and this function body that occurs makes no difference:<syntaxhighlight lang="maxima">
/* remove the function definition and values of f */
(%i64) remarray (f);
(%o64) [f]
/* the list of arrays is now empty */
(%i65) arrays;
(%o65) []
/* define the same memoizing function f using the define operator */
/* evaluation makes no difference to the definition of f in this case */
(%i66) define (f [x,n], x^n);
(%o66) f[x,n]:=x^n
/* reference f with different argument values */
(%i67) f [3, 2];
(%o67) 9
/* reference f again with different argument values */
(%i68) f [2, 5];
(%o68) 32
/* f again appears in the list of arrays */
(%i69) arrays;
(%o69) [f]
/* check the array information for f */
(%i70) arrayinfo (f);
(%o70) [hashed,2,[2,5],[3,2]]
/* list the array values of f */
(%i71) listarray (f);
(%o71) [32,9]
</syntaxhighlight>
===== Special Forms of Memoizing Functions =====
An expression of the form <code>f [x<sub>1</sub>, x<sub>2</sub>,..., x<sub>n</sub>](y<sub>1</sub>, y<sub>2</sub>,..., y<sub>m</sub>):= expr</code>, or alternatively of the form <code>define (f [x1, x2</code><code>,…, xn](y<sub>1</sub>, y<sub>2</sub>,..., y<sub>m</sub>), expr)</code>, may also be used to define a memoizing function named <code>f</code>. When either of these forms are used to compose a function definition expression, there is a sense in which the resulting function is a hybrid – part memoizing function, and part "ordinary" function. These forms create a hashed array of functions where the array subscripts <code>[x<sub>1</sub>, x<sub>2</sub>,..., x<sub>n</sub>]</code> evaluate immediately to "specialize" the function body, while the ordinary function arguments <code>(y<sub>1</sub>, y<sub>2</sub>,..., y<sub>m</sub>)</code> are used when evaluating these individual functions.<syntaxhighlight lang="maxima">/* Define a family of "shifted" power functions */
(%i72) define( p[n](x), x^n + n );
(%o72) p[n](x):=x^n+n
(%i73) p[2];
(%o73) lambda([x],x^2+2)
(%i74) p[2](5);
(%o74) 27
(%i75) p[4];
(%o75) lambda([x],x^4+4)
(%i76) p[4](5);
(%o76) 629
(%i77) arrayinfo (p);
(%o77) [hashed,1,[2],[4]]
(%i78) listarray (p)
(%o78) [lambda([x],x^2+2),lambda([x],x^4+4)]
(%i79) p[5];
(%o79) lambda([x],x^5+5)
(%i80) p[5](2);
(%o80) 37
(%i81) listarray (p);
(%o81) [lambda([x],x^2+2),lambda([x],x^4+4),lambda([x],x^5+5)]
(%i82) arrayinfo (p);
(%o82) [hashed,1,[2],[4],[5]]</syntaxhighlight>
==== Lambda Expressions ====
==== Special Forms of the <code>define</code> Operator ====
==== Some Techniques for Function Composition ====
=== Conditional Expressions – Special Operator <code>if</code> ===
=== Expressions for Iteration – Special Operator <code>do</code> ===
The special operator <code>do</code> is used to compose expressions for iteration. It is typically used with the following other special operators:
* <code>while</code>
* <code>unless</code>
* <code>for</code>
* <code>from</code>
* <code>thru</code>
* <code>step</code>
* <code>next</code>
* <code>in</code>
The general forms of <code>do</code> expressions Maxima supports are:
<code>for</code> variable: initial_value <code>step</code> increment <code>thru</code> limit <code>do</code> body
<code>for</code> variable: initial_value <code>step</code> increment <code>while</code> condition <code>do</code> body
<code>for</code> variable: initial_value <code>step</code> increment <code>unless</code> condition <code>do</code> body
<code>for</code> variable <code>in</code> list <code>do</code> body
<code>for</code> variable <code>in</code> expr <code>do</code> body
<code>for</code> variable <code>in</code> hash_table <code>do</code> body
=== Lisp and Maxima ===
{{BookCat}}
fdxd0wni6u69dvyosk8zmyqoet5webh
4676573
4676537
2026-10-17T19:40:40Z
Idavidmiller
3577687
/* Special Forms of Memoizing Functions */ Work in progress. Saving Changes.
4676573
wikitext
text/x-wiki
=Maxima Programming=
Although Maxima is not a general-purpose programming language, Maxima as a CAS includes among the built-in ingredients a relatively complete set of programming expressions that are useful for the intended context. Many of the code examples of this section are intended to be illustrative of technical details relevant to Maxima programming as their purpose, and consequently are intentionally elementary in character.
Learning any sort of programming language, including Maxima programming expressions, is a subjective process. In any case, it is essential to have enough technical know-how specific to the programming language in order to begin the learning process, even in cases where much positive transfer from other programming experience is involved.
Much can be accomplished mathematically using Maxima without having to resort to in-depth knowledge and proficiency in the technical details of Maxima programming expressions. However, Maxima programming expressions are frequently essential for the purpose of defining functions, both in the programming sense of the term, but also more relevantly, for the mathematical sense. For that reason alone, familiarity and sufficient proficiency with Maxima programming expressions should be given some attention.
One way to begin the learning process is to become familiar with enough of the programming essentials to accomplish independent efforts toward accomplishing some specific programming goal of interest. The other way is to study the many available programming expressions of others. This section is intended to provide the essentials toward learning by whatever means are chosen.
The following table shows some built-in ingredients related to Maxima programming expressions:
{| class="wikitable"
|+Maxima Programming Category
|if
|unless
|errcatch
|prederror
|-
|block
|for
|error
|return
|-
|catch
|from
|warning
|throw
|-
|local
|thru
|errormsg
|sstatus
|-
|garbage_collect
|step
|errormsg
|status
|-
|do
|next
|go
|
|-
|while
|in
|
|
|}
Some of these programming expression ingredients can also be considered as belonging to one or more other categories than the Programming category.
=== Block Expressions ===
Arguably, the first expressions to consider in the context of Maxima programming are '''''block''''' expressions. All <code>block</code> expressions as programming ingredients come in two flavors:
* <code>( expr<sub>1</sub>, expr<sub>2</sub>,…, expr<sub>n</sub> )</code>
* <code>block ([v<sub>1</sub>,v<sub>2,</sub>…,v<sub>m</sub>], expr<sub>1</sub>, expr<sub>2</sub>,…, expr<sub>n</sub>)</code>
The first form of a <code>block</code> expression is equivalent to the second form, but without the first list argument: <code>[v<sub>1</sub>,v<sub>2,</sub>…,v<sub>m</sub>]</code>, as in <code>block (expr<sub>1</sub>, expr<sub>2</sub>,…, expr<sub>n</sub></code>, unless <code>return</code> or <code>go</code> operators are used in the block expression. In that, case the form <code>block (expr<sub>1</sub>, expr<sub>2</sub>,…, expr<sub>n</sub>)</code> must be used. It should be noted that for Maxima to interpret of the syntax of the first of these forms as a block operator, there must be at least two expressions in the comma-separated sequence of expressions as arguments. Otherwise, Maxima will interpret the parentheses of this syntax as simply grouping related to the precedence order of operations.
The purpose of the list argument, <code>[v<sub>1</sub>,v<sub>2,</sub>…,v<sub>m</sub>]</code> is to declare the values of identifiers of the list to be local to the <code>block</code>. If there is no need for local identifiers, the list argument can be omitted (unless <code>return</code> or <code>go</code> operators are used in the <code>block</code> expression), and either form is sufficient.<syntaxhighlight lang="maxima">/* This block expression */
(%i1) (x : 2, x^2);
(%o1) 4
/* Is equivalent to this block expression */
(%i2) block (x : 2, x^2);
(%o2) 4</syntaxhighlight>So, in the case where values of identifiers local to the <code>block</code> of expressions are not required, then the choice of either form of the <code>block</code> expression is a matter of user preference. In both cases, the values of identifiers referenced in the <code>block</code> are global, and not local to the <code>block</code> expression. However, for the sake of clarity and consistency use of the latter form may be a better choice. <syntaxhighlight lang="maxima">
/* The value 3 assigned to x is global */
(%i3) x : 3;
(x) 3
/* The value 2 assigned to x in the block is global */
(%i4) (x : 2, x^2);
(%o4) 4
/* The global value assigned to x in the block is 2 not 3 */
(%i5) x;
(%o5) 2
</syntaxhighlight>Values of identifiers local to the <code>block</code> may not be global:<syntaxhighlight lang="maxima">/* the value of identifier y is local only */
(%i6) block ([y], y : 4, y);
(%o6) 4
/* the global value of identifier y is not 4, but is itself */
(%i7) y;
(%o7) y
/* the values of identifiers x and y are both local */
(%i8) block ([x,y], x : 3, y : 4, x);
(%o8) 3
/* the global value of identifier x is not 3, but is 2 */
(%i9) x;
(%o9) 2
/* the global value of identifier y is not 4, but is itself */
(%i10) y;
(%o10) y</syntaxhighlight>
Regardless of the form of the <code>block</code> expressions these have in common the comma-separated expression arguments <code>expr<sub>1</sub>, expr<sub>2</sub>,…, expr<sub>n</sub></code> which are evaluated each in turn from first to last (unless the evaluation sequence is modified by by the <code>go</code>, <code>throw</code>, or <code>return</code> operators), and the value of the block expression is the value of <code>expr<sub>n</sub></code>.
The main purpose of the <code>block</code> expression, regardless of the form, is to group expressions that are related in some manner, and the value of the last expression may be the only value of interest. However, there are very few limitations imposed on the nature of the <code>block</code> expression arguments, so it might be the case that the purpose of evaluating the <code>block</code> expression has been achieved before the last expression argument is evaluated, in which case the value of the <code>block</code> expression may not necessarily be the value of the last argument expression.
One way to accomplish that is to use an empty string as the last argument expression with the option flag <code>stringdisp</code> set to <code>false</code> which is the default value.<syntaxhighlight lang="maxima">
(%i11) stringdisp;
(%o11) false
(%i12) block ([x,y], x : 3, y : 4, x, "");
(%o12)
(%i13) block ([x,y], x : 3, y : 4, x)$
</syntaxhighlight>
The display of the value of the <code>block</code> expression may be suppressed using a <code>$</code> to end the input expression instead of a semi-colon. Either technique produces a <code>block</code> expression value, but the value is not displayed. If a <code>return</code> operator is evaluated as a argument expression, this will cause evaluation of expression arguments to end explicitly, and the value of the <code>return</code> operator becomes the value of the <code>block</code> expression.<syntaxhighlight lang="maxima">
(%i14) is (equal (x, 2));
(%o14) true
%i15) block (if is (equal (x, 2)) then return (x), " x not 2");
(%o15) 2
(%i16) x : 3;
(x) 3
(%i17) block (if is (equal (x, 2)) then return (x), "x not 2");
(%o17) x not 2
</syntaxhighlight>When a <code>return</code> operator is evaluated within a <code>block</code> expression the result is to stop evaluation of expressions within the enclosing <code>block</code> expression and to return the value of its argument as the value of the enclosing <code>block</code> expression. It therefore can be compared with the <code>return</code> statement found in other programming languages, but with one difference: In Maxima, the <code>return</code> operator affects only the block expression in which the <code>return</code> operator is an expression, and has no effect otherwise.<syntaxhighlight lang="maxima">(%i18) test_nested_block (val) :=
block (
[outer_var : 10],
print("Entering outer block expression"),
/* inner block expression */
block(
[inner_var : 20],
print (" Entering inner block expression"),
if val > 5 then
/* another inner block expression */
block (
print (" val > 5"),
print (" Returning only to inner block expression"),
return (inner_var + val)
/* returns only to the inner block expression */
),
/* end of another inner block expression */
print (" inner_var + val is ", inner_var + val)
),
/* end of inner block expression */
print ("Back in outer block expression"),
outer_var + val
/* end of outer block expression */
)$
(%i19) test_nested_block (1);
Entering outer block expression
Entering inner block expression
inner_var + val is 21
Back in outer block expression
(%o19) 11
(%i20) test_nested_block (6);
Entering outer block expression
Entering inner block expression
val > 5
Returning only to inner block expression
Back in outer block expression
(%o20) 16</syntaxhighlight>
'''''The <code>block</code> operators''''': Each instance may define local variables and has a comma-separated sequence of expressions as arguments.
'''''Nested blocks''''': There are three <code>block</code> operators used in the right-hand side of the function definition expression named <code>test_nested_block (val</code>. There is an outer <code>block</code> expression that has an inner <code>block</code> expression as an argument,and there is a third <code>block</code> expression that is an argument of the inner <code>block</code> expression.
'''''The <code>return</code> operator''''': If <code>val > 5</code> is <code>true</code> then the return operator of the most inner <code>block</code> expression is evaluated and evaluation of remaining expressions of that block expression does not occur. The value of that most inner <code>block</code> expression is the value of the argument of the return operator – <code>inner_var + val</code>.
Evaluation of expressions continues with the first expression of the inner <code>block</code> expression after the end of the most inner <code>block</code> expression – which is <code>print (" inner_var + val is ", inner_var + val)</code>. The value of the <code>print</code> operator is the value of <code>inner_var + val</code>. However, while that value is the value of the inner <code>block</code> expression it is effectively lost, as it is not the last expression of the outer <code>block</code> sequence of expressions. That value is the value of <code>outer_var + val</code>, which, being the last expression of the outer <code>block</code> is always the value of the function.
==== Block Expression Evaluation Sequence Modifications ====
<code>block</code> expression arguments <code>expr<sub>1</sub>, expr<sub>2</sub>,…, expr<sub>n</sub></code> are generally evaluated each in turn from first to last, and the value of the <code>block</code> expression is the value of <code>expr<sub>n</sub></code> unless this sequence is modified by some means.
One way to modify the first-to-last expression evaluation sequence of a <code>block</code> expression is by way of a <code>go</code> operator with a ''label'' (or ''"tag"'') argument ( the ''"go to"'') as the following exemplifies:<syntaxhighlight lang="maxima">
(%i18) sum_to_n (n) := block ( [i : 1, total : 0],
loop,
total : total + i,
i : i + 1,
if i <= n then go (loop),
total)$
(%i19) sum_to_n(25);
(%o19) 325
(%i20) n;
(%o20) n
(%i21) i;
(%o21) i
(%i22) total;
(%o22) total
</syntaxhighlight>
Note the following:
* <code>'''block ([ i : 1,total : 0], ...)'''</code>: The list argument creates a local environment with local identifiers <code>i</code> and <code>total</code>. The function argument <code>n</code> is also a local identifier.
* <code>'''loop'''</code>: This label serves as a target inside the <code>block</code> expression to where <code>go (loop)</code> can jump.
* <code>'''if i <= n then go (loop)'''</code>: This conditional expression causes the <code>go (loop)</code> operator to be evaluated if the condition is <code>true</code>.
* <code>'''total'''</code>: The value of this local identifier is the returned value of the <code>block</code> expression.
It should also be worth noting that the identifiers <code>n</code>, <code>i</code>, and <code>total</code> have local values assigned within the <code>block</code> expression, but their global values are themselves. Also notice that the identifiers <code>i</code> and <code>total</code> were both declared local and assigned initial values within the <code>block</code> list argument.
The ''go-to'' label argument of the <code>go</code> operator must be the name of a tag appearing within the same block expression. The <code>go</code> operator cannot be used to go to a tag in a different <code>block</code> expression. There is nothing special about the <code>loop</code> identifier name used for the go-to tag in this example. Other identifiers could be used, but they must be atomic.
Another way to modify a <code>block</code> expression evaluation sequence is by way of the <code>throw</code> operator.<syntaxhighlight lang="maxima">(%i32) /* Define a function using a block expression that searches
for a specific condition and a throw value to catch */
find_element (target_list, threshold) := block (
[found_val : false], /* local identifier value */
catch(
for x in target_list do
(
if x > threshold then
(
/* Immediately exit the block and
return this value */
throw (x)
)
),
/* This string is returned only if the do loop
finishes without a throw to catch */
"No element exceeded the threshold"
)
)$
(%i31) /* Test the block */
find_element ( [10, 20, 55, 80], 50 );
(%o31) 55</syntaxhighlight>This example unpacks as follows:
<code>'''catch (...)'''</code>: This expression creates a target scope that ''"catches"'' the value of any <code>throw</code> expression evaluated within that scope.
<code>'''throw (x)'''</code>: When Maxima encounters this operator, it immediately stops evaluation of the <code>do</code> loop expression '''''and the rest of the''''' <code>block</code> '''''expression.''''' It jumps directly out of the scope of the <code>catch</code> expression, returning the value of <code>x</code> as the value of the entire <code>catch</code> expression.
==== Nested Block Expressions ====
<code>block</code> operators may appear within other block expressions as arguments – '''''nested''''' <code>block</code> expressions. A local environment with local identifiers may be created for nested block expressions. Local values for identifiers, if declared by a first <code>block</code> operator list argument, are created each time a nested <code>block</code> is evaluated.
However, identifiers with global values that have not been declared as local within any <code>block</code> expressions, are global values for nested <code>block</code> expressions as well as enclosing <code>block</code> expressions. Likewise, local identifiers of any enclosing <code>block</code> expression have values that are global within any enclosed blocks, if not declared as local within the enclosed block. If the value of an identifier is not local in a <code>block</code> expression, its value is the value most recently assigned by an enclosing <code>block</code> expression, if any value has been assigned. Otherwise, it is the value of the identifier in the global environment. <syntaxhighlight lang="maxima">
(%i23) z : 2^(1/3);
(z) 2^(1/3)
(%i24) /* Outer block starts */
block
(
[x : 10, y : 20],
/* values of x and y declared local to outer block */
/* Inner block starts */
block
(
[y : 99, z : 100],
/* values of y and z declared local to inner block */
print ("Inside inner block:"),
print ("x =", x, "is the value of x from outer block"),
print ("y =", y, "is the local value of y of outer block"),
print("z =", z, "is the local value of z of inner block")
),
/* Inner block ends */
/* Outer block resumes */
print ("Back in outer block:"),
print ("x =", x, "is the value of x from outer block"),
print ("y =", y, "is the restored value of y of the outer block"),
print ("z =", z, "is the value of z global to both blocks")
/* Outer block ends */
)$
Inside inner block:
x = 10 is the value of x from outer block
y = 99 is the local value of y of outer block
z = 100 is the local value of z of inner block
Back in outer block:
x = 10 is the value of x from outer block
y = 20 is the restored value of y of the outer block
z = 2^(1/3) is the value of z global to both blocks
</syntaxhighlight>
==== Values, Properties, and the <code>local</code> Operator ====
The expression <code>local (v<sub>1</sub>, v<sub>2</sub>, ... , v<sub>m</sub>)</code> within a <code>block</code> expression saves the '''''properties''''' associated with the symbols <code>v<sub>1</sub>, v<sub>2</sub>, ... , v<sub>m</sub></code>, removes any properties before evaluating other expressions, and restores any saved properties on exit from the block.
Because Maxima is an application based on the Common Lisp programming language, it utilizes Lisp '''''symbol''''' structure. Lisp symbols are objects that carry their own "dictionary" of attributes. A Lisp symbol's internal property list (''plist'') is a built-in data structure attached directly to a symbol. Maxima uses this underlying Lisp symbol structure to associate '''''properties''''' with Maxima identifiers.
Properties of identifiers can be ''declared explicitly'' by users. <syntaxhighlight lang="maxima">
(%i23) declare (x, real);
(%o23) done
</syntaxhighlight>
However, some identifier property declarations are ''implemented implicitly'' as properties of a symbol, including <code>:=</code>, <code>array</code>, <code>dependencies</code>, <code>atvalue</code>, <code>matchdeclare</code>, <code>atomgrad</code>, <code>constant</code>, <code>nonscalar</code>, <code>assume</code>, and some others. Below is a description of how each of those specific declarations is implemented as a property under the hood:
====== Functions and Arrays ======
* '''<code>:=</code> (Function Definition):''' When you define a function using <code>f(x) := x^2</code>, the actual expression (<code>x^2</code>) and its argument list (<code>x</code>) are stored as a property of the symbol <code>f</code>.
* '''<code>array</code>:''' When you declare or use a subscripted array (like <code>a[i]</code>), the array type, dimensions, and memory pointer are attached as a property to the symbol <code>a</code>. This differentiates it from a standard scalar variable.
====== Calculus and Dependencies ======
* '''<code>dependencies</code>:''' If you declare <code>depends(y, x)</code>, Maxima attaches a dependency list property to <code>y</code> noting that it functionally depends on <code>x</code>. This tells the <code>diff</code> (differentiation) engine not to treat <code>y</code> as a constant relative to <code>x</code>.
* '''<code>atvalue</code>:''' When you define a specific value for an expression at a boundary point (e.g., <code>atvalue(y, x=0, 1)</code>), this boundary constraint is stored as an evaluation property on the symbol <code>y</code>.
* '''<code>atomgrad</code>:''' This assigns a specific gradient or derivative to an atomic identifier (e.g., telling Maxima what (df/dx) is explicitly). Maxima saves this rule as a gradient property on that symbol.
====== Pattern Matching and Rules ======
* '''<code>matchdeclare</code>:''' Used in Maxima's pattern-matching system (like <code>tellsimp</code>). When you type <code>matchdeclare(x, freeof(a))</code>, Maxima attaches a predicate property to <code>x</code>. When a pattern rule runs, Maxima looks at property list of <code>x</code> to see what conditions a matching expression must meet.
====== Mathematical and Evaluation Attributes ======
* '''<code>constant</code>:''' Declaring <code>declare(c, constant)</code> places a "constant" flag on property list of <code>c</code>. Core routines (like integration and differentiation) check this flag to know they can pull <code>c</code> out of integrals or differentiate it to zero.
* '''<code>nonscalar</code>:''' Tells Maxima to treat a symbol as a matrix or vector rather than a regular number. This property changes how operators like <code>.</code> (non-commutative multiplication) treat the symbol.
* '''<code>assume</code>:''' When an expression such as <code>assume(x > 0)</code> is used, Maxima's database system (<code>context</code>) assigns facts and properties (like <code>pos</code> or <code>nonnegative</code>) to the symbol <code>x</code>, allowing the simplifier to safely reduce expressions like <code>sqrt(x^2)</code> to <code>x</code>.
The effect of the <code>local</code> operator is to make such declarations effective only within a <code>block</code> expression. Otherwise, declarations within a <code>block</code> expression are considered to be global declarations.
So what does all of this mean to the typical Maxima user? It means that the list of identifiers that is the first argument of a <code>block</code> expression only declares the '''''values''''' of those identifiers as local to the <code>block</code> expression in which the list is an argument. Any properties of identifiers are not declared local by this means.
In order to declare '''''properties''''' of identifiers to be local to a <code>block</code> expression, the <code>local</code> operator must be used as an expression within the <code>block</code> expression. At the point where the local operator is evaluated as an argument of a <code>block</code> expression, the properties of the identifiers that are arguments to the <code>local</code> operator become local to the block. It is not an unfair criticism that perhaps the <code>local</code> operator should have been named something like <code>local_properties</code>. <syntaxhighlight lang="maxima">
(%i25) f (s) := cos (s);
(%o25) f(s):=cos(s)
(%i26) f (%pi/6);
(%o26) sqrt(3)/2
(%i27) block (local (f), f (s) := sin (s), f (%pi/6));
(%o27) 1/2
(%i28) f (s);
(%o28) cos(s)
</syntaxhighlight>In the above example, the '''''properties''''' of identifier <code>f</code> were declared to be local in the <code>block</code> expression using the <code>local</code> operator. However, global properties of the identifier <code>f</code> were not affected by the local function definition of <code>f</code> in the <code>block</code> expression. The global definition expression of <code>f</code> which is <code>cos (s)</code> and the argument <code>s</code> were not affected by the local definition of <code>f</code> because the properties of <code>f</code> were declared local to the <code>block</code> expression.
<code>block</code> expressions can be used for different purposes in the Maxima programming context. <code>block</code> expressions can be used in a stand-alone fashion or as part of an expression. However, <code>block</code> expressions are commonly used in expressions that define '''''functions''''', which is the topic that follows.
=== Functions ===
{| class="wikitable"
|+Function Definition Operators
and Identifiers
|<code>:=</code>
|<code>fundef</code>
|<code>buildq</code>
|-
|<code>::=</code>
|<code>lambda</code>
|<code>macros</code>
|-
|<code>define</code>
|<code>local</code>
|<code>slice</code>
|-
|<code>dispfun</code>
|<code>remfunction</code>
|
|-
|<code>functions</code>
|<code>setup_autoload</code>
|
|}
As a technical term '''''function''''' is aptly characterized as being overloaded. In the context of Maxima as a CAS, it has both a programming meaning and a mathematical meaning in terms of usage. In this book, the convention is to refer to what may otherwise be referred to as built-in Maxima functions as ''operators'' including those of built-in packages. By this convention, the term '''''function''''' in this book refers exclusively to expressions composed by the user by way of the <code>:=</code> or <code>define</code> operators.
As has been mentioned elsewhere in this book, what are conventionally termed ''operators'' that are built-in to Maxima, are at the level of underlying expression construction, Lisp procedures of one type or another. So it makes sense to simply refer to built-in Maxima functions and operators simply as operators one and all. This convention obviates the need for the repetitious use of qualifiers such as ''built-in Maxima'' and ''user-defined'' functions.
There are two operators used to define functions as follows:
# The <code>''''':='''''</code> operator
# The <code>'''define'''</code> operator
<var><code>f (x<sub>1</sub>, x<sub>2,</sub> ..., x<sub>n</sub>) ''':=''' expr</code>
<code>f</code> <code>[x<sub>1</sub>, x<sub>2,</sub> ..., x<sub>n</sub>] ''':=''' expr</code>
<code>f</code> <code>[x<sub>1</sub>, x<sub>2,</sub> ..., x<sub>n</sub>](y<sub>1</sub>, y<sub>2</sub>, ..., y<sub>m</sub>) ''':=''' expr</code></var>
<code>define (f</code> <code>(x<sub>1</sub>, x<sub>2,</sub> …, x<sub>n</sub>), expr)</code>
<code>define (f</code> <code>[x<sub>1</sub>, x<sub>2,</sub> …, x<sub>n</sub>], expr)</code>
<code>define (f</code> <code>[x<sub>1</sub>, x<sub>2,</sub> …, x<sub>n</sub>](y<sub>1</sub>, y<sub>2,</sub> …, y<sub>m</sub>), expr)</code>
<code>define (funmake (f, [</code><code>x<sub>1</sub>, x<sub>2,</sub> …, x<sub>n</sub>]), expr)</code>
<code>define (arraymake (f, [</code><code>x<sub>1</sub>, x<sub>2,</sub> …, x<sub>n</sub>]), expr)</code>
<code>define (ev (</code><code>expr<sub>1</sub>, expr<sub>2</sub>))</code>
where <code>expr</code> is some Maxima expression that is commonly referred to as the ''function body''. As can be concluded from the above, each of these operators has different forms of syntax that can be used. In any case, the most significant differences between these two operators are in terms of the evaluation of the function body and the composition and identification of functions dynamically.
* '''Evaluation:'''
** The <code>:=</code> operator '''suppresses (quotes)''' the evaluation of the function body when this operator is first evaluated. It does not evaluate or simplify the function body until the function identifier itself is evaluated with arguments.
** The <code>define()</code> operator '''evaluates''' the function body when this operator is first evaluated. If the function body involves intermediate computations, substituted values, or extracted parts of expressions (like <code>rhs()</code> or derivative results), the <code>define()</code> operator includes the evaluated results of those directly into the function body.
* '''Dynamic Function Composition and Identifiers:'''
** Function identifiers cannot easily be composed dynamically on the left-hand side of the <code>:=</code> operator when used inside programmatic loop expressions or in scripts.
** The <code>define()</code> operator accepts expressions like <code>funmake</code> or evaluated symbols as its first argument, allowing the composition and identification of functions dynamically during evaluation.
So, there are in general two different operators that can be used to define and evaluate functions. The choice by the Maxima user between these two operators depends on the purpose and context.
==== Function Definition Using the <code>:=</code> Operator ====
For the purpose of understanding the two ways of defining functions, consider the following example which is elementary, but in terms of clarification is not merely simple:<syntaxhighlight lang="maxima">/* "kill" all previously used identifier and values */
(%i29) kill (all);
(%o0) done
/* assign identifier x the global value of 5 */
(%i1) x : 5;
(x) 5
/* define f as a function with local argument x */
(%i2) f (x) := x;
(%o2) f(x):=x
/* evaluate f at local value of x is 3 */
(%i3) f (3);
(%o3) 3
/* the global value of x is not affected */
(%i4) x;
(%o4) 5
/* show the definition expression of the function named f */
(%i5) fundef (f);
(%o5) f(x):=x</syntaxhighlight>'''Function Definition Using the''' '''<code>define</code> Operator'''<syntaxhighlight lang="maxima">
/* define a function with identifier g with a
local argument y and with a function body
of identifier x */
(%i3) define (g('x), x);
(%o3) g(x):=5
/* identifier x of the function body is evaluated */
/* identifier x as an argument of g is local in scope */
(%i4) fundef (g);
(%o4) g(x):=5
/* the same identifier x used in three different roles */
/* used as the global name of a function x */
/* used as a local argument of a function */
/* used as an unevaluated expression for a function body */
(%i7) x(x) := x;
(%o7) x(x):=x
(%i9) x(3);
(%o9) 3
(%i10) x;
(%o10) 5
(%i8) fundef (x);
(%o8) x(x):=x
(%i11) define (x('x), x);
(%o11) x(x):=5
(%i12) fundef (x);
(%o12) x(x):=5
</syntaxhighlight>The purpose of this example is not to encourage this sort of syntax as a typical choice for identifiers and function definitions. The purpose is to clarify how Maxima implicitly determines the scope and meaning of identifiers used for function definition in the absence of any explicit user stipulations.
It should be noted that the <code>define</code> operator not only evaluates the expression that is the function body, it also evaluates the arguments of the function identifier that is the first argument of the <code>define</code> operator. Since there is a global value of the identifier <code>x</code> of <code>5</code>, it was necessary to suppress evaluation (quote) the argument in the expression <code>(%i12) define ('x), x);</code> as otherwise an error would be the result:<syntaxhighlight lang="maxima">
/* define a new function named x */
(%i14) define (x('x), 'x^2);
(%o14) x(x):=x^2
/* check the definition of the new function named x */
(%i15) fundef (x);
(%o15) x(x):=x^2
/* the identifier x has a global value */
(%i16) values;
(%o16) [x]
/* the global value of identifier x is 5 */
(%i17) x;
(%o17) 5
/* the suppressed global value 'x of identifier x is x */
(%i18) 'x;
(%o18) x
/* not quoting the global value of identifier x is an error */
(%i19) define (x(x), 'x^2);
define: in definition of x, parameter must be a symbol and must not be a system constant; found: 5
-- an error. To debug this try: debugmode(true);
</syntaxhighlight>
==== Understanding the Differences Between the <code>:=</code> and <code>define</code> Operators ====
In cases such as these, the suppression of evaluation by quoting is a user stipulation as to evaluation. Users must be aware of these differences between the two operators (<code>:=</code> and <code>define</code>) for the purpose of function definition in order to achieve what is intended and to avoid errors,<syntaxhighlight lang="maxima">
(%i20) f (x) := 3*x^3 + 4*x - 5;
(%o20) f(x):=3*x^3+4*x-5
(%i21) fundef (f);
(%o21) f(x):=3*x^3+4*x-5
(%i22) f(2);
(%o22) 27
(%i23) define (f (x) , 3*x^3 + 4*x - 5);
define: in definition of f, parameter must be a symbol and must not be a system constant; found: 5
-- an error. To debug this try: debugmode(true);
(%i24) define (f ('x) , 3*x^3 + 4*x - 5);
(%o24) f(x):=390
(%i25) define (f ('x) , '(3*x^3 + 4*x - 5));
(%o25) f(x):=3*x^3+4*x-5
(%i26) fundef (f);
(%o26) f(x):=3*x^3+4*x-5
(%i27) f(2);
(%o27) 27
</syntaxhighlight>What is true in the case of these elementary examples is true in general for function definitions involving multiple arguments:<syntaxhighlight lang="maxima">
/* x has a global value of 5 while y is local to g */
(%i28) g (x, y) := x^3 - y^2;
(%o28) g(x,y):=x^3-y^2
(%i29) g (6,2);
(%o29) 212
(%i30) define (g('x, y), 'x^3 - y^2);
(%o30) g(x,y):=x^3-y^2
(%i31) values;
(%o31) [x]
(%i32) g (6,2);
(%o32) 212
</syntaxhighlight>The <code>define</code> operator is a good choice in cases where an existing expression is used as the function body:<syntaxhighlight lang="maxima">
(%i33) /* assign an expression to identifier expr */
expr : diff('x^3, 'x); /* Returns 3*x^2 */
(expr) 3*x^2
(%i34) /* evaluate expr and define h (x) := 3*x^2 */
define (h ('x), expr);
(%o34) h(x):=3*x^2
</syntaxhighlight>In cases in which functions require local variables or more than one expression for the function body, use the block operator:<syntaxhighlight lang="maxima">
(%i35) remvalue (x);
(%o35) [x]
(%i36) values;
(%o36) [expr]
--> power_sum (x, y) := block (
/* values of these identifiers are explicitly local to the function */
[sqx, sqy],
/* unevaluated identifiers x and y are local arguments of the function
and values of these identifiers are implicitly local to the function */
sqx : x^2,
sqy : y^2,
sqx + sqy /* the value of the function */
)$
(%i37) fundef (power_sum);
(%o37) power_sum(x,y):=block([sqx,sqy],sqx:x^2,sqy:y^2,sqx+sqy)
(%i38) power_sum (3,4);
(%o38) 25
</syntaxhighlight>The <code>define</code> operator could also be used to define this function, but with different definition values as a consequence:<syntaxhighlight lang="maxima">(%i39) define (power_sum (x,y),
block (
[sqx,sqy],
sqx : x^2,
sqy : y^2,
sqx + sqy
)
)$
(%i40) fundef (power_sum);
(%o40) power_sum(x,y):=y^2+x^2
(%i41) power_sum (3,4);
(%o41) 25</syntaxhighlight>The function definition of <code>power_sum</code> is different using the <code>define</code> operator instead of the <code>:=</code> operator. The value of the function when referenced with arguments (<code>power_sum (3,4)</code>) is the same in both cases – <code>25</code>. However, in general for defining functions, this may not be the case. The choice between these two operators depends on the intentions of the user.
==== Practical Considerations Related to Function Composition ====
In general, programming is a technical skill as well as a subjective art. So, absolute rules are not offered here. For practical purposes some "guidelines" are offered here that may be useful for Maxima function composition as well as Maxima programming in general:
*
*
*
*
*
Consider the following linear algebraic equation:
<math display="block">3y - 7x = 10</math>
As an example suppose the value that is sought is the slope <code>m</code> of this equation, and in general, the slope of any linear equation regardless of the form. <syntaxhighlight lang="maxima">/* assign the linear equation to an identifier */
(%i42) lineqn : 3*y - 7*x = 10;
(lineqn) 3*y-7*x=10
/* solve the linear equation for y */
(%i43) solve([lineqn], [y])
(%o43) [y=(7*x+10)/3]
/* use the index [1] of the list to get the solved equation */
(%i44) solve([lineqn], [y])[1]
(%o44) y=(7*x+10)/3
/* use the rhs operator to get right-hand side */
(%i45) rhs(solve([lineqn], [y])[1]);
(%o45) (7*x+10)/3
/* use the expand operator change the RHS */
(%i46) expand(rhs(solve([lineqn], [y])[1]));
(%o46) (7*x)/3+10/3
/* use the coeff operator to get the coefficient of x */
(%i47) coeff(expand(rhs(solve([lineqn], [y])[1])),x,1);
(%o47) 7/3
/* define the function with an argument eqn for lineqn */
(%i48) m (eqn) := coeff (expand (rhs (solve ([eqn], [y])[1])),x,1)$
/* check the function definition */
(%i49) fundef (m);
(%o49) m(eqn):=coeff(expand(rhs((solve([eqn],[y]))[1])),x,1)
/* reference the function using lineqn as an argument */
(%i50) m (lineqn);
(%o50) 7/3
/* assign a different linear equation to lineqn */
(%i51) lineqn : x = 6*y + 13;
(lineqn) x=6*y+13
/* reference the function using lineqn as an argument */
%i52) m (lineqn);
(%o52) 1/6</syntaxhighlight>The function body of this example will result in an error if it is used with the <code>define</code> operator:<syntaxhighlight lang="maxima">
(%i53) define (
m (eqn),
coeff (expand (rhs (solve ([eqn], [y])[1])),x,1)
)$
inpart: invalid index 1 of list or matrix.
-- an error. To debug this try: debugmode(true);
</syntaxhighlight>This error is a consequence of the evaluation that occurs when using the <code>define</code> operator. In this case, this evaluation results in a reference to the indexed value of a list object that does not exist when evaluation occurs during definition – <code>solve ([eqn], [y])[1]</code>.
==== Memoizing Functions ====
The functions discussed so far are often referred to as '''''ordinary functions'''''. The arguments of ordinary functions are enclosed using parentheses – <var><code>(x<sub>1</sub>, x<sub>2,</sub> ..., x<sub>n</sub>)</code>.</var> Function definition forms which include arguments enclosed by brackets (as in <var><code>[x<sub>1</sub>, x<sub>2,</sub> ..., x<sub>n</sub>]</code></var>) are called '''''memoizing functions'''''.
Memoizing functions can be categorized both as functions and as data structures – specifically a ''hashed array'' of values. Memoizing functions are also referred to as '''''array functions'''''. In any case, memoizing functions can be defined using either the <code>:=</code> operator or the <code>define</code> operator.
If the form of the function definition expression is <code>f [x<sub>1</sub>, x<sub>2</sub>,..., x<sub>n</sub>] := expr</code> The function body <code>expr</code> is evaluated once for each individual value of the arguments, and that value is the value of the function, without again evaluating the function body, whenever referenced using arguments that have those same values.
Once evaluated during a function reference with arguments, that value of a memoizing function is thereby "frozen" in other words. This frozen value also becomes an instance of a hashed array data structure that can be referenced by way of the value of the index used as an argument when first evaluated.
In keeping with previous practice, the examples provided here are intentionally elementary for the purpose of demonstrating and clarifying the technical aspects involved. There is thereby no intention to convey that the composition of function definition expressions with multiple arguments and complex expressions for the function body is ruled out or of lesser practical value. <syntaxhighlight lang="maxima">/* define a memoizing function f */
/* x and n may serve as both arguments and array indices */
(%i54) f [x, n] := x^n;
(%o54) f[x,n]:=x^n
/* check the array information for f */
(%i55) arrayinfo (f);
(%o55) [hashed,2]
/* f does not appear in the list of functions */
(%i56) functions;
(%o56) [m(lineqn)]
/* reference f with argument values */
(%i57) f [2,3] ;
(%o57) 8
/* check the array information for f again */
(%i58) arrayinfo (f);
(%o58) [hashed,2,[2,3]]
/* list the array values of f */
(%i59) listarray (f);
(%o59) [8]
/* f does appear in the list of arrays */
(%i60) arrays;
(%o60) [f]
/* reference f with new argument values */
(%i61) f [5,2];
(%o61) 25
/* check the array information for f again */
(%i62) arrayinfo (f);
(%o62) [hashed,2,[2,3],[5,2]]
/* list the array values of f */
(%i63) listarray (f);
(%o63) [8,25]</syntaxhighlight>An expression of the form <code>define (f [x1, x2</code><code>,…, xn], expr)</code> may also be used to define the same memoizing function <code>f</code> in this case as the evaluation imposed by the <code>define</code> operator during evaluation of these function arguments and this function body that occurs makes no difference:<syntaxhighlight lang="maxima">
/* remove the function definition and values of f */
(%i64) remarray (f);
(%o64) [f]
/* the list of arrays is now empty */
(%i65) arrays;
(%o65) []
/* define the same memoizing function f using the define operator */
/* evaluation makes no difference to the definition of f in this case */
(%i66) define (f [x,n], x^n);
(%o66) f[x,n]:=x^n
/* reference f with different argument values */
(%i67) f [3, 2];
(%o67) 9
/* reference f again with different argument values */
(%i68) f [2, 5];
(%o68) 32
/* f again appears in the list of arrays */
(%i69) arrays;
(%o69) [f]
/* check the array information for f */
(%i70) arrayinfo (f);
(%o70) [hashed,2,[2,5],[3,2]]
/* list the array values of f */
(%i71) listarray (f);
(%o71) [32,9]
</syntaxhighlight>
===== Special Forms of Memoizing Functions =====
An expression of the form <code>f [x<sub>1</sub>, x<sub>2</sub>,..., x<sub>n</sub>](y<sub>1</sub>, y<sub>2</sub>,..., y<sub>m</sub>):= expr</code>, or alternatively of the form <code>define (f [x1, x2</code><code>,…, xn](y<sub>1</sub>, y<sub>2</sub>,..., y<sub>m</sub>), expr)</code>, may also be used to define a memoizing function named <code>f</code>. When either of these forms are used to compose a function definition expression, there is a sense in which the resulting function is a hybrid – part memoizing function, and part "ordinary" function. These forms create a hashed array of functions where the array subscripts <code>[x<sub>1</sub>, x<sub>2</sub>,..., x<sub>n</sub>]</code> evaluate immediately to "specialize" the function body, while the ordinary function arguments <code>(y<sub>1</sub>, y<sub>2</sub>,..., y<sub>m</sub>)</code> are used when evaluating these individual functions.<syntaxhighlight lang="maxima">/* Define a function for an array of "shifted" power functions */
(%i72) define( p[n](x), x^n + n );
(%o72) p[n](x):=x^n+n
(%i73) p[2];
(%o73) lambda([x],x^2+2)
(%i74) p[2](5);
(%o74) 27
(%i75) p[4];
(%o75) lambda([x],x^4+4)
(%i76) p[4](5);
(%o76) 629
(%i77) arrayinfo (p);
(%o77) [hashed,1,[2],[4]]
(%i78) listarray (p)
(%o78) [lambda([x],x^2+2),lambda([x],x^4+4)]
(%i79) p[5];
(%o79) lambda([x],x^5+5)
(%i80) p[5](2);
(%o80) 37
(%i81) listarray (p);
(%o81) [lambda([x],x^2+2),lambda([x],x^4+4),lambda([x],x^5+5)]
(%i82) arrayinfo (p);
(%o82) [hashed,1,[2],[4],[5]]</syntaxhighlight>How It Works
1. Defining the Function: The command above generates a distinct function for each subscript n.
2. Evaluating the Array Element: If you call p[3], Maxima evaluates the index n=3 and implicitly defines an ordinary function equivalent to p[3](x) := x^3 + 3.
3. Evaluating the Function:
• Running p[3](2); will compute \(2^3 + 3\), returning 11.
• Running p[2](5); will compute \(5^2 + 2\), returning 27.
This syntax is useful in Maxima when you need to programmatically pre-generate an array of custom functions or transformations where the functional form depends directly on structural indices.
==== Lambda Expressions ====
==== Special Forms of the <code>define</code> Operator ====
==== Some Techniques for Function Composition ====
=== Conditional Expressions – Special Operator <code>if</code> ===
=== Expressions for Iteration – Special Operator <code>do</code> ===
The special operator <code>do</code> is used to compose expressions for iteration. It is typically used with the following other special operators:
* <code>while</code>
* <code>unless</code>
* <code>for</code>
* <code>from</code>
* <code>thru</code>
* <code>step</code>
* <code>next</code>
* <code>in</code>
The general forms of <code>do</code> expressions Maxima supports are:
<code>for</code> variable: initial_value <code>step</code> increment <code>thru</code> limit <code>do</code> body
<code>for</code> variable: initial_value <code>step</code> increment <code>while</code> condition <code>do</code> body
<code>for</code> variable: initial_value <code>step</code> increment <code>unless</code> condition <code>do</code> body
<code>for</code> variable <code>in</code> list <code>do</code> body
<code>for</code> variable <code>in</code> expr <code>do</code> body
<code>for</code> variable <code>in</code> hash_table <code>do</code> body
=== Lisp and Maxima ===
{{BookCat}}
mcol4a2a4yt33h4sjieg823r7kwqa16
User:TechVindicator/sandbox
2
485726
4676696
4676486
2026-10-18T06:53:22Z
TechVindicator
3626296
4676696
wikitext
text/x-wiki
{{User:TechVindicator/QuickAccess}}
==East Germany's Geography==
When East Germany was a country, the country was divided into Bezirks between 1952-1990. Bezirks mean districts in German, and are similar to states in the USA. From World War II through 1952, East Germany was divided into five Länder.
a9k8bvsknsgyjh29e9na4wegcssv2r2
4676697
4676696
2026-10-18T06:57:21Z
TechVindicator
3626296
4676697
wikitext
text/x-wiki
{{User:TechVindicator/QuickAccess}}
==East Germany's Geography==
When East Germany was a country, the country was divided into Bezirks between 1952-1990. Bezirks mean districts in German, and are similar to states in the USA. From World War II through 1952, East Germany was divided into five Länder.
<br>
East Germany bordered the Baltic Sea to the north, Poland to the east, Czechoslovakia to the southeast, and West Germany to the west and south.
cv46m9a2s8jestx0il782rapz93ftm8
Vehicle Identification Numbers (VIN codes)/Jaguar/VIN Codes
0
485791
4676684
4676366
2026-10-18T04:59:53Z
JustTheFacts33
3434282
/* Model Line (Position 4) */
4676684
wikitext
text/x-wiki
{{Vehicle Identification Numbers (VIN codes)/Warning}}{{clear}}
This VIN number decoding and designation system is used primarily for the North American Market. European and Asian markets use other decoding and designation systems.
==General Template for Jaguar's VIN format (All models: 2016- EXCEPT F-Type '16-'17, XJ '16-'19)==
===Jaguar WMIs (2016-) (Position 1-3)===
* SAJ - Jaguar passenger car (UK)
* SAD - Jaguar SUV (UK & Europe)
* L2C - Chery Jaguar Land Rover (China)
===Model Line (Position 4)===
{| class="wikitable"
|+Position 4
!VIN code
!Description
|-
|A
|[[w:Jaguar XE|Jaguar XE]] ('17-'20)
|-
|B
|[[w:Jaguar XF (X260)|Jaguar XF]] ('16-'24)
|-
|C
|[[w:Jaguar F-Pace|Jaguar F-Pace]] ('17-'26)
|-
|D
|[[w:Jaguar F-Type|Jaguar F-Type]] ('18-'24)
|-
|E
|[[w:Jaguar Type 01|Jaguar Type 01]] ('28-)
|-
|F
|[[w:Jaguar E-Pace|Jaguar E-Pace]] ('18-'24)
|-
|H
|[[w:Jaguar I-Pace|Jaguar I-Pace EV]] ('19-'24)
|}
===Trim Level/Drive Wheels/Restraint System (Position 5)===
{| class="wikitable"
|+Position 4
!VIN code
!Trim Level
!Drive Wheels
!Restraint System
|-
|D
|XF Premium '16-
|Rwd
|
|-
|E
|XF Prestige '16-
|Rwd
|
|-
|F
|XF R-Sport '16-
|Rwd
|
|-
|G
|XF S '16-
|Rwd
|
|-
|J
|XF Premium '16-
|Awd
|
|-
|K
|XF Prestige '16-
|Awd
|
|-
|L
|XF R-Sport '16-
|Awd
|
|-
|M
|XF S '16-
|Awd
|
|-
|N
|XF First Edition '16
|Awd
|
|}
===Body Style (Position 6):===
* 1 = Coupe (F-Type coupe)
* 2 = 5-door wagon (XF Sportbrake wagon '18-'20)
* 2 = 5-door (E-Pace, F-Pace, I-Pace EV)
* 4 = 4-door sedan (XE, XF sedan, Type 01)
* 5 = Convertible (F-Type convertible)
===Transmission (Position 7) 2016-2017:===
* B = Automatic (XE '17, XF '16-'17, F-Pace '17)
===Engine/Emissions Control System (Position 8) 2016-2017:===
{| class="wikitable"
|+Position 8
! VIN !! Size !! Type !! Fuel !! Valvetrain !! Engine Family/Notes/Applications
|-
| G || 2.0L || I4 Turbo [[w:Intercooler|IC]] || Gas || DOHC,<br /> 16 valve||Direct Injection. ULEV. Dual VVT. [[w:Ford EcoBoost engine#2.0 L (2010–2018)|Ford EcoBoost engine (Mazda L engine-based)]].<br> Jaguar XE 25t ('17).
|-
| N || 2.0L || I4 Turbo [[w:Intercooler|IC]] || Diesel || DOHC,<br /> 16 valve||Common-rail Direct Injection. Exhaust VVT. [[w:Ingenium engine family|JLR Ingenium AJ20D engine]]. Jaguar XE 20d, XF 20d, F-Pace 20d ('17).
|-
| V || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XF 35t ('16-'17) [If 5th pos. of VIN is NOT G, H, M, or N]. Jaguar XE 35t ('17). Jaguar F-Pace 35t ('17) [If 5th pos. of VIN is NOT M or P].
|-
| V || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 380 PS/375 hp. Jaguar XF S ('16-'17). If 5th pos. of VIN is G, H, M, or N. Jaguar F-Pace S ('17) [If 5th pos. of VIN is M or P].
|}
===Engine (Position 7-8) 2018-:===
{| class="wikitable"
|+Position 7-8
! VIN Pos. 7 !! Power Level !! Transmission !! VIN Pos. 8 !! Size !! Type !! Fuel !! Valvetrain !! Engine Family/Notes/Applications
|-
| E || 550 PS/542 hp || 8-spd. Auto. || E || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct injection. Dual Continuously VCT (VVT). [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133S engine]]. Jaguar F-Type R ('18-'20), F-Pace SVR ('19-'24).
|-
| E || 450 PS/444 hp || 8-spd. Auto. || E || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct injection. Dual Continuously VCT (VVT). [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133S engine]]. Jaguar F-Type P450 ('22-24).
|-
| F || 575 PS/567 hp || 8-spd. Auto. || E || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct injection. Dual Continuously VCT (VVT). [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133S engine]]. Jaguar F-Type SVR ('18-'20), F-Type R ('21-'24),<br> F-Pace SVR 575 Edition ('25-'26).
|-
| F || 600 PS/592 hp || 8-spd. Auto. || E || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct injection. Dual Continuously VCT (VVT). [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133S engine]]. Jaguar XE SV Project 8 ('19).
|-
| F || 180 PS/178 hp || 8-spd. Auto. || N || 2.0L || I4 Turbo [[w:Intercooler|IC]] || Diesel || DOHC,<br /> 16 valve||Common-rail Direct Injection. Exhaust VVT.<br> [[w:Ingenium engine family|JLR Ingenium AJ20D4/AJ200D engine]].<br> Jaguar XE 20d ('18-'19), XF 20d ('18-'19), F-Pace 20d ('18-'19).
|-
| E || 340 PS/335 hp || 8-spd. Auto. || U || 3.0L || I6 Turbo [[w:Intercooler|IC]] || Gas || DOHC,<br /> 24 valve||48v Mild Hybrid. E-supercharger. Direct Injection. Dual VVT. CVVL (Intake VVL). [[w:Ingenium engine family|JLR Ingenium AJ20P6/AJ300P engine]].<br> Jaguar F-Pace P340 ('21-'22).
|-
| F || 400 PS/395 hp || 8-spd. Auto. || U || 3.0L || I6 Turbo [[w:Intercooler|IC]] || Gas || DOHC,<br /> 24 valve||48v Mild Hybrid. E-supercharger. Direct Injection. Dual VVT. CVVL (Intake VVL). [[w:Ingenium engine family|JLR Ingenium AJ20P6/AJ300P engine]].<br> Jaguar F-Pace P400 ('21-'26).
|-
| E || 340 PS/335 hp || 8-spd. Auto. || V || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. Continuously variable intake & exhaust valve timing.<br> [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> Jaguar XE 35t ('18), XF 35t ('18), F-Type ('18), F-Type P340 ('19-'20),<br> F-Pace 35t ('18).
|-
| F || 380 PS/375 hp || 8-spd. Auto. || V || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. Continuously variable intake & exhaust valve timing.<br> [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> Jaguar XE S ('18-'19), XF S ('18-'20), F-Type ('18),<br> F-Type P380 ('19), F-Type P380 R-Dynamic ('19-'21), F-Pace S ('18-'20).
|-
| G || 400 PS/395 hp || 8-spd. Auto. || V || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. Continuously variable intake & exhaust valve timing.<br> [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> Jaguar F-Type 400 Sport ('18).
|-
| J || 340 PS/335 hp || 6-spd. Man. || V || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. Continuously variable intake & exhaust valve timing.<br> [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> Jaguar F-Type ('18), F-Type P340 ('19).
|-
| K || 380 PS/375 hp || 6-spd. Man. || V || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. Continuously variable intake & exhaust valve timing.<br> [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> Jaguar F-Type P380 R-Dynamic ('18-'19).
|-
| E || 250 PS/247 hp || 8-spd. Auto. || X || 2.0L || I4 Turbo [[w:Intercooler|IC]] || Gas || DOHC,<br /> 16 valve||Direct Injection. Dual VVT. CVVL (Intake VVL).<br> [[w:Ingenium engine family|JLR Ingenium AJ20P4/AJ200P engine]].<br> Jaguar F-Pace P250 ('21-'26).
|-
| F || 250 PS/247 hp || 8-spd. Auto. || X || 2.0L || I4 Turbo [[w:Intercooler|IC]] || Gas || DOHC,<br /> 16 valve||Direct Injection. Dual VVT. CVVL (Intake VVL).<br> [[w:Ingenium engine family|JLR Ingenium AJ20P4/AJ200P engine]].<br> Jaguar XE 25t ('18-'20), XF 25t ('18-'20), XF P250 ('21-'24),<br> E-Pace P250 ('18-'24), F-Pace 25t ('18-'20).
|-
| G || 300 PS/296 hp || 8-spd. Auto. || X || 2.0L || I4 Turbo [[w:Intercooler|IC]] || Gas || DOHC,<br /> 16 valve||Direct Injection. Dual VVT. CVVL (Intake VVL).<br> [[w:Ingenium engine family|JLR Ingenium AJ20P4/AJ200P engine]].<br> Jaguar XE 30t ('18-'20), XF 30t ('18-'20), XF P300 ('21-'24),<br> F-Type ('18), F-Type P300 ('19-'21), E-Pace P300 R-Dynamic ('18-'20),<br> E-Pace 300 Sport ('21-'22), F-Pace 30t ('18-'20).
|}
====Motor Type for Electric Vehicles 2019-====
{| class="wikitable"
|+Position 7-8
|-
! VIN Pos. 7 !! Power Level !! Transmission !! VIN Pos. 8 !! # of Motors !! Battery Size !! Battery Type !! Fuel !! Drive Wheels !! Notes/Applications
|-
| S || 400 PS/394 hp || 1-spd. Auto. || 1 || 2 || 90 Kwh || Lithium-ion || Electricity || All || Jaguar I-Pace EV400 ('19-'24).
|-
| T || 1029 PS/1015 hp || 1-spd. Auto. || 1 || 3 <br> (1 Front,<br> 2 Rear) || 118 Kwh || Lithium-ion || Electricity || All || Jaguar Type 01 ('28-).
|}
===Check Digit/Gearbox (Position 9)===
* USA /Canada [[Vehicle Identification Numbers (VIN codes)/Check digit|Check digit]]
===Model Year Code (Position 10)===
''See: [[Vehicle Identification Numbers (VIN codes)/Model year]]''
===Plant Codes (Position 11) 2016-===
* A - Solihull, West Midlands, England, UK (XE '17, F-Pace '17-'26, Type 01 '28-)
* C - Castle Bromwich, West Midlands, England, UK (XE '17-'20, XF '16-'24, F-Type '18-'24)
* S - Oxford Road plant, Ryton, West Midlands, England, UK (JLR SVO plant) (XE SV Project 8 '19)
* 1 - Graz, Austria (Magna Steyr plant) (E-Pace '18-'24, I-Pace EV '19-'24)
===Model (Position 12)===
* 9 - XE ('17) [Solihull plant]
* P - XE ('17-'20) [Castle Bromwich plant]
* Y - XF ('16-'24)
* K - F-Type ('18-'24)
* Z - E-Pace ('18-'20)
* 0 - E-Pace ('20-'24)
* F - I-Pace EV ('19-'20)
* 6 - I-Pace EV ('20-'24)
'''Positions 13–17, Serial Number'''
==General Template for Jaguar's VIN format (All models: 2000-2015 plus F-Type '16-'17, XJ '16-'19)==
===Jaguar WMIs (2000-) (Position 1-3)===
* SAJ - Jaguar passenger car (UK)
* SAD - Jaguar SUV (UK & Europe)
===Regional Spec/Restraint System (Position 4):===
* J = Manual seat belts, Dual front airbags (US: XK8 '00)
* B = Manual seat belts, Dual front airbags (Canada: XK8 '00)
* D = Manual seat belts, Depowered Dual front airbags, & Front Side Airbags (US: S-Type '00-'02, XJ8/XJR '00-'03, XK8/XKR '01-'06, XK/XKR Early '07)
* F = Manual seat belts, Depowered Dual front airbags, & Front Side Airbags (Canada: S-Type '00-'02, XJ8/XJR '00-'03, XK8/XKR '01-'06, XK/XKR Early '07)
* E = Manual seat belts, Depowered Dual front airbags w/occupant position sensing, & Front Side Airbags & Side Curtain Airbags (US: X-Type '02-'04, S-Type '03-'04, XJ8/XJR Early '04)
* G = Manual seat belts, Depowered Dual front airbags w/occupant position sensing, & Front Side Airbags & Side Curtain Airbags (Canada: X-Type '02-'04,<br> S-Type '03-'04, XJ8/XJR Early '04)
* W = Manual seat belts, Depowered Dual front airbags w/occupant position (driver) and weight (fr. psgr.) sensing, & Front Side Airbags & Side Curtain Airbags <br> (US: X-Type '05-'08, S-Type '05-'08, XF '09-'15, XJ8/XJR '04-'09, XJ '10-)
* X = Manual seat belts, Depowered Dual front airbags w/occupant position (driver) and weight (fr. psgr.) sensing, & Front Side Airbags & Side Curtain Airbags (Canada: X-Type '05-'08, S-Type '05-'08, XF '09-'15, XJ8/XJR '04-'09, XJ '10-)
* W = Manual seat belts, Depowered Dual front airbags w/occupant position (driver) and weight (fr. psgr.) sensing, & Front Side Head/Thorax Airbags <br> (US: XK/XKR '07-'15, F-Type '14-)
* X = Manual seat belts, Depowered Dual front airbags w/occupant position (driver) and weight (fr. psgr.) sensing, & Front Side Head/Thorax Airbags <br> (Canada: XK/XKR '07-'15, F-Type '14-)
===Transmission & Steering Location (Position 5 - '00-'12):===
* A = Automatic / LHD
* B = Manual / LHD (X-Type '02-'05, S-Type 3.0 '03-'04)
===Transmission & Drive Wheels (Position 5 - '13-):===
* A = Automatic / Rwd (XF '13-'15, XJ '13-'19, XK '13-'15, F-Type '14-'17)
* B = Manual / Rwd (F-Type '16-'17)
* J = Automatic / Awd (XF Awd '13-'15, XJ Awd '13-'19, F-Type Awd '16-'17)
===Model Line (Position 6-7)===
{| class="wikitable"
|+Position 6-7
!VIN code
!Description
|-
|51
|[[w:Jaguar X-Type|Jaguar X-Type sedan - High Series]] ('02-'08)
|-
|52
|[[w:Jaguar X-Type|Jaguar X-Type sedan - Entry Series]] ('03-'04)
|-
|53
|[[w:Jaguar X-Type|Jaguar X-Type sedan w/Sport Package]] ('02-'03)
|-
|54
|[[w:Jaguar X-Type|Jaguar X-Type Sportwagon]] ('05-'08)
|-
|01
|[[w:Jaguar S-Type (1999)|Jaguar S-Type]] ('00-'08)
|-
|03
|[[w:Jaguar S-Type (1999)|Jaguar S-Type Sport]] [3.0, 4.0] ('02)
|-
|03
|[[w:Jaguar S-Type (1999)|Jaguar S-Type Sport]] [3.0, 4.2] ('03)
|-
|03
|[[w:Jaguar S-Type (1999)|Jaguar S-Type R]] ('03-'08)
|-
|05
|[[w:Jaguar XF (X250)|Jaguar XF Luxury]] ('09)
|-
|06
|[[w:Jaguar XF (X250)|Jaguar XF Premium Luxury]] ('09)
|-
|07
|[[w:Jaguar XF (X250)|Jaguar XF Supercharged]] ('09)
|-
|0E
|[[w:Jaguar XF (X250)|Jaguar XF]] ('13-'14)
|-
|0F
|[[w:Jaguar XF (X250)|Jaguar XF]] ('10-'12)
|-
|0F
|[[w:Jaguar XF (X250)|Jaguar XF 2.0T Premium]] [8th pos. of VIN is S] ('15)
|-
|0F
|[[w:Jaguar XF (X250)|Jaguar XF 3.0 Sport Rwd or 3.0 Portfolio Rwd]] [8th pos. of VIN is 7] ('15)
|-
|0F
|[[w:Jaguar XF (X250)|Jaguar XF 3.0 Sport Awd or 3.0 Portfolio Awd]] [8th pos. of VIN is F] ('15)
|-
|0G
|[[w:Jaguar XF (X250)|Jaguar XF Premium]] ('10-'11)
|-
|0H
|[[w:Jaguar XF (X250)|Jaguar XF Portfolio]] [8th pos. of VIN is B] ('12)
|-
|0H
|[[w:Jaguar XF (X250)|Jaguar XF Supercharged]] [8th pos. of VIN is E: '10-'13 or P: '13-'15]
|-
|0J
|[[w:Jaguar XF (X250)|Jaguar XFR]] ('10-'15)
|-
|0K
|[[w:Jaguar XF (X250)|Jaguar XFR-S]] ('13-'15)
|-
|8J
|[[w:Jaguar XF (X250)|Jaguar XFR w/Speed Pack]] ('13-'15)
|-
|12
|[[w:Jaguar XJ (X308)#Sport|Jaguar XJ Sport]] ('02-'03)
|-
|14
|[[w:Jaguar XJ (X308)|Jaguar XJ8]] ('00-'03)
|-
|15
|[[w:Jaguar XJ (X308)#XJR|Jaguar XJR]] ('00-'03)
|-
|23
|[[w:Jaguar XJ (X308)|Jaguar XJ8L]] (LWB) ('00-'01)
|-
|24
|[[w:Jaguar XJ (X308)#Daimler/Vanden Plas|Jaguar XJ8 Vanden Plas]] (LWB) ('00-'03)
|-
|25
|[[w:Jaguar XJ (X308)#Daimler/Vanden Plas|Jaguar XJ8 Vanden Plas Supercharged]] (LWB) ('00-'01)
|-
|25
|[[w:Jaguar XJ (X308)#Daimler/Vanden Plas|Jaguar XJ Super V8]] (LWB) ('02-'03)
|-
|71
|[[w:Jaguar XJ (X350)|Jaguar XJ8]] ('04-'09)
|-
|73
|[[w:Jaguar XJ (X350)|Jaguar XJR]] ('04-'09)
|-
|74
|[[w:Jaguar XJ (X350)|Jaguar XJ8 Vanden Plas]] (SWB) ('04)
|-
|79
|[[w:Jaguar XJ (X350)|Jaguar XJ8L]] (LWB) ('05-'09)
|-
|82
|[[w:Jaguar XJ (X350)|Jaguar XJ8 Vanden Plas]] (LWB) ('05-'09)
|-
|82
|[[w:Jaguar XJ (X350)|Jaguar XJ Super V8]] (LWB, 5-psgr.) ('05-'09)
|-
|86
|[[w:Jaguar XJ (X350)|Jaguar XJ Super V8 Portfolio]] (LWB, 4-psgr.) ('06)
|-
|94
|[[w:Jaguar XJ (X350)|Jaguar XJ Super V8 Portfolio]] (LWB, 5-psgr.) ('09)
|-
|1C
|[[w:Jaguar XJ (X351)|Jaguar XJ]] ('10-'15)
|-
|1C
|[[w:Jaguar XJ (X351)|Jaguar XJ R-Sport]] [8th pos. of VIN is 7 (Rwd) or D (Awd)] ('16-'19)
|-
|1C
|[[w:Jaguar XJ (X351)|Jaguar XJ Supercharged]] [8th pos. of VIN is E] ('16-'19)
|-
|1E
|[[w:Jaguar XJ (X351)|Jaguar XJR]] ('14-'17)
|-
|1G
|[[w:Jaguar XJ (X351)|Jaguar XJ Supercharged]] [8th pos. of VIN is E: '10-'13 or T: '13-'15]
|-
|1J
|[[w:Jaguar XJ (X351)|Jaguar XJ Supersport]] ('11-'12)
|-
|2E
|[[w:Jaguar XJ (X351)|Jaguar XJR LWB]] ('14-'17), XJR575 LWB ('18-'19)
|-
|2G
|[[w:Jaguar XJ (X351)|Jaguar XJL]] [8th pos. of VIN is B] ('10-'11)
|-
|2G
|[[w:Jaguar XJ (X351)|Jaguar XJL Portfolio Rwd]] [8th pos. of VIN is B: '12-'13 or 1: '13]
|-
|2G
|[[w:Jaguar XJ (X351)|Jaguar XJL Portfolio Rwd]] [8th pos. of VIN is Z: '14-'15)
|-
|2G
|[[w:Jaguar XJ (X351)|Jaguar XJL Portfolio Rwd]] [8th pos. of VIN is 7: '16-'19), XJ50 3.0 Rwd (LWB) '19
|-
|2G
|[[w:Jaguar XJ (X351)|Jaguar XJL Portfolio Awd]] [8th pos. of VIN is D] ('13-'19), XJ50 3.0 Awd (LWB) '19
|-
|2G
|[[w:Jaguar XJ (X351)|Jaguar XJL Supercharged]] [8th pos. of VIN is E: '10-'13, '16-'19 or T: '13-'15], XJ50 5.0 Rwd (LWB) '19, XJ Collection (LWB) '19
|-
|2J
|[[w:Jaguar XJ (X351)|Jaguar XJL Supersport]] ('11-'13)
|-
|2K
|[[w:Jaguar XJ (X351)|Jaguar XJL Ultimate]] ('13)
|-
|3F
|[[w:Jaguar XJ (X351)|Jaguar XJ Supersport w/Speed Pack]] ('12-'13)
|-
|3G
|[[w:Jaguar XJ (X351)|Jaguar XJL Supersport w/Speed Pack]] ('12-'13)
|-
|3H
|[[w:Jaguar XJ (X351)|Jaguar XJ Supercharged w/Sport & Speed Pack]] ('12-'15)
|-
|3K
|[[w:Jaguar XJ (X351)|Jaguar XJL Supercharged w/Sport & Speed Pack]] ('12-'15)
|-
|41
|[[w:Jaguar XK (X100)|Jaguar XK8/XKR coupe]] ('00-'06)
|-
|42
|[[w:Jaguar XK (X100)|Jaguar XK8/XKR convertible]] ('00-'06)
|-
|43
|[[w:Jaguar XK (X150)|Jaguar XK/XKR coupe]] ('07-'09)
|-
|44
|[[w:Jaguar XK (X150)|Jaguar XK/XKR convertible]] ('07-'09)
|-
|45
|[[w:Jaguar XK (X150)|Jaguar XKR Portfolio Edition coupe]] ('09)
|-
|46
|[[w:Jaguar XK (X150)|Jaguar XKR Portfolio Edition convertible]] ('09)
|-
|4D
|[[w:Jaguar XK (X150)|Jaguar XK Touring coupe]] [8th pos. of VIN is B] ('13-'14)
|-
|4E
|[[w:Jaguar XK (X150)|Jaguar XK Touring convertible]] [8th pos. of VIN is B] ('13-'14)
|-
|4D
|[[w:Jaguar XK (X150)|Jaguar XKR coupe]] [8th pos. of VIN is C] ('10-'15)
|-
|4E
|[[w:Jaguar XK (X150)|Jaguar XKR convertible]] [8th pos. of VIN is C] ('10-'15)
|-
|4F
|[[w:Jaguar XK (X150)|Jaguar XK coupe]] (most Portfolio Edition features are std.) [8th pos. of VIN is B] ('10-'15)
|-
|4F
|[[w:Jaguar XK (X150)|Jaguar XKR175 coupe]] [8th pos. of VIN is C] ('11)
|-
|4F
|[[w:Jaguar XK (X150)|Jaguar XKR coupe w/Dynamic Pack]] [8th pos. of VIN is C] ('13-'15), XK Final Fifty Edition coupe ('15)
|-
|4G
|[[w:Jaguar XK (X150)|Jaguar XK convertible]] (most Portfolio Edition features are std.) [8th pos. of VIN is B] ('10-'15)
|-
|4G
|[[w:Jaguar XK (X150)|Jaguar XKR convertible w/Dynamic Pack]] [8th pos. of VIN is C] ('13-'15), XK Final Fifty Edition convertible ('15)
|-
|4H
|[[w:Jaguar XK (X150)|Jaguar XKR-S coupe]] ('12-'15), XKR-S GT coupe ('14)
|-
|4J
|[[w:Jaguar XK (X150)|Jaguar XKR-S convertible]] ('12-'15)
|-
|6A
|[[w:Jaguar F-Type)|Jaguar F-Type coupe]] ('15-'17), F-Type Premium coupe '17
|-
|6B
|[[w:Jaguar F-Type)|Jaguar F-Type S coupe]] ('15-'17), F-Type S British Design Edition coupe '17
|-
|6D
|[[w:Jaguar F-Type)|Jaguar F-Type R coupe]] ('15-'17)
|-
|6E
|[[w:Jaguar F-Type)|Jaguar F-Type convertible]] ('14-'17), F-Type Premium convertible '17
|-
|6F
|[[w:Jaguar F-Type)|Jaguar F-Type S convertible]] ('14-'17), F-Type S British Design Edition convertible '17
|-
|6G
|[[w:Jaguar F-Type)|Jaguar F-Type V8 S convertible]] ('14-'15)
|-
|6H
|[[w:Jaguar F-Type)|Jaguar F-Type R convertible]] ('16-'17)
|-
|6J
|[[w:Jaguar F-Type)|Jaguar F-Type SVR coupe]] ('17)
|-
|6K
|[[w:Jaguar F-Type)|Jaguar F-Type SVR convertible]] ('17)
|-
|7A
|[[w:Jaguar F-Type#Project 7)|Jaguar F-Type Project 7 convertible]] ('16)
|}
===Engine/Emissions Control System (Position 8)===
{| class="wikitable"
|+Position 8
! VIN !! Size !! Type !! Fuel !! Valvetrain !! Engine Family/Notes/Applications
|-
| A || 3.0L || 60° V6 || Gas ||DOHC,<br /> 24 valve||MPI. ULEV. Variable intake valve timing. [[w:Jaguar AJ-V6 engine#AJ30|Jaguar AJ-V6 - AJ30 V6 engine]].<br> Jaguar X-Type 3.0 (Mid '05-'08), S-Type 3.0 ('06-'08).
|-
| A || 4.2L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. ULEV. Continuously variable intake valve timing. [[w:Jaguar AJ-V8 engine#4.2 L|Jaguar AJ-V8 - AJ34 V8 engine]]. Jaguar XF ('10).
|-
| A || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 550 PS/542 hp. Jaguar XKR-S ('12-'15), XKR-S GT ('14), F-Type R coupe ('15).
|-
| B || 4.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||MPI. [[w:Jaguar AJ-V8 engine#Supercharged|Jaguar AJ-V8 - AJ27S V8 engine]].<br> Jaguar XJR ('00-'03), Vanden Plas Supercharged ('00-'01), Super V8 ('02-'03), XKR ('00-'02).
|-
| B || 4.2L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||MPI. [[w:Jaguar AJ-V8 engine#Supercharged_2|Jaguar AJ-V8 - AJ33S V8 engine]]. Jaguar XJR ('04-'05), Super V8 ('05), XKR ('03-'06).
|-
| B || 4.2L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. ULEV. Continuously variable intake valve timing. [[w:Jaguar AJ-V8 engine#4.2 L|Jaguar AJ-V8 - AJ34 V8 engine]].<br> Jaguar S-Type ('06-'08), XF ('09), XJ8/Vanden Plas ('06-'09), XK ('07-'09).
|-
| B || 5.0L || V8 || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. Variable intake valve lift. Variable intake.<br> [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> Jaguar XF ('10-'12), XJ ('11-'12), XJL ('11), XJL Portfolio Rwd ('12-'13), XK ('10-'15), XK Touring ('13-'14).
|-
| C || 3.0L || 60° V6 || Gas ||DOHC,<br /> 24 valve||MPI. Variable intake valve timing. [[w:Jaguar AJ-V6 engine#AJ30|Jaguar AJ-V6 - AJ30 V6 engine]].<br> Jaguar S-Type 3.0 ('00-'01), X-Type 3.0 ('02-Mid '05).
|-
| C || 4.0L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. Continuously variable intake valve timing. [[w:Jaguar AJ-V8 engine#4.0 L|Jaguar AJ-V8 - AJ27 V8 engine]].<br> Jaguar XJ8/Vanden Plas ('00-'03), XJ Sport ('02-'03), XK8 ('00-'02).
|-
| C || 4.2L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. Continuously variable intake valve timing. [[w:Jaguar AJ-V8 engine#4.2 L|Jaguar AJ-V8 - AJ33 V8 engine]]. Jaguar XJ8 ('04-'05), XK8 ('03-'06).
|-
| C || 4.2L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||MPI. ULEV. Continuously variable intake valve timing. [[w:Jaguar AJ-V8 engine#Supercharged_2|Jaguar AJ-V8 - AJ34S V8 engine]].<br> Jaguar S-Type R ('06-'08), XF Supercharged ('09), XJR ('06-'09), Super V8 ('06-'09), XKR ('07-'09).
|-
| C || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 510 PS/503 hp. Jaguar XFR ('10-'13), XJ/XJL Supersport ('11-'13), XKR ('10-'15).
|-
| C || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 380 PS/375 hp. Jaguar F-Type S ('14-'15), F-Type S w/man. trans. ('16-'17).
|-
| D || 4.0L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. Continuously variable intake valve timing. [[w:Jaguar AJ-V8 engine#4.0 L|Jaguar AJ-V8 - AJ28 V8 engine]]. Jaguar S-Type 4.0 ('00-'01).
|-
| D || 2.5L || 60° V6 || Gas ||DOHC,<br /> 24 valve||MPI. Variable intake valve timing. [[w:Jaguar AJ-V6 engine#AJ25|Jaguar AJ-V6 - AJ25 V6 engine]]. Jaguar X-Type 2.5 ('02-'05).
|-
| D || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XJ Awd, XJL Portfolio Awd ('13-'15).
|-
| D || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XJ R-Sport Awd, XJL Portfolio Awd ('16-'19), XJ50 3.0 Awd ('19).
|-
| E || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 470 PS/464 hp.<br> Jaguar XF Supercharged ('10-'13), XJ/XJL Supercharged ('11-'13, '16-'19), XJ50 5.0 Rwd ('19), XJ Collection ('19).
|-
| F || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XF 3.0 Awd ('13-'14).
|-
| F || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XF 3.0 Awd ('15).
|-
| H || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas/E85 ||DOHC,<br /> 32 valve||Flex Fuel. Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]]. 510 PS/503 hp. Jaguar XFR ('13-'15).
|-
| K || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 550 PS/542 hp. Jaguar XJR/XJR LWB ('14-'17).
|-
| K || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 575 PS/567 hp. Jaguar XJR575 LWB ('18-'19).
|-
| L || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 495 PS/488 hp. Jaguar F-Type V8 S convertible ('14-'15).
|-
| L || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 550 PS/542 hp. Jaguar F-Type R ('16-'17).
|-
| N || 3.0L || 60° V6 || Gas ||DOHC,<br /> 24 valve||MPI. Variable intake valve timing. [[w:Jaguar AJ-V6 engine#AJ30|Jaguar AJ-V6 - AJ30 V6 engine]]. Jaguar S-Type 3.0 ('01-'02).
|-
| P || 4.0L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. Continuously variable intake valve timing. [[w:Jaguar AJ-V8 engine#4.0 L|Jaguar AJ-V8 - AJ28 V8 engine]]. Jaguar S-Type 4.0 ('01-'02).
|-
| P || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas/E85 ||DOHC,<br /> 32 valve||Flex Fuel. Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]]. 470 PS/464 hp. Jaguar XF Supercharged ('13-'15).
|-
| S || 2.0L || I4 Turbo [[w:Intercooler|IC]] || Gas || DOHC,<br /> 16 valve||Direct Injection. Dual VVT. [[w:Ford EcoBoost engine#2.0 L (2010–2018)|Ford EcoBoost engine (Mazda L engine-based)]].<br> Jaguar XF 2.0T ('13-'14), XF 2.0T Premium ('15).
|-
| T || 3.0L || 60° V6 || Gas ||DOHC,<br /> 24 valve||MPI. Variable intake valve timing. [[w:Jaguar AJ-V6 engine#AJ30|Jaguar AJ-V6 - AJ30 V6 engine]]. Jaguar S-Type 3.0 ('03-'05).
|-
| T || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas/E85 ||DOHC,<br /> 32 valve||Flex Fuel. Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]]. 470 PS/464 hp. Jaguar XJ/XJL Supercharged ('13-'15).
|-
| T || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar F-Type w/auto. trans. ('15-'17), F-Type Premium w/auto. trans. ('17).
|-
| U || 4.2L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. Continuously variable intake valve timing. [[w:Jaguar AJ-V8 engine#4.2 L|Jaguar AJ-V8 - AJ33 V8 engine]]. Jaguar S-Type 4.2 ('03-'05).
|-
| U || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 380 PS/375 hp. Jaguar F-Type S ('15), F-Type S Rwd w/auto. trans. ('16-'17).
|-
| V || 4.2L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||MPI. [[w:Jaguar AJ-V8 engine#Supercharged_2|Jaguar AJ-V8 - AJ33S V8 engine]]. Jaguar S-Type R ('03-'05).
|-
| V || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 380 PS/375 hp. Jaguar F-Type S Awd w/auto. trans. ('16-'17).
|-
| X || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas/E85 ||DOHC,<br /> 24 valve||Flex Fuel. Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XF 3.0 Rwd ('14).
|-
| Z || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 550 PS/542 hp. Jaguar XFR-S ('13-'15).
|-
| Z || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas/E85 ||DOHC,<br /> 24 valve||Flex Fuel. Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XJ Rwd, XJL Portfolio Rwd ('14-'15).
|-
| 1 || 5.0L || V8 || Gas/E85 ||DOHC,<br /> 32 valve||Flex Fuel. Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. Variable intake valve lift. Variable intake. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]]. Jaguar XJL Portfolio Rwd ('13).
|-
| 6 || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar F-Type w/man. trans. ('16-'17), F-Type Premium w/man. trans. ('17).
|-
| 7 || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XF 3.0 Rwd ('13), XJ Rwd ('13), F-Type ('14-'15).
|-
| 7 || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XF 3.0 Rwd ('15), XJ R-Sport Rwd ('16-'19), XJL Portfolio Rwd ('16-'19), XJ50 3.0 Rwd ('19).
|-
| 8 || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 575 PS/567 hp. Jaguar F-Type Project 7 ('16), F-Type SVR ('17).
|}
===Check Digit/Gearbox (Position 9)===
* USA /Canada [[Vehicle Identification Numbers (VIN codes)/Check digit|Check digit]]
===Model Year Code (Position 10)===
''See: [[Vehicle Identification Numbers (VIN codes)/Model year]]''
===Plant Code/Model Line/Engine (Position 11) 2000-2019===
* X - Halewood, Merseyside, England, UK - X-Type 2.5 ('02-'05)
* W - Halewood, Merseyside, England, UK - X-Type 3.0 ('02-'08)
* F - Castle Bromwich, West Midlands, England, UK - S-Type 3.0 ('00-'08)
* G - Castle Bromwich, West Midlands, England, UK - S-Type 4.0 ('00-'02)
* H - Castle Bromwich, West Midlands, England, UK - S-Type 4.2 ('03-'08)
* 1 - Castle Bromwich, West Midlands, England, UK - S-Type R (4.2 supercharged) ('03-'08)
* H - Castle Bromwich, West Midlands, England, UK - XF 4.2 ('09-'10)
* 1 - Castle Bromwich, West Midlands, England, UK - XF Supercharged (4.2 supercharged) ('09)
* L - Castle Bromwich, West Midlands, England, UK - XF 5.0 ('10-'12)
* M - Castle Bromwich, West Midlands, England, UK - XF Supercharged, XFR (5.0 supercharged) ('10-'15), XFR-S (5.0 supercharged) ('13-'15)
* P - Castle Bromwich, West Midlands, England, UK - XF 2.0T ('13-'15)
* 8 - Castle Bromwich, West Midlands, England, UK - XF 3.0 supercharged ('13-'15)
* L - Browns Lane plant, Coventry, West Midlands, England, UK - XJ8 (4.0) ('00-'03), XJ8L (4.0) ('00-'01), XJ8 Vanden Plas (4.0) ('00-'03), XJ Sport (4.0) ('02-'03)
* M - Browns Lane plant, Coventry, West Midlands, England, UK - XJ8 Vanden Plas Supercharged (4.0 supercharged) ('00-'01),<br> Super V8 (4.0 supercharged) ('02-'03), XJR (4.0 supercharged) ('00-'03)
* S - Browns Lane plant, Coventry, West Midlands, England, UK - XJ8 (4.2) ('04-'06), XJ8L (4.2) ('05-'06), XJ8 Vanden Plas (4.0) ('04-'06)
* T - Browns Lane plant, Coventry, West Midlands, England, UK - Super V8 (4.2 supercharged) ('05-'06), Super V8 Portfolio (4.2 supercharged) ('06),<br> XJR (4.2 supercharged) ('04-'06)
* S - Castle Bromwich, West Midlands, England, UK - XJ8 (4.2) ('07-'09), XJ8L (4.2) ('07-'09), XJ8 Vanden Plas (4.0) ('07-'09)
* T - Castle Bromwich, West Midlands, England, UK - Super V8 (4.2 supercharged) ('07-'09), Super V8 Portfolio (4.2 supercharged) ('09),<br> XJR (4.2 supercharged) ('07-'09)
* L - Castle Bromwich, West Midlands, England, UK - XJ (5.0) ('10-'12), XJL (5.0) ('10-'11), XJL Portfolio (5.0) ('12-'13)
* M - Castle Bromwich, West Midlands, England, UK - XJ/XJL Supercharged (5.0 supercharged) ('10-'19), XJ/XJL Supersport (5.0 supercharged) ('11-'13),<br> XJL Ultimate (5.0 supercharged) ('13), XJR SWB/LWB (5.0 supercharged) ('14-'17), XJR575 LWB (5.0 supercharged) ('18-'19), XJ50 LWB (5.0 supercharged) ('19), XJ Collection Sp. Ed. LWB (5.0 supercharged) ('19)
* 8 - Castle Bromwich, West Midlands, England, UK - XJ base (3.0 supercharged) ('13-'15), XJ R-Sport (3.0 supercharged) ('16-'19),<br> XJL Portfolio AWD (3.0 supercharged) ('13-'19), XJL Portfolio RWD (3.0 supercharged) ('14-'19), XJ50 LWB (3.0 supercharged) ('19)
* N - Browns Lane plant, Coventry, West Midlands, England, UK - XK8 (4.0) ('00-'02)
* P - Browns Lane plant, Coventry, West Midlands, England, UK - XKR (4.0 supercharged) ('00-'02)
* 2 - Browns Lane plant, Coventry, West Midlands, England, UK - XK8 (4.2) ('03-'06)
* 3 - Browns Lane plant, Coventry, West Midlands, England, UK - XKR (4.2 supercharged) ('03-'06)
* 5 - Castle Bromwich, West Midlands, England, UK - XK (4.2) ('07-'09)
* 9 - Castle Bromwich, West Midlands, England, UK - XKR (4.2 supercharged) ('07-'09)
* L - Castle Bromwich, West Midlands, England, UK - XK (5.0) ('10-'15)
* M - Castle Bromwich, West Midlands, England, UK - XKR (5.0 supercharged) ('10-'15), XKR-S (5.0 supercharged) ('12-'15), XKR-S GT (5.0 supercharged) ('14)
* 8 - Castle Bromwich, West Midlands, England, UK - F-Type Base, S (3.0 supercharged) ('14-'17), F-Type Premium (3.0 supercharged) ('17)
* M - Castle Bromwich, West Midlands, England, UK - F-Type V8S (5.0 supercharged) ('14-'15), F-Type R (5.0 supercharged) ('15-'17),<br> F-Type Project 7 (5.0 supercharged) ('16), F-Type SVR (5.0 supercharged) ('17)
===Model (Position 12)===
* C - X-Type ('02-'03)
* D - X-Type ('03-'04)
* E - X-Type ('04-'06)
* J - X-Type ('06-'08)
* L - S-Type ('00-'01)
* M - S-Type ('01-'04)
* N - S-Type ('04-'08)
* R - XF ('09-'11)
* S - XF ('11-'13)
* U - XF ('13-'15)
* F - XJ ('00-'03)
* G - XJ ('04-'06) [Browns Lane plant]
* H - XJ ('06-'09) [Castle Bromwich plant]
* V - XJ ('10-'16)
* W - XJ ('16-'19)
* A - XK ('00-'06)
* B - XK ('07-'15)
* K - F-Type ('14-'17)
'''Positions 13–17, Serial Number'''
==General Template for Jaguar's VIN format (1981 - 1999)==
===Jaguar WMIs (1981-1999) (Position 1-3)===
* SAJ - Jaguar passenger car
===Model Line (Position 4)===
{| class="wikitable"
|+Position 4
!VIN code
!Description
|-
|A
|[[w:Jaguar XJ#Series 3 (1979–1992)|Jaguar XJ6]] ('81-'87), XJ6 Vanden Plas ('82-'87)
|-
|B
|[[w:Jaguar XJ#Series 3 (1979–1992)|Jaguar XJ12]] (Canada only: '81-'88)
|-
|D
|[[w:Jaguar XJ#Series 3 (1979–1992)|Jaguar XJ12]] (Canada only: '89-'92)
|-
|H
|[[w:Jaguar XJ (XJ40)|Jaguar XJ6]] ('88-'89, '93-'94)
|-
|F
|[[w:Jaguar XJ (XJ40)|Jaguar XJ6]] ('90-'92)
|-
|H
|[[w:Jaguar XJ (XJ40)|Jaguar XJ6 Sovereign]] ('90-'92)
|-
|K
|[[w:Jaguar XJ (XJ40)#Daimler/Vanden Plas|Jaguar XJ6 Vanden Plas]] ('88-'94)
|-
|M
|[[w:Jaguar XJ (XJ40)#Majestic (1989–1992 – SWB; 1993–1994 – LWB)|Jaguar XJ6 Vanden Plas Majestic]] ('89-'90, '92)
|-
|M
|[[w:Jaguar XJ (XJ40)#XJ12 and Daimler Double Six (XJ81)|Jaguar XJ12]] ('94)
|-
|H
|[[w:Jaguar XJ (X300)|Jaguar XJ6]] ('95-'97)
|-
|H
|[[w:Jaguar XJ (X300)|Jaguar XJ6L]] LWB [X330] ('97)
|-
|K
|[[w:Jaguar XJ (X300)#Daimler/Jaguar Vanden Plas|Jaguar XJ6 Vanden Plas]] SWB ('95)
|-
|K
|[[w:Jaguar XJ (X300)#Daimler/Jaguar Vanden Plas|Jaguar XJ6 Vanden Plas]] LWB [X330] ('96-'97)
|-
|M
|[[w:Jaguar XJ (X300)#XJ12 (X305)|Jaguar XJ12]] SWB ('95)
|-
|M
|[[w:Jaguar XJ (X300)#XJ12 (X305)|Jaguar XJ12]] LWB [X330] ('96)
|-
|P
|[[w:Jaguar XJ (X300)#XJR (X306)|Jaguar XJR]] ('95-'97)
|-
|H
|[[w:Jaguar XJ (X308)|Jaguar XJ8]] ('98-'99)
|-
|H
|[[w:Jaguar XJ (X308)|Jaguar XJ8L]] LWB ('98-'99)
|-
|K
|[[w:Jaguar XJ (X308)#Daimler/Vanden Plas|Jaguar XJ8 Vanden Plas]] LWB ('98-'99)
|-
|P
|[[w:Jaguar XJ (X308)#XJR|Jaguar XJR]] ('98-'99)
|-
|N
|[[w:Jaguar XJS|Jaguar XJ-S]] ('82-'91), XJ-SC ('86-'88), XJS ('92-'96)
|-
|T
|[[w:Jaguar XJS|Jaguar XJ-S]] Rouge Collection ('89-'90), Classic Collection ('90-'91)
|-
|S
|[[w:Jaguar XJS#XJR-S|Jaguar XJR-S]] ('93)
|-
|G
|[[w:Jaguar XK (X100)|Jaguar XK8]] ('97-'99)
|}
===Class (Regional Spec)/Restraint System (Position 5):===
* V = N. American-spec (Manual seat belts)
* L = Canadian-spec (Manual seat belts)
* Y = XJ6 Vanden Plas [Series III] ('82-'87) (Manual seat belts)
* A = Motorized Shoulder Belts (XJ-S coupe '88-'89, XJ-SC '88)
* Y = Motorized Shoulder Belts (XJ-S coupe '89, XJ sedan '89-'92)
* W = Manual seat belts, Driver-side airbag (US: XJ-S '90-'93, XJ6 '93, XJ12 Early '94)
* X = Manual seat belts, Dual front airbags (US: XJS '94-'96, XJ6 '94-'97, XJ12 '94-'96, XJR '95-'97, XK8 '97-'99)
* X = Manual seat belts, Dual front airbags, & Front Side Airbags (US: XJ8/XJR '98-'99)
* D = Manual seat belts, Depowered Dual front airbags, & Front Side Airbags (US: XJ8/XJR '99)
* M = Manual seat belts, Driver-side airbag (Canada)
* N = Manual seat belts, Dual front airbags (Canada)
* F = Manual seat belts, Depowered Dual front airbags, & Front Side Airbags (Canada: XJ8/XJR '99)
===Body Style (Position 6):===
* 1 = 4-door sedan (XJ-series sedan '81-'99)
* 2 = 2-door convertible w/2+2 seating (XJS convertible '94-'96, XK8 convertible '97-'99)
* 3 = 2-door Cabriolet (XJ-SC '86-'88)
* 4 = 2-door convertible w/2-psgr. seating (factory-built XJS convertible '89-'94, XJR-S convertible '93)
* 5 = 2-door coupe (XJS coupe '82-'96, XJR-S coupe '93, XK8 coupe '97-'99)
* 5 = 2-door coupe (Hess & Eisenhardt-built XJS convertible '87-'88) [coupe conversion]
===Engine Type (Position 7):===
{| class="wikitable"
|+Position 7
|-
! VIN !! Size !! Type !! Fuel !! Valvetrain !! Engine Family/Notes/Applications
|-
| 1 || 4.0L || I6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||MPI. [[w:Jaguar AJ6 engine#AJ16S|Jaguar AJ16S I6]]. Jaguar XJR ('95-'97).
|-
| 2 || 4.2L || I6 || Gas ||DOHC,<br /> 12 valve||CA & Canada-spec. MPI. [[w:Jaguar XK engine|Jaguar XK I6]]. Jaguar XJ6 ('81-'82).
|-
| 2 || 4.0L || I6 || Gas ||DOHC,<br /> 24 valve||MPI. Dual-canister evaporative emissions system. [[w:Jaguar AJ6 engine#AJ16|Jaguar AJ16 I6]]. Jaguar XJ6 ('96-'97).
|-
| 2 || 4.0L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. Variable intake valve timing. Dual-canister evaporative emissions system. [[w:Jaguar AJ-V8 engine#4.0 L|Jaguar AJ-V8 - AJ26 V8 engine]].<br> Jaguar XJ8 ('98), XK8 ('98).
|-
| 3 || 4.2L || I6 || Gas ||DOHC,<br /> 12 valve||N. America-spec. MPI. [[w:Jaguar XK engine|Jaguar XK I6]]. Jaguar XJ6 ('81-'87).
|-
| 3 || 6.0L || 60° V12 || Gas ||SOHC,<br /> 24 valve||MPI. [[w:Jaguar V12 engine|Jaguar V12]] modified by [[w:Tom Walkinshaw Racing|JaguarSport]]. Jaguar XJR-S ('93).
|-
| 3 || 6.0L || 60° V12 || Gas ||SOHC,<br /> 24 valve||MPI. [[w:Jaguar V12 engine|Jaguar V12]]. Jaguar XJS ('94-'95), XJ12 ('94-'96).
|-
| 5 || 3.6L || I6 || Gas ||DOHC,<br /> 24 valve||N. America-spec - Low Compression. MPI. [[w:Jaguar AJ6 engine|Jaguar AJ6 I6]]. Jaguar XJ6 ('88-'89).
|-
| 6 || 3.6L || I6 || Gas ||DOHC,<br /> 24 valve||N. America-spec - High Compression. MPI. [[w:Jaguar AJ6 engine|Jaguar AJ6 I6]]. Jaguar XJ6 ('88).
|-
| 7 || 4.0L || I6 || Gas ||DOHC,<br /> 24 valve||MPI. [[w:Jaguar AJ6 engine|Jaguar AJ6 I6]]. Jaguar XJ6 ('90-'94), XJS ('93-'94).
|-
| 7 || 4.0L || I6 || Gas ||DOHC,<br /> 24 valve||MPI. [[w:Jaguar AJ6 engine#AJ16|Jaguar AJ16 I6]]. Jaguar XJ6 ('95-'96), XJS ('95-'96).
|-
| 7 || 4.0L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. Variable intake valve timing. [[w:Jaguar AJ-V8 engine#4.0 L|Jaguar AJ-V8 - AJ26 V8 engine]]. Jaguar XK8 ('97).
|-
| 8 || 5.3L || 60° V12 || Gas ||SOHC,<br /> 24 valve||N. America-spec. MPI. [[w:Jaguar V12 engine|Jaguar V12]]. Jaguar XJ-S ('82-'92), XJ12 (Canada only: '88-'92).
|-
| 8 || 4.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||MPI. Dual-canister evaporative emissions system. [[w:Jaguar AJ-V8 engine#Supercharged|Jaguar AJ-V8 - AJ26S V8 engine]]. Jaguar XJR ('98-'99).
|-
| 9 || 4.0L || I6 || Gas ||DOHC,<br /> 24 valve||Canada-spec. MPI. [[w:Jaguar AJ6 engine|Jaguar AJ6 I6]]. Jaguar XJ6 ('90-'93), XJS ('93).
|-
| 0 || 5.3L || 60° V12 || Gas ||SOHC,<br /> 24 valve||Canada-spec. MPI. [[w:Jaguar V12 engine|Jaguar V12]]. Jaguar XJ-S ('82-'87), XJ12 (Canada only: '85-'87).
|-
| 0 || 4.0L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. Continuously variable intake valve timing. Dual-canister evaporative emissions system. Enhanced evaporative emissions control system. [[w:Jaguar AJ-V8 engine#4.0 L|Jaguar AJ-V8 - AJ27 V8 engine]]. Jaguar XJ8 ('99), XK8 ('99).
|}
===Transmission & Steering Location (Position 8):===
* 4 = Automatic / LHD
* 8 = Manual / LHD ('93-'94 XJS 4.0 w/ optional 5-spd. manual)
===Check Digit/Gearbox (Position 9)===
* USA /Canada [[Vehicle Identification Numbers (VIN codes)/Check digit|Check digit]]
===Model Year Code (Position 10)===
''See: [[Vehicle Identification Numbers (VIN codes)/Model year]]''
===Plant Codes (Position 11)===
* C - Browns Lane plant, Coventry, West Midlands, England, UK
===Positions 12–17, Serial Number===
** 100001 and after - XJ-S/XJ-SC/XJS/XJR-S (XJ27)
** 300001 and after - XJ-series sedan Series III
** 500001 and after - XJ-series sedan (XJ40/XJ81)
** 720001 and after - XJ-series sedan (X300/X305/X306/X330)
** 810001 and after - XJ-series sedan (X308)
** 001001 and after - XK8 (X100)
ajeaccl9jggjfeh6yb1smz08qjnq4g1
4676686
4676684
2026-10-18T05:04:18Z
JustTheFacts33
3434282
/* Engine/Emissions Control System (Position 8) 2016-2017: */
4676686
wikitext
text/x-wiki
{{Vehicle Identification Numbers (VIN codes)/Warning}}{{clear}}
This VIN number decoding and designation system is used primarily for the North American Market. European and Asian markets use other decoding and designation systems.
==General Template for Jaguar's VIN format (All models: 2016- EXCEPT F-Type '16-'17, XJ '16-'19)==
===Jaguar WMIs (2016-) (Position 1-3)===
* SAJ - Jaguar passenger car (UK)
* SAD - Jaguar SUV (UK & Europe)
* L2C - Chery Jaguar Land Rover (China)
===Model Line (Position 4)===
{| class="wikitable"
|+Position 4
!VIN code
!Description
|-
|A
|[[w:Jaguar XE|Jaguar XE]] ('17-'20)
|-
|B
|[[w:Jaguar XF (X260)|Jaguar XF]] ('16-'24)
|-
|C
|[[w:Jaguar F-Pace|Jaguar F-Pace]] ('17-'26)
|-
|D
|[[w:Jaguar F-Type|Jaguar F-Type]] ('18-'24)
|-
|E
|[[w:Jaguar Type 01|Jaguar Type 01]] ('28-)
|-
|F
|[[w:Jaguar E-Pace|Jaguar E-Pace]] ('18-'24)
|-
|H
|[[w:Jaguar I-Pace|Jaguar I-Pace EV]] ('19-'24)
|}
===Trim Level/Drive Wheels/Restraint System (Position 5)===
{| class="wikitable"
|+Position 4
!VIN code
!Trim Level
!Drive Wheels
!Restraint System
|-
|D
|XF Premium '16-
|Rwd
|
|-
|E
|XF Prestige '16-
|Rwd
|
|-
|F
|XF R-Sport '16-
|Rwd
|
|-
|G
|XF S '16-
|Rwd
|
|-
|J
|XF Premium '16-
|Awd
|
|-
|K
|XF Prestige '16-
|Awd
|
|-
|L
|XF R-Sport '16-
|Awd
|
|-
|M
|XF S '16-
|Awd
|
|-
|N
|XF First Edition '16
|Awd
|
|}
===Body Style (Position 6):===
* 1 = Coupe (F-Type coupe)
* 2 = 5-door wagon (XF Sportbrake wagon '18-'20)
* 2 = 5-door (E-Pace, F-Pace, I-Pace EV)
* 4 = 4-door sedan (XE, XF sedan, Type 01)
* 5 = Convertible (F-Type convertible)
===Transmission (Position 7) 2016-2017:===
* B = Automatic (XE '17, XF '16-'17, F-Pace '17)
===Engine/Emissions Control System (Position 8) 2016-2017:===
{| class="wikitable"
|+Position 8
! VIN !! Size !! Type !! Fuel !! Valvetrain !! Engine Family/Notes/Applications
|-
| G || 2.0L || I4 Turbo [[w:Intercooler|IC]] || Gas || DOHC,<br /> 16 valve||Direct Injection. ULEV. Dual VVT. [[w:Ford EcoBoost engine#2.0 L (2010–2018)|Ford EcoBoost engine (Mazda L engine-based)]].<br> Jaguar XE 25t ('17).
|-
| N || 2.0L || I4 Turbo [[w:Intercooler|IC]] || Diesel || DOHC,<br /> 16 valve||Common-rail Direct Injection. Exhaust VVT. [[w:Ingenium engine family|JLR Ingenium AJ20D engine]]. Jaguar XE 20d, XF 20d, F-Pace 20d ('17).
|-
| V || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XF 35t ('16-'17) [If 5th pos. of VIN is NOT G or M]. Jaguar XE 35t ('17).<br> Jaguar F-Pace 35t ('17) [If 5th pos. of VIN is NOT M or P].
|-
| V || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 380 PS/375 hp. Jaguar XF S ('16-'17) [If 5th pos. of VIN is G or M].<br> Jaguar F-Pace S ('17) [If 5th pos. of VIN is M or P].
|}
===Engine (Position 7-8) 2018-:===
{| class="wikitable"
|+Position 7-8
! VIN Pos. 7 !! Power Level !! Transmission !! VIN Pos. 8 !! Size !! Type !! Fuel !! Valvetrain !! Engine Family/Notes/Applications
|-
| E || 550 PS/542 hp || 8-spd. Auto. || E || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct injection. Dual Continuously VCT (VVT). [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133S engine]]. Jaguar F-Type R ('18-'20), F-Pace SVR ('19-'24).
|-
| E || 450 PS/444 hp || 8-spd. Auto. || E || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct injection. Dual Continuously VCT (VVT). [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133S engine]]. Jaguar F-Type P450 ('22-24).
|-
| F || 575 PS/567 hp || 8-spd. Auto. || E || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct injection. Dual Continuously VCT (VVT). [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133S engine]]. Jaguar F-Type SVR ('18-'20), F-Type R ('21-'24),<br> F-Pace SVR 575 Edition ('25-'26).
|-
| F || 600 PS/592 hp || 8-spd. Auto. || E || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct injection. Dual Continuously VCT (VVT). [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133S engine]]. Jaguar XE SV Project 8 ('19).
|-
| F || 180 PS/178 hp || 8-spd. Auto. || N || 2.0L || I4 Turbo [[w:Intercooler|IC]] || Diesel || DOHC,<br /> 16 valve||Common-rail Direct Injection. Exhaust VVT.<br> [[w:Ingenium engine family|JLR Ingenium AJ20D4/AJ200D engine]].<br> Jaguar XE 20d ('18-'19), XF 20d ('18-'19), F-Pace 20d ('18-'19).
|-
| E || 340 PS/335 hp || 8-spd. Auto. || U || 3.0L || I6 Turbo [[w:Intercooler|IC]] || Gas || DOHC,<br /> 24 valve||48v Mild Hybrid. E-supercharger. Direct Injection. Dual VVT. CVVL (Intake VVL). [[w:Ingenium engine family|JLR Ingenium AJ20P6/AJ300P engine]].<br> Jaguar F-Pace P340 ('21-'22).
|-
| F || 400 PS/395 hp || 8-spd. Auto. || U || 3.0L || I6 Turbo [[w:Intercooler|IC]] || Gas || DOHC,<br /> 24 valve||48v Mild Hybrid. E-supercharger. Direct Injection. Dual VVT. CVVL (Intake VVL). [[w:Ingenium engine family|JLR Ingenium AJ20P6/AJ300P engine]].<br> Jaguar F-Pace P400 ('21-'26).
|-
| E || 340 PS/335 hp || 8-spd. Auto. || V || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. Continuously variable intake & exhaust valve timing.<br> [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> Jaguar XE 35t ('18), XF 35t ('18), F-Type ('18), F-Type P340 ('19-'20),<br> F-Pace 35t ('18).
|-
| F || 380 PS/375 hp || 8-spd. Auto. || V || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. Continuously variable intake & exhaust valve timing.<br> [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> Jaguar XE S ('18-'19), XF S ('18-'20), F-Type ('18),<br> F-Type P380 ('19), F-Type P380 R-Dynamic ('19-'21), F-Pace S ('18-'20).
|-
| G || 400 PS/395 hp || 8-spd. Auto. || V || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. Continuously variable intake & exhaust valve timing.<br> [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> Jaguar F-Type 400 Sport ('18).
|-
| J || 340 PS/335 hp || 6-spd. Man. || V || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. Continuously variable intake & exhaust valve timing.<br> [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> Jaguar F-Type ('18), F-Type P340 ('19).
|-
| K || 380 PS/375 hp || 6-spd. Man. || V || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. Continuously variable intake & exhaust valve timing.<br> [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> Jaguar F-Type P380 R-Dynamic ('18-'19).
|-
| E || 250 PS/247 hp || 8-spd. Auto. || X || 2.0L || I4 Turbo [[w:Intercooler|IC]] || Gas || DOHC,<br /> 16 valve||Direct Injection. Dual VVT. CVVL (Intake VVL).<br> [[w:Ingenium engine family|JLR Ingenium AJ20P4/AJ200P engine]].<br> Jaguar F-Pace P250 ('21-'26).
|-
| F || 250 PS/247 hp || 8-spd. Auto. || X || 2.0L || I4 Turbo [[w:Intercooler|IC]] || Gas || DOHC,<br /> 16 valve||Direct Injection. Dual VVT. CVVL (Intake VVL).<br> [[w:Ingenium engine family|JLR Ingenium AJ20P4/AJ200P engine]].<br> Jaguar XE 25t ('18-'20), XF 25t ('18-'20), XF P250 ('21-'24),<br> E-Pace P250 ('18-'24), F-Pace 25t ('18-'20).
|-
| G || 300 PS/296 hp || 8-spd. Auto. || X || 2.0L || I4 Turbo [[w:Intercooler|IC]] || Gas || DOHC,<br /> 16 valve||Direct Injection. Dual VVT. CVVL (Intake VVL).<br> [[w:Ingenium engine family|JLR Ingenium AJ20P4/AJ200P engine]].<br> Jaguar XE 30t ('18-'20), XF 30t ('18-'20), XF P300 ('21-'24),<br> F-Type ('18), F-Type P300 ('19-'21), E-Pace P300 R-Dynamic ('18-'20),<br> E-Pace 300 Sport ('21-'22), F-Pace 30t ('18-'20).
|}
====Motor Type for Electric Vehicles 2019-====
{| class="wikitable"
|+Position 7-8
|-
! VIN Pos. 7 !! Power Level !! Transmission !! VIN Pos. 8 !! # of Motors !! Battery Size !! Battery Type !! Fuel !! Drive Wheels !! Notes/Applications
|-
| S || 400 PS/394 hp || 1-spd. Auto. || 1 || 2 || 90 Kwh || Lithium-ion || Electricity || All || Jaguar I-Pace EV400 ('19-'24).
|-
| T || 1029 PS/1015 hp || 1-spd. Auto. || 1 || 3 <br> (1 Front,<br> 2 Rear) || 118 Kwh || Lithium-ion || Electricity || All || Jaguar Type 01 ('28-).
|}
===Check Digit/Gearbox (Position 9)===
* USA /Canada [[Vehicle Identification Numbers (VIN codes)/Check digit|Check digit]]
===Model Year Code (Position 10)===
''See: [[Vehicle Identification Numbers (VIN codes)/Model year]]''
===Plant Codes (Position 11) 2016-===
* A - Solihull, West Midlands, England, UK (XE '17, F-Pace '17-'26, Type 01 '28-)
* C - Castle Bromwich, West Midlands, England, UK (XE '17-'20, XF '16-'24, F-Type '18-'24)
* S - Oxford Road plant, Ryton, West Midlands, England, UK (JLR SVO plant) (XE SV Project 8 '19)
* 1 - Graz, Austria (Magna Steyr plant) (E-Pace '18-'24, I-Pace EV '19-'24)
===Model (Position 12)===
* 9 - XE ('17) [Solihull plant]
* P - XE ('17-'20) [Castle Bromwich plant]
* Y - XF ('16-'24)
* K - F-Type ('18-'24)
* Z - E-Pace ('18-'20)
* 0 - E-Pace ('20-'24)
* F - I-Pace EV ('19-'20)
* 6 - I-Pace EV ('20-'24)
'''Positions 13–17, Serial Number'''
==General Template for Jaguar's VIN format (All models: 2000-2015 plus F-Type '16-'17, XJ '16-'19)==
===Jaguar WMIs (2000-) (Position 1-3)===
* SAJ - Jaguar passenger car (UK)
* SAD - Jaguar SUV (UK & Europe)
===Regional Spec/Restraint System (Position 4):===
* J = Manual seat belts, Dual front airbags (US: XK8 '00)
* B = Manual seat belts, Dual front airbags (Canada: XK8 '00)
* D = Manual seat belts, Depowered Dual front airbags, & Front Side Airbags (US: S-Type '00-'02, XJ8/XJR '00-'03, XK8/XKR '01-'06, XK/XKR Early '07)
* F = Manual seat belts, Depowered Dual front airbags, & Front Side Airbags (Canada: S-Type '00-'02, XJ8/XJR '00-'03, XK8/XKR '01-'06, XK/XKR Early '07)
* E = Manual seat belts, Depowered Dual front airbags w/occupant position sensing, & Front Side Airbags & Side Curtain Airbags (US: X-Type '02-'04, S-Type '03-'04, XJ8/XJR Early '04)
* G = Manual seat belts, Depowered Dual front airbags w/occupant position sensing, & Front Side Airbags & Side Curtain Airbags (Canada: X-Type '02-'04,<br> S-Type '03-'04, XJ8/XJR Early '04)
* W = Manual seat belts, Depowered Dual front airbags w/occupant position (driver) and weight (fr. psgr.) sensing, & Front Side Airbags & Side Curtain Airbags <br> (US: X-Type '05-'08, S-Type '05-'08, XF '09-'15, XJ8/XJR '04-'09, XJ '10-)
* X = Manual seat belts, Depowered Dual front airbags w/occupant position (driver) and weight (fr. psgr.) sensing, & Front Side Airbags & Side Curtain Airbags (Canada: X-Type '05-'08, S-Type '05-'08, XF '09-'15, XJ8/XJR '04-'09, XJ '10-)
* W = Manual seat belts, Depowered Dual front airbags w/occupant position (driver) and weight (fr. psgr.) sensing, & Front Side Head/Thorax Airbags <br> (US: XK/XKR '07-'15, F-Type '14-)
* X = Manual seat belts, Depowered Dual front airbags w/occupant position (driver) and weight (fr. psgr.) sensing, & Front Side Head/Thorax Airbags <br> (Canada: XK/XKR '07-'15, F-Type '14-)
===Transmission & Steering Location (Position 5 - '00-'12):===
* A = Automatic / LHD
* B = Manual / LHD (X-Type '02-'05, S-Type 3.0 '03-'04)
===Transmission & Drive Wheels (Position 5 - '13-):===
* A = Automatic / Rwd (XF '13-'15, XJ '13-'19, XK '13-'15, F-Type '14-'17)
* B = Manual / Rwd (F-Type '16-'17)
* J = Automatic / Awd (XF Awd '13-'15, XJ Awd '13-'19, F-Type Awd '16-'17)
===Model Line (Position 6-7)===
{| class="wikitable"
|+Position 6-7
!VIN code
!Description
|-
|51
|[[w:Jaguar X-Type|Jaguar X-Type sedan - High Series]] ('02-'08)
|-
|52
|[[w:Jaguar X-Type|Jaguar X-Type sedan - Entry Series]] ('03-'04)
|-
|53
|[[w:Jaguar X-Type|Jaguar X-Type sedan w/Sport Package]] ('02-'03)
|-
|54
|[[w:Jaguar X-Type|Jaguar X-Type Sportwagon]] ('05-'08)
|-
|01
|[[w:Jaguar S-Type (1999)|Jaguar S-Type]] ('00-'08)
|-
|03
|[[w:Jaguar S-Type (1999)|Jaguar S-Type Sport]] [3.0, 4.0] ('02)
|-
|03
|[[w:Jaguar S-Type (1999)|Jaguar S-Type Sport]] [3.0, 4.2] ('03)
|-
|03
|[[w:Jaguar S-Type (1999)|Jaguar S-Type R]] ('03-'08)
|-
|05
|[[w:Jaguar XF (X250)|Jaguar XF Luxury]] ('09)
|-
|06
|[[w:Jaguar XF (X250)|Jaguar XF Premium Luxury]] ('09)
|-
|07
|[[w:Jaguar XF (X250)|Jaguar XF Supercharged]] ('09)
|-
|0E
|[[w:Jaguar XF (X250)|Jaguar XF]] ('13-'14)
|-
|0F
|[[w:Jaguar XF (X250)|Jaguar XF]] ('10-'12)
|-
|0F
|[[w:Jaguar XF (X250)|Jaguar XF 2.0T Premium]] [8th pos. of VIN is S] ('15)
|-
|0F
|[[w:Jaguar XF (X250)|Jaguar XF 3.0 Sport Rwd or 3.0 Portfolio Rwd]] [8th pos. of VIN is 7] ('15)
|-
|0F
|[[w:Jaguar XF (X250)|Jaguar XF 3.0 Sport Awd or 3.0 Portfolio Awd]] [8th pos. of VIN is F] ('15)
|-
|0G
|[[w:Jaguar XF (X250)|Jaguar XF Premium]] ('10-'11)
|-
|0H
|[[w:Jaguar XF (X250)|Jaguar XF Portfolio]] [8th pos. of VIN is B] ('12)
|-
|0H
|[[w:Jaguar XF (X250)|Jaguar XF Supercharged]] [8th pos. of VIN is E: '10-'13 or P: '13-'15]
|-
|0J
|[[w:Jaguar XF (X250)|Jaguar XFR]] ('10-'15)
|-
|0K
|[[w:Jaguar XF (X250)|Jaguar XFR-S]] ('13-'15)
|-
|8J
|[[w:Jaguar XF (X250)|Jaguar XFR w/Speed Pack]] ('13-'15)
|-
|12
|[[w:Jaguar XJ (X308)#Sport|Jaguar XJ Sport]] ('02-'03)
|-
|14
|[[w:Jaguar XJ (X308)|Jaguar XJ8]] ('00-'03)
|-
|15
|[[w:Jaguar XJ (X308)#XJR|Jaguar XJR]] ('00-'03)
|-
|23
|[[w:Jaguar XJ (X308)|Jaguar XJ8L]] (LWB) ('00-'01)
|-
|24
|[[w:Jaguar XJ (X308)#Daimler/Vanden Plas|Jaguar XJ8 Vanden Plas]] (LWB) ('00-'03)
|-
|25
|[[w:Jaguar XJ (X308)#Daimler/Vanden Plas|Jaguar XJ8 Vanden Plas Supercharged]] (LWB) ('00-'01)
|-
|25
|[[w:Jaguar XJ (X308)#Daimler/Vanden Plas|Jaguar XJ Super V8]] (LWB) ('02-'03)
|-
|71
|[[w:Jaguar XJ (X350)|Jaguar XJ8]] ('04-'09)
|-
|73
|[[w:Jaguar XJ (X350)|Jaguar XJR]] ('04-'09)
|-
|74
|[[w:Jaguar XJ (X350)|Jaguar XJ8 Vanden Plas]] (SWB) ('04)
|-
|79
|[[w:Jaguar XJ (X350)|Jaguar XJ8L]] (LWB) ('05-'09)
|-
|82
|[[w:Jaguar XJ (X350)|Jaguar XJ8 Vanden Plas]] (LWB) ('05-'09)
|-
|82
|[[w:Jaguar XJ (X350)|Jaguar XJ Super V8]] (LWB, 5-psgr.) ('05-'09)
|-
|86
|[[w:Jaguar XJ (X350)|Jaguar XJ Super V8 Portfolio]] (LWB, 4-psgr.) ('06)
|-
|94
|[[w:Jaguar XJ (X350)|Jaguar XJ Super V8 Portfolio]] (LWB, 5-psgr.) ('09)
|-
|1C
|[[w:Jaguar XJ (X351)|Jaguar XJ]] ('10-'15)
|-
|1C
|[[w:Jaguar XJ (X351)|Jaguar XJ R-Sport]] [8th pos. of VIN is 7 (Rwd) or D (Awd)] ('16-'19)
|-
|1C
|[[w:Jaguar XJ (X351)|Jaguar XJ Supercharged]] [8th pos. of VIN is E] ('16-'19)
|-
|1E
|[[w:Jaguar XJ (X351)|Jaguar XJR]] ('14-'17)
|-
|1G
|[[w:Jaguar XJ (X351)|Jaguar XJ Supercharged]] [8th pos. of VIN is E: '10-'13 or T: '13-'15]
|-
|1J
|[[w:Jaguar XJ (X351)|Jaguar XJ Supersport]] ('11-'12)
|-
|2E
|[[w:Jaguar XJ (X351)|Jaguar XJR LWB]] ('14-'17), XJR575 LWB ('18-'19)
|-
|2G
|[[w:Jaguar XJ (X351)|Jaguar XJL]] [8th pos. of VIN is B] ('10-'11)
|-
|2G
|[[w:Jaguar XJ (X351)|Jaguar XJL Portfolio Rwd]] [8th pos. of VIN is B: '12-'13 or 1: '13]
|-
|2G
|[[w:Jaguar XJ (X351)|Jaguar XJL Portfolio Rwd]] [8th pos. of VIN is Z: '14-'15)
|-
|2G
|[[w:Jaguar XJ (X351)|Jaguar XJL Portfolio Rwd]] [8th pos. of VIN is 7: '16-'19), XJ50 3.0 Rwd (LWB) '19
|-
|2G
|[[w:Jaguar XJ (X351)|Jaguar XJL Portfolio Awd]] [8th pos. of VIN is D] ('13-'19), XJ50 3.0 Awd (LWB) '19
|-
|2G
|[[w:Jaguar XJ (X351)|Jaguar XJL Supercharged]] [8th pos. of VIN is E: '10-'13, '16-'19 or T: '13-'15], XJ50 5.0 Rwd (LWB) '19, XJ Collection (LWB) '19
|-
|2J
|[[w:Jaguar XJ (X351)|Jaguar XJL Supersport]] ('11-'13)
|-
|2K
|[[w:Jaguar XJ (X351)|Jaguar XJL Ultimate]] ('13)
|-
|3F
|[[w:Jaguar XJ (X351)|Jaguar XJ Supersport w/Speed Pack]] ('12-'13)
|-
|3G
|[[w:Jaguar XJ (X351)|Jaguar XJL Supersport w/Speed Pack]] ('12-'13)
|-
|3H
|[[w:Jaguar XJ (X351)|Jaguar XJ Supercharged w/Sport & Speed Pack]] ('12-'15)
|-
|3K
|[[w:Jaguar XJ (X351)|Jaguar XJL Supercharged w/Sport & Speed Pack]] ('12-'15)
|-
|41
|[[w:Jaguar XK (X100)|Jaguar XK8/XKR coupe]] ('00-'06)
|-
|42
|[[w:Jaguar XK (X100)|Jaguar XK8/XKR convertible]] ('00-'06)
|-
|43
|[[w:Jaguar XK (X150)|Jaguar XK/XKR coupe]] ('07-'09)
|-
|44
|[[w:Jaguar XK (X150)|Jaguar XK/XKR convertible]] ('07-'09)
|-
|45
|[[w:Jaguar XK (X150)|Jaguar XKR Portfolio Edition coupe]] ('09)
|-
|46
|[[w:Jaguar XK (X150)|Jaguar XKR Portfolio Edition convertible]] ('09)
|-
|4D
|[[w:Jaguar XK (X150)|Jaguar XK Touring coupe]] [8th pos. of VIN is B] ('13-'14)
|-
|4E
|[[w:Jaguar XK (X150)|Jaguar XK Touring convertible]] [8th pos. of VIN is B] ('13-'14)
|-
|4D
|[[w:Jaguar XK (X150)|Jaguar XKR coupe]] [8th pos. of VIN is C] ('10-'15)
|-
|4E
|[[w:Jaguar XK (X150)|Jaguar XKR convertible]] [8th pos. of VIN is C] ('10-'15)
|-
|4F
|[[w:Jaguar XK (X150)|Jaguar XK coupe]] (most Portfolio Edition features are std.) [8th pos. of VIN is B] ('10-'15)
|-
|4F
|[[w:Jaguar XK (X150)|Jaguar XKR175 coupe]] [8th pos. of VIN is C] ('11)
|-
|4F
|[[w:Jaguar XK (X150)|Jaguar XKR coupe w/Dynamic Pack]] [8th pos. of VIN is C] ('13-'15), XK Final Fifty Edition coupe ('15)
|-
|4G
|[[w:Jaguar XK (X150)|Jaguar XK convertible]] (most Portfolio Edition features are std.) [8th pos. of VIN is B] ('10-'15)
|-
|4G
|[[w:Jaguar XK (X150)|Jaguar XKR convertible w/Dynamic Pack]] [8th pos. of VIN is C] ('13-'15), XK Final Fifty Edition convertible ('15)
|-
|4H
|[[w:Jaguar XK (X150)|Jaguar XKR-S coupe]] ('12-'15), XKR-S GT coupe ('14)
|-
|4J
|[[w:Jaguar XK (X150)|Jaguar XKR-S convertible]] ('12-'15)
|-
|6A
|[[w:Jaguar F-Type)|Jaguar F-Type coupe]] ('15-'17), F-Type Premium coupe '17
|-
|6B
|[[w:Jaguar F-Type)|Jaguar F-Type S coupe]] ('15-'17), F-Type S British Design Edition coupe '17
|-
|6D
|[[w:Jaguar F-Type)|Jaguar F-Type R coupe]] ('15-'17)
|-
|6E
|[[w:Jaguar F-Type)|Jaguar F-Type convertible]] ('14-'17), F-Type Premium convertible '17
|-
|6F
|[[w:Jaguar F-Type)|Jaguar F-Type S convertible]] ('14-'17), F-Type S British Design Edition convertible '17
|-
|6G
|[[w:Jaguar F-Type)|Jaguar F-Type V8 S convertible]] ('14-'15)
|-
|6H
|[[w:Jaguar F-Type)|Jaguar F-Type R convertible]] ('16-'17)
|-
|6J
|[[w:Jaguar F-Type)|Jaguar F-Type SVR coupe]] ('17)
|-
|6K
|[[w:Jaguar F-Type)|Jaguar F-Type SVR convertible]] ('17)
|-
|7A
|[[w:Jaguar F-Type#Project 7)|Jaguar F-Type Project 7 convertible]] ('16)
|}
===Engine/Emissions Control System (Position 8)===
{| class="wikitable"
|+Position 8
! VIN !! Size !! Type !! Fuel !! Valvetrain !! Engine Family/Notes/Applications
|-
| A || 3.0L || 60° V6 || Gas ||DOHC,<br /> 24 valve||MPI. ULEV. Variable intake valve timing. [[w:Jaguar AJ-V6 engine#AJ30|Jaguar AJ-V6 - AJ30 V6 engine]].<br> Jaguar X-Type 3.0 (Mid '05-'08), S-Type 3.0 ('06-'08).
|-
| A || 4.2L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. ULEV. Continuously variable intake valve timing. [[w:Jaguar AJ-V8 engine#4.2 L|Jaguar AJ-V8 - AJ34 V8 engine]]. Jaguar XF ('10).
|-
| A || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 550 PS/542 hp. Jaguar XKR-S ('12-'15), XKR-S GT ('14), F-Type R coupe ('15).
|-
| B || 4.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||MPI. [[w:Jaguar AJ-V8 engine#Supercharged|Jaguar AJ-V8 - AJ27S V8 engine]].<br> Jaguar XJR ('00-'03), Vanden Plas Supercharged ('00-'01), Super V8 ('02-'03), XKR ('00-'02).
|-
| B || 4.2L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||MPI. [[w:Jaguar AJ-V8 engine#Supercharged_2|Jaguar AJ-V8 - AJ33S V8 engine]]. Jaguar XJR ('04-'05), Super V8 ('05), XKR ('03-'06).
|-
| B || 4.2L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. ULEV. Continuously variable intake valve timing. [[w:Jaguar AJ-V8 engine#4.2 L|Jaguar AJ-V8 - AJ34 V8 engine]].<br> Jaguar S-Type ('06-'08), XF ('09), XJ8/Vanden Plas ('06-'09), XK ('07-'09).
|-
| B || 5.0L || V8 || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. Variable intake valve lift. Variable intake.<br> [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> Jaguar XF ('10-'12), XJ ('11-'12), XJL ('11), XJL Portfolio Rwd ('12-'13), XK ('10-'15), XK Touring ('13-'14).
|-
| C || 3.0L || 60° V6 || Gas ||DOHC,<br /> 24 valve||MPI. Variable intake valve timing. [[w:Jaguar AJ-V6 engine#AJ30|Jaguar AJ-V6 - AJ30 V6 engine]].<br> Jaguar S-Type 3.0 ('00-'01), X-Type 3.0 ('02-Mid '05).
|-
| C || 4.0L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. Continuously variable intake valve timing. [[w:Jaguar AJ-V8 engine#4.0 L|Jaguar AJ-V8 - AJ27 V8 engine]].<br> Jaguar XJ8/Vanden Plas ('00-'03), XJ Sport ('02-'03), XK8 ('00-'02).
|-
| C || 4.2L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. Continuously variable intake valve timing. [[w:Jaguar AJ-V8 engine#4.2 L|Jaguar AJ-V8 - AJ33 V8 engine]]. Jaguar XJ8 ('04-'05), XK8 ('03-'06).
|-
| C || 4.2L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||MPI. ULEV. Continuously variable intake valve timing. [[w:Jaguar AJ-V8 engine#Supercharged_2|Jaguar AJ-V8 - AJ34S V8 engine]].<br> Jaguar S-Type R ('06-'08), XF Supercharged ('09), XJR ('06-'09), Super V8 ('06-'09), XKR ('07-'09).
|-
| C || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 510 PS/503 hp. Jaguar XFR ('10-'13), XJ/XJL Supersport ('11-'13), XKR ('10-'15).
|-
| C || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 380 PS/375 hp. Jaguar F-Type S ('14-'15), F-Type S w/man. trans. ('16-'17).
|-
| D || 4.0L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. Continuously variable intake valve timing. [[w:Jaguar AJ-V8 engine#4.0 L|Jaguar AJ-V8 - AJ28 V8 engine]]. Jaguar S-Type 4.0 ('00-'01).
|-
| D || 2.5L || 60° V6 || Gas ||DOHC,<br /> 24 valve||MPI. Variable intake valve timing. [[w:Jaguar AJ-V6 engine#AJ25|Jaguar AJ-V6 - AJ25 V6 engine]]. Jaguar X-Type 2.5 ('02-'05).
|-
| D || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XJ Awd, XJL Portfolio Awd ('13-'15).
|-
| D || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XJ R-Sport Awd, XJL Portfolio Awd ('16-'19), XJ50 3.0 Awd ('19).
|-
| E || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 470 PS/464 hp.<br> Jaguar XF Supercharged ('10-'13), XJ/XJL Supercharged ('11-'13, '16-'19), XJ50 5.0 Rwd ('19), XJ Collection ('19).
|-
| F || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XF 3.0 Awd ('13-'14).
|-
| F || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XF 3.0 Awd ('15).
|-
| H || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas/E85 ||DOHC,<br /> 32 valve||Flex Fuel. Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]]. 510 PS/503 hp. Jaguar XFR ('13-'15).
|-
| K || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 550 PS/542 hp. Jaguar XJR/XJR LWB ('14-'17).
|-
| K || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 575 PS/567 hp. Jaguar XJR575 LWB ('18-'19).
|-
| L || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 495 PS/488 hp. Jaguar F-Type V8 S convertible ('14-'15).
|-
| L || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 550 PS/542 hp. Jaguar F-Type R ('16-'17).
|-
| N || 3.0L || 60° V6 || Gas ||DOHC,<br /> 24 valve||MPI. Variable intake valve timing. [[w:Jaguar AJ-V6 engine#AJ30|Jaguar AJ-V6 - AJ30 V6 engine]]. Jaguar S-Type 3.0 ('01-'02).
|-
| P || 4.0L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. Continuously variable intake valve timing. [[w:Jaguar AJ-V8 engine#4.0 L|Jaguar AJ-V8 - AJ28 V8 engine]]. Jaguar S-Type 4.0 ('01-'02).
|-
| P || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas/E85 ||DOHC,<br /> 32 valve||Flex Fuel. Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]]. 470 PS/464 hp. Jaguar XF Supercharged ('13-'15).
|-
| S || 2.0L || I4 Turbo [[w:Intercooler|IC]] || Gas || DOHC,<br /> 16 valve||Direct Injection. Dual VVT. [[w:Ford EcoBoost engine#2.0 L (2010–2018)|Ford EcoBoost engine (Mazda L engine-based)]].<br> Jaguar XF 2.0T ('13-'14), XF 2.0T Premium ('15).
|-
| T || 3.0L || 60° V6 || Gas ||DOHC,<br /> 24 valve||MPI. Variable intake valve timing. [[w:Jaguar AJ-V6 engine#AJ30|Jaguar AJ-V6 - AJ30 V6 engine]]. Jaguar S-Type 3.0 ('03-'05).
|-
| T || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas/E85 ||DOHC,<br /> 32 valve||Flex Fuel. Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]]. 470 PS/464 hp. Jaguar XJ/XJL Supercharged ('13-'15).
|-
| T || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar F-Type w/auto. trans. ('15-'17), F-Type Premium w/auto. trans. ('17).
|-
| U || 4.2L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. Continuously variable intake valve timing. [[w:Jaguar AJ-V8 engine#4.2 L|Jaguar AJ-V8 - AJ33 V8 engine]]. Jaguar S-Type 4.2 ('03-'05).
|-
| U || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 380 PS/375 hp. Jaguar F-Type S ('15), F-Type S Rwd w/auto. trans. ('16-'17).
|-
| V || 4.2L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||MPI. [[w:Jaguar AJ-V8 engine#Supercharged_2|Jaguar AJ-V8 - AJ33S V8 engine]]. Jaguar S-Type R ('03-'05).
|-
| V || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 380 PS/375 hp. Jaguar F-Type S Awd w/auto. trans. ('16-'17).
|-
| X || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas/E85 ||DOHC,<br /> 24 valve||Flex Fuel. Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XF 3.0 Rwd ('14).
|-
| Z || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 550 PS/542 hp. Jaguar XFR-S ('13-'15).
|-
| Z || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas/E85 ||DOHC,<br /> 24 valve||Flex Fuel. Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XJ Rwd, XJL Portfolio Rwd ('14-'15).
|-
| 1 || 5.0L || V8 || Gas/E85 ||DOHC,<br /> 32 valve||Flex Fuel. Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. Variable intake valve lift. Variable intake. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]]. Jaguar XJL Portfolio Rwd ('13).
|-
| 6 || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar F-Type w/man. trans. ('16-'17), F-Type Premium w/man. trans. ('17).
|-
| 7 || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XF 3.0 Rwd ('13), XJ Rwd ('13), F-Type ('14-'15).
|-
| 7 || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XF 3.0 Rwd ('15), XJ R-Sport Rwd ('16-'19), XJL Portfolio Rwd ('16-'19), XJ50 3.0 Rwd ('19).
|-
| 8 || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 575 PS/567 hp. Jaguar F-Type Project 7 ('16), F-Type SVR ('17).
|}
===Check Digit/Gearbox (Position 9)===
* USA /Canada [[Vehicle Identification Numbers (VIN codes)/Check digit|Check digit]]
===Model Year Code (Position 10)===
''See: [[Vehicle Identification Numbers (VIN codes)/Model year]]''
===Plant Code/Model Line/Engine (Position 11) 2000-2019===
* X - Halewood, Merseyside, England, UK - X-Type 2.5 ('02-'05)
* W - Halewood, Merseyside, England, UK - X-Type 3.0 ('02-'08)
* F - Castle Bromwich, West Midlands, England, UK - S-Type 3.0 ('00-'08)
* G - Castle Bromwich, West Midlands, England, UK - S-Type 4.0 ('00-'02)
* H - Castle Bromwich, West Midlands, England, UK - S-Type 4.2 ('03-'08)
* 1 - Castle Bromwich, West Midlands, England, UK - S-Type R (4.2 supercharged) ('03-'08)
* H - Castle Bromwich, West Midlands, England, UK - XF 4.2 ('09-'10)
* 1 - Castle Bromwich, West Midlands, England, UK - XF Supercharged (4.2 supercharged) ('09)
* L - Castle Bromwich, West Midlands, England, UK - XF 5.0 ('10-'12)
* M - Castle Bromwich, West Midlands, England, UK - XF Supercharged, XFR (5.0 supercharged) ('10-'15), XFR-S (5.0 supercharged) ('13-'15)
* P - Castle Bromwich, West Midlands, England, UK - XF 2.0T ('13-'15)
* 8 - Castle Bromwich, West Midlands, England, UK - XF 3.0 supercharged ('13-'15)
* L - Browns Lane plant, Coventry, West Midlands, England, UK - XJ8 (4.0) ('00-'03), XJ8L (4.0) ('00-'01), XJ8 Vanden Plas (4.0) ('00-'03), XJ Sport (4.0) ('02-'03)
* M - Browns Lane plant, Coventry, West Midlands, England, UK - XJ8 Vanden Plas Supercharged (4.0 supercharged) ('00-'01),<br> Super V8 (4.0 supercharged) ('02-'03), XJR (4.0 supercharged) ('00-'03)
* S - Browns Lane plant, Coventry, West Midlands, England, UK - XJ8 (4.2) ('04-'06), XJ8L (4.2) ('05-'06), XJ8 Vanden Plas (4.0) ('04-'06)
* T - Browns Lane plant, Coventry, West Midlands, England, UK - Super V8 (4.2 supercharged) ('05-'06), Super V8 Portfolio (4.2 supercharged) ('06),<br> XJR (4.2 supercharged) ('04-'06)
* S - Castle Bromwich, West Midlands, England, UK - XJ8 (4.2) ('07-'09), XJ8L (4.2) ('07-'09), XJ8 Vanden Plas (4.0) ('07-'09)
* T - Castle Bromwich, West Midlands, England, UK - Super V8 (4.2 supercharged) ('07-'09), Super V8 Portfolio (4.2 supercharged) ('09),<br> XJR (4.2 supercharged) ('07-'09)
* L - Castle Bromwich, West Midlands, England, UK - XJ (5.0) ('10-'12), XJL (5.0) ('10-'11), XJL Portfolio (5.0) ('12-'13)
* M - Castle Bromwich, West Midlands, England, UK - XJ/XJL Supercharged (5.0 supercharged) ('10-'19), XJ/XJL Supersport (5.0 supercharged) ('11-'13),<br> XJL Ultimate (5.0 supercharged) ('13), XJR SWB/LWB (5.0 supercharged) ('14-'17), XJR575 LWB (5.0 supercharged) ('18-'19), XJ50 LWB (5.0 supercharged) ('19), XJ Collection Sp. Ed. LWB (5.0 supercharged) ('19)
* 8 - Castle Bromwich, West Midlands, England, UK - XJ base (3.0 supercharged) ('13-'15), XJ R-Sport (3.0 supercharged) ('16-'19),<br> XJL Portfolio AWD (3.0 supercharged) ('13-'19), XJL Portfolio RWD (3.0 supercharged) ('14-'19), XJ50 LWB (3.0 supercharged) ('19)
* N - Browns Lane plant, Coventry, West Midlands, England, UK - XK8 (4.0) ('00-'02)
* P - Browns Lane plant, Coventry, West Midlands, England, UK - XKR (4.0 supercharged) ('00-'02)
* 2 - Browns Lane plant, Coventry, West Midlands, England, UK - XK8 (4.2) ('03-'06)
* 3 - Browns Lane plant, Coventry, West Midlands, England, UK - XKR (4.2 supercharged) ('03-'06)
* 5 - Castle Bromwich, West Midlands, England, UK - XK (4.2) ('07-'09)
* 9 - Castle Bromwich, West Midlands, England, UK - XKR (4.2 supercharged) ('07-'09)
* L - Castle Bromwich, West Midlands, England, UK - XK (5.0) ('10-'15)
* M - Castle Bromwich, West Midlands, England, UK - XKR (5.0 supercharged) ('10-'15), XKR-S (5.0 supercharged) ('12-'15), XKR-S GT (5.0 supercharged) ('14)
* 8 - Castle Bromwich, West Midlands, England, UK - F-Type Base, S (3.0 supercharged) ('14-'17), F-Type Premium (3.0 supercharged) ('17)
* M - Castle Bromwich, West Midlands, England, UK - F-Type V8S (5.0 supercharged) ('14-'15), F-Type R (5.0 supercharged) ('15-'17),<br> F-Type Project 7 (5.0 supercharged) ('16), F-Type SVR (5.0 supercharged) ('17)
===Model (Position 12)===
* C - X-Type ('02-'03)
* D - X-Type ('03-'04)
* E - X-Type ('04-'06)
* J - X-Type ('06-'08)
* L - S-Type ('00-'01)
* M - S-Type ('01-'04)
* N - S-Type ('04-'08)
* R - XF ('09-'11)
* S - XF ('11-'13)
* U - XF ('13-'15)
* F - XJ ('00-'03)
* G - XJ ('04-'06) [Browns Lane plant]
* H - XJ ('06-'09) [Castle Bromwich plant]
* V - XJ ('10-'16)
* W - XJ ('16-'19)
* A - XK ('00-'06)
* B - XK ('07-'15)
* K - F-Type ('14-'17)
'''Positions 13–17, Serial Number'''
==General Template for Jaguar's VIN format (1981 - 1999)==
===Jaguar WMIs (1981-1999) (Position 1-3)===
* SAJ - Jaguar passenger car
===Model Line (Position 4)===
{| class="wikitable"
|+Position 4
!VIN code
!Description
|-
|A
|[[w:Jaguar XJ#Series 3 (1979–1992)|Jaguar XJ6]] ('81-'87), XJ6 Vanden Plas ('82-'87)
|-
|B
|[[w:Jaguar XJ#Series 3 (1979–1992)|Jaguar XJ12]] (Canada only: '81-'88)
|-
|D
|[[w:Jaguar XJ#Series 3 (1979–1992)|Jaguar XJ12]] (Canada only: '89-'92)
|-
|H
|[[w:Jaguar XJ (XJ40)|Jaguar XJ6]] ('88-'89, '93-'94)
|-
|F
|[[w:Jaguar XJ (XJ40)|Jaguar XJ6]] ('90-'92)
|-
|H
|[[w:Jaguar XJ (XJ40)|Jaguar XJ6 Sovereign]] ('90-'92)
|-
|K
|[[w:Jaguar XJ (XJ40)#Daimler/Vanden Plas|Jaguar XJ6 Vanden Plas]] ('88-'94)
|-
|M
|[[w:Jaguar XJ (XJ40)#Majestic (1989–1992 – SWB; 1993–1994 – LWB)|Jaguar XJ6 Vanden Plas Majestic]] ('89-'90, '92)
|-
|M
|[[w:Jaguar XJ (XJ40)#XJ12 and Daimler Double Six (XJ81)|Jaguar XJ12]] ('94)
|-
|H
|[[w:Jaguar XJ (X300)|Jaguar XJ6]] ('95-'97)
|-
|H
|[[w:Jaguar XJ (X300)|Jaguar XJ6L]] LWB [X330] ('97)
|-
|K
|[[w:Jaguar XJ (X300)#Daimler/Jaguar Vanden Plas|Jaguar XJ6 Vanden Plas]] SWB ('95)
|-
|K
|[[w:Jaguar XJ (X300)#Daimler/Jaguar Vanden Plas|Jaguar XJ6 Vanden Plas]] LWB [X330] ('96-'97)
|-
|M
|[[w:Jaguar XJ (X300)#XJ12 (X305)|Jaguar XJ12]] SWB ('95)
|-
|M
|[[w:Jaguar XJ (X300)#XJ12 (X305)|Jaguar XJ12]] LWB [X330] ('96)
|-
|P
|[[w:Jaguar XJ (X300)#XJR (X306)|Jaguar XJR]] ('95-'97)
|-
|H
|[[w:Jaguar XJ (X308)|Jaguar XJ8]] ('98-'99)
|-
|H
|[[w:Jaguar XJ (X308)|Jaguar XJ8L]] LWB ('98-'99)
|-
|K
|[[w:Jaguar XJ (X308)#Daimler/Vanden Plas|Jaguar XJ8 Vanden Plas]] LWB ('98-'99)
|-
|P
|[[w:Jaguar XJ (X308)#XJR|Jaguar XJR]] ('98-'99)
|-
|N
|[[w:Jaguar XJS|Jaguar XJ-S]] ('82-'91), XJ-SC ('86-'88), XJS ('92-'96)
|-
|T
|[[w:Jaguar XJS|Jaguar XJ-S]] Rouge Collection ('89-'90), Classic Collection ('90-'91)
|-
|S
|[[w:Jaguar XJS#XJR-S|Jaguar XJR-S]] ('93)
|-
|G
|[[w:Jaguar XK (X100)|Jaguar XK8]] ('97-'99)
|}
===Class (Regional Spec)/Restraint System (Position 5):===
* V = N. American-spec (Manual seat belts)
* L = Canadian-spec (Manual seat belts)
* Y = XJ6 Vanden Plas [Series III] ('82-'87) (Manual seat belts)
* A = Motorized Shoulder Belts (XJ-S coupe '88-'89, XJ-SC '88)
* Y = Motorized Shoulder Belts (XJ-S coupe '89, XJ sedan '89-'92)
* W = Manual seat belts, Driver-side airbag (US: XJ-S '90-'93, XJ6 '93, XJ12 Early '94)
* X = Manual seat belts, Dual front airbags (US: XJS '94-'96, XJ6 '94-'97, XJ12 '94-'96, XJR '95-'97, XK8 '97-'99)
* X = Manual seat belts, Dual front airbags, & Front Side Airbags (US: XJ8/XJR '98-'99)
* D = Manual seat belts, Depowered Dual front airbags, & Front Side Airbags (US: XJ8/XJR '99)
* M = Manual seat belts, Driver-side airbag (Canada)
* N = Manual seat belts, Dual front airbags (Canada)
* F = Manual seat belts, Depowered Dual front airbags, & Front Side Airbags (Canada: XJ8/XJR '99)
===Body Style (Position 6):===
* 1 = 4-door sedan (XJ-series sedan '81-'99)
* 2 = 2-door convertible w/2+2 seating (XJS convertible '94-'96, XK8 convertible '97-'99)
* 3 = 2-door Cabriolet (XJ-SC '86-'88)
* 4 = 2-door convertible w/2-psgr. seating (factory-built XJS convertible '89-'94, XJR-S convertible '93)
* 5 = 2-door coupe (XJS coupe '82-'96, XJR-S coupe '93, XK8 coupe '97-'99)
* 5 = 2-door coupe (Hess & Eisenhardt-built XJS convertible '87-'88) [coupe conversion]
===Engine Type (Position 7):===
{| class="wikitable"
|+Position 7
|-
! VIN !! Size !! Type !! Fuel !! Valvetrain !! Engine Family/Notes/Applications
|-
| 1 || 4.0L || I6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||MPI. [[w:Jaguar AJ6 engine#AJ16S|Jaguar AJ16S I6]]. Jaguar XJR ('95-'97).
|-
| 2 || 4.2L || I6 || Gas ||DOHC,<br /> 12 valve||CA & Canada-spec. MPI. [[w:Jaguar XK engine|Jaguar XK I6]]. Jaguar XJ6 ('81-'82).
|-
| 2 || 4.0L || I6 || Gas ||DOHC,<br /> 24 valve||MPI. Dual-canister evaporative emissions system. [[w:Jaguar AJ6 engine#AJ16|Jaguar AJ16 I6]]. Jaguar XJ6 ('96-'97).
|-
| 2 || 4.0L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. Variable intake valve timing. Dual-canister evaporative emissions system. [[w:Jaguar AJ-V8 engine#4.0 L|Jaguar AJ-V8 - AJ26 V8 engine]].<br> Jaguar XJ8 ('98), XK8 ('98).
|-
| 3 || 4.2L || I6 || Gas ||DOHC,<br /> 12 valve||N. America-spec. MPI. [[w:Jaguar XK engine|Jaguar XK I6]]. Jaguar XJ6 ('81-'87).
|-
| 3 || 6.0L || 60° V12 || Gas ||SOHC,<br /> 24 valve||MPI. [[w:Jaguar V12 engine|Jaguar V12]] modified by [[w:Tom Walkinshaw Racing|JaguarSport]]. Jaguar XJR-S ('93).
|-
| 3 || 6.0L || 60° V12 || Gas ||SOHC,<br /> 24 valve||MPI. [[w:Jaguar V12 engine|Jaguar V12]]. Jaguar XJS ('94-'95), XJ12 ('94-'96).
|-
| 5 || 3.6L || I6 || Gas ||DOHC,<br /> 24 valve||N. America-spec - Low Compression. MPI. [[w:Jaguar AJ6 engine|Jaguar AJ6 I6]]. Jaguar XJ6 ('88-'89).
|-
| 6 || 3.6L || I6 || Gas ||DOHC,<br /> 24 valve||N. America-spec - High Compression. MPI. [[w:Jaguar AJ6 engine|Jaguar AJ6 I6]]. Jaguar XJ6 ('88).
|-
| 7 || 4.0L || I6 || Gas ||DOHC,<br /> 24 valve||MPI. [[w:Jaguar AJ6 engine|Jaguar AJ6 I6]]. Jaguar XJ6 ('90-'94), XJS ('93-'94).
|-
| 7 || 4.0L || I6 || Gas ||DOHC,<br /> 24 valve||MPI. [[w:Jaguar AJ6 engine#AJ16|Jaguar AJ16 I6]]. Jaguar XJ6 ('95-'96), XJS ('95-'96).
|-
| 7 || 4.0L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. Variable intake valve timing. [[w:Jaguar AJ-V8 engine#4.0 L|Jaguar AJ-V8 - AJ26 V8 engine]]. Jaguar XK8 ('97).
|-
| 8 || 5.3L || 60° V12 || Gas ||SOHC,<br /> 24 valve||N. America-spec. MPI. [[w:Jaguar V12 engine|Jaguar V12]]. Jaguar XJ-S ('82-'92), XJ12 (Canada only: '88-'92).
|-
| 8 || 4.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||MPI. Dual-canister evaporative emissions system. [[w:Jaguar AJ-V8 engine#Supercharged|Jaguar AJ-V8 - AJ26S V8 engine]]. Jaguar XJR ('98-'99).
|-
| 9 || 4.0L || I6 || Gas ||DOHC,<br /> 24 valve||Canada-spec. MPI. [[w:Jaguar AJ6 engine|Jaguar AJ6 I6]]. Jaguar XJ6 ('90-'93), XJS ('93).
|-
| 0 || 5.3L || 60° V12 || Gas ||SOHC,<br /> 24 valve||Canada-spec. MPI. [[w:Jaguar V12 engine|Jaguar V12]]. Jaguar XJ-S ('82-'87), XJ12 (Canada only: '85-'87).
|-
| 0 || 4.0L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. Continuously variable intake valve timing. Dual-canister evaporative emissions system. Enhanced evaporative emissions control system. [[w:Jaguar AJ-V8 engine#4.0 L|Jaguar AJ-V8 - AJ27 V8 engine]]. Jaguar XJ8 ('99), XK8 ('99).
|}
===Transmission & Steering Location (Position 8):===
* 4 = Automatic / LHD
* 8 = Manual / LHD ('93-'94 XJS 4.0 w/ optional 5-spd. manual)
===Check Digit/Gearbox (Position 9)===
* USA /Canada [[Vehicle Identification Numbers (VIN codes)/Check digit|Check digit]]
===Model Year Code (Position 10)===
''See: [[Vehicle Identification Numbers (VIN codes)/Model year]]''
===Plant Codes (Position 11)===
* C - Browns Lane plant, Coventry, West Midlands, England, UK
===Positions 12–17, Serial Number===
** 100001 and after - XJ-S/XJ-SC/XJS/XJR-S (XJ27)
** 300001 and after - XJ-series sedan Series III
** 500001 and after - XJ-series sedan (XJ40/XJ81)
** 720001 and after - XJ-series sedan (X300/X305/X306/X330)
** 810001 and after - XJ-series sedan (X308)
** 001001 and after - XK8 (X100)
5jbufen6acsarjy6tx9j3l1jvhjeupn
4676690
4676686
2026-10-18T05:19:58Z
JustTheFacts33
3434282
/* Trim Level/Drive Wheels/Restraint System (Position 5) */
4676690
wikitext
text/x-wiki
{{Vehicle Identification Numbers (VIN codes)/Warning}}{{clear}}
This VIN number decoding and designation system is used primarily for the North American Market. European and Asian markets use other decoding and designation systems.
==General Template for Jaguar's VIN format (All models: 2016- EXCEPT F-Type '16-'17, XJ '16-'19)==
===Jaguar WMIs (2016-) (Position 1-3)===
* SAJ - Jaguar passenger car (UK)
* SAD - Jaguar SUV (UK & Europe)
* L2C - Chery Jaguar Land Rover (China)
===Model Line (Position 4)===
{| class="wikitable"
|+Position 4
!VIN code
!Description
|-
|A
|[[w:Jaguar XE|Jaguar XE]] ('17-'20)
|-
|B
|[[w:Jaguar XF (X260)|Jaguar XF]] ('16-'24)
|-
|C
|[[w:Jaguar F-Pace|Jaguar F-Pace]] ('17-'26)
|-
|D
|[[w:Jaguar F-Type|Jaguar F-Type]] ('18-'24)
|-
|E
|[[w:Jaguar Type 01|Jaguar Type 01]] ('28-)
|-
|F
|[[w:Jaguar E-Pace|Jaguar E-Pace]] ('18-'24)
|-
|H
|[[w:Jaguar I-Pace|Jaguar I-Pace EV]] ('19-'24)
|}
===Trim Level/Drive Wheels/Restraint System (Position 5)===
{| class="wikitable"
|+Position 4
!VIN code
!Trim Level
!Drive Wheels
!Restraint System
|-
|D
|XF Premium '16-'17
|Rwd
|
|-
|E
|XF Prestige '16-'17
|Rwd
|
|-
|F
|XF R-Sport '16-'17
|Rwd
|
|-
|G
|XF S '16-'17
|Rwd
|
|-
|J
|XF Premium '16-'17
|Awd
|
|-
|K
|XF Prestige '16-'17
|Awd
|
|-
|L
|XF R-Sport '16-'17
|Awd
|
|-
|M
|XF S '16-'17
|Awd
|
|-
|N
|XF First Edition '16
|Awd
|
|-
|R
|XF Base model '17
|Rwd
|
|-
|S
|XF Base model '17
|Awd
|
|-
|}
===Body Style (Position 6):===
* 1 = Coupe (F-Type coupe)
* 2 = 5-door wagon (XF Sportbrake wagon '18-'20)
* 2 = 5-door (E-Pace, F-Pace, I-Pace EV)
* 4 = 4-door sedan (XE, XF sedan, Type 01)
* 5 = Convertible (F-Type convertible)
===Transmission (Position 7) 2016-2017:===
* B = Automatic (XE '17, XF '16-'17, F-Pace '17)
===Engine/Emissions Control System (Position 8) 2016-2017:===
{| class="wikitable"
|+Position 8
! VIN !! Size !! Type !! Fuel !! Valvetrain !! Engine Family/Notes/Applications
|-
| G || 2.0L || I4 Turbo [[w:Intercooler|IC]] || Gas || DOHC,<br /> 16 valve||Direct Injection. ULEV. Dual VVT. [[w:Ford EcoBoost engine#2.0 L (2010–2018)|Ford EcoBoost engine (Mazda L engine-based)]].<br> Jaguar XE 25t ('17).
|-
| N || 2.0L || I4 Turbo [[w:Intercooler|IC]] || Diesel || DOHC,<br /> 16 valve||Common-rail Direct Injection. Exhaust VVT. [[w:Ingenium engine family|JLR Ingenium AJ20D engine]]. Jaguar XE 20d, XF 20d, F-Pace 20d ('17).
|-
| V || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XF 35t ('16-'17) [If 5th pos. of VIN is NOT G or M]. Jaguar XE 35t ('17).<br> Jaguar F-Pace 35t ('17) [If 5th pos. of VIN is NOT M or P].
|-
| V || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 380 PS/375 hp. Jaguar XF S ('16-'17) [If 5th pos. of VIN is G or M].<br> Jaguar F-Pace S ('17) [If 5th pos. of VIN is M or P].
|}
===Engine (Position 7-8) 2018-:===
{| class="wikitable"
|+Position 7-8
! VIN Pos. 7 !! Power Level !! Transmission !! VIN Pos. 8 !! Size !! Type !! Fuel !! Valvetrain !! Engine Family/Notes/Applications
|-
| E || 550 PS/542 hp || 8-spd. Auto. || E || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct injection. Dual Continuously VCT (VVT). [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133S engine]]. Jaguar F-Type R ('18-'20), F-Pace SVR ('19-'24).
|-
| E || 450 PS/444 hp || 8-spd. Auto. || E || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct injection. Dual Continuously VCT (VVT). [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133S engine]]. Jaguar F-Type P450 ('22-24).
|-
| F || 575 PS/567 hp || 8-spd. Auto. || E || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct injection. Dual Continuously VCT (VVT). [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133S engine]]. Jaguar F-Type SVR ('18-'20), F-Type R ('21-'24),<br> F-Pace SVR 575 Edition ('25-'26).
|-
| F || 600 PS/592 hp || 8-spd. Auto. || E || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct injection. Dual Continuously VCT (VVT). [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133S engine]]. Jaguar XE SV Project 8 ('19).
|-
| F || 180 PS/178 hp || 8-spd. Auto. || N || 2.0L || I4 Turbo [[w:Intercooler|IC]] || Diesel || DOHC,<br /> 16 valve||Common-rail Direct Injection. Exhaust VVT.<br> [[w:Ingenium engine family|JLR Ingenium AJ20D4/AJ200D engine]].<br> Jaguar XE 20d ('18-'19), XF 20d ('18-'19), F-Pace 20d ('18-'19).
|-
| E || 340 PS/335 hp || 8-spd. Auto. || U || 3.0L || I6 Turbo [[w:Intercooler|IC]] || Gas || DOHC,<br /> 24 valve||48v Mild Hybrid. E-supercharger. Direct Injection. Dual VVT. CVVL (Intake VVL). [[w:Ingenium engine family|JLR Ingenium AJ20P6/AJ300P engine]].<br> Jaguar F-Pace P340 ('21-'22).
|-
| F || 400 PS/395 hp || 8-spd. Auto. || U || 3.0L || I6 Turbo [[w:Intercooler|IC]] || Gas || DOHC,<br /> 24 valve||48v Mild Hybrid. E-supercharger. Direct Injection. Dual VVT. CVVL (Intake VVL). [[w:Ingenium engine family|JLR Ingenium AJ20P6/AJ300P engine]].<br> Jaguar F-Pace P400 ('21-'26).
|-
| E || 340 PS/335 hp || 8-spd. Auto. || V || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. Continuously variable intake & exhaust valve timing.<br> [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> Jaguar XE 35t ('18), XF 35t ('18), F-Type ('18), F-Type P340 ('19-'20),<br> F-Pace 35t ('18).
|-
| F || 380 PS/375 hp || 8-spd. Auto. || V || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. Continuously variable intake & exhaust valve timing.<br> [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> Jaguar XE S ('18-'19), XF S ('18-'20), F-Type ('18),<br> F-Type P380 ('19), F-Type P380 R-Dynamic ('19-'21), F-Pace S ('18-'20).
|-
| G || 400 PS/395 hp || 8-spd. Auto. || V || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. Continuously variable intake & exhaust valve timing.<br> [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> Jaguar F-Type 400 Sport ('18).
|-
| J || 340 PS/335 hp || 6-spd. Man. || V || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. Continuously variable intake & exhaust valve timing.<br> [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> Jaguar F-Type ('18), F-Type P340 ('19).
|-
| K || 380 PS/375 hp || 6-spd. Man. || V || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. Continuously variable intake & exhaust valve timing.<br> [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> Jaguar F-Type P380 R-Dynamic ('18-'19).
|-
| E || 250 PS/247 hp || 8-spd. Auto. || X || 2.0L || I4 Turbo [[w:Intercooler|IC]] || Gas || DOHC,<br /> 16 valve||Direct Injection. Dual VVT. CVVL (Intake VVL).<br> [[w:Ingenium engine family|JLR Ingenium AJ20P4/AJ200P engine]].<br> Jaguar F-Pace P250 ('21-'26).
|-
| F || 250 PS/247 hp || 8-spd. Auto. || X || 2.0L || I4 Turbo [[w:Intercooler|IC]] || Gas || DOHC,<br /> 16 valve||Direct Injection. Dual VVT. CVVL (Intake VVL).<br> [[w:Ingenium engine family|JLR Ingenium AJ20P4/AJ200P engine]].<br> Jaguar XE 25t ('18-'20), XF 25t ('18-'20), XF P250 ('21-'24),<br> E-Pace P250 ('18-'24), F-Pace 25t ('18-'20).
|-
| G || 300 PS/296 hp || 8-spd. Auto. || X || 2.0L || I4 Turbo [[w:Intercooler|IC]] || Gas || DOHC,<br /> 16 valve||Direct Injection. Dual VVT. CVVL (Intake VVL).<br> [[w:Ingenium engine family|JLR Ingenium AJ20P4/AJ200P engine]].<br> Jaguar XE 30t ('18-'20), XF 30t ('18-'20), XF P300 ('21-'24),<br> F-Type ('18), F-Type P300 ('19-'21), E-Pace P300 R-Dynamic ('18-'20),<br> E-Pace 300 Sport ('21-'22), F-Pace 30t ('18-'20).
|}
====Motor Type for Electric Vehicles 2019-====
{| class="wikitable"
|+Position 7-8
|-
! VIN Pos. 7 !! Power Level !! Transmission !! VIN Pos. 8 !! # of Motors !! Battery Size !! Battery Type !! Fuel !! Drive Wheels !! Notes/Applications
|-
| S || 400 PS/394 hp || 1-spd. Auto. || 1 || 2 || 90 Kwh || Lithium-ion || Electricity || All || Jaguar I-Pace EV400 ('19-'24).
|-
| T || 1029 PS/1015 hp || 1-spd. Auto. || 1 || 3 <br> (1 Front,<br> 2 Rear) || 118 Kwh || Lithium-ion || Electricity || All || Jaguar Type 01 ('28-).
|}
===Check Digit/Gearbox (Position 9)===
* USA /Canada [[Vehicle Identification Numbers (VIN codes)/Check digit|Check digit]]
===Model Year Code (Position 10)===
''See: [[Vehicle Identification Numbers (VIN codes)/Model year]]''
===Plant Codes (Position 11) 2016-===
* A - Solihull, West Midlands, England, UK (XE '17, F-Pace '17-'26, Type 01 '28-)
* C - Castle Bromwich, West Midlands, England, UK (XE '17-'20, XF '16-'24, F-Type '18-'24)
* S - Oxford Road plant, Ryton, West Midlands, England, UK (JLR SVO plant) (XE SV Project 8 '19)
* 1 - Graz, Austria (Magna Steyr plant) (E-Pace '18-'24, I-Pace EV '19-'24)
===Model (Position 12)===
* 9 - XE ('17) [Solihull plant]
* P - XE ('17-'20) [Castle Bromwich plant]
* Y - XF ('16-'24)
* K - F-Type ('18-'24)
* Z - E-Pace ('18-'20)
* 0 - E-Pace ('20-'24)
* F - I-Pace EV ('19-'20)
* 6 - I-Pace EV ('20-'24)
'''Positions 13–17, Serial Number'''
==General Template for Jaguar's VIN format (All models: 2000-2015 plus F-Type '16-'17, XJ '16-'19)==
===Jaguar WMIs (2000-) (Position 1-3)===
* SAJ - Jaguar passenger car (UK)
* SAD - Jaguar SUV (UK & Europe)
===Regional Spec/Restraint System (Position 4):===
* J = Manual seat belts, Dual front airbags (US: XK8 '00)
* B = Manual seat belts, Dual front airbags (Canada: XK8 '00)
* D = Manual seat belts, Depowered Dual front airbags, & Front Side Airbags (US: S-Type '00-'02, XJ8/XJR '00-'03, XK8/XKR '01-'06, XK/XKR Early '07)
* F = Manual seat belts, Depowered Dual front airbags, & Front Side Airbags (Canada: S-Type '00-'02, XJ8/XJR '00-'03, XK8/XKR '01-'06, XK/XKR Early '07)
* E = Manual seat belts, Depowered Dual front airbags w/occupant position sensing, & Front Side Airbags & Side Curtain Airbags (US: X-Type '02-'04, S-Type '03-'04, XJ8/XJR Early '04)
* G = Manual seat belts, Depowered Dual front airbags w/occupant position sensing, & Front Side Airbags & Side Curtain Airbags (Canada: X-Type '02-'04,<br> S-Type '03-'04, XJ8/XJR Early '04)
* W = Manual seat belts, Depowered Dual front airbags w/occupant position (driver) and weight (fr. psgr.) sensing, & Front Side Airbags & Side Curtain Airbags <br> (US: X-Type '05-'08, S-Type '05-'08, XF '09-'15, XJ8/XJR '04-'09, XJ '10-)
* X = Manual seat belts, Depowered Dual front airbags w/occupant position (driver) and weight (fr. psgr.) sensing, & Front Side Airbags & Side Curtain Airbags (Canada: X-Type '05-'08, S-Type '05-'08, XF '09-'15, XJ8/XJR '04-'09, XJ '10-)
* W = Manual seat belts, Depowered Dual front airbags w/occupant position (driver) and weight (fr. psgr.) sensing, & Front Side Head/Thorax Airbags <br> (US: XK/XKR '07-'15, F-Type '14-)
* X = Manual seat belts, Depowered Dual front airbags w/occupant position (driver) and weight (fr. psgr.) sensing, & Front Side Head/Thorax Airbags <br> (Canada: XK/XKR '07-'15, F-Type '14-)
===Transmission & Steering Location (Position 5 - '00-'12):===
* A = Automatic / LHD
* B = Manual / LHD (X-Type '02-'05, S-Type 3.0 '03-'04)
===Transmission & Drive Wheels (Position 5 - '13-):===
* A = Automatic / Rwd (XF '13-'15, XJ '13-'19, XK '13-'15, F-Type '14-'17)
* B = Manual / Rwd (F-Type '16-'17)
* J = Automatic / Awd (XF Awd '13-'15, XJ Awd '13-'19, F-Type Awd '16-'17)
===Model Line (Position 6-7)===
{| class="wikitable"
|+Position 6-7
!VIN code
!Description
|-
|51
|[[w:Jaguar X-Type|Jaguar X-Type sedan - High Series]] ('02-'08)
|-
|52
|[[w:Jaguar X-Type|Jaguar X-Type sedan - Entry Series]] ('03-'04)
|-
|53
|[[w:Jaguar X-Type|Jaguar X-Type sedan w/Sport Package]] ('02-'03)
|-
|54
|[[w:Jaguar X-Type|Jaguar X-Type Sportwagon]] ('05-'08)
|-
|01
|[[w:Jaguar S-Type (1999)|Jaguar S-Type]] ('00-'08)
|-
|03
|[[w:Jaguar S-Type (1999)|Jaguar S-Type Sport]] [3.0, 4.0] ('02)
|-
|03
|[[w:Jaguar S-Type (1999)|Jaguar S-Type Sport]] [3.0, 4.2] ('03)
|-
|03
|[[w:Jaguar S-Type (1999)|Jaguar S-Type R]] ('03-'08)
|-
|05
|[[w:Jaguar XF (X250)|Jaguar XF Luxury]] ('09)
|-
|06
|[[w:Jaguar XF (X250)|Jaguar XF Premium Luxury]] ('09)
|-
|07
|[[w:Jaguar XF (X250)|Jaguar XF Supercharged]] ('09)
|-
|0E
|[[w:Jaguar XF (X250)|Jaguar XF]] ('13-'14)
|-
|0F
|[[w:Jaguar XF (X250)|Jaguar XF]] ('10-'12)
|-
|0F
|[[w:Jaguar XF (X250)|Jaguar XF 2.0T Premium]] [8th pos. of VIN is S] ('15)
|-
|0F
|[[w:Jaguar XF (X250)|Jaguar XF 3.0 Sport Rwd or 3.0 Portfolio Rwd]] [8th pos. of VIN is 7] ('15)
|-
|0F
|[[w:Jaguar XF (X250)|Jaguar XF 3.0 Sport Awd or 3.0 Portfolio Awd]] [8th pos. of VIN is F] ('15)
|-
|0G
|[[w:Jaguar XF (X250)|Jaguar XF Premium]] ('10-'11)
|-
|0H
|[[w:Jaguar XF (X250)|Jaguar XF Portfolio]] [8th pos. of VIN is B] ('12)
|-
|0H
|[[w:Jaguar XF (X250)|Jaguar XF Supercharged]] [8th pos. of VIN is E: '10-'13 or P: '13-'15]
|-
|0J
|[[w:Jaguar XF (X250)|Jaguar XFR]] ('10-'15)
|-
|0K
|[[w:Jaguar XF (X250)|Jaguar XFR-S]] ('13-'15)
|-
|8J
|[[w:Jaguar XF (X250)|Jaguar XFR w/Speed Pack]] ('13-'15)
|-
|12
|[[w:Jaguar XJ (X308)#Sport|Jaguar XJ Sport]] ('02-'03)
|-
|14
|[[w:Jaguar XJ (X308)|Jaguar XJ8]] ('00-'03)
|-
|15
|[[w:Jaguar XJ (X308)#XJR|Jaguar XJR]] ('00-'03)
|-
|23
|[[w:Jaguar XJ (X308)|Jaguar XJ8L]] (LWB) ('00-'01)
|-
|24
|[[w:Jaguar XJ (X308)#Daimler/Vanden Plas|Jaguar XJ8 Vanden Plas]] (LWB) ('00-'03)
|-
|25
|[[w:Jaguar XJ (X308)#Daimler/Vanden Plas|Jaguar XJ8 Vanden Plas Supercharged]] (LWB) ('00-'01)
|-
|25
|[[w:Jaguar XJ (X308)#Daimler/Vanden Plas|Jaguar XJ Super V8]] (LWB) ('02-'03)
|-
|71
|[[w:Jaguar XJ (X350)|Jaguar XJ8]] ('04-'09)
|-
|73
|[[w:Jaguar XJ (X350)|Jaguar XJR]] ('04-'09)
|-
|74
|[[w:Jaguar XJ (X350)|Jaguar XJ8 Vanden Plas]] (SWB) ('04)
|-
|79
|[[w:Jaguar XJ (X350)|Jaguar XJ8L]] (LWB) ('05-'09)
|-
|82
|[[w:Jaguar XJ (X350)|Jaguar XJ8 Vanden Plas]] (LWB) ('05-'09)
|-
|82
|[[w:Jaguar XJ (X350)|Jaguar XJ Super V8]] (LWB, 5-psgr.) ('05-'09)
|-
|86
|[[w:Jaguar XJ (X350)|Jaguar XJ Super V8 Portfolio]] (LWB, 4-psgr.) ('06)
|-
|94
|[[w:Jaguar XJ (X350)|Jaguar XJ Super V8 Portfolio]] (LWB, 5-psgr.) ('09)
|-
|1C
|[[w:Jaguar XJ (X351)|Jaguar XJ]] ('10-'15)
|-
|1C
|[[w:Jaguar XJ (X351)|Jaguar XJ R-Sport]] [8th pos. of VIN is 7 (Rwd) or D (Awd)] ('16-'19)
|-
|1C
|[[w:Jaguar XJ (X351)|Jaguar XJ Supercharged]] [8th pos. of VIN is E] ('16-'19)
|-
|1E
|[[w:Jaguar XJ (X351)|Jaguar XJR]] ('14-'17)
|-
|1G
|[[w:Jaguar XJ (X351)|Jaguar XJ Supercharged]] [8th pos. of VIN is E: '10-'13 or T: '13-'15]
|-
|1J
|[[w:Jaguar XJ (X351)|Jaguar XJ Supersport]] ('11-'12)
|-
|2E
|[[w:Jaguar XJ (X351)|Jaguar XJR LWB]] ('14-'17), XJR575 LWB ('18-'19)
|-
|2G
|[[w:Jaguar XJ (X351)|Jaguar XJL]] [8th pos. of VIN is B] ('10-'11)
|-
|2G
|[[w:Jaguar XJ (X351)|Jaguar XJL Portfolio Rwd]] [8th pos. of VIN is B: '12-'13 or 1: '13]
|-
|2G
|[[w:Jaguar XJ (X351)|Jaguar XJL Portfolio Rwd]] [8th pos. of VIN is Z: '14-'15)
|-
|2G
|[[w:Jaguar XJ (X351)|Jaguar XJL Portfolio Rwd]] [8th pos. of VIN is 7: '16-'19), XJ50 3.0 Rwd (LWB) '19
|-
|2G
|[[w:Jaguar XJ (X351)|Jaguar XJL Portfolio Awd]] [8th pos. of VIN is D] ('13-'19), XJ50 3.0 Awd (LWB) '19
|-
|2G
|[[w:Jaguar XJ (X351)|Jaguar XJL Supercharged]] [8th pos. of VIN is E: '10-'13, '16-'19 or T: '13-'15], XJ50 5.0 Rwd (LWB) '19, XJ Collection (LWB) '19
|-
|2J
|[[w:Jaguar XJ (X351)|Jaguar XJL Supersport]] ('11-'13)
|-
|2K
|[[w:Jaguar XJ (X351)|Jaguar XJL Ultimate]] ('13)
|-
|3F
|[[w:Jaguar XJ (X351)|Jaguar XJ Supersport w/Speed Pack]] ('12-'13)
|-
|3G
|[[w:Jaguar XJ (X351)|Jaguar XJL Supersport w/Speed Pack]] ('12-'13)
|-
|3H
|[[w:Jaguar XJ (X351)|Jaguar XJ Supercharged w/Sport & Speed Pack]] ('12-'15)
|-
|3K
|[[w:Jaguar XJ (X351)|Jaguar XJL Supercharged w/Sport & Speed Pack]] ('12-'15)
|-
|41
|[[w:Jaguar XK (X100)|Jaguar XK8/XKR coupe]] ('00-'06)
|-
|42
|[[w:Jaguar XK (X100)|Jaguar XK8/XKR convertible]] ('00-'06)
|-
|43
|[[w:Jaguar XK (X150)|Jaguar XK/XKR coupe]] ('07-'09)
|-
|44
|[[w:Jaguar XK (X150)|Jaguar XK/XKR convertible]] ('07-'09)
|-
|45
|[[w:Jaguar XK (X150)|Jaguar XKR Portfolio Edition coupe]] ('09)
|-
|46
|[[w:Jaguar XK (X150)|Jaguar XKR Portfolio Edition convertible]] ('09)
|-
|4D
|[[w:Jaguar XK (X150)|Jaguar XK Touring coupe]] [8th pos. of VIN is B] ('13-'14)
|-
|4E
|[[w:Jaguar XK (X150)|Jaguar XK Touring convertible]] [8th pos. of VIN is B] ('13-'14)
|-
|4D
|[[w:Jaguar XK (X150)|Jaguar XKR coupe]] [8th pos. of VIN is C] ('10-'15)
|-
|4E
|[[w:Jaguar XK (X150)|Jaguar XKR convertible]] [8th pos. of VIN is C] ('10-'15)
|-
|4F
|[[w:Jaguar XK (X150)|Jaguar XK coupe]] (most Portfolio Edition features are std.) [8th pos. of VIN is B] ('10-'15)
|-
|4F
|[[w:Jaguar XK (X150)|Jaguar XKR175 coupe]] [8th pos. of VIN is C] ('11)
|-
|4F
|[[w:Jaguar XK (X150)|Jaguar XKR coupe w/Dynamic Pack]] [8th pos. of VIN is C] ('13-'15), XK Final Fifty Edition coupe ('15)
|-
|4G
|[[w:Jaguar XK (X150)|Jaguar XK convertible]] (most Portfolio Edition features are std.) [8th pos. of VIN is B] ('10-'15)
|-
|4G
|[[w:Jaguar XK (X150)|Jaguar XKR convertible w/Dynamic Pack]] [8th pos. of VIN is C] ('13-'15), XK Final Fifty Edition convertible ('15)
|-
|4H
|[[w:Jaguar XK (X150)|Jaguar XKR-S coupe]] ('12-'15), XKR-S GT coupe ('14)
|-
|4J
|[[w:Jaguar XK (X150)|Jaguar XKR-S convertible]] ('12-'15)
|-
|6A
|[[w:Jaguar F-Type)|Jaguar F-Type coupe]] ('15-'17), F-Type Premium coupe '17
|-
|6B
|[[w:Jaguar F-Type)|Jaguar F-Type S coupe]] ('15-'17), F-Type S British Design Edition coupe '17
|-
|6D
|[[w:Jaguar F-Type)|Jaguar F-Type R coupe]] ('15-'17)
|-
|6E
|[[w:Jaguar F-Type)|Jaguar F-Type convertible]] ('14-'17), F-Type Premium convertible '17
|-
|6F
|[[w:Jaguar F-Type)|Jaguar F-Type S convertible]] ('14-'17), F-Type S British Design Edition convertible '17
|-
|6G
|[[w:Jaguar F-Type)|Jaguar F-Type V8 S convertible]] ('14-'15)
|-
|6H
|[[w:Jaguar F-Type)|Jaguar F-Type R convertible]] ('16-'17)
|-
|6J
|[[w:Jaguar F-Type)|Jaguar F-Type SVR coupe]] ('17)
|-
|6K
|[[w:Jaguar F-Type)|Jaguar F-Type SVR convertible]] ('17)
|-
|7A
|[[w:Jaguar F-Type#Project 7)|Jaguar F-Type Project 7 convertible]] ('16)
|}
===Engine/Emissions Control System (Position 8)===
{| class="wikitable"
|+Position 8
! VIN !! Size !! Type !! Fuel !! Valvetrain !! Engine Family/Notes/Applications
|-
| A || 3.0L || 60° V6 || Gas ||DOHC,<br /> 24 valve||MPI. ULEV. Variable intake valve timing. [[w:Jaguar AJ-V6 engine#AJ30|Jaguar AJ-V6 - AJ30 V6 engine]].<br> Jaguar X-Type 3.0 (Mid '05-'08), S-Type 3.0 ('06-'08).
|-
| A || 4.2L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. ULEV. Continuously variable intake valve timing. [[w:Jaguar AJ-V8 engine#4.2 L|Jaguar AJ-V8 - AJ34 V8 engine]]. Jaguar XF ('10).
|-
| A || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 550 PS/542 hp. Jaguar XKR-S ('12-'15), XKR-S GT ('14), F-Type R coupe ('15).
|-
| B || 4.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||MPI. [[w:Jaguar AJ-V8 engine#Supercharged|Jaguar AJ-V8 - AJ27S V8 engine]].<br> Jaguar XJR ('00-'03), Vanden Plas Supercharged ('00-'01), Super V8 ('02-'03), XKR ('00-'02).
|-
| B || 4.2L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||MPI. [[w:Jaguar AJ-V8 engine#Supercharged_2|Jaguar AJ-V8 - AJ33S V8 engine]]. Jaguar XJR ('04-'05), Super V8 ('05), XKR ('03-'06).
|-
| B || 4.2L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. ULEV. Continuously variable intake valve timing. [[w:Jaguar AJ-V8 engine#4.2 L|Jaguar AJ-V8 - AJ34 V8 engine]].<br> Jaguar S-Type ('06-'08), XF ('09), XJ8/Vanden Plas ('06-'09), XK ('07-'09).
|-
| B || 5.0L || V8 || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. Variable intake valve lift. Variable intake.<br> [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> Jaguar XF ('10-'12), XJ ('11-'12), XJL ('11), XJL Portfolio Rwd ('12-'13), XK ('10-'15), XK Touring ('13-'14).
|-
| C || 3.0L || 60° V6 || Gas ||DOHC,<br /> 24 valve||MPI. Variable intake valve timing. [[w:Jaguar AJ-V6 engine#AJ30|Jaguar AJ-V6 - AJ30 V6 engine]].<br> Jaguar S-Type 3.0 ('00-'01), X-Type 3.0 ('02-Mid '05).
|-
| C || 4.0L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. Continuously variable intake valve timing. [[w:Jaguar AJ-V8 engine#4.0 L|Jaguar AJ-V8 - AJ27 V8 engine]].<br> Jaguar XJ8/Vanden Plas ('00-'03), XJ Sport ('02-'03), XK8 ('00-'02).
|-
| C || 4.2L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. Continuously variable intake valve timing. [[w:Jaguar AJ-V8 engine#4.2 L|Jaguar AJ-V8 - AJ33 V8 engine]]. Jaguar XJ8 ('04-'05), XK8 ('03-'06).
|-
| C || 4.2L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||MPI. ULEV. Continuously variable intake valve timing. [[w:Jaguar AJ-V8 engine#Supercharged_2|Jaguar AJ-V8 - AJ34S V8 engine]].<br> Jaguar S-Type R ('06-'08), XF Supercharged ('09), XJR ('06-'09), Super V8 ('06-'09), XKR ('07-'09).
|-
| C || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 510 PS/503 hp. Jaguar XFR ('10-'13), XJ/XJL Supersport ('11-'13), XKR ('10-'15).
|-
| C || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 380 PS/375 hp. Jaguar F-Type S ('14-'15), F-Type S w/man. trans. ('16-'17).
|-
| D || 4.0L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. Continuously variable intake valve timing. [[w:Jaguar AJ-V8 engine#4.0 L|Jaguar AJ-V8 - AJ28 V8 engine]]. Jaguar S-Type 4.0 ('00-'01).
|-
| D || 2.5L || 60° V6 || Gas ||DOHC,<br /> 24 valve||MPI. Variable intake valve timing. [[w:Jaguar AJ-V6 engine#AJ25|Jaguar AJ-V6 - AJ25 V6 engine]]. Jaguar X-Type 2.5 ('02-'05).
|-
| D || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XJ Awd, XJL Portfolio Awd ('13-'15).
|-
| D || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XJ R-Sport Awd, XJL Portfolio Awd ('16-'19), XJ50 3.0 Awd ('19).
|-
| E || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 470 PS/464 hp.<br> Jaguar XF Supercharged ('10-'13), XJ/XJL Supercharged ('11-'13, '16-'19), XJ50 5.0 Rwd ('19), XJ Collection ('19).
|-
| F || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XF 3.0 Awd ('13-'14).
|-
| F || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XF 3.0 Awd ('15).
|-
| H || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas/E85 ||DOHC,<br /> 32 valve||Flex Fuel. Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]]. 510 PS/503 hp. Jaguar XFR ('13-'15).
|-
| K || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 550 PS/542 hp. Jaguar XJR/XJR LWB ('14-'17).
|-
| K || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 575 PS/567 hp. Jaguar XJR575 LWB ('18-'19).
|-
| L || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 495 PS/488 hp. Jaguar F-Type V8 S convertible ('14-'15).
|-
| L || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 550 PS/542 hp. Jaguar F-Type R ('16-'17).
|-
| N || 3.0L || 60° V6 || Gas ||DOHC,<br /> 24 valve||MPI. Variable intake valve timing. [[w:Jaguar AJ-V6 engine#AJ30|Jaguar AJ-V6 - AJ30 V6 engine]]. Jaguar S-Type 3.0 ('01-'02).
|-
| P || 4.0L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. Continuously variable intake valve timing. [[w:Jaguar AJ-V8 engine#4.0 L|Jaguar AJ-V8 - AJ28 V8 engine]]. Jaguar S-Type 4.0 ('01-'02).
|-
| P || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas/E85 ||DOHC,<br /> 32 valve||Flex Fuel. Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]]. 470 PS/464 hp. Jaguar XF Supercharged ('13-'15).
|-
| S || 2.0L || I4 Turbo [[w:Intercooler|IC]] || Gas || DOHC,<br /> 16 valve||Direct Injection. Dual VVT. [[w:Ford EcoBoost engine#2.0 L (2010–2018)|Ford EcoBoost engine (Mazda L engine-based)]].<br> Jaguar XF 2.0T ('13-'14), XF 2.0T Premium ('15).
|-
| T || 3.0L || 60° V6 || Gas ||DOHC,<br /> 24 valve||MPI. Variable intake valve timing. [[w:Jaguar AJ-V6 engine#AJ30|Jaguar AJ-V6 - AJ30 V6 engine]]. Jaguar S-Type 3.0 ('03-'05).
|-
| T || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas/E85 ||DOHC,<br /> 32 valve||Flex Fuel. Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]]. 470 PS/464 hp. Jaguar XJ/XJL Supercharged ('13-'15).
|-
| T || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar F-Type w/auto. trans. ('15-'17), F-Type Premium w/auto. trans. ('17).
|-
| U || 4.2L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. Continuously variable intake valve timing. [[w:Jaguar AJ-V8 engine#4.2 L|Jaguar AJ-V8 - AJ33 V8 engine]]. Jaguar S-Type 4.2 ('03-'05).
|-
| U || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 380 PS/375 hp. Jaguar F-Type S ('15), F-Type S Rwd w/auto. trans. ('16-'17).
|-
| V || 4.2L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||MPI. [[w:Jaguar AJ-V8 engine#Supercharged_2|Jaguar AJ-V8 - AJ33S V8 engine]]. Jaguar S-Type R ('03-'05).
|-
| V || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 380 PS/375 hp. Jaguar F-Type S Awd w/auto. trans. ('16-'17).
|-
| X || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas/E85 ||DOHC,<br /> 24 valve||Flex Fuel. Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XF 3.0 Rwd ('14).
|-
| Z || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 550 PS/542 hp. Jaguar XFR-S ('13-'15).
|-
| Z || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas/E85 ||DOHC,<br /> 24 valve||Flex Fuel. Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XJ Rwd, XJL Portfolio Rwd ('14-'15).
|-
| 1 || 5.0L || V8 || Gas/E85 ||DOHC,<br /> 32 valve||Flex Fuel. Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. Variable intake valve lift. Variable intake. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]]. Jaguar XJL Portfolio Rwd ('13).
|-
| 6 || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar F-Type w/man. trans. ('16-'17), F-Type Premium w/man. trans. ('17).
|-
| 7 || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XF 3.0 Rwd ('13), XJ Rwd ('13), F-Type ('14-'15).
|-
| 7 || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XF 3.0 Rwd ('15), XJ R-Sport Rwd ('16-'19), XJL Portfolio Rwd ('16-'19), XJ50 3.0 Rwd ('19).
|-
| 8 || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 575 PS/567 hp. Jaguar F-Type Project 7 ('16), F-Type SVR ('17).
|}
===Check Digit/Gearbox (Position 9)===
* USA /Canada [[Vehicle Identification Numbers (VIN codes)/Check digit|Check digit]]
===Model Year Code (Position 10)===
''See: [[Vehicle Identification Numbers (VIN codes)/Model year]]''
===Plant Code/Model Line/Engine (Position 11) 2000-2019===
* X - Halewood, Merseyside, England, UK - X-Type 2.5 ('02-'05)
* W - Halewood, Merseyside, England, UK - X-Type 3.0 ('02-'08)
* F - Castle Bromwich, West Midlands, England, UK - S-Type 3.0 ('00-'08)
* G - Castle Bromwich, West Midlands, England, UK - S-Type 4.0 ('00-'02)
* H - Castle Bromwich, West Midlands, England, UK - S-Type 4.2 ('03-'08)
* 1 - Castle Bromwich, West Midlands, England, UK - S-Type R (4.2 supercharged) ('03-'08)
* H - Castle Bromwich, West Midlands, England, UK - XF 4.2 ('09-'10)
* 1 - Castle Bromwich, West Midlands, England, UK - XF Supercharged (4.2 supercharged) ('09)
* L - Castle Bromwich, West Midlands, England, UK - XF 5.0 ('10-'12)
* M - Castle Bromwich, West Midlands, England, UK - XF Supercharged, XFR (5.0 supercharged) ('10-'15), XFR-S (5.0 supercharged) ('13-'15)
* P - Castle Bromwich, West Midlands, England, UK - XF 2.0T ('13-'15)
* 8 - Castle Bromwich, West Midlands, England, UK - XF 3.0 supercharged ('13-'15)
* L - Browns Lane plant, Coventry, West Midlands, England, UK - XJ8 (4.0) ('00-'03), XJ8L (4.0) ('00-'01), XJ8 Vanden Plas (4.0) ('00-'03), XJ Sport (4.0) ('02-'03)
* M - Browns Lane plant, Coventry, West Midlands, England, UK - XJ8 Vanden Plas Supercharged (4.0 supercharged) ('00-'01),<br> Super V8 (4.0 supercharged) ('02-'03), XJR (4.0 supercharged) ('00-'03)
* S - Browns Lane plant, Coventry, West Midlands, England, UK - XJ8 (4.2) ('04-'06), XJ8L (4.2) ('05-'06), XJ8 Vanden Plas (4.0) ('04-'06)
* T - Browns Lane plant, Coventry, West Midlands, England, UK - Super V8 (4.2 supercharged) ('05-'06), Super V8 Portfolio (4.2 supercharged) ('06),<br> XJR (4.2 supercharged) ('04-'06)
* S - Castle Bromwich, West Midlands, England, UK - XJ8 (4.2) ('07-'09), XJ8L (4.2) ('07-'09), XJ8 Vanden Plas (4.0) ('07-'09)
* T - Castle Bromwich, West Midlands, England, UK - Super V8 (4.2 supercharged) ('07-'09), Super V8 Portfolio (4.2 supercharged) ('09),<br> XJR (4.2 supercharged) ('07-'09)
* L - Castle Bromwich, West Midlands, England, UK - XJ (5.0) ('10-'12), XJL (5.0) ('10-'11), XJL Portfolio (5.0) ('12-'13)
* M - Castle Bromwich, West Midlands, England, UK - XJ/XJL Supercharged (5.0 supercharged) ('10-'19), XJ/XJL Supersport (5.0 supercharged) ('11-'13),<br> XJL Ultimate (5.0 supercharged) ('13), XJR SWB/LWB (5.0 supercharged) ('14-'17), XJR575 LWB (5.0 supercharged) ('18-'19), XJ50 LWB (5.0 supercharged) ('19), XJ Collection Sp. Ed. LWB (5.0 supercharged) ('19)
* 8 - Castle Bromwich, West Midlands, England, UK - XJ base (3.0 supercharged) ('13-'15), XJ R-Sport (3.0 supercharged) ('16-'19),<br> XJL Portfolio AWD (3.0 supercharged) ('13-'19), XJL Portfolio RWD (3.0 supercharged) ('14-'19), XJ50 LWB (3.0 supercharged) ('19)
* N - Browns Lane plant, Coventry, West Midlands, England, UK - XK8 (4.0) ('00-'02)
* P - Browns Lane plant, Coventry, West Midlands, England, UK - XKR (4.0 supercharged) ('00-'02)
* 2 - Browns Lane plant, Coventry, West Midlands, England, UK - XK8 (4.2) ('03-'06)
* 3 - Browns Lane plant, Coventry, West Midlands, England, UK - XKR (4.2 supercharged) ('03-'06)
* 5 - Castle Bromwich, West Midlands, England, UK - XK (4.2) ('07-'09)
* 9 - Castle Bromwich, West Midlands, England, UK - XKR (4.2 supercharged) ('07-'09)
* L - Castle Bromwich, West Midlands, England, UK - XK (5.0) ('10-'15)
* M - Castle Bromwich, West Midlands, England, UK - XKR (5.0 supercharged) ('10-'15), XKR-S (5.0 supercharged) ('12-'15), XKR-S GT (5.0 supercharged) ('14)
* 8 - Castle Bromwich, West Midlands, England, UK - F-Type Base, S (3.0 supercharged) ('14-'17), F-Type Premium (3.0 supercharged) ('17)
* M - Castle Bromwich, West Midlands, England, UK - F-Type V8S (5.0 supercharged) ('14-'15), F-Type R (5.0 supercharged) ('15-'17),<br> F-Type Project 7 (5.0 supercharged) ('16), F-Type SVR (5.0 supercharged) ('17)
===Model (Position 12)===
* C - X-Type ('02-'03)
* D - X-Type ('03-'04)
* E - X-Type ('04-'06)
* J - X-Type ('06-'08)
* L - S-Type ('00-'01)
* M - S-Type ('01-'04)
* N - S-Type ('04-'08)
* R - XF ('09-'11)
* S - XF ('11-'13)
* U - XF ('13-'15)
* F - XJ ('00-'03)
* G - XJ ('04-'06) [Browns Lane plant]
* H - XJ ('06-'09) [Castle Bromwich plant]
* V - XJ ('10-'16)
* W - XJ ('16-'19)
* A - XK ('00-'06)
* B - XK ('07-'15)
* K - F-Type ('14-'17)
'''Positions 13–17, Serial Number'''
==General Template for Jaguar's VIN format (1981 - 1999)==
===Jaguar WMIs (1981-1999) (Position 1-3)===
* SAJ - Jaguar passenger car
===Model Line (Position 4)===
{| class="wikitable"
|+Position 4
!VIN code
!Description
|-
|A
|[[w:Jaguar XJ#Series 3 (1979–1992)|Jaguar XJ6]] ('81-'87), XJ6 Vanden Plas ('82-'87)
|-
|B
|[[w:Jaguar XJ#Series 3 (1979–1992)|Jaguar XJ12]] (Canada only: '81-'88)
|-
|D
|[[w:Jaguar XJ#Series 3 (1979–1992)|Jaguar XJ12]] (Canada only: '89-'92)
|-
|H
|[[w:Jaguar XJ (XJ40)|Jaguar XJ6]] ('88-'89, '93-'94)
|-
|F
|[[w:Jaguar XJ (XJ40)|Jaguar XJ6]] ('90-'92)
|-
|H
|[[w:Jaguar XJ (XJ40)|Jaguar XJ6 Sovereign]] ('90-'92)
|-
|K
|[[w:Jaguar XJ (XJ40)#Daimler/Vanden Plas|Jaguar XJ6 Vanden Plas]] ('88-'94)
|-
|M
|[[w:Jaguar XJ (XJ40)#Majestic (1989–1992 – SWB; 1993–1994 – LWB)|Jaguar XJ6 Vanden Plas Majestic]] ('89-'90, '92)
|-
|M
|[[w:Jaguar XJ (XJ40)#XJ12 and Daimler Double Six (XJ81)|Jaguar XJ12]] ('94)
|-
|H
|[[w:Jaguar XJ (X300)|Jaguar XJ6]] ('95-'97)
|-
|H
|[[w:Jaguar XJ (X300)|Jaguar XJ6L]] LWB [X330] ('97)
|-
|K
|[[w:Jaguar XJ (X300)#Daimler/Jaguar Vanden Plas|Jaguar XJ6 Vanden Plas]] SWB ('95)
|-
|K
|[[w:Jaguar XJ (X300)#Daimler/Jaguar Vanden Plas|Jaguar XJ6 Vanden Plas]] LWB [X330] ('96-'97)
|-
|M
|[[w:Jaguar XJ (X300)#XJ12 (X305)|Jaguar XJ12]] SWB ('95)
|-
|M
|[[w:Jaguar XJ (X300)#XJ12 (X305)|Jaguar XJ12]] LWB [X330] ('96)
|-
|P
|[[w:Jaguar XJ (X300)#XJR (X306)|Jaguar XJR]] ('95-'97)
|-
|H
|[[w:Jaguar XJ (X308)|Jaguar XJ8]] ('98-'99)
|-
|H
|[[w:Jaguar XJ (X308)|Jaguar XJ8L]] LWB ('98-'99)
|-
|K
|[[w:Jaguar XJ (X308)#Daimler/Vanden Plas|Jaguar XJ8 Vanden Plas]] LWB ('98-'99)
|-
|P
|[[w:Jaguar XJ (X308)#XJR|Jaguar XJR]] ('98-'99)
|-
|N
|[[w:Jaguar XJS|Jaguar XJ-S]] ('82-'91), XJ-SC ('86-'88), XJS ('92-'96)
|-
|T
|[[w:Jaguar XJS|Jaguar XJ-S]] Rouge Collection ('89-'90), Classic Collection ('90-'91)
|-
|S
|[[w:Jaguar XJS#XJR-S|Jaguar XJR-S]] ('93)
|-
|G
|[[w:Jaguar XK (X100)|Jaguar XK8]] ('97-'99)
|}
===Class (Regional Spec)/Restraint System (Position 5):===
* V = N. American-spec (Manual seat belts)
* L = Canadian-spec (Manual seat belts)
* Y = XJ6 Vanden Plas [Series III] ('82-'87) (Manual seat belts)
* A = Motorized Shoulder Belts (XJ-S coupe '88-'89, XJ-SC '88)
* Y = Motorized Shoulder Belts (XJ-S coupe '89, XJ sedan '89-'92)
* W = Manual seat belts, Driver-side airbag (US: XJ-S '90-'93, XJ6 '93, XJ12 Early '94)
* X = Manual seat belts, Dual front airbags (US: XJS '94-'96, XJ6 '94-'97, XJ12 '94-'96, XJR '95-'97, XK8 '97-'99)
* X = Manual seat belts, Dual front airbags, & Front Side Airbags (US: XJ8/XJR '98-'99)
* D = Manual seat belts, Depowered Dual front airbags, & Front Side Airbags (US: XJ8/XJR '99)
* M = Manual seat belts, Driver-side airbag (Canada)
* N = Manual seat belts, Dual front airbags (Canada)
* F = Manual seat belts, Depowered Dual front airbags, & Front Side Airbags (Canada: XJ8/XJR '99)
===Body Style (Position 6):===
* 1 = 4-door sedan (XJ-series sedan '81-'99)
* 2 = 2-door convertible w/2+2 seating (XJS convertible '94-'96, XK8 convertible '97-'99)
* 3 = 2-door Cabriolet (XJ-SC '86-'88)
* 4 = 2-door convertible w/2-psgr. seating (factory-built XJS convertible '89-'94, XJR-S convertible '93)
* 5 = 2-door coupe (XJS coupe '82-'96, XJR-S coupe '93, XK8 coupe '97-'99)
* 5 = 2-door coupe (Hess & Eisenhardt-built XJS convertible '87-'88) [coupe conversion]
===Engine Type (Position 7):===
{| class="wikitable"
|+Position 7
|-
! VIN !! Size !! Type !! Fuel !! Valvetrain !! Engine Family/Notes/Applications
|-
| 1 || 4.0L || I6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||MPI. [[w:Jaguar AJ6 engine#AJ16S|Jaguar AJ16S I6]]. Jaguar XJR ('95-'97).
|-
| 2 || 4.2L || I6 || Gas ||DOHC,<br /> 12 valve||CA & Canada-spec. MPI. [[w:Jaguar XK engine|Jaguar XK I6]]. Jaguar XJ6 ('81-'82).
|-
| 2 || 4.0L || I6 || Gas ||DOHC,<br /> 24 valve||MPI. Dual-canister evaporative emissions system. [[w:Jaguar AJ6 engine#AJ16|Jaguar AJ16 I6]]. Jaguar XJ6 ('96-'97).
|-
| 2 || 4.0L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. Variable intake valve timing. Dual-canister evaporative emissions system. [[w:Jaguar AJ-V8 engine#4.0 L|Jaguar AJ-V8 - AJ26 V8 engine]].<br> Jaguar XJ8 ('98), XK8 ('98).
|-
| 3 || 4.2L || I6 || Gas ||DOHC,<br /> 12 valve||N. America-spec. MPI. [[w:Jaguar XK engine|Jaguar XK I6]]. Jaguar XJ6 ('81-'87).
|-
| 3 || 6.0L || 60° V12 || Gas ||SOHC,<br /> 24 valve||MPI. [[w:Jaguar V12 engine|Jaguar V12]] modified by [[w:Tom Walkinshaw Racing|JaguarSport]]. Jaguar XJR-S ('93).
|-
| 3 || 6.0L || 60° V12 || Gas ||SOHC,<br /> 24 valve||MPI. [[w:Jaguar V12 engine|Jaguar V12]]. Jaguar XJS ('94-'95), XJ12 ('94-'96).
|-
| 5 || 3.6L || I6 || Gas ||DOHC,<br /> 24 valve||N. America-spec - Low Compression. MPI. [[w:Jaguar AJ6 engine|Jaguar AJ6 I6]]. Jaguar XJ6 ('88-'89).
|-
| 6 || 3.6L || I6 || Gas ||DOHC,<br /> 24 valve||N. America-spec - High Compression. MPI. [[w:Jaguar AJ6 engine|Jaguar AJ6 I6]]. Jaguar XJ6 ('88).
|-
| 7 || 4.0L || I6 || Gas ||DOHC,<br /> 24 valve||MPI. [[w:Jaguar AJ6 engine|Jaguar AJ6 I6]]. Jaguar XJ6 ('90-'94), XJS ('93-'94).
|-
| 7 || 4.0L || I6 || Gas ||DOHC,<br /> 24 valve||MPI. [[w:Jaguar AJ6 engine#AJ16|Jaguar AJ16 I6]]. Jaguar XJ6 ('95-'96), XJS ('95-'96).
|-
| 7 || 4.0L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. Variable intake valve timing. [[w:Jaguar AJ-V8 engine#4.0 L|Jaguar AJ-V8 - AJ26 V8 engine]]. Jaguar XK8 ('97).
|-
| 8 || 5.3L || 60° V12 || Gas ||SOHC,<br /> 24 valve||N. America-spec. MPI. [[w:Jaguar V12 engine|Jaguar V12]]. Jaguar XJ-S ('82-'92), XJ12 (Canada only: '88-'92).
|-
| 8 || 4.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||MPI. Dual-canister evaporative emissions system. [[w:Jaguar AJ-V8 engine#Supercharged|Jaguar AJ-V8 - AJ26S V8 engine]]. Jaguar XJR ('98-'99).
|-
| 9 || 4.0L || I6 || Gas ||DOHC,<br /> 24 valve||Canada-spec. MPI. [[w:Jaguar AJ6 engine|Jaguar AJ6 I6]]. Jaguar XJ6 ('90-'93), XJS ('93).
|-
| 0 || 5.3L || 60° V12 || Gas ||SOHC,<br /> 24 valve||Canada-spec. MPI. [[w:Jaguar V12 engine|Jaguar V12]]. Jaguar XJ-S ('82-'87), XJ12 (Canada only: '85-'87).
|-
| 0 || 4.0L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. Continuously variable intake valve timing. Dual-canister evaporative emissions system. Enhanced evaporative emissions control system. [[w:Jaguar AJ-V8 engine#4.0 L|Jaguar AJ-V8 - AJ27 V8 engine]]. Jaguar XJ8 ('99), XK8 ('99).
|}
===Transmission & Steering Location (Position 8):===
* 4 = Automatic / LHD
* 8 = Manual / LHD ('93-'94 XJS 4.0 w/ optional 5-spd. manual)
===Check Digit/Gearbox (Position 9)===
* USA /Canada [[Vehicle Identification Numbers (VIN codes)/Check digit|Check digit]]
===Model Year Code (Position 10)===
''See: [[Vehicle Identification Numbers (VIN codes)/Model year]]''
===Plant Codes (Position 11)===
* C - Browns Lane plant, Coventry, West Midlands, England, UK
===Positions 12–17, Serial Number===
** 100001 and after - XJ-S/XJ-SC/XJS/XJR-S (XJ27)
** 300001 and after - XJ-series sedan Series III
** 500001 and after - XJ-series sedan (XJ40/XJ81)
** 720001 and after - XJ-series sedan (X300/X305/X306/X330)
** 810001 and after - XJ-series sedan (X308)
** 001001 and after - XK8 (X100)
l8z4vh9jfzffuxn0s1257cky2p263cc
4676694
4676690
2026-10-18T05:26:45Z
JustTheFacts33
3434282
/* Trim Level/Drive Wheels/Restraint System (Position 5) */
4676694
wikitext
text/x-wiki
{{Vehicle Identification Numbers (VIN codes)/Warning}}{{clear}}
This VIN number decoding and designation system is used primarily for the North American Market. European and Asian markets use other decoding and designation systems.
==General Template for Jaguar's VIN format (All models: 2016- EXCEPT F-Type '16-'17, XJ '16-'19)==
===Jaguar WMIs (2016-) (Position 1-3)===
* SAJ - Jaguar passenger car (UK)
* SAD - Jaguar SUV (UK & Europe)
* L2C - Chery Jaguar Land Rover (China)
===Model Line (Position 4)===
{| class="wikitable"
|+Position 4
!VIN code
!Description
|-
|A
|[[w:Jaguar XE|Jaguar XE]] ('17-'20)
|-
|B
|[[w:Jaguar XF (X260)|Jaguar XF]] ('16-'24)
|-
|C
|[[w:Jaguar F-Pace|Jaguar F-Pace]] ('17-'26)
|-
|D
|[[w:Jaguar F-Type|Jaguar F-Type]] ('18-'24)
|-
|E
|[[w:Jaguar Type 01|Jaguar Type 01]] ('28-)
|-
|F
|[[w:Jaguar E-Pace|Jaguar E-Pace]] ('18-'24)
|-
|H
|[[w:Jaguar I-Pace|Jaguar I-Pace EV]] ('19-'24)
|}
===Trim Level/Drive Wheels/Restraint System (Position 5)===
{| class="wikitable"
|+Position 4
!VIN code
!Trim Level
!Drive Wheels
!Restraint System
|-
|D
|XF Premium '16-'17
|Rwd
|Manual seat belts, Dual front airbags, & Front Side Airbags & Side Curtain Airbags
|-
|E
|XF Prestige '16-'17
|Rwd
|Manual seat belts, Dual front airbags, & Front Side Airbags & Side Curtain Airbags
|-
|F
|XF R-Sport '16-'17
|Rwd
|Manual seat belts, Dual front airbags, & Front Side Airbags & Side Curtain Airbags
|-
|G
|XF S '16-'17
|Rwd
|Manual seat belts, Dual front airbags, & Front Side Airbags & Side Curtain Airbags
|-
|J
|XF Premium '16-'17
|Awd
|Manual seat belts, Dual front airbags, & Front Side Airbags & Side Curtain Airbags
|-
|K
|XF Prestige '16-'17
|Awd
|Manual seat belts, Dual front airbags, & Front Side Airbags & Side Curtain Airbags
|-
|L
|XF R-Sport '16-'17
|Awd
|Manual seat belts, Dual front airbags, & Front Side Airbags & Side Curtain Airbags
|-
|M
|XF S '16-'17
|Awd
|Manual seat belts, Dual front airbags, & Front Side Airbags & Side Curtain Airbags
|-
|N
|XF First Edition '16
|Awd
|Manual seat belts, Dual front airbags, & Front Side Airbags & Side Curtain Airbags
|-
|R
|XF Base model '17
|Rwd
|Manual seat belts, Dual front airbags, & Front Side Airbags & Side Curtain Airbags
|-
|S
|XF Base model '17
|Awd
|Manual seat belts, Dual front airbags, & Front Side Airbags & Side Curtain Airbags
|-
|}
===Body Style (Position 6):===
* 1 = Coupe (F-Type coupe)
* 2 = 5-door wagon (XF Sportbrake wagon '18-'20)
* 2 = 5-door (E-Pace, F-Pace, I-Pace EV)
* 4 = 4-door sedan (XE, XF sedan, Type 01)
* 5 = Convertible (F-Type convertible)
===Transmission (Position 7) 2016-2017:===
* B = Automatic (XE '17, XF '16-'17, F-Pace '17)
===Engine/Emissions Control System (Position 8) 2016-2017:===
{| class="wikitable"
|+Position 8
! VIN !! Size !! Type !! Fuel !! Valvetrain !! Engine Family/Notes/Applications
|-
| G || 2.0L || I4 Turbo [[w:Intercooler|IC]] || Gas || DOHC,<br /> 16 valve||Direct Injection. ULEV. Dual VVT. [[w:Ford EcoBoost engine#2.0 L (2010–2018)|Ford EcoBoost engine (Mazda L engine-based)]].<br> Jaguar XE 25t ('17).
|-
| N || 2.0L || I4 Turbo [[w:Intercooler|IC]] || Diesel || DOHC,<br /> 16 valve||Common-rail Direct Injection. Exhaust VVT. [[w:Ingenium engine family|JLR Ingenium AJ20D engine]]. Jaguar XE 20d, XF 20d, F-Pace 20d ('17).
|-
| V || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XF 35t ('16-'17) [If 5th pos. of VIN is NOT G or M]. Jaguar XE 35t ('17).<br> Jaguar F-Pace 35t ('17) [If 5th pos. of VIN is NOT M or P].
|-
| V || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 380 PS/375 hp. Jaguar XF S ('16-'17) [If 5th pos. of VIN is G or M].<br> Jaguar F-Pace S ('17) [If 5th pos. of VIN is M or P].
|}
===Engine (Position 7-8) 2018-:===
{| class="wikitable"
|+Position 7-8
! VIN Pos. 7 !! Power Level !! Transmission !! VIN Pos. 8 !! Size !! Type !! Fuel !! Valvetrain !! Engine Family/Notes/Applications
|-
| E || 550 PS/542 hp || 8-spd. Auto. || E || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct injection. Dual Continuously VCT (VVT). [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133S engine]]. Jaguar F-Type R ('18-'20), F-Pace SVR ('19-'24).
|-
| E || 450 PS/444 hp || 8-spd. Auto. || E || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct injection. Dual Continuously VCT (VVT). [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133S engine]]. Jaguar F-Type P450 ('22-24).
|-
| F || 575 PS/567 hp || 8-spd. Auto. || E || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct injection. Dual Continuously VCT (VVT). [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133S engine]]. Jaguar F-Type SVR ('18-'20), F-Type R ('21-'24),<br> F-Pace SVR 575 Edition ('25-'26).
|-
| F || 600 PS/592 hp || 8-spd. Auto. || E || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct injection. Dual Continuously VCT (VVT). [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133S engine]]. Jaguar XE SV Project 8 ('19).
|-
| F || 180 PS/178 hp || 8-spd. Auto. || N || 2.0L || I4 Turbo [[w:Intercooler|IC]] || Diesel || DOHC,<br /> 16 valve||Common-rail Direct Injection. Exhaust VVT.<br> [[w:Ingenium engine family|JLR Ingenium AJ20D4/AJ200D engine]].<br> Jaguar XE 20d ('18-'19), XF 20d ('18-'19), F-Pace 20d ('18-'19).
|-
| E || 340 PS/335 hp || 8-spd. Auto. || U || 3.0L || I6 Turbo [[w:Intercooler|IC]] || Gas || DOHC,<br /> 24 valve||48v Mild Hybrid. E-supercharger. Direct Injection. Dual VVT. CVVL (Intake VVL). [[w:Ingenium engine family|JLR Ingenium AJ20P6/AJ300P engine]].<br> Jaguar F-Pace P340 ('21-'22).
|-
| F || 400 PS/395 hp || 8-spd. Auto. || U || 3.0L || I6 Turbo [[w:Intercooler|IC]] || Gas || DOHC,<br /> 24 valve||48v Mild Hybrid. E-supercharger. Direct Injection. Dual VVT. CVVL (Intake VVL). [[w:Ingenium engine family|JLR Ingenium AJ20P6/AJ300P engine]].<br> Jaguar F-Pace P400 ('21-'26).
|-
| E || 340 PS/335 hp || 8-spd. Auto. || V || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. Continuously variable intake & exhaust valve timing.<br> [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> Jaguar XE 35t ('18), XF 35t ('18), F-Type ('18), F-Type P340 ('19-'20),<br> F-Pace 35t ('18).
|-
| F || 380 PS/375 hp || 8-spd. Auto. || V || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. Continuously variable intake & exhaust valve timing.<br> [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> Jaguar XE S ('18-'19), XF S ('18-'20), F-Type ('18),<br> F-Type P380 ('19), F-Type P380 R-Dynamic ('19-'21), F-Pace S ('18-'20).
|-
| G || 400 PS/395 hp || 8-spd. Auto. || V || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. Continuously variable intake & exhaust valve timing.<br> [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> Jaguar F-Type 400 Sport ('18).
|-
| J || 340 PS/335 hp || 6-spd. Man. || V || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. Continuously variable intake & exhaust valve timing.<br> [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> Jaguar F-Type ('18), F-Type P340 ('19).
|-
| K || 380 PS/375 hp || 6-spd. Man. || V || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. Continuously variable intake & exhaust valve timing.<br> [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> Jaguar F-Type P380 R-Dynamic ('18-'19).
|-
| E || 250 PS/247 hp || 8-spd. Auto. || X || 2.0L || I4 Turbo [[w:Intercooler|IC]] || Gas || DOHC,<br /> 16 valve||Direct Injection. Dual VVT. CVVL (Intake VVL).<br> [[w:Ingenium engine family|JLR Ingenium AJ20P4/AJ200P engine]].<br> Jaguar F-Pace P250 ('21-'26).
|-
| F || 250 PS/247 hp || 8-spd. Auto. || X || 2.0L || I4 Turbo [[w:Intercooler|IC]] || Gas || DOHC,<br /> 16 valve||Direct Injection. Dual VVT. CVVL (Intake VVL).<br> [[w:Ingenium engine family|JLR Ingenium AJ20P4/AJ200P engine]].<br> Jaguar XE 25t ('18-'20), XF 25t ('18-'20), XF P250 ('21-'24),<br> E-Pace P250 ('18-'24), F-Pace 25t ('18-'20).
|-
| G || 300 PS/296 hp || 8-spd. Auto. || X || 2.0L || I4 Turbo [[w:Intercooler|IC]] || Gas || DOHC,<br /> 16 valve||Direct Injection. Dual VVT. CVVL (Intake VVL).<br> [[w:Ingenium engine family|JLR Ingenium AJ20P4/AJ200P engine]].<br> Jaguar XE 30t ('18-'20), XF 30t ('18-'20), XF P300 ('21-'24),<br> F-Type ('18), F-Type P300 ('19-'21), E-Pace P300 R-Dynamic ('18-'20),<br> E-Pace 300 Sport ('21-'22), F-Pace 30t ('18-'20).
|}
====Motor Type for Electric Vehicles 2019-====
{| class="wikitable"
|+Position 7-8
|-
! VIN Pos. 7 !! Power Level !! Transmission !! VIN Pos. 8 !! # of Motors !! Battery Size !! Battery Type !! Fuel !! Drive Wheels !! Notes/Applications
|-
| S || 400 PS/394 hp || 1-spd. Auto. || 1 || 2 || 90 Kwh || Lithium-ion || Electricity || All || Jaguar I-Pace EV400 ('19-'24).
|-
| T || 1029 PS/1015 hp || 1-spd. Auto. || 1 || 3 <br> (1 Front,<br> 2 Rear) || 118 Kwh || Lithium-ion || Electricity || All || Jaguar Type 01 ('28-).
|}
===Check Digit/Gearbox (Position 9)===
* USA /Canada [[Vehicle Identification Numbers (VIN codes)/Check digit|Check digit]]
===Model Year Code (Position 10)===
''See: [[Vehicle Identification Numbers (VIN codes)/Model year]]''
===Plant Codes (Position 11) 2016-===
* A - Solihull, West Midlands, England, UK (XE '17, F-Pace '17-'26, Type 01 '28-)
* C - Castle Bromwich, West Midlands, England, UK (XE '17-'20, XF '16-'24, F-Type '18-'24)
* S - Oxford Road plant, Ryton, West Midlands, England, UK (JLR SVO plant) (XE SV Project 8 '19)
* 1 - Graz, Austria (Magna Steyr plant) (E-Pace '18-'24, I-Pace EV '19-'24)
===Model (Position 12)===
* 9 - XE ('17) [Solihull plant]
* P - XE ('17-'20) [Castle Bromwich plant]
* Y - XF ('16-'24)
* K - F-Type ('18-'24)
* Z - E-Pace ('18-'20)
* 0 - E-Pace ('20-'24)
* F - I-Pace EV ('19-'20)
* 6 - I-Pace EV ('20-'24)
'''Positions 13–17, Serial Number'''
==General Template for Jaguar's VIN format (All models: 2000-2015 plus F-Type '16-'17, XJ '16-'19)==
===Jaguar WMIs (2000-) (Position 1-3)===
* SAJ - Jaguar passenger car (UK)
* SAD - Jaguar SUV (UK & Europe)
===Regional Spec/Restraint System (Position 4):===
* J = Manual seat belts, Dual front airbags (US: XK8 '00)
* B = Manual seat belts, Dual front airbags (Canada: XK8 '00)
* D = Manual seat belts, Depowered Dual front airbags, & Front Side Airbags (US: S-Type '00-'02, XJ8/XJR '00-'03, XK8/XKR '01-'06, XK/XKR Early '07)
* F = Manual seat belts, Depowered Dual front airbags, & Front Side Airbags (Canada: S-Type '00-'02, XJ8/XJR '00-'03, XK8/XKR '01-'06, XK/XKR Early '07)
* E = Manual seat belts, Depowered Dual front airbags w/occupant position sensing, & Front Side Airbags & Side Curtain Airbags (US: X-Type '02-'04, S-Type '03-'04, XJ8/XJR Early '04)
* G = Manual seat belts, Depowered Dual front airbags w/occupant position sensing, & Front Side Airbags & Side Curtain Airbags (Canada: X-Type '02-'04,<br> S-Type '03-'04, XJ8/XJR Early '04)
* W = Manual seat belts, Depowered Dual front airbags w/occupant position (driver) and weight (fr. psgr.) sensing, & Front Side Airbags & Side Curtain Airbags <br> (US: X-Type '05-'08, S-Type '05-'08, XF '09-'15, XJ8/XJR '04-'09, XJ '10-)
* X = Manual seat belts, Depowered Dual front airbags w/occupant position (driver) and weight (fr. psgr.) sensing, & Front Side Airbags & Side Curtain Airbags (Canada: X-Type '05-'08, S-Type '05-'08, XF '09-'15, XJ8/XJR '04-'09, XJ '10-)
* W = Manual seat belts, Depowered Dual front airbags w/occupant position (driver) and weight (fr. psgr.) sensing, & Front Side Head/Thorax Airbags <br> (US: XK/XKR '07-'15, F-Type '14-)
* X = Manual seat belts, Depowered Dual front airbags w/occupant position (driver) and weight (fr. psgr.) sensing, & Front Side Head/Thorax Airbags <br> (Canada: XK/XKR '07-'15, F-Type '14-)
===Transmission & Steering Location (Position 5 - '00-'12):===
* A = Automatic / LHD
* B = Manual / LHD (X-Type '02-'05, S-Type 3.0 '03-'04)
===Transmission & Drive Wheels (Position 5 - '13-):===
* A = Automatic / Rwd (XF '13-'15, XJ '13-'19, XK '13-'15, F-Type '14-'17)
* B = Manual / Rwd (F-Type '16-'17)
* J = Automatic / Awd (XF Awd '13-'15, XJ Awd '13-'19, F-Type Awd '16-'17)
===Model Line (Position 6-7)===
{| class="wikitable"
|+Position 6-7
!VIN code
!Description
|-
|51
|[[w:Jaguar X-Type|Jaguar X-Type sedan - High Series]] ('02-'08)
|-
|52
|[[w:Jaguar X-Type|Jaguar X-Type sedan - Entry Series]] ('03-'04)
|-
|53
|[[w:Jaguar X-Type|Jaguar X-Type sedan w/Sport Package]] ('02-'03)
|-
|54
|[[w:Jaguar X-Type|Jaguar X-Type Sportwagon]] ('05-'08)
|-
|01
|[[w:Jaguar S-Type (1999)|Jaguar S-Type]] ('00-'08)
|-
|03
|[[w:Jaguar S-Type (1999)|Jaguar S-Type Sport]] [3.0, 4.0] ('02)
|-
|03
|[[w:Jaguar S-Type (1999)|Jaguar S-Type Sport]] [3.0, 4.2] ('03)
|-
|03
|[[w:Jaguar S-Type (1999)|Jaguar S-Type R]] ('03-'08)
|-
|05
|[[w:Jaguar XF (X250)|Jaguar XF Luxury]] ('09)
|-
|06
|[[w:Jaguar XF (X250)|Jaguar XF Premium Luxury]] ('09)
|-
|07
|[[w:Jaguar XF (X250)|Jaguar XF Supercharged]] ('09)
|-
|0E
|[[w:Jaguar XF (X250)|Jaguar XF]] ('13-'14)
|-
|0F
|[[w:Jaguar XF (X250)|Jaguar XF]] ('10-'12)
|-
|0F
|[[w:Jaguar XF (X250)|Jaguar XF 2.0T Premium]] [8th pos. of VIN is S] ('15)
|-
|0F
|[[w:Jaguar XF (X250)|Jaguar XF 3.0 Sport Rwd or 3.0 Portfolio Rwd]] [8th pos. of VIN is 7] ('15)
|-
|0F
|[[w:Jaguar XF (X250)|Jaguar XF 3.0 Sport Awd or 3.0 Portfolio Awd]] [8th pos. of VIN is F] ('15)
|-
|0G
|[[w:Jaguar XF (X250)|Jaguar XF Premium]] ('10-'11)
|-
|0H
|[[w:Jaguar XF (X250)|Jaguar XF Portfolio]] [8th pos. of VIN is B] ('12)
|-
|0H
|[[w:Jaguar XF (X250)|Jaguar XF Supercharged]] [8th pos. of VIN is E: '10-'13 or P: '13-'15]
|-
|0J
|[[w:Jaguar XF (X250)|Jaguar XFR]] ('10-'15)
|-
|0K
|[[w:Jaguar XF (X250)|Jaguar XFR-S]] ('13-'15)
|-
|8J
|[[w:Jaguar XF (X250)|Jaguar XFR w/Speed Pack]] ('13-'15)
|-
|12
|[[w:Jaguar XJ (X308)#Sport|Jaguar XJ Sport]] ('02-'03)
|-
|14
|[[w:Jaguar XJ (X308)|Jaguar XJ8]] ('00-'03)
|-
|15
|[[w:Jaguar XJ (X308)#XJR|Jaguar XJR]] ('00-'03)
|-
|23
|[[w:Jaguar XJ (X308)|Jaguar XJ8L]] (LWB) ('00-'01)
|-
|24
|[[w:Jaguar XJ (X308)#Daimler/Vanden Plas|Jaguar XJ8 Vanden Plas]] (LWB) ('00-'03)
|-
|25
|[[w:Jaguar XJ (X308)#Daimler/Vanden Plas|Jaguar XJ8 Vanden Plas Supercharged]] (LWB) ('00-'01)
|-
|25
|[[w:Jaguar XJ (X308)#Daimler/Vanden Plas|Jaguar XJ Super V8]] (LWB) ('02-'03)
|-
|71
|[[w:Jaguar XJ (X350)|Jaguar XJ8]] ('04-'09)
|-
|73
|[[w:Jaguar XJ (X350)|Jaguar XJR]] ('04-'09)
|-
|74
|[[w:Jaguar XJ (X350)|Jaguar XJ8 Vanden Plas]] (SWB) ('04)
|-
|79
|[[w:Jaguar XJ (X350)|Jaguar XJ8L]] (LWB) ('05-'09)
|-
|82
|[[w:Jaguar XJ (X350)|Jaguar XJ8 Vanden Plas]] (LWB) ('05-'09)
|-
|82
|[[w:Jaguar XJ (X350)|Jaguar XJ Super V8]] (LWB, 5-psgr.) ('05-'09)
|-
|86
|[[w:Jaguar XJ (X350)|Jaguar XJ Super V8 Portfolio]] (LWB, 4-psgr.) ('06)
|-
|94
|[[w:Jaguar XJ (X350)|Jaguar XJ Super V8 Portfolio]] (LWB, 5-psgr.) ('09)
|-
|1C
|[[w:Jaguar XJ (X351)|Jaguar XJ]] ('10-'15)
|-
|1C
|[[w:Jaguar XJ (X351)|Jaguar XJ R-Sport]] [8th pos. of VIN is 7 (Rwd) or D (Awd)] ('16-'19)
|-
|1C
|[[w:Jaguar XJ (X351)|Jaguar XJ Supercharged]] [8th pos. of VIN is E] ('16-'19)
|-
|1E
|[[w:Jaguar XJ (X351)|Jaguar XJR]] ('14-'17)
|-
|1G
|[[w:Jaguar XJ (X351)|Jaguar XJ Supercharged]] [8th pos. of VIN is E: '10-'13 or T: '13-'15]
|-
|1J
|[[w:Jaguar XJ (X351)|Jaguar XJ Supersport]] ('11-'12)
|-
|2E
|[[w:Jaguar XJ (X351)|Jaguar XJR LWB]] ('14-'17), XJR575 LWB ('18-'19)
|-
|2G
|[[w:Jaguar XJ (X351)|Jaguar XJL]] [8th pos. of VIN is B] ('10-'11)
|-
|2G
|[[w:Jaguar XJ (X351)|Jaguar XJL Portfolio Rwd]] [8th pos. of VIN is B: '12-'13 or 1: '13]
|-
|2G
|[[w:Jaguar XJ (X351)|Jaguar XJL Portfolio Rwd]] [8th pos. of VIN is Z: '14-'15)
|-
|2G
|[[w:Jaguar XJ (X351)|Jaguar XJL Portfolio Rwd]] [8th pos. of VIN is 7: '16-'19), XJ50 3.0 Rwd (LWB) '19
|-
|2G
|[[w:Jaguar XJ (X351)|Jaguar XJL Portfolio Awd]] [8th pos. of VIN is D] ('13-'19), XJ50 3.0 Awd (LWB) '19
|-
|2G
|[[w:Jaguar XJ (X351)|Jaguar XJL Supercharged]] [8th pos. of VIN is E: '10-'13, '16-'19 or T: '13-'15], XJ50 5.0 Rwd (LWB) '19, XJ Collection (LWB) '19
|-
|2J
|[[w:Jaguar XJ (X351)|Jaguar XJL Supersport]] ('11-'13)
|-
|2K
|[[w:Jaguar XJ (X351)|Jaguar XJL Ultimate]] ('13)
|-
|3F
|[[w:Jaguar XJ (X351)|Jaguar XJ Supersport w/Speed Pack]] ('12-'13)
|-
|3G
|[[w:Jaguar XJ (X351)|Jaguar XJL Supersport w/Speed Pack]] ('12-'13)
|-
|3H
|[[w:Jaguar XJ (X351)|Jaguar XJ Supercharged w/Sport & Speed Pack]] ('12-'15)
|-
|3K
|[[w:Jaguar XJ (X351)|Jaguar XJL Supercharged w/Sport & Speed Pack]] ('12-'15)
|-
|41
|[[w:Jaguar XK (X100)|Jaguar XK8/XKR coupe]] ('00-'06)
|-
|42
|[[w:Jaguar XK (X100)|Jaguar XK8/XKR convertible]] ('00-'06)
|-
|43
|[[w:Jaguar XK (X150)|Jaguar XK/XKR coupe]] ('07-'09)
|-
|44
|[[w:Jaguar XK (X150)|Jaguar XK/XKR convertible]] ('07-'09)
|-
|45
|[[w:Jaguar XK (X150)|Jaguar XKR Portfolio Edition coupe]] ('09)
|-
|46
|[[w:Jaguar XK (X150)|Jaguar XKR Portfolio Edition convertible]] ('09)
|-
|4D
|[[w:Jaguar XK (X150)|Jaguar XK Touring coupe]] [8th pos. of VIN is B] ('13-'14)
|-
|4E
|[[w:Jaguar XK (X150)|Jaguar XK Touring convertible]] [8th pos. of VIN is B] ('13-'14)
|-
|4D
|[[w:Jaguar XK (X150)|Jaguar XKR coupe]] [8th pos. of VIN is C] ('10-'15)
|-
|4E
|[[w:Jaguar XK (X150)|Jaguar XKR convertible]] [8th pos. of VIN is C] ('10-'15)
|-
|4F
|[[w:Jaguar XK (X150)|Jaguar XK coupe]] (most Portfolio Edition features are std.) [8th pos. of VIN is B] ('10-'15)
|-
|4F
|[[w:Jaguar XK (X150)|Jaguar XKR175 coupe]] [8th pos. of VIN is C] ('11)
|-
|4F
|[[w:Jaguar XK (X150)|Jaguar XKR coupe w/Dynamic Pack]] [8th pos. of VIN is C] ('13-'15), XK Final Fifty Edition coupe ('15)
|-
|4G
|[[w:Jaguar XK (X150)|Jaguar XK convertible]] (most Portfolio Edition features are std.) [8th pos. of VIN is B] ('10-'15)
|-
|4G
|[[w:Jaguar XK (X150)|Jaguar XKR convertible w/Dynamic Pack]] [8th pos. of VIN is C] ('13-'15), XK Final Fifty Edition convertible ('15)
|-
|4H
|[[w:Jaguar XK (X150)|Jaguar XKR-S coupe]] ('12-'15), XKR-S GT coupe ('14)
|-
|4J
|[[w:Jaguar XK (X150)|Jaguar XKR-S convertible]] ('12-'15)
|-
|6A
|[[w:Jaguar F-Type)|Jaguar F-Type coupe]] ('15-'17), F-Type Premium coupe '17
|-
|6B
|[[w:Jaguar F-Type)|Jaguar F-Type S coupe]] ('15-'17), F-Type S British Design Edition coupe '17
|-
|6D
|[[w:Jaguar F-Type)|Jaguar F-Type R coupe]] ('15-'17)
|-
|6E
|[[w:Jaguar F-Type)|Jaguar F-Type convertible]] ('14-'17), F-Type Premium convertible '17
|-
|6F
|[[w:Jaguar F-Type)|Jaguar F-Type S convertible]] ('14-'17), F-Type S British Design Edition convertible '17
|-
|6G
|[[w:Jaguar F-Type)|Jaguar F-Type V8 S convertible]] ('14-'15)
|-
|6H
|[[w:Jaguar F-Type)|Jaguar F-Type R convertible]] ('16-'17)
|-
|6J
|[[w:Jaguar F-Type)|Jaguar F-Type SVR coupe]] ('17)
|-
|6K
|[[w:Jaguar F-Type)|Jaguar F-Type SVR convertible]] ('17)
|-
|7A
|[[w:Jaguar F-Type#Project 7)|Jaguar F-Type Project 7 convertible]] ('16)
|}
===Engine/Emissions Control System (Position 8)===
{| class="wikitable"
|+Position 8
! VIN !! Size !! Type !! Fuel !! Valvetrain !! Engine Family/Notes/Applications
|-
| A || 3.0L || 60° V6 || Gas ||DOHC,<br /> 24 valve||MPI. ULEV. Variable intake valve timing. [[w:Jaguar AJ-V6 engine#AJ30|Jaguar AJ-V6 - AJ30 V6 engine]].<br> Jaguar X-Type 3.0 (Mid '05-'08), S-Type 3.0 ('06-'08).
|-
| A || 4.2L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. ULEV. Continuously variable intake valve timing. [[w:Jaguar AJ-V8 engine#4.2 L|Jaguar AJ-V8 - AJ34 V8 engine]]. Jaguar XF ('10).
|-
| A || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 550 PS/542 hp. Jaguar XKR-S ('12-'15), XKR-S GT ('14), F-Type R coupe ('15).
|-
| B || 4.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||MPI. [[w:Jaguar AJ-V8 engine#Supercharged|Jaguar AJ-V8 - AJ27S V8 engine]].<br> Jaguar XJR ('00-'03), Vanden Plas Supercharged ('00-'01), Super V8 ('02-'03), XKR ('00-'02).
|-
| B || 4.2L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||MPI. [[w:Jaguar AJ-V8 engine#Supercharged_2|Jaguar AJ-V8 - AJ33S V8 engine]]. Jaguar XJR ('04-'05), Super V8 ('05), XKR ('03-'06).
|-
| B || 4.2L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. ULEV. Continuously variable intake valve timing. [[w:Jaguar AJ-V8 engine#4.2 L|Jaguar AJ-V8 - AJ34 V8 engine]].<br> Jaguar S-Type ('06-'08), XF ('09), XJ8/Vanden Plas ('06-'09), XK ('07-'09).
|-
| B || 5.0L || V8 || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. Variable intake valve lift. Variable intake.<br> [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> Jaguar XF ('10-'12), XJ ('11-'12), XJL ('11), XJL Portfolio Rwd ('12-'13), XK ('10-'15), XK Touring ('13-'14).
|-
| C || 3.0L || 60° V6 || Gas ||DOHC,<br /> 24 valve||MPI. Variable intake valve timing. [[w:Jaguar AJ-V6 engine#AJ30|Jaguar AJ-V6 - AJ30 V6 engine]].<br> Jaguar S-Type 3.0 ('00-'01), X-Type 3.0 ('02-Mid '05).
|-
| C || 4.0L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. Continuously variable intake valve timing. [[w:Jaguar AJ-V8 engine#4.0 L|Jaguar AJ-V8 - AJ27 V8 engine]].<br> Jaguar XJ8/Vanden Plas ('00-'03), XJ Sport ('02-'03), XK8 ('00-'02).
|-
| C || 4.2L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. Continuously variable intake valve timing. [[w:Jaguar AJ-V8 engine#4.2 L|Jaguar AJ-V8 - AJ33 V8 engine]]. Jaguar XJ8 ('04-'05), XK8 ('03-'06).
|-
| C || 4.2L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||MPI. ULEV. Continuously variable intake valve timing. [[w:Jaguar AJ-V8 engine#Supercharged_2|Jaguar AJ-V8 - AJ34S V8 engine]].<br> Jaguar S-Type R ('06-'08), XF Supercharged ('09), XJR ('06-'09), Super V8 ('06-'09), XKR ('07-'09).
|-
| C || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 510 PS/503 hp. Jaguar XFR ('10-'13), XJ/XJL Supersport ('11-'13), XKR ('10-'15).
|-
| C || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 380 PS/375 hp. Jaguar F-Type S ('14-'15), F-Type S w/man. trans. ('16-'17).
|-
| D || 4.0L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. Continuously variable intake valve timing. [[w:Jaguar AJ-V8 engine#4.0 L|Jaguar AJ-V8 - AJ28 V8 engine]]. Jaguar S-Type 4.0 ('00-'01).
|-
| D || 2.5L || 60° V6 || Gas ||DOHC,<br /> 24 valve||MPI. Variable intake valve timing. [[w:Jaguar AJ-V6 engine#AJ25|Jaguar AJ-V6 - AJ25 V6 engine]]. Jaguar X-Type 2.5 ('02-'05).
|-
| D || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XJ Awd, XJL Portfolio Awd ('13-'15).
|-
| D || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XJ R-Sport Awd, XJL Portfolio Awd ('16-'19), XJ50 3.0 Awd ('19).
|-
| E || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 470 PS/464 hp.<br> Jaguar XF Supercharged ('10-'13), XJ/XJL Supercharged ('11-'13, '16-'19), XJ50 5.0 Rwd ('19), XJ Collection ('19).
|-
| F || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XF 3.0 Awd ('13-'14).
|-
| F || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XF 3.0 Awd ('15).
|-
| H || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas/E85 ||DOHC,<br /> 32 valve||Flex Fuel. Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]]. 510 PS/503 hp. Jaguar XFR ('13-'15).
|-
| K || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 550 PS/542 hp. Jaguar XJR/XJR LWB ('14-'17).
|-
| K || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 575 PS/567 hp. Jaguar XJR575 LWB ('18-'19).
|-
| L || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 495 PS/488 hp. Jaguar F-Type V8 S convertible ('14-'15).
|-
| L || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 550 PS/542 hp. Jaguar F-Type R ('16-'17).
|-
| N || 3.0L || 60° V6 || Gas ||DOHC,<br /> 24 valve||MPI. Variable intake valve timing. [[w:Jaguar AJ-V6 engine#AJ30|Jaguar AJ-V6 - AJ30 V6 engine]]. Jaguar S-Type 3.0 ('01-'02).
|-
| P || 4.0L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. Continuously variable intake valve timing. [[w:Jaguar AJ-V8 engine#4.0 L|Jaguar AJ-V8 - AJ28 V8 engine]]. Jaguar S-Type 4.0 ('01-'02).
|-
| P || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas/E85 ||DOHC,<br /> 32 valve||Flex Fuel. Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]]. 470 PS/464 hp. Jaguar XF Supercharged ('13-'15).
|-
| S || 2.0L || I4 Turbo [[w:Intercooler|IC]] || Gas || DOHC,<br /> 16 valve||Direct Injection. Dual VVT. [[w:Ford EcoBoost engine#2.0 L (2010–2018)|Ford EcoBoost engine (Mazda L engine-based)]].<br> Jaguar XF 2.0T ('13-'14), XF 2.0T Premium ('15).
|-
| T || 3.0L || 60° V6 || Gas ||DOHC,<br /> 24 valve||MPI. Variable intake valve timing. [[w:Jaguar AJ-V6 engine#AJ30|Jaguar AJ-V6 - AJ30 V6 engine]]. Jaguar S-Type 3.0 ('03-'05).
|-
| T || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas/E85 ||DOHC,<br /> 32 valve||Flex Fuel. Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]]. 470 PS/464 hp. Jaguar XJ/XJL Supercharged ('13-'15).
|-
| T || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar F-Type w/auto. trans. ('15-'17), F-Type Premium w/auto. trans. ('17).
|-
| U || 4.2L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. Continuously variable intake valve timing. [[w:Jaguar AJ-V8 engine#4.2 L|Jaguar AJ-V8 - AJ33 V8 engine]]. Jaguar S-Type 4.2 ('03-'05).
|-
| U || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 380 PS/375 hp. Jaguar F-Type S ('15), F-Type S Rwd w/auto. trans. ('16-'17).
|-
| V || 4.2L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||MPI. [[w:Jaguar AJ-V8 engine#Supercharged_2|Jaguar AJ-V8 - AJ33S V8 engine]]. Jaguar S-Type R ('03-'05).
|-
| V || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 380 PS/375 hp. Jaguar F-Type S Awd w/auto. trans. ('16-'17).
|-
| X || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas/E85 ||DOHC,<br /> 24 valve||Flex Fuel. Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XF 3.0 Rwd ('14).
|-
| Z || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 550 PS/542 hp. Jaguar XFR-S ('13-'15).
|-
| Z || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas/E85 ||DOHC,<br /> 24 valve||Flex Fuel. Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XJ Rwd, XJL Portfolio Rwd ('14-'15).
|-
| 1 || 5.0L || V8 || Gas/E85 ||DOHC,<br /> 32 valve||Flex Fuel. Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. Variable intake valve lift. Variable intake. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]]. Jaguar XJL Portfolio Rwd ('13).
|-
| 6 || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar F-Type w/man. trans. ('16-'17), F-Type Premium w/man. trans. ('17).
|-
| 7 || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XF 3.0 Rwd ('13), XJ Rwd ('13), F-Type ('14-'15).
|-
| 7 || 3.0L || 90° V6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||Direct Injection. SULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#V6|Jaguar AJ126 V6 engine]].<br> 340 PS/335 hp. Jaguar XF 3.0 Rwd ('15), XJ R-Sport Rwd ('16-'19), XJL Portfolio Rwd ('16-'19), XJ50 3.0 Rwd ('19).
|-
| 8 || 5.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||Direct Injection. ULEV. Continuously variable intake & exhaust valve timing. [[w:Jaguar AJ-V8 engine#AJ-V8 Gen III 5.0|Jaguar AJ-V8 - AJ133 V8 engine]].<br> 575 PS/567 hp. Jaguar F-Type Project 7 ('16), F-Type SVR ('17).
|}
===Check Digit/Gearbox (Position 9)===
* USA /Canada [[Vehicle Identification Numbers (VIN codes)/Check digit|Check digit]]
===Model Year Code (Position 10)===
''See: [[Vehicle Identification Numbers (VIN codes)/Model year]]''
===Plant Code/Model Line/Engine (Position 11) 2000-2019===
* X - Halewood, Merseyside, England, UK - X-Type 2.5 ('02-'05)
* W - Halewood, Merseyside, England, UK - X-Type 3.0 ('02-'08)
* F - Castle Bromwich, West Midlands, England, UK - S-Type 3.0 ('00-'08)
* G - Castle Bromwich, West Midlands, England, UK - S-Type 4.0 ('00-'02)
* H - Castle Bromwich, West Midlands, England, UK - S-Type 4.2 ('03-'08)
* 1 - Castle Bromwich, West Midlands, England, UK - S-Type R (4.2 supercharged) ('03-'08)
* H - Castle Bromwich, West Midlands, England, UK - XF 4.2 ('09-'10)
* 1 - Castle Bromwich, West Midlands, England, UK - XF Supercharged (4.2 supercharged) ('09)
* L - Castle Bromwich, West Midlands, England, UK - XF 5.0 ('10-'12)
* M - Castle Bromwich, West Midlands, England, UK - XF Supercharged, XFR (5.0 supercharged) ('10-'15), XFR-S (5.0 supercharged) ('13-'15)
* P - Castle Bromwich, West Midlands, England, UK - XF 2.0T ('13-'15)
* 8 - Castle Bromwich, West Midlands, England, UK - XF 3.0 supercharged ('13-'15)
* L - Browns Lane plant, Coventry, West Midlands, England, UK - XJ8 (4.0) ('00-'03), XJ8L (4.0) ('00-'01), XJ8 Vanden Plas (4.0) ('00-'03), XJ Sport (4.0) ('02-'03)
* M - Browns Lane plant, Coventry, West Midlands, England, UK - XJ8 Vanden Plas Supercharged (4.0 supercharged) ('00-'01),<br> Super V8 (4.0 supercharged) ('02-'03), XJR (4.0 supercharged) ('00-'03)
* S - Browns Lane plant, Coventry, West Midlands, England, UK - XJ8 (4.2) ('04-'06), XJ8L (4.2) ('05-'06), XJ8 Vanden Plas (4.0) ('04-'06)
* T - Browns Lane plant, Coventry, West Midlands, England, UK - Super V8 (4.2 supercharged) ('05-'06), Super V8 Portfolio (4.2 supercharged) ('06),<br> XJR (4.2 supercharged) ('04-'06)
* S - Castle Bromwich, West Midlands, England, UK - XJ8 (4.2) ('07-'09), XJ8L (4.2) ('07-'09), XJ8 Vanden Plas (4.0) ('07-'09)
* T - Castle Bromwich, West Midlands, England, UK - Super V8 (4.2 supercharged) ('07-'09), Super V8 Portfolio (4.2 supercharged) ('09),<br> XJR (4.2 supercharged) ('07-'09)
* L - Castle Bromwich, West Midlands, England, UK - XJ (5.0) ('10-'12), XJL (5.0) ('10-'11), XJL Portfolio (5.0) ('12-'13)
* M - Castle Bromwich, West Midlands, England, UK - XJ/XJL Supercharged (5.0 supercharged) ('10-'19), XJ/XJL Supersport (5.0 supercharged) ('11-'13),<br> XJL Ultimate (5.0 supercharged) ('13), XJR SWB/LWB (5.0 supercharged) ('14-'17), XJR575 LWB (5.0 supercharged) ('18-'19), XJ50 LWB (5.0 supercharged) ('19), XJ Collection Sp. Ed. LWB (5.0 supercharged) ('19)
* 8 - Castle Bromwich, West Midlands, England, UK - XJ base (3.0 supercharged) ('13-'15), XJ R-Sport (3.0 supercharged) ('16-'19),<br> XJL Portfolio AWD (3.0 supercharged) ('13-'19), XJL Portfolio RWD (3.0 supercharged) ('14-'19), XJ50 LWB (3.0 supercharged) ('19)
* N - Browns Lane plant, Coventry, West Midlands, England, UK - XK8 (4.0) ('00-'02)
* P - Browns Lane plant, Coventry, West Midlands, England, UK - XKR (4.0 supercharged) ('00-'02)
* 2 - Browns Lane plant, Coventry, West Midlands, England, UK - XK8 (4.2) ('03-'06)
* 3 - Browns Lane plant, Coventry, West Midlands, England, UK - XKR (4.2 supercharged) ('03-'06)
* 5 - Castle Bromwich, West Midlands, England, UK - XK (4.2) ('07-'09)
* 9 - Castle Bromwich, West Midlands, England, UK - XKR (4.2 supercharged) ('07-'09)
* L - Castle Bromwich, West Midlands, England, UK - XK (5.0) ('10-'15)
* M - Castle Bromwich, West Midlands, England, UK - XKR (5.0 supercharged) ('10-'15), XKR-S (5.0 supercharged) ('12-'15), XKR-S GT (5.0 supercharged) ('14)
* 8 - Castle Bromwich, West Midlands, England, UK - F-Type Base, S (3.0 supercharged) ('14-'17), F-Type Premium (3.0 supercharged) ('17)
* M - Castle Bromwich, West Midlands, England, UK - F-Type V8S (5.0 supercharged) ('14-'15), F-Type R (5.0 supercharged) ('15-'17),<br> F-Type Project 7 (5.0 supercharged) ('16), F-Type SVR (5.0 supercharged) ('17)
===Model (Position 12)===
* C - X-Type ('02-'03)
* D - X-Type ('03-'04)
* E - X-Type ('04-'06)
* J - X-Type ('06-'08)
* L - S-Type ('00-'01)
* M - S-Type ('01-'04)
* N - S-Type ('04-'08)
* R - XF ('09-'11)
* S - XF ('11-'13)
* U - XF ('13-'15)
* F - XJ ('00-'03)
* G - XJ ('04-'06) [Browns Lane plant]
* H - XJ ('06-'09) [Castle Bromwich plant]
* V - XJ ('10-'16)
* W - XJ ('16-'19)
* A - XK ('00-'06)
* B - XK ('07-'15)
* K - F-Type ('14-'17)
'''Positions 13–17, Serial Number'''
==General Template for Jaguar's VIN format (1981 - 1999)==
===Jaguar WMIs (1981-1999) (Position 1-3)===
* SAJ - Jaguar passenger car
===Model Line (Position 4)===
{| class="wikitable"
|+Position 4
!VIN code
!Description
|-
|A
|[[w:Jaguar XJ#Series 3 (1979–1992)|Jaguar XJ6]] ('81-'87), XJ6 Vanden Plas ('82-'87)
|-
|B
|[[w:Jaguar XJ#Series 3 (1979–1992)|Jaguar XJ12]] (Canada only: '81-'88)
|-
|D
|[[w:Jaguar XJ#Series 3 (1979–1992)|Jaguar XJ12]] (Canada only: '89-'92)
|-
|H
|[[w:Jaguar XJ (XJ40)|Jaguar XJ6]] ('88-'89, '93-'94)
|-
|F
|[[w:Jaguar XJ (XJ40)|Jaguar XJ6]] ('90-'92)
|-
|H
|[[w:Jaguar XJ (XJ40)|Jaguar XJ6 Sovereign]] ('90-'92)
|-
|K
|[[w:Jaguar XJ (XJ40)#Daimler/Vanden Plas|Jaguar XJ6 Vanden Plas]] ('88-'94)
|-
|M
|[[w:Jaguar XJ (XJ40)#Majestic (1989–1992 – SWB; 1993–1994 – LWB)|Jaguar XJ6 Vanden Plas Majestic]] ('89-'90, '92)
|-
|M
|[[w:Jaguar XJ (XJ40)#XJ12 and Daimler Double Six (XJ81)|Jaguar XJ12]] ('94)
|-
|H
|[[w:Jaguar XJ (X300)|Jaguar XJ6]] ('95-'97)
|-
|H
|[[w:Jaguar XJ (X300)|Jaguar XJ6L]] LWB [X330] ('97)
|-
|K
|[[w:Jaguar XJ (X300)#Daimler/Jaguar Vanden Plas|Jaguar XJ6 Vanden Plas]] SWB ('95)
|-
|K
|[[w:Jaguar XJ (X300)#Daimler/Jaguar Vanden Plas|Jaguar XJ6 Vanden Plas]] LWB [X330] ('96-'97)
|-
|M
|[[w:Jaguar XJ (X300)#XJ12 (X305)|Jaguar XJ12]] SWB ('95)
|-
|M
|[[w:Jaguar XJ (X300)#XJ12 (X305)|Jaguar XJ12]] LWB [X330] ('96)
|-
|P
|[[w:Jaguar XJ (X300)#XJR (X306)|Jaguar XJR]] ('95-'97)
|-
|H
|[[w:Jaguar XJ (X308)|Jaguar XJ8]] ('98-'99)
|-
|H
|[[w:Jaguar XJ (X308)|Jaguar XJ8L]] LWB ('98-'99)
|-
|K
|[[w:Jaguar XJ (X308)#Daimler/Vanden Plas|Jaguar XJ8 Vanden Plas]] LWB ('98-'99)
|-
|P
|[[w:Jaguar XJ (X308)#XJR|Jaguar XJR]] ('98-'99)
|-
|N
|[[w:Jaguar XJS|Jaguar XJ-S]] ('82-'91), XJ-SC ('86-'88), XJS ('92-'96)
|-
|T
|[[w:Jaguar XJS|Jaguar XJ-S]] Rouge Collection ('89-'90), Classic Collection ('90-'91)
|-
|S
|[[w:Jaguar XJS#XJR-S|Jaguar XJR-S]] ('93)
|-
|G
|[[w:Jaguar XK (X100)|Jaguar XK8]] ('97-'99)
|}
===Class (Regional Spec)/Restraint System (Position 5):===
* V = N. American-spec (Manual seat belts)
* L = Canadian-spec (Manual seat belts)
* Y = XJ6 Vanden Plas [Series III] ('82-'87) (Manual seat belts)
* A = Motorized Shoulder Belts (XJ-S coupe '88-'89, XJ-SC '88)
* Y = Motorized Shoulder Belts (XJ-S coupe '89, XJ sedan '89-'92)
* W = Manual seat belts, Driver-side airbag (US: XJ-S '90-'93, XJ6 '93, XJ12 Early '94)
* X = Manual seat belts, Dual front airbags (US: XJS '94-'96, XJ6 '94-'97, XJ12 '94-'96, XJR '95-'97, XK8 '97-'99)
* X = Manual seat belts, Dual front airbags, & Front Side Airbags (US: XJ8/XJR '98-'99)
* D = Manual seat belts, Depowered Dual front airbags, & Front Side Airbags (US: XJ8/XJR '99)
* M = Manual seat belts, Driver-side airbag (Canada)
* N = Manual seat belts, Dual front airbags (Canada)
* F = Manual seat belts, Depowered Dual front airbags, & Front Side Airbags (Canada: XJ8/XJR '99)
===Body Style (Position 6):===
* 1 = 4-door sedan (XJ-series sedan '81-'99)
* 2 = 2-door convertible w/2+2 seating (XJS convertible '94-'96, XK8 convertible '97-'99)
* 3 = 2-door Cabriolet (XJ-SC '86-'88)
* 4 = 2-door convertible w/2-psgr. seating (factory-built XJS convertible '89-'94, XJR-S convertible '93)
* 5 = 2-door coupe (XJS coupe '82-'96, XJR-S coupe '93, XK8 coupe '97-'99)
* 5 = 2-door coupe (Hess & Eisenhardt-built XJS convertible '87-'88) [coupe conversion]
===Engine Type (Position 7):===
{| class="wikitable"
|+Position 7
|-
! VIN !! Size !! Type !! Fuel !! Valvetrain !! Engine Family/Notes/Applications
|-
| 1 || 4.0L || I6 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 24 valve||MPI. [[w:Jaguar AJ6 engine#AJ16S|Jaguar AJ16S I6]]. Jaguar XJR ('95-'97).
|-
| 2 || 4.2L || I6 || Gas ||DOHC,<br /> 12 valve||CA & Canada-spec. MPI. [[w:Jaguar XK engine|Jaguar XK I6]]. Jaguar XJ6 ('81-'82).
|-
| 2 || 4.0L || I6 || Gas ||DOHC,<br /> 24 valve||MPI. Dual-canister evaporative emissions system. [[w:Jaguar AJ6 engine#AJ16|Jaguar AJ16 I6]]. Jaguar XJ6 ('96-'97).
|-
| 2 || 4.0L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. Variable intake valve timing. Dual-canister evaporative emissions system. [[w:Jaguar AJ-V8 engine#4.0 L|Jaguar AJ-V8 - AJ26 V8 engine]].<br> Jaguar XJ8 ('98), XK8 ('98).
|-
| 3 || 4.2L || I6 || Gas ||DOHC,<br /> 12 valve||N. America-spec. MPI. [[w:Jaguar XK engine|Jaguar XK I6]]. Jaguar XJ6 ('81-'87).
|-
| 3 || 6.0L || 60° V12 || Gas ||SOHC,<br /> 24 valve||MPI. [[w:Jaguar V12 engine|Jaguar V12]] modified by [[w:Tom Walkinshaw Racing|JaguarSport]]. Jaguar XJR-S ('93).
|-
| 3 || 6.0L || 60° V12 || Gas ||SOHC,<br /> 24 valve||MPI. [[w:Jaguar V12 engine|Jaguar V12]]. Jaguar XJS ('94-'95), XJ12 ('94-'96).
|-
| 5 || 3.6L || I6 || Gas ||DOHC,<br /> 24 valve||N. America-spec - Low Compression. MPI. [[w:Jaguar AJ6 engine|Jaguar AJ6 I6]]. Jaguar XJ6 ('88-'89).
|-
| 6 || 3.6L || I6 || Gas ||DOHC,<br /> 24 valve||N. America-spec - High Compression. MPI. [[w:Jaguar AJ6 engine|Jaguar AJ6 I6]]. Jaguar XJ6 ('88).
|-
| 7 || 4.0L || I6 || Gas ||DOHC,<br /> 24 valve||MPI. [[w:Jaguar AJ6 engine|Jaguar AJ6 I6]]. Jaguar XJ6 ('90-'94), XJS ('93-'94).
|-
| 7 || 4.0L || I6 || Gas ||DOHC,<br /> 24 valve||MPI. [[w:Jaguar AJ6 engine#AJ16|Jaguar AJ16 I6]]. Jaguar XJ6 ('95-'96), XJS ('95-'96).
|-
| 7 || 4.0L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. Variable intake valve timing. [[w:Jaguar AJ-V8 engine#4.0 L|Jaguar AJ-V8 - AJ26 V8 engine]]. Jaguar XK8 ('97).
|-
| 8 || 5.3L || 60° V12 || Gas ||SOHC,<br /> 24 valve||N. America-spec. MPI. [[w:Jaguar V12 engine|Jaguar V12]]. Jaguar XJ-S ('82-'92), XJ12 (Canada only: '88-'92).
|-
| 8 || 4.0L || V8 [[w:Supercharged|SC]] [[w:Intercooler|IC]] || Gas ||DOHC,<br /> 32 valve||MPI. Dual-canister evaporative emissions system. [[w:Jaguar AJ-V8 engine#Supercharged|Jaguar AJ-V8 - AJ26S V8 engine]]. Jaguar XJR ('98-'99).
|-
| 9 || 4.0L || I6 || Gas ||DOHC,<br /> 24 valve||Canada-spec. MPI. [[w:Jaguar AJ6 engine|Jaguar AJ6 I6]]. Jaguar XJ6 ('90-'93), XJS ('93).
|-
| 0 || 5.3L || 60° V12 || Gas ||SOHC,<br /> 24 valve||Canada-spec. MPI. [[w:Jaguar V12 engine|Jaguar V12]]. Jaguar XJ-S ('82-'87), XJ12 (Canada only: '85-'87).
|-
| 0 || 4.0L || V8 || Gas ||DOHC,<br /> 32 valve||MPI. Continuously variable intake valve timing. Dual-canister evaporative emissions system. Enhanced evaporative emissions control system. [[w:Jaguar AJ-V8 engine#4.0 L|Jaguar AJ-V8 - AJ27 V8 engine]]. Jaguar XJ8 ('99), XK8 ('99).
|}
===Transmission & Steering Location (Position 8):===
* 4 = Automatic / LHD
* 8 = Manual / LHD ('93-'94 XJS 4.0 w/ optional 5-spd. manual)
===Check Digit/Gearbox (Position 9)===
* USA /Canada [[Vehicle Identification Numbers (VIN codes)/Check digit|Check digit]]
===Model Year Code (Position 10)===
''See: [[Vehicle Identification Numbers (VIN codes)/Model year]]''
===Plant Codes (Position 11)===
* C - Browns Lane plant, Coventry, West Midlands, England, UK
===Positions 12–17, Serial Number===
** 100001 and after - XJ-S/XJ-SC/XJS/XJR-S (XJ27)
** 300001 and after - XJ-series sedan Series III
** 500001 and after - XJ-series sedan (XJ40/XJ81)
** 720001 and after - XJ-series sedan (X300/X305/X306/X330)
** 810001 and after - XJ-series sedan (X308)
** 001001 and after - XK8 (X100)
1pslz63etinwt04iojux9idkt0yo1bo
Infrastructure Past, Present, and Future/Puerto Rico Electric Power System
0
485861
4676519
4676420
2026-10-17T13:33:14Z
Ice waterstone
3626847
intro and paragraphs
4676519
wikitext
text/x-wiki
(This wikibooks, expected completion by 11/13)
Introduction
Puerto Rico's electric power system provides electricity to homes, businesses, hospitals, schools, and other important services. However the system has faced several problems, including frequent outrages, aging equipment, financial difficulties, slow disaster recovery, and disagreements about how the system should be managed. For many years, the Puerto Rico Electric Power Authority (PREPA) operated the island's electricity system. Before Hurricane Maria struck in September 2017, PREPA already faced problems with old equipment, expensive fuel, limited maintenance, and large amounts of debt.
Hurricanes Irma and Maria exposed these weaknesses and caused widespread damaged to the power grid (Sotomayor, 2020; Government of Puerto Rico, 2018). Since the hurricanes, Puerto Rico has tried to repair the grid while also changing how it is managed. Private companies have taken over certain operations, the federal government has provided recovery funding, and communities have explored renewable energy and battery storage. However, these changes have not solved every problem. For example, government reports have continued to identity power outrages and delays in completing recovery projects (Congressional Research Service [CRS, 2025; U.S. Government Accountability Office [GAO], 2026).
Hurricane Maria and the Failure of the Power Grid
Puerto Rico's power grid already had serious weaknesses before Hurricane Maria struck on September 20, 2017. Hurricane Irma had passed near the island earlier that month, damaging electricity, water, and communication systems. Maria then caused much more wide spread damaged, leaving many residents without electricity for long periods (Sotomayor, 2020).
One problem was the way electricity was produced and transported across the island. Many major power plants were located in southern Puerto Rico, while much of the electricity demand was in the north. Only a limited number of high voltage transmission lines connected these areas. This made the system vulnerable because damage to a major transmission line could prevent electricity from reaching communities that needed it (Sotomayor, 2020). For example, if a major power plant in the south stopped working during a hurricane, the remaining power plants and transmission lines would have to carry more of the electricity demand. If several transmission lines were also damaged, the system might not be able to deliver enough electricity to the north, This shows how damage to a few important parts of a centralized system can affect many customers.
Puerto Rico also depended heavily on imported fuels, including oil, natural gas, and coal, This meant that electricity production relied on fuel shipments and port facilities. If a hurricane damaged a port or disrupted fuel deliveries, power plants could face additional problems obtaining the fuel they needed (Sotomayor, 2020; CRS, 2025). The hurricanes showed that simply replacing damaged equipment would not be enough. Puerto Rico also needed stronger infrastructure, regular maintenance, and better plans for handling future storms. For example, stronger transmission poles and better protected substations could help reduce storm damage, while backup power systems could help essential service continue operating during outrages.
<mapframe latitude="18.318026" longitude="-66.269531" zoom="8" width="400" height="278" text="Map of Puerto Rico" align="center" />
== Test Chart ==
<timeline>
DateFormat = yyyy
ImageSize = width:400 height:160
PlotArea = left:40 bottom:30 top:10 right:10
Period = from:0 till:100
TimeAxis = orientation:vertical
Colors =
id:barcolor value:rgb(0.2,0.5,0.8)
BarData =
bar:A text:A
bar:B text:B
bar:C text:C
PlotData =
width:25 color:barcolor
bar:A from:0 till:25
bar:B from:0 till:45
bar:C from:0 till:70
</timeline>
{{BookCat}}
39vjvtvf6d2oebrkjy4q7vxlctgfwoj
4676528
4676519
2026-10-17T13:58:28Z
Ice waterstone
3626847
paragraphs
4676528
wikitext
text/x-wiki
(This wikibooks, expected completion by 11/13)
Introduction
Puerto Rico's electric power system provides electricity to homes, businesses, hospitals, schools, and other important services. However the system has faced several problems, including frequent outrages, aging equipment, financial difficulties, slow disaster recovery, and disagreements about how the system should be managed. For many years, the Puerto Rico Electric Power Authority (PREPA) operated the island's electricity system. Before Hurricane Maria struck in September 2017, PREPA already faced problems with old equipment, expensive fuel, limited maintenance, and large amounts of debt.
Hurricanes Irma and Maria exposed these weaknesses and caused widespread damaged to the power grid (Sotomayor, 2020; Government of Puerto Rico, 2018). Since the hurricanes, Puerto Rico has tried to repair the grid while also changing how it is managed. Private companies have taken over certain operations, the federal government has provided recovery funding, and communities have explored renewable energy and battery storage. However, these changes have not solved every problem. For example, government reports have continued to identity power outrages and delays in completing recovery projects (Congressional Research Service [CRS, 2025; U.S. Government Accountability Office [GAO], 2026).
Hurricane Maria and the Failure of the Power Grid
Puerto Rico's power grid already had serious weaknesses before Hurricane Maria struck on September 20, 2017. Hurricane Irma had passed near the island earlier that month, damaging electricity, water, and communication systems. Maria then caused much more wide spread damaged, leaving many residents without electricity for long periods (Sotomayor, 2020).
One problem was the way electricity was produced and transported across the island. Many major power plants were located in southern Puerto Rico, while much of the electricity demand was in the north. Only a limited number of high voltage transmission lines connected these areas. This made the system vulnerable because damage to a major transmission line could prevent electricity from reaching communities that needed it (Sotomayor, 2020). For example, if a major power plant in the south stopped working during a hurricane, the remaining power plants and transmission lines would have to carry more of the electricity demand. If several transmission lines were also damaged, the system might not be able to deliver enough electricity to the north, This shows how damage to a few important parts of a centralized system can affect many customers.
Puerto Rico also depended heavily on imported fuels, including oil, natural gas, and coal, This meant that electricity production relied on fuel shipments and port facilities. If a hurricane damaged a port or disrupted fuel deliveries, power plants could face additional problems obtaining the fuel they needed (Sotomayor, 2020; CRS, 2025). The hurricanes showed that simply replacing damaged equipment would not be enough. Puerto Rico also needed stronger infrastructure, regular maintenance, and better plans for handling future storms. For example, stronger transmission poles and better protected substations could help reduce storm damage, while backup power systems could help essential service continue operating during outrages.
PREPA's Financial Problems and Institutional Restructuring
PREPA faced financial and operating problems for many years. Act 120-2018 described issues such as aging infrastructure, expensive fuel, poor maintenance, administrative problems, and large amounts of debt. These problems made it difficult for PREPA to pay for improvements while continuing to provide electricity (Government of Puerto Rico, 2018). The government responded by creating a legal framework that allowed private companies to take over certain operations and allowed some electricity generation assets to be sold. The goal was to improve efficiency, modernize the system, and make electricity service more financially sustainable. As part of this restructuring, LUMA began managing transmission and distribution operations on June 1, 2021. Genera Puerto Rico began managing most non hydroelectric generation operations on July 1, 2023, while PREPA continued operating its hydroelectric plants (CRS, 2025).
This division of responsibilities can make coordination especially important. For example, when a neighborhood loses power because a distribution line is damaged, the organization responsible for that line must identify the problem and arrange repairs. If the repair also requires coordination with a power plant operator or another agency, the organizations must communicate clearly to restore service as quickly as possible. Changing who management structure, however, does not automatically repair old power lines or prevent future outrages. The CRS reported that Puerto Rico continued to experience partial and island wide blackouts in 2025 (CRS, 2025). This shows why the results of restructuring should be judged by actual improvements, such as fewer outrages, faster repairs, better maintenance, and more affordable electricity.
<mapframe latitude="18.318026" longitude="-66.269531" zoom="8" width="400" height="278" text="Map of Puerto Rico" align="center" />
== Test Chart ==
<timeline>
DateFormat = yyyy
ImageSize = width:400 height:160
PlotArea = left:40 bottom:30 top:10 right:10
Period = from:0 till:100
TimeAxis = orientation:vertical
Colors =
id:barcolor value:rgb(0.2,0.5,0.8)
BarData =
bar:A text:A
bar:B text:B
bar:C text:C
PlotData =
width:25 color:barcolor
bar:A from:0 till:25
bar:B from:0 till:45
bar:C from:0 till:70
</timeline>
{{BookCat}}
shibsjtcevgvrrspbjpx93jtmsiyx1l
4676672
4676528
2026-10-18T03:10:28Z
Ice waterstone
3626847
Draft of our data and research
4676672
wikitext
text/x-wiki
=== Introduction ===
Puerto Rico’s electric power system provides electricity to homes, businesses, hospitals, schools, and other important services. However, the system has faced several problems, including frequent outages, aging equipment, financial difficulties, slow disaster recovery, and disagreements about how the system should be managed. For many years, the Puerto Rico Electric Power Authority (PREPA) operated the island’s electricity system. Before Hurricane Maria struck in September 2017, PREPA already faced problems with old equipment, expensive fuel, limited maintenance, and large amounts of debt. Hurricanes Irma and Maria exposed these weaknesses and caused widespread damage to the power grid (Sotomayor, 2020; Government of Puerto Rico, 2018).
Since the hurricanes, Puerto Rico has tried to repair the grid while also changing how it is managed. Private companies have taken over certain operations, the federal government has provided recovery funding, and communities have explored renewable energy and battery storage. However, these changes have not solved every problem. For example, government reports have continued to identify power outages and delays in completing recovery projects (Congressional Research Service [CRS], 2025; U.S. Government Accountability Office [GAO], 2026). This casebook examines how Puerto Rico is trying to improve its electricity system while continuing to provide power to the people who depend on it. Its main question is: Can a failing system be transformed while it must continue providing service?<mapframe latitude="18.318026" longitude="-66.269531" zoom="8" width="400" height="278" text="Map of Puerto Rico" align="center" />
=== Hurricane Maria and the Failure of the Power Grid ===
Puerto Rico’s power grid already had serious weaknesses before Hurricane Maria struck on September 20, 2017. Hurricane Irma had passed near the island earlier that month, damaging electricity, water, and communication systems. Maria then caused much more widespread damage, leaving many residents without electricity for long periods (Sotomayor, 2020). One problem was the way electricity was produced and transported across the island. Many major power plants were located in southern Puerto Rico, while much of the electricity demand was in the north. Only a limited number of high-voltage transmission lines connected these areas.
This made the system vulnerable because damage to a major transmission line could prevent electricity from reaching communities that needed it (Sotomayor, 2020). For example, if a major power plant in the south stopped working during a hurricane, the remaining power plants and transmission lines would have to carry more of the electricity demand. If several transmission lines were also damaged, the system might not be able to deliver enough electricity to the north. This shows how damage to a few important parts of a centralized system can affect many customers.
Puerto Rico also depended heavily on imported fuels, including oil, natural gas, and coal. This meant that electricity production relied on fuel shipments and port facilities. If a hurricane damaged a port or disrupted fuel deliveries, power plants could face additional problems obtaining the fuel they needed (Sotomayor, 2020; CRS, 2025). The hurricanes showed that simply replacing damaged equipment would not be enough. Puerto Rico also needed stronger infrastructure, regular maintenance, and better plans for handling future storms. For example, stronger transmission poles and better-protected substations could help reduce storm damage, while backup power systems could help essential services continue operating during outages. The main lesson is Puerto Rico’s experience shows that a power system must be designed to withstand disasters, not just operate during normal conditions.
=== PREPA’s Financial Problems and Institutional Restructuring ===
PREPA faced financial and operating problems for many years. Act 120-2018 described issues such as aging infrastructure, expensive fuel, poor maintenance, administrative problems, and large amounts of debt. These problems made it difficult for PREPA to pay for improvements while continuing to provide electricity (Government of Puerto Rico, 2018). The government responded by creating a legal framework that allowed private companies to take over certain operations and allowed some electricity-generation assets to be sold. The goal was to improve efficiency, modernize the system, and make electricity service more financially sustainable. As part of this restructuring, LUMA began managing transmission and distribution operations on June 1, 2021. Genera Puerto Rico began managing most non-hydroelectric generation operations on July 1, 2023, while PREPA continued operating its hydroelectric plants (CRS, 2025).
This division of responsibilities can make coordination especially important. For example, when a neighborhood loses power because a distribution line is damaged, the organization responsible for that line must identify the problem and arrange repairs. If the repair also requires coordination with a power plant operator or another agency, the organizations must communicate clearly to restore service as quickly as possible. Changing the management structure, however, does not automatically repair old power lines or prevent future outages. The CRS reported that Puerto Rico continued to experience partial and island-wide blackouts in 2025 (CRS, 2025). This shows why the results of restructuring should be judged by actual improvements, such as fewer outages, faster repairs, better maintenance, and more affordable electricity. The key takeaway is changing who manages the system can be part of the solution, but the changes must lead to better service and stronger infrastructure.
=== Federal Funding and the Slow Recovery Process ===
After Hurricane Maria, Puerto Rico needed major investments to repair and improve its electricity system. Federal agencies, including FEMA, HUD, and DOE, supported recovery and modernization efforts. According to PREPA, more than $15 billion in federal funding had been awarded for the electricity system by June 2023 (CRS, 2025).However, money being awarded does not mean that construction is finished. In its May 2025 report, CRS stated that more than $10 billion in FEMA funding had been obligated for permanent work, but approximately $2 billion had been disbursed. CRS also reported that less than 1% of the $1.9 billion HUD had obligated for the electric grid had been disbursed as of July 2024 (CRS, 2025). These figures refer to different dates and stages of funding, so they should not be treated as the same measure.
Recovery can take a long time because projects require engineering plans, reviews, permits, contracts, equipment, and trained workers. GAO reported that only nine of 258 large FEMA-funded permanent grid-recovery projects had been completed by the end of 2025. It identified lengthy reviews, staff turnover, complicated funding requirements, and uncertainty about responsibilities as barriers to progress (GAO, 2026). For example, a project to replace damaged power poles may have funding available but still need engineering approval, environmental review, materials, and a contractor before construction can begin. If one of these steps is delayed, the community may continue relying on damaged or outdated infrastructure while the project waits to move forward. To improve recovery, government agencies need to coordinate their work, make responsibilities clear, and explain delays to the public. They should also report how much money has been spent, which projects have been completed, and whether the work has improved electricity service. The main lesson is Federal funding is important, but it must be turned into completed projects that make the power system more reliable.
=== Culebra, Solar Power, and Battery Storage ===
Culebra is a small island municipality off the eastern coast of Puerto Rico. Its residents face the risk of long electricity interruptions when storms damage the wider power system. These outages can affect everyday needs, such as keeping food refrigerated, charging communication devices, and operating medical equipment (Environmental Defense Fund [EDF], 2026). In a 2020 master’s paper, Federico Sotomayor examined the possibility of building a utility-scale solar farm on Culebra. The proposal was intended to increase local electricity production and reduce dependence on the main power system. EDF later described a community-focused project involving residential solar panels and battery storage to help participating households lower energy costs and maintain essential electricity during outages (Sotomayor, 2020; EDF, 2026).
Solar panels produce electricity when sunlight is available, while batteries store some of that electricity for later use. For example, if a hurricane causes the main grid to fail in the evening, a home with solar panels and a properly configured battery may still be able to power selected appliances. A home with solar panels but no suitable backup equipment may lose power when the grid goes down, even if the panels themselves are undamaged. Local solar and battery systems could give Culebra more options during outages. However, they are not a complete solution by themselves. Installing these systems can be expensive, and some residents may need financial assistance to participate.
Equipment must also be installed correctly, maintained, and protected from severe weather. A utility-scale solar farm would face additional challenges, including finding suitable land, connecting to the local grid, and determining how much electricity and storage the island would need. The proposal described by Sotomayor should not be treated as proof that the proposed solar farm was built. EDF’s description of residential solar and battery work is a separate community-based approach (Sotomayor, 2020; EDF, 2026). The key takeaway is local renewable energy can help communities prepare for outages, but projects must be affordable, properly designed, and supported over time.
=== Renewable Energy Goals and the Future of Puerto Rico’s Grid ===
Puerto Rico has been working toward a cleaner electricity system, but there are different views about how quickly the transition should happen and which energy sources should be used. Act 17-2019 established a goal of obtaining 100% of Puerto Rico’s electricity from renewable sources by 2050, with earlier targets for 2025 and 2040. Act 1-2025 removed those interim targets and extended the planned end of coal use from 2028 to 2032 (CRS, 2025).Renewable energy can reduce the need to import fossil fuels, but solar and wind power must be supported by equipment that helps deliver electricity when and where it is needed. For example, solar panels may produce plenty of electricity on a sunny afternoon, but they do not produce electricity after sunset. Batteries, other generating sources, and a well-planned grid are needed to help meet demand at night.
Puerto Rico must also make sure that new energy projects can connect to its existing infrastructure. If a solar farm is built in an area where transmission lines cannot carry the additional electricity, the project may not provide its full intended benefit. This is why renewable-energy development must happen alongside improvements to transmission, distribution, storage, and system controls (CRS, 2025; EDF, 2026). The transition also raises questions about affordability. A household that can afford rooftop solar and batteries may have more options during an outage, while a household with fewer financial resources may still depend entirely on the wider grid.
Support programs and community-based projects can help ensure that improvements reach people who need them most (EDF, 2026). Puerto Rico therefore needs a plan that addresses immediate reliability problems while also preparing for a cleaner energy future. This means repairing the existing grid, improving storage and transmission, expanding renewable energy where suitable, and keeping electricity affordable. The main lesson is reliable electricity and renewable energy should be planned together. Puerto Rico needs a dependable system today while building a cleaner system for tomorrow.
{| class="wikitable"
|+Timeline of Important Events
!Year
!Event
!Why it matters
|-
|2014
|Act 57 changed parts of PREPA's governance and oversight
|It was part of the effort to reform the electricity sector
|-
|2017
|Hurricanes Irma and Maria severely damaged the grid
|The storms existing infrastructure and maintenance problems
|-
|2018
|Act 120 established a framework for private-sector partcipitation
|It changed how PREPA's assets and operations could be managed
|-
|2019
|Act 17 established renewable-energy goals
|It set a long term direction for the energy transition
|-
|June
2021
|LUMA began managing transmission and distribution operations
|Responsibility for major parts of the grid shifted to a private operator
|-
|July
2023
|Genera began managing most non-hydroelectric generation operations
|Generation management became separate from transmission and distribution
|-
|2025
|Act 1 changed interim renewable-energy targets and extended planned coal use
|It changed the timeline for parts of the energy transition
|-
|2025-
2026
|Government reports continued to identify outrages and recovery delays
|They showed that improving reliability and completing recovery work remained challenges
|}
(Sources: Government of Puerto Rico, 2018; CRS, 2025; GAO, 2026.)
=== Main Organizations and Their Roles ===
PREPA is the public corporation associated with Puerto Rico’s electricity assets and financial restructuring. LUMA manages transmission and distribution operations, while Genera manages most non-hydroelectric generation operations. These different responsibilities mean that repairing a damaged power line, managing a power plant, and planning future energy projects may require coordination among several organizations (CRS, 2025). The Puerto Rico Energy Bureau regulates the energy sector, including important planning and rate decisions. Federal agencies also play major roles.
FEMA supports eligible disaster recovery projects, HUD provides community development funding that includes grid recovery, and DOE supports energy assessments and modernization efforts. Local communities and energy partners contribute by identifying needs and developing projects such as residential solar and battery systems (CRS, 2025; GAO, 2026; EDF, 2026). For example, improving electricity service in a community may require a utility operator to repair equipment, a government agency to approve or fund a project, and local organizations to explain which services residents need most. If these groups do not coordinate, a project may be delayed or fail to address the community’s most urgent problems.
=== Can a Failing System Be Transformed While It Must Continue Providing Service? ===
Yes, but it requires careful planning, steady investment, and a balance between immediate needs and long-term improvements. Puerto Rico cannot shut down its entire electricity system while it replaces equipment and builds a new one. Hospitals, homes, businesses, schools, and emergency services still need electricity during construction and recovery. This means repairs and improvements must happen in stages. For example, crews can repair a damaged transmission line to restore electricity while engineers plan how to strengthen that line against future storms. The immediate repair helps customers today, while the longer-term improvement can reduce the chance of similar problems in the future. This approach allows the system to keep operating while parts of it are improved.
The same principle applies to management and funding. Puerto Rico has changed who operates different parts of its electricity system, but continuing outages show that organizational changes must be supported by better maintenance, clear responsibilities, and measurable improvements in service (CRS, 2025). Federal funding must also move through planning and construction so that it results in completed projects rather than remaining tied up in lengthy processes (GAO, 2026).
Local energy projects can provide another layer of protection. Solar panels and batteries in Culebra, for example, may help participating households keep essential appliances operating during an outage. However, these systems do not replace the need for a strong island-wide grid. Both local backup systems and major infrastructure improvements are needed (Sotomayor, 2020; EDF, 2026). The best approach is to repair the most urgent problems while gradually building a stronger and more reliable system. Puerto Rico must keep electricity flowing, improve how the system is managed, complete recovery projects, and prepare for a cleaner energy future at the same time.
=== Conclusion ===
Puerto Rico’s electricity system shows how difficult it can be to transform essential infrastructure while people continue to depend on it. Hurricanes Irma and Maria exposed weaknesses that had developed over many years. Financial problems, aging equipment, and complicated recovery processes have made rebuilding difficult. Changes in management have altered who operates parts of the system, but reliable electricity remains a major concern. The case studies show that no single solution can fix every problem.
Stronger equipment can reduce storm damage, better coordination can help recovery projects move forward, and clear oversight can improve accountability. Solar panels, batteries, and other local energy systems can also help communities maintain essential electricity during outages. Puerto Rico’s experience suggests that a failing system can be transformed while it continues to provide service, but only through careful planning, cooperation, funding, and attention to the needs of residents. The goal should not be to rebuild the old system exactly as it was. It should be to create a system that is more reliable, affordable, and prepared for future disasters.
=== References ===
Congressional Research Service. (2025). Electric reliability and resiliency in Puerto Rico (IF12913). https://www.congress.gov/crs-product/IF12913
Environmental Defense Fund. (2026, June 12). Transforming Puerto Rico’s energy system. https://www.edf.org/energy/strengthening-puerto-ricos-energy-system
Government Accountability Office. (2026). El Apagón—The Blackout: Puerto Rico’s continuing struggle for stable electricity. https://www.gao.gov/blog/el-apagon-blackout.-puerto-ricos-continuing-struggle-stable-electricity
Government of Puerto Rico. (2018). Puerto Rico Electric Power System Transformation Act, Act No. 120-2018. https://bvirtualogp.pr.gov/ogp/Bvirtual/leyesreferencia/PDF/2-ingles/120-2018.pdf
Sotomayor, F. (2020). Master’s paper on Puerto Rico’s electric power system and the potential for a utility-scale solar farm on Culebra. Clark University. https://commons.clarku.edu/cgi/viewcontent.cgi?article=1258&context=idce_masters_papers
sfxfmnyxj7c2grldsjay6ny98chtuft
4676678
4676672
2026-10-18T03:29:48Z
Ice waterstone
3626847
image testing phase
4676678
wikitext
text/x-wiki
=== Introduction ===
Puerto Rico’s electric power system provides electricity to homes, businesses, hospitals, schools, and other important services. However, the system has faced several problems, including frequent outages, aging equipment, financial difficulties, slow disaster recovery, and disagreements about how the system should be managed. For many years, the Puerto Rico Electric Power Authority (PREPA) operated the island’s electricity system. Before Hurricane Maria struck in September 2017, PREPA already faced problems with old equipment, expensive fuel, limited maintenance, and large amounts of debt. Hurricanes Irma and Maria exposed these weaknesses and caused widespread damage to the power grid (Sotomayor, 2020; Government of Puerto Rico, 2018).
Since the hurricanes, Puerto Rico has tried to repair the grid while also changing how it is managed. Private companies have taken over certain operations, the federal government has provided recovery funding, and communities have explored renewable energy and battery storage. However, these changes have not solved every problem. For example, government reports have continued to identify power outages and delays in completing recovery projects (Congressional Research Service [CRS], 2025; U.S. Government Accountability Office [GAO], 2026). This casebook examines how Puerto Rico is trying to improve its electricity system while continuing to provide power to the people who depend on it. Its main question is: Can a failing system be transformed while it must continue providing service?<mapframe latitude="18.318026" longitude="-66.269531" zoom="8" width="400" height="278" text="Map of Puerto Rico" align="center" />
=== Hurricane Maria and the Failure of the Power Grid ===
Puerto Rico’s power grid already had serious weaknesses before Hurricane Maria struck on September 20, 2017. Hurricane Irma had passed near the island earlier that month, damaging electricity, water, and communication systems. Maria then caused much more widespread damage, leaving many residents without electricity for long periods (Sotomayor, 2020). One problem was the way electricity was produced and transported across the island. Many major power plants were located in southern Puerto Rico, while much of the electricity demand was in the north. Only a limited number of high-voltage transmission lines connected these areas.
This made the system vulnerable because damage to a major transmission line could prevent electricity from reaching communities that needed it (Sotomayor, 2020). For example, if a major power plant in the south stopped working during a hurricane, the remaining power plants and transmission lines would have to carry more of the electricity demand. If several transmission lines were also damaged, the system might not be able to deliver enough electricity to the north. This shows how damage to a few important parts of a centralized system can affect many customers.
Puerto Rico also depended heavily on imported fuels, including oil, natural gas, and coal. This meant that electricity production relied on fuel shipments and port facilities. If a hurricane damaged a port or disrupted fuel deliveries, power plants could face additional problems obtaining the fuel they needed (Sotomayor, 2020; CRS, 2025). The hurricanes showed that simply replacing damaged equipment would not be enough. Puerto Rico also needed stronger infrastructure, regular maintenance, and better plans for handling future storms. For example, stronger transmission poles and better-protected substations could help reduce storm damage, while backup power systems could help essential services continue operating during outages. The main lesson is Puerto Rico’s experience shows that a power system must be designed to withstand disasters, not just operate during normal conditions.
=== PREPA’s Financial Problems and Institutional Restructuring ===
PREPA faced financial and operating problems for many years. Act 120-2018 described issues such as aging infrastructure, expensive fuel, poor maintenance, administrative problems, and large amounts of debt. These problems made it difficult for PREPA to pay for improvements while continuing to provide electricity (Government of Puerto Rico, 2018). The government responded by creating a legal framework that allowed private companies to take over certain operations and allowed some electricity-generation assets to be sold. The goal was to improve efficiency, modernize the system, and make electricity service more financially sustainable. As part of this restructuring, LUMA began managing transmission and distribution operations on June 1, 2021. Genera Puerto Rico began managing most non-hydroelectric generation operations on July 1, 2023, while PREPA continued operating its hydroelectric plants (CRS, 2025).
This division of responsibilities can make coordination especially important. For example, when a neighborhood loses power because a distribution line is damaged, the organization responsible for that line must identify the problem and arrange repairs. If the repair also requires coordination with a power plant operator or another agency, the organizations must communicate clearly to restore service as quickly as possible. Changing the management structure, however, does not automatically repair old power lines or prevent future outages. The CRS reported that Puerto Rico continued to experience partial and island-wide blackouts in 2025 (CRS, 2025). This shows why the results of restructuring should be judged by actual improvements, such as fewer outages, faster repairs, better maintenance, and more affordable electricity. The key takeaway is changing who manages the system can be part of the solution, but the changes must lead to better service and stronger infrastructure.
=== Federal Funding and the Slow Recovery Process ===
After Hurricane Maria, Puerto Rico needed major investments to repair and improve its electricity system. Federal agencies, including FEMA, HUD, and DOE, supported recovery and modernization efforts. According to PREPA, more than $15 billion in federal funding had been awarded for the electricity system by June 2023 (CRS, 2025).However, money being awarded does not mean that construction is finished. In its May 2025 report, CRS stated that more than $10 billion in FEMA funding had been obligated for permanent work, but approximately $2 billion had been disbursed. CRS also reported that less than 1% of the $1.9 billion HUD had obligated for the electric grid had been disbursed as of July 2024 (CRS, 2025). These figures refer to different dates and stages of funding, so they should not be treated as the same measure.
Recovery can take a long time because projects require engineering plans, reviews, permits, contracts, equipment, and trained workers. GAO reported that only nine of 258 large FEMA-funded permanent grid-recovery projects had been completed by the end of 2025. It identified lengthy reviews, staff turnover, complicated funding requirements, and uncertainty about responsibilities as barriers to progress (GAO, 2026). For example, a project to replace damaged power poles may have funding available but still need engineering approval, environmental review, materials, and a contractor before construction can begin. If one of these steps is delayed, the community may continue relying on damaged or outdated infrastructure while the project waits to move forward. To improve recovery, government agencies need to coordinate their work, make responsibilities clear, and explain delays to the public. They should also report how much money has been spent, which projects have been completed, and whether the work has improved electricity service. The main lesson is Federal funding is important, but it must be turned into completed projects that make the power system more reliable.
=== Culebra, Solar Power, and Battery Storage ===
Culebra is a small island municipality off the eastern coast of Puerto Rico. Its residents face the risk of long electricity interruptions when storms damage the wider power system. These outages can affect everyday needs, such as keeping food refrigerated, charging communication devices, and operating medical equipment (Environmental Defense Fund [EDF], 2026). In a 2020 master’s paper, Federico Sotomayor examined the possibility of building a utility-scale solar farm on Culebra. The proposal was intended to increase local electricity production and reduce dependence on the main power system. EDF later described a community-focused project involving residential solar panels and battery storage to help participating households lower energy costs and maintain essential electricity during outages (Sotomayor, 2020; EDF, 2026).
Solar panels produce electricity when sunlight is available, while batteries store some of that electricity for later use. For example, if a hurricane causes the main grid to fail in the evening, a home with solar panels and a properly configured battery may still be able to power selected appliances. A home with solar panels but no suitable backup equipment may lose power when the grid goes down, even if the panels themselves are undamaged. Local solar and battery systems could give Culebra more options during outages. However, they are not a complete solution by themselves. Installing these systems can be expensive, and some residents may need financial assistance to participate.
Equipment must also be installed correctly, maintained, and protected from severe weather. A utility-scale solar farm would face additional challenges, including finding suitable land, connecting to the local grid, and determining how much electricity and storage the island would need. The proposal described by Sotomayor should not be treated as proof that the proposed solar farm was built. EDF’s description of residential solar and battery work is a separate community-based approach (Sotomayor, 2020; EDF, 2026). The key takeaway is local renewable energy can help communities prepare for outages, but projects must be affordable, properly designed, and supported over time.
=== Renewable Energy Goals and the Future of Puerto Rico’s Grid ===
Puerto Rico has been working toward a cleaner electricity system, but there are different views about how quickly the transition should happen and which energy sources should be used. Act 17-2019 established a goal of obtaining 100% of Puerto Rico’s electricity from renewable sources by 2050, with earlier targets for 2025 and 2040. Act 1-2025 removed those interim targets and extended the planned end of coal use from 2028 to 2032 (CRS, 2025).Renewable energy can reduce the need to import fossil fuels, but solar and wind power must be supported by equipment that helps deliver electricity when and where it is needed. For example, solar panels may produce plenty of electricity on a sunny afternoon, but they do not produce electricity after sunset. Batteries, other generating sources, and a well-planned grid are needed to help meet demand at night.
Puerto Rico must also make sure that new energy projects can connect to its existing infrastructure. If a solar farm is built in an area where transmission lines cannot carry the additional electricity, the project may not provide its full intended benefit. This is why renewable-energy development must happen alongside improvements to transmission, distribution, storage, and system controls (CRS, 2025; EDF, 2026). The transition also raises questions about affordability. A household that can afford rooftop solar and batteries may have more options during an outage, while a household with fewer financial resources may still depend entirely on the wider grid.
Support programs and community-based projects can help ensure that improvements reach people who need them most (EDF, 2026). Puerto Rico therefore needs a plan that addresses immediate reliability problems while also preparing for a cleaner energy future. This means repairing the existing grid, improving storage and transmission, expanding renewable energy where suitable, and keeping electricity affordable. The main lesson is reliable electricity and renewable energy should be planned together. Puerto Rico needs a dependable system today while building a cleaner system for tomorrow.
[[File:Civil engineering practice.png]]
{| class="wikitable"
|+Timeline of Important Events
!Year
!Event
!Why it matters
|-
|2014
|Act 57 changed parts of PREPA's governance and oversight
|It was part of the effort to reform the electricity sector
|-
|2017
|Hurricanes Irma and Maria severely damaged the grid
|The storms existing infrastructure and maintenance problems
|-
|2018
|Act 120 established a framework for private-sector partcipitation
|It changed how PREPA's assets and operations could be managed
|-
|2019
|Act 17 established renewable-energy goals
|It set a long term direction for the energy transition
|-
|June
2021
|LUMA began managing transmission and distribution operations
|Responsibility for major parts of the grid shifted to a private operator
|-
|July
2023
|Genera began managing most non-hydroelectric generation operations
|Generation management became separate from transmission and distribution
|-
|2025
|Act 1 changed interim renewable-energy targets and extended planned coal use
|It changed the timeline for parts of the energy transition
|-
|2025-
2026
|Government reports continued to identify outrages and recovery delays
|They showed that improving reliability and completing recovery work remained challenges
|}
(Sources: Government of Puerto Rico, 2018; CRS, 2025; GAO, 2026.)
=== Main Organizations and Their Roles ===
PREPA is the public corporation associated with Puerto Rico’s electricity assets and financial restructuring. LUMA manages transmission and distribution operations, while Genera manages most non-hydroelectric generation operations. These different responsibilities mean that repairing a damaged power line, managing a power plant, and planning future energy projects may require coordination among several organizations (CRS, 2025). The Puerto Rico Energy Bureau regulates the energy sector, including important planning and rate decisions. Federal agencies also play major roles.
FEMA supports eligible disaster recovery projects, HUD provides community development funding that includes grid recovery, and DOE supports energy assessments and modernization efforts. Local communities and energy partners contribute by identifying needs and developing projects such as residential solar and battery systems (CRS, 2025; GAO, 2026; EDF, 2026). For example, improving electricity service in a community may require a utility operator to repair equipment, a government agency to approve or fund a project, and local organizations to explain which services residents need most. If these groups do not coordinate, a project may be delayed or fail to address the community’s most urgent problems.
=== Can a Failing System Be Transformed While It Must Continue Providing Service? ===
Yes, but it requires careful planning, steady investment, and a balance between immediate needs and long-term improvements. Puerto Rico cannot shut down its entire electricity system while it replaces equipment and builds a new one. Hospitals, homes, businesses, schools, and emergency services still need electricity during construction and recovery. This means repairs and improvements must happen in stages. For example, crews can repair a damaged transmission line to restore electricity while engineers plan how to strengthen that line against future storms. The immediate repair helps customers today, while the longer-term improvement can reduce the chance of similar problems in the future. This approach allows the system to keep operating while parts of it are improved.
The same principle applies to management and funding. Puerto Rico has changed who operates different parts of its electricity system, but continuing outages show that organizational changes must be supported by better maintenance, clear responsibilities, and measurable improvements in service (CRS, 2025). Federal funding must also move through planning and construction so that it results in completed projects rather than remaining tied up in lengthy processes (GAO, 2026).
Local energy projects can provide another layer of protection. Solar panels and batteries in Culebra, for example, may help participating households keep essential appliances operating during an outage. However, these systems do not replace the need for a strong island-wide grid. Both local backup systems and major infrastructure improvements are needed (Sotomayor, 2020; EDF, 2026). The best approach is to repair the most urgent problems while gradually building a stronger and more reliable system. Puerto Rico must keep electricity flowing, improve how the system is managed, complete recovery projects, and prepare for a cleaner energy future at the same time.
=== Conclusion ===
Puerto Rico’s electricity system shows how difficult it can be to transform essential infrastructure while people continue to depend on it. Hurricanes Irma and Maria exposed weaknesses that had developed over many years. Financial problems, aging equipment, and complicated recovery processes have made rebuilding difficult. Changes in management have altered who operates parts of the system, but reliable electricity remains a major concern. The case studies show that no single solution can fix every problem.
Stronger equipment can reduce storm damage, better coordination can help recovery projects move forward, and clear oversight can improve accountability. Solar panels, batteries, and other local energy systems can also help communities maintain essential electricity during outages. Puerto Rico’s experience suggests that a failing system can be transformed while it continues to provide service, but only through careful planning, cooperation, funding, and attention to the needs of residents. The goal should not be to rebuild the old system exactly as it was. It should be to create a system that is more reliable, affordable, and prepared for future disasters.
=== References ===
Congressional Research Service. (2025). Electric reliability and resiliency in Puerto Rico (IF12913). https://www.congress.gov/crs-product/IF12913
Environmental Defense Fund. (2026, June 12). Transforming Puerto Rico’s energy system. https://www.edf.org/energy/strengthening-puerto-ricos-energy-system
Government Accountability Office. (2026). El Apagón—The Blackout: Puerto Rico’s continuing struggle for stable electricity. https://www.gao.gov/blog/el-apagon-blackout.-puerto-ricos-continuing-struggle-stable-electricity
Government of Puerto Rico. (2018). Puerto Rico Electric Power System Transformation Act, Act No. 120-2018. https://bvirtualogp.pr.gov/ogp/Bvirtual/leyesreferencia/PDF/2-ingles/120-2018.pdf
Sotomayor, F. (2020). Master’s paper on Puerto Rico’s electric power system and the potential for a utility-scale solar farm on Culebra. Clark University. https://commons.clarku.edu/cgi/viewcontent.cgi?article=1258&context=idce_masters_papers
n1vt37uieoqvivzcs5x4vm6tgh166fk
4676679
4676678
2026-10-18T03:30:38Z
Ice waterstone
3626847
deleting image
4676679
wikitext
text/x-wiki
=== Introduction ===
Puerto Rico’s electric power system provides electricity to homes, businesses, hospitals, schools, and other important services. However, the system has faced several problems, including frequent outages, aging equipment, financial difficulties, slow disaster recovery, and disagreements about how the system should be managed. For many years, the Puerto Rico Electric Power Authority (PREPA) operated the island’s electricity system. Before Hurricane Maria struck in September 2017, PREPA already faced problems with old equipment, expensive fuel, limited maintenance, and large amounts of debt. Hurricanes Irma and Maria exposed these weaknesses and caused widespread damage to the power grid (Sotomayor, 2020; Government of Puerto Rico, 2018).
Since the hurricanes, Puerto Rico has tried to repair the grid while also changing how it is managed. Private companies have taken over certain operations, the federal government has provided recovery funding, and communities have explored renewable energy and battery storage. However, these changes have not solved every problem. For example, government reports have continued to identify power outages and delays in completing recovery projects (Congressional Research Service [CRS], 2025; U.S. Government Accountability Office [GAO], 2026). This casebook examines how Puerto Rico is trying to improve its electricity system while continuing to provide power to the people who depend on it. Its main question is: Can a failing system be transformed while it must continue providing service?<mapframe latitude="18.318026" longitude="-66.269531" zoom="8" width="400" height="278" text="Map of Puerto Rico" align="center" />
=== Hurricane Maria and the Failure of the Power Grid ===
Puerto Rico’s power grid already had serious weaknesses before Hurricane Maria struck on September 20, 2017. Hurricane Irma had passed near the island earlier that month, damaging electricity, water, and communication systems. Maria then caused much more widespread damage, leaving many residents without electricity for long periods (Sotomayor, 2020). One problem was the way electricity was produced and transported across the island. Many major power plants were located in southern Puerto Rico, while much of the electricity demand was in the north. Only a limited number of high-voltage transmission lines connected these areas.
This made the system vulnerable because damage to a major transmission line could prevent electricity from reaching communities that needed it (Sotomayor, 2020). For example, if a major power plant in the south stopped working during a hurricane, the remaining power plants and transmission lines would have to carry more of the electricity demand. If several transmission lines were also damaged, the system might not be able to deliver enough electricity to the north. This shows how damage to a few important parts of a centralized system can affect many customers.
Puerto Rico also depended heavily on imported fuels, including oil, natural gas, and coal. This meant that electricity production relied on fuel shipments and port facilities. If a hurricane damaged a port or disrupted fuel deliveries, power plants could face additional problems obtaining the fuel they needed (Sotomayor, 2020; CRS, 2025). The hurricanes showed that simply replacing damaged equipment would not be enough. Puerto Rico also needed stronger infrastructure, regular maintenance, and better plans for handling future storms. For example, stronger transmission poles and better-protected substations could help reduce storm damage, while backup power systems could help essential services continue operating during outages. The main lesson is Puerto Rico’s experience shows that a power system must be designed to withstand disasters, not just operate during normal conditions.
=== PREPA’s Financial Problems and Institutional Restructuring ===
PREPA faced financial and operating problems for many years. Act 120-2018 described issues such as aging infrastructure, expensive fuel, poor maintenance, administrative problems, and large amounts of debt. These problems made it difficult for PREPA to pay for improvements while continuing to provide electricity (Government of Puerto Rico, 2018). The government responded by creating a legal framework that allowed private companies to take over certain operations and allowed some electricity-generation assets to be sold. The goal was to improve efficiency, modernize the system, and make electricity service more financially sustainable. As part of this restructuring, LUMA began managing transmission and distribution operations on June 1, 2021. Genera Puerto Rico began managing most non-hydroelectric generation operations on July 1, 2023, while PREPA continued operating its hydroelectric plants (CRS, 2025).
This division of responsibilities can make coordination especially important. For example, when a neighborhood loses power because a distribution line is damaged, the organization responsible for that line must identify the problem and arrange repairs. If the repair also requires coordination with a power plant operator or another agency, the organizations must communicate clearly to restore service as quickly as possible. Changing the management structure, however, does not automatically repair old power lines or prevent future outages. The CRS reported that Puerto Rico continued to experience partial and island-wide blackouts in 2025 (CRS, 2025). This shows why the results of restructuring should be judged by actual improvements, such as fewer outages, faster repairs, better maintenance, and more affordable electricity. The key takeaway is changing who manages the system can be part of the solution, but the changes must lead to better service and stronger infrastructure.
=== Federal Funding and the Slow Recovery Process ===
After Hurricane Maria, Puerto Rico needed major investments to repair and improve its electricity system. Federal agencies, including FEMA, HUD, and DOE, supported recovery and modernization efforts. According to PREPA, more than $15 billion in federal funding had been awarded for the electricity system by June 2023 (CRS, 2025).However, money being awarded does not mean that construction is finished. In its May 2025 report, CRS stated that more than $10 billion in FEMA funding had been obligated for permanent work, but approximately $2 billion had been disbursed. CRS also reported that less than 1% of the $1.9 billion HUD had obligated for the electric grid had been disbursed as of July 2024 (CRS, 2025). These figures refer to different dates and stages of funding, so they should not be treated as the same measure.
Recovery can take a long time because projects require engineering plans, reviews, permits, contracts, equipment, and trained workers. GAO reported that only nine of 258 large FEMA-funded permanent grid-recovery projects had been completed by the end of 2025. It identified lengthy reviews, staff turnover, complicated funding requirements, and uncertainty about responsibilities as barriers to progress (GAO, 2026). For example, a project to replace damaged power poles may have funding available but still need engineering approval, environmental review, materials, and a contractor before construction can begin. If one of these steps is delayed, the community may continue relying on damaged or outdated infrastructure while the project waits to move forward. To improve recovery, government agencies need to coordinate their work, make responsibilities clear, and explain delays to the public. They should also report how much money has been spent, which projects have been completed, and whether the work has improved electricity service. The main lesson is Federal funding is important, but it must be turned into completed projects that make the power system more reliable.
=== Culebra, Solar Power, and Battery Storage ===
Culebra is a small island municipality off the eastern coast of Puerto Rico. Its residents face the risk of long electricity interruptions when storms damage the wider power system. These outages can affect everyday needs, such as keeping food refrigerated, charging communication devices, and operating medical equipment (Environmental Defense Fund [EDF], 2026). In a 2020 master’s paper, Federico Sotomayor examined the possibility of building a utility-scale solar farm on Culebra. The proposal was intended to increase local electricity production and reduce dependence on the main power system. EDF later described a community-focused project involving residential solar panels and battery storage to help participating households lower energy costs and maintain essential electricity during outages (Sotomayor, 2020; EDF, 2026).
Solar panels produce electricity when sunlight is available, while batteries store some of that electricity for later use. For example, if a hurricane causes the main grid to fail in the evening, a home with solar panels and a properly configured battery may still be able to power selected appliances. A home with solar panels but no suitable backup equipment may lose power when the grid goes down, even if the panels themselves are undamaged. Local solar and battery systems could give Culebra more options during outages. However, they are not a complete solution by themselves. Installing these systems can be expensive, and some residents may need financial assistance to participate.
Equipment must also be installed correctly, maintained, and protected from severe weather. A utility-scale solar farm would face additional challenges, including finding suitable land, connecting to the local grid, and determining how much electricity and storage the island would need. The proposal described by Sotomayor should not be treated as proof that the proposed solar farm was built. EDF’s description of residential solar and battery work is a separate community-based approach (Sotomayor, 2020; EDF, 2026). The key takeaway is local renewable energy can help communities prepare for outages, but projects must be affordable, properly designed, and supported over time.
=== Renewable Energy Goals and the Future of Puerto Rico’s Grid ===
Puerto Rico has been working toward a cleaner electricity system, but there are different views about how quickly the transition should happen and which energy sources should be used. Act 17-2019 established a goal of obtaining 100% of Puerto Rico’s electricity from renewable sources by 2050, with earlier targets for 2025 and 2040. Act 1-2025 removed those interim targets and extended the planned end of coal use from 2028 to 2032 (CRS, 2025).Renewable energy can reduce the need to import fossil fuels, but solar and wind power must be supported by equipment that helps deliver electricity when and where it is needed. For example, solar panels may produce plenty of electricity on a sunny afternoon, but they do not produce electricity after sunset. Batteries, other generating sources, and a well-planned grid are needed to help meet demand at night.
Puerto Rico must also make sure that new energy projects can connect to its existing infrastructure. If a solar farm is built in an area where transmission lines cannot carry the additional electricity, the project may not provide its full intended benefit. This is why renewable-energy development must happen alongside improvements to transmission, distribution, storage, and system controls (CRS, 2025; EDF, 2026). The transition also raises questions about affordability. A household that can afford rooftop solar and batteries may have more options during an outage, while a household with fewer financial resources may still depend entirely on the wider grid.
Support programs and community-based projects can help ensure that improvements reach people who need them most (EDF, 2026). Puerto Rico therefore needs a plan that addresses immediate reliability problems while also preparing for a cleaner energy future. This means repairing the existing grid, improving storage and transmission, expanding renewable energy where suitable, and keeping electricity affordable. The main lesson is reliable electricity and renewable energy should be planned together. Puerto Rico needs a dependable system today while building a cleaner system for tomorrow.
{| class="wikitable"
|+Timeline of Important Events
!Year
!Event
!Why it matters
|-
|2014
|Act 57 changed parts of PREPA's governance and oversight
|It was part of the effort to reform the electricity sector
|-
|2017
|Hurricanes Irma and Maria severely damaged the grid
|The storms existing infrastructure and maintenance problems
|-
|2018
|Act 120 established a framework for private-sector partcipitation
|It changed how PREPA's assets and operations could be managed
|-
|2019
|Act 17 established renewable-energy goals
|It set a long term direction for the energy transition
|-
|June
2021
|LUMA began managing transmission and distribution operations
|Responsibility for major parts of the grid shifted to a private operator
|-
|July
2023
|Genera began managing most non-hydroelectric generation operations
|Generation management became separate from transmission and distribution
|-
|2025
|Act 1 changed interim renewable-energy targets and extended planned coal use
|It changed the timeline for parts of the energy transition
|-
|2025-
2026
|Government reports continued to identify outrages and recovery delays
|They showed that improving reliability and completing recovery work remained challenges
|}
(Sources: Government of Puerto Rico, 2018; CRS, 2025; GAO, 2026.)
=== Main Organizations and Their Roles ===
PREPA is the public corporation associated with Puerto Rico’s electricity assets and financial restructuring. LUMA manages transmission and distribution operations, while Genera manages most non-hydroelectric generation operations. These different responsibilities mean that repairing a damaged power line, managing a power plant, and planning future energy projects may require coordination among several organizations (CRS, 2025). The Puerto Rico Energy Bureau regulates the energy sector, including important planning and rate decisions. Federal agencies also play major roles.
FEMA supports eligible disaster recovery projects, HUD provides community development funding that includes grid recovery, and DOE supports energy assessments and modernization efforts. Local communities and energy partners contribute by identifying needs and developing projects such as residential solar and battery systems (CRS, 2025; GAO, 2026; EDF, 2026). For example, improving electricity service in a community may require a utility operator to repair equipment, a government agency to approve or fund a project, and local organizations to explain which services residents need most. If these groups do not coordinate, a project may be delayed or fail to address the community’s most urgent problems.
=== Can a Failing System Be Transformed While It Must Continue Providing Service? ===
Yes, but it requires careful planning, steady investment, and a balance between immediate needs and long-term improvements. Puerto Rico cannot shut down its entire electricity system while it replaces equipment and builds a new one. Hospitals, homes, businesses, schools, and emergency services still need electricity during construction and recovery. This means repairs and improvements must happen in stages. For example, crews can repair a damaged transmission line to restore electricity while engineers plan how to strengthen that line against future storms. The immediate repair helps customers today, while the longer-term improvement can reduce the chance of similar problems in the future. This approach allows the system to keep operating while parts of it are improved.
The same principle applies to management and funding. Puerto Rico has changed who operates different parts of its electricity system, but continuing outages show that organizational changes must be supported by better maintenance, clear responsibilities, and measurable improvements in service (CRS, 2025). Federal funding must also move through planning and construction so that it results in completed projects rather than remaining tied up in lengthy processes (GAO, 2026).
Local energy projects can provide another layer of protection. Solar panels and batteries in Culebra, for example, may help participating households keep essential appliances operating during an outage. However, these systems do not replace the need for a strong island-wide grid. Both local backup systems and major infrastructure improvements are needed (Sotomayor, 2020; EDF, 2026). The best approach is to repair the most urgent problems while gradually building a stronger and more reliable system. Puerto Rico must keep electricity flowing, improve how the system is managed, complete recovery projects, and prepare for a cleaner energy future at the same time.
=== Conclusion ===
Puerto Rico’s electricity system shows how difficult it can be to transform essential infrastructure while people continue to depend on it. Hurricanes Irma and Maria exposed weaknesses that had developed over many years. Financial problems, aging equipment, and complicated recovery processes have made rebuilding difficult. Changes in management have altered who operates parts of the system, but reliable electricity remains a major concern. The case studies show that no single solution can fix every problem.
Stronger equipment can reduce storm damage, better coordination can help recovery projects move forward, and clear oversight can improve accountability. Solar panels, batteries, and other local energy systems can also help communities maintain essential electricity during outages. Puerto Rico’s experience suggests that a failing system can be transformed while it continues to provide service, but only through careful planning, cooperation, funding, and attention to the needs of residents. The goal should not be to rebuild the old system exactly as it was. It should be to create a system that is more reliable, affordable, and prepared for future disasters.
=== References ===
Congressional Research Service. (2025). Electric reliability and resiliency in Puerto Rico (IF12913). https://www.congress.gov/crs-product/IF12913
Environmental Defense Fund. (2026, June 12). Transforming Puerto Rico’s energy system. https://www.edf.org/energy/strengthening-puerto-ricos-energy-system
Government Accountability Office. (2026). El Apagón—The Blackout: Puerto Rico’s continuing struggle for stable electricity. https://www.gao.gov/blog/el-apagon-blackout.-puerto-ricos-continuing-struggle-stable-electricity
Government of Puerto Rico. (2018). Puerto Rico Electric Power System Transformation Act, Act No. 120-2018. https://bvirtualogp.pr.gov/ogp/Bvirtual/leyesreferencia/PDF/2-ingles/120-2018.pdf
Sotomayor, F. (2020). Master’s paper on Puerto Rico’s electric power system and the potential for a utility-scale solar farm on Culebra. Clark University. https://commons.clarku.edu/cgi/viewcontent.cgi?article=1258&context=idce_masters_papers
5znkw5o6nh9m5wiahz8kmfy5276qgza
Infrastructure Past, Present, and Future/Loudoun County Data Centers
0
485862
4676558
4676354
2026-10-17T16:21:08Z
~2026-55676-72
3628625
added table
4676558
wikitext
text/x-wiki
== Introduction ==
Loudoun County Data Virginia is home to over 200 Data centers, the most of any locality in the United States. Data centers began being built in the region in 1993 with the MAE-East internet hub in Vienna. <ref>{{Cite web |last=Konheim |first=Orrin |title=Tyson’s Corner at the Epicenter of the Internet |url=http://vivatysons.com/blog/2019/02/15/tysons-corner-at-the-epicenter-of-the-internet/ |access-date=2026-09-25 |language=en}}</ref>However in 1995 the location moved to Ashburn to better allow for scaling as demand increased. Today, Ashburn is home to 133 Data Centers alone, earning it and Loudoun County the nickname "Data Center Alley."<ref>{{Cite web |title=Data Center Alley: How Ashburn became a data center hub of the world {{!}} Digital Realty |url=https://www.www.digitalrealty.com/resources/blog/northern-virginia-ashburn-data-centers?t=1792158935657?latest |access-date=2026-09-25 |website=www.www.digitalrealty.com |language=en}}</ref>
Loudoun County has the highest median household income in the United States of $181,765 in 2024.<ref>{{Cite web |title=U.S. Census Bureau QuickFacts: Loudoun County, Virginia |url=https://www.census.gov/quickfacts/loudouncountyvirginia |access-date=2026-10-15 |website=www.census.gov |language=en}}</ref>
== History ==
MAE East, standing for Metropolitan Area Ethernet, was the first internet exchange point (IXP) not run by the government. In 1992, the first 4 points were set up in Washington, D.C. and then spread to Vienna, Reston, and then Ashburn. MAE East was created by UUNET and Metropolitan Fiber Systems. This early internet infrastructure made Northern Virginia, specifically Loudoun County, very appealing for further infrastructure development.
In the 90s, two of the largest and first internet service providers set their headquarters in Ashburn, Virginia, located within Loudoun County. America Online (AOL) in 1996 and UUNet in 1998. Context in America at the time is important to understanding how Loudoun has become the data center hub it is today. In the 90s, America was going through a technological revolution with the era of the World Wide Web (WWW), which was released to the public in 1993. By 1995, there were about 10,000 web servers online, allowing the public across America to easily use the internet. During this large growth of the internet industry, these two major companies chose to put their headquarters in Ashburn, Virginia. This was not a coincidence, but rather a very deliberate and motivated growth strategy. Loudoun County, and subsequently Ashburn, has an advantageous location near Washington, D.C., Dulles International Airport, and the IXP in Vienna. The area also had a large number of qualified workers to help build infrastructure exponentially.
The early infrastructure built up in the 1990s made it easier and more enticing for other internet companies to set up in the area. In the 2000s, AOL and UUnet were well established; Ashburn and other companies were starting to gravitate to Loudoun County. These companies started bringing more internet infrastructure into Loudoun County. The county has zoning laws that classify and categorize districts and land use for types of buildings/ infrastructure. At the time, there was no classification for data centers, but the Zoning administrator chose to allow them anywhere that office buildings were allowed. The county had a “by-right” building rule that permitted building without any further approval as long as zoning allowed for it. This led to data centers being built in office parks and near homes as part of “mixed-use” communities.
In 2008, the housing market crashed around the United States. This largely affected Loudoun County, as the county’s revenue came primarily from residential taxes. Loudoun County needed to diversify the tax base to make up for the loss of the primary source of revenue. With internet companies interested in locating in Loudoun County and land available, government officials saw an economic opportunity to increase commercial tax revenue. The next year, 2007, Loudoun County began expanding data center construction. 2007 to 2016, the county had the largest data center growth in the country. This large boom in infrastructure in Loudoun County caused many of the internet service providers to switch from MAE East IXP to Equinix Ashburn. In 2009, MAE East, one of the major draws for data centers in Loudoun County, officially shut down.
{{maplink|frame=yes|type=shape|id=Q495310|text=[[Loudoun County]]}}
== Timeline ==
== Recent developments ==
In 2024 the County Board of Supervisors launched the Data Center Standards & Locations project to address resident's concerns regarding data centers. The plan consists of two phases.<ref>{{Cite web |title=Data Center Standards & Locations {{!}} Loudoun County, VA - Official Website |url=https://www.loudoun.gov/DataCenterStandards |access-date=2026-10-15 |website=www.loudoun.gov}}</ref>
==== Phase 1 - Approved March 18, 2025 ====
This phase focused on proposed map and text amendments to the Loudoun County 2019 Comprehensive Plan. Redesignating Data Centers in industrial zones as conditional or Special Exception (SPEX), ending the By-Right construction that had existed since 2000.<ref>{{Cite web |date=2026-07-02 |title=Data Centers in Loudoun: A Primer - The Piedmont Environmental Council |url=https://www.pecva.org/region/loudoun/data-centers-in-loudoun-a-primer/ |access-date=2026-10-15 |language=en-US}}</ref> Special Exceptions require both a public hearing and a board vote to be permitted, unlike by-right construction.
==== Phase 2 - Currently Ongoing ====
This phase is focused on creating new use-specific zoning standards for data centers and utility substations that serve them. This would create new requirements for future data centers to be approved.
=== Criticisms of the Data Center Standards & Locations Project ===
As a part of Phase 1 of the plan the Board of Supervisors also passed a grandfathering resolution that allows any Data centers that were previously approved by Feb. 12, 2025 to continue under the previous rules. This allowed 15 data center projects to continue without meeting the SPEX requirements.<ref>{{Cite news |last=Flack |first=Eric |date=11:19 PM EDT October 6, 2026 |title=Loudoun supervisors don't rollback data center grandfathering law, shelve $200,000 audit of grandfathered projects |work=Wusa9 |url=https://www.wusa9.com/article/news/community/data-centers/data-center-rollback-grandfathering-laws-loudoun-county/65-136555f2-d85b-498b-a53a-c7d0582e82e5 |access-date=3:43 PM EDT October 10, 2026}}</ref> Additionally the Board shelved an audit of these 15 projects, which was a compromise instead of ending them and forcing them to begin again under the new rules.
== Fiscal Reality of Data Centers ==
Loudoun County's largest revenue source is property taxes. As the value of property increases the county has consistently lowered the real property tax rate. The increase in property value is in part driven by the data center construction.
Additionally, data centers and related companies make up all 10 of the top 10 tax payers in Loudoun.<ref>{{Cite web |title=Popular Annual Financial Report |url=https://prcsinfo.loudoun.gov/view/952649939/6/?sharedOn= |access-date=2026-10-15 |website=prcsinfo.loudoun.gov}}</ref>
== Lessons Learned ==
The Loudoun County data center situation offers a lot of lessons learned that could prevent future mistakes between infrastructure growth and policy. The first takeaway comes from before the boom in data centers. Loudoun County suffered greatly from the 2008 recession, causing house values to plummet. A significant portion of the county's tax revenue came from residential housing. The county lost a large portion of its funding, leaving a desperate need to find a new source of revenue. This led to the decision to allow so many data centers into the county. This provides a valuable lesson for the future about diversifying the county’s tax revenue sources. Relying on one source can easily lead to disaster when that source falls through. This lesson may not have been learned fully, as the county now largely relies on tax revenue from these data centers, which is a very unstable and unreliable industry. The top 10 tax sources were all data centers.
{| class="wikitable"
|+TOP 10 TAXPAYERS
!Rank
!Business Name
!Assessed Value
!% of Taxable Assessed Value
|-
|1
|Digital Loudoun 3 LLC
|$2.76 Billion
|1.61%
|-
|2
|NTT Global Data Centers, VA LLC
|$2.63 Billion
|1.53%
|-
|3
|Amazon Data Services Inc
|$2.31 Billion
|1.35%
|-
|4
|Digital Loudoun Pkwy Ctr North LLC
|$1.47 Billion
|0.85%
|-
|5
|Equinix LLC
|$1.42 Billion
|0.83%
|-
|6
|Microsoft Corp
|$1.35 Billion
|0.79%
|-
|7
|Aligned Energy Data Centers, IAD Propco LLC
|$1.26 Billion
|0.73%
|-
|8
|Kaveh Ventures LLC.
|$991.31 Million
|0.58%
|-
|9
|C1 Northern Virginia Sterling V LLC
|$966.5 Million
|0.56%
|-
|10
|Compass Datacenters IAD LLC
|$951.4 Million
|0.55%
|}
Data centers in Loudoun County were constructed rapidly and expanded exponentially due to the county’s unprepared zoning ordinances. Data centers were put under the category of business centers in the early years because there was no category for them. This allowed data centers all over the county with little restriction. Finally, in 2025, the county changed the zoning ordinances so data centers were no longer “By-right” and were limited to zoned areas. Policy is an important part of shaping our society, and it needs to be able to evolve and change to keep up with new infrastructure. When policy moves and changes slowly, it fails to adapt to what society needs. This is an important lesson that seems to have been learned; however, only time will tell. {{BookCat}}
lbu4aliclu37x9eoeqi29766rv8hz9m
About Monsters And Angels/Questions And Answers
0
486351
4676541
4676246
2026-10-17T15:09:52Z
3MMPEYTON
3393808
4676541
wikitext
text/x-wiki
== Questions and Answers ==
'''Q: Where did the word "monster" come from?''' <br>
<br>
A: Monster derives from the Latin ''monstrum''. Monstrum is derived from the verb ''moneo'', which means "to remind, warn, instruct, or foretell." [2] <br>
The early, 14th century meaning of the word "monster" originally referred to a malformed human, animal, or to a birth defect that was interpreted as a supernatural sign, or as a warning from the divine. [3] <br>
Towards the end of the 14th century, the word expanded to include mythical beasts. In the 1520s, the word began to describe massive animals. Around the 1550s, the word started to describe evil people, characterized by their inhuman cruelty or wickedness. By the 19th century, the word "monster" was used as an adjective to describe things of gigantic size. [2]
'''Q: What are cryptids?'''<br>
<br>
A: A '''cryptid''' is an animal or creature whose existence is claimed through folklore, legends, or eyewitness accounts, but which has never been scientifically proven or verified by mainstream zoology. [1]
<br>
<br>
'''Q: What is the oldest mythical creature?''' <br>
<br>
A: There is no single oldest mythical creature. Prehistoric Art depicted hybrid beings long before written records existed. Luckily, Archaeology and ancient literature points to a few of the oldest recorded monsters. <br>
<br>
'''Earliest Prehistoric Art:'''
<br>
The Lion-Man [Hohlenstein-Stadel]: This 40,000 - to - 44,000-year-old ivory carving was discovered in Germany. It is a carving of a human body with a lion's head. [4] <br>
<br>
Indonesian Cave Art: A 44,000-year-old rock Art painting in Sulawesi, Indonesia, depicts part-human, part-animal figures. These therianthropes are shown hunting. This proves that humans imagined hybrid creatures deep in the Stone Age. [5]
<br>
<br>
'''Early Literature:''' <br>
Some of the oldest written monsters in human literature can be found in the ancient Mesopotamian ''Epic of Gilgamesh'', a piece of literature dating around 2000 BCE. Humbaba and the Scorpion-men may be some of the oldest monsters in history. [6]
<br>
<br>
<br>
==== References: ====
1. "List of Cryptids." October 13, 2026. In Wikipedia, https://en.wikipedia.org/wiki/List_of_cryptids <br>
<br>
2. "Monster." October 12, 2026. In Wikipedia, https://en.wikipedia.org/wiki/Monster <br>
<br>
3. "What is a monster?" September 7, 2015. University of Cambridge. https://www.cam.ac.uk/research/discussion/what-is-a-monster <br>
<br>
4. "Lion-man of Hohlenstein-Stadel." September 14, 2026. In Wikipedia, https://en.wikipedia.org/wiki/Lion-man_of_Hohlenstein-Stadel
<br>
<br>
5. Rigby, Sara. "44,000-year-old Cave Art Depicts Earliest-Known Mythical Beasts" December 12, 2019. BBC Science Focus Magazine https://www.sciencefocus.com/news/440000-year-old-cave-art-depicts-earliest-known-mythical-beasts <br>
<br>
6. "Epic of Gilgamesh." September 28, 2026. In Wikipedia, https://en.wikipedia.org/wiki/Epic_of_Gilgamesh <br>
<br>
<br><noinclude>{{Chapter navigation with TOC||Introduction|TOC mini}}</noinclude>
<br>
{{BookCat}}
l4ag0qb6htt0vh1fn5lvzkiu36ik3jw
Wikibooks:Patrollers
4
486364
4676560
4676443
2026-10-17T17:03:38Z
Codename Noreste
3441010
Expanding. ([[:m:User:Max/MaxEdit.js|MaxEdit]])
4676560
wikitext
text/x-wiki
[[File:Wikibooks Patroller Icon.svg|right|150px]]
'''Patrollers''' are a group of users with the technical ability to patrol new pages, not create redirects when moving pages, and quickly revert malicious edits using the [[WB:ROLLBACK|rollback feature]], among other things. In addition, their edits are automatically marked as patrolled by the MediaWiki software. These user rights are automatically granted to [[Wikibooks:Administrators|administrators]].
The group was created in October 2026 following [[Wikibooks:Reading room/Proposals#FlaggedRevs again|consensus to discontinue the Flagged Revisions extension]].
== Requesting the patroller user group ==
Any trustworthy user can request patroller status by filing a request at [[Wikibooks:Requests for permissions]].
{{User groups}}
[[Category:User groups]]
rkcey7x1jpfi9llhtgnmyrnjf9dmlrj
4676561
4676560
2026-10-17T17:05:12Z
Codename Noreste
3441010
Rewriting the word. ([[:m:User:Max/MaxEdit.js|MaxEdit]])
4676561
wikitext
text/x-wiki
[[File:Wikibooks Patroller Icon.svg|right|150px]]
'''Patrollers''' are a group of users with the technical ability to patrol new pages, not create redirects when moving pages, and quickly revert malicious edits using the [[WB:ROLLBACK|rollback feature]], among other things. In addition, their edits are automatically marked as patrolled by the MediaWiki software. These permissions are automatically granted to [[Wikibooks:Administrators|administrators]].
The group was created in October 2026 following [[Wikibooks:Reading room/Proposals#FlaggedRevs again|consensus to discontinue the Flagged Revisions extension]].
== Requesting the patroller user group ==
Any trustworthy user can request patroller status by filing a request at [[Wikibooks:Requests for permissions]].
{{User groups}}
[[Category:User groups]]
bk873hxwsyhym6e0yy39qrji63fggnt
4676562
4676561
2026-10-17T17:10:24Z
Codename Noreste
3441010
+
4676562
wikitext
text/x-wiki
[[File:Wikibooks Patroller Icon.svg|right|150px]]
'''Patrollers''' are a group of users with the technical ability to patrol new pages, not create redirects when moving pages, and quickly revert malicious edits using the [[WB:ROLLBACK|rollback feature]], among other things. In addition, their edits are automatically marked as patrolled by the MediaWiki software. These permissions are automatically granted to [[Wikibooks:Administrators|administrators]].
The group was created in October 2026 following [[Wikibooks:Reading room/Proposals#FlaggedRevs again|consensus to discontinue the Flagged Revisions extension]].
There are currently [[Special:ListUsers/patroller|'''{{NUMINGROUP:patroller}}''' patrollers]] on the English Wikibooks.
== Requesting the patroller user group ==
Any trustworthy user can request patroller status by filing a request at [[Wikibooks:Requests for permissions]].
{{User groups}}
[[Category:User groups]]
qdyu4r5fwu1fbwwdfcq15ww8y2gzzig
Koine Greek/Infinitives
0
486376
4676577
4676441
2026-10-17T20:28:27Z
It-is-Truly-Meet
3624460
4676577
wikitext
text/x-wiki
This page is intended to give an introduction to infinitives in Koine Greek.
==Present Infinitive==
==Future Infinitive==
==Aorist Infinitive==
===Aorist Active Infinitive===
The aorist, like the present and future tenses, occurs in the infinitive mood. The augment to secondary tenses indicates '''actual historical action'''; thus only the '''indicative''' mood uses it. The aorist infinitive, a verbal noun, '''never''' has the augment.
====First Aorist Active Infinitive====
'''Formation''': verb stem + σαι.
The persistent '''accent''' falls on the '''penult''', the second-to-last syllable.
* δεῖ.ξαι
* πισ.τεῦ.σαι
* γε.νη.θῆ.ναι
====Second Aorist Active Infinitive====
=====Thematic Formation=====
'''Thematic formation''': verb stem + ειν. The '''present''' indicative active infinitive accents on the '''penult''' (e.g., λαμβάνειν); the 2nd aorist active indicative infinitive has a '''circumflex''' on the '''ultima''' (e.g., λαβεῖν).
=====Athematic Formation=====
'''Αthematic formation''': verb stem + ναι. The athematic 2nd aorist uses the same infinitive ending as the athematic present tense. Like the present tense, the accent falls on the '''penult'''.
* γνῶ.ναι
* βῆ.ναι
===Aorist Middle Infinitive===
====First Aorist Middle Infinitive====
====Second Aorist Middle Infinitive====
=====Thematic Formation=====
=====Athematic Formation=====
===Aorist Passive Infinitive===
====First Aorist Passive Infinitive====
====Second Aorist Passive Infinitive====
===Infinitive and Aspect===
If an infinitive is used as an '''articular''' or a '''complementary infinitive''', the present and aorist tenses of the infinitive are used to express '''aspect''', not time. In other words, the present infinitive expresses ongoing activity, while the aorist infinitive expresses a simple momentary action. This distinction is often unexpressed in English.
* '''Present infinitive''': παίζειν βούλομαι. — I want to be playing.
* '''Aorist infinitive''': παῖσαι βούλομαι. — I want to play.
==Perfect Infinitive==
==Syntax and Use==
===Complementary Infinitives===
===Articular Infinitives===
===Infinitive Aspect===
{{BookCat}}
gbtou0r1pplr4zjelqsznq96471i0r6
Koine Greek/Overview of Conjunctions
0
486382
4676567
4676411
2026-10-17T18:21:37Z
It-is-Truly-Meet
3624460
4676567
wikitext
text/x-wiki
A '''conjunction''' is an uninflected linguistic form that joins sentences, clauses, phrases, or words.
Greek conjunctions work like those in English, but they are often used more frequently and subtly. Greek often connects sentences and clauses with conjunctions such as "and," "but," and "therefore" to link ideas.
==Coordinating (Paratactic) Conjunctions==
===AND===
* '''καί''': Connects words, clauses, and sentences. As an adverb, it means "even" or "also."
* '''τε''' (enclitic): Like καί, it links clauses and sentences, but rarely connects individual words in Greek prose. τε...καί is a slightly weaker version of καί...καί, meaning "both...and." As a monosyllabic enclitic, τε rarely has an accent.
* '''δέ''': Often marks a clause or sentence as distinct from the preceding one, sometimes with a slight contrast. Depending on context, it can mean "and" or "but," or remain untranslated.
* '''μέν...δέ''': Marks a contrast between two words, clauses, or ideas. It can be translated "on the one hand...on the other hand," but μέν is often left untranslated, and δέ may mean "and" or "but." Sometimes neither is translated.
In Koine Greek, several common conjunctions and connective particles are '''postpositive''': they normally occur after the first word of a clause rather than at its beginning. These include τε, δέ, μέν, γάρ, and οὖν. Unlike these words, καί can begin a clause.
Consider the following examples:
* χρήματα καὶ ὑπάρχοντα δίδομεν. — We give money and property.
* δίδομεν τὰ σπέρματα καὶ δίδοτε τὸ ὕδωρ. — We give the seeds and you give the water.
* τὰ σπέρματα δίδομεν, ὑπάρχοντα δὲ δίδοτε. — We give the seeds and you give property.
* τὰ σπέρματα μὲν δίδομεν, ὕδωρ δὲ δίδοτε. — We give the seeds and you give water.
===AND...NOT===
* '''οὔτε''': "and not," or as part of οὔτε...οὔτε, "neither...nor."
* '''μήτε''': "and not," or as part of μήτε...μήτε, "neither...nor."
These forms combine οὐ or μή with τε. Their choice depends on the construction and the type of negation required; οὔτε commonly occurs with indicative clauses, while μήτε also occurs in constructions involving infinitives. This is a tendency, not an absolute rule.
===BUT===
* '''ἀλλά''': "but," "yet." It expresses a stronger opposition to a preceding clause or statement than δέ.
* '''δέ''': Depending on context, it can express a weaker contrast and be translated "but."
* '''μέν...δέ''': Often marks a contrast in which μέν is left untranslated and δέ is translated "but" or "and."
===OR===
* '''ἤ''': "or." Its breathing mark and accent distinguish it from ἡ, the feminine definite article.
* '''εἴτε...εἴτε''': "either...or" or "whether...or."
* '''μήτε...μήτε''': "neither...nor," with μή-type negation.
* '''οὔτε...οὔτε''': "neither...nor," with οὐ-type negation.
===BECAUSE===
* '''γάρ''' (postpositive): "for," "because."
* '''ὅτι''': "because" when it introduces a causal clause. It can also mean "that" in other constructions.
===THEREFORE===
* '''ἄρα''': "therefore," "so."
* '''διό''': "therefore," "for this reason."
* '''οὖν''' (postpositive): "therefore," "then."
* '''τοίνυν''' (postpositive): "therefore," "accordingly."
==Subordinating (Hypotactic) Conjunctions==
===Cause and Explanation===
* '''ὅτι''': "because," introducing a causal clause.
* '''ἐπεί''': "since," "because"; it can also have temporal meanings such as "after" or "when."
===Condition===
* '''εἰ''' ('''εἴπερ'''): "if."
* '''ἐάν''': "if," commonly used with the subjunctive.
For a fuller explanation of conditional constructions, see [[Koine Greek/Conditional Clauses]].
===Time===
* '''ἐπεί''': "after," "when," or "since," depending on context.
* '''ἕως''': "until," "while."
* '''μέχρι''': "until."
* '''ὅτε''': "when."
* '''πρίν''': "before" or "until," depending on the construction. It commonly occurs with an infinitive in constructions meaning "before."
===Purpose and Result===
* '''ἵνα''': "so that," commonly used with the subjunctive to express purpose or intended result.
===Other Relations===
* '''ὅθεν''': "from where," "whence."
* '''ὡς''': "as," "like," "because," "while," or other meanings depending on context.
==Elision==
The final vowel of a conjunction is sometimes elided before a word beginning with a vowel. This process is called '''elision'''.
Compare the following examples:
* εἴτε τὰ χρήματα οὐ δίδομεν, εἴτε τὰ ὑπάρχοντα οὐ δίδοτε.
* εἴτ’ οὐ δίδομεν τὰ χρήματα, εἴτ’ οὐ δίδοτε τὰ ὑπάρχοντα.
"Either we do not give the money, or you do not give the property."
* οὐκ ἀποδίδοτε, ἄρα χρήματα οὐ δίδομεν.
* οὐκ ἀποδίδοτε, ἄρ’ οὐ δίδομεν χρήματα.
"You do not give it back; therefore, we do not give money."
* ὅτε χρήματα ἀποδίδοτε, ὑπάρχοντα δίδομεν.
* ὅτ’ ἀποδίδοτε χρήματα, ὑπάρχοντα δίδομεν.
"When you give money back, we give property."
Note that '''ὅτι''' does not elide. Therefore, '''ὅτ’''' in the final example is an elided form of '''ὅτε''' ("when"), not ὅτι ("because" or "that").
==Subordinate Clauses==
We have discussed the uses of the subjunctive and optative in '''main clauses''', where they often express independent wishes or intents, for example:
*ὁ δὲ θεὸς τῆς ἐλπίδος πληρώσαι ὑμᾶς πάσης χαρᾶς... — Now may the God of hope fill you with all joy... ([[s:el:Προς Ρωμαίους#15:13|Romans 15:13]])
*μηκέτι εἰς τὸν αἰῶνα ἐκ σοῦ μηδεῖς καρπὸν φάγοι. — May no one ever eat fruit from you again to eternity! ([[s:el:Κατά Μάρκον#11:14|Mark 11:14]])
Now let’s consider how these moods are used in '''subordinate''' clauses. In purpose and fear clauses, the tense of the main verb determines the mood—subjunctive or optative—of the subordinate verb. This pattern is called the '''sequence of moods''':
# '''Primary Sequence''': If the main verb is a primary tense (present, future, perfect) or refers to a future action (imperative, subjunctive, optative), the subordinate verb is '''subjunctive'''.
# '''Secondary Sequence''': If the main verb is a secondary tense (imperfect, aorist, pluperfect), the subordinate verb is '''optative''' (or subjunctive to express vividness).
#*ἐπηρώτων δὲ αὐτὸν οἱ μαθηταὶ αὐτοῦ τίς αὕτη εἴη ἡ παραβολή. — And his disciples were asking him what this parable might be. [Secondary sequence optative in an oblique indirect question] ([[s:el:Κατά Λουκάν#8:9|Luke 8:9]])
===Purpose Clause===
A purpose clause indicates the goal of the main action. It is introduced by:
* ἵνα, ὡς, ὅπως: so that, in order that
* ἵνα μή, ὡς μή, ὅπως μή, or μή (alone): so that…not, in order that…not, lest
The choice of mood follows the sequence of moods. Tenses denote aspect, not time.
*ταῦτα δὲ λέγω ἵνα ὑμεῖς σωθῆτε. — But I say these things so that you may be saved. [Primary sequence] ([[s:el:Κατά Ιωάννην#5:34|John 5:34]])
*ἦλθεν εἰς μαρτυρίαν, ἵνα μαρτυρήσῃ περὶ τοῦ φωτός... — He came for a witness, in order that he might testify concerning the light... [Secondary sequence using subjunctive for vividness] ([[s:el:Κατά Ιωάννην#1:7|John 1:7]])
*...καὶ μὴ εἰσενέγκῃς ἡμᾶς εἰς πειρασμόν... — ...and do not lead us into temptation, lest [you deliver us over to the evil one]. [Negative purpose with μή alone] ([[s:el:Κατά Ματθαίον#6:13|Matthew 6:13]])
===Fear Clause===
A fear clause acts as the object of a verb of fearing. It is introduced by:
* μή: that, lest (fear that something will happen)
* μὴ οὐ: that…not, lest…not (fear that something will not happen)
If the fear concerns a '''present''' or '''past''' reality, the subordinate verb is '''indicative''':
*φοβοῦμαι ὑμᾶς μή πως εἰκῇ κεκοπίακα εἰς ὑμᾶς. — I am afraid for you, lest somehow I have labored in vain for you. ([[s:el:Προς Γαλάτας#4:11|Galatians 4:11]])
If the fear concerns a '''future''' outcome, the clause follows the '''sequence of moods''':
*...φοβηθεὶς δὲ ὁ χιλίαρχος μὴ διασπασθῇ ὁ Παῦλος ὑπ’ αὐτῶν... — ...and the commander, fearing lest Paul would be torn to pieces by them... [Secondary sequence using subjunctive for vividness] ([[s:el:Πράξεις των Αποστόλων#23:10|Acts 23:10]])
sr9obv55qiv42d1ile3iph5s7nyos3h
Koine Greek/Conditional Clauses
0
486384
4676574
4676432
2026-10-17T19:43:23Z
It-is-Truly-Meet
3624460
4676574
wikitext
text/x-wiki
The negative particle in a conditional clause is usually μή, making the conjunctions εἰ μή or ἐὰν μή "unless", "if not". However, some conditions have οὐ. The apodosis usually has οὐ.
A conditional clause preceded by εἴθε or εἰ γάρ "if only" is also occasionally used in Greek for making a wish. The conjunction εἰ also frequently introduces an indirect question.
==Classification of conditional clauses==
Conditional clauses fall into several types, summarized below.
A present general condition and a vivid future condition both use ἐάν with the subjunctive; a past general condition and a less vivid future condition both use εἰ with the optative. In each pair, the apodosis distinguishes the meaning.
Hypothetical conditions ("if I were to die", "if I was dead", "if I had died") usually have ἄν in the apodosis. It may be omitted with an imperfect expressing necessity or possibility, such as ἔδει ("it was necessary") or ἐξῆν ("it was possible").
{| class="wikitable"
! Type
! Example
! Protasis
! Apodosis
|-
| colspan="4"|'''Primary tenses'''
|-
| Simple (open)
| ''If it is true''
| εἰ + present or perfect indicative
| indicative or imperative
|-
| Emotional future
| ''If it happens (in future)''
| εἰ + future indicative
| future indicative
|-
| Vivid future
| ''If it happens (in future)''
| ἐάν + subjunctive
| future indicative
|-
| General present
| ''If ever it happens''
| ἐάν + subjunctive
| present indicative
|-
| colspan="4"|'''Historic tenses'''
|-
| Simple (open)
| ''If it was true''
| εἰ + imperfect or aorist indicative
| indicative
|-
| General past
| ''If ever it used to happen''
| εἰ + optative
| imperfect indicative
|-
| Less vivid future
| ''If it were to happen''
| εἰ + optative
| optative + ἄν
|-
| Unreal present
| ''If it were true''
| εἰ + imperfect indicative
| imperfect indicative + ἄν
|-
| Unreal past
| ''If it had happened''
| εἰ + aorist indicative
| aorist indicative + ἄν
|}
==Simple (open) conditions==
A simple condition uses the indicative in the protasis. The apodosis can have an imperative:
:εἴ τις '''ἔρχεται''' πρὸς ὑμᾶς καὶ ταύτην τὴν διδαχὴν '''οὐ φέρει''', '''μὴ λαμβάνετε''' αὐτὸν εἰς οἰκίαν καὶ χαίρειν αὐτῷ '''μὴ λέγετε'''. (2 John 1:10)
:"if anyone '''comes''' to you and '''does not bring''' this teaching, '''do not receive''' him into your house, and '''do not greet''' him."
:Εἰ οὖν '''συνηγέρθητε''' τῷ Χριστῷ, τὰ ἄνω '''ζητεῖτε'''. (Colossians 3:1)
:"if you '''have been raised''' with Christ, '''seek''' the things above."
:εἰ δὲ πνεύματι '''ἄγεσθε''', '''οὐκ ἐστὲ''' ὑπὸ νόμον. (Galatians 5:18)
:"if you '''are led''' by the Spirit, you '''are not''' under the law."
A simple conditional may use any tense of the indicative. The following has the perfect indicative:
:εἰ δὲ Χριστὸς οὐκ '''ἐγήγερται''', κενὸν ἄρα τὸ κήρυγμα ἡμῶν, κενὴ καὶ ἡ πίστις ὑμῶν. (1 Corinthians 15:14)
:"if Christ '''has not been raised''', then our preaching is in vain, and your faith is in vain."
The following uses the imperfect indicative in both clauses:
:εἰ ἐν ἐκείνῃ τῇ νυκτὶ ἐγὼ '''ἐπεβούλευον''' Ἐρατοσθένει, πότερον '''ἦν''' μοι κρεῖττον αὐτῷ ἑτέρωθι δειπνεῖν ἢ τὸν συνδειπνήσοντά μοι εἰσαγαγεῖν; (Lysias 1:40)
:"if on that night '''I was plotting''' against Eratosthenes, '''was it''' better for me to dine elsewhere or to bring that guest to my house?"
The following uses the aorist indicative followed by an aorist imperative:
:{{lang|grc|εἰ '''ἤκουσάς''' τι τούτου τοῦ πράγματος τοῦ γενομένου, '''εἰπέ'''.}} (Andocides 1:50)
:"if '''you heard''' anything about this matter which has happened, '''tell''' us."
The following, from Euripides' play ''Electra'', has two aorist indicative tenses:
:εἰ δʼ, ὡς λέγεις, σὴν θυγατέρʼ '''ἔκτεινεν''' πατήρ,<br />ἐγὼ τί σʼ '''ἠδίκησʼ''' ἐμός τε σύγγονος; (Euripides, Electra 1086–1087)
:"even if, as you say, our father '''killed''' your daughter,<br />how '''did I''' or my brother '''wrong''' you?"
==Future conditions==
==="Emotional" future conditions===
An open conditional may use the future indicative in its protasis to express strong feeling. The apodosis often conveys a threat, warning, or earnest appeal; this is called the “emotional future” conditional.
In the following, a present tense apodosis is combined with a future protasis:
:οὐκ '''ἔστι''' παρελθεῖν, εἰ μὴ τούτους '''ἀποκόψομεν'''. (Xenophon, Anabasis 3.4.39)
:"'''it's''' impossible to go past, unless '''we first cut down''' these men."
:τῇ γὰρ στρατιᾷ οὐκ '''ἔστι''' τὰ ἐπιτήδεια, εἰ μὴ '''ληψόμεθα''' τὸ χωρίον. (Xenophon, Anabasis 4.7.3)
:"'''there is''' no food for the army, unless '''we capture''' the fort."
In the following poetic example, the protasis has a future indicative as before, but in the apodosis instead of a future, there is an aorist indicative:
:{{lang |grc|'''ἀπωλόμην''' ἄρ᾽, εἴ με δὴ '''λείψεις''', γύναι.}} (Euripides, Alcestis 386)
:"'''I am undone''' if '''you leave''' me, wife!"
===Vivid future conditions===
A future conditional usually uses ἐάν (also ἤν or ἄν) with the subjunctive. The α in ἐάν is long (LSJ, s.v. ἐάν; Smyth §34).
This common construction is called the vivid future conditional. The protasis has the present subjunctive and the apodosis the future indicative (Smyth §§2297, 2321–2322).
:Ἐὰν '''ἀγαπᾶτέ''' με, τὰς ἐντολὰς τὰς ἐμὰς '''τηρήσετε'''. (John 14:15)
: "if you '''love''' me, you '''will keep''' my commandments."
:καὶ ἐὰν ἐκεῖ '''ᾖ''' υἱὸς εἰρήνης, '''ἐπαναπαήσεται''' ἐπʼ αὐτὸν ἡ εἰρήνη ὑμῶν. (Luke 10:6)
: "and if a '''son of peace is''' there, your peace '''will rest''' upon him."
:ἐάν τις '''θέλῃ''' τὸ θέλημα αὐτοῦ ποιεῖν, '''γνώσεται''' περὶ τῆς διδαχῆς πότερον ἐκ τοῦ θεοῦ ἐστιν ἢ ἐγὼ ἀπʼ ἐμαυτοῦ λαλῶ. (John 7:17)
:"if anyone '''wishes''' to do his will, he '''will know''' concerning the teaching whether it is from God or I speak from myself."
:ἐάν τις '''ἀγαπᾷ''' με, τὸν λόγον μου '''τηρήσει'''. (John 14:23)
:"if anyone '''loves''' me, he '''will keep''' my word.
The apodosis can contain a present tense, if the verb is δεῖ "it is necessary":
:τὸ γὰρ αὔτʼ, ἐὰν '''ἡττᾶσθε''', καὶ σφὼ '''δεῖ παθεῖν'''. (Aristophanes, Plut. 467)
:"you two '''must suffer''' the same penalty too, if '''you are defeated'''"
The negative used in a conditional clause is usually μή:
:ἐὰν δὲ '''μὴ ἀφῆτε''' τοῖς ἀνθρώποις, οὐδὲ ὁ πατὴρ ὑμῶν '''ἀφήσει''' τὰ παραπτώματα ὑμῶν. (Matthew 6:15)
: "but if you '''do not forgive''' people, neither will your Father '''forgive''' your trespasses."
:ἐὰν γὰρ '''μὴ πιστεύσητε''' ὅτι ἐγώ εἰμι, '''ἀποθανεῖσθε''' ἐν ταῖς ἁμαρτίαις ὑμῶν. (John 8:24)
:"for if you '''do not believe''' that I am he, you '''will die''' in your sins."
Sometimes οὐ is used instead of μή, as when οὔ φημι means “deny” (Smyth §§2696, 2698).
:ἐάντε σὺ καὶ Ἄνυτος '''οὐ φῆτε''' ἐάντε φῆτε (Plato, Apology 25b)
:"whether you and Anytos '''deny it''' or agree with it"
The following example uses the aorist subjunctive in the protasis:
:κἀγὼ ἐὰν '''ὑψωθῶ''' ἐκ τῆς γῆς, πάντας '''ἑλκύσω''' πρὸς ἐμαυτόν. (John 12:32)
:"and I, if I am '''lifted up''' from the earth, '''will draw''' all people to myself."
===Less vivid future conditions===
The less vivid (or ideal) future conditional describes a hypothetical future, often one the speaker does not expect to happen. Both clauses use the optative; the apodosis has the [[Koine Greek/Overview of Particles|particle]] ἄν before or after the verb (Smyth §2329).
The tense of the verb can be aorist (if it is an event) or present (if it describes a situation). The following three examples use the aorist optative:
:καὶ ὁ Παρθένιος ἄβατος· ἐφʼ ὃν '''ἔλθοιτε ἄν''', εἰ τὸν Ἅλυν '''διαβαίητε'''. (Xenophon, Anabasis 5.6.10)
:"the Parthenios river also cannot be crossed, to which '''you would come''' if '''you crossed''' the Halys."
:οὐδέν γε ἄτοπον εἰ '''ἀποθάνοιμι'''. (Plato, Gorgias 521d)
:"there would be nothing strange about it if '''I were to die'''."
:εἰ δή τις με '''ἔροιτο''' ὑμῶν ... '''εἴποιμʼ ἄν''' ... (Aeschines, 1.80)
:"if one of '''you were to ask''' me ... '''I would say''' ..."
The following have present optative in the protasis, aorist optative in the apodosis:
:εἰ γὰρ '''εἰδείης''' ὅσον ἀργύριον εἴργασμαι ἐγώ, '''θαυμάσαις ἄν'''. (Plato, Hipp. Mai. 282d)
:"if '''you knew''' how much money I have earned, '''you would be amazed'''."
:ἡδέως '''ἂν λάβοιμι''', εἰ '''διδοίη'''. (Xenophon, Cyropaedia 3.2.28)
:"'''I would''' gladly '''accept''' it, if '''he were offering''' it."
The following uses the present optative in the apodosis:
:οὐκ '''ἂν θαυμάζοιμι'''. (Plato, Cratylus 428b)
:"'''I would'''n't '''be surprised''' (if that were so)."
In post-classical Greek, the optative mood gradually fell out of use. In the New Testament the potential optative with ἄν occurs, but rarely (e.g. ''Acts'' 8:31); εἰ with the optative also sometimes occurs (e.g. 2 Peter 3:14).
==General conditions==
===Present general conditions===
A present general condition uses the same grammatical construction (ἐάν with the subjunctive) as a vivid future condition, but is much less common. The present subjunctive is used when the actions of the two clauses are contemporaneous:
:ἐὰν '''ὁμολογῶμεν''' τὰς ἁμαρτίας ἡμῶν, '''πιστός ἐστιν''' καὶ δίκαιος ἵνα ἀφῇ ἡμῖν τὰς ἁμαρτίας καὶ καθαρίσῃ ἡμᾶς ἀπὸ πάσης ἀδικίας. (1 John 1:9)
:"if we '''confess''' our sins, he '''is faithful''' and righteous to forgive us our sins and to cleanse us from all unrighteousness."
The aorist subjunctive indicates that this action precedes the main action (Smyth §2623, note 2).
:καὶ ἐὰν τις '''ἁμάρτῃ''', '''παράκλητον ἔχομεν''' πρὸς τὸν πατέρα, Ἰησοῦν Χριστὸν δίκαιον. (1 John 2:1)
:"and if anyone '''sins''', we '''have an advocate''' with the Father, Jesus Christ the righteous."
The perfect subjunctive describes a present state resulting from an earlier action:
:ἐάν τε '''ἑαλωκὼς ᾖ''' ἐάν τε μή, δηλούτω. (Xenophon, Cynegeticus 6.18)
:"whether (the hare) '''has been caught''' or not, (the huntsman) should make it clear (to his colleagues)."
An aorist in the apodosis can sometimes express a general truth in the present; this is called a gnomic aorist (Smyth §§1931, 2338).
:ἢν δέ τις τούτων τι παραβαίνῃ, ζημίαν αὐτοῖς '''ἐπέθεσαν'''. (Xenophon, Cyr. 1.2.2)
:"if a man transgress anyone one of these laws, '''they always impose''' a penalty on him."
===Past general conditions===
The optative after εἰ can express a past general condition (“if ever it used to happen”; Smyth §2340). In the following examples, the protasis has the present optative and the apodosis the imperfect indicative:
: εἴ πού τι '''ὁρῴη''' βρωτόν, '''διεδίδου'''. (Xenophon, Anabasis 4.5.8)
: "If ever '''he saw''' something edible anywhere, '''he would pass''' it round."
:καὶ πάνυ ἄκρατος '''ἦν''', εἰ μή τις ὕδωρ '''ἐπιχέοι'''. (Xenophon, Anabasis 4.5.27)
:"and (the barley-wine) '''was''' completely undiluted, unless someone '''added''' water."
In the following, however, the aorist optative is used in the protasis, to indicate that the action of sharing had to come before that of being allowed near the fire:
: οὐ '''προσίεσαν''' πρὸς τὸ πῦρ τοὺς ὀψίζοντας, εἰ μὴ '''μεταδοῖεν''' αὐτοῖς πῡρούς. (Xenophon, Anabasis 4.5.5)
: "they '''wouldn't let''' the late-comers come near the fire, unless '''they first shared''' some wheat with them."
Here the protasis is shortened to εἰ δὲ μή (“otherwise”), meaning “but if they did not hold their weapons above the water” (cf. Smyth §2346).
:καὶ οὔτʼ ἐν τῷ ὕδατι τὰ ὅπλα ἦν ἔχειν· '''εἰ δὲ μή''', '''ἥρπαζεν''' ὁ ποταμός. (Xenophon, Anabasis 3.4.36)
:"and it was not possible to hold their weapons in the water, '''otherwise''' the river '''kept snatching''' them away."
In a past general condition, ἄν may accompany an imperfect or aorist indicative to express repeated past action. This is called the iterative imperfect or aorist (Smyth §2341). The following example uses the imperfect indicative with ἄν:
:εἰ δέ τις αὐτῷ περί του '''ἀντιλέγοι''' ... ἐπὶ τὴν ὑπόθεσιν '''ἐπανῆγεν ἂν''' πάντα τὸν λόγον. (Xenophon, Memorabilia 4.6.13)
:"if ever anyone '''opposed''' him on anything ... '''he would bring''' the whole subject '''back''' to the beginning"
The following uses the aorist indicative with ἄν:
:καὶ εἴ τις αὐτῷ '''δοκοίη''' ... βλακεύειν, ἐκλεγόμενος τὸν ἐπιτήδειον '''ἔπαισεν ἄν'''. (Xenophon, Anabasis 2.3.11)
:'if ever anyone '''seemed''' to him to be lagging behind, he would pick out the culprit and '''would beat''' him.'
==Unreal conditions==
===Present unreal conditions===
A present unreal ([[#Unreal conditions|counterfactual]]) condition uses εἰ with the imperfect indicative in the protasis and the imperfect indicative plus ἄν in the apodosis (Smyth §2309).
:εἰ ἐκ τοῦ κόσμου '''ἦτε''', ὁ κόσμος ἂν τὸ ἴδιον '''ἐφίλει'''. (John 15:19)
:"if you '''were''' of the world, the world '''would love''' its own."
:εἰ δὲ ἑαυτοὺς '''διεκρίνομεν''', οὐκ ἂν '''ἐκρινόμεθα'''. (1 Corinthians 11:31)
:"but if we '''judged''' ourselves, we '''would not be judged'''."
===Past unreal conditions===
A past unreal condition uses the aorist indicative in both clauses, with ἄν in the apodosis to express “would” (Smyth §2309).
:εἰ μὴ κύριος σαβαὼθ '''ἐγκατέλιπεν''' ἡμῖν σπέρμα, ὡς Σόδομα ἂν '''ἐγενήθημεν'''. (Romans 9:29)
:"if the Lord of Sabaoth had not '''left''' us offspring, we '''would have become''' like Sodom."
The following example has an apodosis only with no protasis. The tense is aorist indicative:
:τίς γὰρ '''ἂν ᾠήθη''' ταῦτα γενέσθαι; (Demosthenes 9.68)
:"for who '''would have expected''' these things to happen?"
In an unreal condition, an imperfect can refer to the past as well as the present. Here ἦς is imperfect indicative and ἀπέθανεν is aorist indicative (Smyth §§2309–2310):
:εἰ '''ἦς''' ὧδε, οὐκ ἂν '''ἀπέθανεν''' ὁ ἀδελφός μου. (John 11:21)
:"Lord, if you '''had been''' here, my brother '''would not have died'''."
In the following, the first imperfect refers to the past, the second to the present time:
:εἰ μὴ τότʼ '''ἐπόνουν''', νῦν '''ἂν''' οὐκ '''εὐφραινόμην'''. (Philemon 153)
:"if '''I had''' not '''been toiling''' then, '''I would''' not now '''be rejoicing'''."
The particle ἄν is sometimes omitted from unreal conditions, especially with imperfect verbs expressing obligation or possibility, such as ἐξῆν (“it was possible”; Smyth §2313).
:ἐμὲ δʼ '''ἐξῆν''' αὐτῷ, εἰ '''ἐσωφρόνει''', μὴ συκοφαντεῖν. (Aeschines, 1.3)
:"'''it would have been possible''' for him, if '''he had been wise''', not to accuse me falsely."
When the emphasis is on possibility or necessity rather than the dependent [[Koine Greek/Infinitives|infinitive]], ἄν may be added (Smyth §2319). Here ἐξεγένετο is the aorist counterpart of the imperfect ἐξῆν:
:περὶ ἐμοῦ μὲν γὰρ εἰ '''ἔλεγον''' ἃ οὗτος ἐβούλετο, οὐδʼ '''ἂν''' ἀπολογήσασθαί μοι '''ἐξεγένετο'''. (Lysias, 7.37)
:"if (the tortured slaves) '''were to say''' about me what he wanted them to say, '''it would'''n't '''have been possible''' for me to defend myself."
Other expressions can also omit ἄν (Smyth §2320):
:τούτῳ δʼ εἰ μὴ ὡμολόγουν, οὐδεμιᾷ ζημίᾳ '''ἔνοχος ἦν'''. (Lysias, 7.37)
:"if (the tortured slaves) did not agree with him, '''he would'''n't''' have been liable''' to any penalty."
==If by chance==
A vivid future conditional with ἐάν and the subjunctive can mean “in the hope that,” “in case,” or “to see whether” (Smyth §2354).
:ἄκουσον καὶ ἐμοῦ, ἐάν σοι ἔτι ταὐτὰ '''δοκῇ'''. (Plato, Rep. 358b)
:"listen to me too, in case the same things '''may''' still '''seem''' true to you."
In a historic context, this type of clause becomes a less vivid future, using εἰ or εἰ πως "if by chance" with the optative mood. In the first example below, πείσειαν "they might persuade" is aorist optative:
:πορευόμενοι ἐς τὴν Ἀσίαν ὡς βασιλέα, εἴ πως '''πείσειαν''' αὐτὸν χρήματά τε παρασχεῖν καὶ ξυμπολεμεῖν. (Thucydides, 2.67)
:"proceeding to Asia to the King, in the hope that '''they might persuade''' him to provide money and join the war."
: ἔσπευδεν γὰρ εἰ δυνατὸν '''εἴη''' αὐτῷ τὴν ἡμέραν τῆς πεντηκοστῆς γενέσθαι εἰς Ἱεροσόλυμα. (Acts 20:16)
: "for he was hurrying, in case '''it might be''' possible for him to reach Jerusalem by the day of Pentecost."
:ζητεῖν τὸν θεὸν, εἰ ἄρα γε '''ψηλαφήσειαν''' αὐτὸν καὶ '''εὕροιεν''', καί γε οὐ μακρὰν ἀπὸ ἑνὸς ἑκάστου ἡμῶν ὑπάρχοντα. (Acts 17:27)
:"to seek God, if perhaps they might '''feel for''' him and '''find''' him, though he is not far from each one of us."
==Wishes==
Wishes in Greek use tenses from the historic sequence: optative, imperfect indicative, and aorist indicative, depending on whether they refer to the future, present or past.
===Wishes for the future===
The optative alone can express a wish for the future (Smyth §1814):
:μὴ '''γένοιτο'''. (Romans 6:2)
: "'''May it never be'''!"
A wish may be introduced by εἴθε or εἰ γάρ (“if only”), using the same construction as a less vivid future condition (Smyth §1815):
: εἰ γὰρ '''γένοιτο'''. (Xenophon, Cyrop. 6.1.38)
: "if only '''it might happen'''!"
===Wishes for the present and past===
An unattainable wish about the present or past uses εἴθε or εἰ γάρ with the imperfect or aorist indicative, as in unreal conditions (Smyth §1780). The imperfect refers to the present:
: εἴθʼ '''εἶχες''', ὦ τεκοῦσα, βελτίους φρένας. (Euripides, Electra 1060)
: "if only, mother, '''you had''' a better heart!"
The aorist indicative is used for an unattainable wish referring to past time:
: εἴθε σοι, ὦ Περίκλεις, τότε '''συνεγενόμην'''. (Xenophon, Memorabilia 1.2.46)
: "if only '''I had been with''' you then, Pericles!"
The aorist of ὀφείλω (“I owe”) can also express a wish (LSJ, s.v. ὀφείλω).
:τὸ τριώβολον δῆτʼ ἔλαβες; – εἰ γὰρ '''ὤφελον'''. (Aristophanes, Eccl. 380)
:"did you get the three-obol fee?" – "'''I wish''' I had!"
Hence in the well-known opening of Euripides' play ''Medea'':
:εἴθʼ '''ὤφελʼ''' Ἀργοῦς '''μὴ διαπτάσθαι''' σκάφος<br />Κόλχων ἐς αἶαν κυανέας Συμπληγάδας. (Euripides, Medea 1–2)
:"if only the ship {{w|Argo}} '''had not flown through'''<br />the dark blue [[w:Symplegades|Clashing Rocks]] to the land of the [[w:Colchis|Colchians]]!"
==Conditional relative clauses==
In Ancient Greek, a [[Koine Greek/8. Pronouns#The Relative Pronoun|relative clause]] can replace the protasis of a conditional (“whoever saw it would be amazed” = “if anyone saw it, they would be amazed”). These conditional relative clauses follow the same rules as ordinary conditionals and are always indefinite (Smyth §§2560–2565):
:Πᾶς οὖν '''ὅστις''' '''ὁμολογήσει''' ἐν ἐμοὶ ἔμπροσθεν τῶν ἀνθρώπων, ὁμολογήσω κἀγὼ ἐν αὐτῷ ἔμπροσθεν τοῦ πατρός μου τοῦ ἐν οὐρανοῖς. (Matthew 10:32)
:"everyone, then, who '''confesses''' me before people, I too will confess him before my Father in heaven."
:οἱ παῖδες ὑμῶν, '''ὅσοι''' ἐνθάδε ἦσαν, ὑπὸ τούτων ἂν ὑβρίζοντο. (Lysias, 12.98)
:"your children, '''as many as''' were here (i.e. if any had been here), would have been abused by these men."
==Conditional clauses in indirect speech==
===Indirect statements===
In indirect statements, main verbs usually become infinitives unless the statement is introduced by ὅτι or ὡς. In a past context, verbs may instead become optatives; some may become participles, and present indicatives may become imperfects (Smyth §§2576, 2613, 2624).
In a past context, ἐάν + subjunctive may change to εἰ + optative in indirect conditionals. An imperfect or aorist indicative in an unreal protasis does not change to the optative. In an ideal or unreal apodosis, ἄν remains when the verb becomes an infinitive or participle (Smyth §§2615, 2619).
The following table shows how the tenses of an original statement are changed to different tenses of the infinitive, participle, and optative when the speech is made indirect:
:{| class="wikitable"
! Original speech
! Infinitive
! Participle
! Optative
! Past
|-
| Present or imperfect
| Present
| Present
| Present
| Imperfect
|-
| Future indicative
| Future
| Future
| Future
|
|-
| Aorist indicative
| Aorist
| Aorist
| Aorist
|
|-
| Perfect or pluperfect
| Perfect
| Perfect
| Perfect
| Pluperfect
|}
====Indirect statements with the infinitive====
In the four examples of indirect statement below, all the main verbs of the original speech have been changed to an infinitive.
The first example is an indirect present open conditional. The infinitive ἐλευθεροῦν represents the original present indicative ἐλευθεροῖς (“you are freeing”), while the protasis verb (“you are killing”) becomes imperfect indicative (Smyth §2634):
:ἔλεγον οὐ καλῶς τὴν Ἑλλάδα '''ἐλευθεροῦν''' αὐτόν, εἰ ἄνδρας '''διέφθειρεν'''. (Thucydides, 3.32)
:"they said that '''he was''' not '''freeing''' Greece in a good way, if '''he was killing''' men."
This indirect emotional future conditional changes the main verbs (“there is” and “it will be”) to present and future infinitives. The future indicative in the protasis becomes future optative (Smyth §2621):
:ἔφη '''εἶναι''' ἄκρον ὃ εἰ μή τις '''προκαταλήψοιτο''', ἀδύνατον '''ἔσεσθαι''' παρελθεῖν. (Xenophon, Anabasis 4.1.25)
:"he said that '''there was''' a hill-top which, unless someone '''captured it first''', '''it was going to be''' impossible to get past."
This unreal past conditional uses a present participle in a [[Koine Greek/The Genitive Absolute|genitive absolute]] where the original protasis would have had an imperfect indicative. The main verb becomes an aorist infinitive, and ἄν remains after the participle (LSJ, s.v. ἄν, II.D.2):
:'''λέγοντος ἄν''' τινος '''πιστεῦσαι''' οἴεσθε; (Demosthenes, 6.20)
:"do you think that, if someone '''had told''' them, '''they would have believed''' it?" (εἴ τις ἔλεγεν, ἐπίστευσαν ἄν;)
This vivid future conditional in a past context changes the main verb (“I will not stop”) to a future infinitive. ἐάν and πρὶν ἄν with the aorist subjunctive become εἰ and πρίν with the aorist optative; the relative-clause verb στρατεύομαι (“I am campaigning”) becomes imperfect indicative (Smyth §2634):
:ὑποσχόμενος αὐτοῖς, εἰ καλῶς '''καταπράξειεν''' ἐφʼ ἃ '''ἐστρατεύετο''', μὴ πρόσθεν '''παύσεσθαι''' πρὶν αὐτοὺς '''καταγάγοι''' οἴκαδε. (Xenophon, Anabasis 1.2.2)
:"promising them that if '''he accomplished''' what '''he was campaigning''' for, '''he would''' not '''stop''' until '''he brought them back''' home." (εἰ καλῶς καταπράξομαι ἐφʼ ἅ στρατεὐομαι, οὐ πρόσθεν παύσομαι πρὶν ἂν ὑμᾶς καταγάγω οἴκαδε.)
====Indirect statements with ὅτι====
Indirect statements can also use ὅτι (“that”). In a past context, the verbs may change to the optative (Smyth §2619).
In the following example, the main verb ἐπιθήσοιεν has been changed to the future optative, but the future indicative in the protasis has not been changed to the optative:
:ἠπείλουν αὐτῷ ὅτι εἰ '''λήψονται''' ἀποδιδράσκοντα, τὴν δίκην '''ἐπιθήσοιεν'''. (Xenophon, Anabasis 5.6.34)
:"they threatened him that if they caught (lit. will catch) him running away, they would punish him."
In unreal conditional clauses, the indicative remains unchanged (Smyth §§2615, 2623):
:ἀπελογοῦντο ὡς οὐκ '''ἄν''' ποτε οὕτω μῶροι '''ἦσαν''' εἰ '''εἴδεσαν'''. (Xenophon, Hell. 5.4.22)
:"they pleaded that they '''would''' never '''have been''' so foolish if '''they had known'''."
===Indirect questions===
An indirect question may use εἰ (“if”) even when the original question was not conditional (Smyth §2671). In a past context, the main verb may change to the optative: βούλει (“are you willing?”) becomes βούλοιτο. The aorist participle λαβών (“having received”) may imply a vivid or less vivid future condition (cf. Smyth §2359):
:ἐγὼ δὲ Πείσωνα μὲν ἠρώτων εἰ '''βούλοιτό''' με σῶσαι χρήματα '''λαβών'''. (Lysias, 12.9)
:"I asked Pison if '''he was willing''' to save me '''if he received''' some money."
The optative remains unchanged in indirect speech (Smyth §2620). The ἄν in the following sentence indicates that the original question used the potential optative (“would you give?”):
:ἠρώτων ἐκεῖνοι εἰ '''δοῖεν ἂν''' τούτων τὰ πιστά. (Xenophon, Anabasis 4.8.7)
:"they asked if (the Greeks) '''would give''' pledges concerning these matters."
===Indirect commands===
In indirect commands, the verb generally becomes an infinitive (Smyth §2633):
:εἰ οὖν τι βούλονται σαφὲς λέγειν, '''πέμψαι''' ἄνδρας ὡς αὐτόν. (Thucydides, 4.50)
:"(the letter said that) if therefore they wished to say something clearly, they should send some men to him."
Although the context is past, βούλονται (“they wish”) remains indicative rather than changing to the optative. Retaining the vivid mood is characteristic of Thucydides (Smyth §2613).
:{{BookCat}}
njaw8pihrywqdx1vxbdj40j71jfhqil
4676581
4676574
2026-10-18T01:34:27Z
It-is-Truly-Meet
3624460
Brief definitions were readded.
4676581
wikitext
text/x-wiki
'''Conditional clauses''' in Koine Greek are clauses which start with εἰ "if" or ἐάν "if (it may be)". ἐάν can be contracted to ἤν or ἄν, with a long vowel. The "if"-clause of a conditional sentence is called the '''protasis''', and the consequent or main clause is called the '''apodosis'''.
The negative particle in a conditional clause is usually μή, making the conjunctions εἰ μή or ἐὰν μή "unless", "if not". However, some conditions have οὐ. The apodosis usually has οὐ.
A conditional clause preceded by εἴθε or εἰ γάρ "if only" is also occasionally used in Greek for making a wish. The conjunction εἰ also frequently introduces an indirect question.
==Classification of conditional clauses==
Conditional clauses fall into several types, summarized below.
A present general condition and a vivid future condition both use ἐάν with the subjunctive; a past general condition and a less vivid future condition both use εἰ with the optative. In each pair, the apodosis distinguishes the meaning.
Hypothetical conditions ("if I were to die", "if I was dead", "if I had died") usually have ἄν in the apodosis. It may be omitted with an imperfect expressing necessity or possibility, such as ἔδει ("it was necessary") or ἐξῆν ("it was possible").
{| class="wikitable"
! Type
! Example
! Protasis
! Apodosis
|-
| colspan="4"|'''Primary tenses'''
|-
| Simple (open)
| ''If it is true''
| εἰ + present or perfect indicative
| indicative or imperative
|-
| Emotional future
| ''If it happens (in future)''
| εἰ + future indicative
| future indicative
|-
| Vivid future
| ''If it happens (in future)''
| ἐάν + subjunctive
| future indicative
|-
| General present
| ''If ever it happens''
| ἐάν + subjunctive
| present indicative
|-
| colspan="4"|'''Historic tenses'''
|-
| Simple (open)
| ''If it was true''
| εἰ + imperfect or aorist indicative
| indicative
|-
| General past
| ''If ever it used to happen''
| εἰ + optative
| imperfect indicative
|-
| Less vivid future
| ''If it were to happen''
| εἰ + optative
| optative + ἄν
|-
| Unreal present
| ''If it were true''
| εἰ + imperfect indicative
| imperfect indicative + ἄν
|-
| Unreal past
| ''If it had happened''
| εἰ + aorist indicative
| aorist indicative + ἄν
|}
==Simple (open) conditions==
A simple condition uses the indicative in the protasis. The apodosis can have an imperative:
:εἴ τις '''ἔρχεται''' πρὸς ὑμᾶς καὶ ταύτην τὴν διδαχὴν '''οὐ φέρει''', '''μὴ λαμβάνετε''' αὐτὸν εἰς οἰκίαν καὶ χαίρειν αὐτῷ '''μὴ λέγετε'''. (2 John 1:10)
:"if anyone '''comes''' to you and '''does not bring''' this teaching, '''do not receive''' him into your house, and '''do not greet''' him."
:Εἰ οὖν '''συνηγέρθητε''' τῷ Χριστῷ, τὰ ἄνω '''ζητεῖτε'''. (Colossians 3:1)
:"if you '''have been raised''' with Christ, '''seek''' the things above."
:εἰ δὲ πνεύματι '''ἄγεσθε''', '''οὐκ ἐστὲ''' ὑπὸ νόμον. (Galatians 5:18)
:"if you '''are led''' by the Spirit, you '''are not''' under the law."
A simple conditional may use any tense of the indicative. The following has the perfect indicative:
:εἰ δὲ Χριστὸς οὐκ '''ἐγήγερται''', κενὸν ἄρα τὸ κήρυγμα ἡμῶν, κενὴ καὶ ἡ πίστις ὑμῶν. (1 Corinthians 15:14)
:"if Christ '''has not been raised''', then our preaching is in vain, and your faith is in vain."
The following uses the imperfect indicative in both clauses:
:εἰ ἐν ἐκείνῃ τῇ νυκτὶ ἐγὼ '''ἐπεβούλευον''' Ἐρατοσθένει, πότερον '''ἦν''' μοι κρεῖττον αὐτῷ ἑτέρωθι δειπνεῖν ἢ τὸν συνδειπνήσοντά μοι εἰσαγαγεῖν; (Lysias 1:40)
:"if on that night '''I was plotting''' against Eratosthenes, '''was it''' better for me to dine elsewhere or to bring that guest to my house?"
The following uses the aorist indicative followed by an aorist imperative:
:{{lang|grc|εἰ '''ἤκουσάς''' τι τούτου τοῦ πράγματος τοῦ γενομένου, '''εἰπέ'''.}} (Andocides 1:50)
:"if '''you heard''' anything about this matter which has happened, '''tell''' us."
The following, from Euripides' play ''Electra'', has two aorist indicative tenses:
:εἰ δʼ, ὡς λέγεις, σὴν θυγατέρʼ '''ἔκτεινεν''' πατήρ,<br />ἐγὼ τί σʼ '''ἠδίκησʼ''' ἐμός τε σύγγονος; (Euripides, Electra 1086–1087)
:"even if, as you say, our father '''killed''' your daughter,<br />how '''did I''' or my brother '''wrong''' you?"
==Future conditions==
==="Emotional" future conditions===
An open conditional may use the future indicative in its protasis to express strong feeling. The apodosis often conveys a threat, warning, or earnest appeal; this is called the “emotional future” conditional.
In the following, a present tense apodosis is combined with a future protasis:
:οὐκ '''ἔστι''' παρελθεῖν, εἰ μὴ τούτους '''ἀποκόψομεν'''. (Xenophon, Anabasis 3.4.39)
:"'''it's''' impossible to go past, unless '''we first cut down''' these men."
:τῇ γὰρ στρατιᾷ οὐκ '''ἔστι''' τὰ ἐπιτήδεια, εἰ μὴ '''ληψόμεθα''' τὸ χωρίον. (Xenophon, Anabasis 4.7.3)
:"'''there is''' no food for the army, unless '''we capture''' the fort."
In the following poetic example, the protasis has a future indicative as before, but in the apodosis instead of a future, there is an aorist indicative:
:{{lang |grc|'''ἀπωλόμην''' ἄρ᾽, εἴ με δὴ '''λείψεις''', γύναι.}} (Euripides, Alcestis 386)
:"'''I am undone''' if '''you leave''' me, wife!"
===Vivid future conditions===
A future conditional usually uses ἐάν (also ἤν or ἄν) with the subjunctive. The α in ἐάν is long (LSJ, s.v. ἐάν; Smyth §34).
This common construction is called the vivid future conditional. The protasis has the present subjunctive and the apodosis the future indicative (Smyth §§2297, 2321–2322).
:Ἐὰν '''ἀγαπᾶτέ''' με, τὰς ἐντολὰς τὰς ἐμὰς '''τηρήσετε'''. (John 14:15)
: "if you '''love''' me, you '''will keep''' my commandments."
:καὶ ἐὰν ἐκεῖ '''ᾖ''' υἱὸς εἰρήνης, '''ἐπαναπαήσεται''' ἐπʼ αὐτὸν ἡ εἰρήνη ὑμῶν. (Luke 10:6)
: "and if a '''son of peace is''' there, your peace '''will rest''' upon him."
:ἐάν τις '''θέλῃ''' τὸ θέλημα αὐτοῦ ποιεῖν, '''γνώσεται''' περὶ τῆς διδαχῆς πότερον ἐκ τοῦ θεοῦ ἐστιν ἢ ἐγὼ ἀπʼ ἐμαυτοῦ λαλῶ. (John 7:17)
:"if anyone '''wishes''' to do his will, he '''will know''' concerning the teaching whether it is from God or I speak from myself."
:ἐάν τις '''ἀγαπᾷ''' με, τὸν λόγον μου '''τηρήσει'''. (John 14:23)
:"if anyone '''loves''' me, he '''will keep''' my word.
The apodosis can contain a present tense, if the verb is δεῖ "it is necessary":
:τὸ γὰρ αὔτʼ, ἐὰν '''ἡττᾶσθε''', καὶ σφὼ '''δεῖ παθεῖν'''. (Aristophanes, Plut. 467)
:"you two '''must suffer''' the same penalty too, if '''you are defeated'''"
The negative used in a conditional clause is usually μή:
:ἐὰν δὲ '''μὴ ἀφῆτε''' τοῖς ἀνθρώποις, οὐδὲ ὁ πατὴρ ὑμῶν '''ἀφήσει''' τὰ παραπτώματα ὑμῶν. (Matthew 6:15)
: "but if you '''do not forgive''' people, neither will your Father '''forgive''' your trespasses."
:ἐὰν γὰρ '''μὴ πιστεύσητε''' ὅτι ἐγώ εἰμι, '''ἀποθανεῖσθε''' ἐν ταῖς ἁμαρτίαις ὑμῶν. (John 8:24)
:"for if you '''do not believe''' that I am he, you '''will die''' in your sins."
Sometimes οὐ is used instead of μή, as when οὔ φημι means “deny” (Smyth §§2696, 2698).
:ἐάντε σὺ καὶ Ἄνυτος '''οὐ φῆτε''' ἐάντε φῆτε (Plato, Apology 25b)
:"whether you and Anytos '''deny it''' or agree with it"
The following example uses the aorist subjunctive in the protasis:
:κἀγὼ ἐὰν '''ὑψωθῶ''' ἐκ τῆς γῆς, πάντας '''ἑλκύσω''' πρὸς ἐμαυτόν. (John 12:32)
:"and I, if I am '''lifted up''' from the earth, '''will draw''' all people to myself."
===Less vivid future conditions===
The less vivid (or ideal) future conditional describes a hypothetical future, often one the speaker does not expect to happen. Both clauses use the optative; the apodosis has the [[Koine Greek/Overview of Particles|particle]] ἄν before or after the verb (Smyth §2329).
The tense of the verb can be aorist (if it is an event) or present (if it describes a situation). The following three examples use the aorist optative:
:καὶ ὁ Παρθένιος ἄβατος· ἐφʼ ὃν '''ἔλθοιτε ἄν''', εἰ τὸν Ἅλυν '''διαβαίητε'''. (Xenophon, Anabasis 5.6.10)
:"the Parthenios river also cannot be crossed, to which '''you would come''' if '''you crossed''' the Halys."
:οὐδέν γε ἄτοπον εἰ '''ἀποθάνοιμι'''. (Plato, Gorgias 521d)
:"there would be nothing strange about it if '''I were to die'''."
:εἰ δή τις με '''ἔροιτο''' ὑμῶν ... '''εἴποιμʼ ἄν''' ... (Aeschines, 1.80)
:"if one of '''you were to ask''' me ... '''I would say''' ..."
The following have present optative in the protasis, aorist optative in the apodosis:
:εἰ γὰρ '''εἰδείης''' ὅσον ἀργύριον εἴργασμαι ἐγώ, '''θαυμάσαις ἄν'''. (Plato, Hipp. Mai. 282d)
:"if '''you knew''' how much money I have earned, '''you would be amazed'''."
:ἡδέως '''ἂν λάβοιμι''', εἰ '''διδοίη'''. (Xenophon, Cyropaedia 3.2.28)
:"'''I would''' gladly '''accept''' it, if '''he were offering''' it."
The following uses the present optative in the apodosis:
:οὐκ '''ἂν θαυμάζοιμι'''. (Plato, Cratylus 428b)
:"'''I would'''n't '''be surprised''' (if that were so)."
In post-classical Greek, the optative mood gradually fell out of use. In the New Testament the potential optative with ἄν occurs, but rarely (e.g. ''Acts'' 8:31); εἰ with the optative also sometimes occurs (e.g. 2 Peter 3:14).
==General conditions==
===Present general conditions===
A present general condition uses the same grammatical construction (ἐάν with the subjunctive) as a vivid future condition, but is much less common. The present subjunctive is used when the actions of the two clauses are contemporaneous:
:ἐὰν '''ὁμολογῶμεν''' τὰς ἁμαρτίας ἡμῶν, '''πιστός ἐστιν''' καὶ δίκαιος ἵνα ἀφῇ ἡμῖν τὰς ἁμαρτίας καὶ καθαρίσῃ ἡμᾶς ἀπὸ πάσης ἀδικίας. (1 John 1:9)
:"if we '''confess''' our sins, he '''is faithful''' and righteous to forgive us our sins and to cleanse us from all unrighteousness."
The aorist subjunctive indicates that this action precedes the main action (Smyth §2623, note 2).
:καὶ ἐὰν τις '''ἁμάρτῃ''', '''παράκλητον ἔχομεν''' πρὸς τὸν πατέρα, Ἰησοῦν Χριστὸν δίκαιον. (1 John 2:1)
:"and if anyone '''sins''', we '''have an advocate''' with the Father, Jesus Christ the righteous."
The perfect subjunctive describes a present state resulting from an earlier action:
:ἐάν τε '''ἑαλωκὼς ᾖ''' ἐάν τε μή, δηλούτω. (Xenophon, Cynegeticus 6.18)
:"whether (the hare) '''has been caught''' or not, (the huntsman) should make it clear (to his colleagues)."
An aorist in the apodosis can sometimes express a general truth in the present; this is called a gnomic aorist (Smyth §§1931, 2338).
:ἢν δέ τις τούτων τι παραβαίνῃ, ζημίαν αὐτοῖς '''ἐπέθεσαν'''. (Xenophon, Cyr. 1.2.2)
:"if a man transgress anyone one of these laws, '''they always impose''' a penalty on him."
===Past general conditions===
The optative after εἰ can express a past general condition (“if ever it used to happen”; Smyth §2340). In the following examples, the protasis has the present optative and the apodosis the imperfect indicative:
: εἴ πού τι '''ὁρῴη''' βρωτόν, '''διεδίδου'''. (Xenophon, Anabasis 4.5.8)
: "If ever '''he saw''' something edible anywhere, '''he would pass''' it round."
:καὶ πάνυ ἄκρατος '''ἦν''', εἰ μή τις ὕδωρ '''ἐπιχέοι'''. (Xenophon, Anabasis 4.5.27)
:"and (the barley-wine) '''was''' completely undiluted, unless someone '''added''' water."
In the following, however, the aorist optative is used in the protasis, to indicate that the action of sharing had to come before that of being allowed near the fire:
: οὐ '''προσίεσαν''' πρὸς τὸ πῦρ τοὺς ὀψίζοντας, εἰ μὴ '''μεταδοῖεν''' αὐτοῖς πῡρούς. (Xenophon, Anabasis 4.5.5)
: "they '''wouldn't let''' the late-comers come near the fire, unless '''they first shared''' some wheat with them."
Here the protasis is shortened to εἰ δὲ μή (“otherwise”), meaning “but if they did not hold their weapons above the water” (cf. Smyth §2346).
:καὶ οὔτʼ ἐν τῷ ὕδατι τὰ ὅπλα ἦν ἔχειν· '''εἰ δὲ μή''', '''ἥρπαζεν''' ὁ ποταμός. (Xenophon, Anabasis 3.4.36)
:"and it was not possible to hold their weapons in the water, '''otherwise''' the river '''kept snatching''' them away."
In a past general condition, ἄν may accompany an imperfect or aorist indicative to express repeated past action. This is called the iterative imperfect or aorist (Smyth §2341). The following example uses the imperfect indicative with ἄν:
:εἰ δέ τις αὐτῷ περί του '''ἀντιλέγοι''' ... ἐπὶ τὴν ὑπόθεσιν '''ἐπανῆγεν ἂν''' πάντα τὸν λόγον. (Xenophon, Memorabilia 4.6.13)
:"if ever anyone '''opposed''' him on anything ... '''he would bring''' the whole subject '''back''' to the beginning"
The following uses the aorist indicative with ἄν:
:καὶ εἴ τις αὐτῷ '''δοκοίη''' ... βλακεύειν, ἐκλεγόμενος τὸν ἐπιτήδειον '''ἔπαισεν ἄν'''. (Xenophon, Anabasis 2.3.11)
:'if ever anyone '''seemed''' to him to be lagging behind, he would pick out the culprit and '''would beat''' him.'
==Unreal conditions==
===Present unreal conditions===
A present unreal ([[#Unreal conditions|counterfactual]]) condition uses εἰ with the imperfect indicative in the protasis and the imperfect indicative plus ἄν in the apodosis (Smyth §2309).
:εἰ ἐκ τοῦ κόσμου '''ἦτε''', ὁ κόσμος ἂν τὸ ἴδιον '''ἐφίλει'''. (John 15:19)
:"if you '''were''' of the world, the world '''would love''' its own."
:εἰ δὲ ἑαυτοὺς '''διεκρίνομεν''', οὐκ ἂν '''ἐκρινόμεθα'''. (1 Corinthians 11:31)
:"but if we '''judged''' ourselves, we '''would not be judged'''."
===Past unreal conditions===
A past unreal condition uses the aorist indicative in both clauses, with ἄν in the apodosis to express “would” (Smyth §2309).
:εἰ μὴ κύριος σαβαὼθ '''ἐγκατέλιπεν''' ἡμῖν σπέρμα, ὡς Σόδομα ἂν '''ἐγενήθημεν'''. (Romans 9:29)
:"if the Lord of Sabaoth had not '''left''' us offspring, we '''would have become''' like Sodom."
The following example has an apodosis only with no protasis. The tense is aorist indicative:
:τίς γὰρ '''ἂν ᾠήθη''' ταῦτα γενέσθαι; (Demosthenes 9.68)
:"for who '''would have expected''' these things to happen?"
In an unreal condition, an imperfect can refer to the past as well as the present. Here ἦς is imperfect indicative and ἀπέθανεν is aorist indicative (Smyth §§2309–2310):
:εἰ '''ἦς''' ὧδε, οὐκ ἂν '''ἀπέθανεν''' ὁ ἀδελφός μου. (John 11:21)
:"Lord, if you '''had been''' here, my brother '''would not have died'''."
In the following, the first imperfect refers to the past, the second to the present time:
:εἰ μὴ τότʼ '''ἐπόνουν''', νῦν '''ἂν''' οὐκ '''εὐφραινόμην'''. (Philemon 153)
:"if '''I had''' not '''been toiling''' then, '''I would''' not now '''be rejoicing'''."
The particle ἄν is sometimes omitted from unreal conditions, especially with imperfect verbs expressing obligation or possibility, such as ἐξῆν (“it was possible”; Smyth §2313).
:ἐμὲ δʼ '''ἐξῆν''' αὐτῷ, εἰ '''ἐσωφρόνει''', μὴ συκοφαντεῖν. (Aeschines, 1.3)
:"'''it would have been possible''' for him, if '''he had been wise''', not to accuse me falsely."
When the emphasis is on possibility or necessity rather than the dependent [[Koine Greek/Infinitives|infinitive]], ἄν may be added (Smyth §2319). Here ἐξεγένετο is the aorist counterpart of the imperfect ἐξῆν:
:περὶ ἐμοῦ μὲν γὰρ εἰ '''ἔλεγον''' ἃ οὗτος ἐβούλετο, οὐδʼ '''ἂν''' ἀπολογήσασθαί μοι '''ἐξεγένετο'''. (Lysias, 7.37)
:"if (the tortured slaves) '''were to say''' about me what he wanted them to say, '''it would'''n't '''have been possible''' for me to defend myself."
Other expressions can also omit ἄν (Smyth §2320):
:τούτῳ δʼ εἰ μὴ ὡμολόγουν, οὐδεμιᾷ ζημίᾳ '''ἔνοχος ἦν'''. (Lysias, 7.37)
:"if (the tortured slaves) did not agree with him, '''he would'''n't''' have been liable''' to any penalty."
==If by chance==
A vivid future conditional with ἐάν and the subjunctive can mean “in the hope that,” “in case,” or “to see whether” (Smyth §2354).
:ἄκουσον καὶ ἐμοῦ, ἐάν σοι ἔτι ταὐτὰ '''δοκῇ'''. (Plato, Rep. 358b)
:"listen to me too, in case the same things '''may''' still '''seem''' true to you."
In a historic context, this type of clause becomes a less vivid future, using εἰ or εἰ πως "if by chance" with the optative mood. In the first example below, πείσειαν "they might persuade" is aorist optative:
:πορευόμενοι ἐς τὴν Ἀσίαν ὡς βασιλέα, εἴ πως '''πείσειαν''' αὐτὸν χρήματά τε παρασχεῖν καὶ ξυμπολεμεῖν. (Thucydides, 2.67)
:"proceeding to Asia to the King, in the hope that '''they might persuade''' him to provide money and join the war."
: ἔσπευδεν γὰρ εἰ δυνατὸν '''εἴη''' αὐτῷ τὴν ἡμέραν τῆς πεντηκοστῆς γενέσθαι εἰς Ἱεροσόλυμα. (Acts 20:16)
: "for he was hurrying, in case '''it might be''' possible for him to reach Jerusalem by the day of Pentecost."
:ζητεῖν τὸν θεὸν, εἰ ἄρα γε '''ψηλαφήσειαν''' αὐτὸν καὶ '''εὕροιεν''', καί γε οὐ μακρὰν ἀπὸ ἑνὸς ἑκάστου ἡμῶν ὑπάρχοντα. (Acts 17:27)
:"to seek God, if perhaps they might '''feel for''' him and '''find''' him, though he is not far from each one of us."
==Wishes==
Wishes in Greek use tenses from the historic sequence: optative, imperfect indicative, and aorist indicative, depending on whether they refer to the future, present or past.
===Wishes for the future===
The optative alone can express a wish for the future (Smyth §1814):
:μὴ '''γένοιτο'''. (Romans 6:2)
: "'''May it never be'''!"
A wish may be introduced by εἴθε or εἰ γάρ (“if only”), using the same construction as a less vivid future condition (Smyth §1815):
: εἰ γὰρ '''γένοιτο'''. (Xenophon, Cyrop. 6.1.38)
: "if only '''it might happen'''!"
===Wishes for the present and past===
An unattainable wish about the present or past uses εἴθε or εἰ γάρ with the imperfect or aorist indicative, as in unreal conditions (Smyth §1780). The imperfect refers to the present:
: εἴθʼ '''εἶχες''', ὦ τεκοῦσα, βελτίους φρένας. (Euripides, Electra 1060)
: "if only, mother, '''you had''' a better heart!"
The aorist indicative is used for an unattainable wish referring to past time:
: εἴθε σοι, ὦ Περίκλεις, τότε '''συνεγενόμην'''. (Xenophon, Memorabilia 1.2.46)
: "if only '''I had been with''' you then, Pericles!"
The aorist of ὀφείλω (“I owe”) can also express a wish (LSJ, s.v. ὀφείλω).
:τὸ τριώβολον δῆτʼ ἔλαβες; – εἰ γὰρ '''ὤφελον'''. (Aristophanes, Eccl. 380)
:"did you get the three-obol fee?" – "'''I wish''' I had!"
Hence in the well-known opening of Euripides' play ''Medea'':
:εἴθʼ '''ὤφελʼ''' Ἀργοῦς '''μὴ διαπτάσθαι''' σκάφος<br />Κόλχων ἐς αἶαν κυανέας Συμπληγάδας. (Euripides, Medea 1–2)
:"if only the ship {{w|Argo}} '''had not flown through'''<br />the dark blue [[w:Symplegades|Clashing Rocks]] to the land of the [[w:Colchis|Colchians]]!"
==Conditional relative clauses==
In Ancient Greek, a [[Koine Greek/8. Pronouns#The Relative Pronoun|relative clause]] can replace the protasis of a conditional (“whoever saw it would be amazed” = “if anyone saw it, they would be amazed”). These conditional relative clauses follow the same rules as ordinary conditionals and are always indefinite (Smyth §§2560–2565):
:Πᾶς οὖν '''ὅστις''' '''ὁμολογήσει''' ἐν ἐμοὶ ἔμπροσθεν τῶν ἀνθρώπων, ὁμολογήσω κἀγὼ ἐν αὐτῷ ἔμπροσθεν τοῦ πατρός μου τοῦ ἐν οὐρανοῖς. (Matthew 10:32)
:"everyone, then, who '''confesses''' me before people, I too will confess him before my Father in heaven."
:οἱ παῖδες ὑμῶν, '''ὅσοι''' ἐνθάδε ἦσαν, ὑπὸ τούτων ἂν ὑβρίζοντο. (Lysias, 12.98)
:"your children, '''as many as''' were here (i.e. if any had been here), would have been abused by these men."
==Conditional clauses in indirect speech==
===Indirect statements===
In indirect statements, main verbs usually become infinitives unless the statement is introduced by ὅτι or ὡς. In a past context, verbs may instead become optatives; some may become participles, and present indicatives may become imperfects (Smyth §§2576, 2613, 2624).
In a past context, ἐάν + subjunctive may change to εἰ + optative in indirect conditionals. An imperfect or aorist indicative in an unreal protasis does not change to the optative. In an ideal or unreal apodosis, ἄν remains when the verb becomes an infinitive or participle (Smyth §§2615, 2619).
The following table shows how the tenses of an original statement are changed to different tenses of the infinitive, participle, and optative when the speech is made indirect:
:{| class="wikitable"
! Original speech
! Infinitive
! Participle
! Optative
! Past
|-
| Present or imperfect
| Present
| Present
| Present
| Imperfect
|-
| Future indicative
| Future
| Future
| Future
|
|-
| Aorist indicative
| Aorist
| Aorist
| Aorist
|
|-
| Perfect or pluperfect
| Perfect
| Perfect
| Perfect
| Pluperfect
|}
====Indirect statements with the infinitive====
In the four examples of indirect statement below, all the main verbs of the original speech have been changed to an infinitive.
The first example is an indirect present open conditional. The infinitive ἐλευθεροῦν represents the original present indicative ἐλευθεροῖς (“you are freeing”), while the protasis verb (“you are killing”) becomes imperfect indicative (Smyth §2634):
:ἔλεγον οὐ καλῶς τὴν Ἑλλάδα '''ἐλευθεροῦν''' αὐτόν, εἰ ἄνδρας '''διέφθειρεν'''. (Thucydides, 3.32)
:"they said that '''he was''' not '''freeing''' Greece in a good way, if '''he was killing''' men."
This indirect emotional future conditional changes the main verbs (“there is” and “it will be”) to present and future infinitives. The future indicative in the protasis becomes future optative (Smyth §2621):
:ἔφη '''εἶναι''' ἄκρον ὃ εἰ μή τις '''προκαταλήψοιτο''', ἀδύνατον '''ἔσεσθαι''' παρελθεῖν. (Xenophon, Anabasis 4.1.25)
:"he said that '''there was''' a hill-top which, unless someone '''captured it first''', '''it was going to be''' impossible to get past."
This unreal past conditional uses a present participle in a [[Koine Greek/The Genitive Absolute|genitive absolute]] where the original protasis would have had an imperfect indicative. The main verb becomes an aorist infinitive, and ἄν remains after the participle (LSJ, s.v. ἄν, II.D.2):
:'''λέγοντος ἄν''' τινος '''πιστεῦσαι''' οἴεσθε; (Demosthenes, 6.20)
:"do you think that, if someone '''had told''' them, '''they would have believed''' it?" (εἴ τις ἔλεγεν, ἐπίστευσαν ἄν;)
This vivid future conditional in a past context changes the main verb (“I will not stop”) to a future infinitive. ἐάν and πρὶν ἄν with the aorist subjunctive become εἰ and πρίν with the aorist optative; the relative-clause verb στρατεύομαι (“I am campaigning”) becomes imperfect indicative (Smyth §2634):
:ὑποσχόμενος αὐτοῖς, εἰ καλῶς '''καταπράξειεν''' ἐφʼ ἃ '''ἐστρατεύετο''', μὴ πρόσθεν '''παύσεσθαι''' πρὶν αὐτοὺς '''καταγάγοι''' οἴκαδε. (Xenophon, Anabasis 1.2.2)
:"promising them that if '''he accomplished''' what '''he was campaigning''' for, '''he would''' not '''stop''' until '''he brought them back''' home." (εἰ καλῶς καταπράξομαι ἐφʼ ἅ στρατεὐομαι, οὐ πρόσθεν παύσομαι πρὶν ἂν ὑμᾶς καταγάγω οἴκαδε.)
====Indirect statements with ὅτι====
Indirect statements can also use ὅτι (“that”). In a past context, the verbs may change to the optative (Smyth §2619).
In the following example, the main verb ἐπιθήσοιεν has been changed to the future optative, but the future indicative in the protasis has not been changed to the optative:
:ἠπείλουν αὐτῷ ὅτι εἰ '''λήψονται''' ἀποδιδράσκοντα, τὴν δίκην '''ἐπιθήσοιεν'''. (Xenophon, Anabasis 5.6.34)
:"they threatened him that if they caught (lit. will catch) him running away, they would punish him."
In unreal conditional clauses, the indicative remains unchanged (Smyth §§2615, 2623):
:ἀπελογοῦντο ὡς οὐκ '''ἄν''' ποτε οὕτω μῶροι '''ἦσαν''' εἰ '''εἴδεσαν'''. (Xenophon, Hell. 5.4.22)
:"they pleaded that they '''would''' never '''have been''' so foolish if '''they had known'''."
===Indirect questions===
An indirect question may use εἰ (“if”) even when the original question was not conditional (Smyth §2671). In a past context, the main verb may change to the optative: βούλει (“are you willing?”) becomes βούλοιτο. The aorist participle λαβών (“having received”) may imply a vivid or less vivid future condition (cf. Smyth §2359):
:ἐγὼ δὲ Πείσωνα μὲν ἠρώτων εἰ '''βούλοιτό''' με σῶσαι χρήματα '''λαβών'''. (Lysias, 12.9)
:"I asked Pison if '''he was willing''' to save me '''if he received''' some money."
The optative remains unchanged in indirect speech (Smyth §2620). The ἄν in the following sentence indicates that the original question used the potential optative (“would you give?”):
:ἠρώτων ἐκεῖνοι εἰ '''δοῖεν ἂν''' τούτων τὰ πιστά. (Xenophon, Anabasis 4.8.7)
:"they asked if (the Greeks) '''would give''' pledges concerning these matters."
===Indirect commands===
In indirect commands, the verb generally becomes an infinitive (Smyth §2633):
:εἰ οὖν τι βούλονται σαφὲς λέγειν, '''πέμψαι''' ἄνδρας ὡς αὐτόν. (Thucydides, 4.50)
:"(the letter said that) if therefore they wished to say something clearly, they should send some men to him."
Although the context is past, βούλονται (“they wish”) remains indicative rather than changing to the optative. Retaining the vivid mood is characteristic of Thucydides (Smyth §2613).
:{{BookCat}}
6i009xafuctifdk2dl034jwjldfr7jz
Wikibooks:Reading room/Administrative Assistance/Archives/2026/October
4
486385
4676701
4676476
2026-10-18T08:10:30Z
ArchiverBot
1227662
Bot: Archiving 1 thread from [[Wikibooks:Reading room/Administrative Assistance]]
4676701
wikitext
text/x-wiki
{{talk archive}}
== Tunde akinlabi reported by MathXplore ==
* {{userlinks|Tunde akinlabi}}
Spam <!-- USERREPORTED:/Tunde akinlabi/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:18, 1 October 2026 (UTC)
: Page was deleted by another admin. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:11, 2 October 2026 (UTC)
== Barakat isiaka reported by MathXplore ==
* {{userlinks|Barakat isiaka}}
Spam <!-- USERREPORTED:/Barakat isiaka/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:19, 1 October 2026 (UTC)
: Page was deleted by another admin. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:11, 2 October 2026 (UTC)
== Roconpaas01 reported by MathXplore ==
* {{userlinks|Roconpaas01}}
Link spam, [[Special:AbuseLog/315913]] <!-- USERREPORTED:/Roconpaas01/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 12:19, 2 October 2026 (UTC)
: {{done}}. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 14:10, 2 October 2026 (UTC)
== Diiminstitute reported by MathXplore ==
* {{userlinks|Diiminstitute}}
Link spam, [[Special:AbuseLog/315963]] <!-- USERREPORTED:/Diiminstitute/ --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 02:34, 4 October 2026 (UTC)
:{{done}} --[[User:SHB|SHB]] ([[User talk:SHB|discuss]] • [[Special:Contributions/SHB|contribs]]) 02:58, 4 October 2026 (UTC)
cveo1i8adhnf31gi0k3ovuq3cd2kbuc
Klasky Csupo
0
486388
4676525
4676500
2026-10-17T13:42:18Z
MathXplore
3097823
Marking for speedy deletion: Encyclopedic articles belong at [[w:|Wikipedia]]
4676525
wikitext
text/x-wiki
<noinclude>{{Delete|example=false|Encyclopedic articles belong at [[w:|Wikipedia]]}}</noinclude>
The Klasky-Csupo logo, stylized as the Klasky Csupo Robot Logo, SSF, Splaat or Splaat!, is a 5-second logo that is commonly employed in the logo editing community. This logo is viewed as the central emblem or mascot of the community, with its design and other variations being utilized since 2009, although some of the earliest examples can be traced to 2008.
The most commonly used variant is from the 1998 logo, though variants from later dates, such as 2002, have also been used.
== Overview ==
'''Visuals'''
On a static light violet background, a black ink stain on an indigo water background with a liquid effect appears by splattering all over the screen. A CGI live-action human hand comes in from the left and places a yellow piece of paper containing a red-lipped mouth onto the stain, while a pair of blue, round eyes (which seem to wiggle like Jell-O) appear and zoom in above the mouth, forming a bizarre-looking robot face. The face then says the company name as white blocks fly out from its mouth, which are revealed to be the parts of the K-C logo as they arrange themselves to form it (the parts have also been refined to match the print logo, with the "K" in Futura Bold, "L" in Permian Serif, "a" in Times New Roman, "S" in Futura Book, the second "K" in a zig-zaggy font made possibly to match with the Letraset Process in the logo, the "Y" and "CSUPO" set in the same font as the first "K"). During the face's screen time, there are holes in the liquid background (which reveal smudges of the static background that emerge from the center and slide off-screen from many other directions). After that, the background and the face disappear like an old CRT television turning off, and the "Y" in "KLaSKY" turns purple and flashes faintly. The logo remains on-screen for a few seconds, and then it either fades out or cuts to black.
'''Audio'''
A splatter sound is heard when the ink appears and a bouncy "beeping" version of the 24-note bass jingle (which sounds like a clarinet) is played. Another "beepy" instrumental plays the same jingle in the water background, only it comes in a quarter measure late. The company name is stated in a robotic voice with significant amounts of clipping to make it louder (hence the "Robot" nickname; the voice was supplied by the "Boing" novelty voice in the text-to-speech program used on a Power Macintosh G3 workstation). After Splaat finishes talking and the company logo appears, there are four cartoon sound effects: a tiny twang, a lip-flapping sound that sounds similar to the "trombone gobble" sound heard in Warner Bros. cartoons accompanied by a slap, a duck quacking twice, and the classic Hanna-Barbera/Hoyt Curtin boing.
== Variants ==
1. Graffiti Logo
2. Robot Logo
3. Rooster Logo
4. X Csupo
5. Nightmare Csupo
6. Purple Flower
7. Blue Beam
8. Green Cream
9. Red Lead
== Trivia ==
*It is considered to be one of the most widely used sources, with the second being Noggin and Nick Jr. Logo Collection.
RoboSplaat has clarified he prefers to be called Splaat rather than "a robot".
*The character in the ident is called Splaat.
*Despite this, most people still call it Klasky-Csupo, which has resulted in some people coincidentally finding videos with effects rather than videos related to the actual animation studio, which the Robot ident and a few other idents have been created for.
625ahpbemm8ufn114qjmlgqyokrulzu
Chess Opening Theory/1. e4/1...e5/2. Nf3/2...Nf6/3. d3
0
486390
4676512
2026-10-17T12:53:18Z
~2026-55653-73
3628611
I have created a Wikibook page for the d3 pawn move played against the Russian Game. I wasn't sure whether I should include a "References" section at the bottom; I would appreciate it if you could add one if necessary. Thanks in advance.
4676512
wikitext
text/x-wiki
d3, piyonun [[Chess/Petroff's Defence|Russian game]] karşı d3 piyonuyla e piyonunu koruduğu bir varyanttır. Beyaz sağlam bir savunma yapısı kurar ve Siyah artık piyonunu savunmak zorundadır. Oyun genellikle, renklerin tersine döndüğü bir Philidor Savunması Hanham varyantına (3...Ac6 4. Fe2 d5 5. Abd2 Fc5 ⩱) benzer bir hal alır ya da Beyaz, g3 ve Fg2 hamleleriyle bir "Şah-Hint Saldırısı" (King's Indian Attack) tarzı bir dizilim benimser.
qk579oxlavbjr9ze9enrjhomg55l6py
4676514
4676512
2026-10-17T12:58:18Z
~2026-55653-73
3628611
I'm makedd english.
4676514
wikitext
text/x-wiki
== In the [[Chess/Petroff's Defence|Russian Game]], the move d3 is a variation in which White uses the d3-pawn to protect the e-pawn. By establishing a solid defensive structure, White also compels Black to defend their own pawn. The game often evolves into a position reminiscent of the Hanham Variation of the Philidor Defence—albeit with the colors reversed (3...Nc6 4. Be2 d5 5. Nbd2 Bc5 ⩱)—or, alternatively, White may opt for a setup in the style of the "King's Indian Attack," involving the moves g3 and Bg2. ==
ftdbf2zd4gjasvjy0adook25sxqfz4j
4676522
4676514
2026-10-17T13:41:37Z
MathXplore
3097823
Added {{[[Template:BookCat|BookCat]]}} using [[User:1234qwer1234qwer4/BookCat.js|BookCat.js]]
4676522
wikitext
text/x-wiki
== In the [[Chess/Petroff's Defence|Russian Game]], the move d3 is a variation in which White uses the d3-pawn to protect the e-pawn. By establishing a solid defensive structure, White also compels Black to defend their own pawn. The game often evolves into a position reminiscent of the Hanham Variation of the Philidor Defence—albeit with the colors reversed (3...Nc6 4. Be2 d5 5. Nbd2 Bc5 ⩱)—or, alternatively, White may opt for a setup in the style of the "King's Indian Attack," involving the moves g3 and Bg2. ==
{{BookCat}}
smb3fnzc0mqjz1a3t5ldymm45mt44ga
User:Sarolang
2
486391
4676515
2026-10-17T13:00:07Z
Sarolang
3628609
/* */
4676515
wikitext
text/x-wiki
Hi
he0da0q8s1r2umjl1vwjjxep15c52yo
4676516
4676515
2026-10-17T13:02:39Z
Sarolang
3628609
4676516
wikitext
text/x-wiki
[[The Revised Dictionary of Judeo‑Malay.|The Revised Dictionary of Judeo‑Malay]]
9j3kmdz3yi4jqcsudn5hcrvqi0mf4xy
4676548
4676516
2026-10-17T15:21:30Z
Sarolang
3628609
/* */
4676548
wikitext
text/x-wiki
phoiac9h4m842xq45sp7s6u21eteeq1
4676565
4676548
2026-10-17T17:49:56Z
Sarolang
3628609
/* */
4676565
wikitext
text/x-wiki
[[Malay to Judeo-Malay Complete Dictionary|Malay-Judeo-Malay-Bazaar Malay : Complete Dictionary]]
49r253wvxipksa4gxx056zzbezee0n4
4676710
4676565
2026-10-18T08:53:39Z
Sarolang
3628609
/* */
4676710
wikitext
text/x-wiki
Judeo-Malay Revised Phrasebook And Dictionary [[Judeo-Malay Revised Phrasebook And Dictionary]]
migw5bz12l3q6j4uopkbwbo7k744375
4676711
4676710
2026-10-18T08:58:12Z
Sarolang
3628609
/* */
4676711
wikitext
text/x-wiki
Judeo-Malay Revised Phrasebook And Dictionary [[Judeo-Malay Revised Dictionary]]
1s5j33mmtk9ibr2n1l41qu51xvl9h0b
User talk:~2026-55681-78
3
486392
4676524
2026-10-17T13:41:59Z
MathXplore
3097823
Notifying author of speedy deletion nomination
4676524
wikitext
text/x-wiki
== I have added a tag to a page you created ==
Hi! I'm MathXplore, and I recently reviewed your page, [[:NEIN Csupo]]. I have added a tag to the page, because it <strong>may meet the [[Wikibooks:Deletion policy#Speedy deletions|criteria for speedy deletion]].</strong> This means that it can be deleted at any time. If you believe that your page should not be deleted, please post a message on [[Talk:NEIN Csupo|the page's talk page]] explaining why. <strong>If your reasoning is convincing, your page may be saved.</strong> If you have any questions or concerns, please [[User talk:MathXplore|let me know]]. Thank you! <!-- Substituted from User:JJPMaster/CurateThisPage/authorMsg --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 13:41, 17 October 2026 (UTC)
hnbijfhpjwz2pujxcqxiqsok9qiqixy
4676526
4676524
2026-10-17T13:42:19Z
MathXplore
3097823
Notifying author of speedy deletion nomination
4676526
wikitext
text/x-wiki
== I have added a tag to a page you created ==
Hi! I'm MathXplore, and I recently reviewed your page, [[:NEIN Csupo]]. I have added a tag to the page, because it <strong>may meet the [[Wikibooks:Deletion policy#Speedy deletions|criteria for speedy deletion]].</strong> This means that it can be deleted at any time. If you believe that your page should not be deleted, please post a message on [[Talk:NEIN Csupo|the page's talk page]] explaining why. <strong>If your reasoning is convincing, your page may be saved.</strong> If you have any questions or concerns, please [[User talk:MathXplore|let me know]]. Thank you! <!-- Substituted from User:JJPMaster/CurateThisPage/authorMsg --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 13:41, 17 October 2026 (UTC)
== I have added a tag to a page you created ==
Hi! I'm MathXplore, and I recently reviewed your page, [[:Klasky Csupo]]. I have added a tag to the page, because it <strong>may meet the [[Wikibooks:Deletion policy#Speedy deletions|criteria for speedy deletion]].</strong> This means that it can be deleted at any time. If you believe that your page should not be deleted, please post a message on [[Talk:Klasky Csupo|the page's talk page]] explaining why. <strong>If your reasoning is convincing, your page may be saved.</strong> If you have any questions or concerns, please [[User talk:MathXplore|let me know]]. Thank you! <!-- Substituted from User:JJPMaster/CurateThisPage/authorMsg --> [[User:MathXplore|MathXplore]] ([[User talk:MathXplore|discuss]] • [[Special:Contributions/MathXplore|contribs]]) 13:42, 17 October 2026 (UTC)
hpsg1oxeie0t0f3lgchbk8zuwv3toca
The Revised Dictionary of Judeo‑Malay.
0
486393
4676531
2026-10-17T14:25:58Z
Sarolang
3628609
Created page with "===Foreword=== This revised lexicon gathers surviving words, phrases and usage notes from the historical Judeo‑Malay speech‑variety once spoken by the small Jewish community of Penang. Judeo‑Malay was never a fully separate language; it was a distinct local form of Malay enriched with selected Hebrew and Aramaic terms, used mostly in everyday conversation within the community from the late‑19th to mid‑20th century. Most original oral speakers have passe..."
4676531
wikitext
text/x-wiki
===Foreword===
This revised lexicon gathers surviving words, phrases and usage notes from the historical Judeo‑Malay speech‑variety once spoken by the small Jewish community of Penang. Judeo‑Malay was never a fully separate language; it was a distinct local form of Malay enriched with selected Hebrew and Aramaic terms, used mostly in everyday conversation within the community from the late‑19th to mid‑20th century.
Most original oral speakers have passed away, leaving only scattered handwritten notes, old letters and brief published records behind. This work revises and arranges those surviving materials, not to invent new vocabulary, but to preserve what can still be recovered. It also notes how this speech‑form existed alongside ordinary Malay, Baghdadi‑Arabic and English in Penang’s old multicultural neighbourhoods.
This dictionary does not claim to be a complete historical record — many expressions were never written down and are now lost. Instead, it serves as a starting‑point for anyone interested in the little‑known linguistic heritage of Penang’s former Jewish community.
To foster the spirit of tolerance and inter‑faith solidarity, the author has prepared this book so that this unique language is not forgotten by present‑day society.
[[Image:Judeo-Malay Numbers written in Hebrew.jpg|frame|left|One of the few surviving manuscripts of Judeo-Malay language.]]
==א==
so0ne940qrxzhbnkw9ggctd4dacltxy
4676536
4676531
2026-10-17T14:37:15Z
Sarolang
3628609
/* א */
4676536
wikitext
text/x-wiki
===Foreword===
This revised lexicon gathers surviving words, phrases and usage notes from the historical Judeo‑Malay speech‑variety once spoken by the small Jewish community of Penang. Judeo‑Malay was never a fully separate language; it was a distinct local form of Malay enriched with selected Hebrew and Aramaic terms, used mostly in everyday conversation within the community from the late‑19th to mid‑20th century.
Most original oral speakers have passed away, leaving only scattered handwritten notes, old letters and brief published records behind. This work revises and arranges those surviving materials, not to invent new vocabulary, but to preserve what can still be recovered. It also notes how this speech‑form existed alongside ordinary Malay, Baghdadi‑Arabic and English in Penang’s old multicultural neighbourhoods.
This dictionary does not claim to be a complete historical record — many expressions were never written down and are now lost. Instead, it serves as a starting‑point for anyone interested in the little‑known linguistic heritage of Penang’s former Jewish community.
To foster the spirit of tolerance and inter‑faith solidarity, the author has prepared this book so that this unique language is not forgotten by present‑day society.
[[Image:Judeo-Malay Numbers written in Hebrew.jpg|frame|left|One of the few surviving manuscripts of Judeo-Malay language.]]
==א==
א= The first letter of Judeo-Malay alphabet.
א
2h2pn0xkjpn8jypt4zlo29ur6eydxez
4676559
4676536
2026-10-17T16:44:19Z
Kittycataclysm
3371989
query scope
4676559
wikitext
text/x-wiki
{{Qr-scope|reason=WB specifically does not allow dictionaries per [[WB:WIW]]}}
===Foreword===
This revised lexicon gathers surviving words, phrases and usage notes from the historical Judeo‑Malay speech‑variety once spoken by the small Jewish community of Penang. Judeo‑Malay was never a fully separate language; it was a distinct local form of Malay enriched with selected Hebrew and Aramaic terms, used mostly in everyday conversation within the community from the late‑19th to mid‑20th century.
Most original oral speakers have passed away, leaving only scattered handwritten notes, old letters and brief published records behind. This work revises and arranges those surviving materials, not to invent new vocabulary, but to preserve what can still be recovered. It also notes how this speech‑form existed alongside ordinary Malay, Baghdadi‑Arabic and English in Penang’s old multicultural neighbourhoods.
This dictionary does not claim to be a complete historical record — many expressions were never written down and are now lost. Instead, it serves as a starting‑point for anyone interested in the little‑known linguistic heritage of Penang’s former Jewish community.
To foster the spirit of tolerance and inter‑faith solidarity, the author has prepared this book so that this unique language is not forgotten by present‑day society.
[[Image:Judeo-Malay Numbers written in Hebrew.jpg|frame|left|One of the few surviving manuscripts of Judeo-Malay language.]]
==א==
א= The first letter of Judeo-Malay alphabet.
א
bfj1sehhluinn87k2mmpqiztnpqprfx
About Monsters And Angels/Introduction
0
486395
4676542
2026-10-17T15:11:44Z
3MMPEYTON
3393808
Created page with "== Introduction To Monsters == '''Types of monsters:''' 1. Undead And Spirits: <br> - Vampires: Immoral, fanged, undead human-like creatures that feed on blood. (Examples: Dracula, Strigoi). <br> - Zombies: Reanimated, or cursed corpses with a strong hunger for flesh. <br> - Ghosts And Specters: Disembodies souls or spirits that haunt the living. <br> <br> 2. Human-Animal Hybrids And Shapeshifters: <br> - Werewolves And Therianthropes: Humans that transform into beast..."
4676542
wikitext
text/x-wiki
== Introduction To Monsters ==
'''Types of monsters:'''
1. Undead And Spirits: <br>
- Vampires: Immoral, fanged, undead human-like creatures that feed on blood. (Examples: Dracula, Strigoi). <br>
- Zombies: Reanimated, or cursed corpses with a strong hunger for flesh. <br>
- Ghosts And Specters: Disembodies souls or spirits that haunt the living. <br>
<br>
2. Human-Animal Hybrids And Shapeshifters: <br>
- Werewolves And Therianthropes: Humans that transform into beasts during a full moon. <br>
- Mythological Hybrids: Creatures combining human and animal characteristics (Example: Centaurs, Mermaids, Sirens) <br>
- Yokai And Folklore Spirits: Japanese and Asian phantoms and shapeshifters. <br>
<br>
3. Giants, Ogres And Humanoids: <br>
- Giants And Cyclopes: Massive human-like creatures found in mythology. (Example: Cyclops) <br>
- Goblins, Trolls And Gnomes: Mischievous, tiny or mid-sized humanoids found in the woodlands. (Example: Trolls) <br>
- Ogres And Man-Eaters: Large, savage humanoids known for eating people. <br>
<br>
4. Beasts, Dragons And Sea Monsters: <br>
- Dragons And Serpents: Reptilian, fire-breathing, or flying giant beasts. Found mainly in Western and Eastern traditions. <br>
- Water And Lake Monsters: Aquatic creatures lurking in deep waters. (Example: Loch Ness Monster). <br>
- Cryptids: Modern mythical animals reported by witnesses. (Example: Bigfoot, Chupacabra). <br>
<br>
5. Demons, Fiends And Cosmic Entities: <br>
- Demons And Devils: Malevolent spiritual or underworld forces. <br>
- Lovecraftian / Tabletop Classifications: Systematic categories used in fantasy games like Dungeons & Dragons. <br>
<br>
Historically, a monster was something shown to people in order to teach them a lesson, or to signal danger, or to reveal a moral truth. <br>
<br>
Monsters emerge from specific historical and social moments. <br>
<br>
Monsters also emerge from individuals who are processing their trauma, or from people seeking to handle their physical or mental illnesses. <br>
Many academic fields analyze monsters, such as Anthropology, Literature, Media Studies, Psychology, and Sociology.
lefwjk97ya8m41z87iyeg5npvaxsiol
4676545
4676542
2026-10-17T15:17:29Z
3MMPEYTON
3393808
4676545
wikitext
text/x-wiki
== Introduction To Monsters ==
'''Types of monsters:'''
1. Undead And Spirits: <br>
- Vampires: Immoral, fanged, undead human-like creatures that feed on blood. (Examples: Dracula, Strigoi). <br>
- Zombies: Reanimated, or cursed corpses with a strong hunger for flesh. <br>
- Ghosts And Specters: Disembodies souls or spirits that haunt the living. <br>
<br>
2. Human-Animal Hybrids And Shapeshifters: <br>
- Werewolves And Therianthropes: Humans that transform into beasts during a full moon. <br>
- Mythological Hybrids: Creatures combining human and animal characteristics (Example: Centaurs, Mermaids, Sirens) <br>
- Yokai And Folklore Spirits: Japanese and Asian phantoms and shapeshifters. <br>
<br>
3. Giants, Ogres And Humanoids: <br>
- Giants And Cyclopes: Massive human-like creatures found in mythology. (Example: Cyclops) <br>
- Goblins, Trolls And Gnomes: Mischievous, tiny or mid-sized humanoids found in the woodlands. (Example: Trolls) <br>
- Ogres And Man-Eaters: Large, savage humanoids known for eating people. <br>
<br>
4. Beasts, Dragons And Sea Monsters: <br>
- Dragons And Serpents: Reptilian, fire-breathing, or flying giant beasts. Found mainly in Western and Eastern traditions. <br>
- Water And Lake Monsters: Aquatic creatures lurking in deep waters. (Example: Loch Ness Monster). <br>
- Cryptids: Modern mythical animals reported by witnesses. (Example: Bigfoot, Chupacabra). <br>
<br>
5. Demons, Fiends And Cosmic Entities: <br>
- Demons And Devils: Malevolent spiritual or underworld forces. <br>
- Lovecraftian / Tabletop Classifications: Systematic categories used in fantasy games like Dungeons & Dragons. <br>
<br>
Historically, a monster was something shown to people in order to teach them a lesson, or to signal danger, or to reveal a moral truth. <br>
<br>
Monsters emerge from specific historical and social moments. <br>
<br>
Monsters also emerge from individuals who are processing their trauma, or from people seeking to handle their physical or mental illnesses. <br>
Many academic fields analyze monsters, such as Anthropology, Literature, Media Studies, Psychology, and Sociology. <br>
<br>
<noinclude>{{Chapter navigation with TOC||Chapter One|TOC mini}}</noinclude>
<br>
n5axo2opspewn7dd6zy5ljby84c1i7v
Transwiki:JJPMaster/CascadingImportation
108
486397
4676585
2024-12-18T11:01:58Z
w>JJPMaster
0
for enwikibooks use
4676585
wikitext
text/x-wiki
This page contains a bunch of templates that I will import ''en masse'' to the English Wikibooks by importing "[[w:User:JJPMaster/CascadingImportation]]" with "Import all templates and transcluded pages" enabled.
{{User js-0}}
{{User js-1}}
{{User js-2}}
{{User js-3}}
{{User js-4}}
{{User js-5}}
{{User js-N}}
{{User js-1}}
ms23d2y0b6p74tyi7tr248am043u3rq
4676586
4676585
2024-12-19T05:41:55Z
w>JJPMaster
0
next batch
4676586
wikitext
text/x-wiki
This page contains a bunch of templates that I will import ''en masse'' to the English Wikibooks by importing "[[w:User:JJPMaster/CascadingImportation]]" with "Import all templates and transcluded pages" enabled.
{{#invoke:Lockbox|lock|:Code page 668|:Code page 708|:Code page 720|:Code page 770|:Code page 773|:Code page 775|:Code page 776|:Code page 777|:Code page 778|:Code page 851|:Code page 852|:Code page 853|:Code page 855|:Code page 856|:Code page 857|:Code page 859|:Code page 860|:Code page 1169}}
etgomxyks1bz9vig9dx8e3xiefpz5ai
4676587
4676586
2024-12-19T10:59:03Z
w>JJPMaster
0
let's try again
4676587
wikitext
text/x-wiki
This page contains a bunch of templates that I will import ''en masse'' to the English Wikibooks by importing "[[w:User:JJPMaster/CascadingImportation]]" with "Import all templates and transcluded pages" enabled.
{{#invoke:Lockbox|lock|:Code page 668|:Code page 708|:Code page 720|:Code page 770|:Code page 773|:Code page 775|:Code page 776|:Code page 777|:Code page 778|:Code page 851|:Code page 852|:Code page 853|:Code page 855|:Code page 856|:Code page 857|:Code page 859|:Code page 860}}
b60h6c4sh9y4vl8ak9mkvo30z3vqxwj
4676588
4676587
2024-12-22T18:19:45Z
w>JJPMaster
0
test
4676588
wikitext
text/x-wiki
This page contains a bunch of templates that I will import ''en masse'' to the English Wikibooks by importing "[[w:User:JJPMaster/CascadingImportation]]" with "Import all templates and transcluded pages" enabled.
{{#invoke:Lockbox|lock|RM_created}}
9tdrunj5h3qe7nwu89mtsxbfww182jd
4676589
4676588
2024-12-22T18:20:27Z
w>JJPMaster
0
test2
4676589
wikitext
text/x-wiki
This page contains a bunch of templates that I will import ''en masse'' to the English Wikibooks by importing "[[w:User:JJPMaster/CascadingImportation]]" with "Import all templates and transcluded pages" enabled.
{{#invoke:Lockbox|lock|RM_created}}
{{RM created}}
ohw0v9m4ih4am0nn3zahuqeuybzipra
4676590
4676589
2024-12-22T18:26:01Z
w>JJPMaster
0
next batch
4676590
wikitext
text/x-wiki
This page contains a bunch of templates that I will import ''en masse'' to the English Wikibooks by importing "[[w:User:JJPMaster/CascadingImportation]]" with "Import all templates and transcluded pages" enabled.
* [[Template:Not a bug]]
* [[Template:Won't fix]]
* [[Template:Not fixed]]
* [[Template:Withdrawn]]
* [[Template:PImplemented]]
* [[Template:Technically indistinguishable]]
* [[Template:Works for me]]
ndc63eq6k4liryqm43mqfojvyux24pq
4676591
4676590
2024-12-22T18:26:52Z
w>JJPMaster
0
use traditional means
4676591
wikitext
text/x-wiki
This page contains a bunch of templates that I will import ''en masse'' to the English Wikibooks by importing "[[w:User:JJPMaster/CascadingImportation]]" with "Import all templates and transcluded pages" enabled.
{{#invoke:Lockbox|lock|Not a bug|Won't fix|Not fixed|Withdrawn|PImplemented|Technically indistinguishable|Works for me}}
0fepy8ve1szhmzvutkqh7lz64g0tk8x
4676592
4676591
2024-12-22T19:13:07Z
w>JJPMaster
0
next batch
4676592
wikitext
text/x-wiki
This page contains a bunch of templates that I will import ''en masse'' to the English Wikibooks by importing "[[w:User:JJPMaster/CascadingImportation]]" with "Import all templates and transcluded pages" enabled.
{{#invoke:Lockbox|lock|Spaced_en_dash|Em dash|Soft hyphen|Blockquote|Quote frame|Humor}}
ltjad2wkb9mgyb4ceqgm2ckr3aghvl1
4676593
4676592
2024-12-29T23:42:49Z
w>JJPMaster
0
next batch
4676593
wikitext
text/x-wiki
This page contains a bunch of templates that I will import ''en masse'' to the English Wikibooks by importing "[[w:User:JJPMaster/CascadingImportation]]" with "Import all templates and transcluded pages" enabled.
Today's theme: <strong>LGBTQ userboxes</strong>
{{#invoke:Lockbox|lock|User LGBTQ|User:UBX/lesbian|User:UBX/queer|User:UBX/bisexual|User:UBX/pansexual|User:UBX/asexual|User:UBX/gay|User:UBX/Aromantic|User:EurovisionAndXenomorphs/Userboxes/user-transgender-flag|User Nonbinary flag|User:UBX/genderqueer}}
rvc3al6cyhcjpbki5nkwm3ydp2mh2y5
4676594
4676593
2025-05-24T00:07:05Z
w>JJPMaster
0
next batch
4676594
wikitext
text/x-wiki
This page contains a bunch of templates that I will import ''en masse'' to the English Wikibooks by importing "[[w:User:JJPMaster/CascadingImportation]]" with "Import all templates and transcluded pages" enabled.
Today's theme: <strong>Section transclusion modules</strong>
{{#invoke:Lockbox|lock|Module:Transcluder|Module:Excerpt|Module:Excerpt/config|Template:Excerpt}}
tcnz90nrf0p9peaff5nwkqg8cyyvv25
4676595
4676594
2026-02-28T12:18:54Z
w>Primefac
0
rmv module being deleted
4676595
wikitext
text/x-wiki
This page contains a bunch of templates that I will import ''en masse'' to the English Wikibooks by importing "[[w:User:JJPMaster/CascadingImportation]]" with "Import all templates and transcluded pages" enabled.
Today's theme: <strong>Section transclusion modules</strong>
{{#invoke:Lockbox|lock|Module:Excerpt|Module:Excerpt/config|Template:Excerpt}}
ki63ys3j7mcsqvxln6qokfkiu1wsmx6
4676596
4676595
2026-10-18T02:48:43Z
w>JJPMaster
0
4676596
wikitext
text/x-wiki
This page contains a bunch of templates that I will import ''en masse'' to the English Wikibooks by importing "[[w:User:JJPMaster/CascadingImportation]]" with "Import all templates and transcluded pages" enabled.
Today's theme: <strong>Hidden archive templates</strong>
{{#invoke:Lockbox|lock|Template:Hidden archive top|Template:Hidden archive bottom|Template:Hidden archive top/styles.css}}
99t5rpjxe2yf2237n5ojmr32zxp6u4e
4676597
4676596
2026-10-18T02:49:00Z
JJPMaster
3095725
12 revisions imported from [[:w:User:JJPMaster/CascadingImportation]]: Mass-importing pages: utility templates
4676596
wikitext
text/x-wiki
This page contains a bunch of templates that I will import ''en masse'' to the English Wikibooks by importing "[[w:User:JJPMaster/CascadingImportation]]" with "Import all templates and transcluded pages" enabled.
Today's theme: <strong>Hidden archive templates</strong>
{{#invoke:Lockbox|lock|Template:Hidden archive top|Template:Hidden archive bottom|Template:Hidden archive top/styles.css}}
99t5rpjxe2yf2237n5ojmr32zxp6u4e
Transwiki:Hidden archive bottom
108
486398
4676598
2007-01-10T03:36:45Z
w>Samuel Blanning
0
creating
4676598
wikitext
text/x-wiki
|}
<noinclude>
Shortcut: {{tl|hab}}. A generic version of the template used to archive [[Wikipedia:Deletion review]] discussions. Used with [[Template:Hidden archive top]] (shortcut {{tl|hat}}), can be used to close a discussion and discourage further editing without removing it completely from the page.
The entire active content of this template is actually just '|}'.
[[Category:Archival templates]]
</noinclude>
npo27jdio8rqnecczvoa6n5sx5q2zzd
4676599
4676598
2007-01-16T00:29:59Z
w>Ryulong
0
4676599
wikitext
text/x-wiki
|}<noinclude>
Shortcut: {{tl|hab}}. A generic version of the template used to archive [[Wikipedia:Deletion review]] discussions. Used with [[Template:Hidden archive top]] (shortcut {{tl|hat}}), can be used to close a discussion and discourage further editing without removing it completely from the page.
The entire active content of this template is actually just '|}'.
[[Category:Archival templates]]
</noinclude>
o3gb3i2uvbks3vl5vck402p2spq7h0d
4676600
4676599
2007-01-27T04:46:15Z
w>Trialsanderrors
0
Cat
4676600
wikitext
text/x-wiki
|}<noinclude>
Shortcut: {{tl|hab}}. A generic version of the template used to archive [[Wikipedia:Deletion review]] discussions. Used with [[Template:Hidden archive top]] (shortcut {{tl|hat}}), can be used to close a discussion and discourage further editing without removing it completely from the page.
The entire active content of this template is actually just '|}'.
[[Category:Archival templates|Hidden Archiveb]]
</noinclude>
7139sp5osdkmu0oli9gt1aboevwv3wn
4676601
4676600
2007-12-26T21:46:47Z
w>Nmajdan
0
insert hidden template name identifier
4676601
wikitext
text/x-wiki
<includeonly><!-- [[Template:hab]] --></includeonly>|}<noinclude>
Shortcut: {{tl|hab}}. A generic version of the template used to archive [[Wikipedia:Deletion review]] discussions. Used with [[Template:Hidden archive top]] (shortcut {{tl|hat}}), can be used to close a discussion and discourage further editing without removing it completely from the page.
The entire active content of this template is actually just '|}'.
[[Category:Archival templates|Hidden Archiveb]]
</noinclude>
2a9b8br45p20tqi054q27t4gp50ubuo
4676602
4676601
2008-08-27T04:18:04Z
w>Scientizzle
0
Protected Template:Hidden archive bottom: just in case... [edit=sysop:move=sysop]
4676601
wikitext
text/x-wiki
<includeonly><!-- [[Template:hab]] --></includeonly>|}<noinclude>
Shortcut: {{tl|hab}}. A generic version of the template used to archive [[Wikipedia:Deletion review]] discussions. Used with [[Template:Hidden archive top]] (shortcut {{tl|hat}}), can be used to close a discussion and discourage further editing without removing it completely from the page.
The entire active content of this template is actually just '|}'.
[[Category:Archival templates|Hidden Archiveb]]
</noinclude>
2a9b8br45p20tqi054q27t4gp50ubuo
4676603
4676602
2009-04-17T00:16:31Z
w>Davidgothberg
0
Moving the documentation to a /doc page, since this is a protected page, so anyone can edit the doc, categories and interwikis.
4676603
wikitext
text/x-wiki
<includeonly><!-- [[Template:hab]] --></includeonly>|}<noinclude>
{{pp-template}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
r992j0rsykqdgvdu3isjmfjz0qj8suc
4676604
4676603
2009-08-16T15:03:47Z
w>RockMFR
0
don't need this comment
4676604
wikitext
text/x-wiki
|}<noinclude>
{{pp-template}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
n6ayd255s6o5tq54ur3xrihqjvtvvo3
4676605
4676604
2010-03-13T08:23:49Z
w>MSGJ
0
merged with [[Template:Collapse bottom]]
4676605
wikitext
text/x-wiki
#REDIRECT[[Template:Collapse bottom]]
{{R from merge}}
lcfg90o2lgghktfor3rbmb8u5bf8vw6
4676606
4676605
2011-04-05T12:42:34Z
w>Wifione
0
Undid revision 349577428 by [[Special:Contributions/MSGJ|MSGJ]] ([[User talk:MSGJ|talk]]) Kindly discuss this merge before taking it up
4676606
wikitext
text/x-wiki
|}<noinclude>
{{pp-template}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
n6ayd255s6o5tq54ur3xrihqjvtvvo3
4676607
4676606
2014-09-03T07:01:27Z
w>Callanecc
0
Changed protection level of Template:Hidden archive bottom: [[WP:High-risk templates|Highly visible template]]: Over 6000 transclusions. Allowing template edits, standardise with [[Template:Hidden archive top]] ([Edit=Allow only template editors and admin
4676606
wikitext
text/x-wiki
|}<noinclude>
{{pp-template}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
n6ayd255s6o5tq54ur3xrihqjvtvvo3
4676608
4676607
2015-02-16T02:02:13Z
w>Callanecc
0
Rm pp-template (duplicated in /doc)
4676608
wikitext
text/x-wiki
|}<noinclude>
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
c6mkzr9jns5yx56vok584o84mrgqrls
4676609
4676608
2021-02-28T03:10:35Z
w>MJL
0
Listed for merging with [[:Template:Collapse bottom]]; see [[:Wikipedia:Templates for discussion/Log/2021 February 28#Template:Collapse bottom]].
4676609
wikitext
text/x-wiki
<noinclude>{{Tfm/dated|page=Hidden archive bottom|otherpage=Collapse bottom|link=Wikipedia:Templates for discussion/Log/2021 February 28#Template:Hidden archive bottom|help=off|bigbox={{#invoke:Noinclude|noinclude|text=yes}}}}</noinclude>
|}<noinclude>
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
ei5opqo8o5e7jag0wdgqqy5k6kjxpwd
4676610
4676609
2021-03-08T17:56:40Z
w>Izno
0
[[Wikipedia:Templates for discussion/Log/2021 February 28#Template:Collapse bottom]] closed as keep ([[WP:XFDC#4.0.11|XFDcloser]])
4676610
wikitext
text/x-wiki
|}<noinclude>
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
c6mkzr9jns5yx56vok584o84mrgqrls
4676611
4676610
2026-10-18T02:49:01Z
JJPMaster
3095725
13 revisions imported from [[:w:Template:Hidden_archive_bottom]]: Mass-importing pages: utility templates
4676610
wikitext
text/x-wiki
|}<noinclude>
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
c6mkzr9jns5yx56vok584o84mrgqrls
Transwiki:Hidden archive top
108
486399
4676612
2007-01-10T03:34:17Z
w>Samuel Blanning
0
creating
4676612
wikitext
text/x-wiki
{| class="navbox collapsible collapsed" style="text-align: left; border: 0px; margin-top: 0.2em;"
|-
! style="background-color: #f2dfce;" | {{{reason|This discussion has been archived.}}} Please do not modify it.
|-
| style="text-align:center;" | ''The following is an archived debate. <span style="color:red;">'''Please do not modify it.'''</span>''
|-
| style="border: solid 1px silver; padding: 8px; background-color: white;" |
<noinclude>
|}
Shortcut: {{tl|hat}}. A generic version of the template used to archive [[Wikipedia:Deletion review]] discussions. Used with [[Template:Hidden archive bottom]] (shortcut {{tl|hab}}), can be used to close a discussion and discourage further editing without removing it completely from the page.
The reason for achiving can be changed with the <code><nowiki>reason=</nowiki></code> parameter which defaults to "This discussion has been archived. Please do not modify it."
[[Category:Archival templates]]
</noinclude>
elahu11fh4e9cionyhkdxxt1px098u9
4676613
4676612
2007-01-27T04:45:45Z
w>Trialsanderrors
0
Cat
4676613
wikitext
text/x-wiki
{| class="navbox collapsible collapsed" style="text-align: left; border: 0px; margin-top: 0.2em;"
|-
! style="background-color: #f2dfce;" | {{{reason|This discussion has been archived.}}} Please do not modify it.
|-
| style="text-align:center;" | ''The following is an archived debate. <span style="color:red;">'''Please do not modify it.'''</span>''
|-
| style="border: solid 1px silver; padding: 8px; background-color: white;" |
<noinclude>
|}
Shortcut: {{tl|hat}}. A generic version of the template used to archive [[Wikipedia:Deletion review]] discussions. Used with [[Template:Hidden archive bottom]] (shortcut {{tl|hab}}), can be used to close a discussion and discourage further editing without removing it completely from the page.
The reason for achiving can be changed with the <code><nowiki>reason=</nowiki></code> parameter which defaults to "This discussion has been archived. Please do not modify it."
[[Category:Archival templates|Hidden Archive]]
</noinclude>
ontubsslfac6bmgf5dt106pejdu8s78
4676614
4676613
2007-01-27T14:23:35Z
w>Samuel Blanning
0
encompassing whole reason in variable
4676614
wikitext
text/x-wiki
{| class="navbox collapsible collapsed" style="text-align: left; border: 0px; margin-top: 0.2em;"
|-
! style="background-color: #f2dfce;" | {{{reason|This discussion has been archived. Please do not modify it.}}}
|-
| style="text-align:center;" | ''The following is an archived debate. <span style="color:red;">'''Please do not modify it.'''</span>''
|-
| style="border: solid 1px silver; padding: 8px; background-color: white;" |
<noinclude>
|}
Shortcut: {{tl|hat}}. A generic version of the template used to archive [[Wikipedia:Deletion review]] discussions. Used with [[Template:Hidden archive bottom]] (shortcut {{tl|hab}}), can be used to close a discussion and discourage further editing without removing it completely from the page.
The reason for achiving can be changed with the <code><nowiki>reason=</nowiki></code> parameter which defaults to "This discussion has been archived. Please do not modify it."
[[Category:Archival templates|Hidden Archive]]
</noinclude>
6kua5lubbtn2txn2osibsv8er79pyw6
4676615
4676614
2007-02-17T03:49:46Z
w>NotJackhorkheimer
0
4676615
wikitext
text/x-wiki
{| class="navbox collapsible collapsed" style="text-align: left; border: 0px; margin-top: 0.2em;"
|-
! style="background-color: #f2dfce;" | {{{reason|This discussion has been archived. Please do not modify it.}}}
|-
| style="text-align:center;" | ''The following is an archived debate. <span style="color:red;">'''Please do not modify it.'''</span>''
|-
| style="border: solid 1px silver; padding: 8px; background-color: white;" |
<noinclude>
|}
Shortcut: {{tl|hat}}. A generic version of the template used to archive [[Wikipedia:Deletion review]] discussions. Used with [[Template:Hidden archive bottom]] (shortcut {{tl|hab}}), can be used to close a discussion and discourage further editing without removing it completely from the page.
The reason for archiving can be changed with the <code><nowiki>reason=</nowiki></code> parameter which defaults to "This discussion has been archived. Please do not modify it."
[[Category:Archival templates|Hidden Archive]]
</noinclude>
oalu52hqeoiwqtv8h8qntsohiry39gi
4676616
4676615
2007-12-26T21:48:20Z
w>Nmajdan
0
remove extra line breaks
4676616
wikitext
text/x-wiki
{| class="navbox collapsible collapsed" style="text-align: left; border: 0px; margin-top: 0.2em;"
|-
! style="background-color: #f2dfce;" | {{{reason|This discussion has been archived. Please do not modify it.}}}
|-
| style="text-align:center;" | ''The following is an archived debate. <span style="color:red;">'''Please do not modify it.'''</span>''
|-
| style="border: solid 1px silver; padding: 8px; background-color: white;" |
<noinclude>
|}
Shortcut: {{tl|hat}}. A generic version of the template used to archive [[Wikipedia:Deletion review]] discussions. Used with [[Template:Hidden archive bottom]] (shortcut {{tl|hab}}), can be used to close a discussion and discourage further editing without removing it completely from the page.
The reason for archiving can be changed with the <code><nowiki>reason=</nowiki></code> parameter which defaults to "This discussion has been archived. Please do not modify it."
[[Category:Archival templates|Hidden Archive]]
</noinclude>
a5b69kbe1aaecr81d6omugsj2fxi2xq
4676617
4676616
2008-05-19T19:52:10Z
w>CharlotteWebb
0
4676617
wikitext
text/x-wiki
{| class="navbox collapsible collapsed" style="text-align: left; border: 0px; margin-top: 0.2em;"
|-
! style="background-color: #f2dfce;" | {{{1|{{{reason|This discussion has been archived. Please do not modify it.}}}}}}
|-
| style="text-align:center;" | ''The following is an archived debate. <span style="color:red;">'''Please do not modify it.'''</span>''
|-
| style="border: solid 1px silver; padding: 8px; background-color: white;" |
<noinclude>
|}
Shortcut: {{tl|hat}}. A generic version of the template used to archive [[Wikipedia:Deletion review]] discussions. Used with [[Template:Hidden archive bottom]] (shortcut {{tl|hab}}), can be used to close a discussion and discourage further editing without removing it completely from the page.
The reason for archiving can be changed with the <code><nowiki>reason=</nowiki></code> parameter which defaults to "This discussion has been archived. Please do not modify it."
[[Category:Archival templates|Hidden Archive]]
</noinclude>
46iyyi9ts7ojpal2nz3d8zpw6ll16nk
4676618
4676617
2008-05-19T19:53:17Z
w>CharlotteWebb
0
4676618
wikitext
text/x-wiki
{| class="navbox collapsible collapsed" style="text-align: left; border: 0px; margin-top: 0.2em;"
|-
! style="background-color: #f2dfce;" | {{{1|{{{reason|This discussion has been archived. Please do not modify it.}}}}}}
|-
| style="text-align:center;" | ''{{{2|The following is an archived debate. <span style="color:red;">'''Please do not modify it.'''</span>}}}''
|-
| style="border: solid 1px silver; padding: 8px; background-color: white;" |
<noinclude>
|}
Shortcut: {{tl|hat}}. A generic version of the template used to archive [[Wikipedia:Deletion review]] discussions. Used with [[Template:Hidden archive bottom]] (shortcut {{tl|hab}}), can be used to close a discussion and discourage further editing without removing it completely from the page.
The reason for archiving can be changed with the <code><nowiki>reason=</nowiki></code> parameter which defaults to "This discussion has been archived. Please do not modify it."
[[Category:Archival templates|Hidden Archive]]
</noinclude>
1ji1rlfs5dbl64qzg066qjy78ab2bwe
4676619
4676618
2008-08-06T19:15:16Z
w>CharlotteWebb
0
this makes one bold-face apostrophe if parameter is blank, changing to css instead of ''two apostrophe'' italics
4676619
wikitext
text/x-wiki
{| class="navbox collapsible collapsed" style="text-align: left; border: 0px; margin-top: 0.2em;"
|-
! style="background-color: #f2dfce;" | {{{1|{{{reason|This discussion has been archived. Please do not modify it.}}}}}}
|-
| style="text-align:center; font-style:italic;" | {{{2|The following is an archived debate. <span style="color:red;">'''Please do not modify it.'''</span>}}}
|-
| style="border: solid 1px silver; padding: 8px; background-color: white;" |
<noinclude>
|}
Shortcut: {{tl|hat}}. A generic version of the template used to archive [[Wikipedia:Deletion review]] discussions. Used with [[Template:Hidden archive bottom]] (shortcut {{tl|hab}}), can be used to close a discussion and discourage further editing without removing it completely from the page.
The reason for archiving can be changed with the <code><nowiki>reason=</nowiki></code> parameter which defaults to "This discussion has been archived. Please do not modify it."
[[Category:Archival templates|Hidden Archive]]
</noinclude>
ry5st2fcg8dr3nod759ey5kabw7cwxp
4676620
4676619
2008-08-27T04:18:11Z
w>Scientizzle
0
Protected Template:Hidden archive top: just in case... [edit=sysop:move=sysop]
4676619
wikitext
text/x-wiki
{| class="navbox collapsible collapsed" style="text-align: left; border: 0px; margin-top: 0.2em;"
|-
! style="background-color: #f2dfce;" | {{{1|{{{reason|This discussion has been archived. Please do not modify it.}}}}}}
|-
| style="text-align:center; font-style:italic;" | {{{2|The following is an archived debate. <span style="color:red;">'''Please do not modify it.'''</span>}}}
|-
| style="border: solid 1px silver; padding: 8px; background-color: white;" |
<noinclude>
|}
Shortcut: {{tl|hat}}. A generic version of the template used to archive [[Wikipedia:Deletion review]] discussions. Used with [[Template:Hidden archive bottom]] (shortcut {{tl|hab}}), can be used to close a discussion and discourage further editing without removing it completely from the page.
The reason for archiving can be changed with the <code><nowiki>reason=</nowiki></code> parameter which defaults to "This discussion has been archived. Please do not modify it."
[[Category:Archival templates|Hidden Archive]]
</noinclude>
ry5st2fcg8dr3nod759ey5kabw7cwxp
4676621
4676620
2009-04-17T00:25:45Z
w>Davidgothberg
0
Moving the documentation to a /doc page, so anyone can edit it and add categories and interwikis.
4676621
wikitext
text/x-wiki
{| class="navbox collapsible collapsed" style="text-align: left; border: 0px; margin-top: 0.2em;"
|-
! style="background-color: #f2dfce;" | {{{1|{{{reason|This discussion has been archived. Please do not modify it.}}}}}}
|-
| style="text-align:center; font-style:italic;" | {{{2|The following is an archived debate. <span style="color:red;">'''Please do not modify it.'''</span>}}}
|-
| style="border: solid 1px silver; padding: 8px; background-color: white;" |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{pp-template}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
3ksrtnc5uujni2tg0nfn0om01kjxcw5
4676622
4676621
2009-11-01T17:03:06Z
w>PBS
0
Text on the tak page is refactored not achived.
4676622
wikitext
text/x-wiki
{| class="navbox collapsible collapsed" style="text-align: left; border: 0px; margin-top: 0.2em;"
|-
! style="background-color: #f2dfce;" | {{{1|{{{reason|This discussion has been [[Wikipedia:Refactoring talk pages|refactored|]]. Please do not modify it.}}}}}}
|-
| style="text-align:center; font-style:italic;" | {{{2|The following is a refactored debate. <span style="color:red;">'''Please do not modify it.'''</span>}}}
|-
| style="border: solid 1px silver; padding: 8px; background-color: white;" |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{pp-template}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
c4zgwlxqdgnenjkrpp3mlrnwj147y8p
4676623
4676622
2009-11-01T17:03:41Z
w>PBS
0
4676623
wikitext
text/x-wiki
{| class="navbox collapsible collapsed" style="text-align: left; border: 0px; margin-top: 0.2em;"
|-
! style="background-color: #f2dfce;" | {{{1|{{{reason|This discussion has been [[Wikipedia:Refactoring talk pages|refactored]]. Please do not modify it.}}}}}}
|-
| style="text-align:center; font-style:italic;" | {{{2|The following is a refactored debate. <span style="color:red;">'''Please do not modify it.'''</span>}}}
|-
| style="border: solid 1px silver; padding: 8px; background-color: white;" |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{pp-template}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
qom0pwc8zm3b6yk189tydes6inog41x
4676624
4676623
2009-11-01T18:51:59Z
w>Protonk
0
Reverted to revision 284320654 by [[Special:Contributions/Davidgothberg|Davidgothberg]]; Restoring previous revision per [[WP:BRD]]. This is a non-trivial change and I can imagine multiple objections.. using [[WP:TW|TW]]
4676624
wikitext
text/x-wiki
{| class="navbox collapsible collapsed" style="text-align: left; border: 0px; margin-top: 0.2em;"
|-
! style="background-color: #f2dfce;" | {{{1|{{{reason|This discussion has been archived. Please do not modify it.}}}}}}
|-
| style="text-align:center; font-style:italic;" | {{{2|The following is an archived debate. <span style="color:red;">'''Please do not modify it.'''</span>}}}
|-
| style="border: solid 1px silver; padding: 8px; background-color: white;" |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{pp-template}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
3ksrtnc5uujni2tg0nfn0om01kjxcw5
4676625
4676624
2010-03-01T17:18:13Z
w>MSGJ
0
+mergeto [[Template:Collapse top]], per request
4676625
wikitext
text/x-wiki
<noinclude>{{mergeto|Template:Collapse top}}
</noinclude>{| class="navbox collapsible collapsed" style="text-align: left; border: 0px; margin-top: 0.2em;"
|-
! style="background-color: #f2dfce;" | {{{1|{{{reason|This discussion has been archived. Please do not modify it.}}}}}}
|-
| style="text-align:center; font-style:italic;" | {{{2|The following is an archived debate. <span style="color:red;">'''Please do not modify it.'''</span>}}}
|-
| style="border: solid 1px silver; padding: 8px; background-color: white;" |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
3nsgdn0kcew1tblmsmx5j7x1aa3ltj5
4676626
4676625
2010-03-04T19:58:42Z
w>PBS
0
added argument to mere so discuss links to the discussion
4676626
wikitext
text/x-wiki
<noinclude>{{mergeto|Template:Collapse top|discuss=Template talk:Hidden archive top#Potential merge with Template:Collapse top}}
</noinclude>{| class="navbox collapsible collapsed" style="text-align: left; border: 0px; margin-top: 0.2em;"
|-
! style="background-color: #f2dfce;" | {{{1|{{{reason|This discussion has been archived. Please do not modify it.}}}}}}
|-
| style="text-align:center; font-style:italic;" | {{{2|The following is an archived debate. <span style="color:red;">'''Please do not modify it.'''</span>}}}
|-
| style="border: solid 1px silver; padding: 8px; background-color: white;" |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
tkqlsp29y01t8eusb1lga4wzk9rt9tq
4676627
4676626
2010-03-13T08:22:42Z
w>MSGJ
0
merged with [[Template:Collapse top]]
4676627
wikitext
text/x-wiki
#REDIRECT[[Template:Collapse top]]
{{R from merge}}
hnshc0j6bakyklgar8jlnvec5ksosm3
4676628
4676627
2010-03-15T17:45:20Z
w>Xeno
0
rv, this changes the display from brown to green, and it has an outline around the box, &c. bleh
4676628
wikitext
text/x-wiki
<noinclude>{{mergeto|Template:Collapse top|discuss=Template talk:Hidden archive top#Potential merge with Template:Collapse top}}
</noinclude>{| class="navbox collapsible collapsed" style="text-align: left; border: 0px; margin-top: 0.2em;"
|-
! style="background-color: #f2dfce;" | {{{1|{{{reason|This discussion has been archived. Please do not modify it.}}}}}}
|-
| style="text-align:center; font-style:italic;" | {{{2|The following is an archived debate. <span style="color:red;">'''Please do not modify it.'''</span>}}}
|-
| style="border: solid 1px silver; padding: 8px; background-color: white;" |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
tkqlsp29y01t8eusb1lga4wzk9rt9tq
4676629
4676628
2010-03-28T23:56:11Z
w>Xeno
0
to alleviate talk page concern that this isn't "archiving" in the [[WP:ARCHIVE]] sense
4676629
wikitext
text/x-wiki
<noinclude>{{mergeto|Template:Collapse top|discuss=Template talk:Hidden archive top#Potential merge with Template:Collapse top}}
</noinclude>{| class="navbox collapsible collapsed" style="text-align: left; border: 0px; margin-top: 0.2em;"
|-
! style="background-color: #f2dfce;" | {{{1|{{{reason|This discussion has been closed. Please do not modify it.}}}}}}
|-
| style="text-align:center; font-style:italic;" | {{{2|The following discussion has been closed. <span style="color:red;">'''Please do not modify it.'''</span>}}}
|-
| style="border: solid 1px silver; padding: 8px; background-color: white;" |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
q7xkjdqp0ajhi0vut87awdi4yvdb66v
4676630
4676629
2010-03-29T13:10:06Z
w>Xeno
0
if "closer" then verbiage to read "closed by [[User:closer|closer]]"
4676630
wikitext
text/x-wiki
<noinclude>{{mergeto|Template:Collapse top|discuss=Template talk:Hidden archive top#Potential merge with Template:Collapse top}}
</noinclude>{| class="navbox collapsible collapsed" style="text-align: left; border: 0px; margin-top: 0.2em;"
|-
! style="background-color: #f2dfce;" | {{{1|{{{reason|This discussion has been closed{{#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. Please do not modify it.}}}}}}
|-
| style="text-align:center; font-style:italic;" | {{{2|The following discussion has been closed. <span style="color:red;">'''Please do not modify it.'''</span>}}}
|-
| style="border: solid 1px silver; padding: 8px; background-color: white;" |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
cmmvhyj5rdk7icjaa2u5rl0tzjb34xg
4676631
4676630
2010-03-29T13:11:10Z
w>Xeno
0
sp
4676631
wikitext
text/x-wiki
<noinclude>{{mergeto|Template:Collapse top|discuss=Template talk:Hidden archive top#Potential merge with Template:Collapse top}}
</noinclude>{| class="navbox collapsible collapsed" style="text-align: left; border: 0px; margin-top: 0.2em;"
|-
! style="background-color: #f2dfce;" | {{{1|{{{reason|This discussion has been closed{{#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. Please do not modify it.}}}}}}
|-
| style="text-align:center; font-style:italic;" | {{{2|The following discussion has been closed. <span style="color:red;">'''Please do not modify it.'''</span>}}}
|-
| style="border: solid 1px silver; padding: 8px; background-color: white;" |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
o57oodn7iypvsm6g7ev4k4nuubuuj9c
4676632
4676631
2010-06-03T19:58:13Z
w>Xeno
0
closer= for both text fields
4676632
wikitext
text/x-wiki
<noinclude>{{mergeto|Template:Collapse top|discuss=Template talk:Hidden archive top#Potential merge with Template:Collapse top}}
</noinclude>{| class="navbox collapsible collapsed" style="text-align: left; border: 0px; margin-top: 0.2em;"
|-
! style="background-color: #f2dfce;" | {{{1|{{{reason|This discussion has been closed{{#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. Please do not modify it.}}}}}}
|-
| style="text-align:center; font-style:italic;" | {{{2|The following discussion has been closed{{#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. <span style="color:red;">'''Please do not modify it.'''</span>}}}
|-
| style="border: solid 1px silver; padding: 8px; background-color: white;" |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
83juocj5vlpa11femfd8p7cen7o7wk7
4676633
4676632
2010-09-23T18:46:16Z
w>TheDJ
0
tfd
4676633
wikitext
text/x-wiki
<noinclude>{{mergeto|Template:Collapse top|discuss=Template talk:Hidden archive top#Potential merge with Template:Collapse top}}
{{#ifeq:{{NAMESPACE}}|Template
|{{Ombox
| type = delete
| image = none
| small = no
| text = <div>'''The [[Help:Template|template]] ''[[Template:{{ucfirst:{{PAGENAME}}}}|{{ucfirst:{{PAGENAME}}}}]]'' is being considered for deletion in accordance with Wikipedia's [[Wikipedia:Deletion policy|deletion policy]].'''<p>Please discuss this matter at [[Wikipedia:Templates for discussion#Template:{{ucfirst:{{PAGENAME}}}}|'''this template's entry''']] at templates for discussion to help reach a consensus.
----
''<small class="plainlinks" style="line-height:1.3em;">[[Wikipedia:Maintenance|Maintenance]] use only:<br>1. Place {{tlx|Tfd}} on the template(s) nominated for deletion.<br>2. [{{fullurl:Wikipedia:Templates for discussion/Log/{{#time: Y F j}}|action=edit&editintro=Wikipedia:Templates_for_discussion/editnotice§ion=1}} Edit the TfD log] to create the discussion entry.<br>3. Please consider notifying the [{{fullurl:{{FULLPAGENAME}}|action=history}} author(s)] by placing {{nowrap|{{tlx|Tfdnotice|{{PAGENAME}}|{{#ifeq:{{PAGENAME}}|{{PAGENAME}}||{{{page}}}}}|subst=yes}} <nowiki>~~~~</nowiki>}} on their talk page(s).</small>''</div>
}}{{cat handler
| all = [[Category:Templates for deletion|{{PAGENAME}}]]
| nocat =
| category2 = ¬
}}
|{{#switch:{{lc:{{{type}}}}}
<!-- Tiny version, used if type=tiny -->
|tiny =
<span style="padding: 0; font-size: xx-small; color: #000000; border: 1px solid #aaaaaa; background-color: #f9f9f9;">'''[[Wikipedia:Templates for discussion#Template:{{ucfirst:{{PAGENAME}}}}|‹See Tfd›]]'''</span>
<!-- Regular inline version, used if type=inline -->
|inline =
<span style="padding: 0; font-size: xx-small; color: #000; border: 1px solid #aaa; background-color: #f9f9f9;">‹The [[Help:Template|template]] ''[[Template:{{ucfirst:{{PAGENAME}}}}|{{ucfirst:{{PAGENAME}}}}]]'' is being [[Wikipedia:Templates for discussion#Template:{{ucfirst:{{PAGENAME}}}}|considered for deletion]].›</span>
<!-- Sidebar version, used if type=sidebar-->
|infobox|box|sidebar=
<div class="boilerplate metadata plainlinks" id="tfd" style="background-color: transparent; padding: 0; font-size:xx-small; color:#000000; text-align: center; position: relative; float: right; border-bottom: 1px solid #AAAAAA; width: {{px||27em}}">‹ The [[Help:Template|template]] {{#if:|(''[[Template:{{ucfirst:{{{1}}}}}|{{{1}}}]]'')|}} is being [[Wikipedia:Templates for discussion#Template:{{ucfirst:{{PAGENAME}}}}|considered for deletion]]. ›</div>
<!-- No transclusion, used if type=disabled-->
|disabled=
<!-- Default version, used in all other cases -->
|#default = <div class="boilerplate metadata plainlinks" id="tfd" style="background-color: transparent; padding: 0; font-size:xx-small; color:#000000; text-align: center; border-bottom:1px solid #AAAAAA;">‹ The [[Help:Template|template]] below {{#if:|(''[[Template:{{{1}}}|{{{1}}}]]'')|}} is being considered for deletion. See [[Wikipedia:Templates for discussion#Template:{{ucfirst:{{PAGENAME}}}}|templates for discussion]] to help reach a consensus.›</div>
}}
}}
</noinclude>{| class="navbox collapsible collapsed" style="text-align: left; border: 0px; margin-top: 0.2em;"
|-
! style="background-color: #f2dfce;" | {{{1|{{{reason|This discussion has been closed{{#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. Please do not modify it.}}}}}}
|-
| style="text-align:center; font-style:italic;" | {{{2|The following discussion has been closed{{#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. <span style="color:red;">'''Please do not modify it.'''</span>}}}
|-
| style="border: solid 1px silver; padding: 8px; background-color: white;" |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
g9q0yxxx18ukqyhdwh0v5gijd6ru4t6
4676634
4676633
2010-09-23T18:49:01Z
w>TheDJ
0
tfd inline
4676634
wikitext
text/x-wiki
<noinclude>{{mergeto|Template:Collapse top|discuss=Template talk:Hidden archive top#Potential merge with Template:Collapse top}}
</noinclude>{{Tfd|Hidden archive top|type=inline}}
{| class="navbox collapsible collapsed" style="text-align: left; border: 0px; margin-top: 0.2em;"
|-
! style="background-color: #f2dfce;" | {{{1|{{{reason|This discussion has been closed{{#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. Please do not modify it.}}}}}}
|-
| style="text-align:center; font-style:italic;" | {{{2|The following discussion has been closed{{#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. <span style="color:red;">'''Please do not modify it.'''</span>}}}
|-
| style="border: solid 1px silver; padding: 8px; background-color: white;" |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
e14a1xm18b3yklnika5g56ujqn2c03m
4676635
4676634
2010-09-24T02:42:50Z
w>NativeForeigner
0
closed debate
4676635
wikitext
text/x-wiki
<noinclude>{{mergeto|Template:Collapse top|discuss=Template talk:Hidden archive top#Potential merge with Template:Collapse top}}
</noinclude>
{| class="navbox collapsible collapsed" style="text-align: left; border: 0px; margin-top: 0.2em;"
|-
! style="background-color: #f2dfce;" | {{{1|{{{reason|This discussion has been closed{{#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. Please do not modify it.}}}}}}
|-
| style="text-align:center; font-style:italic;" | {{{2|The following discussion has been closed{{#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. <span style="color:red;">'''Please do not modify it.'''</span>}}}
|-
| style="border: solid 1px silver; padding: 8px; background-color: white;" |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
pyltkf0huo7kcjaunitjgek69w8rnge
4676636
4676635
2011-01-28T04:34:28Z
w>Magog the Ogre
0
safesubst
4676636
wikitext
text/x-wiki
<noinclude>{{mergeto|Template:Collapse top|discuss=Template talk:Hidden archive top#Potential merge with Template:Collapse top}}
</noinclude>
{| class="navbox collapsible collapsed" style="text-align: left; border: 0px; margin-top: 0.2em;"
|-
! style="background-color: #f2dfce;" | {{{1|{{{reason|This discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. Please do not modify it.}}}}}}
|-
| style="text-align:center; font-style:italic;" | {{{2|The following discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. <span style="color:red;">'''Please do not modify it.'''</span>}}}
|-
| style="border: solid 1px silver; padding: 8px; background-color: white;" |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
45l7o6hj9yx49owil74yf2flsi5uvfm
4676637
4676636
2011-05-18T08:32:25Z
w>MSGJ
0
discussion stale
4676637
wikitext
text/x-wiki
{| class="navbox collapsible collapsed" style="text-align: left; border: 0px; margin-top: 0.2em;"
|-
! style="background-color: #f2dfce;" | {{{1|{{{reason|This discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. Please do not modify it.}}}}}}
|-
| style="text-align:center; font-style:italic;" | {{{2|The following discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. <span style="color:red;">'''Please do not modify it.'''</span>}}}
|-
| style="border: solid 1px silver; padding: 8px; background-color: white;" |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
nmi0bt19v8n0m0smotj2e0m3a50vsj7
4676638
4676637
2011-12-06T23:18:42Z
w>WOSlinker
0
text-align:center; for header
4676638
wikitext
text/x-wiki
{| class="navbox collapsible collapsed" style="text-align: left; border: 0px; margin-top: 0.2em;"
|-
! style="text-align:center; background-color:#f2dfce;" | {{{1|{{{reason|This discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. Please do not modify it.}}}}}}
|-
| style="text-align:center; font-style:italic;" | {{{2|The following discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. <span style="color:red;">'''Please do not modify it.'''</span>}}}
|-
| style="border: solid 1px silver; padding: 8px; background-color: white;" |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
1446aonoyl4y3bs91wpkwj7c131xxvs
4676639
4676638
2011-12-12T11:11:57Z
w>Edokter
0
class="navbox-title"
4676639
wikitext
text/x-wiki
{| class="navbox collapsible collapsed" style="text-align: left; border: 0px; margin-top: 0.2em;"
|-
! class="navbox-title" style="text-align:center; background-color:#f2dfce;" | {{{1|{{{reason|This discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. Please do not modify it.}}}}}}
|-
| style="text-align:center; font-style:italic;" | {{{2|The following discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. <span style="color:red;">'''Please do not modify it.'''</span>}}}
|-
| style="border: solid 1px silver; padding: 8px; background-color: white;" |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
fctygkw0ua2o6cqyic3iedb9ay4w7y8
4676640
4676639
2011-12-12T14:21:16Z
w>Edokter
0
class="navbox-group"
4676640
wikitext
text/x-wiki
{| class="navbox collapsible collapsed" style="text-align: left; border: 0px; margin-top: 0.2em;"
|-
! style="text-align:center; background-color:#f2dfce;" | {{{1|{{{reason|This discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. Please do not modify it.}}}}}}
|-
| style="text-align:center; font-style:italic;" | {{{2|The following discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. <span style="color:red;">'''Please do not modify it.'''</span>}}}
|-
| style="border: solid 1px silver; padding: 8px; background-color: white;" |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
1446aonoyl4y3bs91wpkwj7c131xxvs
4676641
4676640
2011-12-12T14:22:30Z
w>Edokter
0
Null edit: Headers fixed in CSS
4676641
wikitext
text/x-wiki
{| class="navbox collapsible collapsed" style="text-align: left; border: 0px; margin-top: 0.2em;"
|-
! class="navbox-title" style="text-align:center; background-color:#f2dfce;" | {{{1|{{{reason|This discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. Please do not modify it.}}}}}}
|-
| style="text-align:center; font-style:italic;" | {{{2|The following discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. <span style="color:red;">'''Please do not modify it.'''</span>}}}
|-
| style="border: solid 1px silver; padding: 8px; background-color: white;" |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
0fq5z8q8vngc7wsiuxscrrze69iyt03
4676642
4676641
2014-08-01T17:25:20Z
w>Mike V
0
Changed protection level of Template:Hidden archive top: [[WP:High-risk templates|Highly visible template]]: per [[WP:RFPP]] request ([Edit=Allow only template editors and admins] (indefinite) [Move=Allow only administrators] (indefinite))
4676641
wikitext
text/x-wiki
{| class="navbox collapsible collapsed" style="text-align: left; border: 0px; margin-top: 0.2em;"
|-
! class="navbox-title" style="text-align:center; background-color:#f2dfce;" | {{{1|{{{reason|This discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. Please do not modify it.}}}}}}
|-
| style="text-align:center; font-style:italic;" | {{{2|The following discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. <span style="color:red;">'''Please do not modify it.'''</span>}}}
|-
| style="border: solid 1px silver; padding: 8px; background-color: white;" |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
0fq5z8q8vngc7wsiuxscrrze69iyt03
4676643
4676642
2014-08-04T11:45:17Z
w>Paine Ellsworth
0
per edit request on talk page
4676643
wikitext
text/x-wiki
{| class="navbox collapsible collapsed" style="font-size:100%; margin-top: 0.2em;"
|-
! class="navbox-title" style="background-color:#f2dfce;" | {{{1|{{{reason|This discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. Please do not modify it.}}}}}}
|-
| style="font-style:italic;" | {{{2|The following discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. <span style="color:red;">'''Please do not modify it.'''</span>}}}
|-
| style="border: solid 1px silver; padding: 8px; background-color: #fcf4ef; text-align: left;" |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
7swbelunjangfnve3rzff00bdc5kl6u
4676644
4676643
2016-02-16T11:24:31Z
w>MSGJ
0
mw-collapsible class
4676644
wikitext
text/x-wiki
{| class="navbox mw-collapsible mw-collapsed" style="font-size:100%; margin-top: 0.2em;"
|-
! class="navbox-title" style="background-color:#f2dfce;" | {{{1|{{{reason|This discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. Please do not modify it.}}}}}}
|-
| style="font-style:italic;" | {{{2|The following discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. <span style="color:red;">'''Please do not modify it.'''</span>}}}
|-
| style="border: solid 1px silver; padding: 8px; background-color: #fcf4ef; text-align: left;" |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
kblyzcku0q3nnegyh9x70zaokqj3skt
4676645
4676644
2017-03-10T11:43:41Z
w>TheDJ
0
This is not a navigation box.
4676645
wikitext
text/x-wiki
{| class="mw-collapsible mw-collapsed" style="box-sizing: border-box; border: 1px solid #a2a9b1; width: 100%;clear: both;text-align: center; padding: 1px;margin: 0.2em auto 0;font-size:100%;
|-
! style="padding: 0.25em 1em;line-height: 1.5em;text-align: center;background-color:#f2dfce;" | {{{1|{{{reason|This discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. Please do not modify it.}}}}}}
|-
| style="font-style:italic;" | {{{2|The following discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. <span style="color:red;">'''Please do not modify it.'''</span>}}}
|-
| style="border: solid 1px silver; padding: 8px; background-color: #fcf4ef; text-align: left;" |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
jne0rlyrthg02qesp67xm1nayc577g6
4676646
4676645
2017-11-06T16:48:59Z
w>SMcCandlish
0
add |result as alias of |reason so we don't have to remember which of these boxes uses what parameter name for the same thing.
4676646
wikitext
text/x-wiki
{| class="mw-collapsible mw-collapsed" style="box-sizing: border-box; border: 1px solid #a2a9b1; width: 100%;clear: both;text-align: center; padding: 1px;margin: 0.2em auto 0;font-size:100%;
|-
! style="padding: 0.25em 1em;line-height: 1.5em;text-align: center;background-color:#f2dfce;" | {{{1|{{{reason|{{{result|This discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. Please do not modify it.}}}}}}}}}
|-
| style="font-style:italic;" | {{{2|The following discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. <span style="color:red;">'''Please do not modify it.'''</span>}}}
|-
| style="border: solid 1px silver; padding: 8px; background-color: #fcf4ef; text-align: left;" |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
rw8djnxwyb3aqawgekh3j8mm749ee52
4676647
4676646
2018-01-02T15:16:47Z
w>PBS
0
Inserted {{{{{|safesubst:}}}#if:{{{expand|{{{collapse|}}}}}}||mw-collapsed}}. Copied from [[template:Collapse top]] so that when placed into "/archive n" the text can be expanded and so found when searching archives
4676647
wikitext
text/x-wiki
{| class="mw-collapsible {{{{{|safesubst:}}}#if:{{{expand|{{{collapse|}}}}}}||mw-collapsed}}" style="box-sizing: border-box; border: 1px solid #a2a9b1; width: 100%;clear: both;text-align: center; padding: 1px;margin: 0.2em auto 0;font-size:100%;
|-
! style="padding: 0.25em 1em;line-height: 1.5em;text-align: center;background-color:#f2dfce;" | {{{1|{{{reason|{{{result|This discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. Please do not modify it.}}}}}}}}}
|-
| style="font-style:italic;" | {{{2|The following discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. <span style="color:red;">'''Please do not modify it.'''</span>}}}
|-
| style="border: solid 1px silver; padding: 8px; background-color: #fcf4ef; text-align: left;" |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
m0aahtycskhgfb2l8twyiryql5hzne4
4676648
4676647
2022-01-11T00:50:20Z
w>Izno
0
add class
4676648
wikitext
text/x-wiki
{| class="hidden-archive-top mw-collapsible {{{{{|safesubst:}}}#if:{{{expand|{{{collapse|}}}}}}||mw-collapsed}}" style="box-sizing: border-box; border: 1px solid #a2a9b1; width: 100%;clear: both;text-align: center; padding: 1px;margin: 0.2em auto 0;font-size:100%;
|-
! style="padding: 0.25em 1em;line-height: 1.5em;text-align: center;background-color:#f2dfce;" | {{{1|{{{reason|{{{result|This discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. Please do not modify it.}}}}}}}}}
|-
| style="font-style:italic;" | {{{2|The following discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. <span style="color:red;">'''Please do not modify it.'''</span>}}}
|-
| style="border: solid 1px silver; padding: 8px; background-color: #fcf4ef; text-align: left;" |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
st7mn77h1q5w7f27kpz1ndewwlqt4e8
4676649
4676648
2022-01-11T00:50:39Z
w>Izno
0
rm -top
4676649
wikitext
text/x-wiki
{| class="hidden-archive mw-collapsible {{{{{|safesubst:}}}#if:{{{expand|{{{collapse|}}}}}}||mw-collapsed}}" style="box-sizing: border-box; border: 1px solid #a2a9b1; width: 100%;clear: both;text-align: center; padding: 1px;margin: 0.2em auto 0;font-size:100%;
|-
! style="padding: 0.25em 1em;line-height: 1.5em;text-align: center;background-color:#f2dfce;" | {{{1|{{{reason|{{{result|This discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. Please do not modify it.}}}}}}}}}
|-
| style="font-style:italic;" | {{{2|The following discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. <span style="color:red;">'''Please do not modify it.'''</span>}}}
|-
| style="border: solid 1px silver; padding: 8px; background-color: #fcf4ef; text-align: left;" |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
3hn07hzv8ddvpf504in0k7hyruxok0h
4676650
4676649
2023-04-07T02:02:26Z
w>Izno
0
per tech news
4676650
wikitext
text/x-wiki
{| class="hidden-archive mw-collapsible mw-archivedtalk {{{{{|safesubst:}}}#if:{{{expand|{{{collapse|}}}}}}||mw-collapsed}}" style="box-sizing: border-box; border: 1px solid #a2a9b1; width: 100%;clear: both;text-align: center; padding: 1px;margin: 0.2em auto 0;font-size:100%;
|-
! style="padding: 0.25em 1em;line-height: 1.5em;text-align: center;background-color:#f2dfce;" | {{{1|{{{reason|{{{result|This discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. Please do not modify it.}}}}}}}}}
|-
| style="font-style:italic;" | {{{2|The following discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. <span style="color:red;">'''Please do not modify it.'''</span>}}}
|-
| style="border: solid 1px silver; padding: 8px; background-color: #fcf4ef; text-align: left;" |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
lliiq3g6ubgs0odewo4ahmcuyoc8bpg
4676651
4676650
2024-10-14T16:53:46Z
w>Matrix
0
add dark mode compatibility with ifsubsts and related stuff similar to [[Template:Collapse top]]
4676651
wikitext
text/x-wiki
{{ safesubst:<noinclude/>ifsubst||<templatestyles src="Hidden archive top/styles.css" />}}
{| class="hidden-archive mw-collapsible mw-archivedtalk {{{{{|safesubst:}}}#if:{{{expand|{{{collapse|}}}}}}||mw-collapsed}}" {{ safesubst:<noinclude/>ifsubst|1=style="box-sizing: border-box; border: 1px solid #a2a9b1; width: 100%;clear: both;text-align: center; padding: 1px;margin: 0.2em auto 0;font-size:100%;"}}
|-
! class="hat-header" {{ safesubst:<noinclude/>ifsubst|1=style="padding: 0.25em 1em;line-height: 1.5em;text-align: center;background-color:#f2dfce;color: black"}} | {{{1|{{{reason|{{{result|This discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. Please do not modify it.}}}}}}}}}
|-
| style="font-style:italic;" | {{{2|The following discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. <span style="color:var(--color-error, red);">'''Please do not modify it.'''</span>}}}
|-
| class="hat-content" {{ safesubst:<noinclude/>ifsubst|1=style="border: solid 1px silver; padding: 8px; background-color: var(--background-color-error-subtle, #ffe9e5); color: inherit; text-align: left;"}} |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
lsomlio9qlcp2j1ubnacnd2oioqti3l
4676652
4676651
2025-09-08T19:26:29Z
w>Pppery
0
Add role
4676652
wikitext
text/x-wiki
{{ safesubst:<noinclude/>ifsubst||<templatestyles src="Hidden archive top/styles.css" />}}
{| role="presentation" class="hidden-archive mw-collapsible mw-archivedtalk {{{{{|safesubst:}}}#if:{{{expand|{{{collapse|}}}}}}||mw-collapsed}}" {{ safesubst:<noinclude/>ifsubst|1=style="box-sizing: border-box; border: 1px solid #a2a9b1; width: 100%;clear: both;text-align: center; padding: 1px;margin: 0.2em auto 0;font-size:100%;"}}
|-
! class="hat-header" {{ safesubst:<noinclude/>ifsubst|1=style="padding: 0.25em 1em;line-height: 1.5em;text-align: center;background-color:#f2dfce;color: black"}} | {{{1|{{{reason|{{{result|This discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. Please do not modify it.}}}}}}}}}
|-
| style="font-style:italic;" | {{{2|The following discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. <span style="color:var(--color-error, red);">'''Please do not modify it.'''</span>}}}
|-
| class="hat-content" {{ safesubst:<noinclude/>ifsubst|1=style="border: solid 1px silver; padding: 8px; background-color: var(--background-color-error-subtle, #ffe9e5); color: inherit; text-align: left;"}} |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
cq9kx8hbfo26588en8k1abtglg9ri4d
4676653
4676652
2025-09-11T11:35:26Z
w>Pigsonthewing
0
Listed for merging with [[:Template:Collapse top]]; see [[:Wikipedia:Templates for discussion/Log/2025 September 11#Template:Collapse top]].
4676653
wikitext
text/x-wiki
{{Tfm/dated|page=Hidden archive top|otherpage=Collapse top|link=Wikipedia:Templates for discussion/Log/2025 September 11#Template:Hidden archive top|type=disabled|help=off|bigbox={{#invoke:Noinclude|noinclude|text=yes}}}}
{{ safesubst:<noinclude/>ifsubst||<templatestyles src="Hidden archive top/styles.css" />}}
{| role="presentation" class="hidden-archive mw-collapsible mw-archivedtalk {{{{{|safesubst:}}}#if:{{{expand|{{{collapse|}}}}}}||mw-collapsed}}" {{ safesubst:<noinclude/>ifsubst|1=style="box-sizing: border-box; border: 1px solid #a2a9b1; width: 100%;clear: both;text-align: center; padding: 1px;margin: 0.2em auto 0;font-size:100%;"}}
|-
! class="hat-header" {{ safesubst:<noinclude/>ifsubst|1=style="padding: 0.25em 1em;line-height: 1.5em;text-align: center;background-color:#f2dfce;color: black"}} | {{{1|{{{reason|{{{result|This discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. Please do not modify it.}}}}}}}}}
|-
| style="font-style:italic;" | {{{2|The following discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. <span style="color:var(--color-error, red);">'''Please do not modify it.'''</span>}}}
|-
| class="hat-content" {{ safesubst:<noinclude/>ifsubst|1=style="border: solid 1px silver; padding: 8px; background-color: var(--background-color-error-subtle, #ffe9e5); color: inherit; text-align: left;"}} |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
cq0wciiyucjjrukrgx3n2330bnhji38
4676654
4676653
2025-09-20T14:12:41Z
w>Explicit
0
[[Wikipedia:Templates for discussion/Log/2025 September 11#Template:Collapse top]] closed as keep ([[WP:XFDC#4.0.16|XFDcloser]])
4676654
wikitext
text/x-wiki
{{ safesubst:<noinclude/>ifsubst||<templatestyles src="Hidden archive top/styles.css" />}}
{| role="presentation" class="hidden-archive mw-collapsible mw-archivedtalk {{{{{|safesubst:}}}#if:{{{expand|{{{collapse|}}}}}}||mw-collapsed}}" {{ safesubst:<noinclude/>ifsubst|1=style="box-sizing: border-box; border: 1px solid #a2a9b1; width: 100%;clear: both;text-align: center; padding: 1px;margin: 0.2em auto 0;font-size:100%;"}}
|-
! class="hat-header" {{ safesubst:<noinclude/>ifsubst|1=style="padding: 0.25em 1em;line-height: 1.5em;text-align: center;background-color:#f2dfce;color: black"}} | {{{1|{{{reason|{{{result|This discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. Please do not modify it.}}}}}}}}}
|-
| style="font-style:italic;" | {{{2|The following discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. <span style="color:var(--color-error, red);">'''Please do not modify it.'''</span>}}}
|-
| class="hat-content" {{ safesubst:<noinclude/>ifsubst|1=style="border: solid 1px silver; padding: 8px; background-color: var(--background-color-error-subtle, #ffe9e5); color: inherit; text-align: left;"}} |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
cq9kx8hbfo26588en8k1abtglg9ri4d
4676655
4676654
2026-08-12T03:34:21Z
w>Paine Ellsworth
0
update
4676655
wikitext
text/x-wiki
{{ safesubst:<noinclude/>ifsubst||<templatestyles src="Hidden archive top/styles.css" />}}
{| role="presentation" class="hidden-archive mw-collapsible mw-archivedtalk {{{{{|safesubst:}}}#if:{{{expand|{{{collapse|}}}}}}||mw-collapsed}}" {{ safesubst:<noinclude/>ifsubst|1=style="box-sizing: border-box; border: 1px solid #a2a9b1; width: 100%;clear: both;text-align: center; padding: 1px;margin: 0.2em auto 0;font-size:100%;"}}
|-
! class="hat-header" {{ safesubst:<noinclude/>ifsubst|1=style="padding: 0.25em 1em;line-height: 1.5em;text-align: center;background-color:#f2dfce;color: black"}} | {{{1|{{{reason|{{{result|This discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. Please do not modify it.}}}}}}}}}
|-
| style="font-style:italic;" | {{{2|The following discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. <span style="color:var(--color-error, red);">'''Please do not modify it.'''</span>}}}
|-
| class="hat-content" {{ safesubst:<noinclude/>ifsubst|1=style="border: solid 1px silver; padding: 8px; background-color: var(--background-color-error-subtle, #ffe9e5); color: inherit; text-align: left;"}} |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{documentation}}
<!-- Add categories to the /doc subpage; interwikis go to Wikidata, thank you! -->
</noinclude>
8l1rz4kpv8omct7ec6a3opmu83tkswz
4676656
4676655
2026-10-18T02:49:04Z
JJPMaster
3095725
44 revisions imported from [[:w:Template:Hidden_archive_top]]: Mass-importing pages: utility templates
4676655
wikitext
text/x-wiki
{{ safesubst:<noinclude/>ifsubst||<templatestyles src="Hidden archive top/styles.css" />}}
{| role="presentation" class="hidden-archive mw-collapsible mw-archivedtalk {{{{{|safesubst:}}}#if:{{{expand|{{{collapse|}}}}}}||mw-collapsed}}" {{ safesubst:<noinclude/>ifsubst|1=style="box-sizing: border-box; border: 1px solid #a2a9b1; width: 100%;clear: both;text-align: center; padding: 1px;margin: 0.2em auto 0;font-size:100%;"}}
|-
! class="hat-header" {{ safesubst:<noinclude/>ifsubst|1=style="padding: 0.25em 1em;line-height: 1.5em;text-align: center;background-color:#f2dfce;color: black"}} | {{{1|{{{reason|{{{result|This discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. Please do not modify it.}}}}}}}}}
|-
| style="font-style:italic;" | {{{2|The following discussion has been closed{{{{{|safesubst:}}}#if: {{{closer|}}}| by [[User:{{{closer}}}|{{{closer}}}]]}}. <span style="color:var(--color-error, red);">'''Please do not modify it.'''</span>}}}
|-
| class="hat-content" {{ safesubst:<noinclude/>ifsubst|1=style="border: solid 1px silver; padding: 8px; background-color: var(--background-color-error-subtle, #ffe9e5); color: inherit; text-align: left;"}} |
<noinclude>
|} <!-- Not a mistake, it is needed to close the table above. -->
{{documentation}}
<!-- Add categories to the /doc subpage; interwikis go to Wikidata, thank you! -->
</noinclude>
8l1rz4kpv8omct7ec6a3opmu83tkswz
Transwiki:Hidden archive top/styles.css
108
486400
4676657
2024-10-14T16:40:51Z
w>Matrix
0
add styles
4676657
sanitized-css
text/css
.hidden-archive {
box-sizing: border-box;
border: 1px solid #a2a9b1;
width: 100%;
clear: both;
text-align: center;
padding: 1px;
margin: 0.2em auto 0;
font-size:100%;
}
.hat-header {
padding: 0.25em 1em;
line-height: 1.5em;
text-align: center;
background-color: #f2dfce;
color: inherit;
}
.hat-content {
border: solid 1px silver;
padding: 8px;
background-color: #fff4f2;
color: inherit;
text-align: left;
}
@media screen {
html.skin-theme-clientpref-night .hat-header {
background-color: #492b13;
}
html.skin-theme-clientpref-night .hat-content {
background-color: #391c19;
}
}
@media screen and (prefers-color-scheme: dark) {
html.skin-theme-clientpref-os .hat-header {
background-color: #492b13;
}
html.skin-theme-clientpref-os .hat-content {
background-color: #391c19;
}
}
1dutcgv08gmxg7k2uo8qu2rdy0ay0oz
4676658
4676657
2024-10-14T18:00:29Z
w>MusikBot II
0
Protected "[[Template:Hidden archive top/styles.css]]": [[Wikipedia:High-risk templates|High-risk template or module]]: 1238 transclusions ([[User:MusikBot II/TemplateProtector|more info]]) ([Edit=Require autoconfirmed or confirmed access] (indefinite))
4676657
sanitized-css
text/css
.hidden-archive {
box-sizing: border-box;
border: 1px solid #a2a9b1;
width: 100%;
clear: both;
text-align: center;
padding: 1px;
margin: 0.2em auto 0;
font-size:100%;
}
.hat-header {
padding: 0.25em 1em;
line-height: 1.5em;
text-align: center;
background-color: #f2dfce;
color: inherit;
}
.hat-content {
border: solid 1px silver;
padding: 8px;
background-color: #fff4f2;
color: inherit;
text-align: left;
}
@media screen {
html.skin-theme-clientpref-night .hat-header {
background-color: #492b13;
}
html.skin-theme-clientpref-night .hat-content {
background-color: #391c19;
}
}
@media screen and (prefers-color-scheme: dark) {
html.skin-theme-clientpref-os .hat-header {
background-color: #492b13;
}
html.skin-theme-clientpref-os .hat-content {
background-color: #391c19;
}
}
1dutcgv08gmxg7k2uo8qu2rdy0ay0oz
4676659
4676658
2024-10-22T17:59:53Z
w>MusikBot II
0
Changed protection settings for "[[Template:Hidden archive top/styles.css]]": [[Wikipedia:High-risk templates|High-risk template or module]]: 12795 transclusions ([[User:MusikBot II/TemplateProtector|more info]]) ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
4676657
sanitized-css
text/css
.hidden-archive {
box-sizing: border-box;
border: 1px solid #a2a9b1;
width: 100%;
clear: both;
text-align: center;
padding: 1px;
margin: 0.2em auto 0;
font-size:100%;
}
.hat-header {
padding: 0.25em 1em;
line-height: 1.5em;
text-align: center;
background-color: #f2dfce;
color: inherit;
}
.hat-content {
border: solid 1px silver;
padding: 8px;
background-color: #fff4f2;
color: inherit;
text-align: left;
}
@media screen {
html.skin-theme-clientpref-night .hat-header {
background-color: #492b13;
}
html.skin-theme-clientpref-night .hat-content {
background-color: #391c19;
}
}
@media screen and (prefers-color-scheme: dark) {
html.skin-theme-clientpref-os .hat-header {
background-color: #492b13;
}
html.skin-theme-clientpref-os .hat-content {
background-color: #391c19;
}
}
1dutcgv08gmxg7k2uo8qu2rdy0ay0oz
4676660
4676659
2024-11-09T19:11:57Z
w>Pppery
0
/* {{pp-template}} */
4676660
sanitized-css
text/css
/* {{pp-template}} */
.hidden-archive {
box-sizing: border-box;
border: 1px solid #a2a9b1;
width: 100%;
clear: both;
text-align: center;
padding: 1px;
margin: 0.2em auto 0;
font-size:100%;
}
.hat-header {
padding: 0.25em 1em;
line-height: 1.5em;
text-align: center;
background-color: #f2dfce;
color: inherit;
}
.hat-content {
border: solid 1px silver;
padding: 8px;
background-color: #fff4f2;
color: inherit;
text-align: left;
}
@media screen {
html.skin-theme-clientpref-night .hat-header {
background-color: #492b13;
}
html.skin-theme-clientpref-night .hat-content {
background-color: #391c19;
}
}
@media screen and (prefers-color-scheme: dark) {
html.skin-theme-clientpref-os .hat-header {
background-color: #492b13;
}
html.skin-theme-clientpref-os .hat-content {
background-color: #391c19;
}
}
j9csjidgmyoljiqys6ocjm4b5ll8yh4
4676661
4676660
2026-10-15T06:01:13Z
w>Axolitl
0
Use variable border colors for dark mode
4676661
sanitized-css
text/css
/* {{pp-template}} */
.hidden-archive {
box-sizing: border-box;
border: 1px solid var(--border-color-base, #a2a9b1);
width: 100%;
clear: both;
text-align: center;
padding: 1px;
margin: 0.2em auto 0;
font-size:100%;
}
.hat-header {
padding: 0.25em 1em;
line-height: 1.5em;
text-align: center;
background-color: #f2dfce;
color: inherit;
}
.hat-content {
border: solid 1px var(--border-color-subtle, #c8ccd1);
padding: 8px;
background-color: #fff4f2;
color: inherit;
text-align: left;
}
@media screen {
html.skin-theme-clientpref-night .hat-header {
background-color: #492b13;
}
html.skin-theme-clientpref-night .hat-content {
background-color: #391c19;
}
}
@media screen and (prefers-color-scheme: dark) {
html.skin-theme-clientpref-os .hat-header {
background-color: #492b13;
}
html.skin-theme-clientpref-os .hat-content {
background-color: #391c19;
}
}
coqhaivp0hqqr11uqjge0z4h9k4dd05
4676662
4676661
2026-10-18T02:49:05Z
JJPMaster
3095725
5 revisions imported from [[:w:Template:Hidden_archive_top/styles.css]]: Mass-importing pages: utility templates
4676661
sanitized-css
text/css
/* {{pp-template}} */
.hidden-archive {
box-sizing: border-box;
border: 1px solid var(--border-color-base, #a2a9b1);
width: 100%;
clear: both;
text-align: center;
padding: 1px;
margin: 0.2em auto 0;
font-size:100%;
}
.hat-header {
padding: 0.25em 1em;
line-height: 1.5em;
text-align: center;
background-color: #f2dfce;
color: inherit;
}
.hat-content {
border: solid 1px var(--border-color-subtle, #c8ccd1);
padding: 8px;
background-color: #fff4f2;
color: inherit;
text-align: left;
}
@media screen {
html.skin-theme-clientpref-night .hat-header {
background-color: #492b13;
}
html.skin-theme-clientpref-night .hat-content {
background-color: #391c19;
}
}
@media screen and (prefers-color-scheme: dark) {
html.skin-theme-clientpref-os .hat-header {
background-color: #492b13;
}
html.skin-theme-clientpref-os .hat-content {
background-color: #391c19;
}
}
coqhaivp0hqqr11uqjge0z4h9k4dd05
User:JJPMaster/CurateThisPage/review.js
2
486401
4676675
2026-10-18T03:13:12Z
JJPMaster
3095725
JJPMaster moved page [[User:JJPMaster/CurateThisPage/review.js]] to [[User:JJPMaster/luna/patrol.js]]: migration
4676675
javascript
text/javascript
/* #REDIRECT */mw.loader.load("//en.wikibooks.org/w/index.php?title=User:JJPMaster/luna/patrol.js&action=raw&ctype=text/javascript");
qdo77pxsozxr2ojvjn9aildj7z8wrk8
User:Mast303
2
486402
4676687
2026-10-18T05:14:09Z
Mast303
3416213
Created page with "Hello!"
4676687
wikitext
text/x-wiki
Hello!
caeijeike3tbqti90gctw0zhmuffrtf
User talk:Mast303
3
486403
4676688
2026-10-18T05:14:23Z
Mast303
3416213
Created page with "New to Wikibooks"
4676688
wikitext
text/x-wiki
New to Wikibooks
13miqmtwxg4f2v3677cjjopss5nw2bz
Wikibooks:Requests for import/Archives/2026/September
4
486405
4676703
2026-10-18T08:10:50Z
ArchiverBot
1227662
Bot: Archiving 1 thread from [[Wikibooks:Requests for import]]
4676703
wikitext
text/x-wiki
{{talk archive}}
== Import request: Transwiki: Laplace Transform ==
Hello, I'd like to request to import
https://en.wikibooks.org/wiki/Transwiki:Laplace_transform
(part of the curriculum of Differential Equations) to the book [[Ordinary Differential Equations]].
Neither seem to me to be actively maintained.
I believe the import within the scope of this project since there the book is completely missing the Transwiki topic. [[User:DavidMDay|DavidMDay]] ([[User talk:DavidMDay|discuss]]) 20:20, 11 August 2026 (UTC)
:I'm a little confused: the page is already imported here and [[Ordinary Differential Equations/Laplace Transform]] already exists. Do you want someone to merge the histories or overwrite the existing page or something? ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 22:06, 11 August 2026 (UTC)
:: Pinging [[User:DavidMDay|DavidMDay]] to Koavf's response above. [[User:Codename Noreste|<span style="color: blue">Codename Noreste</span>]] /// [[User talk:Codename Noreste|⭐️✨]] 21:17, 31 August 2026 (UTC)
:Hi Justin, It's great to communicate with you. I am '''new''' to Wikipedia and almost surely more confused than you. My suggestion is to expand, but not revise, the book by appending the wiki page. I do find this to be a big improvement. I am guessing that orphan Wiki pages with long life spans are adopted by Wiki books that are missing the content.
:I did make a trivial change to the main page for the book. The revision is pending review. Did I do something wrong? I don't remember the details. If nothing is wrong, did I optionally request a review, or are reviews required?
:I do not know how revision history is archived at Wiki books. The text of the revision history of the page could be included in the commit message that appends it to the book, for example. I do not know the rules, much less the practices, at Wiki books. I worry more about things like figuring out how to leave a webpage that I have opened.
:Yes, the book does have a section of a chapter is on the topic of the Wiki page. The wiki page could be added after this section, instead of creating a new chapter. Or nothing will happen. In any case, thanks for responding and for your kind note, -- David [[User:DavidMDay|DavidMDay]] ([[User talk:DavidMDay|discuss]] • [[Special:Contributions/DavidMDay|contribs]]) 20:05, 9 September 2026 (UTC)
::{{Ping|DavidMDay}} No worries: I think the material that you wanted to be here is already here. If it's not, please let me know. ―[[User:Koavf|Justin (<span style="color:grey">ko'''a'''<span style="color:black">v</span>f</span>)]]<span style="color:red">❤[[User talk:Koavf|T]]☮[[Special:Contributions/Koavf|C]]☺[[Special:Emailuser/Koavf|M]]☯</span> 23:53, 9 September 2026 (UTC)
ozt7z0d2ih9f6lv34mxgl198vdfvaqc