 Yeah, hi. My name is Mike Washington, and I'm going to talk about the UFBJ now. It's a little bit about me. I work on the Linux terminal. The UFBJ is open and data stuff, so I'm maintaining these projects one way or the other. The UFBJ works against the hobby as well. So that's about me. I decided to split the program into a couple of sections. So first of all, I'd like to introduce you to what the loop is at all, what the eWiz loop is what it can do, and I'll have to bring these flags for those people who already did some eWiz words and they know what happened and the way it releases, so I can't seem them up. And this will be a little brief off the deck. I'll go into the eWiz four things. I'll probably have to get the sources, I'll go into the mobile then, how to figure this out, how to add new stuff into the eWiz. I'll talk about the driver model, which is recent development. I'll talk about the device being involved. And once we build up all that knowledge, doing the eWiz port for the architecture port, it's going to be really trivial because you'll have the understanding of the stack. So we'll do that in the second part of the talk. And since today we will let stuff go, maybe we'll throw inside considerably wheel-followed automatic systems, and then we'll wrap it up and move on to the next one. Where is the loop loader in the first place? Well, you see, when you power up your computer or system or whatever, there has to be some code which does some basic initialization of the system and making it possible to load the next stage and execute the next stage. And that's the loop on this top. In modern systems, it just so happens that there are multiple loop loaders which are kind of chain loading one another. And we think of any board in our MSOC has this loop drum on it, and when you flip it on the power, it just jumps into the loop drum, and the loop drum is executed, does some initialization, and loads some stuff from either a C-card, and executes that stuff. You know, CRAM, the sub-end of CRAM usually initializes CRAM, loads more stuff from maybe a C-card, maybe some other storage, into the CRAM, and that's typically the first loop loader we can get replaced, and that's responsible for stopping the Linux kernel. So this kind of table only happens nowadays. It's the same when you have, like, this behind us, which starts to grab and that starts to turn on. That's what loop loader does. This is one of these loop loaders. There are alternatives, but it's like the only present loop loader in most of the argument boards. I said, yeah, it's capable of loading Linux, starting Linux. That's true, but it can also do much more. It's going to be capable of loading one, it's going to be virtual. So, basically, you can drop into a loop load register, and you can work on this stuff. Yeah, the board loops only even start. You boot. This is what you get. This is usually the first printout in the board, which you get. This is usually the human version, CPU type, board model. If you're reporting some bugs in you boot, please include at least these informations and look which you boot sources did you use to compile that stuff, because sometimes they're hacked up crap and we cannot help you with that. If you can make money boot, well, we can figure it out, and we certainly cannot do it for it. So, what we have been doing is printing this new information of the toddler, which is available along the internet app on this board. You have some TMMC controllers, serial boards, controllers, you can add whatever. Ultimately, you reach the output count down. Now, if you let this come down to zero, you can go execute this output command, which usually means start with a trick in the end thing, but in the most cases, it's just like a little bit, it's from somewhere, start it, and that's where you end. Now, you can interrupt that output, come down, and then you can drop a new shell, or you can do a lot of stuff. Like, for example, execute the health command, which is really helpful. That also builds you up. That new report supports. Usually, you can initiate that memory into a lot of other stuff. Like, write a memory, compose a registry, you can access different buses, that's like, I start CSPI, you can access storage, TMMC, again, CSI class is empty, you can access the internet, you can download files and stuff. That's what you can do with it. If you guys want to help or if you need, you can see what else you can do with that. Now, this is a brief newsletter about what was new in 2018 and what happened in the last year, pretty much. So, we're continuing the inversion through the registry control and driver model. At this point, we only have legacy drivers, which are really at the market, and most of that is probably going to be a way that we would end up going away because no one really cares about that anymore, so it doesn't have to go away. In case you still have some legacy devices and want it out, that's welcome. We also have FD support in youth, and what that's for is you can navigate like an FD library and a few FD applications. So, this is, for example, if we didn't want to change a little drop from youth, it would make it look like, kind of like the drop years of BC. At that point, you can basically drop an FD application, drop an FD application, it's molding into the youth and it's providing the services like serial board access, story access, that sort of thing. In case you're building a sort of that board, you can probably enable that. Related to that, it's just a movement for, again, if you're building a that board, you can enable that. It allows you to set up some sort of standardized human environment in which the distribution can count on, and that's the easy part of the distribution to generate the boot in the case. And the boot that one in that board. So, they can look into that. Oh, yeah, we are also doing CI recently in the school. So, if you use some impactives for you, and if you were asked to build it for like these 10 architectures, it's kind of sudden because you have to get all these personal files and then go send them back. In other words, you can just push it to get out and there's a Travis CI, Travis Yamal file. Something like that. Pretty good, Travis. Automatically, it will do the CI. You can enable that. And you can just go and do all some interventions that are available at least for all the architectures. One more thing that we can do is the OSG application, the OSG overlay application. Now, what that is about, this sort of situation with going for your OSG OSG overlay folder in Linux, finding its way in mainline that are probably it was moved down into the new folder so that new one is not capable of applying device 3 overlay to the device 3 and embody this device with the Linux. And recently, we also looked at work for that image. So you can have a fit image with one external device 3 in the fragments and in the definition configuration you can specify which terminal you want to use which device 3 and which fragments should be applied in that. Now, if you have no idea what that means it doesn't matter, this is just really it non-stop. Yeah, oh yeah, by the way, I don't know if there might be a change in the overlay format so be careful about what you mean. Okay, now, let's get to enforcing you. So first of all, just to get the sources if you want to do any enforcing or any of this work, you can get them at the speed-readable if that's possible to get in the HDV so you can have some sort of happy and corporate firewall which doesn't let you make sure you're doing the HDV. Usually you can do the begin master readable because everything is there but if you're working with one of the main games that I think that they have, well, in my sub-free there's some feature and you need that feature to get it in the sub-free. You can have the sources if you want to build them so it's really I would just build them in directory into the sub-free if you're cross-compiling you need to export these two triangles, cross-compiling pre-takes and they have to make your name for which you're cross-compiling. It is not necessary to do that if you're compiling maybe or if you are a disabled target. If you're not doing that you will also need to drop some vial or drop any details and that sort of stuff. Now, when you level that up you can do make board on the sub-free that will take obviously you need to have that board supported because it will give you the resources and then you can use binary and you can put it on the board. The board has to be supported if you change the board it's supported by looking into different things if the board is not supported well, that's just overall. I think it would be support by 100 boards to make more of that in general. So I'm going to do the disabled target this is going to be interesting if you can compile the unit of the Linux application and you can launch it in your Linux system and then later on it will be able to shell that and you can also use of course some of that sync data you're doing to work on the legal shell. For then you can meet the person who's that someone you've made and you'll be able to use it and there's Alpine 3 so you can build a slide to your boot and you will get the shell and you can play around with it. Alright, but if you want to do some work on the boot besides compiling it you probably do know where everything fits so the higher POV source fields on this you know the output right today as well as all the output specific stuff that goes so you have like arcs that you have and for example arc arm, arc mesh where that's where you can go and you can also have the person directly in the month that's true where who is like who's specific to this who's seen that arc mesh generator and you can play with that like seen there are some FPA which is an arc going there and some C or a month PCM for the GIFs that are in the Raspberry Pi and many will also have device feed sources there in the same place and our source is for the new boot and build device feed, this is not a positive lineage so the device feed is not a positive lineage I'm separate from that I wonder if we have here more files that are more legally and stuff which we need to add all that should be in private or in the update we have the don't pick kind of engine that we had earlier it's just a game of things we also in terms of converting the legacy pumping back so we will find some legacy don't pick today don't pick slash we'll reward the legacy yeah this is working for us but in fact drivers now if you look at the human source you will see that there are don't pick files and may files that implies we use game of things for configuration of new boot that let the terminal use gable for building even nowadays so you can do the main don't pick you will get a nice that will be available there I mentioned converting to that so there are some symbols which are not converted don't get here looking for them they don't find them it could be that they are still not converted and then the engine changes the widest file if they are in there and then they will have to go into includes site configs like your work or you can convert them to game of things and there is a patch which will be amazing now all new options in case you decide to add new game of things option it has to be game of things only there is no way in hell you are adding non-game of things option it just won't be able to find and you are going to be able to accept those files I picked the drivers game of things file so what you see here is the symbol of game of the age so if you make a minigame you will be able to find that that is the game of the age symbol somewhere in there so what do we have here the symbol is boolean so if you make a minigame you will find some and three people say this you can turn it on and off boolean it depends on the other symbol which is the element and there is some help associated with that so the game of the age symbol actually shows the stocking under score game of the age and that is the big fight in the age of the symbol to operate the symbol so in the age of the symbol so when the age of the symbol is evaluated and this will depend on why in case you think that other game that is pretty much it now if you want to add any new stuff to the game of the table files just add the magic game of the age symbol and the age of the symbol you have some sources that you are creating with that as you make files and source it and that is accessible now one thing we don't like to ask you is not to add 100 specific stuff on platforms which are not capable so if you have a platform which is not capable you add 100 specific stuff into the device instead of half going into the user into the game on the system so speaking of device 3 what is the device 3 well how many of you actually do you know what device 3 is it's very good super so yeah the device 3 is a structure which is used to describe 100 capabilities it's not the case always that you can probe 100 capabilities you can think of like Scat and that's the eye controller which has some devices that move on and you just can't figure out what's on the other side of the box that's why I give up and we use that to describe the entire capability of the system it's actually standardized and you can find the standard in the c-paper documentation and for the details on the device 3 or the website now it can have multiple representations one is the directory block the other is backdoor representation there's also a YAML representation of the device 3 but I don't know what state of that is and instead of going into like the specific details on how the device 3 it will be like an example so this is the device 3 but it's the same in Yubu so Yubu and the Linux are sharing the same device 3 files there are a couple of specific works the Yubu's would be fragment of the piece but the device 3 files should be mostly the same so what do you see here in the device 3 at the beginning there's an example that I did which is Scat because both Windows and Yubu were going to expand these macros here so you have got to encode numbers into the device 3 by hand which is a few simple and besides that we have here we have a root node module here and then we have some device 3 properties which are these B volume pairs in here and then we have multiple other nodes under the root node as you can see there can be we can have more nodes underneath that and the properties and so on and this way I can describe the entire 3 Yubu system but I think it might just so happen that you need to refer to another node from the device 3 and that in that the device 3 would drop like these gears just hold the handle so this what you do is referencing the 8574 here so this one really creates a 3 line structure but using this you can describe the entire hardware to now using it in few ways one of them is it can load both linux and the device 3 and then start linux and then pass the device to the linux or other software other kernel but what you can do there is it can pass a couple of things into the device 3 before it passes it to the terminal usually that's not even an address so you would pass this CKTather or MAC address arrival and if you are passing device 3 to linux it can pass that arrival into the device 3 ball and that's our linux so you can share the same MAC address but be more interested in this and what that is for is you can start linux and have it reference the device 3 to linux the whole key of the device 3 super early on and that way you don't have to include any other specifics into the device 3 now to understand at what point linux is able to read out and stop from the device 3 we can go through that so what happens there is actually the device 3 and then we won't be in it I don't believe you can even tell that's what the slide is about so when you put power in this and see it goes through the new terminal whatever the age is I'm going to read to you at the point where I'm in the platform of the device 3 this is all the sunblock and basically one of the recent back server reviews that they can do whatever and it's responsible for bringing the platform to the big server now once that is done it's going to come on the server time to set up code which is on the server time and after this it's done it can jump into the ccode the first thing that comes is the support app and the two loads of functions which are running with the functions in the system that's very little RAM available if at all you're going to have to have a stack of them once you go through this the three functions are actually the most important of the RAM on the platform so you can navigate to the end of the RAM one of the three functions and it starts for parts of the functions which are running with the functions that you're already running in RAM and the memory must be running on the server so bad you can hear the eagerness shell that went down to the Chrome stars and it's going to drop into the eagerness Reventsphere is actually available ever since the first function in the war of Affilates so it's available way early into the new years this is still pretty nothing to do with the actual flatten devices so on the flattening it does not happen you can't have them to see on behalf of any member for that So, the nice trick we'll use in the list actually is that if you have a problem and there are some kind of hangs and some are in there in the interface, you can hack out this, the unit folder, see there are two to three bar spaces that you can replace that with printer and you can go print each unit function in this folder, including the base address. And then you can find out which was the last function which was actually called and one of the examples to use binary, figure out what's the actual name of the function and then look into the code and see what actually happened and why it went through. So, this is kind of the three bar function in the unit. If you don't have a debugger, that's what you should do. Right, so, now that we have the actually set up, if you're looking to do the search, you'll see that there's one criterion of functions that are used to access the E and S of the link from this step to each set. So, this slide's right to make it more understandable. So, you'll see that there are functions which use the entity prefix. These are coming from the E and S and we have both of those boilers like those all the way. You, ideally shouldn't use them unless you do something that would obscure the device. You don't have to go around all the boilers right. So, you can kind of simplify that, that's why we have the entity that functions and they just pull out all the boilers right, boilers, boilers right. They have any function, so you can just, you know, put a lot of strings while you, and so on, out of them easily. But if you only use that outside of the unit driver model. Now, if you're within the unit driver model, there are other functions that you can change to the unit device pointer that are the three functions and they allow you to pull out all use from the device, from the device to know that it's OK that that type of unit driver, like it's base address, it's fault mapping, and so on. So, outside of the device to be, outside of the driver model, at least in the unit, within the driver model, we need to have three functions. The next thing is the unit driver model. I don't have a good definition for what that is actually. So, I'll tell you why it came to be. You see, back in the days of old, when the company was like 5 years, 6 years ago, having to start to get more complex, and the unit was still at that point configured with macros. And all the drivers were basically just walking directly to the commands. So, if you wanted to have 2H13 buses with different drivers, you were just screwed. And people started, like, pulling around that through some obscure hacks. And it didn't scale, so we were, like, throwing this method through a database of hacks that just couldn't go on. So, we could find the driver model at that point. And since then, we've been working through that. To remove all the hacks. And now, I'll be able to use different drivers with multiple instances and so on. Now, the driver model is kind of similar to what it is, but not so much because we have some space constraints and so on when we get to that. Then, I took three objects to present the driver model. One of them is U-class, U-class. Now, that one's responsible. Well, that one is the API provider for the rest of the unit. The fourth is the boss-assigner. I think a bit like the serial U-class is providing you, as a consumer, stuff like to a C, get C, that C-hats, or a string. It's also tracking all the drivers into something matching that with a new block, which can provide these services. Then you hold the serial board and drivers for a new bus serial. Now, you as a user can select with which serial driver that you bus should call. Next we have our drivers. So these are the actual implementation of the right-to-poke game, which will get that service implemented. That means for a serial driver, it actually implements the puts in your specific kind of software. And finally, there are driver instances or devices. So these are instances of drivers. You allocate some sort of structure with some data that's indicated with that and registered between the bus. So this also allows you to have the instance of a specific driver that's not a problem registered with a standard bus if you're getting this from a private data. And driving mode 4 is actually designed to be rather lazy. So all the files that are in the initialization is just registered to the root driver with the registry control enabled. That just walks the registry and binds all the drivers into this creating hierarchy. That's pretty much it. It doesn't have to initialize any of the drivers. It doesn't initialize any of the drivers unless you explicitly call through a U-class and access that hardware. Now this is to make sure that each of those initialize more than you really need to actually get to the next stage. Like, for example, each of these initialize PCIs practically are moving from SPI flat and the kernel is also sort of the SPI flat. So that's the intent here. Now, we have a convenient command review which is called the M3, and that will show you all the drives which are bound into the tree and also those which are pro. So in this case, in this system, you can see even if it's not started, you need to go to serial control because we need to have that. I'm just going to go to serial control to make the serial control come in. The serial support actually means log and ping control because here that's where I come. The ping control drivers go and there's both drivers somewhere in here as well. And obviously, if you have it from there, it's also going to just add that in the case of these devices to work. So in this case, the driver can be one of them is bound. That means it's available to you. You would actually see that device as available. And on the first call, the driver will actually get pro. That means the hardware will get initialized and all its dependencies will get initialized. In this case, if you're going to be with driver, you usually don't have to go into the bind to remove both, bind and unbind functions because they won't be replaced by the genetic ones. Only if you're doing something super specific you might have to do something in the bind that usually doesn't need it. If you're implementing new driver, you should implement pro, or business using to start up the hardware somehow. You need to put some registers and so on. And often you also need to figure it out. The remove function will be called when you exit new. For example, just start it from here. Now, I think this will happen that if you have some kind of hardware in case you do not de-initialize it before starting the kernel, it will do something of skew when the kernel tries to re-initialize the hardware. In this situation where you have the controller that when it tries to re-initialize it, it will stop it and you could control it but vomit at some road transmission into memory and just drop the memory. It's a real difficulty like that. So you shouldn't go under it. You should really explain all the basic concepts that you would. I hope that we can go into the board sorting. So what I'll be doing here is to do a really simple board. And if you're doing board sorting, you should really start simple and just get the serial board running in the beginning and you know that and you kind of see other stuff. Because this will get the internet and use more of the hardware to do a board. And if you will not be able to make that available and your failure is completely random, you can add open functionality later when you have like a stable serial board support and when you can get a board around and you know the board is stable. So that's not a problem. But in the beginning, I just thought of a simple problem. So what do we have to do here? Yeah, if you want to have a big journey and you want to start a new part through the hardware with full meaning, you can also support on the Y3 your architecture is capable of that and you can have a board. We want at least one board because otherwise it would not be possible to use these integrations to make sure that your board doesn't start to get dropping. If you look at one board, you need to add something to more slash your manufacturer or manager's name slash your board name. And then you'll have to add big and big file, big file, your board name file, which is like more specific stuff. Because that shouldn't be that much stuff in the board specific file. Ideally, that should only be the device 3D-oriented driver. You will also have to add even more configs and configs to make sure that's not big. And you will also need to create a legacy configuration file that shouldn't be that much stuff in this file. And that will be great. You will need to add a link to your board capable of files to our arms, to my bar, to make sure that they actually use that board file. Some of the things you might have to do in the process of making them are actually board specific groups for the process. They will be made in the files and ideally you should use that, but if you need that, well, that should be hard. Now, how to implement the EU driver is actually not that difficult. All you need to do is define the sort of structure. We have this EU driver macro here used by the name of the structure in this driver and it's going to do a specific review of the major list so that the EU driver is one of the three overall drivers and the one you use, for example, the registry program, the executable driver, the string, and so on. Then you have to specify the name of the driver and the ID which is the EU class and the driver face. This is the serial form driver we've done in the world. We've done this before but I'll see what happens in the game serial also. I'll show that to you in the next slide. Now, what does we have here? Yeah, if you were to imagine that we'll see you have to define how it's matched, pro-function, obviously, if you're going to finish that project. Private data are actually allocated by driver 104 so you don't have to go model a kingdom driver. Then you can scope the driver from both the live screen and the work file in the platform data which may be convenient if you need to reduce size. People who need to function the assumption the way each one burns then the platform data and then the size of the platform data which can be allocated. Again, the driver 104 will be allocated for you. So this is the serial form driver there's a special flag that serial form driver should be available super early in the beginning of the process. You may need to have the serial form that's really long to get there then in view of it and then they want the space on the warning or something like that. You can even flag in your driver. Now, matching the direct to your variables that was like this we just provided you with matched table that's very similar to that. Again, a method that's associated with that when you mention some compatible then the driver can tell what compatible is actually matched don't you? We can even possibly use that experience we can kind of have a cluster associated with that if there's no problem. Some users can work in the university of the platform data like this you can do example with this grad the platform data pointer is allocated by the driver 4. I extract some information about the data and data address given quality that I just set into the platform in the base address. Now, once the boot runs its function and the control function can reference the plan data base and to be sure that this is set with the policy component and finally the implementation of the all specific serial we've got in the interior loss both C, X, C they're dependent they're in the serial for platform so it's all going down there all kind of things going on there like so the spoilers are coming in they should be very simple to be able to go into the the back of the load in the platform the serial will get the the stage serial gets even better it's going to go in the actual edge that's going to get for a serial error Now, it makes it so happen that you will want to have some even earlier vbox serial model you can enable that with what you need on vwar and it's really like the special stuff which doesn't even fit into the driver model properly but it might come in helpful if you use a specific set of print commands it doesn't even need to print that there's not a print in that this piece of code into your serial driver which really initializes entering a serial driver by opening their instance directly it doesn't bind them to my screen at all and you have to go into the sort of C which makes sure that it's a character on the serial board and so this is like super specific it's probably convenient if you have a vbox more dedicated one on that platform otherwise most likely don't need that so it exists the other thing is if you're going through the serial driver now in the company spot well, if you're going through the phone driver, it's exactly the same thing it's the vbox spot and it has the VM CLK option which allows you to enable the table clock to get an entry so this is more than what we'll get into it for the user the vbox is going to use the CLK on the store function so CLK gets an entry and then it's gone serial for driver for example can happen with the cell this is pulled from the data taken on the device so you'll have in the directory know for this serial for VboxProperty and VboxNameProperty the VboxProperty will name the VM over to the VboxController and put them in the ID of the Vbox and the VboxNameProperty will name this query the VboxProperty will view that query without which VboxController that is the VboxProperty and the VboxProperty and the VboxProperty so another thing is the ping control framework again, ping control drivers the thing is that the VboxProperty, VboxProperty the same there's just a small part in the ping control framework in that yeah, ping control is one of the things that one of the things that is the thing which allows you to select which logic of law in the CPU, go into a specific frame on the CPU and ping control will allow you to select the property of that specific frame that means that all it will have is that sort of properties ping control will influence the program actually ping control will finally have the action of ping control and ping control will go off consuming this API it's a little bit different because in this case even if it goes to a specific frame from the driver to a different work because different ping control will go off and it will differently is that the device should be satisfied with multiple ping control configurations and multiple ways to configure the things with different properties and it's okay if the ping control driver wants to set one of the other moving areas of the frame to get all human role that's on the stage and so does the matching space so it's easy to do it as a default that's not even this one this specific case is an human-ceiver controller which is operating in human-ceen either 3.0 or 3.0 setting your 1.8 or 2.8 setting of human-ceiver now the frameworks and so on but most of them are unguarded to driver models so it will look exactly the same there are a couple which are kind of still easy and most of them are likely tough so like Pyro or DMP framework is kind of easy there but the rest is pretty much okay but in any way all that stuff may trigger some problems with science so I don't like to talk about systems now even if you're not able to drive a model you will run into some 5 minutes so that's 10 hours problem but yeah I could think of more than an armistice nowadays it's usually when it starts up it's just a small piece of co-interview of CRAM that's supposed to be initialized to CRAM the next thing right so we support the view that's called the ESDL it's really just a thumb down version of the input which fits into the end of the view but you can have this as you load that after a couple of years of viewing CRAM and then load it to the next stage now the SPL is capable of loading because it fully avoids or it can load many directly for an easier load time it's called the falcon mode you can make it look like that you don't have the rest of the control at all it also doesn't have to get out to drive a model this is optional but it's going to be enabled now you can configure both the user and the ESDL separately in your capability that's a good point you can come to ESDL 3k for SPL and come to ESDL 4k for 3k for 4 years in case the business still isn't enough the system has some limitations where the ESDL will not be integrated with either ESDL which brings down the extra to a millimeter and the beauty of this one is where the window from which the system is within like 4k to 2k and it's like super specific starting it up talking the rest of the content of the one ESDL to CRAM which will then be done if you leave ESDL in the point of ESDL that will be perfect because this is like super and again yeah you can configure ESDL for ESDL you can have them free and configure them separately that's another problem now the other thing is if you're using device 3 in ESDL it can trigger again some time in it this one is we call it a bit of ESDL if you have if you need to use ESDL and those when you have ESDL for ESDL you have to move all the nodes you can to have this property to manage the side of the wall having the ESDL it's still going to be and with platform they are going to have more file in ESDL and it needs to have these wall savings on the sides of ESDL yeah that's pretty much it I wasn't going to summarize it so if you're doing before UTM you see the state-of-the-art pretty much what I'd like you to do if you're doing more I'm sorry if you're writing you want to just reuse whatever is available you can reuse on patents for example on some systems we use a deep drive controller and drivers which are written from a written system you can stabilize your compatible to find the source of the problem if you have some fixes whatever some of the gadgets it may just happen that it will not go in on the first try but keep going reminiscence is very serious for somebody to take that I'm going to ask the questions wait for a couple of hours because there may not be anyone who actually knows the answer to the questions so wait a couple of hours you can have someone look at that if there are any questions to the NL that's pretty much it so thank you for your attention and what you are and what you're doing to turn on so the question is why do we rewrite our own drivers for you than the ones that use drivers from Linux do you think we need to try to do that so it's impossible with all processors so for example the USB system is now importing drivers from Linux and just adjusting them to match into the driver model which is slightly different so yeah we're trying to do that and recycling devices from Linux but there's always different yeah there's always different there are some drivers which are just written from scratch that's true